xstring 字符比较和 \meaning

xstring 字符比较和 \meaning
\documentclass[pdftex,a4paper,12pt,oneside]{book}%

\usepackage{xstring}

\begin{document}

\newcommand{\tmpa}{}
\newcommand{\tmpb}{}
\newcommand{\tmpc}{}

\renewcommand{\tmpc}{abcdefg} \noindent tmpc: \tmpc \\
\renewcommand{\tmpa}{\meaning\tmpc} tmpa: \tmpa \\
len: \StrLen{\tmpa} \\
char(20): \StrChar{\tmpa}{20}[\tmpb] \tmpb \\
pos(f): \StrPosition{\tmpa}{f} 

\end{document}

结果:

tmpc: abcdefg

tmpa: \long macro:->abcdefg

len: 21

char(20): f

pos(f): 0  

为什么?tmpa显然,20 位置包含字符“f”,因为我们可以使用 找到它\StrChar。但那个“f”与我们尝试使用 找到的“f”不同StrPos。我考虑过 catcode 差异,但没有找到任何可用的东西(在搜索之前更改“f”的 catcode 可能是错误的)。

答案1

\meaning\tmpc生成一个字符串,其中所有字符的类别代码均为 12(但空格的类别代码为 10)。比较字符串时,f未找到类别代码 11。

使用分隔参数宏的工作\StrPosition并且字符代码和类别代码的分隔符必须相同。

确实,如果你说\StrPosition{\tmpa}{\string f}打印的结果是 20(\StrPosition确实完全扩展)。

相关内容