多列环境中的文本对齐

多列环境中的文本对齐

我正在使用这个 3 列布局。

\begin{multicols}{3}
[.. a lot of text ..]
\end{multicols}

我想让左列的文本左对齐,中间列的文本居中,右列的文本右对齐。(在您问为什么有人会想要这样做之前:这是为了处理相当长的名字列表)

当然,我可以检查文本的哪一部分应该放在哪一列,并相应地调整各部分的对齐方式。但这很丑陋。我可以让 LaTeX 帮我做这件事吗?

答案1

在此处输入图片描述

以下代码按照 multicols 的设置重新打包列,将中间列居中对齐,将右侧列右对齐。它适用于段落和单行,但如果有任何额外的行间材料(如浮动或特殊内容),则会失败。

\documentclass{article}

\textheight.3\textheight
\pdfpageheight2\textheight

\usepackage{multicol}


\makeatletter

\def\maybe@reverse@columns{%
\count@\mult@rightbox
\rejustifybox{\hskip 0pt \@plus 1filll\unhbox\z@\unskip}%
\advance\count@4
\rejustifybox{\hskip 0pt \@plus 1filll\unhbox\z@\unskip\hskip 0pt \@plus 1filll}%
}

\def\rejustifybox#1{%
\@tempdimb\ht\count@
\global\setbox\@ne\vbox{}%
\setbox\z@\vbox{\hbox{\vrule depth 123sp} \unvbox\count@
\loop
\setbox\z@\lastbox
\@tempskipa\lastskip\unskip
\@tempcnta\lastpenalty\unpenalty
\ifdim\dp\z@=123sp
\else
\global\setbox\@ne\vbox{%
   \penalty\@tempcnta
   \vskip\@tempskipa
   \ifvoid\z@\else
   \hbox to \wd\z@{#1}%
    \fi
   \unvbox\@ne}%
\repeat
\global\setbox\count@\box\@ne
\global\ht\count@\@tempdimb
}}

\makeatother

\def\a{One two three four five six seven. }
\def\b{\a Red green blue yellow. }
\def\c{\a\b\a\b}
\def\x{Oxford\par London\par Manchester\par Birmingham\par Nottingham\par Liverpool\par Cambridge\par}

\begin{document}

\begin{multicols}{3}\raggedright
1\c\c\par
2 Text goes here. \c\a\c\par
3 \x\x\x\x\x\x\x\x\x
\end{multicols}

\end{document}

相关内容