包中 @(at 符号)的 catcode 问题

包中 @(at 符号)的 catcode 问题

我已输入以下内容example.tex

\catcode`\@=13 

\let@\IND

问题是当我想使用eexxample.sty包含 的包时example.tex,命令@不会出现,它会变成 catcode 12,我使用 显示它\the\catcode`\@。也许是\usepackage重新定义了命令?但我不知道为什么......

代码是::

当我输入这个时,@ 显示 catcode 12,也许你之前的意思是 @ 显示 catcode 12?

\documentclass{scrreprt}

\usepackage{eexxample}

\begin{document}

\the\catcode`\@

$@X_a @X_a^g @X^g X_a X_a^g X^g $ \ $X_b$ \ $\IND X_b \IND X_b^a \IND X_b \IND X^a $ \

$@X_a @X_a^g @X^g X_a X_a^g X^g $ \

\end{document}

但是当我输入这个时,catcode @ 显示 13,并且命令正在运行,所以我认为 TEX 重新定义了这个 @ 命令:

\documentclass{scrreprt}

\begin{document}

\input{C:/LocalTexFiles/tex/example}

\the\catcode`\@

$@X_a @X_a^g @X^g X_a X_a^g X^g $ \ $X_b$ \ $\IND X_b \IND X_b^a \IND X_b \IND X^a $ \

$@X_a @X_a^g @X^g X_a X_a^g X^g $ \

\end{document}

首先谢谢您的幫助!


当我输入这个时,@ 显示 catcode 12,也许你之前的意思是 @ 显示 catcode 12?

\documentclass{scrreprt}
\usepackage{eexxample}
\begin{document}
\the\catcode`\@

$@X_a @X_a^g @X^g X_a X_a^g X^g $ \\
$X_b$ \\
$\IND X_b \IND X_b^a \IND X_b \IND X^a $ \\

$@X_a @X_a^g @X^g X_a X_a^g X^g $ \\

\end{document}

但是当我输入这个时,catcode @ 显示 13,并且命令正在运行,所以我认为 TEX 重新定义了这个 @ 命令:

\documentclass{scrreprt}
\begin{document}
\input{C:/LocalTexFiles/tex/example}

\the\catcode`\@

$@X_a @X_a^g @X^g X_a X_a^g X^g $ \\
$X_b$ \\
$\IND X_b \IND X_b^a \IND X_b \IND X^a $ \\

$@X_a @X_a^g @X^g X_a X_a^g X^g $ \\

\end{document}

答案1

在每个包开始时,当前的 catcode@被推送到堆栈上,并将的 catcode@设置为 11,以便可以使用内部命令。在包结束时,的 catcode@恢复为保存的值并弹出堆栈。这意味着包中 catcode 的任何设置都@将丢失。

与任何其他乳胶行为一样,这可能会被覆盖,但它会破坏大多数 tex 代码,您确定要使其@全局活跃吗?

您的软件包中的 active 定义@并没有丢失,只是@没有处于活动状态(在序言中将其设置为 active 是非常糟糕的,@因为它几乎肯定会导致文件中的命令aux失败。

你的包裹可以使用

\AtBeginDocument{\catcode`\@\active}

因此@在文档中是活动的,但是这几乎肯定会破坏许多未预料到的软件包,如果您定义一个使之@活跃的命令并在特殊环境中本地使用它,那会更安全。

答案2

我不知道你如何定义\IND,所以我就把它定义为调用\mathcal。由于你似乎只在数学中使用@,所以还有另一种策略可用,即制作@ 数学活跃

在你的包裹里写

\newcommand{\IND}{\newcommand{\IND}[1]{\mathcal{#1}} % or whatever

\begingroup
\catcode`@=\active
\global\let @=\IND
\endgroup

\AtBeginDocument{\mathcode`@=\string"8000} % \string is to avoid problems with babel

这将@仅使数学处于活动状态,这意味着在数学之外它将表现正常,但在数学内部它将具有与相同的含义\IND

例子

\documentclass{article}

\newcommand{\IND}[1]{\mathcal{#1}} % or whatever

\begingroup
\catcode`@=\active
\global\let @=\IND
\endgroup

\AtBeginDocument{\mathcode`@=\string"8000} % \string is to avoid problems with babel

\begin{document}

$@X_a @X_a^g @X^g X_a X_a^g X^g $

$\IND X_b \IND X_b^a \IND X_b \IND X^a $

\end{document}

在此处输入图片描述


如果你仍然想使用@主动角色,那么最好定义

\def\whateverATwillstandfor{...}

然后定义@执行该操作的活动:

\begingroup\lccode`~=`@
\lowercase{\endgroup\AtBeginDocument{\let~\whateverATwillstandfor\catcode`@=\active}}

这个\lowercase技巧避免了在包中设置为活动的需要@。它只会在文档开始时设置,并且会收到预期的含义。

相关内容