我有以下章节宏(使用 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 页。)
该解决方案也适用于索引和交叉引用。