将 R yacas 方程转换为 LaTeX 而不求解
Convert R yacas equation to LaTeX without solving it
我想展示在 Ryacas 中使用 'TeXForm' 进行的分步计算。
为此,我必须能够从给定的方程式中获得 LaTeX。问题是 yacas 自动 在转换为 LaTeX 形式之前解决了它们。
如果我尝试在等式上应用 'TeXForm',我会得到它的简化版本。
例如:
exp1<-'D(x)Sin(x^2+y^2)+D(y)Sin(x^2+y^2)'
TeXForm(exp1)
我得到了:
" 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 公式?
我发现 TeXForm(deparse(x^2+x^2))
给出了正确的结果,但这不适用于导数。
对于衍生品:TeXForm(substitute("D(x) sin(x+y)"))
.
为了防止 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)"))
```
部分功能还可以:
例如:
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)))
给予:
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”
我想展示在 Ryacas 中使用 'TeXForm' 进行的分步计算。
为此,我必须能够从给定的方程式中获得 LaTeX。问题是 yacas 自动 在转换为 LaTeX 形式之前解决了它们。
如果我尝试在等式上应用 'TeXForm',我会得到它的简化版本。
例如:
exp1<-'D(x)Sin(x^2+y^2)+D(y)Sin(x^2+y^2)'
TeXForm(exp1)
我得到了:
" 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 公式?
我发现 TeXForm(deparse(x^2+x^2))
给出了正确的结果,但这不适用于导数。
对于衍生品:TeXForm(substitute("D(x) sin(x+y)"))
.
为了防止 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)"))
```
部分功能还可以:
例如:
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)))
给予:
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”