在 Sage 中,如果不以某种方式简化表达式,似乎无法打印其 Latex 代码。例如,\sage(x/x)
应该转换为\frac{x}{x}
而不是 1,请参阅 ask.sagemath 上的这个问题:http://ask.sagemath.org/question/9698/latex-function-prevent-simplification/
我解决这个问题的方法是将表达式定义为 sage 中的字符串(sagesilent
在 sagetex 中使用)。然后我可以使用 将其自动转换为 sage 表达式sage_eval
。为了排版原始公式,我想将其打印到 latex 文档中并将其传递给某个 latex 命令,该命令将其转换为正确的 latex 数学表达式。
那么是否有任何 latex 包可以做到这一点?如果没有,您还有其他想法来实现这一点吗?
下面是一些伪代码,试图更清楚地表达我想要的内容:
\documentclass{article}
\usepackage{sagetex}
\begin{document}
\begin{sagesilent}
var('x')
fs = '3 + x**2 + x/x'
f = sage_eval(fs, locals={'x':x})
\end{sagesilent}
\sagetotex{fs} %f(x) without simplifying anything
\sagestr{f} %prints simplified f
\sagestr{diff(f,x)} % prints derivative of f
\end{document}
答案1
根据我对 Python (因此,在很大程度上,Sage) 表达式求值模型的理解,如果不使用您用字符串和 概述的内容,这通常是不可能的sage_eval
。当您执行 时\sage{some_expr}
,Sage 将在 ...latex()
上运行其功能some_expr
,但要做到这一点,它首先需要对其进行求值。
符号表达式对其自身结构有足够的了解,因此该hold=True
功能可以发挥作用,但对于任意的 Sage/Python 表达式来说,这并不适用。
至少目前看来,使用sage_eval
似乎是完成您要做的事情的最佳方法。
答案2
这是一个有趣的想法。我认为没有一个包可以做到这一点。将它添加到 sagetex 包中是最有意义的。也许你可以请求这里Dan Drake 在哪里提供了他的电子邮件?假设我明白你想要什么,那么实现起来就很容易了。
\documentclass{article}
\usepackage{sagetex}
\begin{document}
\newcommand{\sagetotex}[1]{\ensuremath{{#1}}}
\begin{sagesilent}
var('x')
fs = '3 + x**2 + x/x'
f = sage_eval(fs, locals={'x':x})
\end{sagesilent}
\noindent \ensuremath{\sagestr{fs}}\\%f(x) without simplifying
$\sage{f}$\\ %prints simplified f
$\sage{diff(f,x)}$\\ % prints derivative of f
\sagetotex{\sagestr{fs}}
\end{document}
由于该字符串用于表示数学内容的函数,因此在文档开头创建一个新命令(您建议为 \sagetotex),通过坚持在数学模式下排版参数,以便使用数学字体排版所有数学内容。