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