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

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

- KK TeX の投稿
返信数: 3

件名にあるように、\ajTsumesujiを箇条書きのラベルに使用したいというのが目標です。

\ajKakkoなど、luatexja-otfの提供しているコマンドは
label=\protect\ajKakko{\arabic*}
とすれば動きます。しかし\ajKakkoは99がmaxであるので、KKsymbolsパッケージの提供する\kakkoコマンドを使用してその中に\ajTsumesujiを入れ、上限なしのラベルを作成したいと考えました。そこで

\documentclass{jlreq}
\usepackage{luatexja-otf, KKsymbols, enumitem}
\newlist{mondaiA}{enumerate}{1}
\setlist[mondaiA,1]{%
label=\kakko{\ajTsumesuji2{\arabic*}},
leftmargin=1\zw,
listparindent=1\zw,labelsep=1\zw,itemindent=1\zw,
topsep=0mm,itemsep=\baselineskip
}
\begin{document}
\ajTsumesuji2{10}
\begin{mondaiA}
\item あああ
\end{mondaiA}
\end{document}

とやってみると、

Use of \\mondaiA doesn't match its definition.
\@ifnextchar ... \reserved@d =#1\def \reserved@a {
#2}\def \reserved@b {#3}\f...
l.13 \item
あああ󿿿
/Users/majinkuu/Documents/.../test.tex:13: Argument of \@firstoftwo has an extra }.
<inserted text>
\par
l.13 \item
あああ󿿿
Runaway argument?

...

といった具合のエラーが出ました。

\ajTsumesujiを除けば動くため、原因はここで間違いないのですが、回避方法はありませんでしょうか。

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

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

- はやて (h20y6m) の投稿

とりあえずは

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)で定義する必要があります。