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
命令,如中所述7
1
这个答案。
答案2
如果您没有soul
因为其他原因而被束缚,那么修改后\xblackout
的censor
软件包可能足以完成这项任务。
已编辑,以修复换行问题。
\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}