저는 표준화된 테스트를 위한 형식 지정 시스템을 연구하고 있습니다. 테스트의 각 섹션에는 환경 내에 포함하도록 선택할 수 있는 연속 질문 그룹이 있습니다.
\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
이전 솔루션은 질문 그룹의 길이를 추적하기 위해 a를 사용하는 것으로 시작하려고 했지만 다음과 같은 인상을 받았습니다.그건 좋은 생각이 아니었어.
답변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
s를 s로 기억하세요 .\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}