\fp_mul:Nn 或解码并替换旧命令

\fp_mul:Nn 或解码并替换旧命令

我有一个 XeLaTeX 文档,它曾经可以工作,但今天却无法工作了,尽管我已经安装了texlive-full。该文档包含大量我从不同来源获取的神秘代码,现在不正确的部分位于神秘的一侧。

具体来说,有一个命令\varul可能会将字母转换为其变体或其他内容,我无法检查,因为文档无法编译。该命令的定义如下(连同最小运行示例)

\documentclass{article}
\usepackage{fontspec}
\usepackage{lmodern}
\usepackage{soul}
\usepackage{xcolor}


\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.33ex} 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

\begin{document}
    \varul{v}
\end{document}

搜索此卷轴的祖先只得到一个结果 https://github.com/dfm/imprs/blob/master/mcmc/dfm_stylez.tex。有趣的是,它存在于注释掉的状态。因此我不再知道,但这个友好的交流:

! Undefined control sequence.
\white_text:n ...et:Nn \l_tmpa_fp {.01}\fp_mul:Nn 
                                                  \l_tmpa_fp {#1}\llap {\tex...
l.47 ^^I\varul{v}

?

尝试使用 ^C 和 ^D 的随机组合返回命令行可能会给出更多提示:

? ^C! Interruption.
<to be read again> 
                   \s__fp 
l.47 ^^I\varul{v}

? 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! LaTeX error: "kernel/misused-fp"
! 
! A floating point with value '0.01' was misused.
! 
! See the LaTeX3 documentation for further information.
! 
! For immediate help type H <return>.
!...............................................  

l.47 ^^I\varul{v}

? ! Undefined control sequence.
<argument> \textcolor 
                      {white}{\the \SOUL@syllable }\hspace {\fp_to_decimal:N...
l.47 ^^I\varul{v}

? [1] (./test.aux
^C
! Interruption.
l.7397927

?

您能帮我用当前的 XeLaTeX 编译该文档吗?我想对于直接使用 TeX 的人来说这很容易。我只想编译该文档并使其看起来或多或少像它一样。

我愿意接受对 \varul 宏的任何修改。不幸的是,我不知道它究竟是如何改变/修饰字母的。可能是某种虚线下划线?能从它的定义中猜出来吗?

编辑:感谢 egreg 和 TeXnician。因此现在可以看到,此命令在文本周围添加了白色轮廓,这样它就不会与下划线冲突。我应该为其添加相关注释。Egreg 不希望他的答案被编辑,因此我添加了一个示例输出,该输出说明了轮廓:在此处输入图片描述

答案1

目前还不清楚这个宏的用途。不过,\fp_mul:Nn它已经不存在了。

\documentclass{article}
\usepackage{xparse}
\usepackage{lmodern}
\usepackage{xcolor,soul}

\makeatletter

\ExplSyntaxOn
\cs_new:Npn \white_text:n #1
  {
    \llap{\textcolor{white}{\the\SOUL@syllable}\hspace{\fp_eval:n{0.01*#1} em}}
    \llap{\textcolor{white}{\the\SOUL@syllable}\hspace{-\fp_eval:n{0.01*#1} em}}
  }
\NewDocumentCommand{\whiten}{ m }
    {
      \int_step_function:nnnN {1}{1}{#1} \white_text:n
    }
\ExplSyntaxOff

\NewDocumentCommand{ \varul }{ D<>{5} O{0.33ex} 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

\begin{document}

X\varul{abc def}X

X\varul<20>[1ex][1ex]{abc def}X

\end{document}

在此处输入图片描述

相关内容