如何为wxMaxima中所有类型的分式设置tex1输出?
我来帮你搞定这个Maxima TeX输出的问题~你已经通过:lisp $x找对了方向:1/x本质是负指数幂(mexpt),diff(ln(x),x)是未完全化简的导数结构(%derivative),这两类都不在ratnump判定的有理分式范围内,所以直接用ratnump的texput规则覆盖不到。下面分情况给你具体解决方案:
一、处理1/x这类负指数幂的TeX输出
1/x在Maxima的Lisp结构里是((MEXPT SIMP) $X -1),对应Maxima层面的函数是mexpt(幂运算)。我们可以给mexpt定制texput规则,判断指数为-1(或负整数)时输出你想要的分式格式(比如\tfrac):
/* 自定义mexpt的TeX输出规则 */ texput(mexpt, lambda([base, exp], /* 处理指数为-1的情况:输出\tfrac{1}{底数} */ if exp = -1 then concat("\\tfrac{1}{", tex1(base), "}") /* 扩展:处理其他负整数指数,比如x^-2输出\tfrac{1}{x^2} */ else if integerp(exp) and exp < 0 then concat("\\tfrac{1}{", tex1(base^(-exp)), "}") /* 其他幂运算保持默认输出 */ else concat(tex1(base), "^{", tex1(exp), "}") ));
测试一下:输入tex1(1/x),就能得到\tfrac{1}{x}啦。
二、处理diff(ln(x),x)这类导数的TeX输出
你看到的((%DERIVATIVE SIMP) (($LN SIMP) $X) $X 1)是导数的未化简结构,通常Maxima会自动把diff(ln(x),x)化简为1/x,如果你的环境没自动化简,可以先开启化简设置:
/* 确保导数自动化简 */ simp: true; derivabbrev: false; /* 关闭导数缩写,让结果直接显示为化简后的表达式 */
如果还是需要直接处理导数结构的TeX输出,可以给%derivative定制规则,先化简再输出:
/* 自定义导数的TeX输出:先化简再生成TeX代码 */ texput(%derivative, lambda([expr, var, order], tex1(ev(expr, diff, simp)) ));
这样tex1(diff(ln(x),x))就会先化简为1/x,再用上面的mexpt规则输出\tfrac{1}{x}。
三、关于用\tfrac代替\frac
你完全可以在texput的模板里直接替换成\tfrac,就像上面代码里写的那样——Maxima的TeX输出只是生成字符串,所以只要把模板里的\frac改成\tfrac就行,不需要额外设置。
最后,记得设置完texput规则后,用tex1(expr)测试输出结果,确保符合你的预期~
内容的提问来源于stack exchange,提问作者Rax Adaam

