假设有人已经定义
\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@ifscanable
in ,并查看哪一个与原始命令相关。etoolbox
\ifx
#1
(如果你想让它捕捉到\bar
类似的东西,我认为你甚至无法特殊处理等等
\def\gobblethree#1#2#3{}
\edef\foo{\def\noexpand\bar\expandafter\gobblethree\detokenize{##}1{}}
\foo
)