
Actualmente estoy trabajando en hacer una especie de libro de texto para estudiantes japoneses de matemáticas. Luego, hice una macro de contador como se muestra a continuación.
Hasta donde yo sé, parece funcionar bien en un entorno normal. Pero una vez que lo pongo en el entorno de alineación, ya no funcionará correctamente. Creo que se cuenta dos veces; por ejemplo, cuando uso \utoi tres veces, comenzará desde la cuarta letra.
Le agradecería mucho si alguien pudiera arreglarlo. Gracias de antemano.
\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 si acaso: para ejecutar el idioma japonés en un archivo TeX, debe crear el siguiente archivo como "latexmkrc".
$latex = 'uplatex';
$bibtex = 'upbibtex';
$dvipdf = 'dvipdfmx %O -o %D %S';
$makeindex = 'mendex -U %O -o %D %S';
$pdf_mode = 3;
Respuesta1
No está relacionado, pero no lo hagas, \global\newcount\kAnAc
es solo por casualidad que \global
no da un error, no hace que ninguna asignación sea global que no lo sea ya.
Las alineaciones AMS se evalúan dos veces para medir los distintos anchos de alineación antes del ajuste final. El paquete guarda y restaura todos los contadores de LaTeX para evitar que se incrementen dos veces, pero no hace esto con los contadores de nivel inferior asignados con \newcount
.
Entonces puedes reemplazar
\global\newcount\kAnAc
por
\newcounter{kAnAc}
y
\global\advance\kAnAc\@ne%
\ifcase\kAnAc
por
\stepcounter{kAnAc}%
\ifcase\value{kAnAc}%
Alternativamente, mantenga el código tal como lo tiene, pero increméntelo solo en la pasada de medición:
\ifmeasuring@
\global\advance\kAnAc\@ne
\fi
Respuesta2
Es necesario avanzar el contador sólo una vez en visualizaciones multilínea, ya que amsmath
hace dos pasadas sobre el material.
Esto se puede hacer comprobando si \ifmeasuring@
es verdadero o falso. Debe realizar los pasos solo cuando sea falso, por lo que \utoi
también funcionaría en el interior equation
, donde no se realiza la medición. Dado que los Kana tienen el mismo ancho, esto no debería ser un gran problema. Para solucionar los posibles problemas, hice \iroha
devolución イ
también en el caso 0, lo que sólo ocurre cuando lo haces \iroha[label]
y la etiqueta aún no se ha resuelto (en este caso \getrefnumber
devuelve 0).
También sugiero una forma diferente de afrontar la exhibición de Kana sin el horrible \batchmode
truco.
\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}