Xstring 包有错误吗?

Xstring 包有错误吗?

为什么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过程中在其后面添加了一个额外的空格。

相关内容