本文档中:
\documentclass{article}
\usepackage{fancyvrb}
\DefineVerbatimEnvironment{AVerb}{Verbatim}{commandchars=\\\{\}}
\def\foo#1-#2;{}
\begin{document}
\begin{AVerb}
\foo x-z;
\end{AVerb}
\end{document}
使用\foo
inAVerb
会产生错误:
! Argument of \foo has an extra }.
<inserted text>
\par
l.11 \foo x-z;
-
环境中的catcodeAVerb
为 13(活动),但在普通文本中为 12(其他)。
我尝试使用选项将 catcode 设置为-
12 fancyvrb's
codes
,但没有帮助。我相信这是因为-
可以是连字符并fancyvrb
覆盖我的设置。
有没有什么办法可以让它工作?
答案1
是的,问题就是这样:你的分隔符有类别代码 12,而 TeX 无法在逐字文本中找到它,而它正是出于你提到的原因而处于活动状态。代码
\begingroup\lccode`~=`-
\lowercase{\endgroup\def\foo #1~#2;}{}
\foo
将用活动分隔符来定义第一个参数-
。
如果你\foo
在其他地方也需要,那么按照你的方式定义它,并说
\begingroup\lccode`~=`-
\lowercase{\endgroup\def\vfoo #1~#2;}{}
然后,借助强者的力量\usepackage{etoolbox}
,说
\preto{\AVerb}{\let\foo\vfoo}
(定义AVerb
环境之后)。
~
这个技巧是如何实现的?我们在一个组中,将等同于的小写字母设置为-
;该操作\lowercase
仅对字符起作用(而不是控制序列),不是更改类别代码。它不扩展或执行命令,而只是进行转换并放回标记列表以供输入处理器检查。只有在\endgroup
执行此转换后,等价性才会被遗忘,但~
已经转换为活动连字符。