是否可以使用 fancyvrb 中的宏的某些分隔符?

是否可以使用 fancyvrb 中的宏的某些分隔符?

本文档中:

\documentclass{article}
\usepackage{fancyvrb}
\DefineVerbatimEnvironment{AVerb}{Verbatim}{commandchars=\\\{\}}
\def\foo#1-#2;{}
\begin{document}
\begin{AVerb}
  \foo x-z;
\end{AVerb}
\end{document}

使用\fooinAVerb会产生错误:

! 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执行此转换后,等价性才会被遗忘,但~已经转换为活动连字符。

相关内容