\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
确实完全扩展)。