如何扩展 \write 参数中的寄存器值(纯 TeX)?

如何扩展 \write 参数中的寄存器值(纯 TeX)?

我用\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}

相关内容