私は標準化されたテストのフォーマット システムに取り組んでいます。テストの各セクションには、環境内に含めることができる連続した質問のグループがあります。
\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
あなたの質問に対する非公式な解決策は次のとおりです。
環境の始まりと終わり
passagequestions
を\label
これらの を環境の開始時の
\label
として思い出してください。\ref
passagequestions
カウンターのステップが、それが呼び出された環境で存続することを確認する必要があります。これは当然のことですが、-システム\@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}