我有一个类似于以下内容的Latex代码:
\usepackage{listings}
\lstset{
breaklines = true,
numbers = left,
stepnumber = 5,
}
\begin{lstlisting}
for (int i = 0, j = 0, k = 1; i <= 10, j < foo; i++, j *= factor, k--) { // a comment here
% something code here ...
}
\end{lstlisting}
for-loop的长行会在中间某处自动断开,因为纸张太窄了。这正是我想要的,否则该线将在论文的最后消失。但现在我的问题是,是否有办法标记或表明这条线被打破了。否则,它看起来像是一条新线。
这就是我想要的(使用行号,注意箭头):
10 for (int i = 0, j = 0, k = 1; i <= 10, j < foo;
↳ i++, j *= factor, k--) { // a comment here
11 % something code here ...
答案 0 :(得分:46)
配置列表如下:
\lstset{prebreak=\raisebox{0ex}[0ex][0ex]
{\ensuremath{\rhookswarrow}}}
\lstset{postbreak=\raisebox{0ex}[0ex][0ex]
{\ensuremath{\rcurvearrowse\space}}}
\lstset{breaklines=true, breakatwhitespace=true}
\lstset{numbers=left, numberstyle=\scriptsize}
文档中的示例源代码:
\begin{lstlisting}[language=C++, numbers=left, linewidth=5.1cm]
if (line.length() > line.max_length())
{
line.wrap();
}
\end{lstlisting}
示例结果:
注意:您必须\usepackage{MnSymbol}
才能使用\rhookswarrow
和\rcurvearrowse
。为了防止额外的依赖,您可以使用默认包中包含的\hookrightarrow
和\hookleftarrow
。
来源:http://www.bollchen.de/blog/2011/04/good-looking-line-breaks-with-the-listings-package/。在那里阅读更详细的解释。还pdf。
答案 1 :(得分:12)
显然,这可以通过prebreak
/ postbreak
选项来完成。请参阅listings
包的文档,该文档链接到its CTAN page(它是第33页的底部和pdf中第34页的顶部)。
修改:指向the Listings Package's manual的直接链接。另外,我想我可以在这里重现相关的位 - 所以这里是:
prebreak=<tokens> (default {})
postbreak=<tokens> (default {})
<tokens>
分别出现在当前行的末尾,分别位于下一行(已断开的部分行)的开头。您不能使用动态空间(特别是空格),因为我们在内部使用
\\discretionary
。但是,\\space
被重新定义为在<tokens>
内使用。
编辑2:关于换行标记的位置,可以通过将breakindent
设置为0pt
,breakautoindent
来实现与问题中提供的示例外观接近的内容false
并用\\space
。
例如,使用postbreak={\textbf{marker}\\space\\space\\space\\space}
作为一个漂亮的粗体标记排版,其中新行通常会开始,然后是四个空格,然后是虚线的剩余内容。在prebreak
'手册中postbreak
/ listings
之后立即记录这些选项。 : - )