LaTeX 数式問題集つくってみた
LaTeX における数式の問題集を作ってみました。ぜひ挑戦してみてください
この問題集の対象者は、それほど調べなくても LaTeX で数式を打てるようになった人です。
すなわち、最低限次のような数式のコマンドを瞬時に想起できる人です 🧠
- 分数、累乗、根号
- “sin” 等の名前演算子
- 総和記号・積分記号
- 基本的な数式環境
この問題集は、次のパッケージのみを読み込んでいることを前提としています。
- lmodern
- amsmath
- mathtools
- amssymb
- mathrsfs
- bm
すなわち、プリアンブルが以下のようになっています。
\usepackage{lmodern}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{amssymb}
\usepackage{mathrsfs}
\usepackage{bm}
+α として、unicode-math パッケージを利用した際の問題も出題しています。また、フォントは STIX Two Math を利用します。
このときのプリアンブルは以下のようになっています。
\usepackage{unicode-math}
\setmathfont{STIX Two Math}
それでは、全問正解目指して頑張ってください
第 1 問
次のラテン大文字 (ABC...XYZ) の字形に変更するコマンドを答えてください。
答え
問いの字形のラテン大文字は、次の表のようになっていました。
字形 | コマンド | 出所 | |
---|---|---|---|
1 | 太字斜体 | \bm |
bm |
2 | 筆記体 | \mathcal |
デフォルト |
3 | フラクトゥール | \mathfrak |
amssymb |
4 | 黒板太字 | \mathbb |
amssymb |
5 | 花文字 | \mathscr |
mathrsfs |
LaTeX には他にも次の 5 つの字形があります。これらはすべてデフォルトから提供されています。
+α (1)
第 1 問で再現したラテン大文字の字形を unicode-math パッケージのみの状況で再現してください。(unicode-math では amsmath のみが自動的に読み込まれます)
答え
デフォルトと 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
の結果を変更することが出来ます。
オプション | ラテン文字 大・小文字 |
ギリシャ 大文字 |
ギリシャ 小文字 |
---|---|---|---|
ISO |
斜体 | 斜体 | 斜体 |
TeX |
立体 | 斜体 | 立体 |
upright |
立体 | 立体 | 立体 |
そのためドキュメント内では、bold-style = ISO
に指定した上で \symbf
を利用すると、期待した結果を得ることが出来ます。
unicode-math では、いくつかの OpenType フォントを利用することが出来ますが、すべてのフォントで \symcal
と \symscr
が別個の字形として扱えるとは限りません。
Unicode 上では、LaTeX における Calligraphic 体と Script 体のような字形を異なるコードポイントとして登録していません。そのため、同じものとして出力されてしまいます。
この 2 つのコマンドを異なる字形として認識させるには、特定の Stylistic set を有しているフォントを利用する必要があります。
例えば、STIX Two Math を利用している場合は、以下のようにすることで \symscr
を \symcal
と分けることが出来ます。
\usepackage{unicode-math}
\setmathfont{STIX Two Math}
\setmathfont{STIX Two Math}[ range = { scr, bfscr }, StylisticSet = 1 ]
STIX Two Math には ss01 に Script 体 を Calligraphic 体に変更する機能があります。これを \mathscr
のみに有効にしています。
第 1-2 問
次の “X” 上部のアクセントをそれぞれ答えてください。
+α (1-2)
第 1-2 問で再現したアクセントを unicode-math のみで答えてください。
第 2 問
次の式を再現してください。
答え
二重の垂直棒は \lVert
~\rVert
、山括弧は \langle
~\rangle
を用います。
左式:
\lVert x\rVert
\coloneq
\sqrt{\langle x, x \rangle}
右式:
\lVert x\rVert
\stackrel{\mathrm{def}}{=}
\sqrt{\langle x, x \rangle}
≔
は mathtools による \coloneq
を利用します。
ここで、\coloneqq
では?と思った人は注意してください。mathtools は 2022 年夏のアップデートで ≔
を含むいくつかの関係演算子のコマンド名を変更しています。
詳細は以下の記事にあります。
https://qiita.com/Yarakashi_Kikohshi/items/1b639509573f001a20da
≝
は \stackrel
で \mathrm{def}
と =
を重ねます。“def” が大きいと感じる場合は \scriptscriptstyle
を指定するとイイ感じになります。
実際に利用する際には、次のようにコマンドを定義しておくと楽になります。
\newcommand{\eqdef}{\stackrel{\mathrm{def}}{=}}
%% or
\newcommand{\eqdef}{\stackrel{\scriptscriptstyle\mathrm{def}}{=}}
+α (2)
第 2 問で再現した ≔
と ≝
を unicode-math パッケージのみの状況で再現してください。
答え
Unicode には ≔
と ≝
があるため、unicode-math で直接出力することが出来ます。
関係演算子 | コマンド |
---|---|
≔ |
\coloneq |
≝ |
\eqdef |
≝
に \stackrel
で定義する必要がない点はちょっと楽です。
第 3 問
sin や cos 等、三角関数に代表されるような名前演算子は斜体ではなく立体で表現されるべきです。これを受けて、amsmath では \sin
や \cos
などとすることで立体にすることが出来ます。
しかし、amsmath では解析力学で利用されるような grad・div・rot がありません。これを \grad
・\div
・\rot
から表示できるようにしてください。
ただし、\div
にはすでに ÷
が定義されていることに注意してください。
答え
amsmath から提供される \DeclareMathOperator
を利用することで新たな名前演算子を定義できます。
また、すでに定義されているコマンドを別名にして、新たにコマンドを定義したい場合は \let
を使います。
\DeclareMathOperator{\grad}{grad}
\let\div\divisionsymbol
\DeclareMathOperator{\div}{div}
\DeclareMathOperator{\rot}{rot}
上の解答例では、÷
を \divisionsymbol
と定義しなおしています。
\DeclareMathOperator
は、\mathrm
で定義したものとは以下の点で異なります。
第 4 問
括弧の高さを自動調整させる場合、\left
~\right
を利用します。これらの間には \\
を含めることは出来ません。
これを踏まえて、以下のような数式を再現してください。
答え
\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)
を利用する人がいますが、括弧の高さが揃わない可能性があるため避けるべきです。
右辺の当該部分を次のように変更すると、括弧の大きさが揃わず奇妙な結果になります。
\left(
1 + 2 + 3 + \cdots
\right.
\\
& \phantom{{}={}f(x)}
\left.
+ 1 + \frac{1}{2} + \frac{1}{3} + \cdots
\right)
第 5 問
次の数式を再現してください。
答え
\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 パッケージを利用した方が楽です)
\left\langle
\phi
\,\middle\vert\,
\frac{H}{2}
\,\middle\vert\,
\psi
\right\rangle
また、内包的表記の右側の条件部は [lr]?gathered 環境を利用すると良いです。今回は左揃えの lgathered 環境を利用しました。
環境 | 揃え位置 | 出所 |
---|---|---|
gathered | 中央揃え | amsmath |
lgathered | 左揃え | mathtools |
rgathered | 右揃え | mathtools |
第 6 問
以下の数式では、総和記号、総積記号の条件が右下に配置されています。これをそれぞれの記号直下に配置されるように修正してください。
答え
大型演算子の添え字位置をコントロールする \limits
・\nolimits
を利用して添え字位置を変更しましょう。
大型演算子と添え字の間に \limits
を置きます。
\frac{ \sum\limits_{n > 0} z^n }
{ \prod\limits_{1\leq k\leq n} (1-q^k) }
\frac
中の大型演算子の条件が右上・右下に配置される原因は \frac
内では \textstyle
になっているためです。そのため、\frac
内で明示的に \displaystyle
を指定すれば良いだろうと考えた人もいるかもしれません。しかし実際に試してみると、大型演算子があまりにも大きくなってしまいます。
以下の違いを確認してください。
第 7 問
次の数式を再現してください。
答え
積分や総和などの条件が複数行に渡る場合、\substack
を利用します。
左式:
\int_{ \substack{ x<10 \\ y<10 \\ z<10 } } f(\bm{x}) d\bm{x}
右式:
\sum_{ \substack{ 0\le i\le m\\ 0<j<n} } P(i,j)
積分記号の場合、複数行になると詰まって見えることがあります。これを避けて積分記号の直下に配置する方が綺麗に見えるかもしれません。
\int\limits_{ \substack{ x<10 \\ y<10 \\ z<10 } } f(x) dx
総和の条件が総和記号よりも横に長い場合、総和記号と関数との間が空いてしまい不格好に感じることがあります。\smashoperator
を利用すると、数式がコンパクトになります。
\smashoperator[r]{\sum_{ \substack{ 0\le i\le m\\ 0<j<n} }} P(i,j)
第 8 問
次の式を再現してください。ただし、微分右側の垂直棒は \left
~\right
で自動調整してください。
答え
\left.
~\right\rvert
とすることで \rvert
との対応を採ることが出来ます。
\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
とすることで同じものを再現できます。
\begin{equation}
\frac{ \partial T }{ \partial P }
\biggr\rvert_{ S=\mathrm{const} }
=
\frac{ \partial V }{ \partial S }
\biggr\rvert_{ P=\mathrm{const} }
\end{equation}
第 9 問
次の式を再現してください。ただし、文章の前後ですべての =
が揃っています。
答え
複数行に渡る数式の途中に文章を挿入するには、\intertext
・\shortintertext
を利用します。
\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
の両方を使っていました。
+α (4)
次の式を再現してください。(この問題は unicode-math ではありません)
答え
\vdotswithin
または \shortvdotswithin
を利用します。ただし、この 2 つのコマンドは少しだけ勝手が異なることに注意してください。
\shortvdotswithin
では、&
と \\
が不要です。
\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
よりも行間が狭くなります。
第 10 問
次の式を再現してください。ただし、式番号を手動で調整する \tag
等は利用しません。
答え
subequations 環境を利用します。
\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
ボーナス問題
次の 4 つの記号のコマンド名を答えてください。ただし、これらの記号は unicode-math を利用していることを前提とします。
コマンド名の分からない数学記号の調べ方は以下の記事を参照してください。
参考
さいごに
何問正解できたでしょうか。正直なところ、半分くらい正解していたらイイ感じだと思います。
今回の問題集は MathJax でも機能するものが多いので、Qiita や GitHub で数式を記述する際にも活用できるかも知れません。
実は、「amsmath と mathtools で提供している数式環境をすべて答えよ」や「amsmath が提供している名前演算子を全て答えよ」なんかも入れようかと思いましたが、あまりにも実用性が無さ過ぎる問題だったため含めませんでした。
この問題集では次のような数式を扱いませんでした。どこかの問題集では扱えると良いですね。
- 行列
- 場合分け
パッケージそのものもかなり制限しているので、physics2 や coeffdiff、semantex など他のパッケージを絡めた問題があっても良かったかもしれません。
アクセントに関して出題し忘れていたので第 1-2 問として追加しました。
第 1 問から第 3 問は基本的なものなので、LaTeX に慣れている人にとっては簡単だと思います。しかしながら、unicode-math と異なる点が数多くあるため、+α は知らない人がいるのではないでしょうか。