为什么resultin
等于 $\frac{1}{2}$ (标记化)?result
和不应该resultin
相等吗?
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{xstring}
\def\halo{%
\verbtocs{\resultin} | \frac{1}{2} |
( result in function : \resultin )\\
}
\begin{document}
\halo
\verbtocs{\result} | \frac{1}{2} |
( result : \result )\\
\end{document}
答案1
除了评论中的建议之外,另一种简单的方法是\scantokens
在宏定义中的逐字代码周围使用 e-TeX 原语:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{xstring}
\def\halo{%
\scantokens{%
\verbtocs{\resultin} | \frac{1}{2} |
( result in function : \resultin )
}%
}
\begin{document}
\halo
\verbtocs{\result} | \frac{1}{2} |
( result : \result )
\end{document}
输出
\scantokens{...}
将处理其参数的代码,就像将其写入外部文件一样,然后立即通过 从该文件读回\input
。所有 catcode,即使是在读取宏主体后修复的 catcode \halo
,也将在执行时活动的 catcode 机制下重新分配\scantokens
。
编辑:正如评论中指出的那样,这种方法对可用作逐字材料的文本有一些限制。您必须知道,TeX 首先在正常的 catcode 机制下扫描整个宏定义,然后重新考虑所有内容它之前已经成功解析。这例如解释了输出中 后面的额外空格\frac
,因为 TeX 已将其标记为宏名称,然后在该\scantokens
过程中在其后面添加了一个额外的空格。