如果您编译下面的 XeLaTeX,您将看到输出与文本粗体部分不符合预期,即:
underline underline boldboldbold
换句话说,内部粗体元素的间距灵魂似乎\ul
不存在。人们会期望:
underline underline bold bold bold
我已经将问题缩小到ragged2d
使用 Minion Pro 字体时的软件包(尽管使用其他字体也可以重现此问题)。此问题也出现在宏中,例如\textit
。
下面演示了这个问题。
\documentclass{article}
\usepackage{soul}
\usepackage{ragged2e}
\begin{document}
\ul{underline underline \textbf{bold bold bold}}
\end{document}
确定问题后,我注意到一种解决方法正在使用,{\bfseries{}bold bold bold}
但有时会导致“重建失败”错误,无论如何,我很好奇这里发生了什么。
另一个解决方法,似乎比 更强大bfseries
,就是结束然后重新开始下划线,以便 封装textbf
ie ul
。\ul{underline underline }\textbf{\ul{bold bold bold}}
每当字体发生变化时,我们都可以结束然后重新开始下划线。
答案1
问题在于软件包不兼容soul
以及ragged2e
处理\spaceskip
。
软件包soul
将字体的字间间距设置保存在 中的跳过寄存器\SOUL@spaceskip
中\SOUL@start
。在驱动程序的前言中ul
,\spaceskip
设置为\SOUL@spaceskip
。稍后\spaceskip
在 中用于\SOUL@uleveryspace
设置间距:\hskip\spaceskip
。
包ragged2e
加载包everysel
以添加其单词间空间修改来抑制拉伸分量。但是,
\spaceskip
如果没有强制进行对齐,它将重置为零。
现在,下划线文本内的字体将切换为粗体。如果ragged2e
已加载包,则\spaceskip
设置为零。下划线驱动程序everyspace
的处理程序随后设置为单词间空格,这意味着没有空格,因为是零。soul
\hskip\spaceskip
\spaceskip
soul
以下示例尝试修复驱动程序的问题ul
:so
\documentclass[oneside,12pt]{memoir}
% for bold typewriter font
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{soul}
\usepackage{ragged2e}
\usepackage{etoolbox}
\makeatletter
\newif\if@inside@soul
\newif\if@inside@soul@ul
\g@addto@macro\SOUL@ulpreamble{%
\@inside@soul@ultrue
}
\patchcmd\SOUL@start{\SOUL@preamble}{\@inside@soultrue\SOUL@preamble}
{}{\errmessage{Cannot patch \protect\SOUL@start}}
\renewcommand{\@raggedtwoe@everyselectfont}{%
\if@raggedtwoe@spaceskip
\ifdim\fontdimen\thr@@\font=\z@\relax
\if@inside@soul
\if@inside@soul@ul
\spaceskip\fontdimen\tw@\font
\@minus\fontdimen4\font
\fi
\else
\spaceskip\z@
\fi
\else
\spaceskip\fontdimen\tw@\font
\fi
\else
\if@inside@soul
\if@inside@soul@ul
\spaceskip\fontdimen\tw@\font
\@plus\fontdimen\thr@@\font
\@minus\fontdimen4\font
\fi
\else
\spaceskip\z@
\fi
\fi
}
\makeatother
\begin{document}
\noindent
\ul{underline underline \textbf{bold bold bold}}\\
\so{letter spacing \textbf{bold bold bold}}
\RaggedRight\ttfamily
\ul{underline underline \textbf{bold bold bold}}\\
\so{letter spacing \textbf{bold bold bold}}
\end{document}