在LaTeX中创建新环境的问题

时间:2010-04-09 10:56:05

标签: latex newenvironment

我正在尝试在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])
*

任何人都可以帮助修复这个问题吗?

[更新]

我尝试按照Red-nosed unicorn指示进行操作,并且工作正常。

但现在我尝试添加\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])
*

2 个答案:

答案 0 :(得分:17)

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

因此,如果该行包含\end{lstlisting},基本上它会查找每一行 - 但在您的情况下,由于\end{javacode}宏尚未展开,因此不存在此行。所以列表继续搜索,直到文件结束。

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

\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}

答案 1 :(得分:3)

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

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

以下是我的工作代码:

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