![代码](https://linux22.com/image/374295/%E4%BB%A3%E7%A0%81.png)
我想_
在两个地方将下划线的类别代码从 8 临时更改为 11。为什么我的代码不起作用?@
使用 时似乎有效\makeatletter
。
- 一次是定义列表(在我的例子中是一个 def)。
- 在文档中当我需要调用宏时(最多n次)。
代码
\documentclass{article}
\usepackage{fontspec}% xelatex
\def\setfields{\catcode`\_=11} % set underscore to letter
\def\endsetfields{\catcode`\_=8} % restore underscore to subscript
\begingroup
\catcode`\_=11
\def\AAA_BBB_CCC{Highly specialized TeX operations in progress.}
\endgroup
\begin{document}
\begin{setfields}
\AAA_BBB_CCC
\end{setfields}
\end{document}
答案1
尝试
\begingroup
\catcode`\_=11
\def\AAA_BBB_CCC{Highly specialized TeX operations in progress.}
\endgroup
\begin{setfields}
\show\AAA_BBB_CCC
\end{setfields}
你会发现这\AAA_BBB_CCC
是未定义的。为什么会这样?因为\def
尊重分组。
做
\catcode`\_=11
\gdef\AAA_BBB_CCC{Highly specialized TeX operations in progress.}
\endgroup
相反,它\AAA_BBB_CCC
是全局定义的。
可能更好:
\documentclass{article}
\newenvironment{setfields}
{\catcode`\_=11 \ignorespaces}
{\ignorespacesafterend}
% define the _ commands
\chardef\underscorecatcode=\catcode`\_ \catcode`\_=11
\newcommand\AAA_BBB_CCC{Highly specialized TeX operations in progress.}
\catcode`\_=\underscorecatcode
% end of definitions for _ commands
\begin{document}
\begin{setfields}
\AAA_BBB_CCC
\end{setfields}
\end{document}