我有代码可以生成 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
(我知道原则上我可以使用minipage
或samepage
环境,但我不认为在这里可能,因为我确实需要在\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}