拉伸 \columnsep 并使文本向左对齐

拉伸 \columnsep 并使文本向左对齐

我的文档主要由对齐的文本组成,但部分内容由双列且左侧对齐文本(实际上是诗句)。下面是 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}

相关内容