%20oculto%3F.png)
Tengo un marco para crear ejercicios, donde el contenido de la solución a cada subproblema se introduce en una \solution
macro, que solo muestra su contenido si un booleano global se establece en verdadero.
Lo que me interesa es tener números únicos de ecuaciones/figuras/tablas/listados tanto para la versión con como sin la solución. En particular, debo tener en cuenta si los contadores aumentan en la solución. El beneficio previsto de esto es que los números de ecuaciones (y otras cosas) a las que los estudiantes podrían hacer referencia en sus soluciones no cambian su número una vez que la solución se publica más adelante.
Mi primer intento de hacer esto fue intentar componer todo en un cuadro que no esté impreso (por ejemplo, por \sbox
o por el lrbox
entorno), con la esperanza de que esto realmente aumentara los contadores, pero ya tengo problemas con equation
los entornos.
A continuación se muestra un MWE, donde la fórmula de Euler debe tener un número de ecuación (3)
para ambas configuraciones del interruptor with_solution
. Para que funcione la versión sin solución, el (contenido del) tercer argumento de \iftoggle
in \solution
debe estar comentado.
Editar:Una solución para sortear el problema sería subordinar todos los contadores relevantes al subproblema, porque entonces las ocurrencias en la formulación son las primeras y, por lo tanto, necesariamente únicas (ya que la formulación aparece en ambas versiones, con y sin la solución). Sin embargo, esta no es una solución interesante para mí, porque en realidad (frente al MWE reducido), mis ecuaciones ya se parecen (5.3.2)
a la ecuación. 2 del problema. 3 del ejercicio 5, mientras que el subproblema parece "5.3a)", "5.3b)", etc. (haciendo una notación consistente, es decir (5.3a.2)
, poco atractiva para mí). Subordinar los contadores a problem
no ayuda, porque entre las diferentes formulaciones para cada subproblema, las soluciones pueden incrementar diferentes contadores que no se restablecen llamando a \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}
Respuesta1
Otra manera 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
se ejecutan durante la rutina de salida. Por lo tanto, en mi respuesta \listoffigure
contiene todas las figuras, sin importar si se muestran o no. (De hecho se muestran...) Si bien la respuesta de egreg produce\listofshownfigure
.
Para espaciar
Lidiar con espacios negativos no es divertido. Me gustaría dejarlo de lado. Los experimentos muestran 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}}