定义一个命令,使其仅在文档环境中有效

定义一个命令,使其仅在文档环境中有效

我想配置一个自定义命令,使其仅影响环境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}

参考:

代码:

\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分配,但此时已经执行了对小写字母的更改。

相关内容