当使用 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}