使用 \usepackage{fancyvrb, fancybox} 时出错

使用 \usepackage{fancyvrb, fancybox} 时出错

使用 TeX Live 2009,使用此 MWE。

\documentclass{article}
\usepackage{fancyvrb, fancybox}  
\begin{document}
    \begin{Verbatim}[frame=single]
      auto eth0
    \end{Verbatim}
\end{document}

编译时出现以下错误

Runaway argument?
      auto eth0^^M    \end{Verbatim}^^M^^M\end{document} ! File ended while scanning use of \Verbatim. <inserted text> 

使用

\usepackage{fancybox, fancyvrb}

使错误消失,但这很令人不安。我假设这fancyvrb取决于fancybox,但软件包不能很好地处理这个问题。我花了一段时间才找到原因。作为参考,我查看了 Peter Flynn 在http://groups.google.com/group/latexusersgroup/browse_thread/thread/c8c2e5dd1e9ff5cf

相关消息以

我不明白这个问题。我写的内容适用于任何课程。只需将其复制并粘贴到报告中即可。

并且他的示例按该顺序加载了这些包,确切地说\usepackage{fancyvrb,fancybox,calc}。所以我的问题是,这里究竟出了什么问题,以及我将来如何有效地调试此类问题?

更新:Enrico 的解决方案和 Werner 的解决方案之间的选择基本上是一场博弈。我确实喜欢 Enrico 对环境问题的识别fancybox Verbatim。但是,我仍然不清楚当这些问题突然出现时如何有效地识别它们。如果有人有调试技巧,我很想听听。

答案1

你应该注意到,Peter Flynn 的消息中使用的语法是

\begin{Verbatim}{frame=single}

并不是

\begin{Verbatim}[frame=single]

这造成了相当大的差异。此外,Verbatim重新定义的环境fancybox似乎不喜欢前面有空格\end{Verbatim}:以下输入

\documentclass{article}
\usepackage{fancybox}
\begin{document}
\begin{Verbatim}{frame=single}
   auto eth0
 \end{Verbatim}
\end{document}

提出了

Runaway argument?
{frame=single}^^M   auto eth0^^M \end{Verbatim}^^M\end{document}^^M
! File ended while scanning use of \FV@BeginScanning.

错误。

当然,这两个包都试图重新定义,\VerbatimEnvironment这对用户来说没什么帮助。但是,如果你fancyvrb以第二个包的形式加载,你就可以得到它的所有功能,而不会丢失fancybox关于框和框架的功能。逐字环境的实现似乎fancybox有缺陷(从第 1 列开始的要求\end{Verbatim}肯定是一个错误),所以我认为最好这样说

\usepackage{fancybox,fancyvrb}

答案2

这里的问题是,两个包定义的内部命令非常相似,但又相互冲突。例如,fancyvrb定义

\def\VerbatimEnvironment{%
  \ifx\FV@EnvironName\relax\xdef\FV@EnvironName{\@currenvir}\fi}

尽管fancybox定义

\def\VerbatimEnvironment{%
  \ifx\@VerbEnvir\relax\xdef\@VerbEnvir{\@currenvir}\fi}

并不是说这就是问题的根源,而是想说明一些定义之间的相似之处。因此,切换包的加载顺序可能会使一个包工作,但另一个包不工作。

为什么加载顺序

\usepackage{fancybox,fancyvrb}

工作?嗯,因为fancyvrb仅使用通过使加载/使用变得不必要而提供的功能。为什么 Peter 建议的解决方案有效?嗯,因为他一开始fancybox就不需要加载,因为他只使用了功能。fancyvrbfancybox

为什么直到编译时才提醒您有冲突的命令?这是因为许多宏定义和环境是使用 TeX\def而不是 LaTeX构建的\newcommand。后者会自动检查命令是否已存在,如果存在则发出错误,而前者会愉快地覆盖先前的定义。

也许这可以被视为两个包之间的部分不兼容 - 但无论如何都是不兼容。

答案3

下列作品。

\documentclass{article}
\begin{document}
    \begin{verbatim}[frame=single]
      auto eth0
    \end{verbatim}
\end{document}

相关内容