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 帐户。搜索此网站,可以找到大量显示可以做什么的帖子。