在 tikz 数学环境中格式化数字

在 tikz 数学环境中格式化数字

当使用 pgf/tikz 中的数学库时,您可以将变量声明为 int,在这种情况下它会自动格式化为整数。

我遇到的问题是,如果计算涉及大数字,则会出现“维度太大”错误,可以使用 fpu 库来处理。但是,这似乎会导致所有数字都被格式化为浮点数。

这是一个最简单的例子,一切正常:

\documentclass{amsart}
\usepackage{tikz}
\usetikzlibrary {math}

\begin{document}
\tikzmath{
   int \foo,\foobar;
   \foo = 2;
   \foobar = \foo^10;
}

\begin{align*}
  \text{foobar} &= \foobar\\
\end{align*}

然而,将数学环境改为

\tikzmath{
   int \foo,\foobar,\foobaz;
   \foo = 2;
   \foobar = \foo^10;
   \foobaz = \foo^20;
}

产生“尺寸太大”错误,并打印 foobaz 的错误值。

可以通过加载 fpu 库来解决此问题,但会牺牲一些简单性。

\documentclass{amsart}

\usepackage{tikz}
\usetikzlibrary{math}

\begin{document}
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}
\pgfkeys{/pgf/number format/.cd,fixed,precision=2}

\tikzmath{
   int \foo,\foobar,\foobaz;
   \foo = 2;
   \foobar = \foo^10;
   \foobaz = \foo^20;
}

\begin{align*}
  \text{foobar} &= \foobar\\
  \text{foobaz} &= \foobaz\\
  \text{foobaz formatted} &= \pgfmathprintnumber{\foobaz}
\end{align*}

\end{document}

请注意,尽管这些是整数变量,但它们仍会以浮点形式打印,除非使用 \pgfmathprintnumber 明确格式化。如果使用此方法排版复杂的部分,则会变得相当混乱。

这是预期的行为吗?默认情况下,正确格式化(大)整数的标准方法是什么?

答案1

可能不如OP期望的那么优雅,但\tikzmath在之前声明整数变量\newcount,然后通过前置使用这些变量的值\the似乎是可行的。

\documentclass{amsart}

\usepackage{tikz}
\usetikzlibrary{math}

\begin{document}
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}
\pgfkeys{/pgf/number format/.cd,fixed,precision=2}

\newcount\foo
\newcount\foobar
\newcount\foobaz
\tikzmath{
   \foo = 2;
   \foobar = \foo^10;
   \foobaz = \foo^20;
}

\begin{align*}
  \text{foobar} &= \the\foobar\\
  \text{foobaz} &= \the\foobaz\\
  \text{foobaz formatted} &= \pgfmathprintnumber{\the\foobaz}
\end{align*}

\end{document}

在此处输入图片描述

答案2

不确定这是否有用,但您可以设置自己的数字格式,使其产生整数。这可以通过查找定义/pgf/fpu/output format/fixed并进行最小损害操作来实现。可以通过 构建一个开关,以不同方式处理整数和非整数\pgfmathifisint

\documentclass{amsart}

\usepackage{tikz}
\usetikzlibrary{math}
\makeatletter
\pgfkeys{/pgf/fpu/output format/fixed int/.code={%
        \def\pgfmathfloatparse@output@choice{F}%
        \def\pgfmathfloatparse@output{%
            \pgfmathifisint{\pgfmathresult}{%
                \pgfmathfloattoint{\pgfmathresult}}{%
                \pgfmathfloattofixed@{\pgfmathresult}}%
        }%
    }}
\makeatother
\begin{document}
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed int}
\pgfkeys{/pgf/number format/.cd,fixed,precision=2}

\tikzmath{
   int \foo,\foobar,\foobaz;
   \foo = 2;
   \foobar = \foo^10;
   \foobaz = \foo^20;
   \foobuz = (\foo+0.1)^20;
}
\pgfkeys{/pgf/fpu=false}
\begin{align*}
  \text{foobar} &= \foobar\\
  \text{foobaz} &= \foobaz\\
  \text{foobuz} &= \foobuz\\
  \text{foobaz formatted} &= \pgfmathprintnumber{\foobaz}
\end{align*}

\end{document}

在此处输入图片描述

相关内容