我的文档主要由对齐的文本组成,但部分内容由双列且左侧对齐文本(实际上是诗句)。下面是 MWE。
就像将左侧的框向右冲洗,我希望第二列的文字为:
- 脸红了,
- 第二列的最长一行也是左对齐、右对齐吗?
这里有一个示意图,|
文本区域的界限在哪里:
|Some normally justi-|
|fied text. |
| |
|Foo Fus |
|Bar Roooh|<- the right end of the longest line matches the text-area limit
|Baz Da! |
因为我希望解决方案是通用的,而且我不一定知道“双列”文本的行数(其中可能有pagebreak
),所以我找到了建议的解决方案线(以及其复制) 由tabular
+组成\hfill
,不太方便。
问题:是否有一种简单的方法可以扩展环境\columnsep
中使用的维度multicols
,就像\hfill
可以做的那样?
\documentclass{scrartcl}
\usepackage{multicol}
\usepackage{lipsum}
\begin{document}
\lipsum[1]
\begin{multicols}{2}
\noindent
Foo foo foo\newline
Bar, barbar\newline
Bazbazbaz baz babaz
\noindent
Fusss fus,\newline
Roh\newline
Daaaa !
\end{multicols}
\noindent\lipsum[2]
\end{document}
答案1
由于您无论如何都要手动换行,因此最简单的方法是将它们装箱(否则,如果您让 TeX 的普通段落分隔符将段落分成几行,那么即使它们有短文本,它们也会全宽)。
如果每行都是它的自然宽度,那么您只需要取消装箱并重新装箱右侧列,以便将列设置为其内容的宽度,然后多列使用的现有胶水会将列推到右侧。
\documentclass{scrartcl}
\usepackage{multicol}
\usepackage{lipsum}
\makeatletter
\def\mc@align@columns{%
\process@cols\mult@gfirstbox{%
\ifdim\dp\count@>\dimen\tw@
\global\dimen\tw@\dp\count@ \fi
\mc@col@status@write
\box\count@
\hss{\columnseprulecolor\vrule
\@width\columnseprule}\hss}%
\ifdim\dp\mult@rightbox>\dimen\tw@
\global\dimen\tw@\dp\mult@rightbox \fi
\mc@lastcol@status@write
\vbox{\unvbox\mult@rightbox}%
}
\makeatother
\begin{document}
\lipsum[1]
\begin{multicols}{2}
\hbox{Foo foo foo}
\hbox{Bar, barbar}
\hbox{Bazbazbaz baz babaz}
\bigskip
\hbox{Fusss fus,}
\hbox{Roh}
\hbox{Daaaa !}
\end{multicols}
\noindent\lipsum[2]
\end{document}