環境内でカウンターの開始値と終了値を印刷するにはどうすればよいですか?

環境内でカウンターの開始値と終了値を印刷するにはどうすればよいですか?

私は標準化されたテストのフォーマット システムに取り組んでいます。テストの各セクションには、環境内に含めることができる連続した質問のグループがあります。

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

カウンタは、が使用されるquestioncountときは常に外部に提供されますpassagequestions。 は、question質問番号を増やす以上のことはほとんど行わないと仮定します\stepcounter{questioncount}。つまり、 を介して行われます。

の各インスタンスの始めにpassagequestions、質問グループの一部であるすべての質問に名前を付けたいと思います。 の各インスタンスはpassagequestionsで始まる必要があります。Questions {0}--{1} are based on the following passage.ここで、 は{0}最初の質問のインデックス (1 の場合もそうでない場合もあります)、{1}は最後の質問のインデックスです。

totcount以前の解決策では、質問グループの長さを追跡するために を使用する予定でしたが、それは良い考えではなかった

答え1

編集最後により良いバージョンをご覧ください。

Werner と似ていますが、使用するとすぐに破れる可能性のある偽のラベルを使用していますhyperref

\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}

編集より良いバージョン

\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}

ここに画像の説明を入力してください

答え2

あなたの質問に対する非公式な解決策は次のとおりです。

  1. 環境の始まりと終わりpassagequestions\label

  2. これらの を環境の開始時の\labelとして思い出してください。\refpassagequestions

カウンターのステップが、それが呼び出された環境で存続することを確認する必要があります。これは当然のことですが、-システム\@currentlabelで使用される -ステップされたカウンターの値の再定義は存続しません。\label\ref

ここに画像の説明を入力してください

\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}

関連情報