tikz/pgf 图形标签中的漂亮打印数学

tikz/pgf 图形标签中的漂亮打印数学

我有tikz/pgfplots带数学标签的图形,希望能够用不同的值重现它们。我正在使用代码定义值,如\def\a{1}文档顶部所示,因此我可以通过更改硬编码值轻松重现图形,例如\def\a{2}。所涉及的计算很简单,但它们确实涉及取逆并乘以 1,我希望在打印的标签中看到这些操作得到很好的简化。有没有简单的方法可以(至少)实现以下目标?

\documentclass[varwidth,border=5pt]{standalone}
\usepackage{mathtools}

% \usepackage{tikz,pgfplots,calc}% I use these packages already

\def\a{0.5}
\def\ia{2}% inverse of a

\def\b{1}

\begin{document}

Default:
\begin{align*}
1/\a x + \b y
\end{align*}


Desired:
\begin{align*}
\ia x + y
\end{align*}

\end{document}

在此处输入图片描述

有专用包吗?也许latex3语法可以帮到你?我已经在用了tikz/pgfplots/calc

编辑:跟进 Peter 的回答。一个简单的改变方法1x是,例如,使用包来x条件化存在:1ifthen

\usepackage{ifthen}
\newcommand{\FormatNumber}[1]{%
  \ifthenelse{\equal{#1}{1}}
    {}{\pgfmathsetmacro{\temp}{#1}%
       \pgfmathprintnumber{\temp}}}%

答案1

您可以尝试使用\pgfmathprintnumber(以及/pgf/number format/frac)来格式化数字。

在此处输入图片描述

未来的增强功能:

  • 其中一个是提供带星号的变体,以抑制 ,1以便1x可以打印为x

代码

\documentclass{article}
\usepackage{mathtools}
\usepackage{tikz}

\usetikzlibrary{fpu}
\pgfkeys{/pgf/number format/frac}

\newcommand{\FormatNumber}[1]{%
    \pgfmathsetmacro{\temp}{#1}%
    \pgfmathprintnumber{\temp}%
}

\def\a{0.5}
\def\b{0.3333333333333}
  
\begin{document}

Default:  $1/\a x + \b y$

Using \verb|\pgfmathprintnumber|:
$\FormatNumber{1/\a} x + \FormatNumber{\b} y$

\end{document}

答案2

这个问题可以通过以下方法解决鼠尾草软件包可以让你访问开源 CAS,名为智者和 Python 编程语言。Python 允许您根据需要制作打印外观。我看到了 3 种情况:if a.denominator() == 1:检查数字是否为整数,以便可以以特定方式排版。情况 2a 是if a.numerator()==1:检查分数的分子是否为 1(我们不希望将 1/4 打印为 4/1),情况 2b 是当输入是分子不是 1 的分数时。在这种情况下,我们希望在 LaTeX 中将数字排版为分数,以便看起来更美观。

\documentclass[varwidth,border=5pt]{standalone}
\usepackage{mathtools,amsmath,sagetex}
\usepackage{tikz,pgfplots,calc}% I use these packages already
\begin{document}
\begin{sagesilent}
def prettyprint(a,b):
    if a.denominator() == 1:
        output = r"\begin{align*}"
        output += r"%s x+%s y"%(a,b)
        output += r"\end{align*}"
    else:
        if a.numerator()==1:
            output = r"\begin{align*}"
            output += r"%s x+%s y"%(a.denominator(),b)
            output += r"\end{align*}"
        else:
            output = r"\begin{align*}"
            output += r"\frac{%s}{%s} x+%s y"%(a.denominator(),a.numerator(),b)
            output += r"\end{align*}"

    return output
a = 1/2
b = 1
result = prettyprint(a,b)
\end{sagesilent}
\sagestr{result}
\end{document}

输出运行可钙在下面: 在此处输入图片描述

我做了一个简化的假设,即输入是分数形式。如果您不介意额外的复杂性,您可以编程将十进制数转换为分数。有理数的 SAGE 命令是这里。如果你不熟悉 Python,那会更加头疼,但学习它会更容易,而且你会发现这个sagetex包对于任何数学工作都极其重要。

SAGE 不是 LaTeX 发行版的一部分,因此需要将其下载到您的计算机上或通过免费的 Cocalc 帐户访问。

相关内容