请注意,我对 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}