환경 내에서 카운터의 시작 및 끝 값을 인쇄하려면 어떻게 해야 합니까?

환경 내에서 카운터의 시작 및 끝 값을 인쇄하려면 어떻게 해야 합니까?

저는 표준화된 테스트를 위한 형식 지정 시스템을 연구하고 있습니다. 테스트의 각 섹션에는 환경 내에 포함하도록 선택할 수 있는 연속 질문 그룹이 있습니다.

\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

귀하의 질문에 대한 비공식적 해결책은 다음과 같습니다.

  1. 환경 의 시작과 끝을 표시하십시오 passagequestions.\label

  2. 환경 시작 시 이러한 \labels를 s로 기억하세요 .\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}

관련 정보