使用 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
就不需要加载,因为他只使用了功能。fancyvrb
fancybox
为什么直到编译时才提醒您有冲突的命令?这是因为许多宏定义和环境是使用 TeX\def
而不是 LaTeX构建的\newcommand
。后者会自动检查命令是否已存在,如果存在则发出错误,而前者会愉快地覆盖先前的定义。
也许这可以被视为两个包之间的部分不兼容 - 但无论如何都是不兼容。
答案3
下列作品。
\documentclass{article}
\begin{document}
\begin{verbatim}[frame=single]
auto eth0
\end{verbatim}
\end{document}