
我有程式碼以 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*
等也不起作用。幸運的是,我的舊版本\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}