LaTeXソースコードの可読性を上げたい。

この記事は [理物 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ributu) の記事です。

# はじめに
統計物理班のまさおかです。統計物理ではなく、LaTexの話をします。対象はLaTeXで物理に関係する数式を書く人です。VSCodeの使用も前提としています。Overleaf等でも同じことができるかは知りません。

きれいな数式を出力してくれことで有名なLaTeXですが、ソースコードは汚くなりがちです。
例えばこんな書き方。

```tex:start.tex
\begin{align}
\partial_\mu\left(\frac{\partial\mathcal{L}}{\partial\partial_\mu\tilde{\varphi}}\right)-\frac{\partial\mathcal{L}}{\partial\tilde{\varphi}}=0
\end{align}
```

出力結果: ![出力結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655346/f6289cf9-e69c-bfcd-e61d-b50310f28ca4.png)

これでエラーを吐くわけではないのですが、長ったらしいですし、もっと複雑な数式を書こうとすると、あっという間にコードが爆発してしまいます。
数式自体は出力されたpdfを見れば容易に読み取れますが、式を修正する場合、ソースコードとにらめっこして修正箇所を探さなければなりません。

出力は変えずに、数式をもっと簡潔に書きたい、というのがこの記事の目標です。

```tex:goal.tex
\begin{align}
    ∂_μ\qty(\pdv{ℒ}{∂_μ\~φ})-\pdv{ℒ}{\~φ}=0
\end{align}
```

# Step0: 改行する
まずはお作法なのですが、長い数式を一行で書くのはやめましょう。適宜改行して、インデントもつけるとよいです。

```tex: step0.tex
\begin{align}
    \partial_\mu\left(
        \frac{\partial\mathcal{L}}
            {\partial\partial_\mu\tilde{\varphi}}
    \right)
    - \frac{\partial\mathcal{L}}{\partial\tilde{\varphi}}
    = 0
\end{align}
```

これだけでもかなり見やすくなります。


# Step1: physics パッケージを使う
amsmath, amssymb は必須として、物理関係の式を扱う場合、さらに physics パッケージを使うと便利です。
```tex
\usepackage{physics}
```
physicsパッケージにある括弧のコマンド `\qty()` と偏微分のコマンド `\pdv{}{}`を使うと、冒頭のコードは
```tex: step1.tex
\begin{align}
    \partial_\mu\qty(
        \pdv{\mathcal{L}}{\partial_\mu\tilde{\varphi}}
    )
    - \pdv{\mathcal{L}}{\tilde{\varphi}}
    = 0
\end{align}
```
と書けます。さっきよりもコードが短くなりました。
physicsパッケージには便利コマンドが色々あるので、詳しくはドキュメントを見てもらえるとよいと思います。

# Step2: unicode-math パッケージを使う
次に、ソースコードの可読性を劇的に上げる unicode-math パッケージを紹介します。
ただし、LuaLaTeX を使っていないとこのパッケージは使えません。
LuaLaTexをVSCodeで導入する方法については、例えば以下の記事を参考にしてください。

>[VSCodeでLuaLaTexビルドの環境を整える](https://qiita.com/SuzuTomo2001/items/f5368084aa7351bb3f80)

プリアンブルに以下のパッケージを追加します。
```tex
\usepackage[bold-style=ISO]{unicode-math}
% unicode-math パッケージを使うためにはLuaLaTeXが必要。
% bold-style=ISO でボールド体のUnicode文字がデフォルトでイタリックになる。
```

unicode-mathを使うと、Unicodeの数学記号をそのままソースコードに書けるようになります。

```tex: step2.tex
\begin{align}
    ∂_μ\qty(\pdv{ℒ}{∂_μ\tilde{φ}}) - \pdv{ℒ}{\tilde{φ}} = 0
\end{align}
```

出力結果: ![出力結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655346/95a7f99c-9914-2ca2-9f38-a1cab27c4e07.png)

unicode-mathを使うとフォントがちょっと変わります。 ( `\` からはじまるコマンドを使ってもフォントが変わります。)

数学記号は大体なんでも出力できます。

```tex
\begin{align}
    ∫ ∑ ∏ × ⋅ ⊕ ≡ ≈ ≤ → ↦
\end{align}
```

出力結果:
![出力結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655346/aa8265a9-aea4-83f1-c57b-e902fc86a31a.png)

## Unicode文字の入力方法
Unicode文字が直接コンパイルできるようになったとして、それを入力できなければ意味がありません。
自分はVSCodeのスニペットにUnicode文字を登録しています。

<details>

<summary>スニペットの例</summary>

```json: latex.json
{
    "α":{
        "prefix":"@a",
        "body":"α"
    },
    "β":{
        "prefix":"@b",
        "body":"β"
    },
    "γ":{
        "prefix":"@g",
        "body":"γ"
    },
    "δ":{
        "prefix":"@d",
        "body":"δ"
    },
    "ϵ":{
        "prefix": "@e",
        "body": "ϵ"
    },
    "ε":{
        "prefix": "@ve",
        "body": "ε"
    },
    "ζ":{
        "prefix":"@z",
        "body":"ζ"
    },
    "η":{
        "prefix":"@h",
        "body":"η"
    },
    "θ":{
        "prefix":"@q",
        "body":"θ"
    },
    "ϑ":{
        "prefix":"@vq",
        "body":"ϑ"
    },
    "ι":{
        "prefix":"@i",
        "body":"ι"
    },
    "κ":{
        "prefix": "@k",
        "body": "κ"
    },
    "λ":{
        "prefix": "@l",
        "body": "λ"
    },
    "μ":{
        "prefix": "@m",
        "body": "μ"
    },
    "ν":{
        "prefix": "@n",
        "body": "ν"
    },
    "ξ":{
        "prefix": "@x",
        "body": "ξ"
    },
    "π":{
        "prefix": "@p",
        "body": "π"
    },
    "ϖ":{
        "prefix": "@vp",
        "body": "ϖ"
    },
    "ρ":{
        "prefix": "@r",
        "body": "ρ"
    },
    "ϱ":{
        "prefix": "@vr",
        "body": "ϱ"
    },
    "σ":{
        "prefix": "@s",
        "body": "σ"
    },
    "ς":{
        "prefix": "@vs",
        "body": "ς"
    },
    "τ":{
        "prefix": "@t",
        "body": "τ"
    },
    "υ":{
        "prefix":"@u",
        "body":"υ"
    },
    "ϕ":{
        "prefix":"@f",
        "body":"ϕ"
    },
    "φ":{
        "prefix":"@vf",
        "body":"φ"
    },
    "χ":{
        "prefix":"@c",
        "body":"χ"
    },
    "ψ":{
        "prefix":"@y",
        "body":"ψ"
    },
    "ω":{
        "prefix":"@o",
        "body":"ω"
    },
    "Γ":{
        "prefix":"@G",
        "body":"Γ"
    },
    "Δ":{
        "prefix":"@D",
        "body":"Δ"
    },
    "Θ":{
        "prefix":"@Q",
        "body":"Θ"
    },
    "Λ":{
        "prefix":"@L",
        "body":"Λ"
    },
    "Ξ":{
        "prefix": "@X",
        "body": "Ξ"
    },
    "Π":{
        "prefix": "@P",
        "body": "Π"
    },
    "Σ":{
        "prefix": "@S",
        "body": "Σ"
    },
    "𝛶":{
        "prefix": "@U",
        "body": "𝛶"
    },
    "Φ":{
        "prefix":"@F",
        "body":"Φ"
    },
    "Ψ":{
        "prefix":"@Y",
        "body":"Ψ"
    },
    "Ω":{
        "prefix": "@w",
        "body": "Ω"
    }
}
```

</details>

VSCodeにはUnicode文字を入力してくれる拡張機能がいくつかある (Unicodeで検索すれば出てくる)ので、頻繁に使わない記号はそれを使うといいと思います。


# Step3: Math accents の修正
`\tilde{}` など、修飾された文字はunicode-mathを使っても出力できませんでした。( `x̃` が x と出力されてしまいます。)


そこで、テキストモードでチルダをつけるコマンド `\~` を数式モードでも使えるようにします。
mathcommandパッケージを使うと、数式モードの中では異なる働きをもつようにコマンドを再定義することができます。

```tex
\usepackage{mathcommand}
\renewmathcommand{\~}{\tilde}
\renewmathcommand{\^}{\hat}
\renewmathcommand{\=}{\bar}
\renewmathcommand{\.}{\dot}
\renewmathcommand{\"}{\ddot}
```
これを使うと、

```tex: step3.tex
\begin{align}
    ∂_μ\qty(\pdv{ℒ}{∂_μ\~φ}) - \pdv{ℒ}{\~φ} = 0
\end{align}
```
だいぶ短くなりました。


# 代案: VSCode の機能を使う

LaTeX Workshop を使っている場合、`option`+`command`+`m` でプレビューが現れます。
 ~~Unicode文字とか使わずに、これだけでいい気がする~~
デフォルトではphysicsパッケージに対応していないので、`setting.json`に以下の設定を追加します。
```json: setting.json
  "latex-workshop.hover.preview.mathjax.extensions": [
    "physics",
  ],
```
さらに自作コマンドを対応させたい場合は、自作コマンドを`hover.tex`に書いて、以下の設定を追加します。

```json: setting.json
  "latex-workshop.hover.preview.newcommand.newcommandFile": "/path/hover.tex",
```

```tex: hover.tex
\newcommand{\hoge}{\mathrm{hoge}}
```

これらの設定は以下の記事を参考にしました。

>[LaTeX Workshop の数式プレビューを使いこなす](https://qiita.com/Yarakashi_Kikohshi/items/4570bba51787e47a03c6)


>[LaTeX Workshop をもっと使いこなす](https://qiita.com/Yarakashi_Kikohshi/items/1f2225c7e28aad498998)

# おわりに
誰かの参考になれば嬉しいですが、自己責任でお願いします。