Изменить стандартный вывод текс умножения в максимумах - PullRequest
0 голосов
/ 21 ноября 2018

Мы пытаемся изменить способ, которым максимумы преобразуют умножение при преобразовании в текс.

По умолчанию максимумы дают пробел: \,

Мы изменили это на наш собственный латексный макрос, который выглядит какпробел, но таким образом мы сохраняем смысловое значение, которое облегчает преобразование латекса обратно в максимумы.

:lisp (setf (get 'mtimes 'texsym) '("\\invisibletimes "));

Однако у нас есть одна проблема, и это когда мы упрощаем.Мы используем это для генерации шагов в объяснении решения.Например:

tex1(block([simp: false], 2*3));

Конечно, при умножении чисел нам может потребоваться явное умножение (\ cdot).

Итак, нам бы хотелось, чтобы, если оба аргумента умножения были числами, у нас тогда было \cdot при переводе в tex.

Возможно ли это?

1 Ответ

0 голосов
/ 24 ноября 2018

Да, если есть функция, названная свойством TEX, эта функция вызывается для обработки выражения.Функция, названная TEX, принимает 3 аргумента, а именно выражение с тем же оператором, к которому присоединено свойство TEX, вещи слева и вещи справа, а функция TEX возвращает список строк, которые являются битами TeX.который должен быть выведен.

Вы можете сказать :lisp (trace tex-mtimes), чтобы увидеть, как это работает.Вы можете увидеть функции, подключенные к MTIMES или другим операторам, сказав :lisp (symbol-plist 'mtimes) или вообще :lisp (symbol-plist 'mfoo) для другого оператора MFOO.

Так что если вы замените 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 настолько сложным, насколько захотите.Я предполагаю, что вы можете выполнить программирование на Лиспе для этого.Самая простая вещь, которую можно попробовать, возможно, отправная точка для дальнейших усилий, это просто временно заменить TEXSYM на \cdot.Что-то вроде:

(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))))
...