在以下示例中,我遇到了奇怪的间距差异:
\documentclass{article}
\usepackage{tikz}
\begin{document}
number printer inside of fbox with -5e-5:
\fbox{\pgfmathprintnumber{-5e-5}}
\fbox{$\pgfmathprintnumber{-5e-5}$}
\end{document}
我知道\pgfmathprintnumber
最终用途\pgfutilensuremath
定义为
\def\pgfutilensuremath#1{%
\ifmmode#1\else$#1$\fi
}
问题是:我怎样才能获得一致的行为?更准确地说:我怎样才能改变\fbox{\pgfmathprintnumber{-5e-5}}
(即改变 \pgfmathprintnumber
)以使其与其他语句执行相同的操作(反过来不是我的用例)。
请注意,这实际上是 pgfplots 中的回归:版本 1.4 使用第二种方法,而版本 1.5 使用第一种方法。我想保留第一种方法,但保留第二种方法的间距。
这是否与 TeX 的策略有关,即寻找下一个字符以$
查看它是否可能是$$
?如果是这样,我该如何避免它?
答案1
这是 pgfmath 中的一个错误。在一个地方,它用{}
而不是 来分隔一个组\begingroup ... \endgroup
。因此在第二个版本中,TeX 认为{}
内部数学模式导致它显示二进制减号而不是一元减号(尝试${}-5$
;在第一个版本中,您会得到类似的东西{}$-5$
,因此是一元间距)。
有问题的组位于\pgfmathfloatrounddisplaystyle@shared@impl@#1#2
和中\pgfmathfloatrounddisplaystyle@shared@impl@@#1#2
。因此,要修复它,您可以添加
\makeatletter
\def\pgfmathfloatrounddisplaystyle@shared@impl@#1#2{%
\begingroup\toks0={#1}%
\toks1=\expandafter{\pgfmathfloatrounddisplaystyle@e@mark #2}%
\xdef\pgfmathfloat@glob@TMP{\the\toks0 \the\toks1 }%
\endgroup%
\let\pgfmathresult=\pgfmathfloat@glob@TMP
}%
\def\pgfmathfloatrounddisplaystyle@shared@impl@@#1#2{%
\begingroup\toks0={#1}%
\toks1=\expandafter{\pgfmathfloatrounddisplaystyle@e@mark #2}%
\pgfkeysgetvalue{/pgf/number format/@dec sep mark}\pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP@MARK
\toks2=\expandafter{\pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP@MARK}%
\xdef\pgfmathfloat@glob@TMP{\the\toks0 \the\toks1 \the\toks2 }%
\endgroup%
\let\pgfmathresult=\pgfmathfloat@glob@TMP
}
\makeatother
到您的文档中。