我正在排版一本小说,其中几处包含非常长的大写字母串,这些字母被分成几组,每组之间用连字符隔开,类似于 SIERRA-TANGO-CHARLIE-ECHO-YANKEE-OSCAR-MIKE-NOVEMBER-CHARLIE-VICTOR-WHISKEY-ALPHA-PAPA-BRAVO-UNIFORM。无论在何处出现这样的“单词”,TeX 引擎都很难排版它,因为它会超出页边距,并发出几页“Overfull \hbox”警告(好像 LaTeX 已经没有发出太多不必要的输出一样)。
\-
我不情愿地在字符串中添加了序列,这有助于 TeX 找到更好的单词分隔符(我更愿意将连字符信息放在不会分散注意力的地方,但\hyphenation
似乎不支持为带连字符的单词指定单词分隔符)。我还调整了\fontdimen
设置,在某些情况下这很有帮助,但仍然存在这样的“单词”开始一个段落并且\fontdimen
没有任何区别的情况,例如
“SIERRA-TANGO-CHARLIE-ECHO-YANKEE-OSCAR-MIKE-NOVEMBER-CHARLIE-VICTOR-WHISKEY-ALPHA-PAPA-BRAVO-UNIFORM-BLAH-BLAH-BLAH-BLAH-BLAH-BLAH”,汤姆说道。
有时溢出可能只有单个连字符;我尝试调整microtype
的字符突出设置来缓解这些情况,但我无法让它做任何事情。设置\emergencystretch
反而会产生下溢,而且看起来仍然很丑陋。
我还能做什么来解决这个问题?
我目前正在使用 XeLaTeX,并且不想更换引擎;我确实需要 XeTeX 的双向功能,而且我发现运行 LuaLaTeX 所需的时间太慢了。
答案1
当您使用 xetex 时,您可以设置字符类以在连字符周围插入一些胶水,以帮助断行并启用连字符。
\documentclass{article}
\usepackage{color}
\XeTeXinterchartokenstate=1
\newXeTeXintercharclass\hclass
\newXeTeXintercharclass\lclass
\XeTeXcharclass`\-=\hclass
\count0=`\a
\loop
\XeTeXcharclass\count0=\lclass
\ifnum\count0<`z
\advance\count0 1
\repeat
\count0=`\A
\loop
\XeTeXcharclass\count0=\lclass
\ifnum\count0<`Z
\advance\count0 1
\repeat
\count0=1
\XeTeXinterchartoks\hclass\lclass{\hskip0pt plus .3pt minus .1pt\relax}
\XeTeXinterchartoks\lclass\hclass{\nobreak\hskip0pt plus .2pt\relax}
\righthyphenmin=2
\hyphenation{BL-AH UNI-F-ORM AL-PHA}
\begin{document}
\noindent X\dotfill X
a ``SIERRA-TANGO-CHARLIE-ECHO-YANKEE-OSCAR-MIKE-NOVEMBER-CHARLIE-VICTOR-WHISKEY-ALPHA-PAPA-BRAVO-UNIFORM-BLAH-BLAH-BLAH-BLAH-BLAH-BLAH''
zzzzzzzzz ``SIERRA-TANGO-CHARLIE-ECHO-YANKEE-OSCAR-MIKE-NOVEMBER-CHARLIE-VICTOR-WHISKEY-ALPHA-PAPA-BRAVO-UNIFORM-BLAH-BLAH-BLAH-BLAH-BLAH-BLAH''
zzzzzzzzz jjjj axaxax axaxaxa axaxax ``SIERRA-TANGO-CHARLIE-ECHO-YANKEE-OSCAR-MIKE-NOVEMBER-CHARLIE-VICTOR-WHISKEY-ALPHA-PAPA-BRAVO-UNIFORM-BLAH-BLAH-BLAH-BLAH-BLAH-BLAH''
\noindent X\dotfill X
\end{document}
答案2
我建议你做三件事:
babel
按以下方式加载包:\usepackage[ngerman,english]{babel} \useshorthands{"} \addto\extrasenglish{\languageshorthands{ngerman}}
-
将长字符串中的所有 更改为"=
;这允许 LaTeX 为长字符串中的单词找到连字点(并在这些点处换行……)。将包含长字符串的段落封装在
sloppypar
环境中。
如下面的截图所示,结果保证是完美的,但比没有这些修改的结果要好得多。顺便说一句,如果你可以自由地使用 LuaLaTeX 而不是 XeLaTeX,你会得到稍微好一点的结果,因为它与microtype
LuaLaTeX 的配合比与 XeLaTeX 的配合更充分。
% !TeX program = xelatex
\documentclass{article}
\usepackage{fontspec,microtype}
\usepackage[ngerman,english]{babel}
\useshorthands{"}
\addto\extrasenglish{\languageshorthands{ngerman}}
\begin{document}
\hrule % just to illustrate width of textblock
\bigskip
\begin{sloppypar}
``SIERRA"=TANGO"=CHARLIE"=ECHO"=YANKEE"=OSCAR"=MIKE"=NOVEMBER"=CHARLIE"=VICTOR"=WHISKEY"=ALPHA"=PAPA"=BRAVO"=UNIFORM"=BLAH"=BLAH"=BLAH"=BLAH"=BLAH"=BLAH'', Tom said.
\end{sloppypar}
\bigskip
``SIERRA"=TANGO"=CHARLIE"=ECHO"=YANKEE"=OSCAR"=MIKE"=NOVEMBER"=CHARLIE"=VICTOR"=WHISKEY"=ALPHA"=PAPA"=BRAVO"=UNIFORM"=BLAH"=BLAH"=BLAH"=BLAH"=BLAH"=BLAH'', Tom said.
\bigskip
``SIERRA-TANGO-CHARLIE-ECHO-YANKEE-OSCAR-MIKE-NOVEMBER-CHARLIE-VICTOR-WHISKEY-ALPHA-PAPA-BRAVO-UNIFORM-BLAH-BLAH-BLAH-BLAH-BLAH-BLAH'', Tom said.
\end{document}