仅在对齐环境中计数错误?

仅在对齐环境中计数错误?

我目前正在制作一种针对日本数学学习者的教科书。然后,我制作了一个如下所示的计数器宏。

据我所知,它在正常环境下似乎工作得很好。但是一旦我把它放到对齐环境中,它就不再正常工作了。我认为它是重复计算的;例如,当我使用 \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}

在此处输入图片描述

相关内容