
Quero colocar as respostas no final do documento, tal como fez Martin Scharrer na sua resposta à perguntatex core - Mostrando soluções das questões "separadamente" - TeX - LaTeX Stack Exchange, agora posso colocar as respostas de perguntas do tipo "verdadeiro ou falso" e as respostas de perguntas de múltipla escolha, mas não tenho um método para colocar as respostas agrupadas pelo ambiente de solução da aula de exame.
Aqui está meu código
%\documentclass[answers,12pt]{exam}
\documentclass[12pt]{exam}
\usepackage{environ}
\usepackage[normalem]{ulem}
\usepackage{etoolbox}
\usepackage{amssymb}
\newcommand\False{$\times$}
\newcommand\True{$\checkmark$}
\newlength\answerspace
\setlength\answerspace{0.5in}
\newcommand\dottedanswerline[1][{}]{%
% One optional argument, the default value of which is empty.
\unskip\linebreak[0]\enspace
\hbox{}\nobreak\dotfill
\ifprintanswers %whether to show the answers or leave it as a blank
\hbox to \answerspace{(\hfil#1\hfil)}%
% \xappto\answertext{\expandonce{\thequestion\theanswer}}
%\xappto\answertext{\thequestion,#1\space}
\else
\hbox{(\hskip 0.5in)}%
\xappto\answertext{\thequestion,#1\space}
\fi
}% dottedanswerline
\newcommand{\answertext}{}
\usepackage{etoolbox}
\NewEnviron{answer}{\xappto\answertext{\expandonce{\BODY}}}%
\makeatletter
\AtEndEnvironment{solution}{\xappto\answertext{\BODY\space}}
%\AtEndEnvironment{solution}{\xappto\answertext{\thequestion,\BODY\space}}
\newlength\choiceitemwidth
\newif\ifshowsolution \showsolutiontrue
\newcounter{choiceitem}%选项的序号计数单元
\def\thechoiceitem{\Alph{choiceitem}}%用ABCD来显示选项序号
\def\makechoicelabel#1{#1\uline{\thechoiceitem.}\else\thechoiceitem.\fi\space} %答案显示下划线+字母或者字母,用于最终显示
\def\choice@mesureitem#1{\cr\stepcounter{choiceitem}\makechoicelabel#1}%计数器加1,同时显示ABCD标签,是用于测量长度的
%这个是用来进行测量用的,第一遍\BODY的parse
\def\choicemesureitem{\@ifstar
{\choice@mesureitem\ifprintanswers \xappto\theanswer{\thechoiceitem}}%
{\choice@mesureitem\iffalse}}%
\def\choice@blockitem#1{%
\ifnum\value{choiceitem}>0\hfill\fi
\egroup\hskip0pt
\hbox to \choiceitemwidth\bgroup\hss\refstepcounter{choiceitem}\makechoicelabel#1}
\def\choiceblockitem{\@ifstar
{\choice@blockitem\ifprintanswers}%
{\choice@blockitem\iffalse}}
\def\choice@paraitem#1{%
\par\refstepcounter{choiceitem}\makechoicelabel#1}
\def\choiceparaitem{\@ifstar
{\choice@paraitem\ifprintanswers}%
{\choice@paraitem\iffalse}}
\NewEnviron{mychoices}{%
\def\theanswer{}
\begingroup
\let\item\choicemesureitem
\setcounter{choiceitem}{0}%
\settowidth{\global\choiceitemwidth}{\vbox{\halign{##\hfil\cr\BODY\crcr}}}%
\endgroup
\dottedanswerline[\theanswer]
\trivlist\item\relax
\parindent0pt
\setcounter{choiceitem}{0}%
\ifdim\choiceitemwidth<0.24\linewidth
\choiceitemwidth=0.25\linewidth
\let\item\choiceblockitem
\bgroup\BODY\hfill\egroup
\else\ifdim\choiceitemwidth<0.48\linewidth
\choiceitemwidth=0.5\linewidth
\let\item\choiceblockitem
\bgroup\BODY\hfill\egroup
\else % \choiceitemwidth > 0.5\linewidth
\let\item\choiceparaitem
\BODY
\fi\fi
\endtrivlist
}
\makeatother
\begin{document}
\section{True OR False questions}
\begin{questions}
\question text text text text text text text text text text text text.\dottedanswerline[\True]
\question text text text text text text text text text text text text.\dottedanswerline[\True]
\question text text text text text text text text text text text text.\dottedanswerline[\False]
\end{questions}
\section{Multiply choices questions}
\begin{questions}
\question Why is there air?
\begin{mychoices}
\item To blow up volleyballs.
\item* To fill an unneeded void.
\end{mychoices}
\question text text text text text text text text text text text text text text text text text text text text
\begin{mychoices}
\item foo
\item bar
\item*baz
\end{mychoices}
\end{questions}
\section{Other questions}
\begin{questions}
\question[5] text text text text text text text text text text text text text text text text?
\begin{solution}[2cm]
1, text answer1
2, text answer2
\end{solution}
\question text text text text text text text text text text text text text text text text?
\begin{parts}
\part[2]
part one?
\part[2]
part two?
\end{parts}
\begin{solution}[2cm]
1, answer to part1
2, answer to part2
\end{solution}
\end{questions}
\section{Answers}
% \newpage
% Some time later
\answertext
\end{document}
E aqui está a captura de tela, só quero colocar as respostas (na cor azul) no final do documento. Essas respostas são colocadas no ambiente de solução definido pela classe de exame, então tento usar o \AtEndEnvironment{solution}{\xappto\answertext{\thequestion,\BODY\space}}
comando para anexar o corpo do ambiente de solução à variável global, mas certamente \BODY
não está definido.
Outra melhoria é que preciso colocar diferentes tipos de respostas em parágrafos diferentes, e não na mesma linha mostrada atualmente na imagem.