Open3

tcolorboxで会話ボックスを作るときに役立つと嬉しいなんやかや

hidarumahidaruma

まだオレのtalkboxは完成してないが……?

とりあえずメモがてら。

概論

まず、ここで会話ボックスとは次のようなものを指す。これはHTML+CSSで細部の調整がまったくされてないが。

talkbox exmaple, id="talkbox-css"

この構造を作るにあたって考慮すべきことはまず幅関係。会話ボックス全体の最大値は本文幅[1]
画像と会話ボックス本体は(よほどコミカルな演出を行いたいと思わなければ)被るのは好ましくない。さらに、画像が話している形を取るために尻尾の部分を描画する必要がある。
つまり、(枠を含む)画像幅+吹き出しのシッポ描画幅+会話ボックス本体が本文幅となる。実際には、上の画像のように反対方向に画像を配置する可能性があるし、それぞれのマージンをより広くとったものが本文幅となる。

さらに、Webページは無限に下に伸びていけるものが多いのであまり考えることもないが、ページメディアでは行進行方向に区切りがあることを考慮する必要がある。そのとき、次のパターンがある。

  • 画像と吹き出しのシッポは分割前後のページで繰り返し登場する
  • 画像と吹き出しのシッポは分割(前)後のページで登場しない

後者のパターンで前後が限定されないのは、会話ボックスの開始位置と終了位置のどちらに画像を配置するかによるからだ[2]

会話ボックスのページ分割での構造は、実はテーブル構造のそれに近い。まあ行進行方向でボックスを作る構造全般に共通なのだが、実装されているのがテーブルばかりなので。すなわち、header, body, footerの構造である。headerとfooterはページ分割を挟み繰り返し登場するかどうかが変わるという制御があり、これは会話ボックスにおける画像と吹き出しのソレ。

ちなみに、複数ページにまたがる会話ボックスにおいて画像と吹き出しを繰り返さない場合は、テーブルのキャプションのように開始位置側(ここではbefore-afterでbefore)に置くことを推奨する。トピックのタイトルが分からないまま内容文を読むのはなんというか不親切度が高くない?

幸いにもLaTeXにおいてtcolorboxというボックスの分割まで考慮にいれた設計が可能なパッケージがあるので使ってみよっかと、そういう話。

画像の配置位置

frameがボックスの外側、interiorが内側、どっちにしろ位置をずらす必要があるので好みで読み換えて。

  • 左上の中心がnorth west
  • 右上の中心がnorth east
  • 左下中心がsouth west
  • 右下中心がsouth east
\begin{tcolorbox}[%
...,
underlay={%
\node[xshift=..., yshift=...] at (frame.north west) {%
\tcbincludegraphics[width=...]{images/icon.jpg}
}}]
...
\end{tcolorbox}

後述するようにsidebysideなどもあるが、underlay first={...}などbreakableなものを作るとき応用がしやすい?

\tcbincludegraphics

外部画像を取り込む際におなじみ\includegraphics、tcolorboxに取り込まれたコイツがどのように変化をしたかというと、「デフォルトでtcolorboxの枠が適用される」。以上!

画像を円形に切り取りたいときはTikZのnodeとかで形状を指定することになるか、こいつのroundを上げていくとよい。

仲間に\tcbincludepdfもいる。

ボックス高さの下限、上限

オプションにheight fromtoを付ける。会話ボックスを作る際は下限をアイコン画像の高さにしておくと全体が壊れにくくなる。
下限だけを指定することはできないため、上限には\tcbtextheightあたりを置くと良い。

\begin{tcolorbox}[height from 2cm to \tcbtextheight]
...
\end{tcolorbox}

左右の幅、位置の調整

会話ボックスでは画像の分tcolorboxの開始、終了位置を調整する必要がある。
役立つオプションはgrow to ... by ...
widthを指定してしまうより、画像とギャップの幅だけ考えればよいので楽?

\begin{tcolorbox}[%
grow to left by -3cm,
grow to right by 0cm, ...]
...
\end{tcolorbox}

他にsidebysideで画像を置く方法もある。この場合、gapなどで画像と会話ボックス本体の間隔を調整しやすい。ただし、ページ、段分割を挟むと難しくなってしまう。

\begin{tcolorbox}[%
empty,
lefthand width=3cm,%
]
\tcbincludegraphics{...}
\tcblower
\begin{tcolorbox}
...
\end{tcolorbox}
\end{tcolorbox}
脚注
  1. 漫画表現では吹き出しはページの端でカットされていることもあるが、主体ではなく通常の本文に挟まれる形で登場する会話ボックスは本文幅に収まっていた方がいいと思うよ? ↩︎

  2. 中間位置に置いても良いが、開始位置側に置くのと考えるべきことはあまり変わらない。 ↩︎

hidarumahidaruma

TikZのcalloutは役に立つかは微妙

TikZにはcalloutというライブラリがあり、吹き出しのシッポを描画するときにanchorを指定するだけでびよーんとシッポを付けてくれたりするのだが、tcolorboxの会話ボックスで組み込もうと思うと、まずtcolorboxをnodeの中につっこむような形になり、TikZ側が主になる。breakableなどのことを考えるとあくまでtcolorbox側がメインであった方が良いと思う。TikZメインでいける人はそもそもtcolorboxを挟む方が面倒かもしれない。

hidarumahidaruma

(メモ書きなのでちょこちょこ内容が変わったりするのは大目にみてほしい)