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 によって値が変更されると、合計カウンタが各列挙環境に対してローカルになることを示しています。

2つの質問:

  • ここで何が起こっているのかをどう理解すればいいのでしょうか?
  • 環境内の値を変更して、enumerate変更された値が環境外でも使用できるようにする最も簡単な方法は何ですか? ここでは、TeX 機能ではなく LaTeX を使用しても問題ありません。 機能する単純なソリューションが欲しいだけです。

なぜでしょうか? テストを書いていて、質問ごとにポイント数を指定しています。ポイントを表示するときに、最後に合計を表示する変数も更新したいと考えています。埋め込み環境にリストするサブ質問にポイントを割り当てることがあります。それらのポイントも合計に追加したいのです。

現時点では、次のようにしています。

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

そして、\ptsコマンドを使用して各質問のポイント数を表示します。enumerate最後の質問の一部として合計を表示できるため、質問を表示するために 1 つの環境のみを使用する場合は機能します。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 環境ではグループが作成されます。これにはリスト環境も含まれますが、、などの内部でカウントを進めた場合も同じ効果が得られますfigurecenterquotation

カウント レジスタへの直接割り当てはデフォルトではローカルですが、LaTeX のカウンターはグローバルに割り当てます。したがって、およびを使用すると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}

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

関連情報