読者です 読者をやめる 読者になる 読者になる

Diary over Finite Fields

515ひかるが書き溜めたメモとコラムと雑記

tcolorbox で遊んでみた.

LaTeX

やろうとしたら簡単に出来たので, メモしておく. やって良いのかは知らない.

きっかけ

tcolorbox (CTAN はこちら) に目をつけたのは, 僕は参加していない*1けれど, 昨日の 11/7 の TeXユーザーのつどい にてこのパッケージが紹介されたとの Tweet を見かけて(どなたのかは忘れました, ごめんなさい), 自分も使ってみようかと思った次第. マニュアルをとりあえず見てみると標準でカウンターがついていて, タイトルなどの装飾がかなり楽にできる雰囲気を醸し出していたので, 定理環境っぽいものを作ってみることにした, っていうのがこの記事の主題です.

まずは普通に使ってみる

とりあえず普通に使うのは簡単. 文面は宇多田ヒカルさんの「ぼくはくま」によります.

\begin{tcolorbox}[title=ぼくはくま.]
ぼくはくま.

くるまじゃないよ.
\end{tcolorbox}

と入力すると, こんな感じの出力に.

f:id:hikaru515:20151108170050p:plain

これだとたとえば公式の文書とか書類にするには少し装飾過多という感じなので, 背景色とかを白で調整したりしましょう.

\begin{tcolorbox}[colback=white,colframe=black,colbacktitle=white,coltitle=black,title=ぼくはくま.]
ぼくはくま.

くるまじゃないよ.
\end{tcolorbox}

f:id:hikaru515:20151108170324p:plain

まぁ他にも無数にオプションはあるので, マニュアルを読もうという感じですね.

カウンター付き box を作る

マニュアルの p.14 に次のような例がある.

\newtcolorbox[auto counter,number within=section]{pabox}[2][]{%
colback=red!5!white,colframe=red!75!black,fonttitle=\bfseries,
title=Examp.~\thetcbcounter: #2,#1}

\begin{pabox}[colback=yellow]{Hello there}
This is my own box with a mandatory
numbered title and options.
\end{pabox}

出力はマニュアルを見てもらうとして, これをちょっとだけ応用すれば定理環境が作れる*2よな……と簡易的に作ったのがこちら.

\newcommand{\kara}{}
\newtcolorbox[auto counter, number within=section]{thmbox}[1][]{%
 colback=red!5!white, colframe=red!75!black, fonttitle=\gtfamily,
 title=Thm.~\thetcbcounter%
\if #1\kara \else : #1 \fi}

色とかは何でもいいのだけど, ほとんどコピーしたのでそのまま. \kara は, 要するにタイトル(オプション引数)が未入力のときとそうでないときで条件分岐するために作っただけです. これくらい {\LaTeX} に定義されていそうなものですが……もし知っている人いたら教えてください. これで次のような出力ができる.

f:id:hikaru515:20151108172350p:plain

\begin{thmbox}
 てすと
\end{thmbox}

タイトルをつけると, こんな感じ.

f:id:hikaru515:20151108172848p:plain

\begin{thmbox}[Fermat の小定理]
 $a$ を整数, $p$ を素数とするとき,
 \begin{align}
  a^{p-1} \equiv 1 \pmod p
 \end{align}
が成立する.
\end{thmbox}

管理が面倒

しかし, これだと例えば propbox, lembox って感じでいくつも newtcolorbox しなきゃいけないし, ひとつ設定を変えるたびにすべての箱の設定を変更しなきゃいけないので面倒ですよね. そこで, 簡易的に同じ種類の箱を名前だけ変えて作るマクロを書いてみました.

\newcommand{\newThmBox}[2]{%  #1 = environment name, #2 = headder title
\newtcolorbox[auto counter, number within=section]{#1box}[1][]{%
 colback=red!5!white, colframe=red!75!black, fonttitle=\gtfamily,
 title=#2.~\thetcbcounter%
\if ##1\kara \else : ##1 \fi} % マクロ内で引数をとるものは, # を重ねる.
}

わからなかったのはこのときの, \newcommand 内にある \newtcolorbox の引数のとり方だったんですが, これは # を重ねるだけでいいようで. 下記リンクが参考になりました.

oku.edu.mie-u.ac.jp

これでたとえば, \newThmBox{lem}{Lemma} とかして, 次のように入力しましょ.

f:id:hikaru515:20151108174338p:plain

\begin{lembox}[title test]
 test
\end{lembox}

という感じで, 同じ要領でハコをまとめて管理できます. 便利ですね.

このやり方だと, 箱ごとに番号をつけてしまうので, 命題と定理とを連番で付けたい人とかには向かないですが, 僕はやる気はないのでこの記事には載せません.

まぁ定理環境を作る必要はおそらくなかったのですが, tcolorbox.sty に親しむという意味でちょっと遊んでみましたというだけです.

しかし日本語の tcolorbox の記事とかほとんどなかったのだけれど, マニュアルが英語しかないとあまり広まらないんだろうか. これは永遠の課題やろなぁ.

*1:機会があれば行ってみたいと思い始めている.

*2:有能な定理環境パッケージは他に数多あるので必ずしも作る必要はないし, 実際私は ntheorem & mdframed ユーザーであるので別に困っていない