![tikz/pgf 图形标签中的漂亮打印数学](https://linux22.com/image/440732/tikz%2Fpgf%20%E5%9B%BE%E5%BD%A2%E6%A0%87%E7%AD%BE%E4%B8%AD%E7%9A%84%E6%BC%82%E4%BA%AE%E6%89%93%E5%8D%B0%E6%95%B0%E5%AD%A6.png)
我有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
条件化存在:1
ifthen
\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 帐户访问。