是否可以告诉listings
包不要在函数主体内插入分页符?例如,
void foo()
{
// Do not insert page break here
}
//But here is fine
理想的解决方案是让括号创建段落。较长的函数可能会在if
或 处中断for
。
void foo()
{
if(...)
{
}
//Second best page-break
}
//Best page-break
答案1
我认为自动化解决方案并不明智,因为您会遇到跨多个页面的功能问题,但这里有一个临时解决方案。
您可以调用(在您的列表中的“转至 LaTeX”内)下面定义的两个宏\forbidpgbr
和\allowpgbr
,以在本地禁止/允许分页符。请注意,更改仅在调用任一宏的行之后的行上生效。
下面是一个例子(代码取自git/bisect.c
)。
正常输出
在下面的屏幕截图中,函数主体中出现了分页符,这不是您想要的。
\forbidpgbr
使用时输出
\forbidpgbr
但是,通过在函数签名之前的行上调用,您可以防止在函数主体内发生分页符。如果您的列表包含多个函数,您还应该\allowpgbr
在每个函数的最后一行上调用。
代码
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[scaled=.85]{beramono}
\usepackage{listings}
\usepackage{lipsum} % for filler text
\makeatletter
\newif\ifpgbrallowed
\newcommand\allowpgbr
{\global\pgbrallowedtrue}
\newcommand\forbidpgbr
{\global\pgbrallowedfalse}
\lst@AddToHook{PreInit}{\allowpgbr}
\lst@AddToHook{EveryLine}{%
\ifpgbrallowed%
\else
\nopagebreak%
\fi
}
\makeatother
\lstset{
language=C,
basicstyle=\scriptsize\ttfamily,
numbers=left,
escapechar=`,
}
\begin{document}
\lipsum[1-4]
\begin{lstlisting}
/*
* This is a truly stupid algorithm, but it's only
* used for bisection, and we just don't care enough.
*
* We care just barely enough to avoid recursing for
* non-merge entries.
*/`\forbidpgbr`
static int count_distance(struct commit_list *entry)
{
int nr = 0;
while (entry) {
struct commit *commit = entry->item;
struct commit_list *p;
if (commit->object.flags & (UNINTERESTING | COUNTED)
break;
if (!(commit->object.flags & TREESAME))
nr++;
commit->object.flags |= COUNTED;
p = commit->parents;
entry = p;
if (p) {
p = p->next;
while (p) {
nr += count_distance(p);
p = p->next;
}
}
}
return nr;
}`\allowpgbr`
\end{lstlisting}
\end{document}