分栏 (multicol/twocolumn)

把正文排成两栏以上的“分栏”主要有两种工具。一种是让 *整篇文档* 变成双栏的类选项 twocolumn(以及切换命令 \twocolumn / \onecolumn);另一种是 multicol 宏包的 multicols 环境,它可以从页面中途开始,并支持任意栏数。两者看起来相似,但栏数、栏高平衡方式以及图表(浮动体)的处理都不同。本页也会说明该如何取舍。

两种方法

简短结论是:如果想让 整篇文档 双栏排版(例如会议论文样式),标准类的 twocolumn 选项最方便。若只想让 某一部分 分栏、想要 三栏以上,或想让各栏高度 自动平衡,则 multicol 宏包更合适。下表是大致比较。

角度twocolumn(类)multicol 宏包
段数仅 2 栏任意 2 到 10 栏
範囲整篇文档(或以分页为单位)仅环境包围的范围;可从页面中途开始
最終ページの段の高さ不平衡(最后右栏常较短)自动平衡(balanced)
切り替え時の改ページ\twocolumn / \onecolumn 会强制分页不需要(可在同一页内切换)
フロート(図表)可使用 figure* 等全宽浮动体不支持普通浮动体(见下文)

整篇文档双栏 — twocolumn

最简单的方法是在文档类中传入 twocolumn 选项。仅此一项就会让整个正文变成双栏(默认是 onecolumn,即单栏)。许多学会论文类内部都以这个选项为前提。

latex
\documentclass[twocolumn]{article}

如果想在文档中途切换栏数,在正文中调用 \twocolumn\onecolumn\twocolumn 切换到双栏,\onecolumn 切回单栏。但有两个重要限制:第一,两个命令都会开始新页,也就是强制分页,不能在页面中途切换。第二,\twocolumn 只能生成 两栏,不能生成三栏以上。

\twocolumn 有一个可选参数:写成 \twocolumn[⟨单栏前置内容⟩] 时,这部分会在双栏正文开始前以 单栏(全宽) 排版。论文开头常见的“标题、作者、摘要横跨整页宽度,正文从下方开始双栏”样式可用它实现。

document.tex
\documentclass[twocolumn]{article}
\begin{document}
\twocolumn[%
  \begin{center}
    {\LARGE 論文タイトル}\\[4pt]
    著者名 \quad 所属
  \end{center}
  \vspace{1em}
]
本文はここから 2 段組みで組まれます。……
\end{document}

两栏之间的间距由长度 \columnsep 决定,栏间竖线的粗细由 \columnseprule 决定。\columnseprule 默认是 0pt(无竖线);想显示竖线时设为正值。注意在最后一页,twocolumn 不会平衡左右栏高度,因此右栏可能明显短于左栏(若想平衡,应使用下面的 multicol)。

latex
\setlength{\columnsep}{20pt}      % 段間を広げる
\setlength{\columnseprule}{0.4pt} % 段間に細い罫線を引く

双栏模式中的全宽图表

twocolumn 的重要优点是可以放置 跨越两栏、占满页面宽度的图表。使用带星号的 figure* / table* 环境代替 figuretable,该图表就会成为跨两栏的全宽浮动体。不过位置有一定限制:全宽浮动体会放在 页面顶部(不会跑到页面底部)。

document.tex
\documentclass[twocolumn]{article}
\usepackage{graphicx}
\begin{document}
% 1 段ぶんの幅の図(通常のフロート)
\begin{figure}
  \centering
  \includegraphics[width=\columnwidth]{plot}
  \caption{片段に収まる図}
\end{figure}

% 両段にまたがる全幅の図
\begin{figure*}
  \centering
  \includegraphics[width=\textwidth]{wide-plot}
  \caption{ページ全幅の図}
\end{figure*}
\end{document}

这里需要记住 \columnwidth\textwidth 的区别。\columnwidth一栏的宽度,而 \textwidth整个版心(两栏加栏间距)的宽度。单栏图使用 width=\columnwidth,全宽图使用 width=\textwidth,可避免溢出。

任意栏数并自动平衡 — multicol 宏包

Frank Mittelbach 的 multicol 宏包弥补了 twocolumn 的不便(只能双栏、作用于全文或分页单位、最后一页不平衡)。用 \usepackage{multicol} 加载后,把需要分栏的区域放入 multicols 环境,并把栏数作为参数传入即可。

latex
\usepackage{multicol}
% ...本文中で
\begin{multicols}{3}
  ここに書いた本文が 3 段に分かれて組まれます。……
\end{multicols}

multicol 有四个优点。第一,栏数可在 2 到 10 栏 之间自由选择。第二,在环境结束处会 自动平衡 各栏高度。第三,它可以 从页面中途开始分栏,不像 twocolumn 那样强制分页。第四,multicols 环境可以 嵌套

如果想在分栏前放置 跨越所有栏的前置文字(标题或导入文),在栏数后写可选参数 [⟨前置文字⟩]。只有这部分不会分栏,而是以版心全宽排版。

latex
\begin{multicols}{3}[\section{用語集}]
  この見出しは 3 段の上に全幅で出ます。\par
  以降の本文が 3 段に分かれます。……
\end{multicols}

在这个前置文字参数之后,还可以再写一个可选的 [⟨长度⟩]。它表示“开始分栏所需的页面底部最小剩余空间”,会临时覆盖默认值 \premulticols。如果剩余空间小于这个值,分栏会从新页开始。这可以避免长前置内容之后,在页底尴尬地开始分栏。

控制分栏 — 断栏、竖线与不平衡

要自己指定栏的结束位置,在正文中调用 \columnbreak。它会在当前位置结束当前栏,并把后续内容送到下一栏(1.5u 版加入)。较新版本可写 \columnbreak[⟨0–4⟩],用 0(弱)到 4(强制)表示断栏意愿;还可使用 \newcolumn,它会强制断栏但让当前栏保持较短。

栏间距和栏间竖线使用与 twocolumn 相同的 \columnsep(间距)和 \columnseprule(竖线粗细,默认 0pt)控制。竖线颜色可通过给 \columnseprulecolor 设置颜色来改变(默认是正文颜色)。这些长度应在进入 multicols 环境前设置。

latex
\setlength{\columnsep}{1.5em}     % 段間
\setlength{\columnseprule}{0.4pt} % 段間の罫線を表示
\begin{multicols}{2}
  左の段の本文。……
  \columnbreak               % ここで右の段へ送る
  右の段の本文。……
\end{multicols}

普通的 multicols 会平衡最后一页的栏高,但有时你 不希望平衡,例如内容较脆弱,或希望材料跨多页按顺序流动。此时使用带星号的 multicols*(1.5q 版加入)。multicols* 不平衡最后一页栏高,而是从左到右依次填充内容。

浮动体(图表)的取舍

使用 multicol 时最大的注意点是:multicols 环境内部不能使用普通浮动体(figure / table 环境)或 \marginpar。根据 multicol 文档,LaTeX 的浮动机制在该环境内被部分禁用;放入 figure / table 会使 图表消失,并出现 Floats and marginpars not allowed inside ‘multicols’ environment! 警告。可用的只有跨栏的 星号浮动体(如 figure*,而且它们也会作为页面全宽处理,放在 页面底部,不是某一栏内部。

这正是两种方法的分界。若需要 在栏内放图表,或让浮动体落在各栏内部,应选择能正确处理浮动体的 twocolumn(全宽浮动体用 figure*)。若更重视 栏数自由和栏高平衡,图最多全宽即可,则使用 multicol。在 multicol 内确实需要放小图时,可不要使用浮动体,而是直接放置非浮动的 \includegraphics,或用 wrapfig 等环绕宏包替代。

还有一点:分栏后栏宽变窄,两端对齐的正文容易产生不自然的词间空白。如果介意,可以在栏内改为左对齐(ragged-right),或配合连字/断词和断行调整来改善效果。