我正在使用这个 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}