讓 \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

(我知道原則上我可以使用一個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}

相關內容