Проблема с созданием newenvironment в LaTeX

Я пытаюсь реализовать эту новую среду в 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])
*

2 ответов


это особый случай, потому что среда списков должна анализировать себя, чтобы найти конец себя. Причина в том, что макрос внутри среда списков не должна расширяться – это, конечно, включает в себя конечный тег среды.

поэтому в основном он выглядит в каждой строке, если строка содержит \end{lstlisting} – но в вашем случае такой строки не существует с \end{javacode} макрос еще не был расширен. Поэтому поиск продолжается до конца папка.

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}

после дальнейших исследований я нашел это http://www.tug.org/pipermail/texhax/2009-June/012699.html

чтобы обойти мое решение, мне нужно использовать \singlespacing вместо singlespace окружающая среда.

Теперь мой рабочий код:

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