如何将“#”放入标记列表中而不得到两个?

如何将“#”放入标记列表中而不得到两个?

考虑这个普通的 TeX 文件:

\newtoks\t
\t={#}
\showthe\t
\bye

如果你编译它(使用texof 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

相关内容