我最近注意到一些fancyvrb
数学转义失败的情况。这可以正常工作:
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8}]
$f^\prime$
\end{Verbatim}
\end{document}
但用这个代替
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8}]
$f'$
\end{Verbatim}
失败并显示以下消息
! TeX capacity exceeded, sorry [main memory size=5000000].
'->\leavevmode \kern \z@
\char `\'
尝试使用icomma
with也会产生相同类型的错误fancyvrb
。
解决这个问题并不难,但如果不必检查转义数学是否存在此类冲突就好了。我认为这与和数学代码的交互有关fancyvrb
,但我还没有发现这与 catcode 情况有何不同。
编辑
egreg 的回答解释了一切。对于将来从事这方面工作的任何人,这里有一些补充说明。
最后,由于fancyvrb
经常与一起使用upquote
,这里有一个 egreg 代码版本,它修补了Verbatim
环境以在数学模式下给出素数,upquote
否则给出单引号。鉴于方式upquote
有效,'
和都`
需要重新定义。这需要etoolbox
。
\makeatletter
\AtEndPreamble{%
\@ifpackageloaded{upquote}%
{\AtBeginEnvironment{Verbatim}{%
\apptocmd{\@noligs}%
{\begingroup\lccode`\~=`\'
\lowercase{\endgroup\def~}{%
\ifmmode
\expandafter\active@math@prime
\else
\leavevmode\kern\z@\textquotesingle
\fi}%
\ifx\encodingdefault\upquote@OTone
\ifx\ttdefault\upquote@cmtt
\begingroup\lccode`\~=`\'
\lowercase{\endgroup\def~}{%
\ifmmode
\expandafter\active@math@prime
\else
\leavevmode\kern\z@\char13
\fi}%
\fi\fi
\begingroup\lccode`\~=`\`
\lowercase{\endgroup\def~}{%
\ifmmode
\expandafter`
\else
\leavevmode\kern\z@\textasciigrave
\fi}%
\ifx\encodingdefault\upquote@OTone
\ifx\ttdefault\upquote@cmtt
\begingroup\lccode`\~=`\`
\lowercase{\endgroup\def~}{%
\ifmmode
\expandafter`
\else
\leavevmode\kern\z@\char18
\fi}%
\fi\fi
}{}{}}}%
{\AtBeginEnvironment{Verbatim}{%
\apptocmd{\@noligs}%
{\begingroup\lccode`\~=`\'
\lowercase{\endgroup\def~}{%
\ifmmode
\expandafter\active@math@prime
\else
\leavevmode\kern\z@\char`\'
\fi}}{}{}}}%
}
\makeatother
答案1
在逐字模式中,主动词'
被重新定义为:
\leavevmode\kern\z@\char`'
$f'$
即使经过转义,这也是在逐字模式下发现时所拾取的定义。
您必须将活动的定义'
设为数学模式中的通常定义。
\documentclass{article}
\usepackage{fancyvrb,etoolbox}
\makeatletter
\apptocmd\do@noligs
{\begingroup\lccode`\~=`\'
\lowercase{\endgroup\def~}{%
\ifmmode
\expandafter\active@math@prime
\else
\leavevmode\kern\z@\char`\'
\fi}}
{}{}
\makeatother
\begin{document}
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8 }]
$f^\prime$ and $f'$
\end{Verbatim}
\end{document}