Soul 的下划线遗漏了宏生成的文本

Soul 的下划线遗漏了宏生成的文本

ul提供的宏soul非常实用,允许在带下划线的文本块内换行。它甚至支持宏 - 如果它们已在 中注册soulregister

但如果这些注册的宏产生文本他们自己,它没有下划线:

\documentclass{article}

\usepackage{soul}

\newcommand{\one}[1]{\ul{#1}}
\newcommand{\two}[1]{not underlined #1}

\soulregister{\two}{1}

\begin{document}
test1 \one{test2 \two{test3}}.
\end{document}

“无下划线”没有下划线

我如何确保此文本下划线正确?

答案1

对于已注册的命令,soul将拆分字符串,将其基本上变成

\ul{first part}\command{\ul{second part}}

因此,如果\command生成任何文本,这将超出soul扫描仪的范围。要解决这个问题,您可以在将字符串输入到之前对其进行预扩展soul

\newcommand{\one}[1]{\protected@edef\@tempa{#1}\ul\@tempa}

编辑:另一种可能性是使用标识符而不是来注册您的\two命令,如中所述71这个答案

答案2

如果您没有soul因为其他原因而被束缚,那么修改后\xblackoutcensor软件包可能足以完成这项任务。

已编辑,以修复换行问题。

\documentclass{article}
%\usepackage{soul}
\usepackage{censor}
\censorruledepth=-.3ex
\censorruleheight=.1ex
\newlength\x
\makeatletter
\renewcommand\@cenword[1]{\censorrule{\widthofpbox{#1}}%
  \setlength{\x}{\widthofpbox{#1}}%
  \hspace{-\x}%
  #1}
\long\def\xblackout#1{\rule{0ex}{0ex}%
  \def~{-}%
  \def\@justpar{F}%
  \def\@justperiod{F}%
  \def\@justspace{F}%
  \protected@edef\save@arg{#1}%
  \expandafter\xcensor@Block\save@arg\stringend%
  \let~\sv@tilde%
 }
\makeatother
\newcommand{\one}[1]{\xblackout{#1}}
\newcommand{\two}[1]{not underlined #1}
%\soulregister{\two}{1}
\begin{document}
test1 \one{test2 \two{test3}}.
test1 \one{test2 \two{test3}}.
test1 \one{test2 \two{test3}}.
test1 \one{test2 \two{test3}}.
test1 \one{test2 \two{test3}}.
test1 \one{test2 \two{test3}}.
test1 \one{test2 \two{test3}}.
test1 \one{test2 \two{test3}}.
test1 \one{test2 \two{test3}}.
\end{document}

在此处输入图片描述

相关内容