tcolorboxのカウンタを使って解答用紙の問題番号を振る

TeXで解答用紙を作るとき、問題番号は手で振りたくない。したがって何らかの形で自動化をするのが普通である。ここではtcolorboxのタイトルを使って番号を振ってみる。

次のような解答用紙を作ることを考える。

f:id:baruku07:20180202221137p:plain

問題番号の下には解答欄が入らないようにしたい。それをtcolorboxを使って実現する。以下が上を出力したソースであるある。

\documentclass[uplatex,dvipdfmx]{jsarticle}
\usepackage{tcolorbox}
\usepackage{enumitem}
\newcommand{\visible}{visible}
%
\newtcbox{\kasen}[1][]{boxrule=-1pt,bottomrule=1pt,sharp corners, colback=white,\visible,nobeforeafter,tcbox width=forced left,box align=base,\visible,#1}
%
\newtcolorbox[auto counter]{toi}{sidebyside, %横並びにする
lefthand width=1.6eM, %問題番号を入れる部分の幅。
sidebyside gap=0mm, %問題番号と解答部分の間隔を0にする。
sidebyside align = top,%
beforeafter skip =0mm, %問題と問題の箱の間隔を0にする。
upperbox=visible,lowerbox=visible, %\tcbsetでグローバルにinvisibleがセットされても良いようにしておく。
colframe=black,colback=white, %背景と線の色を白にする
detach title,title=\thetcbcounter,before upper ={\large \textsf{\tcbtitle}}, coltitle=black %タイトルを問題番号にする
}
%
\begin{document}
\begin{toi}
\tcblower
 \begin{enumerate}[align=left, leftmargin=*, label=(\arabic*)]
 \item \kasen{春は花粉症がしんどい。}
 \item \kasen{夏は暑いので夏バテがひどい。}
 \item \kasen{冬は寒いので動きたく無い。}
 \end{enumerate}
\end{toi}

\begin{toi}
\tcblower
(1) \kasen[width=3cm]{}
(2) \kasen[width=3cm]{}
(3) \kasen[width=3cm]{} \\
\noindent
(4) \kasen[width=3cm]{とら}
(5) \kasen[width=3cm]{}
(6) \kasen[width=3cm]{すずめ}
\end{toi}

\begin{toi}
\tcblower
\quad \par
\begin{tcolorbox}[height=6pc,colframe=white,colback=white,\visible]
$P(A)=0.4$, $P(A\cap B)=0.2$なので
\[
 P_{A}(B) = \frac{0.2}{0.4} = 0.5
\]
となる。
\end{tcolorbox}
\end{toi}
\end{document}

箱の枠を全て消しているので、何をやっているかがわかりにくい。そこで、上のコードでtoiのboxの箱の線を出力してみると(colframe=black)、何をやっているかがわかりやすい。

f:id:baruku07:20180202221521p:plain

このように、枠線を出力すると、レイアウトがどのような状態になっているかが一眼でわかる。これがtcolorboxで解答用紙を作るメリットの一つである。

tcolorboxで作っているので、右側の箱に何を書いても大丈夫という安心感もある。enumerate(や場合によってはtabular)で問題番号を振ると、この安心感はない。

説明は、だいたいコメントアウトしてある部分に買いてある通り。以下、補足。

  • 1の記述の線は以前の記事で買いた環境を使っている
  • 2の横並び箇条書きの部分は様々な解がある。ここではそれに触れたくなかったので手書きしている。
  • 問題番号の数字のフォントサイズを大きくしすぎると、右側とのバランスを取るのが難しくなる(これでも少しずれている)。これについては、もう少し何か考えないとならない。たとえば、sidebyside align = top seamとすると、今度は問題番号が上に上がりすぎてバランスが悪い。

1., 2.の小問の並びはtcolorboxの中にあるtcbitemizeを使えば、箇条書きと下線を同時にうまく捌けそうであるが、まだ使い方を理解していない。今後の課題である。

これまではどのようにしていたか

最初はenumerateを使っていた(普通)

箇条書き環境を使って問題番号を振るのが普通のアプローチである。私も最初はそうしていた。しかし、次のようなデメリットがある。

  • 問題に小問を付けると、箇条書きがネストするため扱いにくい。
  • 箇条書き環境であるがゆえの制約を意識するのが面倒(ソースに空行を入れると怒られるなど)。
  • ある問題でうっかりをしたとき、箇条書き全体に悪影響が及ぶことがあので怖い。(これで何度も時間を潰した)。
  • 細かい設定も含めて、問題ごとで色々な設定は完結させたい。箇条書き環境では、全体を意識せざるをえない。

これは、私の試験作成では致命的な欠点である。私は、試験問題の完成版を作って清書するという使い方で試験を作らない。問題を作れるときに作れるだけ作るというのを繰り返して試験を完成に持っていくスタイルで試験を作る。そのため、頻繁に問題の差し替えや並び替えなどもする。よって、問題単位で環境は閉じていてほしいという強い要求がある。

これまではtheorem環境を使っていた

この問題を解決するために、ある時期からは定理型の環境を使って問題番号を振るようにしていた。しかし、theorem環境はインラインな環境であるため、設定を工夫しないと番号の部分の直下にも文章が流し込まれる。これを防ぐために、パッケージを導入して、適当にパラメーターを触ってそうならないようにしていた。

しかし、theorem環境は滅多に触らないため、時が経つにつれパラメーターの意味が不明になってしまった。こうなる、触るのが面倒になりそれ以上は何もできない。

慣れているtcolorboxを使ってtheoremを置き換えることかできれば触りやすくなる。また、tcolorboxは機能が豊富なのであれこれやりやすそうである。これが、theorem環境で作っていた部分をtcolorboxに書き換えようとした動機である。

下線形式の解答欄を作るのにtcolorboxを使う

TeXのtcolorboxパッケージは、パッケージ名に"box"と付いている。そのため、箱を作るためのパッケージというイメージがある。しかし、箱から下線以外を消去すればただの下線である。よって、下線を引くことに使うこともできる(邪道だが)。

テストの解答用紙において、以下のような解答欄を作ることを考える。

f:id:baruku07:20180201221428p:plain

これまで、この手の解答欄はemathの\maskHakoで箱型の解答欄を作ることによって済ませてきた。しかし、箱型だとそれなりに箱と余白を大きく取っておかないとならないのでスペースの調整に気を使う。下線であればそこまで気を使わなくても解答欄が作れる。

\tcboxを使う

tcolorboxの\tcboxのオプションを以下のように指定すると、上のような解答欄が作れる。

\usepackage{tcolorbox}
\newcommand{\visible}{invisible} %visibleとinvisibleで解答の表示・非表示をスイッチ
....
....
(1) \tcbox[boxrule=-1pt,bottomrule=1pt,sharp corners, colback=white,\visible,nobeforeafter,tcbox width=forced left,width=10cm,box align=base,\visible]{解答}

オプションについてのメモ。

  • boxrule=0ptとすると画面上は線が見えてしまう。よって、念のため-1ptとしている。
  • 全ての線を消去した後、あらためて下線のみbottomrule=1ptで太さを指定する。
  • sharp cornersで角の丸みを取る
  • tcbox width=forced leftを指定することで、左寄せの指定、かつtcboxの幅を指定可能な状態にする。(これ抜きではtcboxは幅指定不可)
  • width=10cmで解答の幅を指定する。
  • box align=base で(1)と下線の位置を良い感じで調整する。
  • \visibleは解答非表示のときはinvisible, 解答表示のときはvisible。

上のコードを見ると、オプションが多い。下線を引くたびに、何度もオプションを書くのは美しく無い。よって、環境を定義して使う。

環境を定義して使う

\usepackage{tcolorbox} %プリアンプル
\newcommand{\visible}{visible} %%プリアンプル・解答切り替えのためのスイッチ
....
\newtcbox{\kasen}[1][]{boxrule=-1pt,bottomrule=1pt,sharp corners, colback=white,\visible,nobeforeafter,tcbox width=forced left,box align=base,\visible,#1} %環境を定義。プリアンプルでも本文でも良い。
.....
\kasen[width=10cm]{解答}

ここでは、オプションをコマンドの直後で追加指定できるように\kasenを定義している。[1][]でオプション引数を取る形にしておいて、そのオプション引数を各種オプション指定の最後に入れ込む。こうしておかないと、\kasenコマンドがオプション引数を取ることができない状態になるので注意(これははまった)。

オプションを入れ込む#1を最後にもってきている理由は、ある解答欄だけはtcbox width=forced centerで中央に寄せたい、といったときに、tcbox widthを後から指定したオプションで上書きしたいから。

同じ幅の(そして同じ幅であるべき)下線解答欄については、いちいち1つずつオプションを指定したく無い。よって、テストの解答用紙を作るときには、実際は何種類かの幅付きの下線と幅をオプションで変化させる下線を両方定義しておいて使い分けている。

最上段の数値キーは打てなくて良いと言われたのでいらっときた

キーボード最上段の数値キーは打てたほうが良いのだろうか?打てないよりかはそれは打てた方が良いまでは確実に言える。

しかし、テンキーで打てる(といってもブラインド打てるわけでもないのに)から問題ないとまで居直られていらっときた。こっちは、最低、これぐらいの理由は用意している。

  1. 数式を打つときに、いちいちテンキーに手を伸ばしたく無い。x2+2x+5=0とかx_1, x_2とか=if(x>100...l)程度の数式を打つのに、ホームポジションを外していては思考が乱れる。
  2. (特に理系であれば)最上段の記号を使わずに生活するのは難しい。いきなり記号はハードなので、まず数値で最上段で指を使うという感覚を習得させる(自分はJISかなだったからそんな練習不要だったが)。

だいたい、理由も用意せずに苦行のトレーニングをやれとは私が言うわけはないのだが・・・

こういう訓練は、誰かからどこかで強制されないとやらないので、そういう機会があるときにやったほうが良いと思っている。そして、提供するコストもローコストで提供できるし。

世間はハイコスト・ハイクォリティーの訓練を供給しようと頑張っている。しかし、リソースの投入が著しく限られてる環境ではそれは報われない。提供するほうが消耗して終わりである。したがって、こういうローコスト・苦行・人から言われないとやらない・効果はそれなりに高い、といったトレーニングを色々と探す日々である。

JISかな入力用練習メモ(行ごとのかなの配置・雑感)

業務上、かな入力の練習メニューを作ることになったのでメモ。指が覚えているので、どの段に何が配列されているかがパッと出ないのでここにメモ。

自分が、JISかなで入力してればキーを押していくだけで下に相当するものが得られるのでメモの必要はない。しかし、私は、現状は親指シフト(JISかなでも打てるが)なのでwikipediaの配列みながら作らないといけないのが面倒。

段ごとのかな配置

1. ホームポジション

ちとはしきくまのりれけむ

2. 上1段

たていすかんなにらせ

3. 下段

つさそひこみもねるめろ

4. 最上段

ぬふあうえおやゆよわほへ

雑感

かなを練習させてて良いと思うところ。

  • 濁点のメニューを別に用意しなくても良い
  • タイピングソフトがそのまま素直に使える。ローマ字の場合はローマ字表示がされないものを探すのが一苦労。

意外とはまるところ。

  • 、と。の打ち方を聞かれる
  • 「を」はShitfを押しながらでないと打てない
  • Shiftには右Shiftと左Shiftがあることに気づいていない
  • 最上段の打ち方を教える必要がある(ポジションを一時的に上側にシフトさせて打っても良いこと)。

JISかなはそれなり使い所がありそう

一定の層については、JISかなをやらせる価値があるのではないかと思っている。

原因の切り分け

ローマ字入力の練習を積み重ねても、速度が素直に伸びてない原因は様々なものが考えられる。その一つとして、脳内ローマ字変換が今ひとつ弱い、というものが考えられる。しかし、これを本人が素直に申告してくれる保証はない。

JISかなを使えば、ローマ字がボトルネックになっているかどうかが切り分けられる。もし、JISかなをやらせてみて劇的に早くなるようであれば、脳内ローマ字変換が弱いということが推測できる。そして、JISかなをやらせても速度が上がらないなら、指の動きに何か原因がある、といった形の判断ができる。

タイピングが伸びないとき、その原因を切り分けるツールがあれば(プラトーであることも含め)良いのだが、そのようなものがなかなかない。よって、切り分けに使える指導のツールは一つでも手元に多く持っておきたいというのが本音である。

ワーキングメモリ不足への対処

脳内ローマ字変換が苦手、というのは練習させればなんとかなる、という説もある。しかし、観察によると、一部の層についてはそれはあてはまらないように感じる。

また、ワーキングメモリが少ない場合、ローマ字への意識でわずかでもメモリを圧迫してしまう事が致命傷になる。これを防ぐには、かな入力にしてメモリの圧迫要因を消し去ってしまうのがわかりやすい。

JISかなは、覚えるべきキーが多いため、初期に練習時間がかかるという欠点が知られている。しかし、逆に考えれば練習時間さえ積める環境であれば問題ないということである。瞬間ローマ字変換回路は、こうはいかない。脳のスペックに密接に関わるため、練習時間だけでは解決できない。よって、時間さえ積める環境であれば、JISかなにして、練習時間で問題を解決する、ということが選択肢に入ってくる。

時間数さえ見積もれれば

JISかなが20時間で確実に身につく、とわかっていればもう少し多くの場合でJISかなを使えそうな気がする。親指シフトWikipediaのリンクから見られる練習時間数と文字数の関係のデータは、少し実感と違う。データが古く、知的レベルが高い層を対象にした調査なのが原因と見ている。

ローマ字でないと世間で困るという声もあるが

私の場合は、作文(短文作成)練習をさせるために、少なくとも1分40文字で入力できる入力方式を各人一つは身につけさせたほうが良いという考え方である。このようにタイピングスキルを身につけさせる意義を定義すると、タイピングは単純操作で意味がないという外野の声をシャットアウトできるので良い。作文能力の必然性にケチをつける人はさすがにいない。よって、安心してタイピング練習をさせることもできる。

タイピングの習得の目的が作文能力の育成の前提技能を身につけさせる、ということであるため、世間のPCを使う職場に適応できるかどうかということはあまり考えていない。よって、ローマ字である必要はない。

本当は親指シフトを教えたいが、それはさすがに世間(人によっては自宅ですら)で使えないのでやめている。なお、この文章は親指シフトで書いている。

どのような順番でローマ字入力を練習させるか

情報の授業において、タイピング指導は通常は十分な時間が割けない。自分自身は色々とひねりだして時間を割く。身体に覚えさせることは、どうやったって時間がかかるものと考えているからである。「やっていたら慣れる」は、ある程度のスペックを持っている層にしか通用しない。「やっていたら慣れる」が通用するところまでは、時間をかけてシステマティックな練習をさせるしかない。

これに対して、知識を教える部分は工夫や家庭学習への丸投げで時間を切り詰められることができる。よって、知識の部分の時間を切り詰めてタイピングの時間を捻出している。しかし、潤沢に時間があるわけではない。

人間が説明するよりソフトの力を借りる方が効率的

タイピング指導の方法は色々とある。一斉に説明していくアプローチもある。私も最初はそういった方法で取り組もうとしていた。しかし、1対40のコンピュータ室で指示は簡単には通らない。画面で遮られているし、キーボードにも不慣れな状況でキーボードの説明を言葉でされてもわかるわけもない。

そうなると、指示無しでいけるシンプルな方法を取らざるを得ない。加えて、タイピング指導の際には、手の動きが適切でない人間を観察して指摘していくという作業もある。そのため、指示のコストを減らして観察にコストをかけたい。

指示をせずに練習をさせるには、タイピングソフトを用いるしかない。このとき、最初は手を正しく置く苦行系のものを使うことが重要である。私自身はmikatypeを基本的には使うことにしている。このソフト、練習は苦行なのだが、この通りにやれば正しい癖が身につく。使い方も特に説明不要。

a, i, u, e, oから覚えさして細かくきざむ

mikatypeはランダムに暗記していくアプローチを取っている。そのため、一定程度の効果が出るまで時間がかかる。これを待っている余裕がないことがある。そうなると、"a, i, u, e, o"を教えてとりあえず日本語を打たせていくアプローチを取らざるを得ない。

a, i, u, e, oだけ覚えさせて、あとは適当にやって覚えておけという環境ならこれ以上の議論は必要ない。しかし、そうではない場合、もう少しステップを刻んでいく必要がある。現在はこの順番でやらせるのが良いのかなと思っている。

  1. mikatypeのホームポジションをざらっとやらせる(ホームポジションに手を置かせる練習)
  2. 「あいうえお」を軽く練習
  3. 「かきくけこ」「さしすせそ」を追加(ここで時間をかけて「あ」「か」「さ」を完全習得させる)
  4. 「らりるれろ」「わをん」を追加(左手の上の段)
  5. 「はひふへほ」を追加
  6. 「たちつてと」「やゆよ」を追加
  7. 「だぢづでど」を追加(これを初期にしないのは単語が少ないから)
  8. 「まみむめも」を追加
  9. 「なにぬねの」を追加

打ちやすいところから攻めていく方針である。打ちにくいところは、最悪習得できなくても諦める。打ちにくいところに手を伸ばさせると、戻すのが難しいため余計な部分に気が散る。よって最初はそういう部分はやらない。打ちやすいところがすらすらになってから戻す練習はさせれば良い。

ここまでで、50音は片がつく。後は、もう覚えられる人はがんばって覚えてもらう。そうで無い人は諦めてもらう。濁音はまあ諦める。

なおホームポジションだけは、できれば完全暗記させたい。ホームポジションを暗記していない人は、ホームポジションの部分のキーをのぞくために指をずらす傾向があるからである。そうなくと、正しい運指が習得できなくなる。

刻むアプローチの利点

細かく刻むアプローチの良いところは、途中までしかできなくてもそれなりに何かが残ることである。このアプローチは、3.までの負担は軽い。しかし、その割には3.まで習得することの効果は大きい。

まず、a,i,u,e,oでだいたい半分のキーが肩がつく。そして、sとkを覚えていれば、下を見てキーを確認するときに指をずらさなくても済むようになるので随分楽になる。(いろんな意味で)まともな世界からは信じられないが、3.までを身につけてくれるだけでも随分助かるという環境もあるのである。

手元には、この方針でExcelシートに単語を列挙したものが存在している。一度、これで良いのか試して見たい。しかし、私の現状はmikatypeに十分な時間をかけられる環境であるため、このアプローチの実験ができない。少人数では試せそうだが。どこかで実験したいな。

特定のひらがなのみを含む単語を大量に用意する(2)単語の抽出

(1)では単語のリストを作成した。あとは、そこから特定のひらがなのみを含む単語を抽出するだけである。単語リストは次のような形になっている。

しまい
あやぎぬ
ようさい
くみうち
きない

このようになるように(1)で作ったNoun_yomi_a.csvを使っていく。

正規表現で抽出する

grepを使うことにする。awkでもなんでも正規表現が使えれば良い。

例えば、「あ行」「か行」「さ行」を含む文字のみから単語を取り出すには

grep -E "^[あいうえおかきくけこさしすせそ]+$" Noun_yomi_a.csv

とすれば良い。途中で見落としてたのは次の2点。

  1. ^(行頭)と$(行末)の記号をつけていないと余計なものがひっかかる(最初行末の記号が必要なことを見落としてはまった)
  2. [か-こ]などとすると「がぎぐげご」もヒットする。よって、あえて「かきくけこ」とべたに書いている。

ただ、これではあまりに文字数の短い単語や長い単語もヒットしてしまう。そこで、文字数に制限をかける。

grep -E "^[あいうえおかきくけこさしすせそ]{3,5}+$" Noun_yomi_a.csv

{3,5}は直前のパターンを3回以上5回以下の繰り返したものにマッチさせろということである。文字数を調整したければここをさわれば良い。

あとは、適当なファイルでリダイレクトで書き出してexcelに貼り付ける。オートコンプリートをオフにすれば、これで簡単な練習帳が完成する。

抽出したリストから特定の文字を含む単語を絞りこむ

スモールステップでやらせていると、例えば「今覚えたばかりの文字を必ず含む」+「これまで習った文字」のパターンで復習させたいと考えることがある。例えば、「あいうえお」を習得したと考えられる状態で、「かきくけこ」を教えたというときに、必ず「かきくけこ」を含む単語だけで練習させたいという状態である。

この場合、パイプで絞り込めば良い。例えば、「かきくけこ」を必ず含んで「あいうえおかきくけこ」だけを使った単語を抽出したいときは次のようにする。

grep -E "^[あいうえおかきくけこ]{3,5}$" Noun_yomi_a.csv | grep -E "[かきくけこ]"  

パイプの後の条件指定は^とか$をつけるとだめ。単語のどこかに「かきくけこ」が入っていればOKだからこの書き方。

タイピング練習にしりとりを使う

最近、かな入力の指導を少ししている。その練習の一つで、しりとりをやらせてみた。練習の目的は、あいまいなキーの位置の記憶を、スムーズに引っ張り出させるようにすることである。

練習にしりとりを使うメリットとしては、

  1. 最後のひらがなと最初のひらがなが同じなので自然と復習ができる
  2. 声を使うことで音声を補助にして記憶できる
  3. 寝なくなる
  4. ゲーム性があるため長時間練習できる

ということがぱっと思いつく。20分ぐらいやらせてみたが、狙い通りの効果はみられた。

そして、ローマ字の初期指導でも「しりとり」は使えるのではないかと思った。

最近、初期段階の指導で音声を取り入れた練習をさせるのが良いのではないか?と考えつつある。初心者の様子を見ていると、ディスプレイの文字を見ながらキーに意識を向けるのが大変そうだからである。

ローマ字の初心者の初期指導でしりとりをやらせるときには、次のようなことに注意してやらせようかと考えている。

  • 濁点と小さな文字のない単語に限定させる(使うキーが14キーで済む)
  • 画面に濁点のない単語のキーの位置を書いた画像を表示させておく(下を見させないため)
  • (可能なら)アルファベットにシールを貼ったキーボードを用意する

ただし、音を聞いて覚えておくことが苦手な生徒には厳しい練習かもしれない。そういう場合は、チャット風で画面でしりとりさせるのが良いのかもしれない。その場合でも、もちろん声は出させる(居眠り防止や記憶の定着の促進)。