Org-mode. Нумерация уравнений LaTeX
Org-mode. Нумерация уравнений LaTeX.
Содержание
1 Общая информация
- Сделано на основе: https://kitchingroup.cheme.cmu.edu/blog/2016/11/07/Better-equation-numbering-in-LaTeX-fragments-in-org-mode/.
2 Проблема
- При использовании выключенных уравнений LaTeX в org-mode (см. Org-mode. Предпросмотр TeX) каждый фрагмент создаётся изолированно.
- Каждое пронумерованное уравнение имеет номер
(1)
.
3 Предлагаемое решение
- Для обеспечения правильной нумерации нужно создавать каждый фрагмента не изолированно, a учитывая контекст.
- Выясняем, какой должна быть нумерация для каждого уравнения, а затем передаём эту информацию для генерации изображения.
4 Реализация
- Предлагается добавить следующий фрагмент в конфигурационные файлы:
1(defun ecf/org-renumber-environment (orig-func &rest args) 2 (let ((results '()) 3 (counter -1) 4 (numberp)) 5 6 (setq results (loop for (begin . env) in 7 (org-element-map (org-element-parse-buffer) 'latex-environment 8 (lambda (env) 9 (cons 10 (org-element-property :begin env) 11 (org-element-property :value env)))) 12 collect 13 (cond 14 ((and (string-match "\\\\begin{equation}" env) 15 (not (string-match "\\\\tag{" env))) 16 (incf counter) 17 (cons begin counter)) 18 ((string-match "\\\\begin{align}" env) 19 (prog2 20 (incf counter) 21 (cons begin counter) 22 (with-temp-buffer 23 (insert env) 24 (goto-char (point-min)) 25 ;; \\ is used for a new line. Each one leads to a number 26 (incf counter (count-matches "\\\\$")) 27 ;; unless there are nonumbers. 28 (goto-char (point-min)) 29 (decf counter (count-matches "\\nonumber"))))) 30 (t 31 (cons begin nil))))) 32 33 (when (setq numberp (cdr (assoc (point) results))) 34 (setf (car args) 35 (concat 36 (format "\\setcounter{equation}{%s}\n" numberp) 37 (car args))))) 38 39 (apply orig-func args)) 40 41(advice-add 'org-create-formula-image :around #'ecf/org-renumber-environment)