
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 multicols
ambiente. 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\baselineskip
e 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 minipage
ou talvez samepage
, mas não acho que isso seja possível aqui porque eu realmente preciso manter o tratamento especial dentro da \tblheading
macro 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 \@afterheading
não impedirá que essa divisão ocorra, então \subsection*
etc também não funcionará. Minha versão antiga \needspace
funcionará, 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}