了解 scantoken

了解 scantoken

我正在尝试使用\scantokens,但显然我不太理解它。我想将一些序列分解成寄存器\S

\let\ea\expandafter
\newtoks\S
\ea\S\ea{\detokenize{\textbf{f}}}

对其进行操作(省略),并重新标记。我的第一次尝试

\ea\def\ea\T\ea{\ea\scantokens\ea{\the\S}}

收益率\T=macro: \scantokens {\textbf {f}}.。这没错,但也许我们可以\scantokens得到\T得到。我认为,再扩大一次应该可以做到这一点,但显然不行。到目前为止,还有写的内容这里关于对\everyeof{\noexpand}我没有帮助:

\documentclass{article}
\let\ea\expandafter
\newtoks\S
\ea\S\ea{\detokenize{\textbf{f}}}

\ea\def\ea\T\ea{\ea\scantokens\ea{\the\S}}%
\show\T %\T=macro: \scantokens {\textbf {f}}.

%Runaway definition?
%->\textbf {f}
% ! File ended while scanning definition of \R.
\ea\ea\ea\def\ea\ea\ea\R\ea\ea\ea{\T}

%Runaway definition?
%->\textbf {f} \noexpand 
%! File ended while scanning definition of \R.
\everyeof{\noexpand}%
\ea\ea\ea\def\ea\ea\ea\R\ea\ea\ea{\T}
\show\R
\everyeof{}
\begin{document}
    \R
\end{document}

答案1

我会在 def 的外部而不是内部执行扫描标记:

在此处输入图片描述

\documentclass{article}
\let\ea\expandafter
\newtoks\S
\S\ea{\detokenize{\textbf{f}}}


\scantokens\ea{\ea\def\ea\T\ea{\the\S}}%
\show\T %\T=macro: \textbf {f}.


\begin{document}
f \T
\end{document}

答案2

这种\noexpand方法需要\edef-\scantokens很“棘手”(基本上是有缺陷的)。因此,类似于:

\everyeof{\noexpand}%
\edef\T{\noexpand\scantokens{\noexpand\unexpanded{\detokenize{\textbf{f}}}}}
\edef\R{\T}
\show\R
\everyeof{}
\documentclass{article}
\begin{document}
\R
\end{document}

由于重新扫描的令牌内可能包含不可扩展的内容,因此我将它们全部包装在内\unexpanded

(我稍微缩短了设置,以使其在我看来更清晰)。

相关内容