So funktioniert \needspace in mehreren Spalten

So funktioniert \needspace in mehreren Spalten

Ich habe Code, der mehrere Datenlisten in Form einer XeLaTeX-Quelle generiert. Da die Datenzeilen sehr kurz sind, stelle ich sie in einer multicolsUmgebung 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\baselineskipund 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 \@afterheadingdiese Aufteilung nicht verhindert, also \subsection*funktioniert auch „etc“ nicht. Meine alte Version \needspacefunktioniert 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}

verwandte Informationen