将 \lstlisting 包装在 \newenvironment 中的 \ex 中的 \minipage 中

将 \lstlisting 包装在 \newenvironment 中的 \ex 中的 \minipage 中

我将其用作expex语言示例,但在工作中,有时我想包含代码片段。我喜欢用特定语言定义的语法将代码片段包装在列表中。但为了让所有内容都能很好地发挥作用(对齐到示例编号的顶部,中间没有分页符),我将其放入了一个小页面中。现在,我得到了一大堆东西:

\ex\label{somelabel}
\begin{minipage}[t]{.9\linewidth}
\begin{lstlisting}
some_code_in_here = \0
\end{lstlisting}
\end{minipage}
\xe

这是很多样板,所以我想定义一个环境以使其更方便:

\newenvironment{exlisting}[1]
 {\ex\label{#1}
  \begin{minipage}[t]{.9\linewidth}
  \begin{lstlisting}
 }
 {\end{minipage}
  \end{lstlisting}
  \xe
 }

但这并不起作用,不知何故,我的乳胶最终说它缺少一个}(但我认为这个错误是转移注意力的手段)。

无论如何,我相信我已经将其归结为一个最小的问题,即我实际上无法在环境中完成 lstlisting。此 MWE 说明了这个问题。

\documentclass{article}
\usepackage{listings}
\newenvironment{mylisting}
{\begin{lstlisting}}
{\end{lstlisting}}
\begin{document}
\begin{mylisting}
somecode
\end{mylisting}
\end{document}

我确实看到了 listings 手册 (5.16) 的一部分,其中说 listings 与 newenvironment 交互不佳,这应该是使用 listings 与 newenvironments 的方式。然而,在这种情况下,我最终得到了一个不同的错误,可怕的*,前面有一个来自 listings 代码的警告。另一个 MWE:

\documentclass{article}
\usepackage{listings}
\lstnewenvironment{mplisting}
{\begin{minipage}[t]{.9\linewidth}}
{\end{minipage}}
\begin{document}
\begin{mplisting}
something = anotherthing
\end{mplisting}
\end{document}

如果我尝试在我的系统上使用 pdflatex 编译它,它看起来像这样:

$ pdflatex mwe.tex This is pdfTeX, Version 3.14159265-2.6-1.40.17 (TeX Live 2016/Debian) (preloaded format=pdflatex) restricted \write18 enabled. entering extended mode (./mwe.tex LaTeX2e <2017/01/01> patch level 3 Babel <3.9r> and hyphenation patterns for 3 language(s) loaded. (/usr/share/texlive/texmf-dist/tex/latex/base/article.cls Document Class: article 2014/09/29 v1.4h Standard LaTeX document class (/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo)) (/usr/share/texlive/texmf-dist/tex/latex/listings/listings.sty (/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty) (/usr/share/texlive/texmf-dist/tex/latex/listings/lstmisc.sty) (/usr/share/texlive/texmf-dist/tex/latex/listings/listings.cfg)) (./mwe.aux) (/usr/share/texlive/texmf-dist/tex/latex/base/omscmr.fd)) *

并且只是挂在 * 上。所以,我很迷茫。我第一次尝试环境定义并没有真正让我取得任何进展。作为就地代码,我的 expex 包装 minipage 包装列表看起来很棒,但我在创建环境来为我完成一些输入方面没有取得任何进展。

答案1

在定义中\lstnewenvironment你可以使用

\minipage[t]{.9\linewidth}

而不是\begin{minipage}[t]{.9\linewidth}。在下面的示例中,我使用了这样的定义,其中我还插入了一些负垂直空间以更好地适应标签,第二项显示了原始编码产生的结果。

示例输出

\documentclass{article}

\usepackage{listings,expex}

\lstnewenvironment{mplisting}
{\minipage[t]{.9\linewidth}\vspace{-14pt}}
{\endminipage}

\begin{document}

\ex\label{newversion}
\begin{mplisting}
something = anotherthing
something = anotherthing
\end{mplisting}
\xe

\ex\label{oldversion}
\begin{minipage}[t]{.9\linewidth}
  \begin{lstlisting}
something = anotherthing
something = anotherthing
  \end{lstlisting}
\end{minipage}
\xe

\end{document}

利用这个想法,你可以创建exlisting如下环境:

\documentclass{article}

\usepackage{listings,expex}

\lstnewenvironment{exlisting}[1]{%
\ex\label{#1}\minipage[t]{.9\linewidth}\vspace{-14pt}}
{\endminipage\xe}

\begin{document}

\begin{exlisting}{name}
something = anotherthing
something = anotherthing
\end{exlisting}

\end{document}

生产

第二个示例

相关内容