省略下划线

省略下划线

我非常清楚,这是最佳实践不是除了打字机和手写之外,还可以使用下划线。但有时还是需要的。

在我看来,印刷时最不冒犯的下划线方法是省略下划线。这也是我学会用手写方法的方法。很少有字体提供预制的下划线变体,但有些文本处理器(例如 OS X 文本引擎)可以(取决于所使用的字体)模拟这种效果,效果还算可以接受:

OS X TextEdit 下划线

我该如何调整现有的方法/包来实现相同的效果?

作为奖励,我希望能够根据字体和文本样式调整行为(省略部分的范围、应用于哪些字母),最好与 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

这是一个使用contourulem包的解决方案。

在我看来,这会产生非常好看的下划线,特别是对于标题下划线:

\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,看起来像这

相关内容