Проблема с созданием новой среды в LaTeX - PullRequest
7 голосов
/ 09 апреля 2010

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

Может кто-нибудь помочь с решением этой проблемы?

[Update]

Я попробовал сделать это, как Единорог с красным носом , и он работал правильно.

Но теперь я попытался добавить \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 ]

17 голосов
/ 09 апреля 2010

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

Таким образом, в основном, каждая строка ищет, содержит ли строка \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}
3 голосов
/ 10 апреля 2010

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

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

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

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