Newcommand зависает от компиляции LaTeX

У меня проблема с определением новой команды в LaTeX для lstlisting, В результате компиляция висит без сообщения об ошибке, просто *,

Это приводит к зависанию компиляции LaTeX:

\documentclass[10pt,a4paper,ssfamily]{exam}
\usepackage{listings}
\newcommand{\cs}{\begin{lstlisting}}
\newcommand{\ce}{\end{lstlisting}}
\begin{document}
\cs
program test
  ! This is a commentary
end program test
\ce
\end{document}

Но этот не делает:

\documentclass[10pt,a4paper,ssfamily]{exam}
\usepackage{listings}
\begin{document}
\begin{lstlisting}
program test
  ! This is a commentary
end program test
\end{lstlisting}
\end{document}

Разница лишь в том, что начало и конец endmargin и lstlisting определяются в новой команде в первую очередь. Проблема возникает для lstlisting, но не для \begin{center}, например.

1 ответ

Ну, я нашел похожую проблему, о которой сообщалось здесь:

https://tex.stackexchange.com/questions/25597/wrapping-code-listings-verbatim-or-other-method-inside-a-newcommand

Кажется, что невозможно сделать то, что я хочу, потому что компиляция \begin{lstlisting} должна искать соответствующий \end{lstlisting}, а новые команды это нарушают.

Однако тот же результат может быть получен при определении новой среды lst, например, с использованием:

\lstnewenvironment{code}{\lstset{language=[90]Fortran,
  xleftmargin=1.5cm
}}{}

например. Затем можно определить многие свойства раздела кода, и синтаксис будет проще (\begin{code},\end{code}).

Полная среда, в моем случае, такова:

\lstnewenvironment{code}{\lstset{language=[90]Fortran,
  basicstyle=\ttfamily,
  keywordstyle=\color{blue},
  commentstyle=\color{gray},
  xleftmargin=1.5cm,
  morecomment=[l]{!\ }% Comment only with space after !
}}{}

Другие вопросы по тегам