已解析但隐藏主体的 NewEnviron

已解析但隐藏主体的 NewEnviron

在以下 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来区分这两种类型的标签。\IfBooleanTFxparse

如何使用

您可以浏览以下枚举列表,或直接阅读我的 MWE 以供使用。

  1. 将我的 MWE 的序言复制到你的序言中。我的工作需要在你的机器上安装 包tcolorboxrefcount和。xparse
  2. 在文档的最前面(内部document环境)添加:\tcbstartrecording\relax。解决方案将作为单独的文件记录在当前目录中。
  3. 对于显示解决方案的问题:使用\begin{solution}环境和\mk。但是,最后一步应该使用\mklast而不是\mk。要在环境内拆分问题和解决方案solution,请使用命令\tcblower
\begin{solution}
This problem asks ...
\tcblower
Step 1 \mk{...}, step 2 \mk{...}, final step \mklast{...}
\end{solution}
  1. 对于没有显示解决方案的问题:使用 star-variant 环境\begin{solution}*和 star-variant \mklast*{...}。无需更改\mk命令。
  2. 最后一个环境结束后solution,添加\tcbstoprecording停止录制解决方案。
  3. 如果你想显示隐藏的解决方案,请\tcbinputrecords在末尾添加。
  4. 编译两次以获得正确的总分。我在 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 是什么样子的:

MWE 图片

答案2

一个非常简单的解决方案是利用计数器是全局的这一特点。在保存框中执行解决方案主体,然后丢弃该框。内容被执行,但什么都没有呈现。

目前不在电脑旁,所以无法提供示例

相关内容