
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 \global
nã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 amsmath
faz 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 \utoi
funcionaria 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 \iroha
return イ
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 \getrefnumber
retorna 0).
Também sugiro uma maneira diferente de lidar com a exibição de Kana sem o \batchmode
truque 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}