如何防止在函数主体内部出现分页符?

如何防止在函数主体内部出现分页符?

是否可以告诉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}

相关内容