在一个狭窄的、右边不规则的表格单元格中,一个长单词后面跟着一个短单词(例如“aaaaaaaaaaaaaa bbb”),如果第一个单词太宽,因此需要连字符(使用此解决方案),那么第二个单词就会出现在第三行,尽管第二行仍有足够的空间。
因此,
aaaaaaaaaa-
aaaa bbb
我懂了
aaaaaaaaaa-
aaaa
bbb
~
可以通过在两个单词之间使用 a 来避免这种情况,但可以自动避免吗?
列类型的小示例取自这里:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tabularx}
\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}
\title{tmp}
\begin{document}
\maketitle
\begin{tabularx}{50pt}{|L{50pt}|}
\hspace{0pt} Fooooo-ooo bar
\end{tabularx}
\end{document}
答案1
(请注意后面的空格\hspace
)
之所以需要多一行,是因为 TeX 避免在段落的最后一个换行符处使用连字符,这只是一个温和的提示,但这里几乎没有其他事情发生,使用连字符的缺点足以导致 TeX 生成一个额外的行来避免这种情况。通常情况下,tex 必须过度拉伸空白才能获得额外的行,而行数不足的惩罚会阻止这种情况的发生,但在这里,你将\raggedright
零惩罚无限拉伸到每一行,因此(从 TeX 的角度来看)拥有三行段落的成本相当低。如果将连字符的缺点设置为 0,那么它会选择一个两行的段落。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tabularx}
\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}
\title{tmp}
\begin{document}
\maketitle
\begin{tabularx}{50pt}{|L{50pt}|}
\finalhyphendemerits=0
\hspace{0pt}Fooooo-ooo bar
X\dotfill X
\end{tabularx}
\end{document}
答案2
借助ragged2e
包及其\RaggedRight
命令,您可以定义L
类型列,如以下示例所示。
在您的原始代码中,您使用了tabularx
宽度p
相同的类型列。这会导致出现框溢出警告,因为列实际上会比声明的 50pt 更宽,因为\tabcolsep
会添加 2* (=2*6pt)。\tabcolsep
是垂直线和文本开始/结束之间的小水平空间。因此,我添加了两个不会产生此警告的替代表。第一个替代方法完全不需要tabularx
,第二个使用左对齐的X
类型列。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tabularx}
\usepackage{ragged2e}
\newcolumntype{L}[1]{>{\RaggedRight\arraybackslash}p{#1}}
\begin{document}
\begin{tabularx}{50pt}{|L{50pt}|}
Fooooo-ooo bar
\end{tabularx}
\bigskip
Alternative without tabularx:
\begin{tabular}{|L{50pt}|}
Fooooo-ooo bar
\end{tabular}
\bigskip
Alternative with tabularx's X type column:
\begin{tabularx}{50pt}{|>{\RaggedRight\arraybackslash}X|}
Fooooo-ooo bar
\end{tabularx}
\end{document}