LaTeX 数式問題集つくってみた

# LaTeX 数式問題集つくってみた

LaTeX における数式の問題集を作ってみました。ぜひ挑戦してみてください :muscle:

この問題集の対象者は、それほど調べなくても LaTeX で数式を打てるようになった人です。
すなわち、最低限次のような数式のコマンドを瞬時に想起できる人です 🧠

- 分数、累乗、根号
- “sin” 等の名前演算子
- 総和記号・積分記号
- 基本的な数式環境

:::note info
この問題集は、次のパッケージのみを読み込んでいることを前提としています。

- lmodern
- amsmath
- mathtools
- amssymb
- mathrsfs
- bm

すなわち、プリアンブルが以下のようになっています。

```latex
\usepackage{lmodern}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{amssymb}
\usepackage{mathrsfs}
\usepackage{bm}
```
:::

:::note info
＋α として、unicode-math パッケージを利用した際の問題も出題しています。また、フォントは STIX Two Math を利用します。

このときのプリアンブルは以下のようになっています。

```latex
\usepackage{unicode-math}
\setmathfont{STIX Two Math}
```
:::

それでは、全問正解目指して頑張ってください :bangbang:

## 第 1 問

次のラテン大文字 (ABC...XYZ) の字形に変更するコマンドを答えてください。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/4be3ca9c-d8e9-1faf-d334-8967abd11160.png)

<details>
<summary> 答え </summary>

問いの字形のラテン大文字は、次の表のようになっていました。

|     | 字形           |  コマンド   | 出所       |
| :-: | :------------- | :---------: | :--------- |
|  1  | 太字斜体       |    `\bm`    | bm         |
|  2  | 筆記体         | `\mathcal`  | デフォルト |
|  3  | フラクトゥール | `\mathfrak` | amssymb    |
|  4  | 黒板太字       |  `\mathbb`  | amssymb    |
|  5  | 花文字         | `\mathscr`  | mathrsfs   |

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/d3027c5b-233a-6b45-2bd4-f710ee2df819.png)

LaTeX には他にも次の 5 つの字形があります。これらはすべてデフォルトから提供されています。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/7faee32e-f89f-2d16-cec0-8a559b940f0f.png)

</details>

### ＋α (1)

第 1 問で再現したラテン大文字の字形を unicode-math パッケージのみの状況で再現してください。（unicode-math では amsmath のみが自動的に読み込まれます）

<details>
<summary> 答え </summary>

デフォルトと unicode-math ありとの対応は、次のようになっています。

|    無し     | unicode-math あり |
| :---------: | :---------------: |
|  `\mathbf`  |    `\symbfup`     |
|    `\bm`    |    `\symbfit`     |
|  `\mathsf`  |    `\symsfup`     |
|  `\mathtt`  |     `\symtt`      |
|  `\mathbb`  |     `\symbb`      |
| `\mathscr`  |     `\symscr`     |
| `\mathcal`  |     `\symcal`     |
| `\mathfrak` |    `\symfrak`     |

unicode-math を利用すると、これらのコマンドによってラテン文字小文字に対しても利用することが出来ます。

ただし、`\symbfit` と `\symscr` について注意が必要です。

----------

unicode-math では、`bold-style` オプションが存在します。このオプションによって、`\symbf` の結果を変更することが出来ます。

| オプション | ラテン文字 <br> 大・小文字 | ギリシャ <br> 大文字 | ギリシャ <br> 小文字 |
| :--------: | :------------------------: | :------------------: | :------------------: |
|   `ISO`    |            斜体            |         斜体         |         斜体         |
|   `TeX`    |            立体            |         斜体         |         立体         |
| `upright`  |            立体            |         立体         |         立体         |

そのためドキュメント内では、`bold-style = ISO` に指定した上で `\symbf` を利用すると、期待した結果を得ることが出来ます。

----------

unicode-math では、いくつかの OpenType フォントを利用することが出来ますが、すべてのフォントで `\symcal` と `\symscr` が別個の字形として扱えるとは限りません。

Unicode 上では、LaTeX における Calligraphic 体と Script 体のような字形を異なるコードポイントとして登録していません。そのため、同じものとして出力されてしまいます。

この 2 つのコマンドを異なる字形として認識させるには、特定の Stylistic set を有しているフォントを利用する必要があります。

例えば、STIX Two Math を利用している場合は、以下のようにすることで `\symscr` を `\symcal` と分けることが出来ます。

```latex
\usepackage{unicode-math}
\setmathfont{STIX Two Math}
\setmathfont{STIX Two Math}[ range = { scr, bfscr }, StylisticSet = 1 ]
```

STIX Two Math には ss01 に [Script 体][ss-compart] を Calligraphic 体に変更する機能があります。これを `\mathscr` のみに有効にしています。

[ss-compart]: https://www.compart.com/en/unicode/search?q=Script+Capital#characters "search: Script Capital - compart.com"

<!-- ![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/09f53344-f12a-5032-f6a1-d22865c34b60.png) -->

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/90279656-7e4a-2462-ffad-6931a23a9f02.png)

</details>

## 第 1-2 問

次の “X” 上部のアクセントをそれぞれ答えてください。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/2c4e09f4-ca3e-69c6-2a59-1e030dfe1f74.png)

<details>
<summary> 答え（折りたたみ）</summary>

以下の表のようになっていました。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/9462881e-4977-1e21-3d99-4d3386d5cf9a.png)

</details>

### ＋α (1-2)

第 1-2 問で再現したアクセントを unicode-math のみで答えてください。

<details>
<summary> 答え（折りたたみ）</summary>

以下の表のようになっていました。
unicode-math では、`\mathring` ではなく `\ocirc` であることに注意してください。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/3eb09350-a7bf-c761-80bd-0970579154cb.png)

</details>

## 第 2 問

次の式を再現してください。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/1714f4b9-5daf-2f52-6137-29146c36838c.png)

<details>
<summary> 答え </summary>

二重の垂直棒は `\lVert`\~`\rVert`、山括弧は `\langle`\~`\rangle` を用います。

左式：

```latex
  \lVert x\rVert
    \coloneq
    \sqrt{\langle x, x \rangle}
```

右式：

```latex
  \lVert x\rVert
    \stackrel{\mathrm{def}}{=}
    \sqrt{\langle x, x \rangle}
```

`≔` は mathtools による `\coloneq` を利用します。

ここで、<code>\colon**eqq**</code> では？と思った人は注意してください。mathtools は 2022 年夏のアップデートで `≔` を含むいくつかの関係演算子のコマンド名を変更しています。
詳細は以下の記事にあります。

https://qiita.com/Yarakashi_Kikohshi/items/1b639509573f001a20da

`≝` は `\stackrel` で `\mathrm{def}` と `=` を重ねます。“def” が大きいと感じる場合は `\scriptscriptstyle` を指定するとイイ感じになります。

実際に利用する際には、次のようにコマンドを定義しておくと楽になります。

```latex
\newcommand{\eqdef}{\stackrel{\mathrm{def}}{=}}
%% or
\newcommand{\eqdef}{\stackrel{\scriptscriptstyle\mathrm{def}}{=}}
```

</details>

### ＋α (2)

第 2 問で再現した `≔` と `≝` を unicode-math パッケージのみの状況で再現してください。

<details>
<summary> 答え </summary>

Unicode には `≔` と `≝` があるため、unicode-math で直接出力することが出来ます。

| 関係演算子 | コマンド   |
| :--------: | :--------- |
|    `≔`     | `\coloneq` |
|    `≝`     | `\eqdef`   |

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/838cde82-5e75-22b2-c469-95d9772cd215.png)

`≝` に `\stackrel` で定義する必要がない点はちょっと楽です。

</details>

## 第 3 問

sin や cos 等、三角関数に代表されるような名前演算子は斜体ではなく立体で表現されるべきです。これを受けて、amsmath では `\sin` や `\cos` などとすることで立体にすることが出来ます。

しかし、amsmath では解析力学で利用されるような grad・div・rot がありません。これを `\grad`・`\div`・`\rot` から表示できるようにしてください。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/6087819a-0a25-1894-d7c8-6f0a13fef9b0.png)

ただし、`\div` にはすでに `÷` が定義されていることに注意してください。

<details>
<summary> 答え </summary>

amsmath から提供される `\DeclareMathOperator` を利用することで新たな名前演算子を定義できます。
また、すでに定義されているコマンドを別名にして、新たにコマンドを定義したい場合は `\let` を使います。

```latex
\DeclareMathOperator{\grad}{grad}
\let\div\divisionsymbol
\DeclareMathOperator{\div}{div}
\DeclareMathOperator{\rot}{rot}
```

上の解答例では、`÷` を `\divisionsymbol` と定義しなおしています。

`\DeclareMathOperator` は、`\mathrm` で定義したものとは以下の点で異なります。
- **名前演算子と変数・括弧とのスペースが調整される**
    ![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/e84e4adf-5206-d0aa-b82c-567d95cf9576.png)
- **上付き・下付きの添え字位置を制御できる**

    例えば、`\log` と `\lim` も `\DeclareMathOperator` から定義されていますが、添え字位置が異なります。

    これは、`\log` が `\DeclareMathOperator` で定義されているのに対して、`\lim` は \* 付きの `\DeclareMathOperator*` で定義されているためです。

    ![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/df6ac3fd-3d64-8382-f8c1-675f43701abb.png)

</details>

<!-- ### ＋α (3)

unicode-math を利用してフォントを変更している場合、`\sin` などの名前演算子は本文テキストのフォントを参照します。そのため、数式フォント変更の影響を受けません。本来は `\symup` になっているべきでしょう。
（`sample text` は STIX Two Math の `\symup` になっています）

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/fd75bfc0-e6e5-40c0-578a-b22c8a3dbed4.png)

では、名前演算子のフォントを変更した数式フォントに合わせるにはどのようにするべきでしょうか。

<details>
<summary> 答え </summary>

`\setoperatorfont` を利用します。

```latex
\usepackage{unicode-math}
\setmathfont{STIX Two Math}
\setoperatorfont\symup
```

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/8d7695dd-7d9f-2f6a-f7da-1a7570e9bccf.png)

もちろん、`\setoperatorfont\symsf` 等とすると、`\sin` がサンセリフ体になります。

</details>
-->

## 第 4 問

括弧の高さを自動調整させる場合、`\left`\~`\right` を利用します。これらの間には `\\` を含めることは出来ません。

これを踏まえて、以下のような数式を再現してください。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/061e3d3d-7da1-edaa-74a2-f1f6f6169111.png)

<details>
<summary> 答え </summary>

```latex
\begin{equation}
  \begin{split}
    f(x)
    \left(
      \sum_{n=1}^{\infty}n + \sum_{n=1}^{\infty}\frac{1}{n}
    \right)
      & =
      f(x)
      \Bigl(
          1 + 2 + 3 + \cdots
        \\
        & \phantom{{}={}f(x)\Big(}
          + 1 + \frac{1}{2} + \frac{1}{3} + \cdots
      \Bigr)
  \end{split}
\end{equation}
```

1 つの式が 2 行以上に渡る場合、split 環境を利用します。

左辺は改行しないため `\left`\~`\right` で囲っても問題ありません。
しかし、右辺は括弧の前後に改行が含まれるため、右辺全体に `\left`\~`\right` が利用できません。そのため、手動で調整することが検討されます。
今回は `\Bigl(`・`\Bigr)` としました。

たまに、改行前後で `\left(`\~`\right.` と `\left.`\~`\right)` を利用する人がいますが、括弧の高さが揃わない可能性があるため避けるべきです。

右辺の当該部分を次のように変更すると、括弧の大きさが揃わず奇妙な結果になります。

```latex
  \left(
    1 + 2 + 3 + \cdots
  \right.
  \\
  & \phantom{{}={}f(x)}
  \left.
    + 1 + \frac{1}{2} + \frac{1}{3} + \cdots
  \right)
```

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/4c4e1348-fd1b-70ad-558e-748778febd9a.png)

</details>

## 第 5 問

次の数式を再現してください。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/32761bb4-82eb-c101-5b70-af9f0ab7dce9.png)

<details>
<summary> 答え </summary>

```latex
\begin{equation}
  \left\{
    f(x,y) \in \mathbb{R}^2
  \,\middle\vert\,
    \begin{lgathered}
      |x| < 7 \\
      0 \leq y \leq 7 \\
      x^2 + y^2 \leq 10
    \end{lgathered}
  \right\}
\end{equation}
```

高さを自動調整する括弧には `\left`・`\right` の他に `\middle` があります。これは、`\left`\~`\right` の中で何回でも利用することが出来ます。
（`\middle\vert` は周りに適度なスペースを作らないため、`\,` でスペースを作っています）

そのため、Dirac の bra-ket 記法は次のように記述できます。（実際は braket パッケージや physics2 パッケージを利用した方が楽です）

```latex
  \left\langle
    \phi
  \,\middle\vert\,
    \frac{H}{2}
  \,\middle\vert\,
    \psi
  \right\rangle
```

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/95efc182-06be-b3b4-5028-efc421ec7d76.png)

また、内包的表記の右側の条件部は [lr]?gathered 環境を利用すると良いです。今回は左揃えの lgathered 環境を利用しました。

|   環境    | 揃え位置 | 出所      |
| :-------: | :------- | :-------- |
| gathered  | 中央揃え | amsmath   |
| lgathered | 左揃え   | mathtools |
| rgathered | 右揃え   | mathtools |

</details>

## 第 6 問

以下の数式では、総和記号、総積記号の条件が右下に配置されています。これをそれぞれの記号直下に配置されるように修正してください。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/a5ce08c7-2bdb-5d6a-40d4-fde8a0d32a37.png)

<details>
<summary> 答え </summary>

大型演算子の添え字位置をコントロールする `\limits`・`\nolimits` を利用して添え字位置を変更しましょう。

大型演算子と添え字の間に `\limits` を置きます。

```latex
\frac{ \sum\limits_{n > 0} z^n }
     { \prod\limits_{1\leq k\leq n} (1-q^k) }
```

`\frac` 中の大型演算子の条件が右上・右下に配置される原因は `\frac` 内では `\textstyle` になっているためです。そのため、`\frac` 内で明示的に `\displaystyle` を指定すれば良いだろうと考えた人もいるかもしれません。しかし実際に試してみると、大型演算子があまりにも大きくなってしまいます。

以下の違いを確認してください。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/439ba188-2789-7e1c-6e85-fe59880cc56b.png)

</details>

## 第 7 問

次の数式を再現してください。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/b261166a-4926-90f4-7868-31d0ae2d9244.png)

<details>
<summary> 答え </summary>

積分や総和などの条件が複数行に渡る場合、`\substack` を利用します。

左式：

```latex
\int_{ \substack{ x<10 \\ y<10 \\ z<10 } } f(\bm{x}) d\bm{x}
```

右式：

```latex
\sum_{ \substack{ 0\le i\le m\\ 0<j<n} } P(i,j)
```

積分記号の場合、複数行になると詰まって見えることがあります。これを避けて積分記号の直下に配置する方が綺麗に見えるかもしれません。

```latex
\int\limits_{ \substack{ x<10 \\ y<10 \\ z<10 } } f(x) dx
```

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/def6171e-dfe4-edce-d63f-c09cb6bca2c7.png)

総和の条件が総和記号よりも横に長い場合、総和記号と関数との間が空いてしまい不格好に感じることがあります。`\smashoperator` を利用すると、数式がコンパクトになります。

```latex
\smashoperator[r]{\sum_{ \substack{ 0\le i\le m\\ 0<j<n} }} P(i,j)
```

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/513051ce-84e1-f046-3c35-f64bacb0dcc7.png)

</details>

## 第 8 問

次の式を再現してください。ただし、微分右側の垂直棒は `\left`\~`\right` で自動調整してください。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/0fa4abfc-0606-11b5-4b4e-58f63137dac9.png)

<details>
<summary> 答え </summary>

`\left.`\~`\right\rvert` とすることで `\rvert` との対応を採ることが出来ます。

```latex
\begin{equation}
  \left.
    \frac{ \partial T }{ \partial P }
  \right\rvert_{ S=\mathrm{const} }
    =
    \left.
      \frac{ \partial V }{ \partial S }
    \right\rvert_{ P=\mathrm{const} }
\end{equation}
```

もちろん、手動で高さを調整する場合は、`\biggr\rvert` とすることで同じものを再現できます。

```latex
\begin{equation}
  \frac{ \partial T }{ \partial P }
  \biggr\rvert_{ S=\mathrm{const} }
    =
    \frac{ \partial V }{ \partial S }
    \biggr\rvert_{ P=\mathrm{const} }
\end{equation}
```

</details>

## 第 9 問

次の式を再現してください。ただし、文章の前後ですべての `=` が揃っています。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/15ded23c-6e63-d172-22a0-90e3f4c0f53b.png)

<details>
<summary> 答え </summary>

複数行に渡る数式の途中に文章を挿入するには、`\intertext`・`\shortintertext` を利用します。

```latex
\begin{align}
  ax^2 + bx + c
    & = 0
  \\
  \intertext{両辺を$ a $で割り、平方完成します。（$ a\neq 0 $）}
  \left( x + \frac{b}{2a} \right)^2 - \frac{b^2 - 4ac}{4a^2}
    & = 0
  \\
  \shortintertext{指数に注意しながら$ x $について解きます。}
  x
    & = \frac{- b \pm\sqrt{b^2 - 4ac}}{2a}
\end{align}
```

`\shortintertext` は `\intertext` よりも行間が狭くなります。実は、問題の数式中のテキストは、`\intertext` と `\shortintertext` の両方を使っていました。

</details>

### ＋α (4)

次の式を再現してください。（この問題は unicode-math ではありません）

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/317dd1af-112b-ad00-5d34-314354c5c474.png)

<details>
<summary> 答え </summary>

`\vdotswithin` または `\shortvdotswithin` を利用します。ただし、この 2 つのコマンドは少しだけ勝手が異なることに注意してください。
`\shortvdotswithin` では、`&` と `\\` が不要です。

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

`\shortvdotswithin` は `\vdotswithin` よりも行間が狭くなります。

</details>

## 第 10 問

次の式を再現してください。ただし、式番号を手動で調整する `\tag` 等は利用しません。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/600177af-be8f-e114-2223-704e2a87a316.png)

<details>
<summary> 答え </summary>

subequations 環境を利用します。

```latex
\begin{subequations}
  \begin{align}
    \nabla\cdot\bm{B} (t, \bm{x})
      & = 0
    \\
    \nabla\times\bm{E} (t, \bm{x})
      & = - \frac{\partial \bm{B} (t, \bm{x})}{\partial t}
    \\
    \nabla\cdot\bm{D} (t, \bm{x})
      & = \rho (t, \bm{x})
    \\
    \nabla\times\bm{H} (t, \bm{x})
      & = \bm{j} (t, \bm{x}) + \frac{\partial \bm{D} (t, \bm{x})}{\partial t}
  \end{align}
\end{subequations}
```

連立方程式に関する詳細は、以下の記事を参照してください。

https://qiita.com/Yarakashi_Kikohshi/items/dc8f983d24698119bf71

</details>

## ボーナス問題

次の 4 つの記号のコマンド名を答えてください。ただし、これらの記号は unicode-math を利用していることを前提とします。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/f31d7871-9875-2325-38d7-9e1130185b11.png)

コマンド名の分からない数学記号の調べ方は以下の記事を参照してください。

https://qiita.com/Yarakashi_Kikohshi/items/fe9d93378e28581bc715

<!--
```latex
\turnangle
\PropertyLine
\veeonwedge
\bowtie
```
-->

# 参考

- [short-math-guide][]
- [amsmath][]
- [mathtools][]
- [unicode-math][]

[amsmath]: https://www.ctan.org/pkg/amsmath "CTAN: Package amsmath"
[short-math-guide]: https://www.ctan.org/pkg/short-math-guide "CTAN: Package short-math-guide"
[mathtools]: https://www.ctan.org/pkg/mathtools "CTAN: Package mathtools"
[unicode-math]: https://www.ctan.org/pkg/unicode-math "CTAN: Package unicode-math"

# さいごに

何問正解できたでしょうか。正直なところ、半分くらい正解していたらイイ感じだと思います。

今回の問題集は MathJax でも機能するものが多いので、Qiita や GitHub で数式を記述する際にも活用できるかも知れません。

実は、「amsmath と mathtools で提供している数式環境をすべて答えよ」や「amsmath が提供している名前演算子を全て答えよ」なんかも入れようかと思いましたが、あまりにも実用性が無さ過ぎる問題だったため含めませんでした。

この問題集では次のような数式を扱いませんでした。どこかの問題集では扱えると良いですね。

- 行列
- 場合分け

パッケージそのものもかなり制限しているので、physics2 や coeffdiff、semantex など他のパッケージを絡めた問題があっても良かったかもしれません。

アクセントに関して出題し忘れていたので第 1-2 問として追加しました。
第 1 問から第 3 問は基本的なものなので、LaTeX に慣れている人にとっては簡単だと思います。しかしながら、unicode-math と異なる点が数多くあるため、＋α は知らない人がいるのではないでしょうか。