(请将以下问题视为一个没有实际意义的观点,而不是一个日常问题。)
是否存在一种可扩展的方法来区分任意明确的非活动字符标记与其活动挂件,同时让活动挂件等于所讨论的任意明确的非活动字符标记?
换句话说:
假设你有,例如,
\catcode`\A=11\relax
\let\Mytemp=A
\catcode`\A=13\relax
\let A=\Mytemp
在这种情况下,是否存在一种可扩展的方法来区分例如 catcode 11 的 A(字母)和 catcode 13 的 A(活动)?
该方法也应在纯扩展环境中发挥作用,例如,在 内\csname..\endcsname
、在 内\edef
……
该方法在 Lua 扩展不可用的情况下也能发挥作用。
该方法在 eTeX 扩展不可用的情况下也能发挥作用。
该方法在 pdfTeX 扩展不可用的情况下也能发挥作用。
该方法也应该在您无法依赖\escapechar
或具有特定值的参数的情况下发挥作用。
该方法也适用于基于unicode的TeX引擎,比如XeTeX或LuaTeX。
该方法还应该适用于任意的显式字符标记,而不仅仅是 A。
(如果在执行例程时指定了所讨论的字符,则可以使用分隔参数进行检查。
对于基于 8 位编码的引擎,如果您有 256 个代码点,那么您可能有 256 个宏,每个宏都有另一个活动字符作为参数分隔符......
我怀疑这在基于 unicode/utf8 编码的引擎中是否可行,因为您有 1114112 个可能的代码点,因此需要 1114112 个宏,每个宏都有另一个活动字符作为参数分隔符...)
另一个类似的问题:
\escapechar=-1
\catcode`\A=11
\catcode`\B=11
\let\A=A
\let\B=B
如何以可扩展的方式区分\A
?A
如何以可扩展的方式区分\B
?B
(与上一个问题要求相同。)
答案1
有点作弊,因为它不适用于任意令牌,但对于A
-F
以下可扩展测试\write
产生
A is a special A: no
A is a special A: yes
从
\def\fooz#1{%
\immediate\write20{%
#1 is a special A: \if A\ifnum0="0#1\fi yes\else no\fi}}
\fooz{A}
\catcode`\A=11\relax
\let\Mytemp=A
\catcode`\A=13\relax
\let A=\Mytemp
\fooz{A}
\bye