ragged2e 打破灵魂包 \textbf{} 间距

ragged2e 打破灵魂包 \textbf{} 间距

如果您编译下面的 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,就是结束然后重新开始下划线,以便 封装textbfie 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以下示例尝试修复驱动程序的问题ulso

\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}

结果

相关内容