为什么不能使用花括号作为 \verb 的分隔符?例如 \verb{foo}

为什么不能使用花括号作为 \verb 的分隔符?例如 \verb{foo}

当我尝试执行以下操作时:

\documentclass{article}
\begin{document}
 Hello \verb{foo}.                                                                                                     
\end{document}                                                                                                        

即使用括号作为分隔符,\verb出现以下错误:

! LaTeX Error: \verb ended by end of line.

为什么要使用|+或其他分隔符?我在网上找到的文档表明,除 之外的任何分隔符*都可以使用。但花括号似乎不起作用。

答案1

以下是相关代码latex.ltx

\def\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi
  \bgroup
    \verb@eol@error \let\do\@makeother \dospecials
    \verbatim@font\@noligs
    \@ifstar\@sverb\@verb}

\verb命令没有任何参数;它进行一些初步工作,然后将控制权交给\@verb\@sverb(如果它被称为,则交给后者\verb*

\def\@verb{\@vobeyspaces \frenchspacing \@sverb}

这里我们看到,\@verb只是使空间活跃(已经定义为扩展为\space),并设置\frenchspacing为保持所有空间相等;然后它调用\@sverb

\def\@sverb#1{%
  \catcode`#1\active
  \lccode`\~`#1%
  \gdef\verb@balance@group{\verb@egroup
     \@latex@error{\noexpand\verb illegal in command argument}\@ehc}%
  \aftergroup\verb@balance@group
  \lowercase{\let~\verb@egroup}}

现在读取第一个标记(分隔符)并激活它。然后它定义一个检查宏,以便在被调用为命令的参数\@sverb时摆脱麻烦。\verb

最后,它将活动定界符定义为\verb@egroup;找到并扩展它后,所有逐字模式的特殊设置都将被撤消。

\verb{xyz{是合法的(尝试一下),但\verb{xyz}实际上不是。代码可能进行更改以处理\verb{xyz};但是,的要点之一\verb是允许逐字文本中的括号不平衡,因此这样做并没有太多好处。

答案2

你必须使用匹配{“分隔符”。并且,在这种情况下,匹配 }.\verb抓住第一个(非*字符)并使其处于活动状态,以便将其与逐字内容的 处的相同字符进行匹配,从而定义逐字协议作用的范围。

选择使用*与否取决于 LaTeX 有时会提供带星号的命令变体。就 而言\verb,在执行时也是如此\@ifstar(从latex.ltx):

\def\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi
  \bgroup
    \verb@eol@error \let\do\@makeother \dospecials
    \verbatim@font\@noligs
    \@ifstar\@sverb\@verb}

listings包裹提供了一个类似的verbatim-style 宏,使用lstlistings(用于环境)和\lstinline(用于内联使用)。从listings文档(部分4.2 排版列表,第 25 页)它指出您必须提供<character>...<same character>模式:

\lstinline[<key=value list>]<character><source code><same character>

直到最近\lstinline[..]{...}才提供了一个“实验性”版本。但是,由于类似的原因,并且使得其背后的编码更加复杂,因此以传统方式使用它应该就足够了。

相关内容