使用 siunitx 将 pgfplots 排版轴单位设为倒数

使用 siunitx 将 pgfplots 排版轴单位设为倒数

pgfplots有一个库units,允许通过提供的轴标签排版单位x unit=<unit>。通过键\pgfplotsset{unit code/.code={\si{#1}}},可以使用优秀的排版单位siunitx

我的问题如下:当我提供带有负指数的单位时,例如\metre\per\second,它们被排版为m/s,而不是ms^{-1}我想要的(并且是 的标准行为siunitx)。我尝试将 设置unit code\si[per-mode=reciprocal]{#1},但它不会改变输出。如果我使用 提供单位x unit=\si{\metre\per\second},我会得到所需的输出,但我不想明确调用该命令,因为在我看来,如果我最终自己排版单位,那么\si使用该库的目的就会落空。units

梅威瑟:

\documentclass{article}
\usepackage{siunitx}
\usepackage{pgfplots}
\usepgfplotslibrary{units}
\pgfplotsset{unit code/.code={\si{#1}}}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
x unit=\metre\per\second, %This doesn't do what I want
y unit=\si{\metre\per\second}] %This does, but I don't want to type "\si{...}"
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案1

看起来pgfplots传递一些额外的信息,而不仅仅是单位本身。这让人困惑siunitx,它只寻找一个单位(否则它就无法处理单位)。所以我们需要删除额外的信息。正如在pgfplots - 使用 siunitx 的 x 单位我们还需要扩展所传递的信息,因为它被“存储”在pgfplots

\documentclass{article}
\usepackage{siunitx}
\usepackage{pgfplots}
\usepgfplotslibrary{units}
 \makeatletter
\pgfplotsset{
  unit code/.code 2 args=
    \begingroup
    \protected@edef\x{\endgroup\si{#2}}\x
} 
\makeatother
\begin{document}
\begin{tikzpicture}
\begin{axis}[
x unit=\metre\per\second, %This doesn't do what I want
y unit=\si{\metre\per\second}] %This does, but I don't want to type "\si{...}"
\end{axis}
\end{tikzpicture}
\end{document}

.code 2 args此处用于丢弃 中的第一个信息#1,而这正是主要问题所在。)


对于那些想知道一切的人来说,这是一个完整的故事。如果你看一下#1上面的实际内容,你会得到{}{\pgfkeysvalueof {/pgfplots/x\space unit}}。现在,问题在于括号。siunitx处理的第一阶段是\edef所有内容,这导致{}{\metre\per\second}\pgfkeysvalueof可扩展且单元宏受到保护)。第二步siunitx是寻找任何不是单元宏的东西,我称之为“文字”输入。这导致,它不为空,因此看起来像文字输入。因此,解决方案中的第一个“参数”会丢弃第一组括号,并取消第二个参数的括号。这意味着该值不包含“文字”项,并根据需要使用单元处理器{}{}进行处理。siunitx

如果有的话,生活就会变得有点复杂文字部分到单元,因为在某些情况下,扩展过程可能会在“错误”的时间发生。例如,如果需要.在文字单元中进行搜索和替换,就会发生这种情况。强制“预先”扩展也可以解决这个问题。

相关内容