在以下 MWE 中
\documentclass{article}
\usepackage{environ}
\newcounter{totalmarks}
% \newenvironment{solution} {\par\textbf{Solution:}} {} % Show solution
\NewEnviron{solution}{} % Do not show solution
\newcommand{\mk}[1]{\addtocounter{totalmarks}{#1} \textbf{[+#1]}}
\begin{document}
This is a question.
\begin{solution}
This is a solution step \mk{3}. Another step \mk{2}
\end{solution}
\par \hfill (Total marks \thetotalmarks).\setcounter{totalmarks}{0}
\end{document}
环境solution
里有题目的答案,有些地方我在解答步骤里加了标记,最后再输出标记并重置计数器。我有两个问题:
首先,使用该environ
包我可以隐藏解决方案,如上所示。但这也意味着我的\mk
命令没有被解析,而且我无法知道解决方案有多少个标记。有没有办法解析环境的主体但隐藏其输出?
此外,这可能与此有关,有没有办法在解决方案之前(或顶部)而不是在解决方案末尾显示总分?我知道可以将计数器值输出到辅助文件并重新编译,但我不知道如何solution
在单个文档中推广到多个环境。
答案1
这里我提供了一个使用tcolorbox
包的解决方案,使用refcount
而不是environ
来解决隐藏解决方案和 refer-before-specify 问题。该tcolorbox
部分灵感来自包手册第 8.3 节的示例。
如果您不关心技术细节,请向下滚动阅读“如何使用”部分。
隐藏的解决方案
为了隐藏解决方案,我首先想出了tcolorbox
包,因为它的\tcblower
命令提供了一个invisible/ignore
选项。
背景设为白色(colback
),边框被移除(frame hidden
)。计数器自动对每个问题进行编号tcbcounter
。您可以相应地更改这些样式。
\mk
参考命令前的总分
这有点棘手,但refcount
正是为此设计的包。这部分的关键点是将有解决方案的计数器标签(我用作rfc
前缀)和没有解决方案的计数器标签(用作ig
前缀)区分开。环境的星号参数可以使用包中的命令solution
来区分这两种类型的标签。\IfBooleanTF
xparse
如何使用
您可以浏览以下枚举列表,或直接阅读我的 MWE 以供使用。
- 将我的 MWE 的序言复制到你的序言中。我的工作需要在你的机器上安装 包
tcolorbox
、refcount
和。xparse
- 在文档的最前面(内部
document
环境)添加:\tcbstartrecording\relax
。解决方案将作为单独的文件记录在当前目录中。 - 对于显示解决方案的问题:使用
\begin{solution}
环境和\mk
。但是,最后一步应该使用\mklast
而不是\mk
。要在环境内拆分问题和解决方案solution
,请使用命令\tcblower
。
\begin{solution}
This problem asks ...
\tcblower
Step 1 \mk{...}, step 2 \mk{...}, final step \mklast{...}
\end{solution}
- 对于没有显示解决方案的问题:使用 star-variant 环境
\begin{solution}*
和 star-variant\mklast*{...}
。无需更改\mk
命令。 - 最后一个环境结束后
solution
,添加\tcbstoprecording
停止录制解决方案。 - 如果你想显示隐藏的解决方案,请
\tcbinputrecords
在末尾添加。 - 编译两次以获得正确的总分。我在 TeX Live 2019 的 pdflatex 下进行了测试。
最小工作示例
以下是 MWE:
\documentclass{article}
\usepackage{refcount}
% Ref for the total mark counter
\usepackage{xparse}
\newcounter{totalmarks}
\newcommand{\mk}[1]{%
\textbf{[#1]}%
\addtocounter{totalmarks}{#1}%
}
\NewDocumentCommand{\mklast}{sm}{%
\textbf{[#2]}%
\addtocounter{totalmarks}{#2}%
\addtocounter{totalmarks}{-1}%
\refstepcounter{totalmarks}%
\label{\IfBooleanTF{#1}{ig}{rfc}:\thetcbcounter}%
}
% Save solution for latter.
% A modified version of 8.3 Example
% of the tcolorbox manual.
\usepackage[most]{tcolorbox}
\NewTColorBox[auto counter]{solution}{s}{%
%enhanced, frame hidden,
colback=white,
label={problem@\thetcbcounter},
before upper={\setcounter{totalmarks}{0}\textbf{Problem~\thetcbcounter}:~},
after upper={\par\hfill{\itshape\small%
Total marks of \getrefnumber{\IfBooleanTF{#1}{ig:\thetcbcounter}{rfc:\thetcbcounter}}.
}},
lowerbox=\IfBooleanTF{#1}{ignored}{visible},
before lower={%
\textbf{Solution of problem~\thetcbcounter}:~%
},
savelowerto={tcbsol\thetcbcounter.tex},
record={\string\addsol{\thetcbcounter}{tcbsol\thetcbcounter.tex}},
\IfBooleanTF{#1}{}{no recording}
}
\NewTotalTColorBox{\addsol}{mm}{%
% Copied from the `solution' part
before upper={%
\setcounter{totalmarks}{0}%
\textbf{Solution of problem~\ref{problem@#1}}:~%
},
after upper={
\addtocounter{totalmarks}{-1}%
\refstepcounter{totalmarks}%
\label{ig:#1}
}
}{\input{#2}}
\begin{document}
\tcbstartrecording\relax
With \verb+\begin{solution}+, the problem goes with its solution:
\begin{solution}
The problem is asking bla bla bla.
\tcblower
This is a solution step \mk{1}.
Another step \mk{2}.
Final step with special `mklast' command \mklast{4}.
\end{solution}
Use \verb+\begin{solution}*+ to hide the solution.
\begin{solution}*
The problem is asking bla bla bla.
\tcblower
This is a solution step \mk{8}.
Final step with special `mklast*' command \mklast{16}.
\end{solution}
This one is only for checking if the total marks is calculated correctly:
\begin{solution}
The problem is asking bla bla bla.
\tcblower
This is a solution step \mk{32}.
Final step with special `mklast' command \mklast{64}.
\end{solution}
\tcbstoprecording
% Show solutions on a new page
% \clearpage
For those whose solutions are not displayed above:
\tcbinputrecords
\end{document}
MWE 是什么样子的:
答案2
一个非常简单的解决方案是利用计数器是全局的这一特点。在保存框中执行解决方案主体,然后丢弃该框。内容被执行,但什么都没有呈现。
目前不在电脑旁,所以无法提供示例