
Ich habe Code, der mehrere Datenlisten in Form einer XeLaTeX-Quelle generiert. Da die Datenzeilen sehr kurz sind, stelle ich sie in einer multicols
Umgebung dar. Jede Liste enthält einige Überschriften. Gelegentlich ist die Datenliste sehr kurz – nur eine einzige Überschrift und eine Datenzeile – und in diesem Fall habe ich Mühe, zu verhindern, dass die Überschrift und die folgende Zeile auf mehrere Spalten aufgeteilt werden. Hier ist ein MWE, das das Problem und meinen Versuch zeigt, es mithilfe von zu beheben \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}
Ich habe versucht, \Needspace*
anstelle von zu verwenden \needspace
. Ich habe auch versucht, hinzuzufügen \raggedcolumns
, den angeforderten Speicherplatz von zu erhöhen 2\baselineskip
und oder anstelle von zu verwenden \par
, aber was auch immer ich versuche, ich kann nicht verhindern, dass diese beiden Zeilen auf zwei Spalten aufgeteilt werden. Kann jemand helfen?\\
\\*
\newline
minipage
(Ich weiß, dass ich im Prinzip eine „or maybe“ -Umgebung verwenden könnte samepage
, aber ich glaube nicht, dass das hier möglich ist, weil ich die spezielle Behandlung aufgrund der Art und Weise, wie die Daten generiert werden, wirklich innerhalb des Makros beibehalten muss \tblheading
.)
Antwort1
Der \minisec-Befehl von KOMA macht mehr oder weniger Folgendes:
\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}
Antwort2
Multicol formatiert die gesamte Seite tatsächlich als einzelne Spalte und teilt sie dann in zwei oder mehr gleich lange Spalten auf. Es stellt sich heraus, dass dies \@afterheading
diese Aufteilung nicht verhindert, also \subsection*
funktioniert auch „etc“ nicht. Meine alte Version \needspace
funktioniert glücklicherweise.
\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}