我已输入以下内容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
技巧避免了在包中设置为活动的需要@
。它只会在文档开始时设置,并且会收到预期的含义。