![修改序言中或 \AtBeginDocument 中的 catcode?](https://linux22.com/image/311948/%E4%BF%AE%E6%94%B9%E5%BA%8F%E8%A8%80%E4%B8%AD%E6%88%96%20%5CAtBeginDocument%20%E4%B8%AD%E7%9A%84%20catcode%EF%BC%9F.png)
我想修改逗号的 catcode,使用以下代码
\documentclass{article}
\AtBeginDocument{%
\catcode`\,=\active
\protected\def,{...}%
}
\begin{document}
a,b,c $a,b,c$.
\end{document}
我收到以下错误消息:
! Missing control sequence inserted.
<inserted text>
\inaccessible
l.6 \begin{document}
但使用以下代码,我得到了正确的结果:
\documentclass{article}
\begingroup
\catcode`\,=\active
\protected\gdef,{...}%
\endgroup
\AtBeginDocument{%
\catcode`\,=\active
}
\begin{document}
a,b,c $a,b,c$.
\end{document}
我想知道这两种方式有什么区别。为什么第一种方法会导致问题?
编辑: 虽然 David Carlisle 给出了另一个相关问题,但我认为这个问题可能与那个问题不一样,因为两个都示例包含
\AtBeginDocument{%
\catcode`\,=\active
}
我不明白为什么只有一个例子就会引起问题。
答案1
在的论证中\AtBeginDocument
,逗号是不是有效。当类别代码设置的参数为执行稍后\begin{document}
。还请记住,类别代码在标记化过程中被分配。读取参数时,输入的字节将使用当前类别代码机制进行标记化。执行参数时,逗号的类别更改将影响后续的标记化,但不会影响参数其余部分的标记。
小写波浪符号技巧
典型的模式是使用波浪符号,因为它在 LaTeX 中默认处于活动状态。然后\lowercase
用于将波浪符号转换为逗号。在此过程中类别代码不会改变,结果是活动逗号。组可防止波浪符号的小写设置永久设置。
\documentclass{article}
\AtBeginDocument{%
\catcode`\,=\active
\begingroup
\lccode`\~=`\, %
\lowercase{\endgroup
\protected\def~%
}{...}%
}
\begin{document}
a,b,c $a,b,c$.
\end{document}
更改整个报表的类别代码
另一种模式是更改包括参数在内的整个语句的类别代码。首先保存逗号的原始类别代码,例如通过重置宏(\ResetCommaCatcode
)。然后更改逗号的类别代码。现在\AtBeginDocument
调用,参数现在包含一个活动逗号标记(在中\protected\def,
)。之后,逗号的类别代码将重置为先前的值。
\documentclass{article}
\edef\ResetCommaCatcode{%
\catcode`\noexpand\,=\the\catcode`\,\relax
}
\catcode`\,=\active
\AtBeginDocument{%
\catcode`\,=\active
\protected\def,{...}%
}
\ResetCommaCatcode
\begin{document}
a,b,c $a,b,c$.
\end{document}