
XeLaTeX ソースの形式で複数のデータ リストを生成するコードがあります。データ行が非常に短いため、環境で提示していますmulticols
。各リストにはいくつかの見出しがあります。データ リストが非常に短い場合 (見出しが 1 つとデータ行が 1 つだけ) があり、その場合、見出しとそれに続く行が列に分割されないようにするのに苦労しています。以下は、問題と、 を使用した修正の試みを示す MWE です\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}
\Needspace*
の代わりにを使用したり\needspace
、 を追加したり、\raggedcolumns
から要求されたスペースを増やしたり、の代わりに2\baselineskip
を使用したりしてみましたが、何を試しても、これら 2 行が 2 つの列に分割されるのを防ぐことはできません。誰か助けてくれませんか?\par
\\
\\*
\newline
minipage
(原理的にはまたは環境を使用できることはわかっていますsamepage
が、データの生成方法により、マクロ内で特別な処理を維持する必要があるため、ここではそれが可能ではないと思います\tblheading
。)
答え1
KOMA の \minisec コマンドは、おおよそ次のことを行います。
\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}
答え2
\@afterheading
Multicol は、実際にはページ全体を 1 つの列としてフォーマットし、それを 2 つ以上の同じ長さに分割します。ではこの分割を防止できないことが判明したため、 \subsection*
etc も機能しません。\needspace
幸い、 の古いバージョンは機能します。
\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}