%20%D1%81%D0%BA%D1%80%D1%8B%D1%82%3F.png)
У меня есть фреймворк для создания упражнений, в котором содержимое решения каждой подзадачи передается в \solution
макрос, который отображает его содержимое только в том случае, если глобальное логическое значение установлено в значение true.
Мне интересно иметь уникальные номера уравнений/рисунков/таблиц/листингов для версий с решением и без него. В частности, мне нужно учесть, увеличиваются ли счетчики в решении. Предполагаемое преимущество этого в том, что номера уравнений (и другие вещи), на которые могут ссылаться студенты в своих решениях, не меняют свой номер после публикации решения.
Моя первая попытка сделать это состояла в том, чтобы попытаться набрать все в поле, которое не печатается (например, рядом с \sbox
или рядом с lrbox
-environment) - в надежде, что это действительно увеличит счетчики - но у меня уже возникли проблемы с equation
окружениями.
Ниже приведен MWE, где формула Эйлера должна иметь номер уравнения (3)
для обоих положений переключателя with_solution
. Для работы версии без решения (содержимое) третьего аргумента \iftoggle
in \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}}