如何不断增加(可选)隐藏内容的计数器?

如何不断增加(可选)隐藏内容的计数器?

我有一个创建练习的框架,其中每个子问题的解决方案的内容被输入到一个\solution宏中,只有当全局布尔值设置为 true 时才会显示其内容。

我感兴趣的是,有解和无解的版本都有独特的方程式/图形/表格/列表编号。特别是,我需要考虑解决方案中的计数器是否增加。这样做的好处是,学生在解决方案中可能引用的方程式编号(和其他东西)在解决方案稍后发布后不会改变其编号。

我第一次尝试这样做是尝试将所有内容排版到未打印的框中(例如,通过\sbox或通过lrbox-environment) - 希望这实际上会增加计数器 - 但我已经遇到了equation环境麻烦。

下面是一个 MWE,其中欧拉公式应该(3)对切换的两种设置都有方程编号。要使无解版本工作,必须注释掉inwith_solution的第三个参数(内容) 。\iftoggle\solution

编辑:规避该问题的一个解决方案是将所有相关计数器置于子问题之下,因为这样公式中的出现就是第一次,因此必然是唯一的(因为公式出现在两个版本中 - 有和没有解决方案)。但是,这对我来说不是一个有趣的解决方案,因为实际上(与简化的 MWE 相比),我的方程式对于(5.3.2)练习 5 中问题 3 的方程 2 已经看起来像,而子问题看起来像“5.3a)”、“5.3b)”等(做出一致的符号 - 即(5.3a.2)- 对我来说没有吸引力)。将计数器置于problem无济于事,因为在每个子问题的不同公式之间,解决方案能够增加不同的计数器,这些计数器不会通过调用重置\subproblem

\documentclass{article}

\usepackage{etoolbox}
\usepackage{amsmath}
\usepackage{xparse}

\newtoggle{with_solution}
\newsavebox\tempbox
\NewDocumentCommand{\solution}{+m}{
\iftoggle{with_solution}{
    \par\medskip\noindent\textbf{Solution:} #1
    }
    {
%   \sbox\tempbox{#1}
    \begin{lrbox}\tempbox
    #1
    \end{lrbox}
    }
}

% \problem and \subproblem cut to bare bones for simplicity
\newcommand{\problem}[1]{\section{#1}}
\newcounter{subproblem}
\newcommand{\subproblem}{\par\medskip\noindent\stepcounter{subproblem}{\bfseries\alph{subproblem})}\quad} 

\toggletrue{with_solution}          % Set to true to include solution
%\togglefalse{with_solution}        % Set to false to exclude solution

\begin{document}

\problem{A Problem}

\subproblem Problem Formulation
\solution{Solution}

\subproblem Problem Formulation with \eqref{eq:prb}
\begin{equation}\label{eq:prb}
a=b
\end{equation}
\solution{Solution with \eqref{eq:sol}

\begin{equation}\label{eq:sol}
x=y
\end{equation}
}

\subproblem Problem Formulation with \eqref{eq:prb2}, having the same number both with or without typesetting the solutions.

\begin{equation}\label{eq:prb2}
\mathrm{e}^{2\pi\mathrm{i}}=1
\end{equation}
\solution{The \texttt{$\backslash$solution}-macro should be able to handle \texttt{$\backslash$par}'s, figures, tables, listings (and also increase their counters accordingly, even when not typeset)...}

\end{document}

答案1

另一种方式

\NewDocumentCommand{\solution}{+m}{
    \iftoggle{with_solution}
        {\par\medskip\noindent\textbf{Solution:} #1\par}
        %{\setbox\tempbox=\vbox{#1}}} % this line comes from egreg's comment
        % The following line is my alternative
        {\par\vbox to0cm{\vspace*{\paperheight}\medskip\noindent\textbf{Solution:} #1\vspace*{-\paperheight}}\par}}

请注意,像 这样的命令\addtocontents是在输出例程期间执行的。因此,在我的答案中,\listoffigure包含所有图形,无论它们是否显示。(事实上它们已经显示了……)而 egreg 的答案产生了\listofshownfigure

对于间距

处理负空间并不好玩。我想把它放在一边。实验表明,其\par\marginpar{}\par表现为\par

\NewDocumentCommand{\solution}{+m}{
    \iftoggle{with_solution}
        {\par\medskip\noindent\textbf{Solution:} #1\par}
        %{\setbox\tempbox=\vbox{#1}}} % this line comes from egreg's comment
        % The following line is my alternative
        {\par\marginpar{\moveright\paperwidth\vbox to0cm{\medskip\noindent\textbf{Solution:} #1}}\par}}

相关内容