Plain TeX:页面顶部的标题 \folio 错误

Plain TeX:页面顶部的标题 \folio 错误

我有以下章节宏(使用 Heiko Oberdiek 的代码):

\def\ChaptTocEntry#1#2{%
  \line{\hbox to1em{\hfil\bf#1}\hskip1em#2\leaderfill\folio}}
\def\ChaptWr#1{{%
  \let\folio\relax
  \edef\next{%
    \write0{\noexpand\ChaptTocEntry{\the\ChaptNo}{#1}}}\next}}
\def\Chapt#1{\advance\ChaptNo by1\SecNo=0%
  \vskip-\lastskip
  \bigskip\noindent{\bf\the\ChaptNo\hskip1em#1}\ChaptWr{#1}\par\nobreak\medskip
  \everypar={{\setbox0=\lastbox}\everypar={}}}

\par\nobreak\medskip用于不允许在标题和后续文本之间进行分页。尽管目录信息是\ChaptWr{#1}在设置标题文本之后(之前#1)写入的,但如果导致标题移至下一页的顶部,\ChaptWr则会使用错误的页码。\nobreak

如果\ChaptWr将 放在定义的后面( 之后\nobreak),它会自动允许分页符。我不知道为什么,因为它不包含任何输出到页面的内容(只包含输出到文件的内容)。

当我将标题宏简化为

\def\Chapt#1{%
  \bigskip\noindent{\folio\ #1}\par\nobreak\medskip
  \everypar={{\setbox0=\lastbox}\everypar={}}}

\folio对于“移位”标题来说是错误的(仍然输出前一个页码)。

答案1

TeXbook(第 423-424 页)中对索引实现的描述为标题宏提供了一个简单的解决方案:

\newwrite\TocFh

\def\MkTocEnt{%
  \xdef\WrTocEnt{\write\TocFh{\line{\TocText\leaderfill
    \noexpand\number\pageno}}}\WrTocEnt}

\def\Chapt#1{\advance\ChaptNo by1 \SecNo=0
  \vskip-\lastskip
  \bigskip\noindent{\bf\the\ChaptNo\hskip1em#1}% output heading
  {\def\TocText{\hbox to1em{\hfil\bf\the\ChaptNo}\hskip1em#1}% output TOC data
    \let\next=\TocText\MkTocEnt}%
  \par\nobreak\medskip
  \everypar={{\setbox0=\lastbox}\everypar={}}}

\def\TOC{\input toc\immediate\openout\TocFh=toc}

\leaderfill类似于\hfil,参见 TeXbook 第 223 页。)

该解决方案也适用于索引和交叉引用。

相关内容