%20oculto%3F.png)
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 \sbox
ou pelo lrbox
-environment) - na esperança de que isso realmente aumentasse os contadores - mas já tive problemas com equation
ambientes.
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 \iftoggle
in \solution
deve 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 problem
nã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 \addtocontents
são executados durante a rotina de saída. Portanto, na minha resposta, \listoffigure
conté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{}\par
se 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}}