diff options
Diffstat (limited to 'macros/plain/contrib/zztex/tex/zztag.tex')
-rw-r--r-- | macros/plain/contrib/zztex/tex/zztag.tex | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/macros/plain/contrib/zztex/tex/zztag.tex b/macros/plain/contrib/zztex/tex/zztag.tex new file mode 100644 index 0000000000..32154dd8c4 --- /dev/null +++ b/macros/plain/contrib/zztex/tex/zztag.tex @@ -0,0 +1,269 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Module: ZzTeX Tag Facilities +% +% Synopsis: This module contains the definitions necessary to implement +% tags and references to them. +% +% Note: Tag names beginning with `zX:' are reserved for ZzTeX: +% +% zA: design alternative choices (obsolete) +% zB: bibliographic tags +% zE: frame page numbers +% zF: float page numbers +% zH: help text +% zM: margin note page numbers +% zP: proof note page numbers +% zR: margin rule page numbers +% zS: snapshot information +% +% Author: Paul C. Anagnostopoulos +% Created: 19 September 1989 +% +% Copyright 1989--2020 by Paul C. Anagnostopoulos +% under The MIT License (opensource.org/licenses/MIT) +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Tag Definition +% --- ---------- + + +\definetoks{\taginfonumber} +\taginfonumber = {???} +\definetoks{\taginfotitle} +\taginfotitle = {???} +\definecount{\zmistags}{0} + + +% The number is fully expanded, while the title is not expanded. +% Then we make sure they are never expanded again. + +\def \settaginfo #1#2{% {number}{title} + \edef \znext {\taginfonumber = {#1}}% + \znext + \taginfotitle = {#2}} + +\def \tag #1{% {name} + \if \emptytoksp{\taginfonumber}% + \warning{notaginfo}{ZzTeX reference: Misplaced tag '#1'}% + \global\increment \zmistags + \fi + \zbeginhidewrite + \edef \znext {\noexpand\xref{tag}{\noexpand\folio}% + {\the\taginfonumber}% + {\the\taginfotitle} + {#1}}% + \znext + \if \PDFhyperlinks \PDFmark{T:#1}\fi + \zendhidewrite} + +\def \tagwith #1#2{% {name}{reference-text} + \zbeginhidewrite + \edef \znext {\noexpand\xref{tag}{\noexpand\folio}% + {#2}% + {???notitle???} + {#1}}% + \znext + \if \PDFhyperlinks \PDFmark{T:#1}\fi + \zendhidewrite} + +% This is a special command when you just want to know the page number. + +\def \tagpageonly #1{% {name} + \zbeginhidewrite + \edef \znext {\noexpand\xref{tag}{\noexpand\folio}% + {???nonumber???}% + {???notitle???} + {#1}}% + \znext + \if \PDFhyperlinks \PDFmark{T:#1}\fi + \zendhidewrite} + +\def \uniquetag #1#2{% {prefix}{counter} + #1:\the\divisionname-#2} + +% Subtag Definition +% ------ ---------- + + +\definecount{\subtagnumber}{0} + + +\def \setsubtagnumber #1{% {integer} + \subtagnumber = #1\relax} + +\def \subtag #1#2{% {name}{subnumber} + \zparsesubnumber #2???\zmark + \tagwith{#1}{\zsubtagtext}} + +\def \zparsesubnumber #1?#2?#3?#4\zmark{% + \if \emptyargp{#2}% + \edef \zsubtagtext {\the\taginfonumber #1}% + \else + \increment \subtagnumber + \edef \zsubtagtext {\the\taginfonumber #1#2\subtagnumber#3}% + \fi} + +% Tag Reference +% --- --------- + + +% This counter keeps track of the number of undefined tag references. + +\definecount{\zuntagrefs}{0} + + +\def \refnumber #1{% {tag-name} + \zbeginrefhilight + \if \definedp{\=#1}% + \zreftext{#1}{\expandafterthrice\ztagdata \name{\=#1}\zmark1}% + \else + \zuntag{#1}{???}% + \fi + \zendrefhilight} + +\let \ref = \refnumber % Because it's so common. + +\def \refpage #1{% {tag-name} + \zbeginrefhilight + \if \definedp{\=#1}% + \zreftext{#1}{\expandafterthrice\ztagdata \name{\=#1}\zmark0}% + \else + \zuntag{#1}{???}% + \fi + \zendrefhilight} + +\def \reftitle #1{% {tag-name} + \zbeginrefhilight + \if \notp{\allowreftitle}% + \warning{noreftitle}{Use of \string\reftitle is not allowed}% + ???not allowed???% + \else \if \definedp{\=#1}% + {\zadjtitle = \zadjtitlenone + \zreftext{#1}{\expandafterthrice\ztagdata \name{\=#1}\zmark2}}% + \else + \zuntag{#1}{???title???}% + \fi\fi + \zendrefhilight} + +\def \zbeginrefhilight {% + \if \DVIWindoinuse + \colorspecial{ifview color push rgb 1 0 .25}% % Color the reference. + \fi} + +\def \zendrefhilight {% + \if \DVIWindoinuse + \colorspecial{ifview color pop}% % Done with color. + \fi} + +\def \zreftext #1#2{% {tag}{text} + \if \PDFhyperlinks + \tagbutton{#1}{#2}% + \else + #2% + \fi} + +\def \ztagdata #1\zmark#2\zmark#3\zmark#4{% + \ifcase #4 #1\or #2\or #3\fi} % Space after #4 is critical! + +\def \zuntag #1#2{% {tag}{what-to-set} + \writelog{ZzTeX reference: Undefined tag `#1'.}% + \zxwriteinfo{\false}{undef-tag}{#1}{}% + \global\increment \zuntagrefs + #2} + +% Determining the Page +% ----------- --- ---- + + +% This command allows us to use the tag facility to determine which page +% a particular element is on, in case the design of the element depends +% on whether it is on a recto or verso. + +\def \whichpage #1#2{% {\count-reg}{tag-name} + \def \zreg {#1}% + \if \definedp{\=#2}% + \edef \zpg {\expandafterthrice\ztagdata \name{\=#2}\zmark0}% + \expandafter\zwhichpagea \zpg--\zmark + \else + \zuntag{#2}{\relax}% + #1=\pagenumber + \fi\relax} + +\def \zwhichpagea #1-#2-#3\zmark{% + \if \emptyargp{#2}% + \zwhichpageb #1\zmark + \else + \zwhichpageb #2\zmark + \fi} + +\def \zwhichpageb #1\zmark{% + \setbox \zboxa=\hbox{\zreg=0#1}% + \if \dimzerop{\wd\zboxa}% + \zreg=#1% + \else + \zreg=\pagenumber + \fi} + +% Tag Cross-Reference +% --- --------------- + + +% These counters keep track of the number of duplicate tags, and the +% number of tags that have changed since the previous run. + +\definecount{\zduptags}{0} +\definecount{\zchangedtags}{0} + + +% Define the macro \=tag to contain the page, number, and title. +% However, use of the title is controlled by \allowreftitle. + +\def \xreftag #1#2#3#4{% {page}{number}{title}{tag} + \ifnum \xrefmode=\xrefloadtagmode + \if \definedp{\=#4}\zduptag{#4}\fi + \xreftagdef{#1}{#2}{#3}{\=#4}% + \else\ifnum \xrefmode=\xrefcopymode + \xreftagchk{#1}{#2}{#3}{\=#4}% + \fi\fi} + +\def \xreftagdef #1#2#3#4{% {page}{number}{title}{\name} + \if \allowreftitle + \withname\gdef{#4}{#1\zmark#2\zmark#3}% + \else + \withname\gdef{#4}{#1\zmark#2\zmark}% + \fi} + +\def \xreftagchk #1#2#3#4{% {page}{number}{title}{\name} + \xreftagdef{#1}{#2}{#3}{\zxrefchk}% + \expandaftertwice\ifx \name{#4}\zxrefchk + \else + \global\increment \zchangedtags + \fi} + +\def \zduptag #1{% {tag} + \writelog{ZzTeX reference: Duplicate tag `#1'.}% + \global\increment \zduptags} + +% Tag Cross-Reference Summary +% --- --------------- ------- + + +\def \ztagsummary {% + \if \posp{\zuntagrefs}% + \remark{Number of undefined tags in this run: \number\zuntagrefs.}% + \fi + \if \posp{\zduptags}% + \remark{Number of duplicate tags in this run: \number\zduptags._% + \space\space\space\space\space\space\space Eliminate duplicates % + and reprocess the book twice.}% + \fi + \if \posp{\zmistags}% + \remark{Number of misplaced tags in this run: \number\zmistags.}% + \fi + \if \posp{\zchangedtags}% + \remark{Number of tags changed since previous run: \number\zchangedtags._% + \space\space\space\space\space\space\space Reprocess the book % + to obtain correct cross-references.}% + \fi} |