Wie kann ich Anfangs- und Endwerte eines Zählers innerhalb einer Umgebung ausdrucken?

Wie kann ich Anfangs- und Endwerte eines Zählers innerhalb einer Umgebung ausdrucken?

Ich arbeite an einem Formatierungssystem für standardisierte Tests. In jedem Abschnitt eines Tests gibt es Gruppen aufeinanderfolgender Fragen, die ich in einer Umgebung unterbringen kann.

\begin{passagequestions}
    \begin{question} % question 1, or whichever this is.
    \end{question}
    % and so on
\end{passagequestions}

Der Zähler questioncountwird immer dann außerhalb bereitgestellt, wenn passagequestionsverwendet wird. Angenommen, dies questiontut nicht viel mehr, als die Fragennummer zu erhöhen, d. h. über \stepcounter{questioncount}.

Zu Beginn jeder Instanz von passagequestionsmöchte ich alle Fragen nennen, die Teil der Fragengruppe sind. Jede Instanz von passagequestionssollte mit beginnen Questions {0}--{1} are based on the following passage., wobei {0}der Index der ersten Frage ist (der 1 sein kann, aber nicht muss) und {1}der Index der letzten Frage ist.

Meine bisherige Lösung war, zunächst ein zu verwenden, totcountum die Länge einer Fragengruppe zu verfolgen, aber ich hatte den Eindruck, dassdas war keine gute Idee.

Antwort1

BearbeitenDie bessere Version finden Sie am Ende.

hyperrefÄhnlich wie Werner, aber ich verwende gefälschte Etiketten, die bei Gebrauch sofort kaputt gehen können .

\documentclass{article}

\usepackage{refcount}

\newcounter{passage}%
\newcounter{question}

\newenvironment{question}{\refstepcounter{question}}{}



\makeatletter
\newenvironment{passagequestions}{%
  \refstepcounter{passage}%
  % Store the fake label for the beginning
  \immediate\write\@auxout{%
    \string\newlabel{passagestart::\number\value{passage}}{{\number\value{question}}{\thepage}}%
  }%
  Questions \getrefnumber{passagestart::\number\value{passage}} -- \getrefnumber{passageend::\number\value{passage}} are based on the following passage.
}{%Store the fake label for the end
  \immediate\write\@auxout{%
    \string\newlabel{passageend::\number\value{passage}}{{\number\value{question}}{\thepage}}%
  }%
}
\makeatother





\begin{document}

\begin{passagequestions}
\begin{question}
\end{question}

\begin{question}
\end{question}
\begin{question}
\end{question}
\begin{question}
\end{question}


\end{passagequestions}

\begin{passagequestions}

\begin{question}
\end{question}

\begin{question}
\end{question}
\begin{question}
\end{question}
\begin{question}
\end{question}


\end{passagequestions}


\end{document}

BearbeitenBessere Version

\documentclass{article}

\usepackage{xpatch}
\usepackage{refcount}
\usepackage{xcolor}
\newif\ifnewpassage
\newpassagefalse

\newcounter{passage}%
\newcounter{question}


%Define some dummy question environment

\newenvironment{question}{%
\vskip0.3\abovedisplayskip

\refstepcounter{question}%
\colorbox{yellow}{\bfseries \textcolor{blue}{Question \thequestion}}%

\addvspace{0.5\baselineskip}
}{\vskip0.5\belowdisplayskip}

% Add some code to the question environment
\makeatletter

\newcommand{\storefakelabel}[3][\number\value{passage}]{%
  \immediate\write\@auxout{%
    \string\newlabel{#2#1}{{#3}{\thepage}}%
  }%
}

\newcommand{\passagestartprefix}{passagestart:}
\newcommand{\passageendprefix}{passageend:}

\newcommand{\getstartquestion}{%
  \getrefnumber{\passagestartprefix\number\value{passage}}
}

\newcommand{\getendquestion}{%
  \getrefnumber{\passageendprefix\number\value{passage}}%
}

\xapptocmd{\question}{% Append the stuff after(!!!) the question startup code has been done!
  \ifnewpassage%
  \storefakelabel{\passagestartprefix}{\number\value{question}}%
  \global\newpassagefalse%
  \fi%
}{}{}

\newcommand{\passagequestionsheading}{%
\colorbox{green}{Questions \getstartquestion -- \getendquestion\ are based on the following passage.}
}

\newenvironment{passagequestions}{%
  \vskip\abovedisplayskip%
  \newpassagetrue% Started a new passage
  \refstepcounter{passage}%
  \colorbox{red}{\large \bfseries Questions passage \thepassage}%

  \passagequestionsheading

}{%
  % Store the fake label for the end
  \storefakelabel{\passageendprefix}{\number\value{question}}%
  \vskip\belowdisplayskip%
}
\makeatother



\begin{document}

\begin{passagequestions}
\begin{question}
  Why does \LaTeXe\ provide that much fun?
\end{question}

\begin{question}
\end{question}
\begin{question}
\end{question}
\begin{question}
\end{question}


\end{passagequestions}

\begin{passagequestions}

\begin{question}
\end{question}

\begin{question}
\end{question}
\begin{question}
\end{question}
\begin{question}
\end{question}


\end{passagequestions}


\end{document}

Bildbeschreibung hier eingeben

Antwort2

Hier ist eine informelle Lösung für Ihre Frage:

  1. Markieren Sie den Anfang und das Ende der passagequestionsUmgebung mit einem\label

  2. Erinnern Sie sich an diese \labels als \refs am Anfang der passagequestionsUmgebung.

Sie müssen sicherstellen, dass die Zählerschritte die Umgebung, in der sie aufgerufen werden, überstehen. Dies ist natürlich der Fall, bei einer Neudefinition des Werts des schrittweisen Zählers in \@currentlabel- der mit dem \label- \refSystem - verwendet wird, ist dies jedoch nicht der Fall.

Bildbeschreibung hier eingeben

\documentclass{article}

\newcounter{question}
\newcounter{passagequestions}
\newenvironment{passagequestions}
  {\stepcounter{passagequestions}%
   \par\addvspace{\bigskipamount}\noindent
   Questions \ref{pq-\thepassagequestions-start}--\ref{pq-\thepassagequestions-end} are based on the following passage\ldots
   \par
   \renewcommand{\question}{%
     \oldquestion%
     \label{pq-\thepassagequestions-start}%
     \global\let\question\oldquestion}}%
  {\label{pq-\thepassagequestions-end}}

\makeatletter
\newenvironment{question}
  {\stepcounter{question}%
   \xdef\@currentlabel{\thequestion}%
   \par\addvspace{\baselineskip}%
   \textbf{Question~\thequestion}:}
  {}
\makeatother

\let\oldquestion\question

\begin{document}

\begin{passagequestions}
  This is the first passage\ldots
  \begin{question}
    First question
  \end{question}
  \begin{question}
    Second question
  \end{question}
  \begin{question}
    Third question
  \end{question}
\end{passagequestions}

\begin{passagequestions}
  This is the second passage \ldots
  \begin{question}
    First question
  \end{question}
  \begin{question}
    Second question
  \end{question}
  \begin{question}
    Third question
  \end{question}
\end{passagequestions}

\end{document}

verwandte Informationen