ぱるちのものおき2.0

主にLaTeXや数学のお話をするブログです。

tcolorboxのお誘い

tcolorbox.sty を使って  \rm\TeX を豊かにしよう!っていうお誘いの記事です。

この記事の主目的は,tcolorbox.styを用いたいくつかの例を書いて,自分の備忘録にする&\rm\TeXってこんなこともできるんだ!と分からす&需要があるかもしれないのでソースコードを公開しておくことにあります。
従いまして,詳しいtcolorbox.styの利用法については,およそ500ページほどのマニュアルがありますので,例えばコマンドプロンプトかターミナルで

texdoc tcolorbox

と入力するか,
http://texdoc.net/texmf-dist/doc/latex/tcolorbox/tcolorbox.pdf
を参照してください。
または,記事末に述べる参考文献のリンク①②がつぉいでしょう。

〈追記〉
この記事で紹介した例は,Overleafにて公開しています。リンクは記事末にあります。



まずは基本的な例を

tcolorbox.styを使うためには,基本的にはプリアンブルに以下の記述をしておけば使えるようになります。

\usepackage{tcolorbox}

tcolorbox.styはW32TeXやTeXLiveには標準装備されているはずですが,存在しないならば
https://www.ctan.org/pkg/tcolorbox
から入手しましょう。

tcolorbox.styを享受するためには,dvipdfmxオプションが不可欠となります。例えば.texの1行目は,

\documentclass[dvipdfmx,11pt]{jsarticle}

のように記述しておきます。

とりあえず脳死コピペでも動くようにテンプレートを作成してみました。

\documentclass[dvipdfmx]{jsarticle}
\usepackage{tcolorbox}
\begin{document}

\begin{tcolorbox}
  Hello, \TeX !
\end{tcolorbox}

\end{document}

出力は以下のようになりましたか?

f:id:f_d0123:20200615001004p:plain
Hello, tcolorbox!!
screen環境のような雰囲気の枠が出力されましたね。ここからレベルを上げていきます。

\begin{tcolorbox}[title=これがタイトルで2番目の例,
fonttitle=\gtfamily\sffamily\bfseries,
colframe=blue,colback=blue!3!]
にほんごでも全然かまわないのです。
\end{tcolorbox}

f:id:f_d0123:20200615001849p:plain
色が付いた!

このように,

\begin{tcolorbox}[option]

\end{tcolorbox}

と,option 部分に色々書いてあげることで,枠の色や形,余白などを変えることが出来ます。例えば上記の例では,

  • title=...でタイトル部分を追加
  • fonttitle=...でタイトルのフォントの種類を指定
  • colframe=...枠やタイトル周りの色を指定
  • colback=...本文の背景色を指定

というようなオプションを追加しています。

まあ,毎回毎回オプションを記述するのもだるいですので,通常はプリアンブルで新しい環境を定義して使うのが普通です。

\documentclass[dvipdfmx,uplatex]{jsarticle}
\usepackage{tcolorbox}
\newtcolorbox{boxmine}[2][]{colbacktitle=red!10!white,
colback=blue!10!white,coltitle=red!70!black,
title={#2},fonttitle=\bfseries\gtfamily,#1}

\begin{document}

\begin{boxmine}{ここにTitleを書くのだ}
吾輩は猫である。名前はまだない。\\
どこで生れたか頓(とん)と見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪(どうあく)な種族であったそうだ。
\end{boxmine}

\begin{boxmine}[fontupper=\gtfamily\Large,]{さらにオプションを加えるのだ}
吾輩は猫である。名前はまだない。\\
どこで生れたか頓(とん)と見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪(どうあく)な種族であったそうだ。
\end{boxmine}

\end{document}

f:id:f_d0123:20200615055830p:plain
自分で環境を定義する
大分頭の悪い体裁ですが,このようにして自分で環境を作ることが可能です。オリジナルのボックスを定義した後に,ローカルに命令を変更したい場合も,上記のように手を加えることが可能です。

いろんな枠を作って見よう

工作のような気分で,枠を作っていきます。
ここから先は,手の込んだものが多く,usepackage{tcolorbox}のみでは得られない出力もあります。例えば,

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

のように付属のlibrariesを使用することを宣言することが多いです。この場合ですと,

  • breakable...次のページに枠をまたぐようにするkey[breakable]などを定義する
  • theorems...定理環境を楽に記述することが出来る

のようなことをしてくれます。この記事では詳しく解説しません(が,のちの例ではこれらを提示します。)

自分で作った奴

自分で作った枠をいくつか紹介します。

f:id:f_d0123:20200621052542p:plain
問題集風
トラウマを呼び起こせるぐらいの再限度です。凝ろうと思えば教科書や問題集も作れます。

%\tcbuselibrary{breakable} %%を読み込んでいます。
%\newcounter{reidaibangou} %%カウンタの定義
\newtcolorbox{reidai}[1][]{enhanced,boxrule=0.5mm,
    top=2pt,left=44pt,right=4pt,bottom=2pt,arc=0mm,
    colframe=blue!30!gray,
    boxrule=1pt,
    underlay={
    \node[inner sep=1pt,blue!50!black,fill=blue!10!white]at ([xshift=22pt,yshift=-9pt]interior.north west) {\stepcounter{reidaibangou}\bfseries\gtfamily 例題\thereidaibangou};},
    segmentation code={%
    \draw[dashed] (segmentation.west)--(segmentation.east);
    \node[inner sep=1pt,blue!50!black,fill=blue!10!white] at ([xshift=22pt,yshift=-8pt]segmentation.south west) {\bfseries\gtfamily};},
    before upper={\setlength{\parindent}{1zw}},
    before lower={\setlength{\parindent}{1zw}},
}
%%%%%ここまでがreidai環境の定義。例えば本文中に以下のように記述してみよう。

\begin{reidai}
次の問題に答えなさい。
\begin{enumerate}
    \item 8人を2つの組に分ける方法は何通りあるか。
    \item 6人を3つの部屋A,B,Cに入れる方法は何通りあるか。\kenten{ただし}各部屋に少なくとも1人は入るものとする。
\end{enumerate}

\tcblower

区別があるかどうかを正しく考えます。
\begin{enumerate}
    \item なんだかんだで127通り
    \item なんだかんだで540通り
\end{enumerate}

\end{reidai}

f:id:f_d0123:20200615053105p:plain
某校数学の◯しい物語風

%プリアンブルに下記
\definecolor{safecolor}{rgb}{0.2, 0.4, 0.8}

\newtcolorbox{kousiki}[2][]%%%〇〇の定理
{enhanced,%%%tikzを用いた記法の処理
left=22pt,right=22pt,%%%box内左右の余白
fonttitle=\gtfamily\bfseries\large,%%%タイトルのフォント指定
coltitle=white,%%%タイトルの文字の色
colbacktitle=blue!50!black,%%%タイトルの背景の色
attach boxed title to top left={},%%%タイトルを左寄せに、少し微調整
boxed title style={skin=enhancedfirst jigsaw,arc=1mm,bottom=0mm,boxrule=0mm},%%%タイトルボックスの装飾
boxrule=0.5pt,%%%枠線の太さ
colback=safecolor!5!,%%%本文の背景色
colframe=safecolor,%%%本文の枠の色
sharp corners=northwest,%%%左上の角の調整 
drop fuzzy shadow,%%%影をつける
breakable,%%%ページマタギOK
title=\vspace{3mm}#2,%%%タイトルは直接入力
arc=1mm,%弧
fontupper=\gtfamily,%本文のフォントを太く(数式は除く)
#1}%
%上記までプリアンブル

\begin{kousiki}{中間値の定理}
区間$[\alpha,\beta]$で連続な関数$f(x)$について,
$f(\alpha)$$f(beta)$の間にある任意の実数$c$に対して,
ある実数$k\in (\alpha,\beta)$\[
f(k)=c
\]
を満たすようにとることが出来る。
\end{kousiki}

次に紹介する例は,tcbuselibrary{theorems}を用いた例です。

f:id:f_d0123:20200621011848p:plain
定理環境
上記の例は,例えばこれまでamsthm.styで定義してきた定理や定義環境と同様に,自動でカウンタを定義してくれます。また,番号の参照も容易に行えます。
〈2020/09/05 追記〉
ぼくのかんがえたさいきょうのゼミ用TeXスタイル - ぱるちのものおき2.0
にてもう少し改良された定義を紹介しています。

%\tcbuselibrary{theorems,breakable} %% を読み込む
%%%%% 下記をプリアンブルに
%\definecolor{burgundy}{rgb}{0.5, 0.0, 0.13}
\newtcbtheorem[number within=section]{mytheo}{定理}%
{fonttitle=\gtfamily\sffamily\bfseries\upshape,
colframe=burgundy,colback=burgundy!2!white,
rightrule=0pt,leftrule=0pt,bottomrule=2pt,
colbacktitle=burgundy,theorem style=standard,breakable,arc=0pt}{tha}
%%%%% 上記をプリアンブルに
\section{第1節}

\begin{mytheo}{中間値の定理}{chukan}
区間$[\alpha,\beta]$で連続な関数$f(x)$について,
$f(\alpha)$$f(\beta)$の間にある任意の実数$c$に対して,
ある実数$k\in (\alpha,\beta)$を,$f(k)=c$を
満たすようにとることが出来る。
\end{mytheo}

\begin{mytheo}{方程式の実数解の存在}{}
区間$[\alpha,\beta]$で連続な関数$f(x)$について,
$f(\alpha)f(\beta)<0$ならば,方程式$f(x)=0$$\alpha<x<\beta$の範囲に少なくとも1つの実数解をもつ。
\end{mytheo}

\begin{proof}
定理\ref{tha:chukan}より。 %上記の定理番号を参照します。hyperref.styを読み込めば,ハイパーリンク機能も付きます。
\end{proof}

\section{第2節}

\begin{mytheo}{中間値の定理}{}
区間$[\alpha,\beta]$で連続な関数$f(x)$について,
$f(\alpha)$$f(\beta)$の間にある任意の実数$c$に対して,
ある実数$k\in (\alpha,\beta)$を,$f(k)=c$を
満たすようにとることが出来る。
\end{mytheo}
tcolorbox.styにある,面白い例

僕はこんなきれいなものを作れないなあ。。。と,唸ってしまうようなbox達を紹介します。

f:id:f_d0123:20200615014937p:plain
注意書き。

%%%プリアンブルに下記を書く
\newtcolorbox{marker}[1][]{enhanced,
  before skip=2mm,after skip=3mm,fontupper=\gtfamily\sffamily,
  boxrule=0.4pt,left=5mm,right=2mm,top=1mm,bottom=1mm,
  colback=yellow!50,
  colframe=yellow!20!black,
  sharp corners,rounded corners=southeast,arc is angular,arc=3mm,
  underlay={%
    \path[fill=tcbcolback!80!black] ([yshift=3mm]interior.south east)--++(-0.4,-0.1)--++(0.1,-0.2);
    \path[draw=tcbcolframe,shorten <=-0.05mm,shorten >=-0.05mm] ([yshift=3mm]interior.south east)--++(-0.4,-0.1)--++(0.1,-0.2);
    \path[fill=yellow!50!black,draw=none] (interior.south west) rectangle node[white]{\Huge\bfseries !} ([xshift=4mm]interior.north west);
    },
  drop fuzzy shadow,#1}
%%%プリアンブルに上記を書く

\begin{marker}
例えばこのようにして,特に注意を促したい場合にこのような環境を用いることが出来ます。

この環境自体はtcolorbox.texにあった定義をほぼ丸パクリして作られています。しいて言うならフォントをゴシック体とかサンセリフを使うように命令しただけです。
\end{marker}

次は,tcolorbox.pdfの表紙になっているものです。語彙力を失います。ソースコードはtcolorbox.pdfから入手できるので,割愛します。

f:id:f_d0123:20200615061520p:plain
ヤバくない?!

おわりに

この記事では,tcolorboxを使ったいくつかの具体例を見ていきました。これを機にtcolorboxに手を出していただければ本望です。

【2020/6/21追記】ここまでの具体例をOverleafに公開しました。
https://ja.overleaf.com/read/zwvdbkmftbcw

参考

これからtcolorboxを使う人向けのリンクをいくつか貼っておきます。


github.com
tcolorboxをすぐに使いたい人向け。プリントや教科書作成に使いやすい枠を提示してくれています。パッケージを読み込んでマニュアルと見比べながら使用するのが良いでしょう。これを作成された方はTeX緑会の方々です。


texmedicine.hatenadiary.jp
tcolorboxで枠を自分で作成したくなった人向けの入門。日本語で書かれているため敷居は高くないと思います。この方もTeX緑会。


hohei3108.hatenablog.com
僕がtcolorboxに浸かることになった諸悪の根源。tcolorboxの欲求をそそられる記事でした。


http://texdoc.net/texmf-dist/doc/latex/tcolorbox/tcolorbox.pdf
結局物を調べるためにはマニュアルが一番。