tcbitemizeで横並び・下線の解答欄を作る

今日もtcolorboxで強引に解答用紙を作る話である。

以下のような解答欄を作ることを考える。

f:id:baruku07:20180203231422p:plain

上を出力するためのソースである。

\documentclass[uplatex,dvipdfmx]{jsarticle}
\usepackage[raster,skins]{tcolorbox}
\newcommand{\visible}{visible} %解答の表示と非表示の切り替え
%
\begin{document}

\begin{tcbitemize}[ 
colframe=white,colback=white,%枠線と背景色を白
raster columns=3,%カラムの数
detach title,raster valign=top,%
left=0pt, %箱とテキストの感覚を0にする。
%height=3pc,valign=center, %高さを手で調整したいとき入れる
sidebyside, %横並びにする
lefthand width=23pt, %番号を入れる部分の幅。
sidebyside gap=0mm, %番号と解答部分の間隔を0にする。
sidebyside align = top,%
before upper =(\thetcbrasternum),%
upperbox=visible,lowerbox=\visible, %\tcbsetでグローバルにinvisibleがセットされても良いようにしておく。
skin = enhanced,%tikzでoverlayの線を描くために必要
overlay = {
    \draw[black]  ([xshift=22pt]frame.south west)--(frame.south east);
}
]
 \tcbitem \tcblower りんご
 \tcbitem \tcblower みかん
 \tcbitem \tcblower いちご
  \tcbitem \tcblower なし
 \tcbitem \tcblower マンゴー
 \tcbitem \tcblower キウイ
\end{tcbitemize}


\end{document}

ポイントはoverlayで線を描いていることである。これにより、箱の途中から線を引くことができる。xshiftやyshiftで線の位置の微調整も可能である。

解答の文字の開始位置はlefthand width((1)などの入っている部分の箱の幅)で調整する。

オプションが大量にあるので、実際に使うときには適度にマクロを定義して使うべきである。\newtcolorboxのraster版は、私の調査能力では発見できなかった。

もっとまともな方法はありそうだが、現在はここまでの調査が限界。

なお、今回は規則的な幅で解答を並べていくケースを扱った。ばらばらの幅で解答欄を並べていく場合には、

  • tcolorboxのnobeforeafterオプションを使って、1つ1つ幅を指定しながら並べていく
  • tcbrasterのraster columnsをやや細かめに指定しておき、\tcbitem1つ1つについてグリッドの幅を指定していく(例えば、12分割して3つ分の幅を指定すれば4分割にできる)

などが考えられる。いずれのケースでもskinで下線を引くことによって小問番号+下線をセットにした箱を作る、というテクニックは応用できるはず。

\tcblowerを書かないとならないのも気に入らない。しかし、個人的には、横に並べるだけでemathEyのedaenumerateを呼び出しすという状態が脱却できているので、この程度で問題ない。

なお、言うまでもなく楽に作りたければemathも含めて世の中には楽で良い選択肢がある。このやり方は、あくまでtcolorboxのみで頑張ると言う趣味に近い。