グループ/環境内でマクロ定義をリセットしないようにする方法

グループ/環境内でマクロ定義をリセットしないようにする方法

ここで疑問があります。次のコードは、\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\endgroupreprex に存在します。理想的には、ポイント テーブル コマンドが環境外で呼び出される場合でも、この環境内で変数を更新できるようにしたいと思います\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{} するローカル グループを存続させます。存続しない場合は\pgPtListafterを使用する\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てください。この値は定義時の値ではない可能性があります。\pgPtListtweak\pgPtList

対照的に、その間に値が変更された場合でも、定義時のカウンターの値が使用されるようにします\edef\xdef\pgfPtListtweak

一方、 と\defは両方とも\edefローカル定義です。それらの効果は、現在のグループが終了すると終了します。

対照的に、\gdefとはグローバルです。グループ化に関係なく、\xdefの後続の定義によって置き換えられない限り、それらは有効です。\pgfPtList

関連情報