后续:使用 soul 下划线 + 删除线

后续:使用 soul 下划线 + 删除线

这是混合下划线和删除线这次,我特别感兴趣的是使用soul(不需要多次编译即可稳定)。

我想用来soul创建一个(下划线)+(删除线)命令\textulst,该命令可以\textul与之结合\textst,但仍然允许在其中换行。

到目前为止,我无法正确地将两者结合起来,因为soul使用相同的下划线两个都(常规) 下划线和删除线。

这是我(未成功)生成的尝试\textulst

在此处输入图片描述

\documentclass{article}
\usepackage{soul}

\makeatletter
\def\SOUL@ulstunderline#1{{%
    \setbox\z@\hbox{#1}%
    \dimen@=\wd\z@
    \dimen@i=\SOUL@uloverlap
    \advance\dimen@2\dimen@i
    \rlap{% Draw underline
        \null
        \kern-\dimen@i
        \SOUL@ulcolor{\SOUL@ulleaders\hskip\dimen@}%
    }%
    \SOUL@stpreamble% Switch to draw over-strike
    \rlap{%
        \null
        \kern-\dimen@i
        \SOUL@ulcolor{\SOUL@ulleaders\hskip\dimen@}%
    }%
    \unhcopy\z@
}}
\def\SOUL@ulsteverysyllable{%
    \SOUL@ulstunderline{%
        \the\SOUL@syllable
        \SOUL@setkern\SOUL@charkern
    }%
}
\def\SOUL@ulstsetup{%
  \SOUL@ulsetup
  \let\SOUL@everysyllable\SOUL@ulsteverysyllable
}
\DeclareRobustCommand*\textulst{\SOUL@ulstsetup\SOUL@}

\makeatletter

\begin{document}
Here is \textul{some text}.

Here is \textst{some text}.

Here is \textulst{some text}.
\end{document}

答案1

以下是基于的解决方案soul

\documentclass{article}
\usepackage{soul}

\makeatletter
\newdimen\SOUL@ulstdp
\newdimen\SOUL@ulstht
\def\SOUL@ulstleaders{%
    \leaders
    \hbox
    {%
      \rlap{\vrule\@depth\SOUL@uldp\@height\SOUL@ulht\@width.1pt\relax}%
      \vrule\@depth\SOUL@ulstdp\@height\SOUL@ulstht\@width.1pt\relax
    }%
}
\def\SOUL@ulstpreamble{%
  \SOUL@ulpreamble
  \SOUL@ulstdp=\SOUL@uldp
  \SOUL@ulstht=\SOUL@ulht
  \SOUL@stpreamble
}
\def\SOUL@ulstsetup{%
  \SOUL@ulsetup
  \let\SOUL@preamble\SOUL@ulstpreamble
  \let\SOUL@ulleaders\SOUL@ulstleaders
}
\DeclareRobustCommand*\textulst{\SOUL@ulstsetup\SOUL@}

\makeatletter

\begin{document}
Here is \textul{some text}.

Here is \textst{some text}.

Here is \textulst{some text}.
\end{document}

示例输出

它基于在用于覆盖规则\leaders的构造中立即“堆叠”两个规则的想法soul。我不知道如何获得两个规则,因为灵魂严重依赖于\leaders支持拉伸单词间空间。

缺点是,当使用\leaders规则时(通常用于\ul\st\hl),规则将仅延伸到给定的引线长度,而当使用框时,规则需要具有预定义的宽度,然后该宽度将成为引线构造的最小长度。然后,框将根据需要多次复制以跨越给定的宽度。

我已将其用作.1pt框宽度。这意味着,如果soul尝试跨越比下划线更短的内容,则.1pt下划线中会有间隙。另一方面,使用较窄的框将大大增加执行时间和文件大小。

答案2

我意识到这并不能回答您的问题,因为它不是使用soul,而是censor根据我之前的几个类似的答案,显示了另一种使用方法:

\documentclass{article}
\usepackage{censor}
\usepackage{stackengine}
\usepackage{xcolor}
\usepackage{scalerel}
\newlength\uldepth
\newlength\rlwd
\def\ulcolor{black}
\rlwd=.8pt
\censorruledepth=2.5pt
\uldepth=-2pt

\makeatletter
\def\stacktype{L}
\periodrlap=0pt\relax
\afterperiodlap=0pt\relax
\lletterlap=0pt\relax
\rletterlap=0pt\relax
\afterspacelap=1.0ex\relax

\renewcommand\censorrule[1]{%
\protect\textcolor{\ulcolor}{\stackon[0pt]%
  {\rule[\uldepth]{#1}{\rlwd}}{\rule[\censorruledepth]{#1}{\rlwd}}}%
}

\renewcommand\@cenword[1]{%
  \setbox0=\hbox{#1}%
  \stackon[0pt]{#1}{\censorrule{\wd0}}%
}

\def\censordot{\textcolor{\ulcolor}{\rlap{\@cenword{\phantom{.}}}}.}

\makeatother
\parindent 0in
\parskip 1em
\begin{document}

This shows linebreaking capability: aaa aaa aaa aaa aaa aaa aaa
\xblackout{bbb bbb bbb bbb. bbb bbb bbb bbb bbb bbb}
ccc ccc ccc ccc ccc ccc

Can this \xblackout{procedure go across paragraphs boundaries?

Why yes} it can.![enter image description here][1]

But gaps can arise if glue is stretched too far.

\afterspacelap=1.7ex\relax
\xblackout{%
This tests marking a multiline block of text.  This tests marking a multiline block of text.
This tests marking a multiline block of text.  This tests marking a multiline block of text.
This tests marking a multiline block of text.}

\end{document}

在此处输入图片描述

相关内容