是否有一种(希望是简单的)方法可以将数学 TeX 表达式(例如\frac{\cos(x^2) - x}{x^2 + 1}
)转换为编程语言中使用的表达式?示例的结果应该是(cos(x^2) - x)/(x^2 + 1)
。
答案1
当然,这取决于你想使用什么工具以及你想支持哪个乳胶子集(你展示了一个简单的例子,如果乳胶有字体和颜色或明确的间距,那就更难了)。例如,Wolfram alpha 可以使用乳胶语法中给出的表达式进行计算。
https://www.wolframalpha.com/input/?i=%5Cfrac%7Bcos%28x%5E2%29+-+x%7D%7Bx%5E2+%2B+1%7D
它也适用于cos
更正为\cos
https://www.wolframalpha.com/input/?i=%5Cfrac%7B%5Ccos%28x%5E2%29+-+x%7D%7Bx%5E2+%2B+1%7D
答案2
(增强了 Lua 代码,以便实例\sqrt{...}
也能被处理)
\latextocmath
这是一个基于 LuaLaTeX 的解决方案。它由一个名为的 LaTeX 实用宏和两个 Lua 函数(latex2cmath
和)组成,do_frac
这两个函数借助 Lua 的内置字符串函数和模式匹配功能完成大部分工作。
的参数\latextocmath
可能包含换行符。但是,的参数\latextocmath
是不是在传递给 Lua 函数 之前会先进行展开。因此,如果你通过latex2cmath
定义一个名为 的 LaTeX 宏,那么 的输出就是字符串,\mymacro
\newcommand\mymacro{1+1}
\latextocmath{\mymacro}
mymacro
不是 1+1
。我相信这个限制不会造成负担。
如果表达式的分子和分母项\frac
由单个字母或数字组成,则这些项不是括在括号中。这将有助于减少连分数以及诸如 之类的简单表达式中的视觉混乱\frac{u}{v}
。
显然,这种方法可以以多种方式扩展,具体取决于您希望遵守的编程代码约定以及需要修复的数学表达式类型。当然,将交换图转换为内联 C 类型代码至少会非常非常繁琐。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{amsmath} % for \cfrac, \dfrac, and \tfrac
\usepackage{luacode} % for 'luacode*' env. and '\luastringN' macro
\begin{luacode*}
function do_frac ( s ) -- convert \\frac notation to inline-math notation
return ( s:gsub ( "\\[cdt]?frac%s-(%b{})%s-(%b{})" , function ( x , y )
x = x:sub ( 2 , -2 ) -- strip off the curly braces
y = y:sub ( 2 , -2 )
if not (string.len(x)==1 or tonumber(x)) then x = "("..x..")" end
if not (string.len(y)==1 or tonumber(y)) then y = "("..y..")" end
return x.."/"..y
end ) )
end
function latex2cmath ( s )
s = s:gsub ( "\\[,:;!]" , "" ) -- delete '\,' '\:' '\;' and '\!' substrings
s = s:gsub ( "\\mkern..-mu" , "" ) -- delete math kerns
s = s:gsub ( "\\[cl]?dots" , "..." ) -- (typographic) ellipses
s = s:gsub ( "\\sqrt%s-(%b{})" , "sqrt(%1)" )
while s:find ( "\\[cdt]?frac" ) do s = do_frac ( s ) end -- nested \frac-like terms
s = s:gsub ( "\\(%a+)" , "%1" ) -- drop leading backslashes from \cos, \Delta, etc
s = s:gsub ( "%^" , "\\textasciicircum " ) -- make carets visible
tex.sprint ( ( s:gsub ( "%s" , "" ) ) ) -- omit all whitespace
end
\end{luacode*}
%% The LaTeX utility macro:
\newcommand\latextocmath[1]{\texttt{\directlua{ latex2cmath ( \luastringN{#1} ) }}}
\begin{document}
\[
\frac {u}{v} \quad
\frac{ \sqrt { 2 } } {2} \quad
\frac {\cos (x^2) - x} {x^2 + 1} \quad
\dfrac{\dfrac{\alpha+\beta}{\Gamma+\Delta}}{\tfrac{3+4}{5+6}} \quad
1+\cfrac{1}{1+\cfrac{1}{1+\cfrac{1}{ 1+\cfrac{1}{1+\cfrac{1}{1+\cfrac{1}{1+\cfrac{1}{1+\cfrac{1}{1+\cdots}}}}}}}}
\]
\obeylines
\latextocmath{ \frac {u}{v} }
\latextocmath{ \frac{ \sqrt { 2 } } {2} }
\latextocmath{\frac {\cos (x^2) - x} {x^2 + 1}}
\latextocmath{ \dfrac{\dfrac{\alpha+\beta}{\Gamma+\Delta}}{\tfrac{3+4}{5+6}} }
\latextocmath{1+\cfrac{1}{1+\cfrac{1}{1+\cfrac{1}{ 1+\cfrac{1}{1+\cfrac{1}{1+\cfrac{1}{1+\cfrac{1}{1+\cfrac{1}{1+\cdots}}}}}}}}}
\end{document}
答案3
Emacs calc-embedded 模式可以解决这个问题。假设你正在编辑一个包含
$ \frac {\cos (x ^ 2) - x} {x ^ 2 + 1} $
并将点(光标)放在其上,只需输入C-x * e
即可进入 calc-embedded 模式。然后输入d N
(display normal ) 即可显示
$ (cos (x ^ 2) - x) / (x ^ 2 + 1) $
d L
(显示 LaTeX)返回 LaTeX 语法。
C-x * e
退出 calc-embedded 模式并继续 LaTeX 文件编辑。
奖金
请注意,calc-embedded 是语言语法的一个不错的功能。可能的语法包括 C、Fortran、Pascal、TeX、LaTeX、Yacas、Maxima、Giac、Maple、Mathematica 等...
calc-embedded 还允许快速输入 TeX 或 LaTeX 语法中的矩阵:您在正常模式下在线输入矩阵$[[a b c] [d e f]]$
,calc-embedded 会立即转换为针对文档激活的 TeX 或 LaTeX 模式(逗号可选)。例如$ \ begin {pmatrix} a & b & c \\ d & e & f \ end {pmatrix} $
在 LaTeX 模式下。
答案4
我用同情用于措辞(和生成)Latex。
from sympy.parsing.latex import parse_latex
expr = parse_latex(r"\frac{\cos(x^2) - x}{x^2 + 1}")
print(expr) # Prints "(-x + cos(x**2))/(x**2 + 1)"
# Bonus
from sympy import latex
print(latex(expr)) # Prints "\frac{- x + \cos{\left(x^{2} \right)}}{x^{2} + 1}"
Sympy 有代码生成器您可以使用它来生成 C、Fortran、Javascript、Julia、Mathematica、Octave/Matlab 和 Python 代码(毫无疑问,它对 Python 有丰富的支持)。
from sympy import ccode, fcode, jscode, julia_code, mathematica_code, octave_code
# C code
print(ccode(expr)) # (-x + cos(pow(x, 2)))/(pow(x, 2) + 1)
# Fortran
print(fcode(expr)) # (-x + cos(x**2))/(x**2 + 1)
# Javascript
print(jscode(expr)) # (-x + Math.cos(Math.pow(x, 2)))/(Math.pow(x, 2) + 1)
# Julia
print(julia_code(expr)) # (-x + cos(x.^2))./(x.^2 + 1)
# Mathematica
print(mathematica_code(expr)) # (-x + Cos[x^2])/(x^2 + 1)
# Octave/Matlab
print(octave_code(expr)) # (-x + cos(x.^2))./(x.^2 + 1)
# Python
print(expr) # (-x + cos(x**2))/(x**2 + 1)
# Or use lambdify to directly make a Numpy accelerated callable python function
关于获取此设置的一些注意事项,您需要antlr4-python3-runtime
来使用此功能。如果您收到类似这样的错误;ANTLR runtime and generated code versions disagree: 4.9.2!=4.7.2
则需要安装与 Sympy 期望的版本相匹配的 ANTLR 运行时版本,即pip install antlr4-python3-runtime==4.7.2
。