如何防止 lstlisting 在页面之间分割代码?

如何防止 lstlisting 在页面之间分割代码?

lstlisting如果代码无法放在一页上,是否可以防止代码在页面之间拆分?我希望将代码放在下一页上,而不是拆分。

我尝试将所有内容都放入lstlisting其中,\begin{figure}[h!]...\end{figure}但是代码和标题的顺序却丢失了。

答案1

定义自己的不允许分页的列表环境

\documentclass[a4paper]{article}
\usepackage{listings}
\usepackage{lipsum}

\lstnewenvironment{code}[1][]%
  {\noindent\minipage{\linewidth}\medskip 
   \lstset{basicstyle=\ttfamily\footnotesize,frame=single,#1}}
  {\endminipage}

\begin{document}

\lipsum[1-4] % some dummy text to get to the bottom of the page

\begin{code}[caption={This is my code. There are many like it, but this one is mine.},
         language=Python]
def jacobian(function, variablelist):
    """
    Calculates symbolically the Jacobian of the vector with respect to 
    the provided variables. Returns a square matrix
    """
    n=len(variablelist)
    J=np.asmatrix(np.zeros((n,n)),dtype=sy.Symbol)

    for i in range(n):
        for k in range(n):
            J[i,k]=function[i,0].diff(variablelist[k])
    return J

def vector(*arglist):
    """
    A shorthand for defining a symbolic column vector. Arguments are 
    supplied as a normal comma-separated list.
    """
    return np.asmatrix(np.array(arglist), dtype=sy.Symbol).transpose()
\end{code}

\end{document}

或使用float包中的选项(参见文档)

答案2

我发现赫伯特的回答给我带来了两个问题。

  1. 由于代码必须位于其自己的段落中,因此小页面/列表会缩进。
  2. 由于某种原因,列表现在似乎忽略了 baselinestretch。当列表未推送到新页面且 baselineskip 不是 1 时,就会出现问题。

我通过添加 Herbert 的解决方案解决了这些问题:

\lstnewenvironment{code}[1][]%
{
   \noindent
   \minipage{\linewidth} 
   \vspace{0.5\baselineskip}
   \lstset{basicstyle=\ttfamily\footnotesize,frame=single,#1}}
{\endminipage}

答案3

最简单的方法是使用float包,并将lstlistings环境放入其中。这是一个简单粗暴的例子:

\documentclass[a4paper]{article}
\usepackage{listings}
\usepackage{float}
\usepackage{lipsum} % used to insert dummy text; not required

\floatstyle{plain} % optionally change the style of the new float
\newfloat{Code}{H}{myc}
\lstloadlanguages{Python}

\begin{document}
\lstset{basicstyle=\ttfamily\tiny}

\lipsum[1-4] % some dummy text to get to the bottom of the page

\begin{Code}
    \centering
    \begin{lstlisting}[language=Python]
    def jacobian(function, variablelist):
        """
        Calculates symbolically the Jacobian of the vector with respect to 
        the provided variables. Returns a square matrix
        """

        n=len(variablelist)
        J=np.asmatrix(np.zeros((n,n)),dtype=sy.Symbol)

        for i in range(n):
            for k in range(n):
                J[i,k]=function[i,0].diff(variablelist[k])
        return J

    def vector(*arglist):
        """
        A shorthand for defining a symbolic column vector. Arguments are 
        supplied as a normal comma-separated list.
        """
        return np.asmatrix(np.array(arglist), dtype=sy.Symbol).transpose()

    \end{lstlisting}
    \caption{This is my code. There are many like it, but this one is mine.}
\end{Code}

\end{document}

您可以像使用普通图形一样使用标题、标签、代码示例列表等。查看float软件包以获取有关自定义这些内容的一些额外信息。

答案4

我会尝试float一下listings包。请参阅包文档的第 4.3 节。

编辑:我已经成功使用了它,但是必须逐个列表定义它,float如果在全局中设置它会忽略该选项lstset

编辑#2:为了完整起见,我定义了一个环境来实现这一点,我更喜欢我的环境,而不是 Herbert 提供的环境,因为它看起来更简单:

% Snippet Listings
\lstnewenvironment{snippet}[1][]
    {\lstset{float=htpb,#1}} 
    {}

相关内容