创建宏:FancyVerb 错误

创建宏:FancyVerb 错误

我想创建一个一致的设置,Verbatim因此我决定创建一个宏:

\newcommand*{\VerbatimCustom}{
\begin{Verbatim}[numbers=left,xleftmargin=5mm]
}

像这样使用它:

\begin{figure}[htbp]
    \centering
\VerbatimCustom
module GRAMMAR[] begin
  phylum Grammar;

  phylum Item;
  phylum Items := SEQUENCE[Item];

  phylum Production;
  phylum Productions := SEQUENCE[Production];

  constructor terminal(s: Symbol) : Item;
  constructor nonterminal(s: Symbol) : Item;
  constructor prod(nt: Symbol; children: Items) : Production;
  constructor grammar(prods: Productions) : Grammar;

  pragma root_phylum(type Grammar);
end;    
\end{Verbatim}
    \caption{Structure of a context-free grammar in APS}
    \label{fig:cfg-structure}
\end{figure}

错误:

\begin{Verbatim}[<key=value>] 和行尾之间有多余的输入 ` '。\FV@Error ... {FancyVerb 错误:\space \space #1 } l.38 \VerbatimCustom 此输入将被丢弃。点击继续。

我感谢任何帮助或提示。

答案1

此答案旨在解释错误消息的产生。
它不旨在提供遵循良好实践方法的修复/解决方法。
通过以下方式根据良好实践方法解决问题\RecustomVerbatimEnvironment如下egreg 的回答
遵守良好实践方法的理由如下大卫·卡莱尔的评论


TeX 的眼睛会逐行预处理 .tex 输入:

  • 该行的所有字符都将转换为 TeX 的内部字符表示方案,即 ASCII 或 Unicode。
  • 该行最右端的所有空格字符均被删除。
  • 在行尾附加一个字符,其在 TeX 内部字符表示方案中的代码点编号等于整数参数的值\endlinechar
  • 然后,该行的字符会“按需”被标记化,即,每当 TeX 的喉咙需要标记时,一些字符就会被标记化。

根据定义

\newcommand*{\VerbatimCustom}{  %<- spurious space token
\begin{Verbatim}[numbers=left,xleftmargin=5mm]   %<- spurious space token
}

由于 -mechanism 而产生了虚假的空格标记\endlinechar,并且\endlinechar在标记化定义时,其值为 13,表示回车符,而回车符的 catcode 为 5(返回),这又意味着

  • 如果 TeX 的读取装置处于“跳过空白”状态,则没有任何标记,
  • 如果 TeX 的读取装置处于“行中”状态,则显示一个明确的空格标记,
  • \par如果 TeX 的读取装置处于“新行”状态,则为控制字标记。

据我所知,fancyvrb 将其环境的 catcode\endlinechar从 5(返回)更改为 12(其他),以便在任何情况下,在行尾都会出现 catcode 12(其他)的回车符标记。

因此,如果您直接执行此操作\begin{Verbatim}[numbers=left,xleftmargin=5mm],则在环境的最后一个参数的最后一个标记后面将不会有一个空格标记,但会有一个 catcode 12(其他)的回车符标记,表示行的结尾。

但是由于该序列来自包含空格标记的宏定义,因此在环境的最后一个参数的最后一个标记和表示行尾的 catcode 12(其他)的回车符标记之间有一个空格标记。

Verbatim如果在环境的最后一个参数的最后一个标记和 catcode 12(其他)的回车符标记(表示包含最后一个标记的行的结尾)之间发现某些内容,则会实现 -environment 来引发错误消息。

通过在行尾添加注释字符来防止这些空格标记的出现,结果如下:

\documentclass{article}
\usepackage{fancyvrb}
\newcommand*{\VerbatimCustom}{%%%%%%
 \begin{Verbatim}[numbers=left,xleftmargin=5mm]%%%%%%
}
\begin{document}

\begin{figure}[htbp]
    \centering
\VerbatimCustom
module GRAMMAR[] begin
  phylum Grammar;

  phylum Item;
  phylum Items := SEQUENCE[Item];

  phylum Production;
  phylum Productions := SEQUENCE[Production];

  constructor terminal(s: Symbol) : Item;
  constructor nonterminal(s: Symbol) : Item;
  constructor prod(nt: Symbol; children: Items) : Production;
  constructor grammar(prods: Productions) : Grammar;

  pragma root_phylum(type Grammar);
end;    
\end{Verbatim}
    \caption{Structure of a context-free grammar in APS}
    \label{fig:cfg-structure}
\end{figure}

\end{document}

在此处输入图片描述

编译示例时,我没有收到任何错误消息。


此答案旨在解释错误消息的产生。
它不旨在提供遵循良好实践方法的修复/解决方法。
通过以下方式根据良好实践方法解决问题\RecustomVerbatimEnvironment如下egreg 的回答
遵守良好实践方法的理由如下大卫·卡莱尔的评论

答案2

如果你希望所有Verbatim环境都遵循规范

numbers=left,xleftmargin=5mm

那么最好的办法就是发出

\RecustomVerbatimEnvironment{Verbatim}{Verbatim}{numbers=left,xleftmargin=5mm}

完整示例。查看其中的更多注释。

\documentclass{article}
\usepackage{fancyvrb}

\RecustomVerbatimEnvironment{Verbatim}{Verbatim}{numbers=left,xleftmargin=5mm}

\begin{document}

Some text before the verbatim environment.
Some text before the verbatim environment.
Some text before the verbatim environment.
Some text before the verbatim environment.

\begin{Verbatim}
This is {verbatim}
\another\line
\end{Verbatim}

You can also locally override a verbatim environment

\begin{Verbatim}[commandchars=\\\{\}]
This is almost verbatim in \LaTeX
\end{Verbatim}

\end{document}

在此处输入图片描述

相关内容