自定义段落命令,防止分页

自定义段落命令,防止分页

我正在使用书籍类来编写一个包含编号段落的文档。希望(自动递增的)段落编号加粗并居中,然后是下面的文本,并且段落编号带有标签以便引用。使用其他人的建议,我得到了这个函数/命令:

\newcounter{para}
\newcommand\mypara[1]{
    \par\refstepcounter{para}\vfill
    \begin{center}\textbf{\thepara}\end{center}\label{#1}
    }

我在文档中使用它的方式是:

\mypara{myreference}
This is a nice numbered paragraph. I don't want any braces around the paragraph body, if at all possible.

效果很好,除了当我在页面底部附近使用它时,在这种情况下,粗体段落编号可能在一页上,而段落文本可能在下一页上。是否可以避免这样的分页符?如果相关的话,我也在使用 multicols{2}。任何帮助表示感谢。

最小示例:

\documentclass[10pt]{book}
\usepackage{multicol}
\setlength\columnsep{1cm}  % sets the distance between columns
\usepackage{blindtext}

\newcounter{para}
\newcommand\mypara[1]{
    \par\refstepcounter{para}\vfill
    \begin{center}\textbf{\thepara}\end{center}\label{#1}
    }

\title{Minimum working example}

\begin{document}
    \pagestyle{empty}
    % main part of the document:

    \mainmatter
    \begin{multicols}{2}

        \mypara{ref1}
        \blindtext

        \mypara{ref2}
        \blindtext

        \mypara{ref3}
        \blindtext

        \mypara{ref4}
        \blindtext

    \end{multicols}
\end{document}

答案1

您可以使用适当调整的标准切片机制。

\documentclass[10pt]{book}
\usepackage{multicol}
\setlength\columnsep{1cm}  % sets the distance between columns
\usepackage{blindtext}

\makeatletter
\newcounter{para}
\newcommand\mypara[1]{%
  \@startsection{para}{1}{\z@}%
    {-\topsep}%
    {\topsep}%
    {\normalfont\bfseries\centering}%
    {}\label{#1}%
}
\newcommand{\myparamark}[1]{}
\renewcommand{\@seccntformat}[1]{%
  \ifcsname format#1\endcsname
    \csname format#1\endcsname
  \else
    \csname the#1\endcsname\quad
  \fi
}
\newcommand{\formatpara}{\thepara}
\makeatother


\begin{document}

\title{Minimum working example}
\pagestyle{empty}

% main part of the document:

\mainmatter

\begin{multicols}{2}

\mypara{ref1}
%A line more\\
A line more\\
A line more\\
A line more\\
A line more\\
A line more\\
A line more\\
A line more\\
A line more\\
A line more\\
A line more\\
A line more\\
A line more\\
A line more

\blindtext

\mypara{ref2}
\blindtext

\mypara{ref3}
\blindtext

\mypara{ref4}
\blindtext

\end{multicols}

\end{document}

您可以检查取消注释第一个A line more,第 4 节将被推送到下一页。

答案2

删除\vfill@Flexo013 指出的确实可以解决您的本地问题。不过,我会提供另一种解决方案,在我看来,它更有效。

首先,如果您不使用\chapter(并且没有\frontmatter),那么您肯定不需要该类的功能book。其次,如果您希望能够创建目录和书签,那么您\para将无法完成这项工作。

让我切换到并通过使用来自包的单行来article修改顶级分段命令。 MWE:\section\titleformattitlesec

\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{multicol}
\setlength\columnsep{1cm}  % sets the distance between columns
\usepackage{blindtext}
\usepackage[explicit]{titlesec}
\usepackage{hyperref}
\pagestyle{empty}

\begin{document}
\begin{multicols}{2}

\tableofcontents

\makeatletter
\titleformat{\section}[block]{\centering\bfseries}{\thesection}{0pt}{\@gobble{#1}}[\label{par:#1}]
\makeatother

    \section{foo}
    \blindtext

    \section{bar}      
    In \S\ref{par:foo} we said that \ldots

    \section{foo2}      
     \blindtext

    \section{bar2}      
    In §\,\ref{par:foo2} we will say that \ldots

    \section{foo3}      
    \blindtext

    \section{bar3}      
     \blindtext

    \end{multicols}
\end{document}

相关内容