![使用答案完成任务](https://linux22.com/image/378842/%E4%BD%BF%E7%94%A8%E7%AD%94%E6%A1%88%E5%AE%8C%E6%88%90%E4%BB%BB%E5%8A%A1.png)
我正在写一本数学题的书。我需要一种方法来在书的最后展示问题及其解决方案。
我找到了一种方法,使问题和答案看起来正如我希望的那样,除了一件事。
我喜欢使用任务来解决一些包含多个问题的问题。任务提供了一种处理水平列表的好方法。
但将它们与答案包一起使用会产生奇怪的结果。
但是当我使用任务时,解决方案中的编号和间距出现错误,如问题 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
结束环境之后恢复它们。tasks
solution
作为用户氮氧化物指出,这可以通过使用命令\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}
没有变成注释,您将得到: