\ajTsumesuji2がenumitemのlabelに入った時壊れる

Re: \ajTsumesuji2がenumitemのlabelに入った時壊れる

- はやて (h20y6m) の投稿
返信数: 2

とりあえずは

label=\kakkoTsumesujiTwo{\arabic*},

\NewDocumentCommand \kakkoTsumesujiTwo{m}{\kakko{\ExpandArgs{Ne}\ajTsumesuji2{#1}}}

のように専用の(Robustな)命令を定義して、 \ajTsumesuji の第2引数を先に展開してやることで回避できます。


ちなみに\protectをつけても、エラーは改善されませんでした。

label=\kakko{\protect\ajTsumesuji2{\arabic*}},

のように \protect をつけると別のエラーになると思います。

! Missing number, treated as zero.
<to be read again>
                   \c@!

これは

\ajTsumesuji2{\arabic{page}}

でも同じエラーが起こります。 とりあえず現状 \ajTsumesuji には直接数字を入れないといけないということのようです。 (個人的に \ajTsumesuji2{\c@page} が通るのにこれが通らないのは仕様として妙なのでバグな気もしますが……)

はやて (h20y6m) への返信

Re: \ajTsumesuji2がenumitemのlabelに入った時壊れる

- Z. R. の投稿

>とりあえず現状 \ajTsumesuji には直接数字を入れないといけないということのようです

恐らく、「カウンタの値に対して\ajTsumesuji2を適用したい」のであれば

% どちらもダメ
\ajTsumesuji2{\arabic{page}}
\ajTsumesuji2{\value{page}}

ではなく\ajLabelを使って

\ajLabel\ajTsumesuji2{page}

と書くべき、という設計なのだと思います。

ただしこれをlabelに指定しようとしても、このコードには\arabic{‹カウンタ名›}がないので\arabic*の形が使えません。そこで以下の方針をとります。

  • \ajLabel\ajTsumesuji2{‹カウンタ名›}を独自のカウンタ出力命令として定義する
  • それを\AddEnumerateCounterで「labelで使えるカウンタ出力命令」として登録する

定義部分のコードは以下のようになります。

\newcommand\myAjTsumesujiTwo{\ajLabel\ajTsumesuji2}
\AddEnumerateCounter{\myAjTsumesujiTwo}{\myDummy}{99}
\newlist{mondaiA}{enumerate}{1}
\setlist[mondaiA,1]{%
label=\kakko{\myAjTsumesujiTwo*},
leftmargin=1\zw,
listparindent=1\zw,labelsep=1\zw,itemindent=1\zw,
topsep=0mm,itemsep=\baselineskip
}

ここで注意すべきなのは「\myAjTsumesujiTwo\NewDocumentCommandで定義してはいけない」ということです。マニュアルにある通り、label中でfragileな命令を使う場合は保護(\protect)を付ける必要があります。\NewDocumentCommandで定義した命令は自動的に保護付きになります。(例えば はやて さんの回答の\kakkoTsumesujiTwo\NewDocumentCommandで定義する必要がある。)ところがいま定義した\myAjTsumesujiTwoカウンタ出力命令、つまり\arabic等と同類なので、保護付きにするのは不適切です。このため、\NewDocumentCommandではなく\newcommand(あるいは\NewExpandableDocumentCommand)で定義する必要があります。