我目前正在制作一种针对日本数学学习者的教科书。然后,我制作了一个如下所示的计数器宏。
据我所知,它在正常环境下似乎工作得很好。但是一旦我把它放到对齐环境中,它就不再正常工作了。我认为它是重复计算的;例如,当我使用 \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@
是真还是假来完成。只有当为假时才需要进行步进,因此在不进行测量的情况下\utoi
也可以工作。由于假名的宽度相同,所以这应该不是什么大问题。为了解决可能的问题,我还在 0 的情况下进行了返回,这仅在您这样做并且标签尚未解析时才会发生(在这种情况下返回 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}