我们尝试更改在转换为tex时最大值转换乘法的方式。
默认情况下,最大值会提供一个空格:\,
我们将其更改为我们自己的乳胶宏,看起来像一个空间,但是这样我们保留了特殊的含义,这使得将乳胶转换回最大值变得更容易。
:lisp (setf (get 'mtimes 'texsym) '("\\invisibletimes "));
但是,我们有一个问题,那就是简化程序。我们将其用于生成解决方案说明中的步骤。例如:
tex1(block([simp: false], 2*3));
当然,在将数字相乘时,我们可能需要显式乘法(\ cdot)。
因此,我们希望如果乘法的两个参数都是数字,那么在转换为tex时,我们将拥有一个\cdot
。
有可能吗?
答案 0 :(得分:1)
是的,如果有一个由TEX属性命名的函数,则调用该函数来处理表达式。 TEX命名的函数带有3个参数,即具有与TEX属性相连的相同运算符的表达式,左侧填充和右侧填充,并且TEX函数返回字符串列表,这些字符串是TeX的位应该输出。
您可以说:lisp (trace tex-mtimes)
看看它是如何工作的。您可以通过说:lisp (symbol-plist 'mtimes)
或通常说:lisp (symbol-plist 'mfoo)
来表示另一个MFOO运算符,来查看附加到MTIMES或其他运算符的功能。
因此,如果将TEX-MTIMES(用:lisp (setf (get 'mtimes 'tex) 'my-tex-mtimes)
替换为其他功能,则可以更大程度地控制输出。以下是适合您的功能的概述:
(defun my-tex-mtimes (e l r)
(if $simp
(tex-nary e l r) ;; punt to default handler
(tex-mtimes-special-case e l r)))
您可以根据需要使TEX-MTIMES-SPECIAL-CASE变得复杂。我假设您可以为此进行Lisp编程。最简单的尝试(也许是进一步努力的出发点)是用\cdot
临时替换TEXSYM。像这样:
(defun tex-mtimes-special-case (e l r)
(let ((prev-texsym (get 'mtimes 'texsym)))
(prog2 (setf (get 'mtimes 'texsym) (list "\\cdot "))
(tex-nary e l r)
(setf (get 'mtimes 'texsym) prev-texsym))))