关于 \newtoks 和 token 列表的令人费解的事情

关于 \newtoks 和 token 列表的令人费解的事情

代码如下:

\documentclass{article}

\newtoks \test

\begin{document}

    \test={123}
    \test=\test{666}
    \test=\test{hhh}
    \the\test

\end{document}

结果为:666 hhh 123,如下图所示。

在此处输入图片描述

我的问题是:为什么结果是“666 hhh 123”而不是“123 666 hhh”,并且为什么 666 和 hhh 之间以及 hhh 和 123 之间有空格?

我是 TeX 和 LaTex 的初学者,对 token、token 列表和 \newtoks 有一些了解,但上述代码的行为确实让我感到困惑。这是怎么回事?希望专家能给我一些建议,在此先谢谢大家了。

答案1

代码如下:

\documentclass{article}

\newtoks \test

\begin{document}

% this assigns 123 to \test and makes a space token (ignored in v mode)
    \test={123}
% this assigns \test to \test (no-op) typesets 666 in a group then a non ignored space
    \test=\test{666}
% this assigns \test to \test (no-op) typesets hhh in a group then a non ignored space
    \test=\test{hhh}
% thistypesets the contents of \test which is 123
    \the\test

\end{document}

你没有说,但我猜你正试图将其附加到令牌列表中

在此处输入图片描述

\documentclass{article}

\newtoks \test

\begin{document}

    \test={123}%%%
    \test=\expandafter{\the\test 666}%%%
    \test=\expandafter{\the\test hhh}%%%
    \the\test

\end{document}

答案2

之后,\newtoks\test您可以使用语法将某些内容分配给此令牌寄存器

\test={123}

=是可选的);括号之间写的标记应该相对于保持平衡{...}

你可以使用以下命令让 TeX 传递寄存器的内容

\the\test

但是没有直接规定将标记附加到已存储的内容。必须利用执行此类分配的方式。之后\test=TeX 将扩展标记以查找{分隔要分配的标记列表的(并且 TeX 将\relax在此过程中忽略空格标记和,但这只是一个技术问题)。

特别是,如果你想附加代币,你可以做

\test=\expandafter{\the\test abc}

因为 TeX 会进行扩展,并\expandafter会对随后的标记进行操作{,在本例中就是\the会传递 的内容\test

如果你想前置令牌,你必须使用临时令牌寄存器:例如

\toks0={uvw}
\test=\expandafter{\the\toks0\expandafter\space\the\test}

这个有什么用呢?和前面一样,第一个\expandafter会触发 的扩展\the。现在找到了需要跟在数字后面的\the原语;找到了,但 TeX 会继续扩展,直到找到不能解释为数字的东西;它发现跳过并扩展。然后它会扩展,并且生成的标记将被忽略,因为它跟在 后面,这将是 TeX 正在寻找的数字。\toks0\expandafter\space\the\test\space0

\begingroup\edef\x{\endgroup...}\x方法确保的定义\x将在扩展后立即消失\x,因此我们掩盖了我们的踪迹。

有一种更简单的方法可以添加标记:

\test={123}
\toks0={uvw}
\begingroup\edef\x{\endgroup\test={\the\toks0 \the\test}}\x

这是有效的,因为\edef将跳过不可扩展的标记,在本例中是\test,但会扩展\the;但是,由 产生的标记\the<token register>将不会在 中进一步扩展\edef

使用 e-TeX 扩展(可用于 pdftex、xetex 和 luatex),您可以不用临时令牌寄存器:

\test={123}
\begingroup\edef\x{\endgroup\test={\unexpanded{uvw}\the\test}}\x

当然,您想为这些工作定义宏:

\def\append#1#2{#2=\expandafter{\the#1#2}}
\def\prepend#1#2{%
  \begingroup\edef\x{\endgroup
    #1={\unexpanded{#2}\the#1}%
  }\x
}

\newtoks\test

\test={123}
\append\test{abc}
\prepend\test{uvw}

\the\test

\bye

将打印

uvw123abc

答案3

您正在做:

\test={123}       % the value 123 is saved to \test
\test=\test{666}  % \test=\test (assigning similar to a=a) is done,
                  % then 666 is printed in group
\test=\test{hhh}  % \test=\test is done and then hhh is printed in group
\the\test         % the value of \test, i.e. 123, is expandend and printed

相关内容