7

我正在尝试在 LaTeX 中实现这个新环境:

\newenvironment{javacode}[2]
{\begin{lstlisting}[language=java, label=#1, caption=#2]}
{\end{lstlisting}}

然后像这样使用它:

\begin{javacode}{c}{some code}
int x = 5;
\end{javacode}

但我收到以下错误:

Overfull \hbox (6.0pt too wide) in paragraph at lines 6--6
[][][][][][][] 
[1] [2]) [3])
*

任何人都可以帮助解决这个问题吗?

[更新]

我尝试按照红鼻子独角兽的指示进行操作,并且工作正常。

但现在我尝试添加\begin{singlespace}这样的:

\lstnewenvironment{javacode}[2]
{
\begin{singlespace}
\lstset{language=java, label=#1, caption=#2}}
{
\end{singlespace}
}

我得到了同样的错误:

Overfull \hbox (6.0pt too wide) in paragraph at lines 6--6
[][][][][][][] 
[1]) [2] [3])
*
4

2 回答 2

17

这是一种特殊情况,因为列表环境需要提前解析以找到自身的结尾。原因是列表环境中的宏不能被扩展——当然包括环境的结束标记。

因此,基本上它会在每一行中查找该行是否包含- 但在您的情况下,由于宏尚未展开,因此不\end{lstlisting}存在这样的行。\end{javacode}因此,listings 会继续搜索直到文件末尾。

Listings 定义了一个自己的命令来解决这个问题。从文档中:

\lstnewenvironment 
  {⟨name⟩}[⟨number⟩][⟨opt. default arg.⟩]
  {⟨starting code⟩}
  {⟨ending code⟩}

例如:

\lstnewenvironment{javacode}[2]
  {\lstset{language=java, label=#1, caption=#2}}
  {}

编辑针对您编辑的问题:我尝试编译以下最小的“工作”示例。实际上,它并没有那么多工作——latex处理器只是停在中间并等待用户输入。

由于清单文档没有提到对 的特殊处理singlespace,我认为您可能已经发现了一个错误。最好的做法可能是从列表包的维护者那里获得反馈。

% mini.dvi
\documentclass{article}

\usepackage{listings}
\usepackage{setspace}
\doublespacing

\lstnewenvironment{javacode}
 {\begin{singlespace}
  \lstset{language=java}}
 {\end{singlespace}}

\begin{document}
\begin{javacode}
int a = 1;
int b = 2;
\end{javacode}
\end{document}
于 2010-04-09T11:03:48.407 回答
3

经过进一步研究,我发现了这个http://www.tug.org/pipermail/texhax/2009-June/012699.html

要解决我的解决方案,我需要使用\singlespacing而不是singlespace环境。

以下是我的工作代码:

\lstnewenvironment{javacode}[2]
{\singlespacing\lstset{language=java, label=#1, caption=#2}}
{}
于 2010-04-10T08:17:44.713 回答