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

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

Содержание

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

2 Проблема

  • При использовании выключенных уравнений LaTeX в org-mode (см. Org-mode. Предпросмотр TeX) каждый фрагмент создаётся изолированно.
  • Каждое пронумерованное уравнение имеет номер (1).

3 Предлагаемое решение

  • Для обеспечения правильной нумерации нужно создавать каждый фрагмента не изолированно, a учитывая контекст.
  • Выясняем, какой должна быть нумерация для каждого уравнения, а затем передаём эту информацию для генерации изображения.

4 Реализация

  • Предлагается добавить следующий фрагмент в конфигурационные файлы:
    (defun ecf/org-renumber-environment (orig-func &rest args)
      (let ((results '())
            (counter -1)
            (numberp))
    
        (setq results (loop for (begin .  env) in
                            (org-element-map (org-element-parse-buffer) 'latex-environment
                              (lambda (env)
                                (cons
                                 (org-element-property :begin env)
                                 (org-element-property :value env))))
                            collect
                            (cond
                             ((and (string-match "\\\\begin{equation}" env)
                                   (not (string-match "\\\\tag{" env)))
                              (incf counter)
                              (cons begin counter))
                             ((string-match "\\\\begin{align}" env)
                              (prog2
                                  (incf counter)
                                  (cons begin counter)
                                (with-temp-buffer
                                  (insert env)
                                  (goto-char (point-min))
                                  ;; \\ is used for a new line. Each one leads to a number
                                  (incf counter (count-matches "\\\\$"))
                                  ;; unless there are nonumbers.
                                  (goto-char (point-min))
                                  (decf counter (count-matches "\\nonumber")))))
                             (t
                              (cons begin nil)))))
    
        (when (setq numberp (cdr (assoc (point) results)))
          (setf (car args)
                (concat
                 (format "\\setcounter{equation}{%s}\n" numberp)
                 (car args)))))
    
      (apply orig-func args))
    
    (advice-add 'org-create-formula-image :around #'ecf/org-renumber-environment)
    

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

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

Похожие