% 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 }