我已将文本编辑器设置为在 76 列处换行。
当包含逐字文本时,我的文本编辑器会自动换行,最后得到如下内容:
\item Just another boring explanation about some code and, e.g. \verb|foo
= function (bar, baz);| More stuff
即逐字代码之间的换行符。
pdflatex
不喜欢这个:
LaTeX 错误:\verb 已在行末结束。
我应该如何解决这个问题?或者唯一的解决方法是尽早换行?
答案1
我有点惊讶地发现,fancyvrb
包。使用该包时,问题似乎是因为换行符被定义为外宏,然后无法将其吞入 verbatim 命令中。因此,这里有一个小修改,它定义了一个\VerbLB
将换行符转换为空格的命令。
\documentclass{article}
\usepackage{fancyvrb}
\makeatletter
\def\VerbLB{\FV@Command{}{VerbLB}}
\begingroup
\catcode`\^^M=\active%
\gdef\FVC@VerbLB#1{%
\begingroup%
\FV@UseKeyValues%
\FV@FormattingPrep%
\FV@CatCodes%
\def^^M{ }%
\catcode`#1=12%
\def\@tempa{\def\FancyVerbGetVerb####1####2}%
\expandafter\@tempa\string#1{\mbox{##2}\endgroup}%
\FancyVerbGetVerb\FV@EOL}%
\endgroup
\makeatother
\begin{document}
Some \VerbLB+text
with+ a line break.
\end{document}
这会产生“一些text with
换行符”。(鉴于换行符是由您的编辑器插入的,我猜您不希望它在输出中出现)。我不知道这是否会破坏其他任何东西!(好吧,因为它是一个新的宏,所以不会休息任何事情,但我不知道为什么新线角色被定义成这样,\outer
并且可能有一个很好的理由。)
顺便说一句,我当时很想评论“使用更好的编辑器”。有些编辑器使用柔软的和难的换行符和软换行符仅用于显示目的,因此在写入文件时会被删除。
答案2
\path
来自url
或包的动词类构造hyperref
可以与换行符一起使用:
\documentclass{article}
\usepackage[obeyspaces]{url}
\begin{document}
\path{foo
= function (bar, baz);}
\end{document}
注释obeyspaces
选项
答案3
在这里,我使用一个标记循环来模拟一个\verb
带有换行符的内联命令,称为\bverb{...}
。我应该指出我认为它适用的地方:用于简短的内联逐字突发,例如,长逐字变量名超出右边距。这种方法允许在任何标记处自动换行,或者在指定的自由断点处有针对性地换行。
从以下几个方面来看,它并不是真正逐字逐句的:
{}
括号必须匹配,并且所有 cat-1/cat-2 标记对将在输出中表示为括号。空格不被视为逐字处理,而是拉伸和换行。
以下是一些特点:
默认情况下,换行发生在任何字符处。
如果希望在更合乎逻辑的位置换行,可以指定非空可选字符(或宏)来指示非连字符的自由换行点
虽然空格显示为空格,但可以使用可选的第二个参数来重新指定空格的渲染,例如使用
\textvisiblespace
。Cat-14
%
注释字符以逐字方式处理。最重要的是,在去标记化宏名称之后出现的那个愚蠢的空格会消失
\bverb
,除非在必要的情况下。
这里有一个 MWE,试图证明所有这些观点。
\documentclass{article}
\usepackage{tokcycle}
\newcommand\bverb[1][]{\begingroup\ifx\relax#1\relax
\def\tmpA{\allowbreak}\let\tmpB=\empty
\setlength\spaceskip{1.5ex plus 1ex minus .5ex}% SETTING \xspaceskip CAN BE DONE
\else\def\tmpA{}\let\tmpB=#1
\setlength\spaceskip{1.5ex plus 1ex minus .5ex}\fi% SETTING \xspaceskip CAN BE DONE
\catcode`\%=12 \bverbaux}
\newcommand\bverbaux[2][ ]{%
\ttfamily\tokencycle
{\tctestifx{\tmpB##1}{\addcytoks{\allowbreak}}{%
\addcytoks[1]{\tmpA}\addcytoks[1]{\string##1}%
\addcytoks{\nobreak\hspace{0pt plus 5pt minus .5pt}}}}
{\addcytoks[1]{\string{}\processtoks{##1}\addcytoks[1]{\string}}}
{\tctestifx{\tmpB##1}{\addcytoks{\allowbreak}}
{\tctestifnum{\cstest{##1}=11}
{\tcpeek\zzz\tctestifcatnx\zzz A{\tcpush{\space}}{}}{}%
\tcpush{\string##1}}}
{\addcytoks{\allowbreak#1}}#2\endtokencycle\endgroup}
\def\cstest#1{\expandafter\cstestaux\string#1.\relax}
\def\cstestaux#1#2#3\relax{\the\catcode`#2 }
\textwidth=2.5in
\begin{document}
\bverb{%$#\-^_+\x vb\ x\?a\x 0 In the normal \bverb situation,
spaces are visible, and line-breaks may occur at any location.}
\bverb[\-]{A specific (non-printing) discre\-tionary break character may
be in\-serted by using the optional ar\-gument. In this case, only the
discretionary break (and spaces) al\-low breaks, allowing one to set
non-hyphenated breaks at the syl\-lable boundaries.}
\bverb[!]{A non-empty optional argument must be defined for the dis!cret!ionary
break to be defined.
The token required for \bverb line breaks can be defined as either a macro,
such as \- or alter!nately a character, as here, an ex!clama!tion point.}
\bverb[!]{Balanced {bracing} is a require!ment and spaces are not treated
in a \verbatim fashion.}
\bverb[\-][\textvisiblespace]{The second optional argument of \bverb is an alternate
treatment for the space character. Here, \textvisiblespace is selected.}
\bverb[!]{Notice how the nasty space that follows macro names when using
\de!tokenize disappears, whenever ap!pro!priate: \x0, \x a, \%x vs \% x}
\end{document}