Получение \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

Команда \minisec из KOMA делает примерно следующее:

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

Связанный контент