鉄緑のポイント[KEY]ボックスを改行対応で作る(LaTeX 確認シリーズ #2)
鉄緑のポイント[KEY]ボックス
今回は、鉄緑でよく使われている以下のようなボックスを作っていきます。

知らない人のために説明しておくと、鉄緑会では高2以降毎週毎週授業冊子なるものが配られます(正確には高2の時だけは規定上英数のみ冊子)。その中に含まれているいわゆる「定石」は、若い講師の作る冊子においては上記のボックスに入れられていることが多いです。
めちゃくちゃ使い勝手がいいので自分でも使いたいと思っている方々は多いと思いますが、鉄TeXはオープンソースではないので自作するしかないです。
ちなみに自分が今執筆している書籍にはこのボックスの他にも種々のボックスの作り方を収録しているのですが、そのうちの1つでありかつ最も需要がありそうなこのボックスだけここで紹介します。書籍ではないのでなるべく込み入った解説は避け、ひとまず使えるようにすることと構造を理解してもらうことのみにフォーカスします。
構造
このボックスの大枠の構造を説明します。基本的にはtcolorboxデフォルトのボックスのタイトル部分にafter titleとしてインラインのボックスを挿入していると言う形です。したがって、tikzの知識はほぼ皆無で作れます。
ソースコード
先にソースコード全貌を提示してしまいましょう。
\usepackage[most]{tcolorbox}
\makeatletter
\newlength{\len@ptbs@kk@D}\newlength{\lenn@ptbs@kk@D}\newlength{\myfontsize@ptbs@kk@D}
\newcommand{\titlelength@ptbs@kk@D}[1]{%
\setlength{\myfontsize@ptbs@kk@D}{\f@size pt}
\def\titletext@ptbs@D{\gtfamily\normalsize\selectfont#1}% タイトルフォントに合わせる。
\settowidth{\lenn@ptbs@kk@D}{\titletext@ptbs@D}%
\setlength{\len@ptbs@kk@D}{\linewidth}%
\addtolength{\len@ptbs@kk@D}{-\lenn@ptbs@kk@D}%
\addtolength{\len@ptbs@kk@D}{-.3em}%
\addtolength{\len@ptbs@kk@D}{-1pt}%
\addtolength{\len@ptbs@kk@D}{4mm}%
}
\DeclareTColorBox{ptbs}{m O{} O{}}
{enhanced,breakable,boxsep=0mm,lefttitle=1.5mm,
arc=.5mm, bottom=1.5mm, top=1.5mm, leftupper=4mm, rightupper=4mm,
colbacktitle=black!100!white, colframe=black!100!white,
coltitle=white, colback=black!10!white, boxrule=1pt,
lefttitle=.3em,
before upper={\setlength{\parindent}{1em}\relax},
fonttitle=\gtfamily\normalsize,
fontupper=\gtfamily\normalsize,
title={\titlelength@ptbs@kk@D{#1}#1\kern.3em\kern1pt},
after title={%
\tcbox[on line, boxsep=.25\myfontsize@ptbs@kk@D, boxrule=0pt,
top=-.1\myfontsize@ptbs@kk@D, bottom=-.1\myfontsize@ptbs@kk@D,
left=0mm,
right=0mm,
width=\len@ptbs@kk@D,
colback=black!30!white, arc=.5mm]
{\raisebox{.2ex}{\parbox{\len@ptbs@kk@D-.5\myfontsize@ptbs@kk@D}{\renewcommand{\baselinestretch}{.5}\selectfont#2}}}%
}%
,#3}
\makeatother
こう見ると意外と長くないですので、あまり抵抗なく以下の解説を読んでいただけると幸いです。
ちなみに上記のコードは https://github.com/KKTeX/Publicated-Files/blob/main/textboxes_pub/TetsuKeyBox_mydecseries.sty からも入手可能です。
使い方は
\begin{ptbs}{KEY}[鉄緑のKEYボックス]
こんな感じ。
\end{ptbs}
です。
構造解説
下準備
このボックスのデザインを解説する上で、
- "KEY" が入っている部分をサブタイトル部分
- "KEY" の右の部分をタイトル部分
- コンテンツを入れる部分を本文部分
と呼称するというお約束をさせていただきます。
ボックスのデザインを参照すると、サブタイトル部分のテキストの長さによってタイトル部分の横幅を変えなくてはならないということは容易に想像できるでしょう。と言うわけで、まずは「その長さを取得し、タイトル部分の長さを計算する」と言うことが必要となります。
以下の\makeatletterというのは、.texファイル内でTeXそのものを制御するいわゆる開発者用のコマンドを局所的に扱えるようにするためのおまじないと思っておけば問題ないです。
\newlength{\len@ptbs@kk@D}\newlength{\lenn@ptbs@kk@D}\newlength{\myfontsize@ptbs@kk@D}
\newcommand{\titlelength@ptbs@kk@D}[1]{%
\setlength{\myfontsize@ptbs@kk@D}{\f@size pt}
\def\titletext@ptbs@D{\gtfamily\normalsize\selectfont#1}% タイトルフォントに合わせる。
\settowidth{\lenn@ptbs@kk@D}{\titletext@ptbs@D}%
\setlength{\len@ptbs@kk@D}{\linewidth}%
\addtolength{\len@ptbs@kk@D}{-\lenn@ptbs@kk@D}%
\addtolength{\len@ptbs@kk@D}{-.3em}%
\addtolength{\len@ptbs@kk@D}{-1pt}%
\addtolength{\len@ptbs@kk@D}{4mm}%
}
まず\newlengthによって必要となる長さを代入できるコマンドを定義しておきます(1行目)。そして、\setlengthにより、現状のフォントサイズを取得した上で\myfontsize@ptbs@kk@Dに格納します(3行目)。さらに、新たな長さ計算用のコマンドとして、
- サブタイトルの長さを
\lenn@ptbs@kk@Dに格納 -
\len@ptbs@kk@Dに(計算により微調整をしたのち)タイトルの長さを格納
という機能を持った\titlelength@ptbs@kk@Dを定義しておきます。
これで長さ取得用のコマンドは作成完了です。
ボックス本体
さて、あとはテキストボックスの体裁を整えていけばいいわけですが、ここではascolorboxの書き方に則って
\DeclareTColorBox{ボックス名}{引数設定}{内容設定}
という構文を使用していきましょう。ここでいう引数設定はxparse的な構文で、
-
mなら "mantatory" つまり必須の引数 -
O{}なら "optional" つまり入力しなくても動く引数({}の中身はデフォルトの入力)
という意味です。
\DeclareTColorBox{ptbs}{m O{} O{}}
{enhanced,breakable,boxsep=0mm,lefttitle=1.5mm,
arc=.5mm, bottom=1.5mm, top=1.5mm, leftupper=4mm, rightupper=4mm,
colbacktitle=black!100!white, colframe=black!100!white,
coltitle=white, colback=black!10!white, boxrule=1pt,
lefttitle=.3em,
before upper={\setlength{\parindent}{1em}\relax},
fonttitle=\gtfamily\normalsize,
fontupper=\gtfamily\normalsize,
title={\titlelength@ptbs@kk@D{#1}#1\kern.3em\kern1pt},
after title={%
\tcbox[on line, boxsep=.25\myfontsize@ptbs@kk@D, boxrule=0pt,
top=-.1\myfontsize@ptbs@kk@D, bottom=-.1\myfontsize@ptbs@kk@D,
left=0mm,
right=0mm,
width=\len@ptbs@kk@D,
colback=black!30!white, arc=.5mm]
{\raisebox{.2ex}{\parbox{\len@ptbs@kk@D-.5\myfontsize@ptbs@kk@D}{\renewcommand{\baselinestretch}{.5}\selectfont#2}}}%
}%
,#3}
2〜9行目の細かなオプションはtcolorboxのマニュアルに譲ります。
大まかな部分は
-
titleの部分に第1引数、つまりサブタイトルを -
after titleの部分に第2引数、つまりタイトルを
格納しているのですが、ここの8行目において先ほど定義した\titlelength@ptbs@kk@Dにより「タイトルの入力を取得すると同時にこのコマンドを発動させて長さの格納まで終わらせている」というのがポイントです。そうすると、after title内部に入れている\tcboxのwidth(16行目)が、タイトルの長さを参照された適切なものになります。
注意点
仕様上の注意点がいくつかあります。
1つめは、サブタイトル部分は長いものを格納してはいけないということです。仕様上、「サブタイトルの長さをボックス全体の横幅(\linewidth)から減じている」ため、サブタイトルの長さが長くなりすぎるとタイトル部分のスペースがなくなり破綻してしまうからです。
2つ目は、タイトル部分には長いものを入れても大丈夫であるということです。というのも、after titleの中身に、あらかじめ\parboxを使って「適切に制御された幅の」箱に格納されたものを入れているからです。
試しに長いものを入れてみたのが上の画像になります。
ちなみに、
\begin{ptbs}{KEY}[%
あいうえおあいうえおあいうえおあいうえおあいうえお \\
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいう
]
あいうえお
\end{ptbs}
のように、タイトル部分で\\を用いた強制改行をするのも大丈夫です。
終わりに
今回は、「鉄緑のテキストといえばこれ」と言われるほどアイコニックなボックスを紹介してみました。他にもリクエストなどがあればご紹介していきます。最後までお読みいただきありがとうございました。
