在以下代码的末尾,标记列表将包含标记而不是由 确认的\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。