
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 multicols
entorno. 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\baselineskip
y 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 minipage
o tal vez samepage
, pero no creo que eso sea posible aquí porque realmente necesito mantener el manejo especial dentro de la \tblheading
macro 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 \@afterheading
no evitará que se produzca esta división, por lo que \subsection*
etc. tampoco funcionará. Afortunadamente, mi versión anterior \needspace
funcionará.
\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}