`\verb' 内的换行符

`\verb' 内的换行符

我已将文本编辑器设置为在 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{...}。我应该指出我认为它适用的地方:用于简短的内联逐字突发,例如,长逐字变量名超出右边距。这种方法允许在任何标记处自动换行,或者在指定的自由断点处有针对性地换行。

从以下几个方面来看,它并不是真正逐字逐句的:

  1. {}括号必须匹配,并且所有 cat-1/cat-2 标记对将在输出中表示为括号。

  2. 空格不被视为逐字处理,而是拉伸和换行。

以下是一些特点:

  1. 默认情况下,换行发生在任何字符处。

  2. 如果希望在更合乎逻辑的位置换行,可以指定非空可选字符(或宏)来指示非连字符的自由换行点

  3. 虽然空格显示为空格,但可以使用可选的第二个参数来重新指定空格的渲染,例如使用\textvisiblespace

  4. Cat-14%注释字符以逐字方式处理。

  5. 最重要的是,在去标记化宏名称之后出现的那个愚蠢的空格会消失\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}

在此处输入图片描述

相关内容