Как обеспечить увеличение счетчиков для контента, который (необязательно) скрыт?

Как обеспечить увеличение счетчиков для контента, который (необязательно) скрыт?

У меня есть фреймворк для создания упражнений, в котором содержимое решения каждой подзадачи передается в \solutionмакрос, который отображает его содержимое только в том случае, если глобальное логическое значение установлено в значение true.

Мне интересно иметь уникальные номера уравнений/рисунков/таблиц/листингов для версий с решением и без него. В частности, мне нужно учесть, увеличиваются ли счетчики в решении. Предполагаемое преимущество этого в том, что номера уравнений (и другие вещи), на которые могут ссылаться студенты в своих решениях, не меняют свой номер после публикации решения.

Моя первая попытка сделать это состояла в том, чтобы попытаться набрать все в поле, которое не печатается (например, рядом с \sboxили рядом с lrbox-environment) - в надежде, что это действительно увеличит счетчики - но у меня уже возникли проблемы с equationокружениями.

Ниже приведен MWE, где формула Эйлера должна иметь номер уравнения (3)для обоих положений переключателя with_solution. Для работы версии без решения (содержимое) третьего аргумента \iftogglein \solutionдолжно быть закомментировано.

Редактировать:Одним из решений обойти проблему было бы подчинение всех соответствующих счетчиков подзадаче, потому что тогда вхождения в формулировке являются первыми и, следовательно, обязательно уникальными (поскольку формулировка появляется в обеих версиях — с решением и без него). Однако для меня это не интересное решение, потому что на самом деле (по сравнению с урезанным MWE) мои уравнения уже выглядят как (5.3.2)для ур. 2 проблемы 3 упражнения 5, в то время как подзадача выглядит как «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}}

Связанный контент