Org-mode. Нумерация уравнений LaTeX

Org-mode. Нумерация уравнений LaTeX.

Содержание

1 Общая информация

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)
    

Дмитрий Сергеевич Кулябов
Дмитрий Сергеевич Кулябов
Профессор кафедры теории вероятностей и кибербезопасности

Мои научные интересы включают физику, администрирование Unix и сетей.

Похожие