Erro de contador apenas no ambiente de alinhamento?

Erro de contador apenas no ambiente de alinhamento?

Atualmente estou trabalhando na criação de uma espécie de livro didático para alunos japoneses de matemática. Então, fiz uma macro de contador conforme abaixo.

Parece funcionar bem em ambiente normal, até onde eu sei. Mas depois de colocá-lo no ambiente de alinhamento, ele não funcionará mais corretamente. Acho que é contabilizado duas vezes; por exemplo, quando uso \utoi três vezes, ele começará na quarta letra.

Eu apreciaria muito se alguém pudesse consertar isso. Desde já, obrigado.

\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}

Por precaução: Para executar o idioma japonês no arquivo TeX, você precisa criar o seguinte arquivo como "latexmkrc"

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

Responder1

Não tem relação mas não faz \global\newcount\kAnAcé só por acaso que \globalnão dá erro ele não torna global nenhuma atribuição que já não seja global.

Os alinhamentos AMS são avaliados duas vezes, para medir as diversas larguras de alinhamento antes da configuração final. O pacote salva e restaura todos os contadores LaTeX para evitar que sejam incrementados duas vezes, mas não faz isso com contadores de nível inferior alocados com \newcount.

Então você pode substituir

\global\newcount\kAnAc

por

\newcounter{kAnAc}

e

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

por

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

Como alternativa, mantenha o código como está, mas aumente apenas na passagem de medição:

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

Responder2

É necessário avançar o contador apenas uma vez em exibições multilinhas, pois amsmathfaz duas passagens sobre o material.

Isso pode ser feito verificando se \ifmeasuring@é verdadeiro ou falso. Você precisa fazer o step somente quando for falso, então \utoifuncionaria também dentro equation, onde a medição não é feita. Como os Kana têm a mesma largura, isso não deve ser um grande problema. Para corrigir os possíveis problemas, fiz \irohareturn também no caso 0, o que só acontece quando você faz \iroha[label]e o rótulo ainda não foi resolvido (nesse caso \getrefnumberretorna 0).

Também sugiro uma maneira diferente de lidar com a exibição de Kana sem o \batchmodetruque horrível.

\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}

insira a descrição da imagem aqui

informação relacionada