如何用 TeX 编写数学解析器?

如何用 TeX 编写数学解析器?

TeX 的计算能力并不好,因此开发了一些软件包和 LuaTeX。但这些解决方案都没有提供符号/精确数学,所以我尝试了以下方法:

% Plain TeX
\catcode`\@=11

% add 2 rational numbers, expandable macro
\def\@rational@add#1#2#3#4{%
    \ifnum\numexpr#2*#4 < \z@
      \expandafter\the\expandafter
        \numexpr\expanded{%
            (-#1*#4-#2*#3)/\expandafter\@gcd\expanded{%
                {\the\numexpr#1*#4+#2*#3\relax}{\the\numexpr#2*#4\relax}}}\relax
      /
      \expandafter\the\expandafter
        \numexpr\expanded{%
            (-#2*#4)/\expandafter\@gcd\expanded{%
                {\the\numexpr#1*#4+#2*#3\relax}{\the\numexpr#2*#4\relax}}}\relax
    \else
      \expandafter\the\expandafter
        \numexpr\expanded{%
            (#1*#4+#2*#3)/\expandafter\@gcd\expanded{%
                {\the\numexpr#1*#4+#2*#3\relax}{\the\numexpr#2*#4\relax}}}\relax
      /
      \expandafter\the\expandafter
        \numexpr\expanded{%
            (#2*#4)/\expandafter\@gcd\expanded{%
                {\the\numexpr#1*#4+#2*#3\relax}{\the\numexpr#2*#4\relax}}}\relax
    \fi}

% helper macros:
\def\@sgn@of@int#1{%
    \ifnum #1 = \z@
      0%
    \else
      \ifnum #1 > \z@ 1 \else -1 \fi
    \fi}
\def\@abs@of@int#1{\ifnum #1 < \z@ \the\numexpr-#1\relax \else \the\numexpr#1 \fi}
\def\@gcd#1#2{%
    \ifnum #2 = \z@
      \@abs@of@int{#1}%
    \else
      \expandafter\@gcd\expanded{{#2}{\the\numexpr #1-#2*(#1/#2)\relax}}
    \fi}

% example
$$ \@rational@add{89}{-24}{-55}{36} $$ prints -377/72 as expected

\bye

但是\@rational@add一直在编写类似的宏... :( 有些包能够解析类似的东西3/4 + 1/3 * ...并将其转换为正确的宏。但我不明白他们是如何做到的。有人可以帮帮我吗?

我的梦想是写一些类似\mathexpr 8^(1/2) + 32^(1/2)which typesets 的东西6 \sqrt2。我不知道这在 TeX 或 LuaTeX 中是否可以实现。

答案1

正如上面的评论表明,这个sagetex包值得研究。

\documentclass{article}
\usepackage{sagetex,amsmath}
\begin{document}
Is your dream to write:
$8^{1/2} + 32^{1/2}= \sage{8^(1/2)+32^(1/2)}$
or $\sage{8^(1/2)}+\sage{32^(1/2)}=\sage{8^(1/2)+32^(1/2)}$?
\end{document}

给出输出: 在此处输入图片描述

无需复杂的编码。该sagetex软件包使用计算机代数系统智者它不属于您的 LaTeX 安装。这意味着您要么在您的机器上安装 SAGE,要么使用免费的Cocalc 账户。由于安装 SAGE 对于某些计算机来说可能比较棘手,我建议开设一个 Cocalc 帐户。搜索此网站,可以找到大量显示可以做什么的帖子。

相关内容