tabularx 包中的换行行为

tabularx 包中的换行行为

我想要一个有两列的表格;左列应左对齐,右列应右对齐,但每列都可以手动换行。我正在使用 tabularx 环境,\begin{tabularx}{\textwidth}{X|X}我相信它应该自动计算列大小为文本宽度值的一半。为了右对齐第二列,我尝试了以下操作:

\begin{tabularx}{\textwidth}{| X | >{\raggedleft\arraybackslash}X |}
\hline
Left line 1 (which could be quite long) \newline
Left line 2 \newline
Left line 3
& 
Right line 1 (which could also be quite long) \newline
Right line 2 \newline
Right line 3 \newline
Right line 4
\tabularnewline
\hline
\end{tabularx}

这里我只用一行就结束了表格,但原则上我可能想要更多类似的行。

当我编译时,右列没有右对齐 - 只有最后的“右行 4”是:

输出

如果我不输入\newlines,那么右列就会像我预期的那样右对齐(但会变成一个段落,没有手动换行)。这\newline似乎与对齐方式发生冲突,我不知道是怎么回事。

我注意到,如果我使用\linebreak而不是 ,\newline我的问题就会消失。但是,这是 linebreak 的正确用法吗?

有人能解释一下为什么换行符不能像我预期的那样工作吗?最好的解决方案是什么?非常感谢。

答案1

我的建议是使用包,它在大写名称 和 下为和(和)ragged2e提供了更好的定义(或在原始名称下使用选项)。这些命令更适合在表格等窄列中使用。当这些命令处于活动状态时,它还可以解决该问题。\raggedright\raggedleft\centering\RaggedRight\RaggedLeft\Centering\newline

\documentclass{article}

\usepackage{ragged2e}
\usepackage{tabularx}

\begin{document}
\begin{tabularx}{\textwidth}{| X | >{\RaggedLeft\arraybackslash}X |}
\hline
Left line 1 (which could be quite long) \newline
Left line 2 \newline
Left line 3
& 
Right line 1 (which could also be quite long) \newline
Right line 2 \newline
Right line 3 \newline
Right line 4
\tabularnewline
\hline
\end{tabularx}
\end{document}

在此处输入图片描述

答案2

经过进一步挖掘,这里发生的事情的答案基本上包含在答案。概括地说,raggedleft(相当于flushright环境)命令\hfil在每行的开头添加一个。据我所知,\newline= \hfil\break,因此如果我这样写:

\begin{tabularx}{\textwidth}{| X | >{\raggedleft\arraybackslash}X |}
    \hline
    Left line 1 (which could be quite long) \newline
    Left line 2 \newline
    Left line 3
    & 
    Right line 1 (which could also be quite long \lipsum[66])\newline
    Right line 2 \newline
    Right line 3 \newline
    Right line 4
    \tabularnewline
    \hline
\end{tabularx}

我得到的等价于:

\begin{tabularx}{\textwidth}{| X | >{\raggedleft\arraybackslash}X |}
    \hline
    Left line 1 (which could be quite long)\hfil\break
    Left line 2\hfil\break
    Left line 3
    & 
    \hfil Right line 1 (which could also be quite long\break
    \hfil Nunc sed pede. Praesent vitae lectus.\break
    \hfil Praesent neque justo, vehicula eget,\break
    \hfil interdum id, facilisis et, nibh. Phasellus at\break
    \hfil purus et libero lacinia dictum. Fusce\break
    \hfil aliquet. Nulla eu ante placerat leo semper\break
    \hfil dictum. Mauris metus. Curabitur lobortis.\break
    \hfil Curabitur sollicitudin hendrerit nunc.\break
    \hfil Donec ultrices lacus id ipsum.)\break\hfil\break
    \hfil Right line 2\hfil\break
    \hfil Right line 3\hfil\break
    \hfil Right line 4
    \tabularnewline
    \hline
\end{tabularx}

因此我们可以看到 raggedleft 环境中每个 \newline 之前的最后一行将居中,这解释了为什么它看起来像这样: 输出

这实际上与表格环境无关 - 它纯粹与 flushright 环境和\newline命令有关。

从上面我们可以看出,使用\linebreak命令来代替应该是完全安全的,因为由于 raggedleft 环境,每行的水平空间已经被填充。​​或者,可以使用普通的\break,或冗余的\hfil\linebreak(但不是\hfil\break!)。

附言:如果有经验丰富的人可以评论我的答案,看看我是否理解正确,我将不胜感激。此外,如果他们可以评论一下 和 之间的区别\break\linebreak事实上\newline,我在任何地方都找不到 的实际定义\newline,所以如果有人能对此发表评论,那也很好。否则,我会将其中一些作为新问题提出。

相关内容