ここで疑問があります。次のコードは、\pgPtList
グループが終了したときに制御シーケンスの意味をリセットするのはなぜでしょうか?
\documentclass[12pt]{article}
\begin{document}
\begingroup
\gdef\pgPtList{}
\edef\pgPtList{8}
pgPtList is: \pgPtList
\edef\pgPtList{8, 5}
pgPtList is: \pgPtList
\endgroup
Empty environment has ended.
pgPtList is: \pgPtList
\end{document}
生成される出力は次のとおりです。
pgPtList is: 8
pgPtList is: 8, 5
Empty environment has ended.
pgPtList is:
私の現在の理解では、これはグループの動作方法に関係しているため、おそらく次の質問は次のようになります。グループが終了した後も変更が維持されるように制御シーケンスを再定義するにはどうすればよいでしょうか。
より広いコンテキストは次のとおりです。試験をタイプセットして各ページのポイント数を追跡しようとしており、\pgPtList
各ページのポイント数を追跡するために継続的に更新しています。各試験で、\pgPtList
ポイント値のテーブルを作成する別のコマンドのデフォルト パラメーターとして機能します。
各ページのポイントはenumerate
環境内で更新されるため、および\begingroup
が\endgroup
reprex に存在します。理想的には、ポイント テーブル コマンドが環境外で呼び出される場合でも、この環境内で変数を更新できるようにしたいと思います\pgPtList
。
私が混乱しているのは、\edef
とのあたりです\gdef
。私の素朴な理解では、これらのコマンドは、結果の制御シーケンスを現在のグループの外部からアクセス可能にするためのものであるのですが、上記のコードから得られる出力は、何か他のことが起こっていることを示唆しています。
答え1
\def\macroname<argument specification>{definition}
ローカルな標準定義です。\edef\macroname<argument specification>{definition}
はローカルな拡張定義です。つまり、definition
代入する前に拡張されます\macroname
。\gdef\macroname<argument specification>{definition}
世界的な標準定義です。\xdef\macroname<argument specification>{definition}
グローバルで拡張された定義です。
あなたの場合、最初の定義は\gdef\pgPtList{}
するローカル グループを存続させます。存続しない場合は\pgPtList
afterを使用する\endgroup
とエラーが発生します。
ただし、 のその後のすべての (再) 定義は\pgPtList
明示的にローカルであるため、それらの変更は保持されず\endgroup
、 の意味は\pgPtList
初期の空の定義に戻ります。
次の例が役に立つかもしれません:
\documentclass[12pt]{article}
\begin{document}
\newcounter{tweak}
\setcounter{tweak}{0}
\def\rstatement{Redefinition \thetweak.}
\begingroup
\gdef\pgPtList{Initial, global definition.}
pgPtList is: \pgPtList
\edef\pgPtList{\rstatement}
pgPtList is: \pgPtList ; \stepcounter{tweak}\pgPtList
\def\pgPtList{\rstatement}
pgPtList is: \pgPtList ; \stepcounter{tweak}\pgPtList
\endgroup
Environment has ended.
pgPtList is: \pgPtList
\begingroup
\xdef\pgPtList{\rstatement}
pgPtList is: \pgPtList ; \stepcounter{tweak}\pgPtList
\endgroup
Environment has ended.
pgPtList is: \pgPtList
\begingroup
\gdef\pgPtList{\rstatement}
pgPtList is: \pgPtList ; \stepcounter{tweak}\pgPtList
\endgroup
Environment has ended.
pgPtList is: \pgPtList
\end{document}
マクロが使用されるときに、\def
必ずカウンターの値が使用されることに注意し\gdef
てください。この値は定義時の値ではない可能性があります。\pgPtList
tweak
\pgPtList
対照的に、その間に値が変更された場合でも、定義時のカウンターの値が使用されるようにします\edef
。\xdef
\pgfPtList
tweak
一方、 と\def
は両方とも\edef
ローカル定義です。それらの効果は、現在のグループが終了すると終了します。
対照的に、\gdef
とはグローバルです。グループ化に関係なく、\xdef
の後続の定義によって置き換えられない限り、それらは有効です。\pgfPtList