使用间接格式的 Soul

使用间接格式的 Soul

我在用包裹soul省略下划线. 似乎将以下内容作为参数传递可以正常工作

 \textit{special text}

但如果\textit通过宏间接应用,\ApplyStyle则会出现错误:

\ApplyStyle 的参数有一个额外的}。

问题:

是否可以通过更改宏来间接应用样式\varul?如果不行,还有哪些其他选项可用(当然,除了在宏调用中直接应用格式外\varul——这太简单了 :-))?

代码:

\documentclass{article}
\usepackage{xparse}
\usepackage{xcolor}
\usepackage{soul}
\usepackage{xspace}


%% ----------------------------------------------------------------
%%                https://tex.stackexchange.com/questions/36894/
%%                    underline-omitting-the-descenders
%%
%%
\makeatletter
\ExplSyntaxOn
    \cs_new:Npn \white_text:n #1
      {
        \fp_set:Nn \l_tmpa_fp {.01}
        \fp_mul:Nn \l_tmpa_fp {#1}
        \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
%% ----------------------------------------------------------------

\newcommand{\ApplyStyle}[1]{\textit{#1}}%

\begin{document}
\varul{\textit{special text}\xspace}%      Works!!

\varul{\ApplyStyle{special text}\xspace}%  Does NOT work
\end{document}

答案1

soul逐个标记扫描文本标记,当输入流还包含宏时,这个过程很容易被搞乱。该包已经知道它应该保留字体切换命令——因此\textit在你的情况下可以工作——但会因未知宏而失败\ApplyStyle。幸运的是,有一个界面可以让你soul熟悉新的宏:\soulregister<command><identifier>,其中<identifier>可以是01参数数量(参见第 5.2 节文档;另请参阅这个答案以扩展以\soulregister接受更多(可能为可选)的参数)。

添加后您的示例运行良好

\soulregister\ApplyStyle{1}

回到序言。

相关内容