排版带有连字符的长单词

排版带有连字符的长单词

我正在排版一本小说,其中几处包含非常长的大写字母串,这些字母被分成几组,每组之间用连字符隔开,类似于 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,你会得到稍微好一点的结果,因为它与microtypeLuaLaTeX 的配合比与 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}

相关内容