将多个代码清单视为一个图(清单包)

将多个代码清单视为一个图(清单包)

请注意,我对 tex/latex 还很陌生。

在我的论文中,我需要将源代码的特定部分引用为一个代码列表。这样我就可以跳过源代码中过于详细的特定行,而这些行不适合用代码列表来描述。

我的初始问题让我找到了一个几乎可行的解决方案。

我在源代码中使用特殊标记(如“//#< code:1 >#”)来引用相关行。我使用看起来像一个清单的多个清单并添加标题。

但有一个问题,我的代码清单有时会延续到下一页(参见下面的代码示例)。这是因为对于 latex 来说,我的代码清单实际上是四个单独的代码清单。

有没有办法解决这个问题,例如告诉 Latex 将我的 4 个不同的代码清单视为一个?

我不确定如何更好地描述这个问题,我希望我的代码清单清晰易懂。我在网上搜索了很长时间,但找不到任何有用的信息。


\documentclass[a5paper,22pt]{article}

\usepackage[english]{babel} \usepackage{listings} \usepackage{filecontents}

\lstset{rangeprefix=#<\ ,% curly left brace plus space rangesuffix=\ >#,% includerangemarker=false,% escapeinside={@}{\^^M}}% space plus curly right brace

\lstdefinestyle{JStyle} { boxpos=c,% breaklines=true,% showlines=false,% numbers=none,%numbers=left,% numberstyle=\tiny,% firstnumber=1,% frame=none,%frame=single,% basicstyle=\scriptsize\ttfamily, captionpos=b,% }

\begin{document}

\begin{filecontents*}{foo.java} //#< code:1 ># public int nextInt(int n) { //#< end ># //#< code:2 ># if (n<=0) throw new IllegalArgumentException("n must be positive"); //#< end ># //#< code:3 ># if ((n & -n) == n) // i.e., n is a power of 2 return (int)((n * (long)next(31)) >> 31); //#< end ># //#< code:4 ># int bits, val; do { bits = next(31); val = bits % n; } while(bits - val + (n-1) < 0); //#< end ># //#< code:5 ># return val; } //#< end ># \end{filecontents*}

\begin{filecontents*}{empty.java}

\end{filecontents*}

\newcommand*{\ShowListingMarker}[2]{% \vspace{-#2\baselineskip}{} \lstinputlisting[ style=JStyle, linerange={#1-end},% emphstyle={[2]\underbar},% ]{foo.java} }

\newcommand*{\ShowListingMarkerCaption}[4]{% \vspace{-#2\baselineskip}{} \lstinputlisting[language=Tcl,% label=#4,% linerange={0-0},% caption=#3 ]{empty.java} }

\section{Introduction} Lorem Ipsum is simply dummy text of the printing and typesetting industry.

\section{Methods} Lorem Ipsum is simply dummy text of the printing and typesetting industry. \section{Background} Lorem Ipsum is simply dummy text of the printing and typesetting industry.

\section{Approach A}

Lorem Ipsum is simply dummy text of the printing and typesetting industry.

\section{Results}

\ShowListingMarker{code:1}{0} \ShowListingMarker{code:2}{1} % code:3 is not shown in the figure, this is the flexibility of the approach! \ShowListingMarker{code:4}{1} \ShowListingMarker{code:5}{1} \ShowListingMarkerCaption{code:5}{1.4}{The Program}{fig:program}

\end{document}

答案1

您的示例不起作用,因为您在这个定义中犯了一个错误:

\lstset{rangeprefix=#<\ ,% curly left brace plus space
rangesuffix=\ >#,%
includerangemarker=false,%
escapeinside={@}{\^^M}}% space plus curly right brace

该符号#在 TeX 中是一个特殊字符,必须转义。在清单文档中,您将发现以下提示:

笔记TeX 的特殊字符(例如花括号、空格、百分号等)必须用反斜杠转义。

正确的是:

\lstset{rangeprefix=\#<\ ,% curly left brace plus space
rangesuffix=\ >\#,%
includerangemarker=false,%
escapeinside={@}{\^^M}}% space plus curly right brace

为了防止代码被分裂,您可以简单地使用minipage环境。

这个问题已经讨论得很好了:

牢不可破的方块

下一个改进是使用包caption。无需定义,ShowListingMarkerCaption您可以简单地使用命令\captionof{lstlisting}{....}来获取标题。

输出为:

在此处输入图片描述

\documentclass[a5paper,22pt]{article}

\usepackage[english]{babel}
\usepackage{listings}
\usepackage{caption}
\usepackage{filecontents}

\lstset{rangeprefix=\#<\ ,% curly left brace plus space
rangesuffix=\ >\#,%
includerangemarker=false,%
escapeinside={@}{\^^M}}% space plus curly right brace

\lstdefinestyle{JStyle} {
    boxpos=c,%
    breaklines=true,%
    showlines=false,%
    numbers=none,%numbers=left,%
    numberstyle=\tiny,%
    firstnumber=1,%
    frame=none,%frame=single,%
    basicstyle=\scriptsize\ttfamily,
    captionpos=b,%
    }    

\begin{document}


\begin{filecontents*}{foo.java}
//#< code:1 >#
 public int nextInt(int n) {
//#< end >#
//#< code:2 >#
     if (n<=0)
        throw new IllegalArgumentException("n must be positive");
//#< end >#
//#< code:3 >#
     if ((n & -n) == n)  // i.e., n is a power of 2
         return (int)((n * (long)next(31)) >> 31);
//#< end >#
//#< code:4 >#
     int bits, val;
     do {
         bits = next(31);
         val = bits % n;
     } while(bits - val + (n-1) < 0);
//#< end >#
//#< code:5 >#
     return val;
 }
//#< end >#
\end{filecontents*}



\newcommand*{\ShowListingMarker}[2]{%
    \vspace{-#2\baselineskip}{}
    \lstinputlisting[
      style=JStyle,
      linerange={#1-end},%
      emphstyle={[2]\underbar},%
      ]{foo.java}
}


\section{Introduction}
Lorem Ipsum is simply dummy text of the printing and typesetting industry.


\section{Methods}
Lorem Ipsum is simply dummy text of the printing and typesetting industry.
\section{Background}
Lorem Ipsum is simply dummy text of the printing and typesetting industry.


\section{Approach A}


Lorem Ipsum is simply dummy text of the printing and typesetting industry.


\section{Results}

\noindent\begin{minipage}{\linewidth}
\ShowListingMarker{code:1}{0}
\ShowListingMarker{code:2}{1}
\ShowListingMarker{code:4}{1}
\ShowListingMarker{code:5}{1}

\captionof{lstlisting}{The Program}
\label{fig:program}
\end{minipage}
\end{document}

相关内容