不一致的 ulem(与 textbf 和 textit)

不一致的 ulem(与 textbf 和 textit)

使用最新 (2012-05-18)乌莱姆字体发生变化后,包会根据下划线文本的位置分别给出不一致的下划线:

\documentclass{article}
\usepackage{ulem}

\begin{document}
  \textbf{foo} \dashuline{bar}\par
  \textit{foo} \dashuline{bar}\par
  f \dashuline{bar}\par
  fo \dashuline{bar}\par
  foo \dashuline{bar}\par
  foof \dashuline{bar}\par
  foofo \dashuline{bar}\par
\end{document}

导致

在此处输入图片描述

具有不同的 a) 破折号数量和 b) 相对于下划线单词的水平位置。有没有办法获得一致的(\dashuline{bar}在所有上述位置看起来完全相同)下划线?

答案1

ulem用于\leaders重复下划线元素。例如,\leaders在目录中用于虚线。然后点在页面上垂直对齐。

该包文件ulem.sty在注释中指出:

% 以上就是基本的下划线。要将各种其他对象
%(字符)放在文本下方(或上方),我们需要定义\markoverwith
% 以将覆盖材料设置在框中,并使用该框的引线
% 覆盖文本。这里, 的含义\UL@pixel发生了变化,
因此“像素”大小 = 框大小。请注意,我们通常需要\leaders
%(而不是\cleaders)来表示文本,因为下划线将是
小的拼凑物 % \leaders,并且字符必须保持对齐。
% 但是,我们“钩住”引线命令,以便特定应用程序可以
% 重新分配它(\let\ULleaders\xleaders\let\ULleaders\cleaders)。

三种变体的比较:

  1. \leaders:盒子单元在页面上垂直对齐。
  2. \cleaders:盒子单元居中,剩余空间放在待填充空间的左右两侧。
  3. \xleaders:框单元被拉伸以填充空间。这意味着,线条之间的距离可以变化。

测试文件:

\documentclass{article}
\usepackage{ulem}

%\let\ULleaders=\leaders % default
%\let\ULleaders=\cleaders
%\let\ULleaders=\xleaders

\begin{document}
  \texttt{\meaning\ULleaders}\par
  \textbf{foo} \dashuline{bar}\par
  \textit{foo} \dashuline{bar}\par
  f \dashuline{bar}\par
  fo \dashuline{bar}\par
  foo \dashuline{bar}\par
  foof \dashuline{bar}\par
  foofo \dashuline{bar}\par
  foofo \dashuline{bari}\par
\end{document}

<code>\leaders</code>     <code>\cleaders</code>     <code>\xleaders</code>

答案2

使用 TikZ(参见如何编写 \underline 文本但带有虚线)解决了这个问题,并且还允许进行花哨的自定义(但禁止在带下划线的单词内换行):

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathmorphing} % only for squigglies

\newcommand{\dashuline}[1]{%
  \tikz[baseline=(todotted.base)]{
    \node[inner sep=1pt,outer sep=0pt,draw=none] (todotted) {#1};
    \draw[densely dashed] (todotted.south west) -- (todotted.south east);
  }%
}%

\newcommand{\squigglies}[1]{%
  \tikz[baseline=(squiggled.base)]{
    \node[inner sep=1.25pt,outer sep=0pt,draw=none] (squiggled) {#1};
    \draw[decorate,decoration={snake,amplitude=0.75pt,segment length=1ex}] (squiggled.south west) -- (squiggled.south east);
  }%
}%

\begin{document}
  \textbf{foo} \dashuline{bar} \squigglies{baz}\par
  \textit{foo} \dashuline{bar} \squigglies{baz}\par
  f \dashuline{bar} \squigglies{baz}\par
  fo \dashuline{bar} \squigglies{baz}\par
  foo \dashuline{bar} \squigglies{baz}\par
  foof \dashuline{bar} \squigglies{baz}\par
  foofo \dashuline{bar} \squigglies{baz}\par
\end{document}

随附示例的排版输出

答案3

还有原因用于\leaders和的\dashuline\uwave每个单词和每个空格都单独加下划线,并且只\leaders保持部分同步,以确保所有破折号的间距相等并且所有波浪线都正确连接。

可以制作一个仅使用一个段的变体版本,禁止换行和灵活间距,这样可以与\cleaders短参数(不需要换行)很好地配合。

尝试...

\let\origDUL\dashuline
\protected\def\dashuline#1{\leavevmode\begingroup
  \settowidth{\dimen0}{#1}\ifdim\dimen0>3em 
  \origDUL{#1}\else
  \let\ULleaders\cleaders\origDUL{\mbox{#1}}\fi
  \endgroup}

测试...

\let\ULleaders=\leaders % default
\texttt{\meaning\ULleaders}\par
f \dashuline{bar} and \dashuline{The box units are stretched to fill the space.}\par
fo \dashuline{bar} and \dashuline{The box units are stretched to fill the space.}\par
foo \dashuline{bar} and \dashuline{The box units are stretched to fill the space.}\par
foof \dashuline{bar} and \dashuline{The box units are stretched to fill the space.}\par
foofo \dashuline{bar} and \dashuline{The box units are stretched to fill the space.}\par
foofo \dashuline{bar} and \dashuline{The box units are stretched to fill the space.}\par

相关内容