我想配置一个自定义命令,使其仅影响环境document
。由于该命令会更改许多 catcode,因此必须将其包含在标签之后begin{document}
才能正常工作。但是,我更愿意将其设置为可以将其包含在自己的.sty
文件中。有没有办法定义命令,使其仅在环境中有效document
?
我尝试使用的代码类型类似于以下内容:
\AtBeginDocument{
\catcode`\_=13 \def_#1_{\emph{#1}}
}
当我使用该命令排版文档时\AtBeginDocument
,控制台停在该\begin{document}
行并记录以下内容:
Missing control sequence inserted.
<inserted text>
\inaccessible
但是,如果我在命令后包含代码(不包含规则\AtBeginDocument{}
)\begin{document}
,则文档将正确处理。
答案1
您可以使用在环境\AtBeginDocument
启动时执行代码。如果您尝试在收到错误之前\document
使用。\SomeNewCommand
\begin{document}
参考:
- 我在这个网站上的第二个问题如何在 \begin{document} 之后立即自动添加文本有一些解释。
代码:
\documentclass{article}
\AtBeginDocument{%
\newcommand*{\SomeNewCommand}{The command SomeNewCommand is now defined.}%
}
%\SomeNewCommand% Undefined
\begin{document}
\SomeNewCommand
\end{document}
答案2
您建议的代码
\AtBeginDocument{
\catcode`\_=13 \def_#1_{\emph{#1}}
}
无法工作,因为_
被读为的参数\AtBeginDocument
,所以它的类别代码被冻结。
你可以用间接的方式来做:
\AtBeginDocument{
\begingroup\lccode`~=`_
\lowercase{\endgroup\def~#1~}{\emph{#1}}%
\catcode`_=\active
}
这是因为~
是处于活动状态,因此该\lowercase
指令将产生一个活动状态_
。\endgroup
将恢复\lccode
分配,但此时已经执行了对小写字母的更改。