nkhrlab~

140字超の記事

LaTeXでマークシート式試験

マークシート式試験の組版

大学入試センター試験に代表されるマークシート式試験の組版では,同じ大問中で連続した解答欄 (例えば,マークが10箇所であれば解答欄「ア」~「コ」) を使うことが多い.これをLaTeXで実現する場合,1つの大問を通して利用するカウンタと解答欄の記号を対応付けるテーブルを用いる方法が考えられる.

また,数学の問題では,2桁以上の解答に複数の解答欄を使用するので,桁数を指定して自動的に解答欄を割り当てたい.さらに,前の解答欄を参照する場合に相互参照ができると問題の入れ替え時などに解答欄がずれなくなり利便性が向上する.

LaTeXテンプレート

以上の要件を盛り込んだマークシート式試験向けテンプレート「marksheet.sty」を作成した.このテンプレートを使用すると,下の画像のような組版が容易に実現できる.
f:id:nkhrlab:20190217123759j:plain

marksheet.sty

%
% marksheet.sty
%
% 使用例:
% \usepackage{marksheet}
%
% $(x+1)(x-10) = 0 \Leftrightarrow x= \markbox[label]{2}, \markbox[label2]{2}$である.
%
% ただし $\refhosomarkbox[label]{2} < \refhosomarkbox[label2]{2}.$
%
% また $2^{\refhososemamarkbox[label]{2}} = \frac{\markbox{1}}{\markbox{1}}, 2^{\refhososemamarkbox[label2]{2}} = \markbox{4}$である.
%

\usepackage{ifthen}

\def\@katakana#1{\ifcase#1 京\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\or\else\@ctrerr\fi}

\def\katakana#1{\expandafter\@katakana\csname c@#1\endcsname}%アイウエオ

\newcounter{countermark}
\setcounter{countermark}{0}
\newcounter{tempcountermark}
\setcounter{tempcountermark}{0}
\newcounter{itermark}
\setcounter{itermark}{0}

\newcommand{\resetmark}[0]{\setcounter{countermark}{0}}

\newcommand{\markboxletter}[2][]{\refstepcounter{countermark}\ifx{#1}{}{}\else{\label{#1}}\fi\katakana{countermark}\setcounter{itermark}{1}\whiledo{\value{itermark}<#2}{\refstepcounter{countermark}\katakana{countermark}\addtocounter{itermark}{1}}}

\newcommand{\refmarkboxletter}[2][]{\setcounter{tempcountermark}{\ref{#1}}\setcounter{itermark}{0}\whiledo{\value{itermark}<#2}{\katakana{tempcountermark}\refstepcounter{tempcountermark}\addtocounter{itermark}{1}}}

\newcommand{\waku}[1]{\fboxrule=1.0pt \fboxsep=2.1pt \fbox{\ \bf{#1}\ }}
\newcommand{\hosowaku}[1]{\fboxrule=0.5pt \fboxsep=2.5pt \fbox{\ {#1}\ }}
\newcommand{\semawaku}[1]{\fboxrule=1.0pt \fboxsep=0.8pt \fbox{\bf{#1}}}
\newcommand{\hososemawaku}[1]{\fboxrule=0.5pt \fboxsep=1.0pt \fbox{#1}}

\newcommand{\markbox}[2][]{\waku{\markboxletter[#1]{#2}}}
\newcommand{\refmarkbox}[2][]{\waku{\refmarkboxletter[#1]{#2}}}
\newcommand{\hosomarkbox}[2][]{\hosowaku{\markboxletter[#1]{#2}}}
\newcommand{\refhosomarkbox}[2][]{\hosowaku{\refmarkboxletter[#1]{#2}}}
\newcommand{\semamarkbox}[2][]{\semawaku{\markboxletter[#1]{#2}}}
\newcommand{\refsemamarkbox}[2][]{\semawaku{\refmarkboxletter[#1]{#2}}}
\newcommand{\hososemamarkbox}[2][]{\hososemawaku{\markboxletter[#1]{#2}}}
\newcommand{\refhososemamarkbox}[2][]{\hososemawaku{\refmarkboxletter[#1]{#2}}}