【问题标题】:How to make the output of Maxima cleaner?如何让Maxima的输出更干净?
【发布时间】:2013-12-01 22:56:27
【问题描述】:

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

步骤 1

下载并安装 Maxima。

第二步

创建一个名为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

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

第三步

创建名为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}

第四步

pdflatex -shell-escape main编译输入文件,你会得到一个很好的输出,如下所示。

!

第 5 步

完成。

问题

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

solution.tex

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

现在,我的问题是

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

【问题讨论】:

  • 考虑在不参考外部链接的情况下提出问题。
  • 有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包括重现问题的有效代码。
  • 您好,我已经删除了链接,并用更多独立文本替换了它。

标签: maxima


【解决方案1】:

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

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

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

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

我想您可能会发现 Maxima mailing list 很有帮助。我很确定有几次尝试创建一个像你描述的那样的系统。也可以看看documentation

【讨论】:

  • 我还用 Mathematica here 做了一个解决方案。在我看来,Mathematica 提供了更加流畅的工作流程。
【解决方案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 的应用程序,像这样的脚本可能是由乳胶文件中的 write18 调用的。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 当然,为它+1
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-13
      • 2021-12-04
      • 2021-04-28
      • 2013-07-20
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      相关资源
      最近更新 更多