我想在命令定义中使 ^ 不特殊,即输入中的“^”应在输出中给出“^”字符。将 catcode 设置为 11 或 12 有效,但对“^^”无效。相反,LaTeX 用“a”替换“^^!”,用“(”替换“^^h”。这里发生了什么,我该怎么做?
提示:
- !、a、h、( 的 ASCII 码分别为 0x21、0x61、0x28、0x68。其他字符也存在同样的问题:^^ 消失,并添加 0x40或者从下一个字符中减去。我个人觉得很奇怪。
- LaTeX、pdfLaTeX、LuaLaTeX 和 XeLaTeX 都存在同样的问题。
\documentclass{article}
\newcommand{\func}[1]{{%
\catcode94=12\relax%^
\catcode95=12\relax%_
\scantokens{#1}%
}}
\begin{document}
OK:\func{_!_h}
OK:\func{^!^h}
OK:\func{__!__h}
NOT OK:\func{^^!^^h}
\catcode94=12\relax
\catcode95=12\relax
OK:__!__h
OK:^^!^^h
\end{document}
抱歉,该代码示例不够简洁;我想表明 __ (two _) 没有该问题,并且只有当我尝试该函数定义时才会出现该问题。
答案1
您需要在扫描参数之前更改 catcode:
\documentclass{article}
\usepackage[T1]{fontenc}
\newcommand{\func}{\bgroup%
\catcode94=12\relax%^
\catcode95=12\relax%_
\xfunc}
\newcommand\xfunc[1]{\scantokens{#1}\egroup}
\begin{document}
OK:\func{_!_h}
OK:\func{^!^h}
OK:\func{__!__h}
NOT OK:\func{^^!^^h}
\catcode94=12\relax
\catcode95=12\relax
OK:__!__h
OK:^^!^^h
\end{document}
_
和之间的区别在于^
,__!
仍然会产生三个标记,因此即使在使用 解析参数之后,您也可以“更正”标记以具有 catcode12,\scantokens
但由于^^!
仅解析为单个标记,因此\scantokens
不能用于获取三个 catcode 12 标记。