
У меня есть код, который генерирует несколько списков данных в виде исходного кода 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}