Como continuar aumentando os contadores de conteúdo que está (opcionalmente) oculto?

Como continuar aumentando os contadores de conteúdo que está (opcionalmente) oculto?

Tenho um framework para criação de exercícios, onde o conteúdo da solução de cada subproblema é inserido em uma \solution-macro, que só exibe seu conteúdo se um booleano global estiver definido como verdadeiro.

O que me interessa é ter números exclusivos de equações/figuras/tabelas/listagens para a versão com e sem a solução. Em particular, preciso levar em conta se os contadores estão aumentados na solução. O benefício pretendido disso é que os números das equações (e outras coisas) que podem ser referidos pelos alunos em suas soluções não mudam de número quando a solução é publicada posteriormente.

Minha primeira tentativa de fazer isso foi tentar compor tudo em uma caixa que não fosse impressa (por exemplo, por \sboxou pelo lrbox-environment) - na esperança de que isso realmente aumentasse os contadores - mas já tive problemas com equationambientes.

Abaixo está um MWE, onde a fórmula de Euler deve ter o número da equação (3)para ambas as configurações do toggle with_solution. Para que a versão sem solução funcione, o (conteúdo do) terceiro argumento de \iftogglein \solutiondeve ser comentado.

Editar:Uma solução para contornar o problema seria subordinar todos os contadores relevantes ao subproblema, porque então as ocorrências na formulação são as primeiras e, portanto, necessariamente únicas (já que a formulação aparece em ambas as versões - com e sem a solução). No entanto, esta não é uma solução interessante para mim, porque na realidade (em comparação com o MWE reduzido), minhas equações já se parecem (5.3.2)com a eq. 2 do problema. 3 do exercício 5, enquanto o subproblema se parece com "5.3a)", "5.3b)", etc. (fazendo uma notação consistente - ou seja (5.3a.2)- pouco atraente para mim). Subordinar os contadores a problemnão ajuda, pois entre as diferentes formulações para cada subproblema, as soluções são capazes de incrementar diferentes contadores que não são zerados pela chamada \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}

Responder1

Outra maneira de ir

\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}}

Observe que comandos como \addtocontentssão executados durante a rotina de saída. Portanto, na minha resposta, \listoffigurecontém todos os números, independentemente de serem mostrados ou não. (Na verdade, eles são mostrados...) Embora a resposta de egreg produza\listofshownfigure.

Para espaçamento

Lidar com espaços negativos não é divertido. Eu gostaria de deixar isso de lado. Experimentos mostram que \par\marginpar{}\parse comporta como \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}}

informação relacionada