使用最新 (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
)。
三种变体的比较:
\leaders
:盒子单元在页面上垂直对齐。\cleaders
:盒子单元居中,剩余空间放在待填充空间的左右两侧。\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}
答案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