\renewcommandと\RenewDocumentCommandで挙動が変わるのはなぜでしょうか?

Re: \renewcommandと\RenewDocumentCommandで挙動が変わるのはなぜでしょうか?

- 本田 知亮 の投稿
返信数: 0
どういうと分かりやすいですかね
細かい部分はさておきこんな感じです.

\label{A} というのは「\ref{A}とは\label{A}が発行されたときの直前のカウンタの値である」と定めることといっていいです.
このときの「カウンタの値」というのは,カウンタに対する\the<カウンタ> マクロに保存されている値です.
そしてマクロをそこに保存されている中身そのものに置き換えることを「展開」といいます.

そこでちょっといい直すと
カウンタlstlisting に対して\label{A}を発行するということは
「\ref{A}とは\label{A}が発行された時点での\thelstlistingを展開した値であると定める」ことになります.

ところが,
\RenewDocumentCommandは「展開を抑止する」という機能をもったマクロを作るものであるので,
\thelstlistingを\RenewDocumentCommandで定義すると,
「\ref{A}が\thelstlistingそのものになる」,
つまり「\label{A}を発行した時点での値に「展開」される」という部分が抑止されてしまうのです.
これがおかしなことを引き起こします.

具体的には\ref{A}が\thelstlistingそのものなので,
\ref{A}が使われた時点でのlstlstingの値\thelstlistingになってしまうため,
\ref{A}が使われた場所によって異なりうる(\label{A}で引っ張り出したい値とは限らない)のです.

>\RenewDocumentCommandでも正常に動作させる(\renewcommand使用時と同様の結果を得る)ためにはどう修正すべきなのでしょうか。

無理です.\RenewDocumentCommandを提供するxparse(今はLaTeX2e本体に取り込まれてる)のドキュメントの冒頭に
The xparse package provides a high-level interface for producing document-level commands.
とあります.カウンタの表示形態をいじるのは「document-level」ではなく「design-level」に相当すると思います.
\def で定義するのが妥当でしょうか.