以下哪三种方法可以正确处理 sagetex 的数值输出siunitx
?以及如何正确地执行此操作?
\documentclass{article}
\usepackage{sagetex,siunitx,mathtools}
\begin{document}
\begin{sagesilent}
from sage.calculus.calculus import at
f(x) = exp(x) * sin(2*x)
out1 = r"\num{%f}"%(numerical_approx(diff(f(x),x,2).subs(x=2))
out2 = numerical_approx(diff(f(x),x,2).subs(x=2))
\end{sagesilent}
%\num[round-precision=2]{numerical_approx(diff(f(x),x,2).subs(x=2)} or
\sagestr{out1} or
%\num[round-precision=3]{out2}
\end{document}
答案1
在你给出的 3 种方法中,只有\sagestr{out1}
一种有成功的机会。这是因为它有 3 个步骤的编译过程:首先运行的是 LaTeX并且编译时必须没有错误,第二个是 Sage,第三个是 LaTeX,将 Sage 结果替换为 LaTeX 代码。粗体部分解释了为什么其他 2 种方法无法按原样工作(expl3
我认为使用代码是可行的,因为之前的一些问题中出现了这种情况。请参阅 frougon 的回答这里例如)。第一次运行 LaTeX 代码时,给出的是,\num[round-precision=2]{numerical_approx(diff(f(x),x,2).subs(x=2)}
它会抛出一个错误,因为 Sage 还没有运行,所以尝试在其上运行 LaTeX 是没有意义的。同样\num[round-precision=3]{out2}
,Sage 还没有运行,sagesilent
所以现在您要尝试处理 out2,它不是一个数字。使用第一次使用 LaTeX 时给出的代码,文档为空。第二次运行 Sage 并out1 = r"\num{%f}"%(numerical_approx(diff(f(x),x,2).subs(x=2))
进行计算。第三次运行并sagestr
进行处理,获取所表示的字符串out1
并对其进行排版。由于您已经加载了siunitx
包,因此它会编译而没有错误。对我来说没有意义的是要siunitx
格式化您的数字,而没有它就可以完成。这使得在 Sage 中有一个数字(例如 4.2499999995)成为可能,将其放入 a 中\num
作为 4.25 并四舍五入为 4.3。您可以只使用 Sage 来处理数字格式。
以下是对您的代码的修改,以说明一些可能性:
\documentclass{article}
\usepackage{sagetex,siunitx,mathtools}
\begin{document}
\begin{sagesilent}
from sage.calculus.calculus import at
f(x) = exp(x)*sin(2*x)
out = r"%f"%(n(diff(f(x),x,2).subs(x=2)))
out1 = r"%4.2f"%(n(diff(f(x),x,2).subs(x=2)))
out2 = r"%f"%(n(diff(f(x),x,2).subs(x=2),digits=5))
out3 = r"\num{%f}"%(n(diff(f(x),x,2).subs(x=2)))
\end{sagesilent}
\noindent \sagestr{out} is the number with all its float digits or\\
\sagestr{out1} is the number with least 4 spaces, 2 digits for the decimal or\\
\sagestr{out2} there are 5 significant digits for float length number or\\
\sagestr{out3} puts the full float into macro for processing.
\end{document}
尝试更改out1 = "%4.2f"%(n(diff(f(x),x,2).subs(x=2)))f"%(n(diff(f(x),x,2).subs(x=2)))
为out1 = r"%4.4f"%(n(diff(f(x),x,2).subs(x=2)))
,你会看到数字被四舍五入。在%4.2f
数字中,如 1/2 将变成 .50(占用 3 个空格),前面会多一个空格。这可以用作我的触发表以获得数据的对齐。
编辑:我忘了提两件事。第一,它n()
是numerical_approximation()
。参见这里在文档中(靠近顶部)。第二个是解决代码中的错误。当我在 Cocalc 中运行它时,我看到:
错误告诉我它与行有关out2 = numerical_approx(diff(f(x),x,2).subs(x=2))
,由于^
指向开头,我怀疑是该行之前的行。当我单击行末时,它会以绿色显示 last与from)
匹配。这意味着您缺少一个括号来与from匹配。将您的代码更改为,它将运行。(
(diff
(
(num
out1 = r"\num{%f}"%(numerical_approx(diff(f(x),x,2).subs(x=2)))