如何使Maxima的输出更干净?

时间:2013-12-01 22:56:28

标签: maxima

我想利用Maxima作为后端来解决我的LaTeX输入文件中使用的一些计算。 我做了以下步骤。

第1步

下载并安装Maxima。

第2步

创建名为cas.bat的批处理文件(例如),如下所示。

rem cas.bat
echo off
set PATH=%PATH%;"C:\Program Files (x86)\Maxima-5.31.2\bin"
maxima --very-quiet -r %1 > solution.tex

将批处理保存在下面输入文件所在的同一目录中。这只是为了简单起见。

第3步

创建名为main.tex的输入文件(例如),如下所示。

% main.tex
\documentclass[preview,border=12pt,12pt]{standalone}
\usepackage{amsmath}

\def\f(#1){(#1)^2-5*(#1)+6}


\begin{document} 

\section{Problem}
Evaluate $\f(x)$ for $x=\frac 1 2$.

\section{Solution}
\immediate\write18{cas "x: 1/2;tex(\f(x));"}

\input{solution}

\end{document}

第4步

使用pdflatex -shell-escape main编译输入文件,您将获得一个不错的输出,如下所示。

enter image description here

第5步

完成。

问题

显然Maxima的输出如下。我不知道如何让它更清洁。

solution.tex

                                       1
                                       -
                                       2
$${{15}\over{4}}$$
                                     false

现在,我的问题是

  • 如何删除此类文本?
  • 如何在没有\frac{15}{4}的情况下获得$$...$$

4 个答案:

答案 0 :(得分:10)

(1)要抑制输出,请使用美元符号(即$)而不是分号(即;)终止输入表达式。

(2)要获得TeX-ified表达式sans环境分隔符(即$$),请调用tex1而不是tex。请注意tex1返回一个字符串,您必须自己打印(tex会为您打印)。

将这些想法与您展示的内容相结合,我认为您的程序可能如下所示:

"x: 1/2$ print(tex1(\f(x)))$"

我想您可能会发现Maxima邮件列表很有帮助。 [1]我很确定已经有多次尝试创建一个系统,例如你描述的系统。你也可以看一下[2]。

[1] http://maxima.sourceforge.net/maximalist.html [2] http://maxima.sourceforge.net/relatedprojects.html

答案 1 :(得分:3)

如果您真的想使用LaTeX,那么maxiplot包就是答案。它提供了一个maxima环境,您可以在其中输入Maxima命令。处理LaTeX文件时,会生成Maxima批处理文件。使用Maxima处理此文件并再次处理LaTeX文件以排版Maxima生成的方程式。

如果您希望使用实时排版进行2D数学输入,请使用TeXmacs。它是一个跨平台的文档创作环境(如果你愿意,可以使用类固醇的文字处理器),包括Maxima,Mathematica和更多科学计算工具的插件。如果您对排版需要或不满意,可以将文档导出到LaTeX。

答案 2 :(得分:2)

我无法找到任何方法在Maxima内部完全清理Maxima的输出。它始终回显输入行,并始终在输出后写入一些空格。以下是完成清理的perl脚本示例。

#!/usr/bin/perl

use strict;

my $var = $ARGV[0];
my $expr = $ARGV[1];

sub do_maxima_to_tex {
  my $m = shift;
  my $c = "maxima --batch-string='exptdispflag:false; print(tex1($m))\$'";
  my $e = `$c`;
  my @x = split(/\(%i\d+\)/,$e); # output contains stuff like (%i1)
  my $f = pop @x;  # remove everything before the echo of the last input
  while ($f=~/\A /) {$f=~s/\A .*\n//} # remove echo of input, which may be more than one line
  $f =~ s/\\\n//g; # maxima breaks latex tokens in the middle at end of line; fix this
  $f =~ s/\n/ /g; # if multiple lines, get it into one line
  $f =~ s/\s+\Z//; # get rid of final whitespace
  return $f;
}

my $e1 = do_maxima_to_tex("diff($expr,$var,1)");
my $e2 = do_maxima_to_tex("diff($expr,$var,2)");

print <<TEX;
The first derivative is \$$e1\$. Differentiating a second time,
we get \$$e2\$.
TEX

如果您将此脚本命名为a.pl,则执行

a.pl z 3*z^4

输出:

The first derivative is $12\,z^3$. Differentiating a second time,
we get $36\,z^2$.

对于OP的应用程序,像这样的脚本可能是latex文件中write18调用的内容。

答案 3 :(得分:1)

我知道这是一个很老的帖子。 OP提出的问题的极好的答案。我像OP一样长时间在命令行上使用--very-quiet -r选项,但是在maxima version 5.43.2中它们的行为有所不同。参见maxima command line v5.43 is behaving differently than v5.41。我通过交叉引用来回答这个问题,因为在将这些答案合并到您的解决方案中时,请确保也合并了这些命令行标志的行为更改。