置頂介紹文

這裡主要放一些關於數學和 LaTeX 的文章, 文章內的檔案一律用 xelatex 編譯而成。
如果你想下載我的 tex 檔回去修改編譯, 請將 preamble.7z 解壓縮後和 tex 檔放在同一個資料夾中即可編譯。
部落格內的文章也有部份是網路或書籍中的資料經過統整編輯而成, 如有侵權請告知。
有任何問題也歡迎留言或 E-mail 給我。

2016年6月15日 星期三

用 LaTeX 做數學考卷 (三) : 選擇題篇

如果我們用條列式清單來輸入選擇題的選項, 那麼選項後的空白會相當的多。所以這裡提供一個能自動計算選項長度來修正選項位置的語法。

......
\usepackage{environ}
\newlength{\choiceslen}

% 段落A1 %
\newif\ifshowcorrect
\newcounter{choices}
\newcommand{\choicefinal}[1]{%
\ifnum\value{choices}>0 \hfill\fi\egroup
\hspace{0pt}%
\hbox to\choiceslen
\bgroup
\stepcounter{choices}%
\ifcase#1\relax
(\Alph{choices})%
\else
\ifshowcorrect
\expandafter\underline
\fi
{(\Alph{choices})}%
\fi\space}
\newcommand{\choicetemp}[1]{\stepcounter{choices}\space(\Alph{choices})\cr}
% 段落A1 %

% 段落A2 %
\NewEnviron{choices}
{\setcounter{choices}{0}%
\let\choice\choicetemp
\settowidth{\choiceslen}{\vbox{\halign{##\hfil\cr\BODY\crcr}}}
\ifdim\choiceslen>.5\linewidth
\setlength{\choiceslen}{\linewidth}%一行一選項
\else
\ifdim\choiceslen>.333\linewidth
\setlength{\choiceslen}{.5\linewidth}%一行兩選項
\else
\ifdim\choiceslen>.25\linewidth
\setlength{\choiceslen}{.333\linewidth}%一行三選項
\else
\ifdim\choiceslen>.2\linewidth
\setlength{\choiceslen}{.25\linewidth}%一行四選項
\else
\setlength{\choiceslen}{.2\linewidth}%一行五選項
\fi\fi\fi\fi
\let\choice\choicefinal
\setcounter{choices}{0}%
\begin{flushleft}
\bgroup\BODY\hfill\egroup
\end{flushleft}}
% 段落A2 %

\newcommand\longch{\parbox[t]{0.92\linewidth}}%長選項自動換行
......

\begin{enumerate}
\item 選擇題
\begin{enumerate}[(\hspace{1cm}) 1.]
\item 這裡是選擇題第一題
\begin{choices}
\choice1 短選項
\choice0 短選項
\choice0 短選項
\choice0 短選項
\choice0 短選項
\end{choices}
\item 這裡是選擇題第二題
\begin{choices}
\choice0 長一點的選項
\choice0 長一點的選項
\choice0 長一點的選項
\choice0 長一點的選項
\choice0 長一點的選項
\end{choices}
\item 這裡是選擇題第三題
\begin{choices}
\choice0 再更長一點的選項
\choice0 再更長一點的選項
\choice0 再更長一點的選項
\choice0 再更長一點的選項
\choice0 再更長一點的選項
\end{choices}
\item 這裡是選擇題第四題
\begin{choices}
\choice0 再更長更長更長一點的選項
\choice0 再更長更長更長一點的選項
\choice0 再更長更長更長一點的選項
\choice0 再更長更長更長一點的選項
\choice0 再更長更長更長一點的選項
\end{choices}
\item 這裡是選擇題第五題
\begin{choices}
\choice0 再更長更長更長一點的選項
\choice0 再更長更長更長一點的選項
\choice0 再更長更長更長一點的選項
\choice0 再更長更長更長一點的選項
\choice0 \longch{這是一個長到不能再長的選項這是一個長到不能再長的選項這是一個長到不能再長的選項這是一個長到不能再長的選項這是一個長到不能再長的選項這是一個長到不能再長的選項}
\end{choices}
\end{enumerate}

\end{enumerate}

\end{document}


「段落A1」是用來設定正確答案的, 一般來說用不到, 但是必須要放著, 而程式碼的細節我也無法看懂。

「段落A2」是用來設定(自動計算)每行要放多少個選項, 我的程式碼中每行並列 1~5 個選項都有, 優點是最省空間, 缺點則是會比較不整齊。若要整齊的話, 建議調整成每行只有 1、2、4 個選項, 如下

\NewEnviron{choices}
{\setcounter{choices}{0}%
\let\choice\choicetemp
\settowidth{\choiceslen}{\vbox{\halign{##\hfil\cr\BODY\crcr}}}
\ifdim\choiceslen>.5\textwidth
\setlength{\choiceslen}{\textwidth}%
\else
\ifdim\choiceslen>.25\textwidth
\setlength{\choiceslen}{.5\textwidth}%
\else
\setlength{\choiceslen}{.25\textwidth}%
\fi
\fi
\let\choice\choicefinal
\setcounter{choices}{0}%
\begin{flushleft}
\bgroup\BODY\hfill\egroup
\end{flushleft}}


比對一下程式碼, 就可以看出運算的邏輯, 可以自行設定要的長度。

\newcommand\longch{\parbox[t]{0.92\linewidth}}%長選項自動換行, 因為這段程式碼無法自動換行, 所以遇到長選項要用這個指令來換行。這裡是定義 \longch 為 \parbox, [t]是對齊上方, {0.92\linewidth} 是設定 \parbox 的長度。使用上只要輸入 \longch{} 即可。

正文區使用 choices 環境, 每項則用 \choice0 分列, 若是用 \choice1, 則上表示這是正確答案, 這部份我們暫不說明。

article_用latex做數學考卷3.tex 
article_用latex做數學考卷3.pdf

沒有留言:

張貼留言