Это особый случай, потому что среда списков должна проанализировать себя, чтобы найти конец. Причина в том, что макросы внутри среды списков не должны расширяться - это, конечно, включает конечный тег среды.
Таким образом, в основном, каждая строка ищет, содержит ли строка \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}