我有一个 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}