考虑这个普通的 TeX 文件:
\newtoks\t
\t={#}
\showthe\t
\bye
如果你编译它(使用tex
of pdftex
),那么在输出中你得到
> ##.
l.3 \showthe\t
为什么我得到二的#
s ?
(背景:我想在标记列表中构建宏定义的主体,并且该宏采用一个参数,我想将其作为放入标记列表中#1
。我的想法是使用\edef\macro#1{\the\t}
。)
答案1
当 TeX节目 #
,它会加倍。所以在你的
\newtoks\t
\t={#}
\showthe\t
\bye
例子,
> ##.
l.3 \showthe\t
代表一 #
在 token 寄存器内。你可以使用以下命令让 TeX 显示此信息\string
:
\newtoks\t
\t={#}
\expandafter\string\the\t
\bye
(当然这只因为其中有一个标记才有效\t
!)
对于宏的定义,你需要类似
\newtoks\t
\t={You gave '#1'}
\expandafter\def\expandafter\test
\expandafter#\expandafter1\expandafter{\the\t}
\test{things}
\bye
答案2
约瑟夫回答了# 出现两次的原因,因为这是 show 等的标准行为。
因为您想在标记列表中构建宏定义的主体,所以合并 #1 等的唯一方法 (IMHO) 是通过宏将其放入。
\newtoks\t
\t={\def\z#1{\bf #1}}
\def\macro#1{\the\t \z{B} \z{#1}}
\macro{test}
\bye
与 OP 所提出的唯一区别是,要将主体定义放入标记列表中,您需要使用\the\t
和 将其传递给宏\helpermacro{#1}
。
答案3
按照 Yiannis 所写的内容,你可以做这样的事情:
% Put the replacement text into \t, using any computation like this doubling loop
\newtoks\t
\t{#1}
\count255 0
\loop\ifnum\count255<10
\t\expandafter\expandafter\expandafter{\expandafter\the\expandafter\t\the\t}
\advance\count255 1
\repeat
% Define a helper that when executed will perform the real definition
\edef\helper{\noexpand\def\noexpand\X##1{\the\t}}
\helper
% Now the real macro \X can be used.
\X{[X] }
\bye