猫ですの備忘録

ハンドルネームが「猫です」なだけであって, お嬢様言葉で「猫ですの」と言っているわけではありません.

tcolorboxパッケージを用いたカラフルな定理環境

目標

本記事では, LaTeXパッケージの一つであるtcolorboxを用いた以下の定理環境の解説を行う.

ソースコードは以下の通りである. ただし筆者はlualatexを用いているのでドキュメントクラスにltjsarticleを指定しているが, 別に他の環境でも問題なく動くであろうことは注意しておく.

\documentclass{ltjsarticle}

\usepackage{tcolorbox}
\tcbuselibrary{theorems,skins,breakable}

\tcbset{
    thmstyle/.style={
        colframe=blue!50!black,
        colback=blue!50!black!2!white,
        colbacktitle=blue!50!black,
        boxrule=0pt,
        left*=1\zw,
        right*=1\zw,
        sharp corners,
        before skip=1\zw,
        after skip=1\zw,
        before upper={\setlength{\parindent}{1\zw}},
        breakable,
    },
    defstyle/.style={
        colframe=red!50!black,
        colback=red!50!black!2!white,
        colbacktitle=red!50!black,
        boxrule=0pt,
        left*=1\zw,
        right*=1\zw,
        sharp corners,
        before skip=1\zw,
        after skip=1\zw,
        before upper={\setlength{\parindent}{1\zw}},
        breakable,
    }
}

\newtcbtheorem{thm}{Theorem}{thmstyle}{thm}
\newtcbtheorem{defi}{Definition}{defstyle}{defi}

\begin{document}

\begin{thm}{やば定理}{sugoiteiri}
    以下のやばい等式が成り立つ:
    \begin{align*}
        e^{i\pi+1}=0.
    \end{align*}
\end{thm}

\begin{defi}{エモ定義}{sugoiteigi}
    以下のようにエモい定義をする:
    \begin{align*}
        2:=1+1.
    \end{align*}
\end{defi}

\end{document}

さらに自分なりに改変したい場合は, 「tcolorbox 定理環境」等でググっていただければ 本記事よりも丁寧で分かりやすい解説がいくつも出てくるはずである. または, ターミナル上でtexdoc tcolorboxと実行すればtcolorboxパッケージの公式ドキュメントが見れるので, そちらも参照していただければ幸いである.

一番簡単な定理環境の書き方

まずは一番簡単な定理環境の書き方を述べる. 一度, 以下のソースコードをタイプセットしてみる.

\documentclass{ltjsarticle}

\usepackage{tcolorbox}
\tcbuselibrary{theorems}

\newtcbtheorem{mythm}{My Theorem}{}{thm}

\begin{document}

\begin{mythm}{すごい定理}{ラベル名}
    これはすごい定理である.
\end{mythm}

Theorem \ref{thm:ラベル名}より, すごいことが分かる.

\end{document}

すると, 以下のような出力が得られるはずである.

さて, 上に載せたコードを順に説明する.

\usepackage{tcolorbox}
\tcbuselibrary{theorems}

一行目は言わずもがな, tcolorboxパッケージの読み込みである. tcolorboxは名前の通り, 色付きのboxを出力するパッケージである. そのため, 定理環境を作るためには新たなライブラリを読み込む必要がある. それを二行目で行っている. theorems以外のライブラリには例えば次のようなものがある.

  • ページ跨ぎを許すbreakble.

  • 定理環境の囲みの見た目を変えるskins.

\newtcbtheorem{mythm}{My Theorem}{}{thm}

定理環境の設定は, \newtcbtheorem{<name>}{<display name>}{<options>}{<prefix>}という形で記述する.

<name>には定理環境の名前そのものを指定する. したがって上ではmythmと指定しているので, 本文中では\begin{mythm} \end{mythm}のように書くことになる.

<display name>には表示名を指定する. 和文ならば定理, 欧文ならTheorem等が妥当だろうか.

<options>には様々なオプションを指定する. 上のソースコードを見てもらえば分かる通り, 空白にすれば必要最低限の定理環境が得られる. オプションはかなりの種類があるので, 本記事では紹介しきれない. 気になる方は公式ドキュメントを見ていただきたい.

<prefix>には, prefix(接頭辞)を指定する. 例えばprefixをthmと, ある定理のラベルをhogeと指定すれば, その定理(番号)は\ref{thm:hoge}と記述することで引用できる.

\begin{mythm}{定理名}{ラベル名}
    これはすごい定理である.
\end{mythm}

実際の定理環境は\begin{<name>}{<display name>}{<options>}{<label name>} \end{<name>}という形で記述する.

オプションテンプレート

これで綺麗な定理環境が出力できるようになった. とすれば, 定理だけでなく, 定義・例・補題・命題・系・注意・予想, といった環境を作りたい. しかし, それら一つ一つに対して\newtcbtheorem{defi}{My Def}{<大量のオプション>}{defi}と書いていくのは, プリアンブルが汚くなったり, 見づらくなったりといった問題点がある. この問題点を解決するために, オプションテンプレートを作ることにする.

オプションテンプレートの作り方は簡単で, プリアンブルに\tcbset{<options>}と書くだけである. 例えば次のソースコードをタイプセットすれば, 確かに定理環境が変化しているのが分かるだろう.

\documentclass{ltjsarticle}

\usepackage{tcolorbox}
\tcbuselibrary{theorems}

\tcbset{
    colback=green!5,
    colframe=green!35!black,
}

\newtcbtheorem{mythm}{Theorem}{}{thm}

\begin{document}

\begin{mythm}{すごい定理}{ラベル名}
    これはすごい定理である.
\end{mythm}

Theorem \ref{thm:ラベル名}より, すごいことが分かる.

\end{document}

複数のオプションテンプレート

定理のboxの色と定義のboxの色は異なるものにした方が見やすい. しかし先ほどの\tcbset{<options>}は, 全てのtcolorboxの設定を統一してしまうという難点がある. したがって, オプションテンプレートを複数設定し, 定理環境ごとにどのオプションテンプレートを用いるか指定する必要がある. それは, 次のようにして達成される.

\documentclass{ltjsarticle}

\usepackage{tcolorbox}
\tcbuselibrary{theorems}

\tcbset{
    thmstyle/.style={
        colframe=blue!50!black,
        colback=blue!50!black!2!white,
        colbacktitle=blue!50!black,
    },
    defstyle/.style={
        colframe=red!50!black,
        colback=red!50!black!2!white,
        colbacktitle=red!50!black,
    }
}

\newtcbtheorem{mythm}{Theorem}{thmstyle}{thm}
\newtcbtheorem{mydefi}{Definition}{defstyle}{defi}

\begin{document}

\begin{mythm}{すごい定理}{定理のラベル名}
    これはすごい定理だ.
\end{mythm}

\begin{mydefi}{すごい定義}{定義のラベル名}
    びっくりする定義.
\end{mydefi}

\end{document}

定理のオプションテンプレート名をthmstyleとして, style変数にオプションをつらつら書いていけばよい. 定義の方も全く同様である.

そして\newtcbtheorem{<name>}{<display name>}{<options>}{<prefix>}<options>の部分に, 適用したいオプションテンプレート名を指定すればよい.

オプションについて

colframe, colback, colbacktitle

colorboxの枠, 中身の背景, タイトル部分の背景, の色の指定. 色に関する説明はここでは省略する.

colframe=blue!50!black,
colback=blue!50!black!2!white,
colbacktitle=blue!50!black,

boxrule

colorboxの枠の太さの変更.

boxrule=0pt,

left, right

それぞれ, 本文の左側と右側のスペースの調整(インデント幅ではない).

left*=1\zw,
right*=1\zw,

sharp corners

before skip, after skip

colorboxの前後の文章との間に空白を入れる. 以下の例は分かりやすくするために, あえて数値を大きく設定している.

before skip=10\zw,
after skip=10\zw,

before upper

定理環境の本文部分だけの設定(定理名の部分には影響を与えない). (正確には, 一般のcolor boxのupper部分とlower部分に対して, upper部分の前に配置される設定であるが, ここでは詳細は省略する.) ここでは本文の最初に1\zwのインデントを与えるという設定をしている. 以下の例でも分かりやすくするために, あえて数値を大きく設定している.

before upper={\setlength{\parindent}{5\zw}},

breakble

定理環境中にページを跨ぐことを許す設定.