使用答案完成任务

使用答案完成任务

我正在写一本数学题的书。我需要一种方法来在书的最后展示问题及其解决方案。

我找到了一种方法,使问题和答案看起来正如我希望的那样,除了一件事。

我喜欢使用任务来解决一些包含多个问题的问题。任务提供了一种处理水平列表的好方法。

但将它们与答案包一起使用会产生奇怪的结果。

在此处输入图片描述 问题看上去正如我所期望的那样。

在此处输入图片描述

但是当我使用任务时,解决方案中的编号和间距出现错误,如问题 1.2.2 中所示。

我的问题很简单,是否有人知道为什么会发生这种情况,知道如何修复编号或有很好的任务替代方案。

\documentclass[a4paper,12pt,twoside,openright]{book}

% -- For nice horizontal lists -- %
\usepackage{tasks}

% -- For solutions -- %
\usepackage{answers}
\Newassociation{solution}{Sol}{solutions}
\renewenvironment{Sol}[1]{\begin{enumerate}\item[\bfseries #1.]}{\end{enumerate}}
\Newassociation{secnr}{SectionNumbering}{solutions}
\renewenvironment{SectionNumbering}[1]{\begin{trivlist}\item \bfseries #1}{\end{trivlist}}

\begin{document}

\Opensolutionfile{solutions} 
\chapter{Mathematics}
\section{Addition}\label{section_1A}
\begin{secnr}Bls. \pageref{section_1A}\end{secnr}

\begin{enumerate}
\item What is $2+3$?
\begin{solution}
5
\end{solution}
\item Calculate the following:
\begin{enumerate}
\item $8+2$
\item $9+3$
\item $10+4$
\end{enumerate}
\begin{solution}
\begin{enumerate}
\item $10$
\item $12$
\item $14$
\end{enumerate}
\end{solution} 
\end{enumerate}


\section{Subtraction}\label{section_1B}
\begin{secnr}Bls. \pageref{section_1B}\end{secnr}

\begin{enumerate}
\item What is $100 - 3$
\begin{solution}
97
\end{solution}
\item Calculate the following:
\begin{tasks}(2)
\task $10 - 3$
\task $10 - 4$
\task $20 - 4$
\task $20 - 5$
\end{tasks} 
\begin{solution}
\begin{tasks}(4)
\task $7$
\task $6$
\task $16$
\task $15$
\end{tasks} 
\end{solution}
\item How are you doing?
\begin{solution}
Fine.
\end{solution}
\end{enumerate}

\Closesolutionfile{solutions} 

\chapter*{Solutions}
\input{solutions}

\end{document}

答案1

解决这个问题的一个粗略的方法是复制那些保存信息的宏,这些信息通常由-\refstepcounter命令实现,并由 -命令写入 .aux 文件\label,即宏\@currentlabel\@currentHref(以防万一超链接包正在使用中)并且\@currentlabelname (如果超链接您可以在启动环境之前检查包是否正在使用中(包正在使用中) ,并在启动环境之前tasks结束环境之后恢复它们。taskssolution

作为用户氮氧化物指出,这可以通过使用命令\BeforeBeginEnvironment\AfterEndEnvironment电子工具箱包裹。

除此之外,我建议使用\Readsolutionfile命令答案包用于输入包含解决方案的文件,而不是使用\input

前一个命令还考虑到可能希望加载包答案其选项nosolutionfiles意味着不会生成任何外部解决方案文件。

我还建议将解决方案部分节头的分段命令放入解决方案文件本身。这可以使用Filesave来自答案包。这考虑到,如果包答案已加载选项nosolutionfiles,这意味着解决方案不会被写入额外的文件中,也不会稍后作为额外的部分插入,而是每个解决方案都会放在问题的旁边。

通过以下示例,您可以选择是否为解决方案生成额外的部分,或者将每个解决方案打印在问题附近,方法是将其转换为注释/不转换为注释行\PassOptionsToPackage{nosolutionfiles}{answers}

\documentclass[a4paper,12pt,twoside,openright]{book}

% -- For patching environments --

\usepackage{etoolbox} 

% -- For nice horizontal lists -- 

\usepackage{tasks}

% Unlike enumerate environment the tasks environment does not
% change info needed for placing labels etc locally but globally.
% Thus patch the tasks environment to save these things at the
% start of the environment and to reset these things at 
% the end of the environment:
\makeatletter
\BeforeBeginEnvironment{tasks}{\savelabelinfo} 
\AfterEndEnvironment{tasks}{\restorelabelinfo}
\newcommand\savelabelinfo{%
  \let\MyNicecurrentlabel=\@currentlabel
  \let\MyNicecurrenthref=\@currentHref
  \let\MyNicecurrentlabelname=\@currentlabelname
}%
\newcommand\restorelabelinfo{%
  \global\let\@currentlabel=\MyNicecurrentlabel
  \global\let\@currentHref=\MyNicecurrenthref
  \global\let\@currentlabelname=\MyNicecurrentlabelname
}%
\makeatother

% -- For solutions -- 

% In case you wish solutions writtem directly after questions,
% enable the following line:
%\PassOptionsToPackage{nosolutionfiles}{answers}
\usepackage{answers}

\Newassociation{solution}{Sol}{solutions}
\Newassociation{secnr}{SectionNumbering}{solutions}

% Adjust how answers are written:
\makeatletter
% \InCaseSolutionsViaFile{<Tokens to deliver in case option
%                          "nosolutionfiles" is not provided>}%
%                        {<Tokens to deliver in case option
%                          "nosolutionfiles" is provided>}%
\newcommand\InCaseSolutionsViaFile[2]{}%
\@ifpackagewith{answers}{nosolutionfiles}{%
  \let\InCaseSolutionsViaFile=\@secondoftwo
}{%
  \let\InCaseSolutionsViaFile=\@firstoftwo
}%
\InCaseSolutionsViaFile{%
  \renewenvironment{Sol}[1]{\begin{enumerate}\item[\bfseries #1.]}{\end{enumerate}}%
  \renewenvironment{SectionNumbering}[1]{\begin{trivlist}\item \bfseries #1}{\end{trivlist}}%
}{%
  % Turn sol-environment into something that prints the body 
  % within something like a deflist environment with label "Solution(s):"
  \renewenvironment{Sol}[1]{%
    \begin{list}{}{%
      \renewcommand\makelabel[1]{\textbf{##1}\hfil}%
      \settowidth\labelwidth{\textbf{Solution(s):}}%
      \setlength\leftmargin{\labelwidth}%
      \addtolength\leftmargin{\labelsep}%
    }%
    \item[Solution(s):]%
  }{\end{list}}%
  % Turn secnr-environment into something like the verbatim-environment
  % but without printing the body, thus gobbling its own content:
  \renewenvironment{secnr}[1]{%
    \@bsphack
    \let\do=\@makeother
    \dospecials
    \obeylines
    \secnrgobble
  }{\@Esphack}%
}%
\newcommand\secnrgobble{}%
\begingroup
\catcode`|=0 \catcode`[= 1 \catcode`]=2 %
\catcode`\{=12 \catcode`\}=12 \catcode`\\=12 %
|@firstofone[%
  |endgroup
  |def|secnrgobble#1\end{secnr}[|end[secnr]]%
]%
\makeatother

% \usepackage{hyperref}

\begin{document}

\Opensolutionfile{solutions}
\begin{Filesave}{solutions}
\chapter*{Solutions}
\end{Filesave}
%
\chapter{Mathematics}
\section{Addition}\label{section_1A}
\begin{secnr}Bls. \pageref{section_1A}\end{secnr}

\begin{enumerate}
\item What is $2+3$?
\begin{solution}
5
\end{solution}
\item Calculate the following:
\begin{enumerate}
\item $8+2$
\item $9+3$
\item $10+4$
\end{enumerate}
\begin{solution}
\begin{enumerate}
\item $10$
\item $12$
\item $14$
\end{enumerate}
\end{solution} 
\end{enumerate}

\section{Subtraction}\label{section_1B}
\begin{secnr}Bls. \pageref{section_1B}\end{secnr}

\begin{enumerate}
\item What is $100 - 3$
\begin{solution}
97
\end{solution}
\begin{samepage}
\item Calculate the following:
\begin{tasks}(2)
\task $10 - 3$
\task $10 - 4$
\task $20 - 4$
\task $20 - 5$
\end{tasks} 
\end{samepage}
\begin{solution}
\begin{tasks}(4)
\task $7$
\task $6$
\task $16$
\task $15$
\end{tasks} 
\end{solution}
\item How are you doing?
\begin{solution}
Fine.
\end{solution}
\end{enumerate}

\Closesolutionfile{solutions} 

\Readsolutionfile{solutions}

\end{document}

如果该行\PassOptionsToPackage{nosolutionfiles}{answers}变成注释,则会得到:

在此处输入图片描述 在此处输入图片描述

如果该行\PassOptionsToPackage{nosolutionfiles}{answers}没有变成注释,您将得到:

在此处输入图片描述 在此处输入图片描述

相关内容