我正在尝试核心特质为了学习一些基础知识。
我的目标是定义一个使用活动字符的简写环境。一般的想法是在进入环境时激活使用的字符并定义宏,而在离开环境时恢复字符代码。
理论上听起来很简单,但我遇到了一个
"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
您的代码中有几个错误。
当宏的替换文本被吸收时,类别代码将一劳永逸地固定下来,因此
\shorthand@catcode@plus
在 的定义中
\beginshorthand
是几个标记而不是一个:\shorthand • @ • c • a • t • c • o • d • e • @ • p • l • u • s
所以当
\beginshorthand
扩展时,TeX 定义\shorthand
为后面跟着@catcode@plus
参数文本你应该使用
\edef\shorthand@catcode@plus{\the\catcode`+ }
以便访问类别代码的当前值;请注意 后面的空格
+
,这几乎是强制性的,否则当\shorthand@catcode@plus
扩展时,TeX 不会尝试过早扩展下一个标记。无论如何,
+
所有替换文本中都有类别代码 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
技巧,但其缺陷在于它会使所有的修补命令失效etoolbox
,xpatch
或者预先在组中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}