如何扩展用 \let 定义的标记

如何扩展用 \let 定义的标记

在以下代码的末尾,标记列表将包含标记而不是由 确认的\val字符。使用 a而不是 a可以得到我想要的结果,但在我实际的情况下不是一个选择。a\showthe\def\let

\newtoks\tok
\let\val=a
\tok=\expandafter{\val}
\showthe\tok

在完整的宏中,我在标记列表中逐个插入多个字符,这样就不会得到像abc我得到的那样的\val\val\val结果,因此当我使用标记列表时,结果就像ccc使用最后一个值\val

我无法改变\let宏的使用方式,\afterassignement像这样逐个字符地读取输入:

\def\reader{\afterassignement\process\let\val=}

有没有办法将字符放入令牌列表而不是令牌中?我知道\token创建者\let在某种程度上不是可扩展的令牌,并且替换应该以不同的方式触发,但我找不到办法做到这一点。

答案1

该标记是不可扩展的,您可以查看bm包中的主循环以了解区分此类标记的一种方法,基本上您需要执行\meaning\val并查看是否以 开头the letter,如果是,则该字母是下一个标记。

答案2

例如,宏\addtotoks可以执行您想要的操作:

\def\addtotoks#1 #2 #3\end#4{\expandafter{\the#4#3}}

\newtoks\tok
\let\val=a
\tok=\expandafter\addtotoks\meaning\val\end\tok
\let\val=b
\tok=\expandafter\addtotoks\meaning\val\end\tok

\showthe\tok  % result > ab 

但请注意:该\meaning原语针对各种标记具有不同的输出格式。该\addtotoks宏期望输出\meaning字母或数字。无论\let完成时实际类别代码是 11 还是 12,结果都属于类别 12。

相关内容