使用 fancyvrb 在逐字记录期间加载字体定义文件

使用 fancyvrb 在逐字记录期间加载字体定义文件

我正在尝试为正则表达式定义一个逐字命令。我说逐字命令是因为我希望正则表达式运算符能够被特别排版。这个想法是,您可以键入一个正则表达式,(a|b)+但它的格式会很整齐,例如带有+上标。为了简单起见,我从 fancyvrb 开始,重新定义了运算符的 catcode。

\documentclass{article}
\usepackage{fancyvrb}
\usepackage{bera}
%\usepackage{cmbright}

\def\lparen{\textrm{(}}
\def\rparen{\textrm{)}}
\def\plus{\ensuremath{^+}}
\def\pipe{\textrm{\thinspace\textbar\thinspace}}

\CustomVerbatimCommand{\regex}{Verb}{showspaces,codes={%
\catcode`+=\active\lccode`~=`+\lowercase{\let~\plus}%
\catcode`(=\active\lccode`~=`(\lowercase{\let~\lparen}%
\catcode`)=\active\lccode`~=`)\lowercase{\let~\rparen}%
\catcode`|=\active\lccode`~=`|\lowercase{\let~\pipe}}}

\begin{document}
Whitespace is defined by \regex!( |\t|\n|\f|\v|\r)+!.
\end{document}

我遇到的问题是,它在某些字体包(bera、txfonts、pxfonts、lmodern)上工作正常,但在其他字体包(cmbright)上则不行。错误是

(/opt/local/share/texmf-texlive/tex/latex/cmbright/omlcmbrm.fd
! Argument of @providesfile has an extra }.
<inserted text> 
                par 
l.24            [2005/04/13 v8.1 (WaS)]

看起来好像在逐字记录期间尝试加载 .fd 文件,由于我重新定义了 ( 和 ) 的含义,因此它不起作用。我知道激活 ( 和 ) 等常见符号很危险,但只要仅限于逐字记录,我认为就没问题。在 cmbright 的情况下,只需在正则表达式之前使用数学模式,即可先加载 .fd 文件,一切正常。

有什么办法可以解决这个问题吗?或者这根本行不通?当我想专门排版运算符时,我可以使用 fancyvrb 的 commandchars 功能转为 LaTeX,但我希望采用这种方法。

答案1

在文档开始时强制读取数学字体:

\documentclass{article}
\usepackage{fancyvrb}
\usepackage{bera}
\usepackage{cmbright}

\newcommand\lparen{\textrm{(}}
\newcommand\rparen{\textrm{)}}
\newcommand\plus{\ensuremath{^+}}
\newcommand\pipe{\textrm{\thinspace\textbar\thinspace}}

\CustomVerbatimCommand{\regex}{Verb}{showspaces,codes={%
  \catcode`+=\active\lccode`~=`+\lowercase{\let~\plus}%
  \catcode`(=\active\lccode`~=`(\lowercase{\let~\lparen}%
  \catcode`)=\active\lccode`~=`)\lowercase{\let~\rparen}%
  \catcode`|=\active\lccode`~=`|\lowercase{\let~\pipe}}%
}

\makeatletter
\AtBeginDocument{\check@mathfonts}
\makeatother

\begin{document}
Whitespace is defined by \regex!( |\t|\n|\f|\v|\r)+!.
\end{document}

在此处输入图片描述

相关内容