查找当前 siunitx 设置(或提取 expl3 键)

查找当前 siunitx 设置(或提取 expl3 键)

siunitx 包提供了一种格式化(SI)单位的方法。它具有大量内部设置,用户可以使用 进行设置\sisetup。例如,

\documentclass{article}
\usepackage{siunitx}
\begin{document}
  \sisetup{round-precision=2, round-mode=places, round-half=up}
\end{document}

将导致\num{4.485}打印4.49

我的问题是,如何提取当前设置锡安特克斯? 例如,上面round-precision设置为2。我怎样才能获得希尼奇告诉我这些?

(这希尼奇包使用解释3并且我不明白它使用的关键系统...)

答案1

LuaLaTeX可以解析导入的文件并访问其siunitx参数,甚至重新使用它们:

在此处输入图片描述

\documentclass{article}
\usepackage{luacode,siunitx}

\begin{luacode}
function SiunitxSplit ( file )
    local param
    local i = 1

    local f = assert(io.open(file, "r"))
    local t = f:read("*all")
    f:close()
    for param in t:gmatch ("\\sisetup(%b{})")
    do
        param = param:sub(2,-2)
        tex.print (i.."--"..param..":\\\\")
        param = param:gsub("%s","")
        param = param:gsub("([^,]+)",
            function (s)
            s=s:gsub("([^=]+)=([^=]+)" , "%1 is : %2")
            return s
            end
            )
        param = param:gsub(",","\\\\")
        tex.print (param.."\\paragraph{}")
        i = i + 1
    end
end

function UseSiunitxSettings ( nb , file )
    local param
    local list = {}
    local f = assert(io.open(file, "r"))
    local t = f:read("*all")
    f:close()
    for param in t:gmatch ("\\sisetup(%b{})")
    do
        param = param:sub(2,-2)
        table.insert (list, param)
    end
    tex.print ("\\sisetup{"..list[nb].."}" )
end
\end{luacode}

\newcommand{\SiunitxSplit}[1]{%
    \directlua{SiunitxSplit("#1")}
}

\newcommand{\UseSiunitxSettings}[2][1]{%
    \directlua{UseSiunitxSettings(#1 , "#2")}
}


\begin{document}

\SiunitxSplit{bob.tex}

\UseSiunitxSettings{bob.tex}

\num{3.14159}

\UseSiunitxSettings[2]{bob.tex}

\num{3.14159}

\end{document}

并且 bob.tex 包含以下部分:

\sisetup{round-precision=2, round-mode=places, round-half=up}
\sisetup{round-precision=3, round-mode=places, round-half=up}

答案2

正如评论中所观察到的,关键设置(大部分)存储在一组标记为的变量中私人的在 中siunitx。TeX 不会阻止您访问这些数据(它们是按照惯例而不是在任何技术层面上都是私有的),因此您可以阅读代码然后提取值。但是,这些数据是私有的是有原因的:记录访问数据的接口,并且应该有没有理由来访问它。

相关内容