代码

代码

我想_在两个地方将下划线的类别代码从 8 临时更改为 11。为什么我的代码不起作用?@使用 时似乎有效\makeatletter

  1. 一次是定义列表(在我的例子中是一个 def)。
  2. 在文档中当我需要调用宏时(最多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}

相关内容