这是混合下划线和删除线这次,我特别感兴趣的是使用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}