Conseguir que \needspace funcione en multicols

Conseguir que \needspace funcione en multicols

Tengo un código que genera múltiples listas de datos en forma de fuente XeLaTeX. Debido a que las líneas de datos son muy cortas, las presento en un multicolsentorno. Cada lista tiene algunos títulos. En ocasiones, la lista de datos es muy corta (solo un encabezado y una línea de datos) y en este caso, estoy luchando para evitar que el encabezado y la línea siguiente se dividan en columnas. Aquí hay un MWE que muestra el problema y mi intento de solucionarlo usando \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}

Intenté usar \Needspace*en lugar de \needspace, también intenté agregar \raggedcolumns, aumentar el espacio solicitado 2\baselineskipy usar \par, \\o \\*en lugar de \newline, pero haga lo que haga, no puedo evitar que estas dos líneas se dividan en dos columnas. ¿Alguien puede ayudar?

(Sé que en principio podría usar un entorno minipageo tal vez samepage, pero no creo que eso sea posible aquí porque realmente necesito mantener el manejo especial dentro de la \tblheadingmacro debido a la forma en que se generan los datos).

Respuesta1

El comando \minisec de KOMA hace más o menos esto:

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

Respuesta2

En realidad, Multicol formatea toda la página como una sola columna y luego la divide en dos o más longitudes iguales. Resulta que eso \@afterheadingno evitará que se produzca esta división, por lo que \subsection*etc. tampoco funcionará. Afortunadamente, mi versión anterior \needspacefuncionará.

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

información relacionada