检测参数文本中的 catcode

检测参数文本中的 catcode

假设有人已经定义

\documentclass{minimal}
\begin{document}

\def\fooA#1@{}
\makeatletter
\def\fooB#1@{}

\end{document}

很容易测试就能发现两者的不同:\ifx\fooA\fooB...\else...\fi

但是,如果我们给出了和之一\fooA,并且我们之前没有看到过定义,我们能否分辨出分隔参数\fooB的 catcode 是什么?@

免责声明:我纯粹是出于好奇而对答案感兴趣。

编辑:基本上,是否有一个版本\meaning可以保留 catcodes?或者有没有办法在参数文本中显示标记的 catcodes? --- 下面的答案是“否”。

答案1

你不能。

读取宏定义(及其参数文本)的唯一方法是\meaning\show仅将其显示给用户)。不幸的是,它将所有字符转换为 catcode“其他”,除了空格(空格仍为空格)。因此您无法检测到差异。

答案2

\fooA令人失望的答案:这与或 的catcode 无关\fooB\ifx测试只是看到两个宏的参数文本不同(它们包含不同的@s),所以结果是否定的。\ifx测试并不关心什么区别是。

答案3

根据 Bruno 和 Joseph 对这个问题的评论,如果你愿意(显著地)牺牲速度,你可以为参数文本中的标记(字符?)的每个可能的 catcode 组合重建命令 a la \etb@ifscanablein ,并查看哪一个与原始命令相关。etoolbox\ifx

#1(如果你想让它捕捉到\bar类似的东西,我认为你甚至无法特殊处理等等

\def\gobblethree#1#2#3{}
\edef\foo{\def\noexpand\bar\expandafter\gobblethree\detokenize{##}1{}}
\foo

相关内容