LaTeXソースファイル

この節では、LaTeXソースファイルから試験問題をデザインできるようにするためのLaTeXコマンドを説明します。別の形式をソースファイルにする場合は、この節はスキップしてください。選択式試験問題は、automultiplechoiceパッケージを用いてLaTeXファイルで記述できます。LaTeXファイルは、latexコマンドでコンパイルして生成されたdviファイルを表示することで、いつでも確認することができます。

選択式試験問題用のLaTeXファイルをどのように作ればいいかを簡潔に示すいくつかの例から始めます。それぞれのLaTeXファイルはテンプレートとして用意されているので、これらのテンプレートの一つを用いて選択式試験問題プロジェクトを作ることができます。

簡単な例

\documentclass[a4paper]{article}

\usepackage[utf8x]{inputenc}    1
\usepackage[T1]{fontenc}

\usepackage[box,completemulti,lang=JA]{automultiplechoice}    2
\begin{document}

\onecopy{10}{    3

%%% 試験問題用紙ヘッダー開始:    4

\noindent{\bf QCM  \hfill TEST}

\vspace*{.5cm}
\begin{minipage}{.4\linewidth}
\centering\large\bf テスト\\ 試験日 2008年1月1日\end{minipage}
\namefield{\fbox{    5
                \begin{minipage}{.5\linewidth}
                  氏名:

                  \vspace*{.5cm}\dotfill
                  \vspace*{1mm}
                \end{minipage}
         }}

\begin{center}
試験時間 : 10 分。

  資料の持込みと電子計算機の使用は禁じます。

  \multiSymbole{}の記号のある設問の正解は1個とは限りません。
  0個の場合や複数の場合があります。

  それ以外の設問には正解が1個だけあります。

  \emph{非常に悪い解答}にはマイナス点がつくことがあります。
\end{center}
\vspace{1ex}

%%% ヘッダー終了

\begin{question}{総理大臣}    6
  次のうち、日本の総理大臣になったことがある人を一人選びなさい。
  \begin{choices}
    \correctchoice{大隈重信}
    \wrongchoice{湯川秀樹}
    \wrongchoice{聖徳太子}
    \wrongchoice{徳川家康}
  \end{choices}
\end{question}

\begin{questionmult}{都道府県}    7
  次のうち、日本の都道府県はどれか、すべて選びなさい。
  \begin{choices}
    \correctchoice{石川}
    \wrongchoice{山田}
    \correctchoice{宮崎}
  \end{choices}
\end{questionmult}

\clearpage    8

}   9

\end{document}

この例題の解説:

1

inputencおよびfontencパッケージにより、試験問題の文章にUTF-8エンコーディングを用いることができます。当然、利用したいエンコーディングに合わせて修正することができます。(訳注: 日本語の試験問題において、後述する最近のplatexを使用する場合は、なくてもUTF-8で動作します。)

2

ここで使われているautomultiplechoiceパッケージのオプションは、設問が2ページにまたがるのを防ぎ(box)、複数選択問題にどの選択肢も該当しないことを示すもう一つの選択肢を自動追加します(completemulti)。

3

onecopyコマンドは(異なる)試験問題を必要数(ここでは10)実体化します。LaTeXの環境を用いた代替の構文については「試験問題数の記述」を参照してください。

4

この行以降は、試験問題用紙のヘッダーを記述します。

5

namefieldコマンドは受験者が氏名を記入する欄を指定します。

6

questionおよびchoices環境は、単一の正解のある選択式問題を作成します。固有の識別名(ここでは総理大臣)を指定する必要があります。

7

questionmultおよびchoices環境は、任意個数の正解のある選択式問題を作成します。受験者は、正解と思われるすべてのボックスにマークするか、(6行目のパッケージ読込みでのcompletemultiオプションで自動的に追加された)最後のボックスにマークすることになります。

8

clearpageは試験問題の次の実体を次のページから開始させるのに用います。

9

(9行目で始まった)onecopyコマンドの終わりを表します。

設問グループとシャフルの例

この例では、設問の順序は試験問題の実体ごとに変えたいけれど、同じ分野の設問どうしはいっしょにまとめておきたい場合を考えます。この目的のためには、設問グループを二つ作成し、各グループ内で設問をランダムにシャフルします。

\documentclass[a4paper]{article}

\usepackage[box,completemulti,lang=JA]{automultiplechoice}
\begin{document}

%%% グループの準備

\element{地理}{
  \begin{question}{パリ}
    パリはどの大陸にありますか?
    \begin{choices}
      \correctchoice{ヨーロッパ}
      \wrongchoice{アフリカ}
      \wrongchoice{アジア}
      \wrongchoice{火星}
    \end{choices}
  \end{question}
}

\element{地理}{
  \begin{question}{カメルーン}
    カメルーンの首都はどれですか?
    \begin{choices}
      \correctchoice{ヤウンデ}
      \wrongchoice{ドゥアラ}
      \wrongchoice{アブダビ}
    \end{choices}
  \end{question}
}

\element{歴史}{
  \begin{question}{応仁}
    応仁の乱はいつ始まりましたか?
    \begin{choiceshoriz}
      \correctchoice{1467年}
      \wrongchoice{1967年}
      \wrongchoice{1419年}
    \end{choiceshoriz}
  \end{question}
}

\element{歴史}{
  \begin{questionmult}{Nantes}
    \emph{ナントの勅令}について正しいのはどれですか?
    \begin{choices}
      \correctchoice{1598年に発布された}
      \correctchoice{ルイ14世により破棄された}
      \wrongchoice{ヘンリ2世により発布された}
    \end{choices}
  \end{questionmult}
}

%%% copies

\onecopy{10}{

%%% 試験問題用紙ヘッダー開始:

\noindent{\bf QCM  \hfill TEST}

\vspace*{.5cm}
\begin{minipage}{.4\linewidth}
  \centering\large\bf 歴史と地理\\ 試験日 2008年1月1日
\end{minipage}
\namefield{\fbox{\begin{minipage}{.5\linewidth}
氏名::

\vspace*{.5cm}\dotfill
\vspace*{1mm}
\end{minipage}}}

%%% ヘッダー終了

\begin{center}
  \hrule\vspace{2mm}
  \bf\Large 地理
  \vspace{1mm}\hrule
\end{center}

\shufflegroup{地理}
\insertgroup{地理}

\begin{center}
  \hrule\vspace{2mm}
  \bf\Large 歴史
  \vspace{2mm}\hrule
\end{center}

\shufflegroup{歴史}
\insertgroup{歴史}

\clearpage

}

\end{document}

別紙答案用紙を用いた例

この例では、マーク用のボックスをすべて別紙に集めて配置したい場合を考えます。こうすれば、不正行為はさらに難しくなり、また重要なのは、受験者一人につき用紙を1枚だけスキャンすればいいので、スキャンを手動で行う場合の手間が軽減されます。この例は設問数が少なく1枚に収まるため、このような配置はこの特定の場合ではあまり有用ではないかもしれません。多数の設問でこの配置を利用できるようにこの例を修正するのはおまかせします!

\documentclass[a4paper]{article}

\usepackage[box,completemulti,separateanswersheet,lang=JA]{automultiplechoice}    1
\begin{document}

\AMCrandomseed{1237893}

\def\AMCformQuestion#1{\vspace{\AMCformVSpace}\par {\sc 問 #1:} }    2


\element{general}{
  \begin{question}{総理大臣}
    次のうち、日本の総理大臣になったことがある人を一人選びなさい。
    \begin{choices}
      \correctchoice{大隈重信}
      \wrongchoice{湯川秀樹}
      \wrongchoice{聖徳太子}
      \wrongchoice{徳川家康}
    \end{choices}
  \end{question}
}

\element{general}{
  \begin{questionmult}{都道府県}
    次のうち、日本の都道府県はどれか、すべて選びなさい。
    \begin{choices}
      \correctchoice{石川}
      \wrongchoice{山田}
      \correctchoice{宮崎}
    \end{choices}
  \end{questionmult}
}

\element{general}{
  \begin{question}{EU}
    欧州連合には2009年1月現在、何ヶ国が加盟していますか?
    \begin{choiceshoriz}[o]
      \wrongchoice{15}
      \wrongchoice{21}
      \wrongchoice{25}
      \correctchoice{27}
      \wrongchoice{31}
    \end{choiceshoriz}
  \end{question}
}

\onecopy{5}{    

%%% 試験問題用紙ヘッダー開始:

\noindent{\bf QCM  \hfill TEST}

\vspace*{.5cm}
\begin{minipage}{.4\linewidth}
  \centering\large\bf テスト\\ 試験日 2008年1月1日
\end{minipage}

\begin{center}\em
試験時間 : 10 分。

  資料の持込みと電子計算機の使用は禁じます。

  \multiSymbole{}の記号のある設問の正解は1個とは限りません。
  0個の場合や複数の場合があります。

  それ以外の設問には正解が1個だけあります。

  \emph{非常に悪い解答}にはマイナス点がつくことがあります。

\end{center}
\vspace{1ex}

%%% ヘッダー終了

\shufflegroup{general}
\insertgroup{general}

\AMCcleardoublepage    3

\AMCformBegin    4

%%% 答案用紙ヘッダー開始

{\large\bf Answer sheet:}
\hfill \namefield{\fbox{    5
    \begin{minipage}{.5\linewidth}
      氏名:
      
      \vspace*{.5cm}\dotfill
      \vspace*{1mm}
    \end{minipage}
  }}

\begin{center}
  \bf\em 解答はこの用紙にのみ行わなければなりません:
  他の用紙に行った解答は無視されます。
\end{center}

%%% 答案用紙ヘッダー終了

\AMCform    6

\clearpage    

}  

\end{document}

以下の解説により、上の例がより明確になるでしょう:

1

separateanswersheetオプションにより、所望の配置ができるようになります。

2

別紙答案用紙上での設問番号の表示方法をこのように変更することができます(この行はなくてもかまいません)。

3

この改ページはマーク用ボックスを集めた答案専用の用紙の前に置きます。両面印刷を行う場合は、このページが次の用紙に印刷されるように\AMCcleardoublepageを使用してください。片面印刷の場合は、単純に\clearpageが使えます。

4

このコマンドは答案用紙部の開始を示します。答案用紙側にしか現れない設問(例えばAMCcodeで生成される擬似的な設問)を適切に扱うために必要です。

5

受験者の氏名は答案用紙側に記入しないと意味がありません!

6

AMCformコマンドにより、マーク用ボックスがすべて出力されます。

[警告]警告

別紙答案用紙を用いる場合、アルファベット(あるいはdigitsオプションを使用した場合は数字。「パッケージオプション」参照)がマーク用ボックス内に印刷されます。マーク有無を正確に検出するために、受験者にはボックスをしっかり塗りつぶすように(単純にチェックマークだけでは不十分)指示する必要があります。また、マーク判定閾値(マークのあるボックス内での黒ピクセルの割合で定義)を0.5付近に調整する必要があります。

LaTeXコマンドの説明

パッケージオプション

automultiplechoiceパッケージを使用するには、

\usepackage[...]{automultiplechoice}

という行を用い、...部分はカンマで区切ったオプションのリストを指定します。指定できるオプションは以下のとおりです:

  • lang=XX: 試験問題の言語をXXに設定します。現時点では、DE(ドイツ語)、ES(スペイン語)、FR(フランス語)、IT(イタリア語)、JA(日本語)、NL(オランダ語)のみ指定可能です。automultiplechoicecompletemultiオプションで挿入する「該当なし」のような数種類の文字列も翻訳されます。

  • box: 各設問をブロックに入れ、改ページで分割されないようにします。

  • completemulti: 「該当なし」の選択肢を複数選択問題の最後に自動的に付け足します。これにより、複数選択問題において、解答がされない場合とどの選択肢も該当しないという解答とが区別できるようになります。この動作は、個別の設問において、questionmult環境の内部で \AMCcompleteMultiあるいは\AMCnoCompleteMultiコマンドを用いることで、強制あるいはキャンセルすることができます。

  • noshuffle: 各設問で選択肢を自動シャフルしないようにします。

  • answers: 試験問題用紙ではなく、模範解答を生成します。

  • separateanswersheet: マーク用ボックスをすべてまとめて試験問題用紙の最後に配置するようにします(通常このオプションは、受験者一人あたり用紙を1枚だけスキャンしたいときに使用します。使用例は「別紙答案用紙を用いた例」を参照してください)。

  • digits: separateanswersheetオプションを用いる場合に、digitsオプションにより選択肢を(デフォルトの)アルファベットではなく数字で識別します。このオプションを用いる場合は選択肢の数が9を越えないように注意する必要があります。

  • outsidebox: separateanswersheetを用いる場合に、このオプションによりアルファベット(あるいは数字)を答案用紙のボックスの外側に印刷します。

  • insidebox: separateanswersheetを用いない場合に、このオプションによりアルファベット(あるいは数字)を受験者がマークするボックス内に印刷します。

  • catalog: 将来の試験で組み合わせて使えるように設問のカタログを作成します。設問は番号ではなく識別名で区別されます。このレイアウトには\onecopyを使用する必要はありません。

  • postcorrect: スキャンデータの解析を終えてから(採点時)、出題者が作成した答案用紙を正解として与えたい場合にこのオプションを用います。詳細は「採点時正解提示」を参照してください。

  • automarks: separateanswersheet(別紙答案用紙)モードにおいて、試験問題のページに四隅のマーカーを印刷したくない場合に使用してください。マーカーは別紙答案用紙にのみ印刷されます。この場合に試験問題ページ上のページ番号の書式を変更するには、\AMCsubjectPageTagコマンドを次のように再定義してください:

    \renewcommand\AMCsubjectPageTag{%
      \fbox{\texttt{\the\AMCid@etud:\thepage}}%
    }
    [警告]警告

    automarksオプションは、AMCが試験問題ページ上のデータを処理できなくなりますので、これを読み取る必要がない場合にのみ使用してください。

試験問題数の記述

試験問題用紙の内容を記述したLaTeXソースコードは\onecopyコマンドの呼出しに含まれている必要があります。これの最初の引数は生成する実体の部数、2番目が実体を生成するコードです。

\onecopy{50}{ ... }

environパッケージをautomultiplechoiceに読み込んだ場合は、代替構文としてexamcopy環境が使用可能で、部数はそのオプションで与えます(デフォルトは5)。

\begin{examcopy}[50]
...
\end{examcopy}
[注記]注記

environパッケージは、Ubuntuディストリビューション9.10(Karmic Koala)までで用いられているTeX Live 2007ディストリビューションでは使用できません。

設問と選択肢

単一選択問題(正解が1個)では、次のようなモデルを用います:

\begin{question}{識別名}
  ここに問題文...
  \begin{choices}
    \correctchoice{正しい選択肢}
    \wrongchoice{誤った選択肢}
    \wrongchoice{別の誤った選択肢}
  \end{choices}
\end{question}
[重要]重要

各設問には異なる識別名を用いなければなりません。識別名には、数字、アルファベットと、単純な文字(ただし波括弧や角括弧などを除く)が使えます。設問識別名はピリオドとそれに続く数字で終わらないようにしてください。この形式は受験番号記入欄用に予約されています。

[注記]注記

各設問の選択肢の数は199個までです。

特定の設問について選択肢をシャフルせず順序を保つには、choices環境のoオプションを利用することができます。3行目を次のようにしてください:

\begin{choices}[o]

選択肢を2カラムに配置するには、multicolパッケージを使用できます。

\usepackage{multicol}

を用いてプリアンブル部(automultiplechoiceへの参照の直後など)でロードし、以下に示すようにmulticols環境の中にchoices環境を入れてください:

  \begin{multicols}{2}
    \begin{choices}
      \correctchoice{正しい選択肢}
      \wrongchoice{誤った選択肢}
      \wrongchoice{別の誤った選択肢}
    \end{choices}
  \end{multicols}

選択肢がさらに短い場合、choices環境のかわりにchoiceshorizを用いることで、選択肢を横に並べていくことができます。

(正解が任意個あるような)複数選択問題には、question環境のかわりにquestionmultを使用します。

どの選択肢を選んだかが成績に無関係な設問には、次の例のように\QuestionIndicativeコマンドが使用できます。

\begin{question}{難易度}\QuestionIndicative
  \scoring{auto=0,v=-1,e=-2}
  この授業は易しいですか難しいですか?0(非常に難しい)から5(非常に易しい)の範囲で選んでください。
  \begin{choiceshoriz}[o]
    \correctchoice{0}
    \correctchoice{1}
    \correctchoice{2}
    \correctchoice{3}
    \correctchoice{4}
    \correctchoice{5}
  \end{choiceshoriz}
\end{question}

選択肢を複数カラムに配置

選択肢を複数のカラムに置く(そしてスペースを節約する)には、LaTeXのmulticolパッケージを用いて、multicols環境内にchoices環境を入れることができます。

選択肢がカラムの1行におさまらない場合、その一部が次のカラムに分割されてしまうことがあり、これは受験者を混乱させるかもしれません。この現象を避けるには、\AMCBoxedAnswersコマンドを使用して、各選択肢をボックスに入れてしまうことができます。使用例を示します:

\begin{question}{2カラム}
  鳥とは何ですか?
  \begin{multicols}{2}\AMCBoxedAnswers
    \begin{choices}
      \correctchoice{翼をもった動物で、卵を産みます。あらゆる種類の色をもった鳥がいます。}
      \wrongchoice{木製の大きな家具で、多くの場合、家庭用の衣類を保管するのに使われます。}
      \wrongchoice{蒸気で動く機械で、高速に缶を密封することができます。}
    \end{choices}
  \end{multicols}
\end{question}

選択肢ブロック間の垂直スペースはパラメータになっており、寸法AMCinterBrepにより変更することができます:

\AMCinterBrep=.5ex

設問のグループ

設問をグループに入れることにより、グループ内の設問をシャフルして試験問題の実体ごとに順序を変えることができます。それぞれの設問グループは通常文字によるグループ名をもたなければなりません。

設問を一つ一つグループに入れるには、次の例のようにします。

\element{マイグループ}{
  \begin{question}{簡単}
    では、1足す1はいくつですか?
    \begin{choiceshoriz}
      \correctchoice{2}
      \wrongchoice{0}
      \wrongchoice{3}
    \end{choiceshoriz}
  \end{question}
}
[重要]重要

elementを用いたグループの構築は1回しか行ってはいけません。そのため、これらは、試験問題の実体ごとに内容を繰り返すonecopyコマンドの前に置かなければなりません。

グループを構築すると、shufflegroupコマンドを次のように用いてグループ内の設問をシャフルすることができます:

\shufflegroup{マイグループ}

そして、insertgroupコマンドを次のように用いてグループの内容を試験問題用紙に出力することができます:

\insertgroup{マイグループ}
[注記]注記

最後の二つのコマンド(shufflegroupinsertgroup)はonecopyの引数内部で使用されるべきものです。これによって、それぞれの実体化の前にシャフルが行われます。

設問グループは、次のようなコマンドによって、より細かく操作することができます:

  • \insertgroup[n]{マイグループ} は、(オプションのパラメータnを使用することにより)グループ内の最初のn要素だけ出力します。

  • \cleargroup{マイグループ} は、グループの中身を空にします。

  • \copygroup{グループA}{グループB} は、グループAの全要素をグループBの最後にコピーします。オプション引数nを用いると、最初のn要素だけコピーされます: \copygroup[n]{グループA}{グループB}

これらのコマンドを用いれば、例えば次のコードにより、GAグループからランダムに4個、GBグループからランダムに5個、GOグループから全設問を取り出して、それらをシャフルするということができます(onecopyコマンドの引数内部で使用します):

\cleargroup{all}
\shufflegroup{GA}\copygroup[4]{GA}{all}
\shufflegroup{GB}\copygroup[5]{GB}{all}
\copygroup{GO}{all}
\shufflegroupe{all}
\insertgroup{all}

用紙サイズと余白

LaTeXのautomultiplechoiceパッケージはgeometryを用いて余白とページレイアウトを設定しています。その設定を上書きするには、\begin{document}の直前で\geometryコマンドを用いてください。詳細はgeometryパッケージのドキュメントを参照してください。AMCが設定する初期値は次のとおりです:

\geometry{hmargin=3cm,headheight=2cm,headsep=.3cm,footskip=1cm,top=3.5cm,bottom=2.5cm}

スペースを広げるために余白を縮めるときは、以下に注意してください:

  • 四隅のマーカーは完全に印刷されていなければなりません(プリンタの印刷可能範囲により欠けてしまう可能性があります)。

  • 四隅のマーカーはスキャン画像上で完全に見えなければなりません(マーカーが用紙の端ぎりぎりのとき、用紙がずれたり傾いたりすると、画像からはみ出してしまいます)。

\geometryコマンドの引数リストの一つのオプションとして用紙サイズを設定することもできます。可能な値は、a4papera5papera6paper, b4paperb5paperansibpaperansicpaperansidpaperletterpaperexecutivepaperlegalpaperなどです。

用紙サイズが小さいときは、(+1/1/53+のような)目視用の用紙IDの位置を変更したい場合があるかもしれません。これは次のような形式で、\AMCidsPositionコマンドを用いることでできます:

\AMCidsPosition{pos=p,width=w,height=h}

ここで、pnonetopsideのいずれかで、whはIDを含む(見えない)ボックスの寸法です。デフォルト値は次の値です:

\AMCidsPosition{pos=side,width=4cm,height=3ex}

最後に、A5用紙のための設定例を示します:

\geometry{a5paper,hmargin=1.6cm,top=2.5cm}
\AMCidsPosition{pos=top}

マーク用ボックスの外見スタイル

\AMCboxDimensionsコマンドにより、マーク用ボックスの寸法を変えることができます。

  • shape はボックスの形状です。squareとすれば四角形になり、ovalとすれば円または楕円になります。ovalを使用するにはLaTeXのtikzパッケージをロードする必要があることに注意してください。

  • width はボックスの幅です。

  • height はボックスの高さです。

  • size はボックスのサイズ(widthheight)です。

  • rule はボックスの枠の太さです。

  • down はボックスをどれだけ下に下げるかを制御します。

小さめのボックスを作るには、例えば次のようなコマンドを使ってください:

\AMCboxDimensions{size=1.7ex,down=.2ex}

パッケージのseparateanswersheetオプションを使用しているときは、ボックスのラベルをカスタマイズすることもできます。デフォルトの動作はアルファベットの大文字によるラベルで、digitsオプションを用いると数字になります。独自のラベルを用いるには、\AMCchoiceLabelコマンドを再定義する必要があります。このコマンドは、選択肢を数えるカウンタ名を引数にとります。例えば以下のコードにより、ボックスのラベルにアルファベットの小文字を用いるようになります:

\def\AMCchoiceLabel#1{\alph{#1}}

別の例として、arabxetexパッケージを使用している場合、以下のコードが便利かもしれません:

\def\AMCchoiceLabel#1{\textLR{\Alph{#1}}}

ボックスのラベルのスタイルも、次の例のように\AMCchoiceLabelFormatコマンドを再定義して変更することができます(ラベルを太字にしたいとします):

\def\AMCchoiceLabelFormat#1{\textbf{#1}}

さらに、受験者がマークするボックスの色も、次のように設定することもできます:

\AMCboxColor{red}

redは任意の色に置き換えられます(ただしxcolorパッケージが認識できなければなりません)。例えば、淡緑色にするには次のようにしてください:

\definecolor{amcboxcolor}{rgb}{0.67,0.88,0.5}
\AMCboxColor{amcboxcolor}

設問の外見スタイル

LaTeXのAMCbeginQuestionコマンドを再定義することにより、各設問の外見を変更することができます。デフォルトの定義は次のとおりです:

\def\AMCbeginQuestion#1#2{\par\noindent{\bf Question #1} #2\hspace*{1em}}

このコマンドに与えられる最初のパラメータは表示する設問の番号です。2番目は複数選択問題の場合に\multiSymboleを含み、それ以外の場合は空です。\multiSymboleコマンドは複数選択問題を他と区別できるようにするためのものであり、これも変更することができます。デフォルトではトランプのクラブ記号です。

\def\multiSymbole{$\clubsuit$}

最後に、\AMCnumeroコマンドにより、次の設問の番号を変更できます。試験問題の各実体化において、最初に

\AMCnumero{1}

の呼出しが実行されますが、どこで用いてもかまいません。

選択肢の外見も、choiceschoiceshorizのかわりにchoicescustomを用いれば、次の三つのLaTeXマクロを再定義して同様に変更できます:

\def\AMCbeginAnswer{}
\def\AMCendAnswer{}
\def\AMCanswer#1#2{#1 #2}

別紙答案用紙方式

separateanswersheetオプション(「別紙答案用紙を用いた例」参照)で生成される別紙答案用紙のレイアウトを変更することも可能です。

  1. マーク用ボックスの水平間隔を変更したり、設問間の垂直間隔を変更したりするだけならば、以下の寸法を再定義するだけです:

    \AMCformHSpace=.3em
    \AMCformVSpace=1.2ex
    
  2. 表示設定をもっと細かく変更したい場合は、各設問と選択肢の開始に使われるコマンドを再定義することができます(以下はデフォルトの定義を示します):

    \def\AMCformQuestion#1{\vspace{\AMCformVSpace}\par{\bf Question #1:}}
    \def\AMCformAnswer#1{\hspace{\AMCformHSpace} #1}
    

これらの定義は、LaTeXファイルの\begin{document}の直後に挿入しなければなりません。

受験番号取得

受験番号の取得はLaTeXのAMCcodeコマンドを使用して、受験者に答案用紙上に自分の受験番号を記入してもらうことで、容易に行うことができます。このコマンドの二つの引数は、設問識別名と、番号に用いる桁数です。例えば次のようなヘッダーを用いることができます:

{\setlength{\parindent}{0pt}\hspace*{\fill}\AMCcode{受験番号}{8}\hspace*{\fill}
\begin{minipage}[b]{6.5cm}
$\longleftarrow{}$\hspace{0pt plus 1cm} 受験番号を以下にマークし、その下に氏名を記入してください。

\vspace{3ex}

\hfill\namefield{\fbox{    
    \begin{minipage}{.9\linewidth}
      氏名:
      
      \vspace*{.5cm}\dotfill
      
      \vspace*{.5cm}\dotfill
      \vspace*{1mm}
    \end{minipage}
  }}\hfill\vspace{5ex}\end{minipage}\hspace*{\fill}

}

separateanswersheetオプションを用いている場合は、 AMCcodeコマンドはAMCformBeginコマンドの後に置く必要があります。

\AMCcodeの出力は、 長さ\AMCcodeHspace\AMCcodeVspace\AMCcodeBoxSepを設定することで変更することができます。それぞれ、ボックス間の水平および垂直の間隔、ボックスとラベルの間隔(ラベルがボックスの外に印刷される場合)です。デフォルト値は次のように設定されています:

\AMCcodeHspace=.5em
\AMCcodeVspace=.5em
\AMCcodeBoxSep=.1em

水平バージョンAMCcodeHも使用することができ、桁数が少ない場合に便利です。

記述式設問

試験問題に記述式設問を加えたい場合があるかもしれません。一つの方法は、そういった設問のマーク用ボックスを採点者用に予約しておくことです。試験実施後、記入された答案を読んで、採点者が評価に該当するボックスにマークをつけます。そして答案をスキャンしてAMCで採点すれば、その点数を得点に組み入れることができます。

\begin{question}{記述}
  \emph{インフレーション}の定義を述べよ。
  \AMCOpen{lines=5}{\wrongchoice[W]{誤}\scoring{0}\wrongchoice[P]{部}\scoring{1}\correctchoice[C]{正}\scoring{2}}
\end{question}

この例では、採点用にボックスが3個作成されます。最初の(誤りの「誤」のラベルのついた)ボックスをマークすると、受験者は0点を獲得します。2番目の(部分点の「部」のラベルのついた)ボックスをマークすると、受験者は1点を獲得します。3番目の(正解の「正」のラベルのついた)ボックスをマークすると、受験者は2点を獲得します。

\AMCOpenの最初の引数はカンマで区切ったオプションです。使用できるオプションは次のとおりです:

lineup=bool

trueなら、解答欄と採点用ボックスを同じ行に並べます。false(デフォルト)なら、解答欄を枠で囲み、採点用ボックスの下に配置します。

lines=num

解答の行数を設定します。デフォルト値は1です。

lineheight=dim

各行の高さを設定します。デフォルト値は1cmです。

dots=bool

true(デフォルト)なら、各行に点線を引きます。

contentcommand=cmdname

解答領域の内容をカスタマイズするにはこのオプションを使用してください。内容を生成するための\cmdnameコマンドを定義する必要があります。

hspace=dim

採点用ボックスの間隔を設定します。

backgroundcol=color

採点領域の背景色を設定します。

foregroundcol=color

採点用ボックスの枠の色を設定します。

scan=bool

falseなら、採点用ボックスをスキャンしません(これは、この設問のみ手動マーク認識して、受験者がボックスに何を記入しても無視したい場合に便利です)。デフォルトはtrueです。

annotate=bool

false(デフォルト)なら、答案に採点記入する際、ボックスに記号をつけません(素点のみ記入されます)。

question=text

採点者が設問を識別しやすくするための短いテキストを設定します。このテキストは、別紙答案用紙を用いる場合のみ、採点用ボックスの前に記載されます。

answer=text

模範解答用紙の解答欄に記入される短いテキストを設定します。

width=dim

lineup=falseのときの、解答欄を囲む枠の幅を設定します。デフォルト値は.95\linewidthです。

framerule=dim

解答欄を囲む枠の線幅を設定します。

framerulecol=color

解答欄を囲む枠の色を設定します。

boxmargin=dim

採点用ボックスの周囲の余白を設定します。

boxframerule=dim

採点用ボックスの周囲枠の線幅を設定します。

boxframerulecol=color

採点用ボックスの周囲枠の色を設定します。

これらのパラメータの(試験全体での)デフォルト値は、次のようにして\AMCopenOptsコマンドで設定できます

\AMCopenOpts{boxframerule=2pt,boxframerulecol=red}

さらに、\AMCotextReservedコマンドを次のように再定義すると、受験者にマークしないように指示するテキストを採点領域に書くことができます:

\def\AMCotextReserved{\emph{この欄には記入しないこと}}

別紙答案用紙を用いている場合は、各設問に付け加えるテキストを次のように定義できます:

\def\AMCotextGoto{\par{\bf\emph{解答は別紙答案用紙に記入してください。}}}

シャフルパラメータの選択

シャフルの生成に用いる乱数生成器のシードは、以下のコマンドで変更することができます(documentの最初の方で、少なくともonecopyコマンドの外で使わなければなりません):

\AMCrandomseed{1527384}

割り当てた値(1から4194303までの中から選びます)が変更されると、シャフルが変わります。もちろん、試験問題用紙を印刷した後は、この値を変更してはいけません。

セクション分けと別紙答案用紙

別紙答案用紙上にもセクション分けが見えるようにするには、\section\subsectionの代わりに、\AMCsection\AMCsubsectionを使用してください。

試験問題内での参照

LaTeXのコマンド\label\ref\pagerefコマンドを設問や選択肢で用いると、試験問題の実体化ごとに同じ引数で呼び出され、毎回参照する番号が変わるので、問題を起こします。これを解決するには、それぞれ\AMClabel\AMCref\AMCpagerefを用いてください。これらは、\label\ref\pagerefを呼び出す前に、引数に実体の番号を付加します。

また、各実体化の最初に、カウンタを0にリセットする必要があります。一例として、別の用紙にまとめて配置された図への参照を行いたいとき、次のように書けます:

\element{動物}{
  \begin{figure}[p]
    \centering
    \includegraphics[width=.6\linewidth]{tiger}
    \caption{とある動物}
    \AMClabel{虎}
  \end{figure}
    
  \begin{question}{tiger}
    図\AMCref{虎}(\AMCpageref{tiger}ページ)の動物は何ですか?
    \begin{choices}
      \correctchoice{トラ}
      \wrongchoice{キリン}
      \wrongchoice{ゾウ}
      \wrongchoice{ネコ}
    \end{choices}
  \end{question}
}

そして重要なのは、\onecopyコマンドの直後に

\setcounter{figure}{0}

を挿入して、図の番号がどの実体でも1から始まるようにすることです。これを行わないと、実体ごとに番号が増加してしまい、意図した動作ではなくなってしまいます。

AMCが挿入するテキストのカスタマイズ

以下のカスタマイズには\AMCtextを使用してください:

  • \AMCtext{none}{sentence} は、completemultiオプションを使用した場合の「該当なし。」(日本語でのデフォルトテキスト)を、与えられたsentenceに置換します。

  • \AMCtext{corrected}{title} は、模範解答用紙に表示される「模範解答」(日本語でのデフォルトテキスト)を、与えられたtitleに置換します。

  • \AMCtext{catalog}{title} は、catalogオプションで生成される設問カタログに表示される「設問カタログ」(日本語でのデフォルトテキスト)を、与えられたtitleに置換します。

  • 同様に、以下のようなコマンドも検討できます(2番目の引数は日本語でのデフォルトテキストです):

    \AMCtext{draft}{ドラフト}
    \AMCtext{message}{試験の実施には、auto-multiple-choiceでコンパイルされた文書を印刷してください。}

AMCへのオプション

ソースファイルのヘッダ('%'で始まる先頭行)に、AMCに渡すオプションをいくつか付加することができます:

%%AMC:preprocess_command=commandname

ソースファイルを処理するLaTeXを呼ぶ前に、commandnameコマンドを実行させます。このコマンドはプロジェクトディレクトリ内で実行され、ソースファイルのコピーの名前が引数として渡されます。これは単なるコピーなので、commandnameがファイルの内容を変更しても問題ありません。

%%AMC:latex_engine=engine

ユーザ設定されたLaTeXエンジンにかかわらず、このファイルに用いるエンジンを指定します。

乱数を用いた数学設問

fpパッケージの使用

automultiplechoiceの前に

\usepackage{fp}

としてfpパッケージを使用すると、乱数データを用いた練習問題を作ることができます。fpパッケージのドキュメントはhttp://mirrors.ctan.org/macros/latex/contrib/fp/READMEにあります。以下では単純な例から見てみます。

\begin{question}{加算}
  \FPeval\VQa{trunc(1+random*8,0)}  1
  \FPeval\VQb{trunc(4+random*5,0)}
  \FPeval\VQsomme{clip(VQa+VQb)}  2
  \FPeval\VQnonA{clip(VQa+VQb-1)}  3
  \FPeval\VQnonB{clip(VQa*VQb)}
  \FPeval\VQnonC{clip(VQa-VQb)}

  \VQa{} と \VQb{} の和はいくつですか?
  \begin{choiceshoriz}
    \correctchoice{\VQsomme}
    \wrongchoice{\VQnonA}
    \wrongchoice{\VQnonB}
    \wrongchoice{\VQnonC}
  \end{choiceshoriz}
\end{question}

\FPevalコマンドは計算を実行するのに使います:

1

randomは[0,1]の実数を返すので、このコマンドによりVQaには1から8までの乱数の整数値が設定されます。次の行では、VQbに4から8までの乱数の整数値が設定されます。

2

正しい値をVQsomme変数に入れています。

3

誤った値をVQnonA、VQnonB、VQnonCに入れています。

変数名のVQは他のLaTeXコマンドと干渉しないように選んであります。

区間の選択

automultiplechoiceパッケージは、さらに、この種の設問の作成が容易になるように\AMCIntervalsコマンドを定義しています。以下に例を示します:

\begin{question}{inf-expo-indep}
  \FPeval\VQa{trunc(2 + random * 4,0)}
  \FPeval\VQb{trunc(6 + random * 5,0)}
  \FPeval\VQr{VQa/(VQa+VQb)}
  
  $X$と$Y$を互いに独立な指数分布に従う乱数変数とし、それぞれのパラメータを\VQa{}と\VQb{}とします。確率 $\mathbb{P}[X<Y]$ は、次のどの区間に属しますか?

  \begin{multicols}{5}
    \begin{choices}[o]
      \AMCIntervals{\VQr}{0}{1}{0.1}  1
    \end{choices}
  \end{multicols}
\end{question}

(訳注: \mathbbを使用するにはamsfontsパッケージが必要です。)

1

この行は、各区間 [0,0.1[ [0.1,0.2[ ... [0.9,1[ に対応した10個の選択肢を挿入し、正解の選択肢は VQr を含んだ区間であることを指示します。\AMCIntervalsの引数は次のとおりです:

  1. 正解の値

  2. 最初の区間の左端の値

  3. 最後の区間の右端の値

  4. 各区間の長さ

区間の書式は、ローカルな(例えば、よくあるのは [a,b[ ではなく [a,b) と書くなどの)慣行に合わせて、\AMCIntervalFormatコマンドを再定義して変更できます。オリジナルは

\def\AMCIntervalFormat#1#2{[#1,\,#2[}

と定義されています。

数値での解答

\AMCnumericChoicesコマンドを用いれば、次の例のように、受験者に数値での解答をマークで記入させることもできます:

\begin{questionmultx}{sqrt}
  \FPeval\VQa{trunc(5+random*15,0)}
  \FPeval\VQs{VQa^0.5}
  $\sqrt{\VQa}$ を計算して、小数点以下2桁で丸めよ。

  \AMCnumericChoices{\VQs}{digits=3,decimals=2,sign=true,
                 borderwidth=0pt,backgroundcol=lightgray,approx=5}
\end{questionmultx}

questionmultx環境に注意してください。この設問は複数のボックスをマークする必要があるので複数選択問題にしなければなりませんが、複数の正解があると言うことはできません。なので複数選択問題の記号を表示しません。

\AMCnumericChoicesコマンドの2番目の引数で用いられるオプションは次のとおりです(booltruefalseで、colorxcolorで認識できる色でなければなりません):

digits=num

は、必要な桁数(デフォルトは3)を指定します。

decimals=num

は、小数点以下の桁数(デフォルトは0)を指定します。

base=num

は、数字の基数(進法)(デフォルトは10)を指定します。

significant=bool

trueなら、\AMCnumericChoicesの最初の引数のうち上位桁のみ解答させます。例えば、\AMCnumericChoices{56945.23}{digits=2,significant=true}の正解は 57 となります。

nozero=bool

全桁から選択肢0を除去します。\AMCnumericChoicesを用いて小さい正の値(<10)を記入するのに便利かもしれません。

sign=bool

は、符号の有無(デフォルトはtrue)を指定します。

strict=bool

trueなら、符号とすべての桁のボックスがマークされなければなりません。falseなら、マークしていない桁は0として扱います。デフォルトはfalseです。

vertical=bool

trueなら、1桁分のボックスを縦に配置します。false(デフォルト)なら、1桁分のボックスを横に配置します。

reverse=bool

trueなら、verticalモードにおいて、大きい数字を上に配置します(デフォルトはtrue)。

vhead=bool

trueなら、verticalモードにおいて、各桁の上部に\AMCntextVHeadコマンドを使用して作成されるヘッダーを置きます。\AMCntextVHeadはもともと次のように定義されています。

\def\AMCntextVHead#1{\emph{b#1}}

このデフォルト値は、2進数の桁に番号をつけるのに便利です。

デフォルト値はfalseです。

hspace=space

は、ボックス間の水平間隔(デフォルトは.5em)を設定します。

vspace=space

は、ボックス間の垂直間隔(デフォルトは1ex)を設定します。

borderwidth=space

は、全ボックスを囲む枠線の太さ(デフォルトは1mm)を設定します。

bordercol=color

は、枠線の色(デフォルトはlightgray)を設定します。

backgroundcol=color

は、背景色(デフォルトはwhite)を設定します。

Tsign=text

は、符号をマークするボックスの上に表示するテキスト(デフォルトは空で、\def\AMCntextSign{text}で再定義も可能)を設定します。

Tpoint=text

は、小数点のテキストを設定します。デフォルトは\raisebox{1ex}{\bf .}で、\def\AMCdecimalPoint{text}で再定義も可能です。

scoring=bool

trueなら、AMCにこの設問の採点基準を指定します。デフォルトはtrueです。

scoreexact=num

は、正解に対する素点(デフォルトは2)を指定します。

exact=num

は、正解として認めてscoreexactの得点を与える誤差(正解の整数値(小数点を除いた値)との差)(デフォルトは0)を設定します。

scoreapprox=num

は、近似解に対する素点(デフォルトは1)を指定します。

approx=num

は、近似解として認めてscoreapproxの得点を与える誤差(正解の整数値(小数点を除いた値)との差)(デフォルトは0)を設定します。

\AMCnumericOptsコマンドを使えば、これらのパラメータに対して、(試験全体用の)デフォルト値を別の値に設定することができます:

\AMCnumericOpts{scoreexact=3,borderwidth=2pt}

さらに、(separateanswersheetオプションで別紙答案用紙を使用していて)別紙答案用紙の外で\AMCnumericChoicesを用いた設問に付加するテキストを、\AMCntextGotoコマンドを再定義して設定することができます:

\def\AMCntextGoto{\par{\bf\emph{Please code the answer on
                           the separate answer sheet.}}}

pgf/tikzパッケージの使用

LaTeXのpgf/tikzパッケージ(http://www.ctan.org/tex-archive/graphics/pgf/baseを参照)は、

\usepackage{tikz}

とともに利用可能な数学関数を提供します。

latexを走らせて試験問題をコンパイルするたびに常に同じ結果が得られるよう、最初に乱数シードを設定しなければなりません:

\pgfmathsetseed{2056}
単純な計算

これは単純な計算を用いた例です

\begin{question}{inverse}
  \pgfmathrandominteger{\x}{1}{50}
       
  $x=\x$ の逆数はいくつですか?

  \begin{choices}
    \correctchoice{\pgfmathparse{1/\x}\pgfmathresult }
    \wrongchoice{\pgfmathparse{1/(\x +1))}\pgfmathresult}
    \wrongchoice{\pgfmathparse{cos(\x)} \pgfmathresult}
    \wrongchoice{\pgfmathparse{\x^(-0.5)}\pgfmathresult}
  \end{choices}
\end{question}

\pgfmathparseコマンドが計算を行い、\pgfmathresultが結果を出力します。

出力の書式は、次の例(小数点以下3桁、小数点としてカンマを使用)に示すように、\pgfmathprintnumberを用いて調整することができます。

\begin{question}{inverse3}
  \pgfmathrandominteger{\x}{1}{50}
  \pgfkeys{/pgf/number format/.cd,fixed,fixed zerofill,precision=3,use comma}
  $x=\pgfmathprintnumber{\x}$ の逆数はいくつですか?

  \begin{choices}
    \correctchoice{\pgfmathparse{1/\x}\pgfmathprintnumber{\pgfmathresult}} 
    \wrongchoice{\pgfmathparse{1/(\x +1))} \pgfmathprintnumber{\pgfmathresult}}
    \wrongchoice{\pgfmathparse{cos(\x)} \pgfmathprintnumber{\pgfmathresult}}
    \wrongchoice{\pgfmathparse{\x^(-0.5)} \pgfmathprintnumber{\pgfmathresult}}
  \end{choices}
\end{question}
[注記]注記

\AMCIntervalsコマンドと\AMCnumericChoicesコマンドを使用することもできます(「区間の選択」および「数値での解答」参照)。

グラフ

tkizパッケージはグラフを(ランダムなものもそうでないものも)作成することもできます。

\begin{questionmult}{graph}
  以下にグラフが示された三つの関数を考えます:
  \pgfmathrandominteger{\a}{2}{4}  
  \begin{center}
    \begin{tikzpicture}[domain=0:4]
      \draw[very thin,color=gray] (-0.1,-4.1) grid (3.9,3.9);
      \draw[->] (-0.2,0) -- (4.2,0) node[right] {$x$};
      \draw[->] (0,-4.2) -- (0,4.2) node[above] {$f(x)$};
      \draw[color=red] plot (\x,{(1+\a/4)*\x-\a}) node[right] {$f_{1} (x)$};
      \draw[color=blue] plot (\x,{\a*sin(\x r)}) node[right] {$f_{2}(x)$};
      \draw[color=orange] plot (\x,{\a*cos(\x r)}) node[right] {$f_{3}(x)$};
    \end{tikzpicture}
  \end{center}
  以下のうち正しいものはどれですか?
  \begin{choices}
    \pgfmathrandominteger{\x0}{2}{4}  
    \correctchoice{$f_{2}(\x0)$=\pgfmathparse{\a*sin(\x0 r)} \pgfmathprintnumber{\pgfmathresult}.}
    \correctchoice{$f_{3}(\x0)$=\pgfmathparse{\a*cos(\x0 r)} \pgfmathprintnumber{\pgfmathresult}.}
    \wrongchoice{関数 $f_{1}(x)$ は線形関数である。}
  \end{choices}
\end{questionmult}

きれいなグラフを作成するには、pgfplotsも有用です。

pgfmathでは精度が有限なので、"算術オーバーフロー" を考慮に入れる必要があるかもしれません。tikzpgfplotsは、バックエンドにgnuplotを用いることで、この問題を克服しています。これには、gnuplotをシステムにインストールし、LaTeXの--shell-escapeオプションを用いる必要があります。このためには、AMCの設定ウィンドウで、プロジェクト用のLaTeXエンジンとして "pdflatex --shell-escape" (引用符なし)を設定してください。

LuaLaTeXの使用

lualatexコマンドを用いれば、LaTeX文書内でLUA言語を使用できます。これを用いる場合は、文書はUTF-8でエンコードされている必要があり、inputencパッケージはロードできません。これに関する情報は http://www.luatex.org/documentation.html を参照してください。

LUAのコマンドは、\directluaの引数として与えます。最も便利なLUA関数はtex.printで、結果をLaTeXに戻して出力します。

これも同じように、乱数を用いる場合は、コンパイルごとに同じ結果が得られるように常に乱数シードを固定してください:

\directlua{math.randomseed (2048)}

これはとても単純なソースファイルです:

\documentclass[a4paper]{article}
%\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[box,completemulti,lang=JA]{automultiplechoice}
\begin{document}

\onecopy{10}{

%%% head

\noindent{\bf QCM  \hfill TEST}

\vspace*{.5cm}
\begin{minipage}{.4\linewidth}
  \centering\large\bf LuaLaTeXサンプル試験
\end{minipage}
\namefield{\fbox{\begin{minipage}{.5\linewidth}
Name :

\vspace*{.5cm}\dotfill
\vspace*{1mm}
\end{minipage}}}

%%%

\directlua{math.randomseed (2048)}
\directlua{a=math.random()}

\begin{question}{平方根}
  \directlua{tex.print(a)}の平方根はいくつですか?

  \begin{choices}
    \correctchoice{\directlua{tex.print(math.sqrt(a))}} 
    \wrongchoice{\directlua{tex.print(math.sqrt(2*a))}} 
    \wrongchoice{\directlua{tex.print(math.sqrt(a*1.001))}} 
  \end{choices}
\end{question}

\clearpage
}

\end{document}      

出力の書式調整はluaの関数で行うか、siunitxで行うことができます。

[注記]注記

\AMCIntervalsコマンドと\AMCnumericChoicesコマンドを使用することもできます(「区間の選択」および「数値での解答」参照)。