我用\write
它来输出目录信息。虽然正确的标题计数器信息出现在标题本身中,但 TOC 标题具有页面最后一个标题的编号。因此命令\write
似乎被延迟到页面弹出。如何\write
在处理标题宏时刷新?
我当前的部分宏以以下内容开头:
\edef\SecWr#1{\write0{\line{\hskip2em\hbox to2em{\the\ChaptNo.\the\SecNo\hfil}
#1\leaderfill\noexpand\folio}}}
\def\Sec#1{\advance\SecNo by1
\SecWr{#1}
页码显示正确,但例如\the\ChaptNo
显示为0
?
答案1
章节号需要在\write
发行时进行扩充,但页码的扩充\folio
需要延迟到页面发出时,到时页码才能确定。
例子:
\def\tocentry#1#2{%
\line{%
\hskip2em\relax
\hbox to 2em{#1\hfil}%
#2\leaderfill
\folio
}%
}
\def\SecWr#1{%
\begingroup
\let\folio\relax % prevent expansion of `\folio` during `\edef`
\edef\next{%
\write0{\noexpand\tocentry{\the\ChaptNo.\the\SecNo}{#1}}%
}%
\next
\endgroup
}
答案2
宏是否\def
定义\edef
在定义时间,不是在使用时。
因此,您不希望,这会将和\edef\SecWr
的值永远固定为定义时的值(即零)。\ChaptNo
\SecNo
如果您想要一个在使用时扩展其参数的宏,您可以利用expl3
,它也适用于 Plain TeX,只要您运行类似的 e-TeX 引擎pdftex
(而不是 Knuth TeX)。
\input expl3-generic
\ExplSyntaxOn
\cs_new_protected:Nn \test_sec_wr:nn
{
\tocsection{#1}{#2}
}
\cs_generate_variant:Nn \test_sec_wr:nn { x }
\cs_set_eq:NN \SecWr \test_sec_wr:xn
\ExplSyntaxOff
\def\tocsection#1#2{%
\write0{%
\line{\hskip2em\hbox to2em{#1\hfil}#2\leaderfill\folio}%
}%
}
\def\Sec#1{\advance\SecNo by1 \SecWr{\the\ChaptNo.\the\SecNo}{#1}}
这是一个完整的例子(\leaderfill
定义为\relax
仅用于测试,因为我不知道你的定义是什么)。
\input expl3-generic
\ExplSyntaxOn
\cs_new_protected:Nn \test_sec_wr:nn
{
\tocsection{#1}{#2}
}
\cs_generate_variant:Nn \test_sec_wr:nn { x }
\cs_set_eq:NN \SecWr \test_sec_wr:xn
\ExplSyntaxOff
\def\tocsection#1#2{%
\write0{%
\line{\hskip2em\hbox to2em{#1\hfil}#2\leaderfill\folio}%
}%
}
\def\Sec#1{\advance\SecNo by1 \SecWr{\the\ChaptNo.\the\SecNo}{#1}}
\newcount\ChaptNo
\newcount\SecNo
\let\leaderfill\relax % just for testing
\ChaptNo=3 % just for testing
\Sec{Section Title}
\Sec{Section Title}
\Sec{Section Title}
\bye
该宏\test_sec_wr:nn
被定义为一个普通宏,但是我们定义了一个完全 e 的变体,x
其第一个参数的变体并将其用作\SecWr
。这是终端上的输出:
\hbox to\hsize {\hskip 2em\hbox to2em{3.1\hfil }Section Title\leaderfill 1}
\hbox to\hsize {\hskip 2em\hbox to2em{3.2\hfil }Section Title\leaderfill 1}
\hbox to\hsize {\hskip 2em\hbox to2em{3.3\hfil }Section Title\leaderfill 1}