让 \needspace 在多列中工作

让 \needspace 在多列中工作

我有代码可以生成 XeLaTeX 源形式的多个数据列表。由于数据行非常短,因此我将其呈现在一个multicols环境中。每个列表中都有几个标题。有时数据列表非常短 - 只有一个标题和一行数据 - 在这种情况下,我很难防止标题和下一行被拆分到列中。以下是显示问题的 MWE 以及我尝试使用以下内容修复它\needspace

\documentclass[a4paper]{article}
\usepackage{multicol}
\usepackage{needspace}
\newcommand{\tblheading}[1]{\needspace{2\baselineskip}\textbf{#1}\newline}
\begin{document}
\begin{multicols}{3}
\tblheading{Heading}
Entry
\end{multicols}
\end{document}

我尝试过使用\Needspace*代替\needspace,也尝试过添加\raggedcolumns,从 增加请求的空间2\baselineskip,以及使用或代替\par,但无论我尝试什么,都无法阻止这两行被拆分为两列。有人可以帮忙吗?\\\\*\newline

(我知道原则上我可以使用minipagesamepage环境,但我不认为在这里可能,因为我确实需要在\tblheading宏中保留特殊处理,因为数据生成的方式。)

答案1

KOMA 的 \minisec 命令大致可以完成以下任务:

\documentclass[a4paper]{article}
\usepackage{multicol}
\makeatletter
\newcommand\minisec[1]{%
    \if@noskipsec \leavevmode \fi
    \par
    \@afterindentfalse
    \if@nobreak
      \everypar{}%
    \else
      \addpenalty\@secpenalty\addvspace{1.5ex}% space before, adjust if needed
    \fi
  {\parindent \z@
   \setlength{\parfillskip}{\z@ plus 1fil}
    \normalfont\bfseries
    \nobreak\interlinepenalty \@M #1\par\nobreak%
  }\nobreak
  \@afterheading
}                              
\makeatother
\begin{document}
\begin{multicols}{3}
\minisec{Heading}
Entry
\end{multicols}
\end{document}

答案2

Multicol 实际上将整个页面格式化为单个列,然后将其拆分为两个或更多相等长度。事实证明,这\@afterheading不会阻止这种拆分,因此\subsection*etc 也不起作用。\needspace幸运的是,我的旧版本可以正常工作。

\documentclass[a4paper]{article}
\usepackage{multicol}
\setlength\columnseprule{.4pt}
\usepackage{lipsum}

\makeatletter
\newcommand{\tblheading}[1]{\par\rule{0pt}{\dimexpr 2\baselineskip-\dp\strutbox}\vspace{-2\baselineskip}\newline
  \indent\textbf{#1}\newline}
\makeatother

\begin{document}
\begin{multicols}{3}
\noindent\rule{\columnwidth}{49\baselineskip}% 48 will go in first column

\tblheading{Heading}
Entry

\lipsum[1-4]
\end{multicols}
\end{document}

相关内容