我非常清楚,这是最佳实践不是除了打字机和手写之外,还可以使用下划线。但有时还是需要的。
在我看来,印刷时最不冒犯的下划线方法是省略下划线。这也是我学会用手写方法的方法。很少有字体提供预制的下划线变体,但有些文本处理器(例如 OS X 文本引擎)可以(取决于所使用的字体)模拟这种效果,效果还算可以接受:
我该如何调整现有的方法/包来实现相同的效果?
作为奖励,我希望能够根据字体和文本样式调整行为(省略部分的范围、应用于哪些字母),最好与 XeLaTeX 一起使用。
答案1
我们可以对每个字母这样做:
- 制作下划线
- 用相同但更粗的字母或向左和向右移动的字母覆盖该行,但使用背景或白色
- 写信
因此我们会得到一条具有匹配间隙的下划线。
这里我soul
这样修改了 Marco 的方法,只是为了演示我的意思,可以改进(加粗,循环):
\setcounter{errorcontextlines}{999}
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage{soul}
\usepackage{color}
\makeatletter
\newcommand*{\whiten}[1]{\llap{\textcolor{white}{{\the\SOUL@token}}\hspace{#1pt}}}
\DeclareRobustCommand*\myul{%
\def\SOUL@everyspace{\underline{\space}\kern\z@}%
\def\SOUL@everytoken{%
\setbox0=\hbox{\the\SOUL@token}%
\ifdim\dp0>\z@
\raisebox{\dp0}{\underline{\phantom{\the\SOUL@token}}}%
\whiten{1}\whiten{0}%
\whiten{-1}\whiten{-2}%
\llap{\the\SOUL@token}%
\else
\underline{\the\SOUL@token}%
\fi}%
\SOUL@}
\makeatother
\begin{document}
\sffamily\Huge
\myul{jumping quickly}
\end{document}
答案2
这是一个使用contour
和ulem
包的解决方案。
在我看来,这会产生非常好看的下划线,特别是对于标题下划线:
\documentclass{article}
\usepackage[outline]{contour}
\usepackage{ulem}
\normalem % use classical emph
\newcommand \myul[4]{%
\begingroup%
\renewcommand \ULdepth {#1}%
\renewcommand \ULthickness {#2}%
\contourlength{#3}%
\uline{\phantom{#4}}\llap{\contour{white}{#4}}%
\endgroup%
}
\newcommand \myulline[4]{%
\begingroup%
\renewcommand \ULdepth {#1}%
\renewcommand \ULthickness {#2}%
\contourlength{#3}%
\noindent\rlap{\uline{\hspace{\textwidth}}}\contour{white}{#4}%
\endgroup%
}
\begin{document}
\bfseries
\Huge
\myulline{5pt}{1pt}{2pt}{Chapter Eight}
\vspace{1cm}
\normalsize
\normalfont
Test. \myul{2pt}{0.5pt}{1pt}{Quit jumping quickly!} Test.
Test. \myul{1.2pt}{0.5pt}{0.5pt}{Quit jumping quickly!} Test.
\end{document}
输出:
特写:
缺点是下划线深度不能非常接近基线,因为它可能会被轮廓隐藏。
答案3
只是因为我觉得它很有用,这里是对上面 Stefans 答案的修改,它允许您控制下划线的深度、厚度和宽度。例如,对于更大或更粗的字体,这可能会很有用。语法是: \varul<width>[depth][thickness]{stuff}
其中:
<width>
是可选的,并以 的倍数给出1/100 em
,例如,<10>
将给出 的间隙宽度0.1em
。默认值为5
[depth]
是可选的,并以正值(包括单位)给出,指定在基线下方绘制下划线的距离。默认值为0.2ex
。[thickness]
是可选的,并以正值(包括单位)给出,指定下划线的粗细。默认值为0.1ex
- 第四个参数,也是强制性的参数,是您想要强调的内容。
这将适用于各个段落和换行符,但可能会稍微改变间距。
\documentclass{article}
\usepackage{soul}
\usepackage{xcolor}
\usepackage{xparse}
\makeatletter
\ExplSyntaxOn
\cs_new:Npn \white_text:n #1
{
\fp_set:Nn \l_tmpa_fp {#1 * .01}
\llap{\textcolor{white}{\the\SOUL@syllable}\hspace{\fp_to_decimal:N \l_tmpa_fp em}}
\llap{\textcolor{white}{\the\SOUL@syllable}\hspace{-\fp_to_decimal:N \l_tmpa_fp em}}
}
\NewDocumentCommand{\whiten}{ m }
{
\int_step_function:nnnN {1}{1}{#1} \white_text:n
}
\ExplSyntaxOff
\NewDocumentCommand{ \varul }{ D<>{5} O{0.2ex} O{0.1ex} +m } {%
\begingroup
\setul{#2}{#3}%
\def\SOUL@uleverysyllable{%
\setbox0=\hbox{\the\SOUL@syllable}%
\ifdim\dp0>\z@
\SOUL@ulunderline{\phantom{\the\SOUL@syllable}}%
\whiten{#1}%
\llap{%
\the\SOUL@syllable
\SOUL@setkern\SOUL@charkern
}%
\else
\SOUL@ulunderline{%
\the\SOUL@syllable
\SOUL@setkern\SOUL@charkern
}%
\fi}%
\ul{#4}%
\endgroup
}
\makeatother
\begin{document}
\varul{\Huge jumping quickly}\par\smallskip
\varul[1pt][1pt]{\Huge jumping quickly}
\end{document}
Tobi 编辑: \fp_mul:Nn
在当前的 TeXlive 中不起作用,因此我用 替换了这两行\fp_set:Nn \l_tmpa_fp {#1 * .01}
。
答案4
我使用了 CDSousa 答案的以下改编版,原因有二:首先,XCharter + 轮廓由于某种原因看起来比其他文本更粗糙;其次,为了允许紧密下划线(CDSousa 指出的缺点):
\usepackage{ulem}
\normalem % use classical emph
\usepackage{color}
\usepackage{pgffor}
\newcommand\myul[4]{% arg 1: underline depth; arg 2: underline thickness; arg 3: space around descenders in pt (!)
\begingroup%
\renewcommand\ULdepth{#1}%
\renewcommand\ULthickness{#2}%
\uline{\phantom{\smash{#4}}}%
\foreach \hshift in {0.0, 0.1, ..., #3}{%
\foreach \upshift in {-0.4, -0.3, ..., 1.0}{%
\llap{\color{white}\raisebox{\upshift0pt}[0pt]{#4}\hspace{\hshift0pt}}%
\llap{\color{white}\raisebox{\upshift0pt}[0pt]{#4}\hspace{-\hshift0pt}}%
}%
}%
\llap{#4}%
\endgroup%
示例:\myul{1.75pt}{.5pt}{2}{Blupp of (that's \emph{of}, not \emph{off}, of course) a great Synopsis}
具有下划线深度1.75pt
、下划线厚度.5pt
和间距2pt
,看起来像