align 環境でのみカウンター エラーが発生しますか?

align 環境でのみカウンター エラーが発生しますか?

私は現在、日本の数学学習者向けの一種の教科書を作成中です。そこで、以下のようなカウンターマクロを作成しました。

私の知る限り、通常の環境ではうまく動作するようです。しかし、これを align 環境に置くと、正しく動作しなくなります。二重にカウントされていると思います。たとえば、\utoi を 3 回使用すると、4 番目の文字から始まります。

どなたか修正していただけると大変助かります。よろしくお願いします。

\documentclass[fleqn, uplatex]{jsarticle}
\usepackage{amsmath}
\global\newcount\kAnAc
\def\Cleariroha{\kAnAc=0}
\Cleariroha
\makeatletter
\def\iroha{\@ifnextchar [{\K@N@@}{\K@N@}}
\def\K@N@{%
 \global\advance\kAnAc\@ne%
 \ifcase\kAnAc ×\or イ\or ロ\or ハ\or ニ\or ホ\or ヘ\or ト\or チ\or リ\or ヌ\or ル\or ヲ\or ワ\or カ\or ヨ\or タ\or レ\or ソ\or ツ\or ネ\or ナ\or ラ\or ム\or ×\fi%
}
\def\K@N@@[#1]{%
 \batchmode%
 \ifcase\ref{#1} ×\or イ\or ロ\or ハ\or ニ\or ホ\or ヘ\or ト\or チ\or リ\or ヌ\or ル\or ヲ\or ワ\or カ\or ヨ\or タ\or レ\or ソ\or ツ\or ネ\or ナ\or ラ\or ム\or ×\fi%
\errorstopmode}%
\def\Klabel#1{\@bsphack
  \protected@write\@auxout{}%
         {\string\newlabel{#1}{{\the\kAnAc}{\thepage}}}%
  \@esphack}
\makeatother
\newcommand{\utoi}[1]{\underset{\iroha}{\underline{#1}}}
\begin{document}
$\utoi{3}$, $\utoi{5}$
\Cleariroha
\begin{align*}
    y&=\utoi{a}x+\utoi{b}\\
    &=\utoi{5}x+\utoi{4}
\end{align*}
\end{document}

念のため: TeXファイルで日本語を実行するには、次のファイルを「latexmkrc」として作成する必要があります。

$latex = 'uplatex';
$bibtex = 'upbibtex';
$dvipdf = 'dvipdfmx %O -o %D %S';
$makeindex = 'mendex -U %O -o %D %S';
$pdf_mode = 3; 

答え1

\global\newcount\kAnAc関係ありませんが、偶然にこれを行わないでください\global。エラーは発生しません。すでにグローバルではない割り当てがグローバルになることはありません。

AMS アラインメントは、最終設定の前にさまざまなアラインメント幅を測定するために 2 回評価されます。パッケージは、すべての LaTeX カウンターを保存して復元し、二重に増加しないようにしますが、 で割り当てられた低レベルのカウンターではこれを行いません\newcount

そうすれば、

\global\newcount\kAnAc

による

\newcounter{kAnAc}

そして

\global\advance\kAnAc\@ne%
 \ifcase\kAnAc

による

\stepcounter{kAnAc}%
 \ifcase\value{kAnAc}%

あるいは、コードをそのままにして、測定パスでのみ増分します。

\ifmeasuring@
  \global\advance\kAnAc\@ne
\fi

答え2

amsmath複数行表示では材料の上を 2 回通過するため、カウンターを 1 回だけ進める必要があります。

これは、が true か false かをチェックすることで実行できます\ifmeasuring@。false の場合にのみステップ実行する必要があるため、計測が行われない\utoi内でも機能します。カナの幅は同じなので、これは大きな問題にはならないはずです。起こり得る問題を修正するために、case 0 でもreturnを作成しました。これは、ラベルがまだ解決されていない場合にのみ発生します(この場合は0 を返します)。equation\iroha\iroha[label]\getrefnumber

また、ひどいトリックを使わずに、カナの表示に対処する別の方法も提案します\batchmode

\documentclass[fleqn, uplatex]{jsarticle}
\usepackage{amsmath}
\usepackage{refcount}

\makeatletter
\newcommand{\K@N@numbering}[1]{%
  \ifcase#1\relax
    イ\or イ\or ロ\or ハ\or ニ\or ホ\or ヘ\or ト\or チ\or リ\or
   ヌ\or ル\or ヲ\or ワ\or カ\or ヨ\or タ\or レ\or ソ\or ツ\or
   ネ\or ナ\or ラ\or ム\or ×\fi
}
\newcounter{kAnAc}
\newcommand\Cleariroha{\setcounter{kAnAc}{0}}
\Cleariroha

\makeatletter
\newcommand{\iroha}[1][]{%
  \if\relax\detokenize{#1}\relax
    % no optional argument
    \ifmeasuring@\else\stepcounter{kAnAc}\fi
    \K@N@numbering{\value{kAnAc}}%
  \else
    \K@N@numbering{\getrefnumber{#1}}%
  \fi
}
\def\Klabel#1{\@bsphack
  \protected@write\@auxout{}%
         {\string\newlabel{#1}{{\the\kAnAc}{\thepage}}}%
  \@esphack}
\makeatother

\newcommand{\utoi}[1]{\underset{\iroha}{\underline{#1}}}

\begin{document}

$\utoi{3}$, $\utoi{5}$
\Cleariroha
\begin{align*}
    y&=\utoi{a}x+\utoi{b}\\
    &=\utoi{5}x+\utoi{4}
\end{align*}

\end{document}

ここに画像の説明を入力してください

関連情報