Skip to content

Instantly share code, notes, and snippets.

@yarakos95
Last active January 29, 2021 19:11
Show Gist options
  • Save yarakos95/c6cdb7b8bd8ab62b3f7f0154a3269aea to your computer and use it in GitHub Desktop.
Save yarakos95/c6cdb7b8bd8ab62b3f7f0154a3269aea to your computer and use it in GitHub Desktop.
LaTeX 数式 フォーマット概論

LaTeX 数式 フォーマット概論

LaTeX で数式を書く際には,どのようにコーディングしていてもタイプセットしてしまえば非常にきれいに出力される.

しかしながら,LaTeX も一種のmarkup 言語であり,ある程度のフォーマット(形式) を持っていた方が見た目に綺麗である.また,長い数式を書く際には綺麗な見た目にしておいた方が編集も楽になる.

例えば,align 環境を書いていたとしても,次のように書いていた場合,どこに左辺があるのか分かりづらい. また,間違いを訂正したい場合,どこが間違いなのか判別しづらい.

\begin{align}
f(x)&=ax^2+bx+c\\
&=a\left(x^2+\frac{b}{a}x\right)+c\\
&=a\left(x+\frac{b}{2a}\right)^2-\frac{b^2}{4a^2}+c\\
\end{align}

本記事では上のような数式をどのように書き換えると見やすくなるかを示していきたい.

ただし,本記事での書き方が"正解" ではないことには注意しておきたい.より見やすいコーディングの方法はあるだろう.フォーマットの一例として読んでほしい.

前提

数式を挿入するには,amsmath パッケージから提供される数式環境を利用する.これはスタンダードな方法であり,amsmath を使用しない数式の挿入はあまり好まれない.

また,amsmath に依存したパッケージを利用することで,より平易にコマンドを利用することが出来るようになる. 以下のAMS から提供されている数式用のパッケージを用いればほとんど十分になるだろう.

以下の記事でamsmath とmathtools で提供されている数式環境を紹介しているので是非参考にしてほしい.

LaTeX の数式モードをまとめたよ - Qiita

今回フォーマットとして考える数式環境は上で示した3つのパッケージで提供されている環境に対して運用するものとする.他のパッケージから提供される環境に関しても同様に適用することが可能かも知れないが,考慮していないことは注意しておきたい.

ただし,phisics パッケージのような "よりコマンドの意味を明瞭にする目的" に作られたパッケージは積極的に利用しておくと良いだろう.また,自分でコマンドを定義しておくのも重要である.

hoge 環境内

\begin~ \end で囲われるような環境内では1つ分のインデントを設けておくと分かりやすくなるだろう. 例えば以下のようである.

\begin{hoge}
  hoge
  HOGE
  foo
  FOO
\end{hoge}

インデントとは行の頭を下げる(右にズラす) ことであり,タブストップや2n 個の半角スペースで表現される.インデント幅については以下で説明する.

インデントや途中の半角スペースは数式環境において無視されるので,見やすくするために好きなだけ挿入すると良いだろう.数式環境の他に,table 環境やfigure 環境でもインデントは無視される.

改行

本記事では,"改行" とはエディタ内で行を変えることを意味し,\\ を挿入することを意味しないことに注意しておきたい.

右辺,左辺,関係演算子,\\ などは各々独立した行に挿入すると見やすくなる.以下を挿入する際には改行して新たな行に挿入すると良いだろう.

  • 右辺
  • 左辺
  • =&=, > などの関係演算子
  • \\
  • split 環境等の数式環境内環境
  • &
  • \text などのコメント

注意: 改行はインデントや半角スペースと異なり,空白行があるとエラーを吐くようになっている.空白行は作らないように注意しておこう.

インデント幅

タブストップか2n 個の半角スペースで表現するが,これは好みで決めて良い.

個人的には半角スペース2個が好みであり,これを推奨したい.しかし,場合によっては4個の方がズレが大きいため分かりやすいかも知れない.

また,インデントを挿入する箇所は以下とする.

  • \\
  • =&=, > などの関係演算子
  • 右辺

これらのある行では,全体としてインデントが2つ分あることになる.

注意: スペースで間隔を空ける場合,半角スペースを用いるようにし,全角スペースを利用しないようにしよう.全角スペースを利用するとレンダリングされるようになる.意図して間隔を空けたい場合は,\quad などを利用するようにする.

\begin{align}
  \alpha  \beta
  && \text{半角スペース*2}
  \\
  \alpha \beta
  && \text{全角スペース}
\end{align}

上の例では,タイプセット後の結果が異なる.全角スペースは挿入しない.

全角スペースは挿入しない!!

これは守った方が良い.

余談:
全角スペースを利用しないように,設定からキーボードから直接全角スペースを打てないようにすることも可能である. Windows の場合,Microsoft IME (タスクバーにあるA などの表示アイコンを右クリック > 設定) から全般 > スペース を"常に半角" ,キーとタッチのカスタマイズ > Shift+Space を"なし" に変更することで,全角スペースを入力しないようにすることが出来る.(MacOS は利用していないので把握していない)

具体例

本節で以上のフォーマットの方針を用いて具体例を示していきたい.

左辺/右辺と関係演算子の区別

非常に簡単な式だが,以下の式を見やすくしてみたい.

\begin{equation}
  f(x)=ax^2+bx+c
\end{equation}

左辺右辺と関係演算子の区別が付くように以下のように変更を加える.

  • 左辺,右辺,関係演算子で行を変える
  • 関係演算子と右辺に1個のインデントを入れる
\begin{equation}
  f(x)
    =
    ax^2+bx+c
\end{equation}

幾分か見やすくなっているだろう.

複数行の数式

複数行の数式には&= で揃えることが出来るが,= と同じように取り扱うと良いだろう.

\begin{align}
  f(x)
    & =
    ax^2+bx+c
    \\
    & =
    a \left( x^2+\frac{b}{a}x \right)+c
    \\
    & =
    a \left( x+\frac{b}{2a} \right)^2 -\frac{b^2}{4a}+c
\end{align}

また,align 環境では\text コマンドでコメントを書くことがある. 数式と同じ行に入れるのではなく,行を変えると分かりやすくなるだろう.

\begin{align}
  f(x)
    & =
    ax^2+bx+c
    \\
    & =
    a \left( x^2+\frac{b}{a}x \right) +c
    && \text{平方完成する}
    \\
    & =
    a \left( x+\frac{b}{2a} \right)^2 -\frac{b^2}{4a}+c
\end{align}

また,\\ の挿入の有無にかかわらず= を挿入する場合には改行しておこう.

\begin{align}
  f(x)
    & =
    ax^2+bx+c
    = 
    a \left( x^2+\frac{b}{a}x \right) +c
    \\
    & =
    a \left( x+\frac{b}{2a} \right)^2 -\frac{b^2}{4a}+c
\end{align}

数式環境内での環境

cases 環境やsplit 環境などは数式環境内で利用される.

\begin=&= と同じ行に挿入せずに行を変えておくと良いだろう. また,インデントを1段下げておくと良いだろう.

\begin{align}
  \sum_1^20
    & =
    \begin{split}
      1+2+3+4+5+6+7+8+9+10
      \\
      11+12+13+14+15+16+17+18+19+20
    \end{split}
    \\
    & =
    55+155
    \\
    & =
    210
\end{align}

cases 環境

場合分けには条件を付けることになるが,これらを1行で収めない方が見やすいものになるだろう.& のある位置で改行しておく. また,あとで編集しやすい.

\begin{cases}
  x
  & \text{if $ x>0 $}
  \\
  0
  & \text{if $ x=0 $}
  \\
  -x
  & \text{if $ x<0 $}
\end{cases}

\text を使用するのも面倒なので,mathtools から提供されているcases* 環境を利用するともう少しだけ楽になるかもしれない.

\begin{cases*}
  x
  & if $ x>0 $
  \\
  0
  & if $ x=0 $
  \\
  -x
  & if $ x<0 $
\end{cases*}

行列環境

行列はLaTeX で書く上で頭を悩ませる一つである.行列環境の挿入方法はcases 環境やsplit 環境と同様に挿入すればよいので,ここではXmatrix 環境内でのフォーマットを表しておきたい.

例として4×4 の行列を書きたい.

単位行列の場合には非常に簡単である.これは各行列要素が"0" か"1" のみで構成されているためである.

\begin{pmatrix}
  1 & 0 & 0 & 0  \\
  0 & 1 & 0 & 0  \\
  0 & 0 & 1 & 0  \\
  0 & 0 & 0 & 1
\end{pmatrix}

しかし,行列要素が長い場合には揃わないので非常に見づらくなってしまう. 各行列要素が長い場合には以下のように書くと良い.

\begin{pmatrix}
  \frac{1}{\sqrt{1-\beta^2}}
  & -\frac{\beta}{\sqrt{1-\beta^2}}
  & 0
  & 0
  \\
  \frac{\beta}{\sqrt{1-\beta^2}}
  & -\frac{1}{\sqrt{1-\beta^2}}
  & 0
  & 0
  \\
  0
  & 0
  & 1
  & 0
  \\
  0
  & 0
  & 0
  & 1
\end{pmatrix}

列の並びが見づらくなってしまうのは難点となるが,行を1行にまとめてしまうよりは見やすいものとなっているだろう. これはtabular 環境でも応用することが出来る.

2×2 の行列の積は次のようになる.

\begin{equation}
  A\times B
    =
    \begin{pmatrix}
      a_{11}
      & a_{12}
      \\
      a_{21}
      & a_{22}
    \end{pmatrix}
    \times
    \begin{pmatrix}
      b_{11}
      & b_{12}
      \\
      b_{21}
      & b_{22}
    \end{pmatrix}
\end{equation}

意味のある改行

だらだらとした長い数式を1行に書くのではなく,意味のある項ごとで改行することを考えても良いだろう.

以下3つの例を上げておきたい.

長い数式

長い数式を書く場合には,ある程度の長さで行を変えておいた方が見やすいだろう.

\begin{align}
  (x+y+z)^3
    & =
    (x+y+z)^2(x+y+z)
    \\
    & =
    (x^2+y^2+z^2+2xy+2zx+2yz+3xyz)(x+y+z)
    \\
    & =
    x^3+y^3+z^3+3x^2y+3zx^2+3xy^2+3y^2z+3z^2x+3yz^2+6xyz
\end{align}

意味のあるところで行を変えておけば,非常に見やすいだろう. インデントは= よりも1つだけ下げておくと良いだろう.

\begin{align}
  (x+y+z)^3
    & =
    (x+y+z)^2
    (x+y+z)
    \\
    & =
    (x^2+y^2+z^2
    +2xy+2zx+2yz
    +3xyz)
    (x+y+z)
    \\
    & =
    x^3+y^3+z^3
    +3x^2y+3zx^2
    +3xy^2+3y^2z
    +3z^2x+3yz^2
    +6xyz
\end{align}

例が悪いような気もするが,意味のある項ごとに改行しておくことで見やすくなるだろう.

大型演算子

\sum\int などの大型演算子を用いる際に,範囲を指定する場合がある. 演算子と被演算関数との行を変更しておくことで分かりやすくなるだろう.

\begin{align}
  F
    & =
    \int_{0}^{R}
    dr
    \int_{0}^{\frac{\pi}{2}}
    d\theta
    \int_{0}^{2\pi}
    d\phi
    f(r,\theta,\phi)
    \\
    & =
    ... ... 
    ... ...
\end{align}

empheq 環境

empheq 環境はempheq パッケージから提供されている環境であり,amsmath パッケージで提供している数式環境を拡張する環境である.

以下のように,オプションを複数行でコーディングすることも出来る.

\begin{empheq}[
    left = {
      f(x)
        =
        \empheqlbrace
    }]{align}
  \frac{a}{x}
  \\
  \frac{b}{x}
\end{empheq}

overload オプションを有効にしている場合には,以下のようにすることも出来る.

\begin{align}[
    left = {
      f(x)
        =
        \empheqlbrace
    }]
  \frac{a}{x}
  \\
  \frac{b}{x}
\end{align}

VSCode で楽にフォーマットをする

VSCode で以上のフォーマットを実行するために,スニペットやキーバインドを利用して楽に出来るようにカスタマイズしよう.

Settings

タブストップの設定は以下の4つを設けておくと良いだろう.(settings.json)

    "editor.renderWhitespace": "boundary",
    "editor.insertSpaces": true,
    "editor.stickyTabStops": true,
    "editor.tabSize": 2,

この設定では,上から順にこのようになっている.

  • 半角スペースを色の薄い- で可視化する(ただし,単語間での半角スペース1個は無視される)
  • タブストップを使用せずに半角スペースでインデントを構成する
  • カーソルの挙動を半角スペースのインデントをタブストップと同様にする
  • インデントの大きさを半角スペース2個にする

また,すでにインデントがタブストップで構成されているドキュメントに対して,コマンドパレットからインデントをスペースに変換する ことも可能である.

Snippets

プレースホルダーには等号や不等号のバリエーションを含めている.必要な記号があれば逐次追加すると良いだろう.

Snippets: latex.json (折りたたみ)
    "Add break and indents": {
        "prefix": "Add break and indents",
        "body": [
            "",
            "\t",
        ],
        "description": "Add break and indents",
    }, 
    "Line breaks and Relational operator": {
        "prefix": "Line breaks and Relational operator",
        "body": [
            "",
            "\\\\\\",
            "${1|& =,=,\\equiv,\\coloneqq,\\eqqcolon,& \\equiv,& \\coloneqq,& \\eqqcolon|}",
            "$0",
        ],
        "description": "'\\' and '='",
    },
    "Relational operator: '='": {
        "prefix": "Relation operator",
        "body": [
            "${1|& =,=,\\equiv,\\coloneqq,\\eqqcolon,& \\equiv,& \\coloneqq,& \\eqqcolon|}",
            "$0",
        ],
        "description": "Relational operator: '='",
    },
    "Inequality sign: '>'": {
        "prefix": "Inequality sign",
        "body": [
            "${1|>,\\geq,\\gg,& >,& \\geq,& \\gg|}",
            "$0",
        ],
        "description": "Inequality sign: '>'",
    },
    "Inequality sign: '<'": {
        "prefix": "Inequality sign",
        "body": [
            "${1|<,\\leq,\\ll,& <,& \\leq,& \\ll|}",
            "$0",
        ],
        "description": "Inequality sign: '<'",
    },
    "Line break and Ampasamd": {
        "prefix": "Line break and Ampasamd",
        "body": [
            "",
            "${1|& ,& \\text{}|}",
        ],
        "description": "Line break and Ampasamd",
    },
    "Line break": {
        "prefix": "Line break",
        "body": [
            "",
            "\\\\\\",
            "$0",
        ],
        "description": "Line break",
    },

Key Bindings

スニペットをキーボードショートカットから挿入できるようにしておく. "key" は好きなように変更してより使いやすくすると良いだろう.

keybindings.json (折りたたみ)
    {
        "key": "shift+space",
        "command": "editor.action.insertSnippet",
        "args": {
            "langId": "latex",
            "name": "Add break and indents",
        },
        "when": "editorLangId == latex",
    },
    {
        "key": "ctrl+n",
        "command": "editor.action.insertSnippet",
        "args": {// 
            "langId": "latex",
            "name": "Line breaks and Relational operator",
        },
        "when": "editorLangId == latex",
    },
    {
        "key": "shift+-",
        "command": "editor.action.insertSnippet",
        "args": {// 
            "langId": "latex",
            "name": "Relational operator: '='",
        },
        "when": "editorLangId == latex",
    },
    {
        "key": "shift+,",
        "command": "editor.action.insertSnippet",
        "args": {// 
            "langId": "latex",
            "name": "Inequality sign: '<'",
        },
        "when": "editorLangId == latex",
    },
    {
        "key": "shift+.",
        "command": "editor.action.insertSnippet",
        "args": {// 
            "langId": "latex",
            "name": "Inequality sign: '>'",
        },
        "when": "editorLangId == latex",
    },
    {
        "key": "ctrl+6",
        "command": "editor.action.insertSnippet",
        "args": {// 
            "langId": "latex",
            "name": "Line break and Ampasamd",
        },
        "when": "editorLangId == latex",
    },
    {
        "key": "ctrl+\\",
        "command": "editor.action.insertSnippet",
        "args": {// 
            "langId": "latex",
            "name": "Line break",
        },
        "when": "editorLangId == latex",
    },

keybindings.json で設定しているショートカットを表にまとめておく.

キーボードショートカット スニペット名 効果
Shift+Space Add break and indents 改行とインデント1つ
Shift+- Relational operator: '=' 等号のバリエーションと改行
Shift+, Inequality sign: '<' < のバリエーションと改行
Shift+. Inequality sign: '<' > のバリエーションと改行
Ctrl+6 Line break and Ampasamd 改行とアンパサンド
Ctrl+N Line breaks and Relational operator 改行と\\ ,等号,改行

拡張機能

インデントに色付けを行う拡張機能を導入すると良いだろう.

indent-rainobow | oderwat

また,インデントを自動的に調整する拡張機能もある.これはlatexindent.pl によって動作しているようだ.TeX Live には同封されているようだ.

latex-formatter | Nick Fode

ただし,この拡張機能は数式に対して対応しているのか分からない.

余談

関係演算子と右辺をインデント1つ分変えて差別化した方が良いかとも思っていたが,改行時にインデントを解除する方法が無かったので差別化していない.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment