texlive[69027] Master/texmf-dist: pwebmac (3dec23)

commits+karl at tug.org commits+karl at tug.org
Sun Dec 3 22:09:44 CET 2023


Revision: 69027
          https://tug.org/svn/texlive?view=revision&revision=69027
Author:   karl
Date:     2023-12-03 22:09:44 +0100 (Sun, 03 Dec 2023)
Log Message:
-----------
pwebmac (3dec23)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/plain/pwebmac/README.md
    trunk/Master/texmf-dist/doc/plain/pwebmac/index.md
    trunk/Master/texmf-dist/doc/plain/pwebmac/makeall
    trunk/Master/texmf-dist/doc/plain/pwebmac/webman.ch
    trunk/Master/texmf-dist/tex/plain/pwebmac/pwebmac.tex

Modified: trunk/Master/texmf-dist/doc/plain/pwebmac/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/plain/pwebmac/README.md	2023-12-03 21:09:28 UTC (rev 69026)
+++ trunk/Master/texmf-dist/doc/plain/pwebmac/README.md	2023-12-03 21:09:44 UTC (rev 69027)
@@ -1,7 +1,7 @@
 # pwebmac – Consolidated WEB macros for DVI, PDF, and HINT output
 
 The original [WEB](https://ctan.org/pkg/web) system by Donald Knuth has the
-macros `webmac.tex` that produce DVI output only; for historic reasons, it
+macros `webmac.tex` that produce DVI output only; for historic reasons, they
 will never be modified (apart from catastrophic errors).
 Hàn Thế Thành has extended these macros in his (outdated?) `pdfwebmac.tex` for
 PDF output (only) with [pdfTeX](https://ctan.org/pkg/pdftex).
@@ -19,7 +19,7 @@
 Its initial application is the production of PDF and HINT files for all major
 WEB programs for “TeX and friends” as distributed in
 [TeX Live](https://www.tug.org/texlive).  For this purpose, the shell script
-`makeall` was whipped together; it provides various commandline options and
+`makeall` was whipped together; it provides various command-line options and
 works around several “quirks” in the WEB sources.  The resulting collections
 of PDF and HINT documents can be browsed in the
 [`knuth-pdf`](https://ctan.org/pkg/knuth-pdf) and
@@ -27,13 +27,15 @@
 
 WEB programmers who want to use `pwebmac.tex` instead of the default
 `webmac.tex` in their programs have to change the first line in the TeX file
-created by `weave`.  From there, all depends on the “TeX engine” you use:
-“plain TeX” by default creates DVI output, “plain TeX” with the invocation
-`tex "\let\pdf+\input…"`, `pdftex`, `luatex`, and `xetex` create PDF output
-with clickable links and bookmarks (depending on your PDF viewer), and `hitex`
-creates HINT output that can be viewed with the
+created by `WEAVE` (try `weave -p`).  From there, all depends on the “TeX
+engine” you use: “plain TeX” by default creates DVI output, “plain TeX” with
+the invocation `tex "\let\pdf+\input…"`, as well as `pdftex`, `luatex`, and
+`xetex` create PDF output with clickable links and bookmarks (with `pdftex`
+and `luatex` you are advised to apply the “`--shell-escape`” command-line
+option in order to avoid an internal miscalculation in the resulting PDF
+file), and `hitex` creates HINT output that can be viewed with the
 [`hintview`](https://hint.userweb.mwn.de/hint/hintview.html) program.
 
 The `pwebmac` package is free software and may be used without constraints.
 
-This is version **4.10** of the `pwebmac` package — 2023-10-07, Andreas Scherer.
+This is version **4.11** of the `pwebmac` package — 2023-12-02, Andreas Scherer.

Modified: trunk/Master/texmf-dist/doc/plain/pwebmac/index.md
===================================================================
--- trunk/Master/texmf-dist/doc/plain/pwebmac/index.md	2023-12-03 21:09:28 UTC (rev 69026)
+++ trunk/Master/texmf-dist/doc/plain/pwebmac/index.md	2023-12-03 21:09:44 UTC (rev 69027)
@@ -108,4 +108,4 @@
 
 ## Happy C/WEB Programming!
 
-2023-06-11 Andreas Scherer
+2023-12-02 Andreas Scherer

Modified: trunk/Master/texmf-dist/doc/plain/pwebmac/makeall
===================================================================
--- trunk/Master/texmf-dist/doc/plain/pwebmac/makeall	2023-12-03 21:09:28 UTC (rev 69026)
+++ trunk/Master/texmf-dist/doc/plain/pwebmac/makeall	2023-12-03 21:09:44 UTC (rev 69027)
@@ -86,61 +86,49 @@
 	esac
 done
 
-CWEAVE="cweave -f +lX"
-CTWILL="ctwill -f +lpdf"
+CWEAVE="cweave -f +lX +bph"
+CTWILL="ctwill -f +lpdf +bph"
+HITEX="hitex --compress"
 PAX="pax -wvzf"
+PDF=pdf # default extension for 'knuth-pdf'
 SED_I="sed -i" # non-GNU-sed requires an extra '' argument for '-i' option.
-PDF=pdf # default extension for 'knuth-pdf'
-HITEX="hitex --compress"
+WEAVE="weave"
 
-# HINT format
-if [ hitex = "$TEX" ]
-then
-	CTWILL="$CTWILL +P"
-	TEX="$HITEX"
-	PDF=hnt # default extension for 'knuth-hint'
-	PDFTOCFRONT=false # use 'hintview -h' to start with TOC page
-	VALID=false # HiTeX has no command-line option '--shell-escape'
-fi
+case "$TEX" in
+	hitex ) # HINT format
+		CTWILL="$CTWILL +P"
+		TEX="$HITEX"
+		PDF=hnt # default extension for 'knuth-hint'
+		PDFTOCFRONT=false # use 'hintview -h' to start with TOC page
+		VALID=false ;; # HiTeX has no command-line option '--shell-escape'
 
+	pdftex | luatex ) # actually only necessary for 'pwebmac.tex'
+		VALID=true ;;
+
+	* ) VALID=false ;; # plain TeX and XeTeX use different approach
+esac
+
 # Valid PDF output from 'pdftex' and 'luatex': In 'pwebmac.tex' set '\countD'
 # to the actual number of @<named modules@>, not the number of all sections.
-if ( $VALID )
+if $VALID
 then
+	NEW=true # PDF output requires 'pwebmac.tex'
 	TEX="$TEX --shell-escape"
 fi
 
+# Use alternative TeX macros more suited for PDF output.
+if $NEW
+then WEAVE="$WEAVE -p"
+fi
+
 # WEB and CWEB programs we want to get formatted
 for f in $FILES
 do
 	f=$(basename $f .web)
 
-	if [ ctwill = $f ]
+	if $CHANGES && echo $f | grep -v -q -E 'twill|glue|hitex'
+		# These are changes in and of themselves
 	then
-		# apply tons of editorial changes to 'ctwill.w'
-		if [ "$HITEX" = "$TEX" ]
-		then ctie -m $f.w cweave.w $f-w2c.ch $f-hint.ch
-		else ctie -m $f.w cweave.w $f-w2c.ch $f-mini.ch
-		fi
-		cp -an $KNUTHWARE/cwebdir/*.bux .
-		$CTWILL $f # prime the pump
-		$CTWILL $f # get decent answers
-
-	elif [ twill = $f ]
-	then
-		tie -m $f.web weave.web weave.ch weav-$f.ch
-		weave $f
-
-	elif [ glue = $f ]
-	then
-		weave $f # no 'glue.ch' at this time
-
-	elif [ hitex = $f ]
-	then
-		cweave $f # no 'hitex.ch' at this time
-
-	elif $CHANGES
-	then
 		case $f in
 			# CWEB programs have individual changefiles
 			common ) $CWEAVE $f comm-w2c ;;
@@ -153,49 +141,48 @@
 			# main WEB programs have complex change files
 			tex | mf | pdftex | xetex )
 				WEBINPUTS=$KNUTHWARE/../../Work//:$WEBINPUTS: \
-				weave $f $f-final ;;
+				$WEAVE $f $f-final
 
-			# TWILL is a change in and of itself
-			twill ) ;;
+				# FIX: XeTeX uses '\pdfTeX' from section 114,
+				# which is not changed and thus 'disappears';
+				# repeat in preamble.
+				if [ xetex = $f ]
+				then $SED_I -e "s/\(\\\\let\\\\maybe\)/\\\\def\\\\pdfTeX{pdf\\\\TeX}\n\1/" $f.tex
+				fi ;;
 
-			# HiTeX is a stand-alone version of TeX
-			hitex ) ;;
-
 			# all other WEB codes have singular changefiles
-			* ) weave $f $f ;;
+			* ) $WEAVE $f $f ;;
 		esac
 
-		# FIX: XeTeX uses '\pdfTeX' from section 114, which is not
-		# changed and thus 'disappears'; repeat in preamble.
-		if [ xetex = $f ]
-		then
-			$SED_I -e "s/\(\\\\let\\\\maybe\)/\\\\def\\\\pdfTeX{pdf\\\\TeX}\n\1/" \
-				$f.tex
-		fi
-
 		# only document changed modules/sections
 		$SED_I -e "s/\(\\\\let\\\\maybe=\)\\\\iftrue/\1\\\\iffalse/" \
 			$f.tex
 	else
 		case $f in
+			ctwill )
+				# apply tons of editorial changes to 'ctwill.w'
+				if [ "$HITEX" = "$TEX" ]
+				then ctie -m $f.w cweave.w $f-w2c.ch $f-hint.ch
+				else ctie -m $f.w cweave.w $f-w2c.ch $f-mini.ch
+				fi
+				$CTWILL $f # prime the pump
+				$CTWILL $f ;; # get decent answers
+
 			c* | refsort | twinx | tie | hitex ) $CWEAVE $f ;;
-			* ) weave $f ;;
+
+			twill )
+				tie -m $f.web weave.web weave.ch weav-$f.ch
+				$WEAVE $f ;;
+
+			* ) $WEAVE $f ;;
 		esac
 	fi
 
-	if $NEW
+	# 'pwebmac' is for WEB only; do nothing for CWEB programs
+	if $NEW && echo $f | grep -v -q -E '^c|refsort|twinx|tie|hitex'
 	then
-		# use extended WEB macros for TeX Live PDF documentation
-		$SED_I -e "1 s/\\\\input webmac/\\\\input pwebmac/" $f.tex
-
 		# timestamp on table-of-contents page or the first page
 		case $f in
-			# do nothing for CWEB programs
-			c* | refsort | twinx | tie ) ;;
-
-			hitex )
-				$SED_I -e "s/\(\\\\def\\\\topofcontents\)/\\\\datethis\n\\\\emergencystretch=.1\\\\hsize\n\1/" $f.tex ;;
-
 			bibtex | patgen | tangle | weave )
 				$SED_I -e "s/\(\\\\def\\\\title\)/\\\\datecontentspage\n\1/" $f.tex ;;
 
@@ -247,8 +234,7 @@
 		# FIX: don't wait for Oren Patashnik.
 		bibtex ) $SED_I -e "s/\\\\def\\\\titlepage{F}/\\\\titletrue/" $f.tex
 			if ! $CHANGES
-			then
-				$SED_I -e "71,78d" $f.tex
+			then $SED_I -e "71,78d" $f.tex
 			fi ;;
 
 		# FIX: 'glue.web' obviously uses an old 'webmac.tex'.
@@ -259,9 +245,7 @@
 		# appear correctly in the bookmarks, too.
 		pdftex )
 			if $NEW && [ tex != "$TEX" ] && [ "$HITEX" != "$TEX" ]
-			then
-				$SED_I -e "s/\(\\\\def\\\\pdfTeX{pdf\\\\TeX}\)/\1 \\\\sanitizecommand\\\\pdfTeX{pdfTeX}\\\\sanitizecommand\\\\eTeX{e-TeX}/" \
-					$f.tex
+			then $SED_I -e "s/\(\\\\def\\\\pdfTeX{pdf\\\\TeX}\)/\1 \\\\sanitizecommand\\\\pdfTeX{pdfTeX}\\\\sanitizecommand\\\\eTeX{e-TeX}/" $f.tex
 			fi ;;
 
 		# FIX: weave uses '\max' in name of module 173; this should
@@ -268,20 +252,20 @@
 		# appear correctly in the bookmarks, too.
 		weave )
 			if $NEW && [ tex != "$TEX" ] && [ "$HITEX" != "$TEX" ]
-			then
-				$SED_I -e "s/\(\\\\def\\\\({}\)/\\\\sanitizecommand\\\\max{max}\n\1/" \
-					$f.tex
+			then $SED_I -e "s/\(\\\\def\\\\({}\)/\\\\sanitizecommand\\\\max{max}\n\1/" $f.tex
 			fi ;;
 
 		# FIX: purge obsolete macros from XeTeX.
 		xetex ) $SED_I -e "/\\\\input xewebmac/d" $f.tex ;;
+
+		# timestamp on table-of-contents page or the first page
+		hitex ) $SED_I -e "s/\(\\\\def\\\\topofcontents\)/\\\\datethis\n\\\\emergencystretch=.1\\\\hsize\n\1/" $f.tex ;;
 	esac
 
 	# shift table-of-contents pages to the front in PDF
-	if $PDFTOCFRONT && [ ctwill != $f ] && [ hitex != $f ]
+	if $PDFTOCFRONT && echo $f | grep -v -q -E 'ctwill|hitex'
 	then
-		$SED_I -e "0,/\\\\N[1{]/s/\(\\\\N[1{]\)/\\\\input pdfwebtocfront\n\n\1/" \
-			$f.tex
+		$SED_I -e "0,/\\\\N[1{]/s/\(\\\\N[1{]\)/\\\\input pdfwebtocfront\n\n\1/" $f.tex
 
 		# only XeTeX can process XETEX.WEB
 		if [ xetex = $f ]
@@ -295,24 +279,24 @@
 		fi
 	fi
 
-	if [ xetex = $f ] # only XeTeX can process XETEX.WEB
-	then $f $f
-	elif [ ctwill = $f ] # gives two different outcomes
-	then
-		# sort mini-indexes
-		if [ "$HITEX" = "$TEX" ]
-		then # directly in the TeX file
-			proofsort $f.tex > $f-sorted.tex
-			mv $f-sorted.tex $f.tex
-		else # in the TeX-created .ref file
-			$TEX $f
-			ctwill-refsort < $f.ref > $f.sref
-		fi
-		$TEX $f
-	elif [ refsort = $f ]
-	then $TEX -interaction nonstopmode $f
-	else $TEX $f
-	fi
+	case $f in
+		xetex ) $f $f ;; # only XeTeX can process XETEX.WEB
+
+		ctwill ) # gives two different outcomes
+			if [ "$HITEX" = "$TEX" ] # sort mini-indexes
+			then # directly in the TeX file
+				ctwill-proofsort < $f.tex > $f-sorted.tex
+				mv $f-sorted.tex $f.tex
+			else # in the TeX-created .ref file
+				$TEX $f
+				ctwill-refsort < $f.ref > $f.sref
+			fi
+			$TEX $f ;;
+
+		refsort ) $TEX -interaction nonstopmode $f ;;
+
+		* ) $TEX $f ;;
+	esac
 done
 
 if ( $PDFTOCFRONT || [ "$HITEX" = "$TEX" ] ) && ! $FILESELECT
@@ -385,9 +369,7 @@
 		f=$(kpsewhich -engine tex cwebman)
 		tie -m $(basename $f) $f $(basename $f .tex)-w2c.ch
 		if [ "$HITEX" = "$TEX" ]
-		then
-			$SED_I -e "s/\(\\\\input cwebmac\)/\1\n\\\\input hiplainpage/" \
-				cwebman.tex
+		then $SED_I -e "s/\(\\\\input cwebmac\)/\1\n\\\\input hiplainpage/" cwebman.tex
 		fi
 
 		touch pages.tex # let 'manmac' produce output at all

Modified: trunk/Master/texmf-dist/doc/plain/pwebmac/webman.ch
===================================================================
--- trunk/Master/texmf-dist/doc/plain/pwebmac/webman.ch	2023-12-03 21:09:28 UTC (rev 69026)
+++ trunk/Master/texmf-dist/doc/plain/pwebmac/webman.ch	2023-12-03 21:09:44 UTC (rev 69027)
@@ -20,8 +20,8 @@
 \def\bkminfo{}
 \outer\def\section #1.{\penalty-50\vskip 12pt plus 3pt minus 3pt
   \noindent\ifpdf\vbox to 0pt{\kern-2.5ex\relax
-    \ifpdflua\pdfdest num \destcount fitbh\relax
-    \else\special{pdf: dest (\the\destcount) [ @thispage /FitBH @ypos ]}\fi
+    \ifpdflua\pdfdest num \destcount fith\relax
+    \else\special{pdf: dest (\the\destcount) [ @thispage /FitH @ypos ]}\fi
     \def\.##1{##1}%
     \ifx\bkminfo\empty\def\sectitle{#1}\else\def\sectitle{#1 (\bkminfo)}\fi
     \ifpdflua\pdfoutline goto num \destcount {\sectitle}\relax
@@ -82,6 +82,13 @@
 \itemitem{3)} A \PASCAL\ part, containing a piece of the program that
 @z
 
+ at x l.304
+`\.{\\input webmac}'; this will cause \TeX\ to read in the macros that
+ at y
+`\.{\\input webmac}'---or, if you invoke `\.{weave -p}',
+`\.{\\input pwebmac}'---; this will cause \TeX\ to read in the macros that
+ at z
+
 @x l.358
   \.{which is a \\\&\{packed\}{ }\\\&\{array\}{ }\$
 @y
@@ -131,8 +138,10 @@
 the output of \.{WEAVE}; Appendix~G discusses how to use some of its macros
 to vary the output formats; and Appendix~H discusses what needs to be done
 @y
-Finally, \Appendix F is the `\.{webmac}' file that sets \TeX\ up to accept
-the output of \.{WEAVE}; \Appendix G discusses how to use some of its macros
+Finally, \Appendix F shows the `\.{webmac.tex}' file that sets \TeX\ up to
+accept the output of \.{WEAVE}; it also shows the `\.{pwebmac.tex}' file that
+provides alternative macros more suited for {\mc PDF} output with modern \TeX\
+engines; \Appendix G discusses how to use some of these macros
 to vary the output formats; and \Appendix H discusses what needs to be done
 @z
 
@@ -261,77 +270,277 @@
 {:58}{66:}FUNCTION MODLOOKUP(L:SIXTEENBITS):NAMEPOINTER;LABEL 31;
 @z
 
- at x l.1208
-\verbatim
+ at x l.1203
+\section Appendix F: The \.{webmac.tex} file.
+This is the file that extends ``plain \TeX'' format in order to support the
 @y
-\begingroup \def\tt{\ninett} \baselineskip10pt
-\verbatim
+\section Appendix F: Macros for formatting.
+The \.{webmac.tex} file extends ``plain \TeX'' format in order to support the
 @z
 
- at x l.1210
+ at x l.1208
+\verbatim
+% standard macros for WEB listings (in addition to PLAIN.TEX)
 \xdef\fmtversion{\fmtversion+WEBMAC4.0} % identifies current set of macros
- at y
-\xdef\fmtversion{\fmtversion+WEBMAC4.2} % identifies current set of macros
- at z
+\parskip 0pt % no stretch between paragraphs
+\parindent 1em % for paragraphs and for the first line of Pascal text
 
- at x l.1218
+\font\eightrm=cmr8 \let\sc=\eightrm % NOT a caps-and-small-caps font!
+\let\mainfont=\tenrm
+\font\titlefont=cmr7 scaled\magstep4 % title on the contents page
+\font\ttitlefont=cmtt10 scaled\magstep2 % typewriter type in title
 \font\tentex=cmtex10 % TeX extended character set (used in strings)
- at y
-\font\tentex=cmtex10 % TeX extended character set (used in strings)
-\fontdimen7\tentex=0pt % no extra space after punctuation
- at z
 
- at x l.1294
+\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers
+\def\|#1{\hbox{$#1$}} % one-letter identifiers look a bit better this way
+\def\&#1{\hbox{\bf#1\/}} % boldface type for reserved words
+\def\.#1{\hbox{\tentex % typewriter type for strings
+  \let\\=\BS % backslash in a string
+  \let\'=\RQ % right quote in a string
+  \let\`=\LQ % left quote in a string
+  \let\{=\LB % left brace in a string
+  \let\}=\RB % right brace in a string
+  \let\~=\TL % tilde in a string
+  \let\ =\SP % space in a string
+  \let\_=\UL % underline in a string
+  \let\&=\AM % ampersand in a string
+  #1}}
+\def\#{\hbox{\tt\char`\#}} % parameter sign
+\def\${\hbox{\tt\char`\$}} % dollar sign
+\def\%{\hbox{\tt\char`\%}} % percent sign
+\def\^{\ifmmode\mathchar"222 \else\char`^ \fi} % pointer or hat
+% circumflex accents can be obtained from \^^D instead of \^
+\def\AT!{@} % at sign for control text
+
+\chardef\AM=`\& % ampersand character in a string
+\chardef\BS=`\\ % backslash in a string
+\chardef\LB=`\{ % left brace in a string
+\def\LQ{{\tt\char'22}} % left quote in a string
+\chardef\RB=`\} % right brace in a string
+\def\RQ{{\tt\char'23}} % right quote in a string
+\def\SP{{\tt\char`\ }} % (visible) space in a string
+\chardef\TL=`\~ % tilde in a string
+\chardef\UL=`\_ % underline character in a string
+
+\newbox\bak \setbox\bak=\hbox to -1em{} % backspace one em
+\newbox\bakk\setbox\bakk=\hbox to -2em{} % backspace two ems
+
+\newcount\ind % current indentation in ems
+\def\1{\global\advance\ind by1\hangindent\ind em} % indent one more notch
+\def\2{\global\advance\ind by-1} % indent one less notch
+\def\3#1{\hfil\penalty#10\hfilneg} % optional break within a statement
+\def\4{\copy\bak} % backspace one notch
+\def\5{\hfil\penalty-1\hfilneg\kern2.5em\copy\bakk\ignorespaces}% optional break
+\def\6{\ifmmode\else\par % forced break
+  \hangindent\ind em\noindent\kern\ind em\copy\bakk\ignorespaces\fi}
+\def\7{\Y\6} % forced break and a little extra space
+
+\let\yskip=\smallskip
+\def\to{\mathrel{.\,.}} % double dot, used only in math mode
+\def\note#1#2.{\Y\noindent{\hangindent2em\baselineskip10pt\eightrm#1~#2.\par}}
+\def\lapstar{\rlap{*}}
+\def\startsection{\Q\noindent{\let\*=\lapstar\bf\modstar.\quad}}
+\def\defin#1{\global\advance\ind by 2 \1\&{#1 }} % begin `define' or `format'
+\def\A{\note{See also section}} % crossref for doubly defined section name
+\def\As{\note{See also sections}} % crossref for multiply defined section name
+\def\B{\mathopen{\.{@\{}}} % begin controlled comment
+\def\C#1{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi % Pascal comments
+  \XX\hfil\penalty-1\hfilneg\quad$\{\,$#1$\,\}$\XX}
+\def\D{\defin{define}} % macro definition
+\def\E{\cdot10^} % exponent in floating point constant
+\def\ET{ and~} % conjunction between two section numbers
+\def\ETs{, and~} % conjunction between the last two of several section numbers
+\def\F{\defin{format}} % format definition
+\let\G=\ge % greater than or equal sign
+\def\H#1{\hbox{\rm\char"7D\tt#1}} % hexadecimal constant
+\let\I=\ne % unequal sign
+\def\J{\.{@\&}} % TANGLE's join operation
+\let\K=\gets % left arrow
+\let\L=\le % less than or equal sign
+\outer\def\M#1.{\MN#1.\ifon\vfil\penalty-100\vfilneg % beginning of section
+  \vskip12ptminus3pt\startsection\ignorespaces}
+\outer\def\N#1.#2.{\MN#1.\vfil\eject % beginning of starred section
+  \def\rhead{\uppercase{\ignorespaces#2}} % define running headline
+  \message{*\modno} % progress report
+  \edef\next{\write\cont{\Z{#2}{\modno}{\the\pageno}}}\next % to contents file
+  \ifon\startsection{\bf\ignorespaces#2.\quad}\ignorespaces}
+\def\MN#1.{\par % common code for \M, \N
   {\xdef\modstar{#1}\let\*=\empty\xdef\modno{#1}}
   \ifx\modno\modstar \onmaybe \else\ontrue \fi \mark{\modno}}
- at y
-  {\xdef\modstar{#1}\let\*=\empty\xdef\modno{#1}}% remove \* from section name
-  \ifx\modno\modstar \onmaybe \else\ontrue \fi
-  \mark{{{\tensy x}\modno}{\rhead}}}
-  % each \mark is {section reference or null}{group title}
- at z
+\def\O#1{\hbox{\rm\char'23\kern-.2em\it#1\/\kern.05em}} % octal constant
+\def\P{\rightskip=0pt plus 100pt minus 10pt % go into Pascal mode
+  \sfcode`;=3000
+  \pretolerance 10000
+  \hyphenpenalty 10000 \exhyphenpenalty 10000
+  \global\ind=2 \1\ \unskip}
+\def\Q{\rightskip=0pt % get out of Pascal mode
+  \sfcode`;=1500 \pretolerance 200 \hyphenpenalty 50 \exhyphenpenalty 50 }
+\let\R=\lnot % logical not
+\let\S=\equiv % equivalence sign
+\def\T{\mathclose{\.{@\}}}} % terminate controlled comment
+\def\U{\note{This code is used in section}} % crossref for use of a section
+\def\Us{\note{This code is used in sections}} % crossref for uses of a section
+\let\V=\lor % logical or
+\let\W=\land % logical and
+\def\X#1:#2\X{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi % section name
+  \XX$\langle\,$#2{\eightrm\kern.5em#1}$\,\rangle$\XX}
+\def\Y{\par\yskip}
+\let\Z=\let % now you can \send the control sequence \Z
+\def\){\hbox{\.{@\$}}} % sign for string pool check sum
+\def\]{\hbox{\.{@\\}}} % sign for forced line break
+\def\=#1{\kern2pt\hbox{\vrule\vtop{\vbox{\hrule
+        \hbox{\strut\kern2pt\.{#1}\kern2pt}}
+      \hrule}\vrule}\kern2pt} % verbatim string
+\let\~=\ignorespaces
+\let\*=*
 
- at x l.1325
+\def\onmaybe{\let\ifon=\maybe} \let\maybe=\iftrue
+\newif\ifon \newif\iftitle \newif\ifpagesaved
 \def\lheader{\mainfont\the\pageno\eightrm\qquad\rhead\hfill\title\qquad
   \tensy x\mainfont\topmark} % top line on left-hand pages
 \def\rheader{\tensy x\mainfont\topmark\eightrm\qquad\title\hfill\rhead
   \qquad\mainfont\the\pageno} % top line on right-hand pages
- at y
-\def\lheader{\mainfont\the\pageno\eightrm\qquad\rhead
-  \hfill\title\qquad\mainfont\topsecno} % top line on left-hand pages
-\def\rheader{\mainfont\topsecno\eightrm\qquad\title\hfill
-  \rhead\qquad\mainfont\the\pageno} % top line on right-hand pages
-\def\topsecno{\expandafter\takeone\topmark}
-\def\takeone#1#2{#1}
-\def\taketwo#1#2{#2}
-\def\nullsec{\eightrm\kern-2em} % the \kern-2em cancels \qquad in headers
- at z
+\def\page{\box255 }
+\def\normaloutput#1#2#3{\ifodd\pageno\hoffset=\pageshift\fi
+  \shipout\vbox{
+    \vbox to\fullpageheight{
+      \iftitle\global\titlefalse
+      \else\hbox to\pagewidth{\vbox to10pt{}\ifodd\pageno #3\else#2\fi}\fi
+      \vfill#1}} % parameter #1 is the page itself
+  \global\advance\pageno by1}
 
- at x l.1336
 \def\rhead{\.{WEB} OUTPUT} % this running head is reset by starred sections
- at y
-\def\rhead{\.{WEB} OUTPUT} % this running head is reset by starred sections
-\mark{\noexpand\nullsec{\rhead}}
- at z
+\def\title{} % an optional title can be set by the user
+\def\topofcontents{\centerline{\titlefont\title}
+  \vfill} % this material will start the table of contents page
+\def\botofcontents{\vfill} % this material will end the table of contents page
+\def\contentspagenumber{0} % default page number for table of contents
+\newdimen\pagewidth \pagewidth=6.5in % the width of each page
+\newdimen\pageheight \pageheight=8.7in % the height of each page
+\newdimen\fullpageheight \fullpageheight=9in % page height including headlines
+\newdimen\pageshift \pageshift=0in % shift righthand pages wrt lefthand ones
+\def\magnify#1{\mag=#1\pagewidth=6.5truein\pageheight=8.7truein
+  \fullpageheight=9truein\setpage}
+\def\setpage{\hsize\pagewidth\vsize\pageheight} % use after changing page size
+\def\contentsfile{CONTENTS} % file that gets table of contents info
+\def\readcontents{\input CONTENTS}
 
- at x l.1392
+\newwrite\cont
+\output{\setbox0=\page % the first page is garbage
+  \openout\cont=\contentsfile
+  \global\output{\normaloutput\page\lheader\rheader}}
+\setpage
+\vbox to \vsize{} % the first \topmark won't be null
+
+\def\ch{\note{The following sections were changed by the change file:}
+  \let\*=\relax}
+\newbox\sbox % saved box preceding the index
+\newbox\lbox % lefthand column in the index
+\def\inx{\par\vskip6pt plus 1fil % we are beginning the index
+  \write\cont{} % ensure that the contents file isn't empty
+  \closeout\cont % the contents information has been fully gathered
+  \output{\ifpagesaved\normaloutput{\box\sbox}\lheader\rheader\fi
+    \global\setbox\sbox=\page \global\pagesavedtrue}
+  \pagesavedfalse \eject % eject the page-so-far and predecessors
+  \setbox\sbox\vbox{\unvbox\sbox} % take it out of its box
+  \vsize=\pageheight \advance\vsize by -\ht\sbox % the remaining height
+  \hsize=.5\pagewidth \advance\hsize by -10pt
+    % column width for the index (20pt between cols)
+  \parfillskip 0pt plus .6\hsize % try to avoid almost empty lines
+  \def\lr{L} % this tells whether the left or right column is next
+  \output{\if L\lr\global\setbox\lbox=\page \gdef\lr{R}
+    \else\normaloutput{\vbox to\pageheight{\box\sbox\vss
+        \hbox to\pagewidth{\box\lbox\hfil\page}}}\lheader\rheader
+    \global\vsize\pageheight\gdef\lr{L}\global\pagesavedfalse\fi}
+  \message{Index:}
+  \parskip 0pt plus .5pt
+  \outer\def\:##1, {\par\hangindent2em\noindent##1:\kern1em} % index entry
+  \let\ttentry=\. \def\.##1{\ttentry{##1\kern.2em}} % give \tt a little room
+  \def\[##1]{$\underline{##1}$} % underlined index item
+  \rm \rightskip0pt plus 2.5em \tolerance 10000 \let\*=\lapstar
+  \hyphenpenalty 10000 \parindent0pt}
+\def\fin{\par\vfill\eject % this is done when we are ending the index
+  \ifpagesaved\null\vfill\eject\fi % output a null index column
+  \if L\lr\else\null\vfill\eject\fi % finish the current page
+  \parfillskip 0pt plus 1fil
   \def\rhead{NAMES OF THE SECTIONS}
+  \message{Section names:}
+  \output{\normaloutput\page\lheader\rheader}
+  \setpage
+  \def\note##1##2.{\hfil\penalty-1\hfilneg\quad{\eightrm##1 ##2.}}
+  \linepenalty=10 % try to conserve lines
+  \def\U{\note{Used in section}} % crossref for use of a section
+  \def\Us{\note{Used in sections}} % crossref for uses of a section
+  \def\:{\par\hangindent 2em}\let\*=*\let\.=\ttentry}
+\def\con{\par\vfill\eject % finish the section names
+  \rightskip 0pt \hyphenpenalty 50 \tolerance 200
+  \setpage
+  \output{\normaloutput\page\lheader\rheader}
+  \titletrue % prepare to output the table of contents
+  \pageno=\contentspagenumber \def\rhead{TABLE OF CONTENTS}
+  \message{Table of contents:}
+  \topofcontents
+  \line{\hfil Section\hbox to3em{\hss Page}}
+  \def\Z##1##2##3{\line{\ignorespaces##1
+    \leaders\hbox to .5em{.\hfil}\hfil\ ##2\hbox to3em{\hss##3}}}
+  \readcontents\relax % read the contents info
+  \botofcontents \end} % print the contents page(s) and terminate
+?endgroup
 @y
-  \def\rhead{NAMES OF THE SECTIONS}
-  \let\topsecno=\nullsec
- at z
+\begingroup \def\tt{\eighttt} \baselineskip9pt
+\def\printmacs#1{\begingroup
+  \def\do##1{\catcode`##1=12 } \dospecials
+  \parskip 0pt \parindent 0pt
+  \catcode`\ =13 \catcode`\^^M=13
+  \tt \verbatimdefs \input #1 \endgroup}
+\printmacs{webmac}
+\vskip6pt \baselineskip12pt
+
\section Hypertext and hyperdocumentation.
+Many people have of course noticed analogies between \.{WEB} and the
+World Wide Web. The following \.{WEB} macros \.{pwebmac.tex} are in fact
+set up so that the output of \.{WEAVE} can be converted easily into
+Portable Document Format, with clickable hyperlinks that can be read
+with your favorite {\mc PDF} viewer.
+After using \.{WEAVE} with command line option `\.{-p}' to convert
+\.{cob.web} into \.{cob.tex}, you can prepare a hypertext version of
+the program by giving the commands
+$$\vbox{\halign{\.{#}\hfil\cr
+tex "\\let\\pdf+ \\input cob"\cr
+dvipdfm cob\cr}}$$
+instead of invoking \TeX\ in the normal way.
+Alternatively you can generate \.{cob.pdf} in one step by simply saying
+`\.{pdftex}~\.{cob}' or `\.{xetex}~\.{cob}' or `\.{luatex}~\.{cob}'.
+(You are advised to use the command line option `\.{--shell-escape}' with
+\.{pdftex} and \.{luatex} in order to receive ``valid'' {\mc PDF} output;
+otherwise, the internal counter for the ``Names of the sections'' part
+in the {\mc PDF} ``bookmarks'' will be incorrect.)
 
- at x l.1395
-  \def\note##1##2.{\hfil\penalty-1\hfilneg\quad{\eightrm##1 ##2.}}
- at y
-  \def\note##1##2.{\hfil\penalty-1\hfilneg\quad{\eightrm##1~##2.}}
+Similar output for ``smart'' devices can be created with Martin Ruckert's
+Hi\TeX\ and its dynamic \.{HINT} format; just say `\.{hitex}~\.{cob}'.
+\.{HINT} files can be viewed with the \.{hintview} program, which is
+available from
+\pdfURL{\.{https://hint.userweb.mwn.de/hint/hintview.html}}%
+          {https://hint.userweb.mwn.de/hint/hintview.html}.%
+
+A more elaborate system called \.{TWILL}, which extends the usual cross
+references of \.{WEAVE} by preparing links from the uses of identifiers
+to their definitions, is also available---provided that you are willing
+to work a bit harder in cases where an identifier is multiply defined.
+\.{TWILL} is intended primarily for hardcopy output, but its principles
+could be used for hypertext as well. It uses its own set of macros
+`\.{twimac-web.tex}'.
+
+\vskip6pt \baselineskip9pt
+\printmacs{pwebmac}
+\endgroup
+\vfill\eject
 @z
 
- at x l.1414
-?endgroup
+ at x l.1418
+The macros in \.{webmac} make it possible to produce a variety of formats
 @y
-?endgroup
-\endgroup
+The macros in \.{webmac} and \.{pwebmac} make it possible to produce
+a variety of formats
 @z
 
 @x l.1425
@@ -362,6 +571,17 @@
 was being generated,
 @z
 
+ at x l.569
+\.{\\ch}, \.{\\fin}, and \.{\\con}. \.{WEAVE} itself need not be changed.
+ at y
+\.{\\ch}, \.{\\fin}, and \.{\\con}. \.{WEAVE} itself need not be changed.
+
+\point 15. In conjunction with `\.{weave -p}' and the \.{pwebmac} macros you
+can say `\.{\\input pdfwebtocfront}' as the last command in the limbo section
+and run \TeX\ \\{twice} on your woven \.{WEB} document, in order to shift the
+table-of-contents to the front of the {\mc PDF} output.
+ at z
+
 @x l.1583
 dependencies'' in the index of Appendix~E above, and figure out what changes
 @y

Modified: trunk/Master/texmf-dist/tex/plain/pwebmac/pwebmac.tex
===================================================================
--- trunk/Master/texmf-dist/tex/plain/pwebmac/pwebmac.tex	2023-12-03 21:09:28 UTC (rev 69026)
+++ trunk/Master/texmf-dist/tex/plain/pwebmac/pwebmac.tex	2023-12-03 21:09:44 UTC (rev 69027)
@@ -5,19 +5,7 @@
 % macro integration \`a la CWEB by Andreas Scherer <andreas_tex at freenet.de>.
 % This file is not copyrighted and can be used freely.
 \ifx\renewenvironment\undefined\else\endinput\fi % LaTeX will use other macros
-\xdef\fmtversion{\fmtversion+WEBMAC4.10}
-\input iftex.sty % TeX engine tests
-\ifx\pdf+\pdftrue\fi
-% Uncomment the following line if you want PDF goodies to be the default
-%\ifx\pdf-\else\pdftrue\fi
-\def\pdflinkcolor{0 0 1} % the RGB values for hyperlink color
-\ifxetex\pdftrue\fi % XeTeX produces PDF output
-\newif\ifacrohint \ifpdf\acrohinttrue\fi \ifhint\acrohinttrue\fi
-\newif\ifpdflua \ifluatex\pdfluatrue\fi \ifpdftex\pdfluatrue\fi
-\ifpdflua % pdfTeX and luaTeX produce PDF output if \pdfoutput>0
-  \def\Black{\pdfliteral{0 g 0 G}}  % use rgb colors for direct PDF output too
-  \def\Blue{\pdfliteral{\pdflinkcolor\space rg \pdflinkcolor\space RG}}
-\fi
+\xdef\fmtversion{\fmtversion+PWEBMAC4.11}
 
 \parskip 0pt % no stretch between paragraphs
 \parindent 1em % for paragraphs and for the first line of Pascal text
@@ -90,6 +78,20 @@
 \newif\iftokprocessed \newif\ifTnum \newif\ifinstr
 {\def\\{\global\let\spacechar= }\\ }
 
+% Here we decide the output format, depending on the TeX engine in use:
+\input iftex.sty % TeX engine tests
+\ifx\pdf+\pdftrue\fi % for plain TeX in combination with dvipdfm
+% Uncomment the following line if you want PDF goodies to be the default
+%\ifx\pdf-\else\pdftrue\fi
+\ifxetex\pdftrue\fi % XeTeX produces PDF output
+\ifpdf \def\pdflinkcolor{0 0 1} \fi % the RGB values for hyperlink color
+\newif\ifacrohint \ifpdf\acrohinttrue\fi \ifhint\acrohinttrue\fi
+\newif\ifpdflua \ifluatex\pdfluatrue\fi \ifpdftex\pdfluatrue\fi
+\ifpdflua % pdfTeX and luaTeX produce PDF output if \pdfoutput>0 (default)
+  \def\Black{\pdfliteral{0 g 0 G}}  % use rgb colors for direct PDF output too
+  \def\Blue{\pdfliteral{\pdflinkcolor\space rg \pdflinkcolor\space RG}}
+\fi
+
 \ifluatex % LuaTeX is almost like pdfTeX
 \protected\def\pdfliteral   {\pdfextension literal}
 \protected\def\pdfstartlink {\pdfextension startlink\space}
@@ -97,7 +99,7 @@
 \protected\def\pdfoutline   {\pdfextension outline\space}
 \protected\def\pdfdest      {\pdfextension dest\space}
 \protected\def\pdfcatalog   {\pdfextension catalog}
-\chardef\pdfshellescape
+\chardef\pdfshellescape % excerpt from 'shellesc.sty'
   \directlua{tex.sprint((status.shell_escape or os.execute()) .. " ")}
 \edef\pdfhorigin {\pdfvariable horigin}
 \edef\pdfvorigin {\pdfvariable vorigin}
@@ -106,7 +108,7 @@
 \let\pdfoutput=\outputmode
 \fi % end of LuaTeX->pdfTeX redirection macros
 
-\ifpdf % The following are pdf macros from 'cwebmac.tex 3.70'
+\ifpdf % The following are general pdf macros from 'cwebmac.tex 3.70'
 \def\thewidth{\the\wd0 \space}
 \def\theheight{\the\ht\strutbox\space}
 \def\thedepth{\the\dp\strutbox\space}
@@ -190,7 +192,7 @@
 \def\makeolproctokchar#1 #2 #3{\addF{#3}}
 \def\outlinedone{\edef\outlinest{\global\noexpand\toksE={\the\toksF}}%
   \outlinest\let\outlinedone=\relax}
-\fi % End of pdf macros
+\fi % End of general pdf macros
 
 \ifhint
 % The following uses HINT primitives to implement:
@@ -232,9 +234,10 @@
   \next
 }
 \def\makenote{\addtokens\toksB
-    {\noexpand\pdflink{\the\toksC}{\romannumeral\the\toksC}}\toksC={}\global\countC=0}
+    {\noexpand\pdflink{\the\toksC}{\romannumeral\the\toksC}}%
+    \toksC={}\global\countC=0}
 \def\maketoksdone{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
-\fi % End of common macros
+\fi % End of common pdf/hint macros
 
 \def\pdfURL#1#2{\ifpdf \ifpdflua\pdfannotlink height \theheight depth \thedepth
     attr {/Border [0 0 0]} user { /Type /Annot /Subtype /Link /A



More information about the tex-live-commits mailing list.