与 examdoc 兼容的教科书包

与 examdoc 兼容的教科书包

我非常喜欢这examdoc门课。我几乎总是用它来做考试、测验……但是……
我想做一本教科书。里面应该有几个练习,最好在附录中附上它们的解决方案。
我遇到了以下问题:

  1. 我正在使用\documentclass{book}教科书。我希望能够将问题和解决方案复制粘贴到\documentclass{exam}。我已经尝试制作自己的.sty文件:

    \ProvidesPackage{oefeningen}
    
    \newenvironment{questions}{\begin{enumerate}}{\end{enumerate}}
    \newcommand{\question}{\item}
    \newenvironment{parts}{%
    \let\oldpart=\part
    \renewcommand{\part}{\item}
    \begin{enumerate}}{\end{enumerate}\renewcommand{\part}{\oldpart}}
    

    但这似乎没有起到作用......(它没有编译,我仍然不知道如何应对解决方案环境)

  2. 我不知道如何在单独的附录中显示解决方案,而不是直接在每个问题后面显示......

我是编写类、包或宏方面的新手,但任何帮助都会很感激。我也浏览了很多论坛,但我认为其他答案没有提供我想要的功能。(但我很乐意得到纠正)

排序方式:

我有这个exam文件:

\documentclass[12pt,a4paper,answers]{exam}

\begin{document}
\begin{questions}
\question Main question goes here
\begin{parts}
\part $1+1=$
\begin{solution}
2
\end{solution}
\end{parts}
\end{questions}
\end{document}

examdoc 的作用

我想做的(但没有用!)是这样的:

\documentclass[12pt,a4paper]{book}
\usepackage{exsheets}

\begin{document}

\section{foo}

\question Main question goes here
\begin{parts}
\part $1+1=$
\begin{solution}
2
\end{solution}
\end{parts}

\section{solutions}
%command to display list of solutions, optimally organised by section/chapter

\end{document}

结果是这样的

教科书应该是什么样子

这样,我就可以从教科书复制粘贴问题,并在考试中重复使用它们......

答案1

重大编辑 -> 新答案:

目标

使用该包编写教科书exsheets,并能够复制和粘贴练习和解决方案,就像它们在使用该类exam创建考试的文档中一样。

要求

  • exsheets包没有parts环境。需要对其进行定义,以便能够使用与 所需的相同语法exam
  • 一个solution环境应该可供一次或多次用于一个问题。为此,需要重新定义exsheets自己的环境。这还需要一个合适的环境替代品,这样仍然可以保存解决方案,以便稍后在教科书中打印它们。solutionexsheets
  • 适应exsheets'文档question中的环境exam

定义

  • parts 因为教科书中不需要为问题分配分数,所以一个简单的包装enumerate就可以了。我们会使用它,enumitem因为它很方便。

    \usepackage{enumitem}
    \newenvironment{parts}{%
      \renewcommand*\part[1][]{\item}%
      \begin{enumerate}[label=(\alph*)]
    }{\end{enumerate}}
    
  • 重新定义solution 我们要做的第一件事是为 创建一个新问题/解决方案对exsheets。这将替代原来的solution这需要exsheets0.3 版本,该版本应该会在一周左右的时间内在 CTAN 上发布。测试版可以在这里下载

    \NewQuSolPair{Question}{Solution}
    

    下面的代码稍微长一点。目标是定义solution一个可以存储解决方案的方法exsheets。手动方式是在新定义的环境中再次写入解决方案Solution

    \begin{Question}
    Main question goes here
    \begin{parts}
    \part $1+1=$
    \begin{solution}
     $2$
    \end{solution}
    \end{parts}
    \end{Question}
    % the following should be unnecessary:
    \begin{Solution}
    \begin{parts}
    \part $1+1=$
    \end{parts}
    \end{Solution}
    

    由于我没有完美的自动化解决方案,因此我将首先提出需要双重输入的基本解决方案。

    \usepackage{environ}
    \makeatletter
    % no idea why these are necessary:
    \def\env@solution@save@env{}
    \def\env@solution@process{}
    % the actual redefinition into a dummy environment
    % that gobbles its body:
    \RenewEnviron{solution}{}
    \makeatother
    

文件

现在教科书看起来可以是这样的:

% this is textbook.tex
\documentclass[12pt,a4paper]{book}
\usepackage{exsheets}

\usepackage[inline]{enumitem}
\newenvironment{parts}{%
  \renewcommand*\part[1][]{\item}%
  \begin{enumerate}[label=(\alph*)]
}{%
  \end{enumerate}%
}

\NewQuSolPair{Question}{Solution}

\usepackage{environ}
\makeatletter
\def\env@solution@save@env{}
\def\env@solution@process{}
\RenewEnviron{solution}{}
\makeatother
\begin{document}
\chapter{foo}
\section{questions}\exlabel{sec:questions:foo}

\begin{Question}
Main question goes here
\begin{parts}
\part $1+1=$
\begin{solution}
 $2$
\end{solution}
\part $8-3=$
\begin{solution}
 $5$
\end{solution}
\end{parts}
\end{Question}
\begin{Solution}
\begin{enumerate*}[label=(\alph*)]
 \item $2$
 \item $5$
\end{enumerate*}
\end{Solution}

\begin{Question}
Another question.
\begin{solution}
 Another answer.
\end{solution}
\end{Question}
\begin{Solution}
 Another answer
\end{Solution}

\section{solutions}
\printsolutions[section=\S{sec:questions:foo}]

\end{document}

在此处输入图片描述

对应考试:

% this is exam.tex
\documentclass[answers]{exam}

\newenvironment{Question}{\question}{}

\begin{document}

\begin{questions}
\begin{Question}
Main question goes here
\begin{parts}
\part $1+1=$
\begin{solution}
 $2$
\end{solution}
\part $8-3=$
\begin{solution}
 $5$
\end{solution}
\end{parts}
\end{Question}

\begin{Question}
Another question.
\begin{solution}
 Another answer.
\end{solution}
\end{Question}
\end{questions}

\end{document}

在此处输入图片描述

避免解决方案重复输入的初步尝试

以下solution环境定义试图实现自动化,但存在一些明显的缺点。主要丧失了创建解决方案的灵活性。

问题中的每个调用都会保存其主体,在环境solution结束时,如果已使用环境,则会自动调用环境。为了轻松完成此操作,请使用以下包:QuestionSolutionsolutionetoolbox

\usepackage{etoolbox,environ}
\makeatletter
\def\addto@solution{}
\def\env@solution@save@env{}
\def\env@solution@process{}
\RenewEnviron{solution}{%
  \ifdefvoid{\BODY}{}
    {%
      \xdef\addto@solution
        {%
          \expandonce\addto@solution
          \ifnum\value{enumi}>0\theenumi\space\fi
          \expandonce\BODY\space
        }%
    }}
\AtBeginEnvironment{Question}{\gdef\addto@solution{}}
\AtEndEnvironment{Question}{%
  \ifdefvoid\addto@solution{}
    {\begin{Solution}\addto@solution\end{Solution}}%
}

现在textbook.tex看起来如下:

% this is textbook.tex
\documentclass[12pt,a4paper]{book}
\usepackage{exsheets}

\usepackage{enumitem}
\newenvironment{parts}{%
  \renewcommand*\part[1][]{\item}%
  \begin{enumerate}[label=(\alph*)]
}{%
  \end{enumerate}%
}

\NewQuSolPair{Question}{Solution}

\usepackage{etoolbox,environ}
\makeatletter
\def\addto@solution{}
\def\env@solution@save@env{}
\def\env@solution@process{}
\RenewEnviron{solution}{%
  \ifdefvoid{\BODY}{}
    {%
      \xdef\addto@solution
        {%
          \expandonce\addto@solution
          \ifnum\value{enumi}>0\theenumi\space\fi
          \expandonce\BODY\space
        }%
    }}
\AtBeginEnvironment{Question}{\gdef\addto@solution{}}
\AtEndEnvironment{Question}{%
  \ifdefvoid\addto@solution{}
    {\begin{Solution}\addto@solution\end{Solution}}%
}
\makeatother
\begin{document}
\chapter{foo}
\section{questions}\exlabel{sec:questions:foo}

\begin{Question}
Main question goes here
\begin{parts}
\part $1+1=$
\begin{solution}
 $2$
\end{solution}
\part $8-3=$
\begin{solution}
 $5$
\end{solution}
\end{parts}
\end{Question}

\begin{Question}
Another question.
\begin{solution}
 And another answer.
\end{solution}
\end{Question}

\section{solutions}
\printsolutions[section=\S{sec:questions:foo}]

\end{document}

结果看起来与上面相同。


原始答案:

你在评论中说exsheets如果它有一个环境,就可以帮你解决问题parts。如果这真的是你唯一缺少的东西:它很容易被定义。

我假设在教科书中你不想给练习分配分数,所以唯一需要的是一个enumerate环境的简单包装器。我正在使用enumitem格式化标签。 的重新定义\part应该保留在本地,因为您可能希望将教科书分成几部分。

\documentclass{scrartcl}
\usepackage{exsheets}
\SetupExSheets{headings-format=\normalsize\bfseries\sffamily}
\usepackage{enumitem}

\newenvironment{parts}{%
  \renewcommand*\part[1][]{\item}%
  \begin{enumerate}[label=(\alph*)]
}{%
  \end{enumerate}%
}

\begin{document}
\part{A demonstration}
\begin{question}
 Why is there air?
\end{question}

\begin{question}
What if there were no air?
\begin{parts}
 \part Describe the effect on the balloon industry.
 \part Describe the effect on the aircraft industry.
\end{parts}
\end{question}

\end{document}

在此处输入图片描述

对应exam文件:

\documentclass{exam}

\begin{document}

\begin{questions}

% the following part is the same as in the other document:
\begin{question}
 Why is there air?
\end{question}

\begin{question}
What if there were no air?
\begin{parts}
 \part Describe the effect on the balloon industry.
 \part Describe the effect on the aircraft industry.
\end{parts}
\end{question}

\end{questions}

\end{document}

在此处输入图片描述

相关内容