2

我想展示在 Ryacas 中使用“TeXForm”进行的逐步计算。
为此,我必须能够从给定的方程式中获得 LaTeX。问题是 yacas在转换为 LaTeX 形式之前会自动解决它们。如果我尝试在方程上应用“TeXForm”,我会得到它的简化版本。例如:

exp1<-'D(x)Sin(x^2+y^2)+D(y)Sin(x^2+y^2)'
TeXForm(exp1)

我有:

"$2 x \cos \left( x ^{2} + y ^{2}\right)  + 2 y \cos \left( x ^{2} + y ^{2}\right) $";

我试图获得非简化版本:

 yacas('TeXForm(exp1)')

我有:

"$\mathrm{ exp1 }$";

我也试过:

yacas('D(x)Sin(x^2+y^2)+D(y)Sin(x^2+y^2)')

它也没有工作。
如何获得所有衍生物的非简化 LaTeX 公式?

4

3 回答 3

1

为了防止 yacas 评估您的表达式,您可以使用Hold().

例如:您有一个表达式"Limit(x,0) Sqrt(x) * Sin(1/x)",并且您希望 yacas 解析它并将其转换为 LaTeX 格式,而不评估表达式。

像这样扩展你的表达式:

s <- "Limit(x,0) Sqrt(x) * Sin(1/x)" 
expanded_yacas_charstr <- paste("Hold(", s, ") == ", s, sep = "")

我创建了一个函数来在 Rmarkdown 文档中使用它,将输入函数及其结果作为组合的 LaTeX 结果返回。这可能对您有用:

```{r, results="asis", echo=FALSE}

  kalk <- function(s) {
  library("Ryacas")

  # Expand yacas expression
  # e.g. 
  #       Limit(x,0) Sqrt(x) 
  # is expanded to 
  #       Hold("Limit(x,0) Sqrt(x) == )" Limit(x,0) Sqrt(x)
  #
  # This prevents yacas to evaluate the text inside Hold()

  expanded_yacas_charstr <- paste("Hold(", s, ") == ", s, sep = "")

  s <- as.character(yacas(verbose=false,
                          TeXForm(expanded_yacas_charstr),
                          retclass = "unquote"))

  return(paste("$$ ", substr(s, 2, nchar(s)), "$", sep = ""))
}

# use cat() to make sure "[1]"" output is removed
cat(kalk("Limit(x,0) Sqrt(x) * Sin(1/x)"))
``` 
于 2018-09-20T11:54:49.697 回答
0

有些功能没问题:

例如 :

TeXForm(Hold(Integrate(a) (a^2+5)) ) 

给 :

$\int \left( a ^{2} + 5\right)  da$

但并非所有功能......这个不匹配:

TeXForm(substitute("D(x) sin(x+y)"))

但即使:

TeXForm(Hold(D(x)Sin(x^2+y^2)+D(y)Sin(x^2+y^2))) 

给 :

$2 x \cos \left( x ^{2} + y ^{2}\right)  + \frac{\partial}{\partial x}\left( 2 y \cos \left( x ^{2} + y ^{2}\right) \right) $

它在文档中:“ https://yacas.readthedocs.io/en/latest/reference_manual/controlflow.html#Hold

于 2020-01-28T17:14:05.517 回答
0

我发现这 TeXForm(deparse(x^2+x^2))给出了正确的结果,但这不适用于衍生品。
对于衍生品:TeXForm(substitute("D(x) sin(x+y)")).

于 2015-08-13T09:58:16.877 回答