如何定义宏来切换字符活动并为其定义宏?

如何定义宏来切换字符活动并为其定义宏?

我正在尝试核心特质为了学习一些基础知识。

我的目标是定义一个使用活动字符的简写环境。一般的想法是在进入环境时激活使用的字符并定义宏,而在离开环境时恢复字符代码。

理论上听起来很简单,但我遇到了一个

"Missing control sequence inserted" ("\inaccessible") 

以下在我看来是相对直接的例子(简写 {\bfseries ...}

\documentclass{minimal}

\def\beginshorthand{%

    \makeatletter

    \def\shorthand@catcode@plus{\the\catcode`+}

    \catcode`\+=\active
    \def+##1+{{\bfseries ##1}}

    \makeatother

}
\def\endshorthand{%

    \makeatletter

    \catcode`\+=\shorthand@catcode@plus

    \makeatother

}

\begin{document}

\beginshorthand
+ bold span +
\endshorthand

+ plain span +

\end{document}

(在 TeXShop 3.11、Mac OS X 10.9.3 中)

有可能吗?如果可以,我该如何实现?

答案1

您的代码中有几个错误。

  1. 当宏的替换文本被吸收时,类别代码将一劳永逸地固定下来,因此

    \shorthand@catcode@plus
    

    在 的定义中\beginshorthand是几个标记而不是一个:

    \shorthand • @ • c • a • t • c • o • d • e • @ • p • l • u • s
    

    所以当\beginshorthand扩展时,TeX 定义\shorthand为后面跟着@catcode@plus参数文本

  2. 你应该使用

    \edef\shorthand@catcode@plus{\the\catcode`+ }
    

    以便访问类别代码的当前值;请注意 后面的空格+,这几乎是强制性的,否则当\shorthand@catcode@plus扩展时,TeX 不会尝试过早扩展下一个标记。

  3. 无论如何,+所有替换文本中都有类别代码 12,因此\def+是非法的。

\makeatletter通过将和放置\makeatother在需要它们的定义之外,可以轻松解决第一个问题。

固定类别代码问题通常通过\lowercase技巧来解决(参见https://tex.stackexchange.com/a/19750/4427

\documentclass{article}

\makeatletter
\def\beginshorthand{%
  \edef\shorthand@catcode@plus{\the\catcode`+ }%
  \begingroup\lccode`~=`+
  \lowercase{\endgroup\def~##1~{\textbf{##1}}}%
  \catcode`+=\active
}
\def\endshorthand{%
  \catcode`\+=\shorthand@catcode@plus
}
\makeatother


\begin{document}

\beginshorthand
+ bold span +
\endshorthand

+ plain span +

\end{document}

不过,我更喜欢使用分组来限制类别代码的更改:

\documentclass{article}

\makeatletter
\def\beginshorthand{%
  \begingroup
  \begingroup\lccode`~=`+
  \lowercase{\endgroup\def~##1~{\textbf{##1}}}%
  \catcode`+=\active
}
\def\endshorthand{%
  \endgroup
}
\makeatother


\begin{document}

\beginshorthand
+ bold span +
\endshorthand

+ plain span +

\end{document}

通过分组,您不需要手动恢复旧的类别代码,因为 TeX 会自行完成此操作。

一种不同的方法,没有\lowercase技巧,但其缺陷在于它会使所有的修补命令失效etoolboxxpatch或者预先在组中regexpatch激活并进行全局定义:+

\documentclass{article}

\makeatletter
\begingroup
\catcode`+=\active
\gdef\beginshorthand{%
  \begingroup
  \def+##1+{\textbf{##1}}%
  \catcode`+=\active
}
\endgroup
\def\endshorthand{%
  \endgroup
}
\makeatother

\begin{document}

\beginshorthand
+ bold span +
\endshorthand

+ plain span +

\end{document}

相关内容