🏔️

LaTeXの数式ラベル管理を楽にするEmacsパッケージ、LaTeX Labelerの紹介

2023/11/27に公開

はじめに

LaTeXの数式ラベル管理を楽にするEmacsパッケージ、LaTeX Labelerを紹介します。主な機能はLaTeXファイルの数式に対して上から順に番号付きラベルを貼り付けることです。これによって編集しているLaTeXファイルの数式ラベルとコンパイルされた文書中の式番号が一致するので数式の参照が楽になります。また数式のラベル名をいちいち考える必要もありません。LaTeXで多くの数式を含む文書を作成する方におすすめです。

このパッケージは既存のtexlabel.elにインスパイアされたものです。LaTeX Labelerはtexlabel.elと似た機能を提供しますが、いくつかの機能の強化、改善を目指しました。

MELPAを利用している場合は M-x package-install RET latex-labelerでインストールできます。またはGitHubからもダウンロードできます。
https://github.com/X9hRRDys/latex-labeler

注意: LaTeX LabelerはLaTeXファイル編集用のスタンダードなパッケージであるAUCTeXYaTeX上では問題なく利用できます。一方でEmacsにもとから内蔵されているlatex-modeで使用すると予期しないエラーが発生することがあります。AUCTeXまたはYaTeXを利用することをおすすめします。

機能

LaTeX Labelerは3つのコマンドを提供します。

  1. latex-labeler-update: あらかじめ決めたフォーマット(デフォルトではeq:+数字)のラベルを更新します。また参照しているラベルの名前も更新されます。
  2. latex-labeler-update-force: フォーマットに関係なくすべてのラベルと参照を更新します。
  3. latex-labeler-change-prefix-and-update: ラベルのプレフィクス(\label{eq:123}eqの部分)を変更し、さらにラベルを更新します。

次に具体的な使用例を用いてLaTeX Labelerの機能を紹介します。

使用例

はじめに次のようなLaTeXファイルがあるとします。
はじめの状態
はじめの状態。左のウィンドウがLaTeXファイルで右のウィンドウがコンパイル後のpdfファイル。

M-x latex-labeler-updateと入力するとlabel{eq:123}のようにeq:+数字という形式のラベルが更新されます。これによってLaTeXファイルの数式ラベルとコンパイルしたpdfの数式番号が一致します。また\eqref{eq:123}のような参照も同時に更新されます。\label{xyz}のようにフォーマットに従っていないラベルは更新されません。
latex-labeler-update
latex-labeler-update

M-x latex-labeler-update-forceと入力するとラベル名の形式に関係なくすべてのラベルが更新されます。したがって\label{eq:123}のようなラベルも\label{xyz}のようなラベルも更新されます。
latex-labeler-update-force
latex-labeler-update-force

ラベル名のプレフィクス(eqの部分)を変更したい場合はM-x latex-labeler-change-prefix-and-updateと入力します。ミニバッファで希望のプレフィクスを入力すると、latex-labeler-updateと同じようにラベルが更新されます。さらにLaTeXファイルのいちばん下にプレフィクスに関する設定が追記されます。これによって次回以降このファイルを開いたときに自動的に新しいプレフィクスでラベルを更新できます。
latex-labeler-change-prefix-and-update
latex-labeler-change-prefix-and-update

ラベルにセクション番号をつける

LaTeXではプリアンブルに

\numberwithin{equation}{section}

と書くことで式番号にセクション番号をつけることができます。これに対応してEmacsで編集しているLaTeXファイルにもセクション番号つきのラベルをつけることができます。さらにLaTeXファイルの\appendix以下のセクションはeq:A.1のようにappendixに対応するラベル名が付きます。
latex-labeler-with-section-counter
latex-labeler-with-section-counter

これを実現するためにはカスタム変数latex-labeler-with-section-counterの値をtとする必要があります(デフォルトの値はnilです)。特定のLaTeXファイルにこの設定を適用する場合はそのLaTeXファイルのいちばん下に次の行を追加します。

% local variables:
% latex-labeler-with-section-counter: t
% end:

あるディレクトリ内のすべてのLaTeXファイルにこの設定を適用したい場合は、そのディレクトリ内に.dir-locals.elを作成し、.dir-locals.elに次の行を追加します。またはコマンドM-x add-dir-local-variablesを入力することでこのファイルを作成することもできます。

;;; Directory Local Variables            -*- no-byte-compile: t -*-
;;; For more information see (info "(emacs) Directory Variables")

((latex-mode . ((latex-labeler-with-section-counter . t))))

もしもこの設定をグローバルに適用する場合はEmacsの設定ファイルに次の行を追加します。

(setq latex-labeler-with-section-counter t)

複数のファイルの扱いについて

LaTeX Labelerが更新するラベルは編集中のひとつのファイルのみです。\input{...}\include{...}を用いて挿入した他のファイルのラベルは更新しません。もしもファイルを分割して文書を作成している場合は次のように作業することをおすすめします。

  1. LaTeXファイルを式番号がリセットされるような単位ごと(チャプターやセクションごと)に分割する
  2. 分割したファイルごとにlatex-labeler-change-prefix-and-updateで固有のプレフィクスを定める
  3. 他のファイルから参照される式はフォーマット(eq:+数字など)に従わない、ユニークなラベル名(\label{xyz}など)を付ける。ラベルの更新にはlatex-labeler-updateを用いる。
  4. もしもフォーマットに従わないラベル名を変更したい場合はEmacs内蔵の機能を使って、複数ファイル間で置換を行う。例えばプロジェクト内のファイルを問い合わせ形式または一括で置換できるproject-query-replace-regexpC-x p r)を利用する。

設定

最低限の設定

最低限の設定として、AUCTeXを利用する場合はEmacsの設定ファイル(init.elなど)に次の行を追加します。

(with-eval-after-load 'latex (require 'latex-labeler))

AUCTeXを利用する場合はさらに、次の設定を行うことをおすすめします。

(setq LaTeX-equation-label nil)

これによって数式環境を挿入するコマンドLaTeX-environmentC-c C-eに割り当てられています)を実行したときにラベル挿入のプロンプトを抑制します。

YaTeXを利用している場合は次の行を追加します。

(with-eval-after-load 'yatex (require 'latex-labeler))

キーバインディングの割り当て

AUCTeXを利用している場合は例えば次のように設定できます。

(with-eval-after-load 'latex
  (define-key LaTeX-mode-map (kbd "C-c t u") #'latex-labeler-update)
  (define-key LaTeX-mode-map (kbd "C-c t f") #'latex-labeler-update-force)
  (define-key LaTeX-mode-map (kbd "C-c t p") #'latex-labeler-change-prefix-and-update))

YaTeXを利用している場合は'latex'yatexに、LaTeX-mode-mapYaTeX-mode-mapに置き換えてください。

LaTeXファイルのコンパイル前にラベルを自動更新する

AUCTeXを利用している場合、TeX-command-masterC-c C-cに割り当てられています)でLaTeXファイルをコンパイルできます。TeX-command-masterを実行する直前にlatex-labeler-updateでラベルを自動更新したい場合は次のように設定します。

(advice-add 'TeX-command-master :before #'latex-labeler-update)

ラベル付けを行う数式環境を追加する

デフォルトでラベル付けが行われる数式環境はalignequationeqnarraygathermultlinesubequationsalignatflalignです。ラベル付けを行う数式環境を追加する場合は次のように設定します。

(add-to-list 'latex-labeler-math-envs "newenv" t)

"newenv"の部分は適切な数式環境名に置き換えてください。

ラベルの直前で改行する

カスタム変数latex-labeler-string-before-labelでラベル直前の文字を制御できます。またlatex-labeler-label-with-indentの値をtとすることでラベル貼り付け後に字下げを行います。これらを組み合わせて次のように設定できます。

(setq latex-labeler-string-before-label "\n")
(setq latex-labeler-label-with-indent t)


改行付きのラベルを貼り付ける前(左図)と後(右図)。

おわりに

論文作成等でお役に立てれば幸いです。

Discussion