Fazendo com que \needspace funcione em multicols

Fazendo com que \needspace funcione em multicols

Eu tenho um código que gera várias listas de dados na forma de fonte XeLaTeX. Como as linhas de dados são muito curtas, estou apresentando em um multicolsambiente. Cada lista contém alguns títulos. Ocasionalmente, a lista de dados é muito curta – apenas um único título e uma linha de dados – e, neste caso, estou lutando para evitar que o título e a linha seguinte sejam divididos em colunas. Aqui está um MWE mostrando o problema e minha tentativa de corrigi-lo 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}

Eu tentei usar \Needspace*em vez de \needspace, também tentei adicionar \raggedcolumns, aumentar o espaço solicitado de 2\baselineskipe usar \par, \\ou \\*em vez de \newline, mas não importa o que eu tente, não consigo evitar que essas duas linhas sejam divididas entre duas colunas. Alguém pode ajudar?

(Eu sei que em princípio eu poderia usar um ambiente minipageou talvez samepage, mas não acho que isso seja possível aqui porque eu realmente preciso manter o tratamento especial dentro da \tblheadingmacro devido à forma como os dados são gerados.)

Responder1

O comando \minisec do KOMA faz mais ou menos isso:

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

Responder2

Na verdade, o Multicol formata a página inteira como uma única coluna e depois a divide em dois ou mais comprimentos iguais. Acontece que isso \@afterheadingnão impedirá que essa divisão ocorra, então \subsection*etc também não funcionará. Minha versão antiga \needspacefuncionará, felizmente.

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

informação relacionada