どうやら、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}
生成:
2つの質問:
- ここで何が起こっているのかをどう理解すればいいのでしょうか?
- 環境内の値を変更して、
enumerate
変更された値が環境外でも使用できるようにする最も簡単な方法は何ですか? ここでは、TeX 機能ではなく LaTeX を使用しても問題ありません。 機能する単純なソリューションが欲しいだけです。
なぜでしょうか? テストを書いていて、質問ごとにポイント数を指定しています。ポイントを表示するときに、最後に合計を表示する変数も更新したいと考えています。埋め込み環境にリストするサブ質問にポイントを割り当てることがあります。それらのポイントも合計に追加したいのです。
現時点では、次のようにしています。
\newcount\totalpts
\totalpts = 0
\newcommand{\pts}[1]{(#1 points) \advance \totalpts by #1}
そして、\pts
コマンドを使用して各質問のポイント数を表示します。enumerate
最後の質問の一部として合計を表示できるため、質問を表示するために 1 つの環境のみを使用する場合は機能します。enumerate
外部の質問環境に埋め込まれた環境でポイントを割り当てる場合は機能しません。埋め込まれた環境で質問にリストしたポイントは、外部環境の合計には影響しません。
もちろん、以前の質問を教えていただいても結構です。この種の質問は以前 tex.SE で議論されたことがあるはずですが、検索方法がわかりません。
答え1
すべての割り当てはデフォルトでローカルです (例外となる特別な TeX レジスタがいくつかあります)。つまり、TeX グループが終了すると、レジスタはグループが開始したときに有効だった以前の値に戻ります。
\global
割り当てのプレフィックスを使用すると、割り当てはグローバルになり、TeX グループが終了してもその値は保持されます。
したがって、レジスタを操作するときは、\global\advance
代わりにを使用する\advance
か、または を定義して代わりに\def\gadvance{\global\advance}
を使用します。また、 TeX グループ内にある場合は、直接割り当てを使用します。\gadvance
\advance
\total
\global\total=value
答え2
としてワイペットの説明、TeX カウント レジスタへの割り当ては、現在のグループに対してローカルです。すべての LaTeX 環境ではグループが作成されます。これにはリスト環境も含まれますが、、などの内部でカウントを進めた場合も同じ効果が得られますfigure
。center
quotation
カウント レジスタへの直接割り当てはデフォルトではローカルですが、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}