改变 expl3 中的变量内容(siunitx)

改变 expl3 中的变量内容(siunitx)

语境:

我仍在努力寻找解决方案减号和数字之间的空格很窄。在研究了的源代码之后,siunitx我想我必须重新定义\c__siunitx_minus_tl,但不幸的是我对的了解latex3几乎不存在。

问题

如何重新定义命令latex3?我认为由于命令已经存在于包中,所以我可以只使用set一个新值

\tl_set:Nn \c__siunitx_minus_tl { + }

但这似乎没有任何影响。如何正确地做到这一点?

麦当劳

\documentclass{article}
\usepackage{siunitx}

\usepackage{expl3}

\ExplSyntaxOn
\AtBeginDocument{
   \tl_set:Nn \c__siunitx_minus_tl { + }
}
\ExplSyntaxOff

\begin{document}

    math mode $\num{-42}$

    text mode \num{-42}

\end{document}

[现阶段确切的替换符号并不重要,我的第一个目标是让替换起作用]

答案1

这里有两个独立的问题:如何重新定义变量内容以及如何改变您所看到的内容siunitx

在设置expl3变量方面,通常的做法是使用\<thing>_set:Nn。这里我们有一个标记列表,如果你把

\ExplSyntaxOn
\tl_show:N \c__siunitx_minus_tl
\ExplSyntaxOff

之后\begin{document}你会发现它已被改变。下面我将解释为什么它在输出中不起作用。

您会注意到,变量在形式上是一个常量 ( \c_...),因此我们不应尝试设置它。人们可能会争论这是否应该是一个常量,但从概念上讲,处理这种情况更“正确”的方法可以说是删除并重新创建

\cs_undefine:N \c__siunitx_minus_tl
\tl_const:N \c__siunitx_minus_tl { + }

(当然,结果大致相同:最终我们处理的是 TeX 宏。)

那么为什么你看不到任何变化?使用标准设置,siunitx使用数学模式打印数字,这意味着-直接传递:\c__siunitx_minus_tl不使用。你需要强制使用文本模式

\documentclass{article}

\usepackage{siunitx}

\sisetup{mode = text}
\ExplSyntaxOn
\cs_undefine:N \c__siunitx_minus_tl
\tl_const:Nn \c__siunitx_minus_tl { + }
\ExplSyntaxOff

\begin{document}
math mode $\num{-42}$

text mode \num{-42}
\end{document}

当然,expl3我们通常不鼓励更改来自其他代码的内部值。这里,siunitx一直是 的“测试用例”,expl3当编写当前代码时,接口方面所需的确切方法仍在完善中。我希望该软件包的 v3 版本具有更清晰的接口设置,可能包括 的公共名称\c__siunitx_minus_tl。(v3 的工作正在进行中:很棘手,但我希望可行。)

相关内容