Ошибка счетчика только в среде выравнивания?

Ошибка счетчика только в среде выравнивания?

В настоящее время я работаю над созданием своего рода учебника для японских изучающих математику. Затем я сделал макрос-счетчик, как показано ниже.

Насколько я знаю, в обычной среде это работает нормально. Но как только я помещаю его в среду align, он больше не будет работать правильно. Я думаю, что это двойной подсчет; например, когда я использую \utoi три раза, он начнется с четвертой буквы.

Я был бы очень признателен, если бы кто-нибудь смог это исправить. Спасибо заранее.

\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 оцениваются дважды, чтобы измерить различные ширины выравнивания перед окончательной настройкой. Пакет сохраняет и восстанавливает все счетчики 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он выполняет два прохода по материалу.

Это можно сделать, проверив, \ifmeasuring@является ли значение true или false. Вам нужно выполнять шаг только при false, поэтому это \utoiбудет работать и внутри equation, где измерение не выполняется. Поскольку у Kana одинаковая ширина, это не должно быть большой проблемой. Чтобы исправить возможные проблемы, я сделал \irohareturn также в случае 0, что происходит только тогда, когда вы это делаете \iroha[label], а метка еще не была разрешена (в этом случае \getrefnumberвозвращается 0).

Я также предлагаю другой способ справиться с отображением Каны, не прибегая к этому ужасному \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}

введите описание изображения здесь

Связанный контент