\pgfmathprintnumber 用法的奇怪差异

\pgfmathprintnumber 用法的奇怪差异

在以下示例中,我遇到了奇怪的间距差异:

\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

到您的文档中。

相关内容