オシャレな tcolorbox を誰でも作る方法(LaTeX確認シリーズ#5)
LaTeX で「ちょっと装飾されたボックス」を作りたくなったとき、そのためのパッケージの最有力候補が tcolorbox パッケージです。デフォルトのままでも十分使えますが、本気で作り込むと、書籍のコラムからテック企業のスライド風カードまで、ほぼ何でも表現できます。
この記事では、4つの自己完結したサンプルを一段階づつ作りながら、再利用可能なテクニックを紹介します。最終的にできあがるのは、ページをまたいでもデザインが破綻しない「テック寄りミニマムカード」です。
ターゲット:
- LaTeX を触ったことはあるが、
tcolorboxのenhanced以降の世界に踏み込んだことがない人 - ページをまたぐ装飾ボックスを作ろうとして詰まったことがある人
- TikZ をフル活用したカスタム枠線を描きたい人
0. 共通プリアンブル
サンプルはすべて以下のプリアンブルで動きます。ltjsarticle は TeX Live 標準同梱なので、lualatex を入れていれば追加インストール不要です。
\documentclass[a4paper,11pt]{ltjsarticle}
\usepackage[margin=22mm]{geometry}
\usepackage[most]{tcolorbox} % most で enhanced/breakable/skins まとめてロード
\usetikzlibrary{calc} % ($(...)+(Xmm,Ymm)$) 形式の座標計算
\usepackage{lipsum} % 動作確認用ダミーテキスト
% 記事を通じて使い回す配色(Tailwind sky 系)
\definecolor{qaccent}{HTML}{0EA5E9} % sky-500
\definecolor{qaccentLight}{HTML}{BAE6FD} % sky-200
\definecolor{qtext}{HTML}{1F2937} % gray-800
\definecolor{qsoft}{HTML}{F1F5F9} % slate-100
ボックス定義の冒頭は基本これで始めます:
enhanced, % 拡張描画レイヤを使う
breakable, % ページをまたいでも分割される
colback=white, % 内側の塗り
colframe=qaccent,% 枠線の色
boxrule=.5pt, % 枠線の太さ
arc=1.5mm, % 角丸
enhanced を付けると、後述する underlay や frame.north west といった TikZ ノード参照が解禁されます。これがないと装飾ボックスはほぼ作れません。
1. \DeclareTColorBox で自由度の高い箱を定義する
\newtcolorbox でも箱は定義できますが、xparse 由来の柔軟な引数仕様が使える \DeclareTColorBox の方が圧倒的に便利です。まずは最小構成でいきましょう。
Example A: MiniBox
\DeclareTColorBox{MiniBox}{ m }{%
enhanced,
colback=white,
colframe=qaccent,
boxrule=.5pt,
arc=1.5mm, outer arc=1.5mm,
left=4mm, right=4mm, top=3mm, bottom=3mm,
fonttitle=\sffamily\bfseries,
coltitle=white,
title={#1},
}
使い方:
\begin{MiniBox}{Quick Start}
これは最小構成のボックスです。色と角丸を変えるだけでも雰囲気が出ます。
\end{MiniBox}
これだけで、
- 水色のタイトルバー(
colframe色のベタ塗り)に白い太字 - 角丸 1.5mm の青い細枠
- 白い本文エリア
という、Qiita の標準引用くらいには使えるボックスができます。
\DeclareTColorBox の引数仕様
第 2 引数の { m } が引数仕様で、書式は xparse と同じです:
| 記号 | 意味 |
|---|---|
m |
必須引数 {...}
|
o |
オプション引数 [...]、未指定なら -NoValue-
|
O{デフォ} |
デフォルト値付きオプション引数 |
s |
スター引数(* の有無) |
!o, !O{}
|
直前の引数との間の空白・改行を跨いで探さないフラグ |
たとえば「タイトル+オプションのサブタイトル+スター付きで強調モード」なら:
\DeclareTColorBox{MyBox}{ s m O{} }{%
...
title={#2 \IfBooleanT{#1}{ ★}\IfValueT{#3}{ — #3}},
}
% \begin{MyBox}{タイトル} ... \end{MyBox}
% \begin{MyBox}*{タイトル} ... \end{MyBox}
% \begin{MyBox}{タイトル}[サブタイトル] ... \end{MyBox}
% \begin{MyBox}*{タイトル}[サブタイトル] ... \end{MyBox}
引数は本体 {...} 内で #1, #2, #3 ... として参照できます。\IfBooleanTF / \IfValueTF で分岐できるので、外見のバリエーションを 1 つの定義に押し込めるのが強み。
2. ベース枠線の作り方 3 種
ここからは枠線(フレーム)の表現力を上げていきます。単線で物足りないなら、borderline で多重枠、それでも足りないなら underlay で TikZ をフル活用、という階段構造です。
2-1. colframe + boxrule で素直に 1 本
MiniBox がまさにこのパターンです。最もミニマル。
colback=white,
colframe=qaccent,
boxrule=.5pt,
arc=1.5mm,
outer arc=1.5mm,
2-2. borderline で多重枠(Example B: DoubleBox)
borderline={太さ}{オフセット}{TikZ オプション} を 複数並べる と、外側または内側に追加の線が描画されます。本体の boxrule を 0 にして、見た目を完全に borderline 任せにするテクニックも便利です。
\DeclareTColorBox{DoubleBox}{ }{%
enhanced,
colback=qsoft,
colframe=qsoft,
boxrule=0pt,
arc=0pt,
left=5mm, right=5mm, top=4mm, bottom=4mm,
borderline={0.5pt}{0pt}{qaccent},
borderline={0.3pt}{1.2mm}{qaccent, dashed},
}
これで「外側に実線 0.5pt、内側 1.2mm に破線 0.3pt」の二重枠カードができます。タイトルなしの引用ブロックや、補足ノートに最適。
borderline のスタイル指定には dashed, dotted, loosely dashed, dash pattern=on 1.5pt off 1.5pt など、TikZ で使えるものは全部使えます。
2-3. underlay で TikZ をフル活用(Example C: CornerBox)
最も自由度が高いのは、underlay キーで TikZ コードを直接書く方法です。enhanced 環境では frame.north west, frame.south, title.east などの アンカー が使えるので、フレームを基準に好きな図形を載せられます。
\DeclareTColorBox{CornerBox}{ m }{%
enhanced,
colback=white,
colframe=white,
boxrule=0pt,
arc=0pt,
left=5mm, right=5mm, top=6mm, bottom=5mm,
underlay={%
\draw[qaccent, line width=.6pt]
($(frame.north west)+(0,-4mm)$) -- (frame.north west)
-- ($(frame.north west)+(4mm,0)$);
\draw[qaccent, line width=.6pt]
($(frame.north east)+(0,-4mm)$) -- (frame.north east)
-- ($(frame.north east)+(-4mm,0)$);
\draw[qaccent, line width=.6pt]
($(frame.south west)+(0,4mm)$) -- (frame.south west)
-- ($(frame.south west)+(4mm,0)$);
\draw[qaccent, line width=.6pt]
($(frame.south east)+(0,4mm)$) -- (frame.south east)
-- ($(frame.south east)+(-4mm,0)$);
},
fonttitle=\sffamily\bfseries,
coltitle=qaccent,
attach boxed title to top center={yshift=-2.2mm},
boxed title style={
colback=white, colframe=white,
boxrule=0pt, arc=0pt,
left=2mm, right=2mm, top=0pt, bottom=0pt,
},
title={#1},
}
枠を完全に消し(boxrule=0pt、colframe=white)、4 隅に短い L 字だけを TikZ で描く構成です。これだけでテック資料っぽい「囲ってる感」が出ます。
underlay は内側塗り (colback) の 上、文字 (upper 部分) の 下 に描画されます。背景ベタの「下に敷く模様」用途にぴったり。
逆に「文字の上に乗せたい」場合は overlay キーを使います。
アンカー早見表
| 名前 | 内容 |
|---|---|
frame.north, frame.south, frame.east, frame.west
|
各辺の中点 |
frame.north west 他 |
各角 |
interior.* |
内側塗り領域(パディング内側) |
title.* |
タイトル領域(attach boxed title 系を使った場合のみ) |
3. タイトルを「付ける」
tcolorbox のタイトルは、放っておくと 箱の中のタイトル行 として描画されます(MiniBox の挙動)。これを箱から飛び出させて装飾的に配置するのが attach boxed title to ... です。
3-1. 基本: 箱内タイトル
title={#1},
fonttitle=\sffamily\bfseries,
coltitle=white, % 地の色(colframe)が濃いなら白文字
3-2. 箱の上中央に乗せる
CornerBox で使ったパターン。yshift=-2.2mm で半分だけ枠の中に沈ませています。
attach boxed title to top center={yshift=-2.2mm},
boxed title style={
colback=white, colframe=white,
boxrule=0pt, arc=0pt,
left=2mm, right=2mm, top=0pt, bottom=0pt,
},
boxed title style={colback=white,colframe=white,...} がポイント。タイトル背景を地の色(白)に揃えると、地のフレームをタイトル幅だけ「くりぬく」効果になります。これが装飾ボックスの定番テクニック。
3-3. 左肩に乗せて枠線をパンチ抜き
最終形 TechCard で使う配置。yshift を負の方向に深めに振って、タイトルが枠線をまたぐように置きます。
attach boxed title to top left={xshift=5mm, yshift=-2.5mm},
boxed title style={
colback=white, colframe=white,
boxrule=0pt, arc=0pt,
left=1.5mm, right=1.5mm, top=0pt, bottom=0pt,
},
yshift=-2.5mm でタイトルの中心が枠線の高さに重なり、白い背景がフレームを パンチ抜き したような見た目になります。Qiita や Notion のセクション見出しっぽいデザインの正体はこれです。
3-4. (補足)タイトル先頭にデコ
タイトルの先頭にコンパクトな塗り正方形マーカーを並べたいときは、TeX の \rule が手軽です:
title={\rule[-.05ex]{1.4mm}{1.4mm}\hspace{1.2mm}#1},
色は coltitle で指定された色に従います。絵文字やアイコンを \includegraphics で混ぜることもできますし、TikZ で複雑なロゴを描画することも可能です。
4. パディングと余白の整え方
| キー | 役割 |
|---|---|
left, right, top, bottom
|
内側パディング(フレームから本文までの余白) |
before skip, after skip
|
箱の外、前後との垂直スキップ |
before upper, after upper
|
upper 部(本文)の 直前/直後 に挿入される TeX コード |
before, after
|
箱全体の 直前/直後 に挿入される TeX コード |
例: 段落字下げを箱内だけ強制する:
before upper={\setlength{\parindent}{1em}},
例: 箱の前に \medskip を入れたい:
before={\medskip},
top を大きく取って、上側に タイトル装飾用のスペース を確保するというテクニックもよく使います。たとえば top=14mm などと取って、その空きスペースに underlay で紋章や横線を描く、というのが装飾ボックスの王道パターン。
5. ページ分割のための underlay unbroken / first / middle / last
breakable を有効にすると、箱はページの切れ目で勝手に分割されます。このとき素朴な underlay={...} を書いていると、全セグメントに同じ装飾が繰り返し描画されてしまいます。
これを防ぐために、tcolorbox は次のキーを提供しています:
| キー | 描画されるタイミング |
|---|---|
underlay unbroken |
分割されずに収まったとき |
underlay first |
分割された 最初の セグメント |
underlay middle |
分割の 途中の セグメント(複数になることもある) |
underlay last |
分割された 最後の セグメント |
underlay broken |
first/middle/last のいずれにも適用 |
underlay unbroken and first |
unbroken と first の両方 |
underlay unbroken and last |
unbroken と last の両方 |
そして重要なのが、各セグメントの frame.north / frame.south は、そのセグメントの実体を指す ということです。
つまり:
-
firstセグメントのframe.southは ページの切れ目の高さ -
middleセグメントのframe.northもframe.southも どちらも切れ目 -
lastセグメントのframe.northは 切れ目
この性質を使うと、
- first: 「上端の装飾だけを描いて、下端は開けておく」
- middle: 「左右の縁だけを描いて、上下は何も描かない」
- last: 「下端の装飾だけを描いて、上端は開けておく」
という配分が自然に作れます。
5-1. テンプレート: 内側枠線の 4 状態分配
例として、TechCard の 二重枠の内側ライン(薄水色 0.3pt)を、4 状態に分けて描画してみます。
underlay unbroken={%
% 全周クローズドの矩形
\draw[qaccentLight, line width=.3pt, rounded corners=.8mm]
($(frame.south west)+(1.5mm,1.5mm)$)
rectangle
($(frame.north east)+(-1.5mm,-1.5mm)$);
},
underlay first={%
% 上端+左右、下端は開ける
\draw[qaccentLight, line width=.3pt, rounded corners=.8mm]
($(frame.south west)+(1.5mm,0)$)
-- ($(frame.north west)+(1.5mm,-1.5mm)$)
-- ($(frame.north east)+(-1.5mm,-1.5mm)$)
-- ($(frame.south east)+(-1.5mm,0)$);
},
underlay middle={%
% 左右の縦ラインだけ
\draw[qaccentLight, line width=.3pt]
($(frame.south west)+(1.5mm,0)$) -- ($(frame.north west)+(1.5mm,0)$);
\draw[qaccentLight, line width=.3pt]
($(frame.south east)+(-1.5mm,0)$) -- ($(frame.north east)+(-1.5mm,0)$);
},
underlay last={%
% 左右+下端、上端は開ける
\draw[qaccentLight, line width=.3pt, rounded corners=.8mm]
($(frame.north west)+(1.5mm,0)$)
-- ($(frame.south west)+(1.5mm,1.5mm)$)
-- ($(frame.south east)+(-1.5mm,1.5mm)$)
-- ($(frame.north east)+(-1.5mm,0)$);
},
ポイントは:
-
unbrokenにはrectangleを使い、broken 用は折れ線で書く。閉じた図形を描かないことで、切れ目で開いた状態を作る。 -
firstの下端とlastの上端は、コーナー丸めを 0 にする(+1.5mmのようなオフセットを入れず、まっすぐ切れ目まで伸ばす)。これで切れ目で「ストンと切れた」見た目になる。 -
middleは装飾要素をすべて削除。複雑な紋章や曲線をmiddleに描いてしまうと、中ページで延々と紋章が増殖するので注意。
5-2. 一段難易度を上げるなら
紋章・横線・コーナーマークなど 位置の固定された装飾 は、
- 上端用 →
underlay first(unbroken にも一緒に書きたいならunderlay unbroken and first) - 下端用 →
underlay last(同様にunderlay unbroken and last) - 中央用 →
underlay middleには何も書かない、または控えめなパターンだけ
という風に分配します。「装飾要素をセグメントごとに分配する」という発想を持てば、breakable な箱でも装飾を破綻させずに作れます。
6. 完成形: TechCard のフルコード(Example D)
ここまでのテクニックを全部盛りで。
\DeclareTColorBox{TechCard}{ m }{%
enhanced, breakable,
colback=white,
colframe=qaccent,
coltext=qtext,
boxrule=.5pt,
arc=1.5mm, outer arc=1.5mm,
left=5mm, right=5mm, top=4mm, bottom=4mm,
fontupper=\sffamily,
before skip=4mm,
underlay unbroken={%
\draw[qaccentLight, line width=.3pt, rounded corners=.8mm]
($(frame.south west)+(1.5mm,1.5mm)$)
rectangle
($(frame.north east)+(-1.5mm,-1.5mm)$);
},
underlay first={%
\draw[qaccentLight, line width=.3pt, rounded corners=.8mm]
($(frame.south west)+(1.5mm,0)$)
-- ($(frame.north west)+(1.5mm,-1.5mm)$)
-- ($(frame.north east)+(-1.5mm,-1.5mm)$)
-- ($(frame.south east)+(-1.5mm,0)$);
},
underlay middle={%
\draw[qaccentLight, line width=.3pt]
($(frame.south west)+(1.5mm,0)$) -- ($(frame.north west)+(1.5mm,0)$);
\draw[qaccentLight, line width=.3pt]
($(frame.south east)+(-1.5mm,0)$) -- ($(frame.north east)+(-1.5mm,0)$);
},
underlay last={%
\draw[qaccentLight, line width=.3pt, rounded corners=.8mm]
($(frame.north west)+(1.5mm,0)$)
-- ($(frame.south west)+(1.5mm,1.5mm)$)
-- ($(frame.south east)+(-1.5mm,1.5mm)$)
-- ($(frame.north east)+(-1.5mm,0)$);
},
fonttitle=\sffamily\bfseries,
coltitle=qaccent,
attach boxed title to top left={xshift=5mm, yshift=-2.5mm},
boxed title style={
colback=white, colframe=white,
boxrule=0pt, arc=0pt,
left=1.5mm, right=1.5mm, top=0pt, bottom=0pt,
},
title={\rule[-.05ex]{1.4mm}{1.4mm}\hspace{1.2mm}#1},
}
使い方:
\begin{TechCard}{Overview}
水色 × 白のミニマムテックボックス。breakable を ON にしているので、
長文を入れるとページをまたいで自動で折り返されつつ、装飾が破綻しない。
\end{TechCard}
\begin{TechCard}{Long Content Test}
\lipsum[1-7]
\end{TechCard}
ポイントを振り返ると:
-
colback=whiteで 白基調、colframe=qaccentで 水色のアクセント -
boxrule=.5ptの 細い外枠 +underlayで描く 0.3pt の内側ライン で控えめな二重枠 - タイトルは
attach boxed title to top leftで 左肩に乗せ、yshift=-2.5mmで枠線をまたぐ - タイトル背景を
whiteにすることで枠線をパンチ抜き -
\ruleで 小さな塗り正方形のマーカー をタイトルの先頭に -
breakable+ 4 セグメント分のunderlayで、ページをまたいでも内枠が破綻しない
7. その他知っておくと得するキー
varwidth boxed title
タイトルが長くて 1 行で収まらないときは:
varwidth boxed title=0.85\linewidth,
タイトルを段落折り返し可能にします。
enlarge top by, enlarge bottom by
タイトルを上にせり出させたぶんだけ箱の 外側 にスペースを確保したい:
enlarge top by=2mm,
これがないと、前段落の文字とタイトルが重なります。
tcbclipinterior / tcbclipframe
underlay の中で、内部塗り領域だけにクリップして描画したいとき:
underlay unbroken={\begin{tcbclipinterior}
\fill[qaccentLight] (interior.south west) rectangle ([yshift=2mm]interior.south east);
\end{tcbclipinterior}},
斜めストライプや格子模様を内側にだけ敷きたいときに重宝します。
8. デザインを考えるときの順序
オシャレ tcolorbox を作るとき、毎回ゼロから考えると爆発するので、自分は以下の順で詰めるようにしています。
-
配色を 2〜3 色に絞る: メインの塗り、アクセントカラー、(必要なら)テキスト用ダーク色。HTML カラーコードをコピーして
\definecolorで名前を付ける。 -
外枠を 1 本決める: 太さ・角丸・色。これが箱全体の「重さ」を決めます。
boxrule=0.3ptだと繊細、1pt以上だと骨太。 - タイトルの配置を決める: 中央乗せ / 左肩乗せ / 上にせり出し / 内包。これでフォーマル度が決まります。
- 追加装飾を 1〜2 要素まで: 二重枠、コーナーマーク、タイトル下のアクセント線など。装飾要素は 多くて 2 種類 までが上品にまとまる経験則です。
- breakable 化: 装飾要素を first/middle/last に分配。中央装飾は middle で削除する。
-
余白とフォントの最終調整:
top,bottom,left,right、fontupper,fonttitle。ここで全体のリズムを整えます。
まとめ
-
\DeclareTColorBox+enhanced+breakableがオシャレ tcolorbox の基礎セット - 枠線は
colframeの単線 →borderlineの多重 →underlayでの自由描画と段階的に難易度が上がる - タイトルは
attach boxed title to ...で 箱の外 に飛び出させると一気にデザインが締まる - breakable 対応の鍵は
underlay unbroken / first / middle / lastの 4 状態の使い分け - frame アンカーは「そのセグメント基準」で動くので、装飾要素を上下に分配するだけで自然に成立する
このパターンを覚えておけば、Qiita の引用ボックス・教材コラム・テック資料カードまでだいたい再現できます。色とフォントを変えるだけで、無限にバリエーションが作れるので、ぜひ自分の「定番ボックス」を 2〜3 種類量産しておくと、執筆スピードがかなり上がります。
それでは、よい tcolorbox ライフを。
付録: この記事のサンプルを丸ごと動かす
本記事のサンプルは、以下の単一ファイルでそのままコンパイル可能です(lualatex のコンパイル環境は前提とします):
lualatex qiita-tcolorbox-examples.tex
ファイル全文はこちら に置いています。\definecolor のあたりだけ自分の好みの色に書き換えれば、すぐに自分の論文・スライド・記事に流し込めます。






