postgresql/doc/src/sgml/jadetex.cfg

90 lines
3.6 KiB
INI

% doc/src/sgml/jadetex.cfg
%
% 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.
%
% 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
\ifLabelElements
\ifx\Label\@empty\let\Label\Element\fi
\fi
\ifx\Label\@empty\else
\expandafter\ifx\csname p@\Label\endcsname\relax
\else
\bgroup
\ifNestedLink
\else
\hyper@anchorstart{\Label}\hyper@anchorend
\PageLabel{\Label}%
\fi
\egroup
\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
}