看这个例子:
%! TEX program = xelatex
\documentclass{article}
\usepackage[scheme=plain]{ctex}
\ctexset{linestretch=0pt}
\xeCJKsetup{CJKglue={},CJKecglue={},RubberPunctSkip=false,CheckSingle}
% \usepackage{geometry}
\usepackage[newcommands]{ragged2e}
\AtBeginDocument{%
\raggedright%
\emergencystretch=3em%
\hbadness=10000%
}
\usepackage{zhlipsum}
\begin{document}
\ttfamily\zhlipsum
\end{document}
每段的最后一行没有正确对齐。例如,在第一段的末尾(字符应该垂直对齐):
但是,如果我注释掉该行\usepackage[newcommands]{ragged2e}
,那么这个问题就会消失。
奇怪的是,如果我取消注释\usepackage{geometry}
,那么无论有没有ragged2e
包都会得到相同的结果。
为什么geometry
包会影响的行为ragged2e
?这是某种错误吗ragged2e
?
答案1
\raggedright
标准版和ragged2e
包装版之间的区别\RaggedRight
在于,标准ragged2e
版的粗糙度较小,它只在右侧增加了有限的拉伸,这样可以防止某些行变得太短,然后允许文本拉伸空白,或者如果需要,可以连接单词以达到允许长度变化但又不会太短的行长。
通常,这种方法对拉丁文字很有效,但在这里效果不佳。字体设置允许每个字符之间有少量拉伸:典型的线条看起来像(通过\showoutput
)
...\hbox(8.08+1.90999)x345.0, glue set 0.48865
....\hbox(0.0+0.0)x0.0
....\TU/FandolFang-Regular(0)/m/n/10 水
....\glue 0.0 plus 0.15152
....\TU/FandolFang-Regular(0)/m/n/10 厂
....\glue 0.0 plus 0.15152
....\TU/FandolFang-Regular(0)/m/n/10 共
....\glue 0.0 plus 0.15152
由于所有字符的宽度相同,因此唯一看到不同延伸的行是在最后一行。
由于添加了\raggedright
无限(fil
)拉伸\rightskip
,因此从不使用这种字符间拉伸。但是\RaggedRight
,\rightskip
具有有限的拉伸量,因此字符总宽度与指定宽度之间的差异\textwidth
由所有具有有限拉伸的粘连共享,因此字符间间距被拉伸。除了最后一行之外,每行的拉伸量都相同,其中无限拉伸\parfillskip
意味着没有字符间拉伸,并且您会看到糟糕的对齐。
geometry
只是意外地修复了这个问题,因为在这个例子中,文本宽度更接近字符的精确倍数。
据我所知,对此的任何修复本质上都是撤消效果,ragged2e
因此最简单的方法是不使用该newcommands
选项,以\raggedright
保留其原来的含义,并且您需要\RaggedRight
获取ragged2e
版本。
我应该说这是基于查看 tex box 输出日志得出的第一原则。ctex 包可能对此有一个特定的修复。如果有知识渊博的人发布答案,我很乐意删除它,