% doc/src/sgml/jadetex.cfg
%
-% This file redefines FlowObjectSetup to eliminate one of the two control
-% sequences it normally creates, thereby substantially reducing string usage
-% and permitting the complete Postgres documentation to be built without
-% overflowing a hard-to-expand TeX limit. The only known penalty is an
-% increased number of TeX warnings about ignoring duplicate definitions.
+% This file redefines \FlowObjectSetup and some related macros to greatly
+% reduce the number of control sequence names created, and also to avoid
+% creation of many useless hyperlink anchors (bookmarks) in PDF files.
%
-% Curiously, we only see the failure when building PDF output --- plain PS
-% output does not come anywhere close to overflowing the string table.
-% There may be another solution hidden in that observation.
+% The original coding of \FlowObjectSetup defined a control sequence x@LABEL
+% for pretty nearly every flow object in the file, whether that object was
+% cross-referenced or not. Worse yet, it created a hyperlink anchor for
+% every such object, which not only bloated the output PDF with useless
+% anchors but consumed an additional control sequence name per anchor.
+% This results in overrunning TeX's limited-size string pool.
+%
+% To fix, extend \PageLabel's already-existing mechanism whereby a p@LABEL
+% control sequence is filled in only for labels that are referenced by at
+% least one \Pageref call. We now also fill in p@LABEL for labels that are
+% referenced by a \Link. Then, we can drop x@LABEL entirely, and use p@LABEL
+% to control emission of both a hyperlink anchor and a page-number label.
+% Now, both of those things are emitted for all and only the flow objects
+% that have either a hyperlink reference or a page-number reference.
+% We consume about one control sequence name per flow object plus one per
+% referenced object, which is a lot better than three per flow object.
+%
+% (With a more invasive patch, we could track the need for an anchor and a
+% page-number label separately, but that would probably require two control
+% sequences for every flow object. Besides, many objects that have one kind
+% of reference will have the other one too; that's certainly true for objects
+% referenced in either the TOC or the index, for example.)
+%
+%
+% In addition to checking p@LABEL not x@LABEL, this version of \FlowObjectSetup
+% is fixed to clear \Label and \Element whether or not it emits an anchor
+% and page label. Failure to do that seems to explain some pre-existing bugs
+% in which certain SGML constructs weren't correctly cross-referenced.
%
\def\FlowObjectSetup#1{%
\ifDoFOBSet
\ifx\Label\@empty\let\Label\Element\fi
\fi
\ifx\Label\@empty\else
+ \expandafter\ifx\csname p@\Label\endcsname\relax
+ \else
\bgroup
\ifNestedLink
\else
\PageLabel{\Label}%
\fi
\egroup
- \let\Label\@empty
- \let\Element\@empty
+ \fi
+ \let\Label\@empty
+ \let\Element\@empty
\fi
\fi
}
+%
+% Adjust \PageLabel so that the p@NAME control sequence acquires a correct
+% value immediately; this seems to be needed to avoid scenarios wherein
+% additional TeX runs are needed to reach a stable state of the .aux file.
+%
+\def\PageLabel#1{%
+ \@bsphack
+ \expandafter\ifx\csname p@#1\endcsname\relax
+ \else
+ \protected@write\@auxout{}%
+ {\string\pagelabel{#1}{\thepage}}%
+ % Ensure the p@NAME control sequence acquires correct value immediately
+ \expandafter\xdef\csname p@#1\endcsname{\thepage}%
+ \fi
+ \@esphack}
+%
+% In \Link, add code to emit an aux-file entry if the p@NAME sequence isn't
+% defined. Much as in \@Setref, this ensures we'll process the referenced
+% item correctly on the next TeX run.
+%
+\def\Link#1{%
+ \begingroup
+ \SetupICs{#1}%
+ \ifx\Label\@empty\let\Label\Element\fi
+% \typeout{Made a Link at \the\inputlineno, to \Label}%
+ \hyper@linkstart{\LinkType}{\Label}%
+ \NestedLinktrue
+ % If p@NAME control sequence isn't defined, emit dummy def to aux file
+ % so it will get defined properly on next run, much as in \@Setref
+ \expandafter\ifx\csname p@\Label\endcsname\relax
+ \immediate\write\@mainaux{\string\pagelabel{\Label}{qqq}}%
+ \fi
+}