Проблема создания новой среды, которая запускает / заканчивает другую среду - PullRequest
6 голосов
/ 04 марта 2011

В настоящее время я использую Beamer и пакет для распечатки, чтобы красиво печатать код в блоки Beamer. Итак, что я делаю, выглядит так:

\begin{block}{}
\begin{lstlisting}
int foobar(void) { return 0; }
\end{lstlisting}
\end{block}

Теперь я считаю трудным запускать окружения block и lstlisting каждый раз. Я хотел бы иметь простую codeblock среду, которая просто делает это:

\begin{codeblock}
int foobar(void) { return 0; }
\end{codeblock}

Итак, я попробовал что-то вроде:

\lstnewenvironment{codeblock}
{\begin{block}{}}
{\end{block}}

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

! Missing } inserted.
<inserted text> 
                }
l.178 \end{frame}

? 

Есть ли способ сделать это?

В Проблема с созданием новой среды в LaTeX . У Андреаса Греча была та же проблема, но она могла ее решить, поскольку существовал другой способ войти / выйти из окружающей среды. Но в случае среды block Beamer, кажется, нет другого пути, чем сделать \begin{block}...\end{block}.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2015

Я "решил" это с помощью \VerbatimOut пакета fancyvrb (см. дословное запись тела environmentmnet в файл ), чтобы создать временный файл, который затем можно включить в lstinputlisting:

\usepackage{fancyvrb}
\usepackage{listings}

\newenvironment{blocklisting}[1]
{\begingroup\lstset{#1}\VerbatimOut{blocklisting-tmp.txt}}
{\endVerbatimOut\begin{block}{Code}\lstinputlisting{blocklisting-tmp.txt}\end{block}\endgroup}

По какой-то причине я не смог сделать аргумент среды необязательным, хотя.

Использовано так:

\begin{document}
\begin{frame}[fragile]
\frametitle{Whatever}
\begin{blocklisting}{language=Java, basicstyle=\Huge}
Code
\end{blocklisting}

\begin{blocklisting}{}
Code 2
\end{blocklisting}
\end{frame}
\end{document}

Не оптимальное решение, но оно работаетЯ думаю.

0 голосов
/ 04 марта 2011

У меня была такая же проблема, и я не мог найти решение для нее. Мой обходной путь - использовать команду \ lstinputlisting и поместить код в отдельный файл. Это здорово, если у вас есть реальный код, который вы хотите включить. Для маленьких примеров это не так.

Другой обходной путь - поместить фрагмент кода в переменную перед запуском среды {frame}, а затем ссылаться на него. Как это сделать, объясняется в документации по латексным проекторам. Это также позволит вам использовать вашу собственную среду / команду.

...