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