diff --git a/doc/src/sgml/jadetex.cfg b/doc/src/sgml/jadetex.cfg
index 25b79312ebc35df0c155b9672b8bde7a4ccb4f85..875598f1514b506a0d5eb502959d44bbfee30520 100644
--- a/doc/src/sgml/jadetex.cfg
+++ b/doc/src/sgml/jadetex.cfg
@@ -1,14 +1,37 @@
 % 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
@@ -16,6 +39,8 @@
      \ifx\Label\@empty\let\Label\Element\fi
   \fi
   \ifx\Label\@empty\else
+      \expandafter\ifx\csname p@\Label\endcsname\relax
+      \else
        \bgroup
          \ifNestedLink
          \else
@@ -23,8 +48,42 @@
            \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
+}