第 9 项这个答案到具有典型 LaTeX 错误的文档说:
\verb
和朋友都很微妙,应该小心处理。它涉及类别代码的高级主题,也许在 TeX FAQ 条目中描述得最好为什么逐字在...内不起作用?以及适当的解决方案/替代方案。最值得注意的是问自己是否真的有必要使用逐字记录。
说实话,我大部分时候使用的\verb
只是一个快捷方式,用于进行所有必要的 catcode 更改并切换到\ttfamily
,这似乎可以用“更简单”的宏来完成。有什么\verb
特别之处?
答案1
有几种情况\verb
可以省去。
假设你正在为一个包编写手册,并且想要排版命令或环境名称;然后是几个定义,例如
\newcommand\cs[1]{\texttt{\string#1}}
\newcommand\env[1]{\texttt{\string\begin\string{#1\string}}}
就可以了。例如:
\documentclass{article}
\DeclareRobustCommand\cs[1]{\texttt{\string#1}}
\DeclareRobustCommand\env[1]{\texttt{\string\begin\string{#1\string}}}
\begin{document}
\section{\cs{\foo} and \env{baz}}
We describe the command \cs{\foo} and the environment \env{baz}.
\end{document}
如您所见,和都\cs
可以\env
在章节标题中使用,但您很快就会发现\cs
在标题中实际上不起作用,需要更复杂的定义:
\makeatletter
\newcommand\cs[1]{%
\ifx\protect\@typeset@protect
\texttt{\string#1}%
\else
\string\cs{\noexpand\string\string#1}%
\fi
}
\makeatother
这样.aux
文件就会有正确的注释
\@writefile{toc}{\contentsline {section}{\numberline {1}\cs{\foo} and \env {baz}}{1}}
通常可以通过避免在参数中使用反斜杠来简化这一过程:
\DeclareRobustCommand\cs[1]{\texttt{\symbol{`\\}#1}}
但输入将是
We describe the command \cs{foo} and the environment \env{baz}.
ltugboat.cls
这是采取的方法
\DeclareRobustCommand{\cs}[1]{{\tt \char`\\#1}}
\DeclareRobustCommand{\tubbraced}[1]{\mbox{\texttt{\char`\{#1\char`\}}}}
\DeclareRobustCommand{\env}[1]{\cs{begin}\tubbraced{#1}}
(是的,\tt
我希望他们有一天会改变这一点)。
软件包手册还需要其他功能来解释命令的语法。例如,必须执行以下操作
\cs{\foo}\oarg{optarg}\marg{arg}
在以适当的方式定义\oarg
和之后。用\marg
\verb|\foo[optarg]{arg}|
会失去对“元变量”的强调。进入和退出逐字模式比较笨拙
\verb|\foo[|optarg\verb|]{|arg\verb|}|
并且该\marg
方法允许我们按照自己的喜好来格式化元变量。
有\verb
没有地方verbatim
必要的? 任何可以用合适的宏完成\verb
或verbatim
获得的功能,但代价是标记。如果我想描述中的代码以ltugboat.cls
标记 的错误用法\tt
,我应该输入
\begin{verbatim}
\DeclareRobustCommand{\cs}[1]{{\tt \char`\\#1}}
\end{verbatim}
或者
\begin{flushleft}\ttfamily
\string\DeclareRobustCommand\string{%
\string\cs\string}[1]\string{\string{%
\string\tt\space\string\char`\string\\\string#1%
\string}\string}
\end{flushleft}
会产生同样的输出吗?
我毫不怀疑,而且我认为你的看法也是一样的。