代码如下:
\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 正在寻找的数字。\toks
0
\expandafter
\space
\the\test
\space
0
该\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