当我尝试执行以下操作时:
\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[..]{...}
才提供了一个“实验性”版本。但是,由于类似的原因,并且使得其背后的编码更加复杂,因此以传统方式使用它应该就足够了。