TeX 변수가 목록 환경 내에서 로컬이 되나요?

TeX 변수가 목록 환경 내에서 로컬이 되나요?

분명히 TeX 카운터의 값이 enumerate환경(그리고 의심할 바 없이 다른 많은 컨텍스트) 내에서 수정되면 지역 변수처럼 작동하므로 이에 대한 모든 수정 사항은 환경에 국한됩니다. 예를 들어, 이 코드는

\documentclass{article}

\newcount\total
\total = 5

\begin{document}

At first total = \number\total

\begin{enumerate}
\item \advance \total by 10
      Now total = \number\total
\item \advance \total by 10
      Now total = \number\total
\end{enumerate}

Outside of the enumerate environment, total reverts to its
original value: \number\total\\

Does the same thing happen in embedded environments?
\begin{enumerate}
\item \advance \total by 100
      Now total = \number\total
      \begin{enumerate}
      \item \advance \total by 1000
      Now total = \number\total
      \end{enumerate}
      That didn't do anything to this total = \number\total
\item \advance \total by 100
      Now total = \number\total
\end{enumerate}
Yes.  Now total = \number\total

\end{document}

다음을 생산합니다: 앞의 소스 코드에서 생성된 LaTeX 이미지는 해당 값이 \advance에 의해 수정될 때 총 카운터가 각 열거 환경에 대해 로컬이 되는 것을 보여줍니다.

두 가지 질문:

  • 여기서 무슨 일이 일어나고 있는지 어떻게 이해해야 합니까?
  • enumerate수정된 값을 환경 외부에서 사용할 수 있도록 환경 내부에서 값을 수정하는 가장 간단한 방법은 무엇입니까 ? 여기서는 TeX 기능보다는 LaTeX를 사용해도 괜찮습니다. 나는 작동하는 간단한 솔루션을 원합니다.

왜? 나는 테스트를 작성하고 있으며 각 질문에 대해 가치 있는 포인트 수를 지정합니다. 포인트를 표시할 때 마지막에 총계를 제공하는 변수도 업데이트하고 싶습니다. 때로는 임베디드 환경에 나열한 하위 질문에 점수를 할당하기도 합니다. 그 포인트도 총계에 추가하고 싶습니다.

현재 저는 다음과 같이 하고 있습니다.

\newcount\totalpts
\totalpts = 0
\newcommand{\pts}[1]{(#1 points) \advance \totalpts by #1}

\pts그리고 각 질문에 대한 점수를 표시하는 명령을 사용합니다 . enumerate마지막 질문의 일부로 합계를 표시할 수 있기 때문에 질문을 표시하는 데 하나의 환경만 사용하는 경우 작동합니다 . 외부 질문 환경에 포함된 환경 에 포인트를 할당하면 작동하지 않습니다 enumerate. 포함된 환경의 질문에 대해 나열한 포인트는 외부 환경의 총계에 영향을 주지 않습니다.

물론 이전 질문을 알려 주시기 바랍니다. 이런 종류의 질문이 이전에 tex.SE에서 논의된 적이 있을 것이라고 확신하지만, 이를 검색하기 위한 전략을 찾을 수 없습니다.

1

답변1

모든 할당은 기본적으로 로컬입니다(몇 가지 특수 TeX 레지스터는 예외입니다). 이는 TeX 그룹이 끝나면 레지스터는 그룹이 시작될 때 유효한 이전 값으로 돌아간다는 것을 의미합니다.

\global할당의 접두사를 사용하면 할당은 전역적이며 TeX 그룹이 끝날 때 해당 값이 유지됩니다.

따라서 레지스터 작업 시 \global\advance대신 사용하거나 \advance정의하여 사용 \def\gadvance{\global\advance}하십시오 . TeX 그룹에 있는 경우 직접 할당을 사용하십시오 .\gadvance\advance\total\global\total=value

답변2

처럼와이펫 설명, TeX 카운트 레지스터에 대한 할당은 현재 그룹에 대해 로컬입니다. 모든 LaTeX 환경은 그룹을 생성합니다. 여기에는 목록 환경이 포함되지만 내부 에서 개수 를 늘리면 동일한 효과가 나타납니다 figure.centerquotation

카운트 레지스터에 대한 직접 할당은 기본적으로 로컬이지만 LaTeX 카운터는 전역적으로 할당합니다. 따라서 a counter및 를 사용하면 \addtocounter{}{}기본 카운트 레지스터에 대한 할당이 전체적으로 이루어지며 현재 그룹 외부에서 유지됩니다.

\documentclass{article}
\newcounter{total}
\setcounter{total}{5}

\begin{document}

At first total = \thetotal

\begin{enumerate}
  \item \addtocounter{total}{10}
  Now total = \thetotal
  \item \addtocounter{total}{10}
  Now total = \thetotal
\end{enumerate}

Outside of the enumerate environment, total reverts to its
original value: \thetotal % never end a paragraph with \\

Does the same thing happen in embedded environments?
\begin{enumerate}
  \item \addtocounter{total}{100}
  Now total = \thetotal
  \begin{enumerate}
    \item \addtocounter{total}{1000}
    Now total = \thetotal
  \end{enumerate}
  That didn't do anything to this total = \thetotal
  \item \addtocounter{total}{100}
  Now total = \thetotal
\end{enumerate}
Yes.  Now total = \thetotal

\end{document}

\thetotal이 솔루션을 사용하면 섹션 번호, 각주, 방정식 번호 등의 모양을 수정할 수 있는 것과 동일한 방식으로 서식을 수정하도록 재정의할 수도 있습니다. 이것이 바로 직접 \thetotal작성하는 것보다 사용하는 것이 더 나은 이유입니다. \arabic{total}현재 동일한 결과를 생성합니다.

여기에 이미지 설명을 입력하세요

관련 정보