計數器錯誤僅在對齊環境中嗎?

計數器錯誤僅在對齊環境中嗎?

我目前正在為日本數學學習者製作一本教科書。然後,我製作了一個計數器宏,如下所示。

據我所知,它在正常環境中似乎運作得很好。但是一旦我將其放入對齊環境中,它將不再正常工作。我認為這是重複計算的;例如,當我使用 \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@。僅當 false 時才需要執行步進,因此在未完成測量的\utoi內部也可以工作。equation由於假名具有相同的寬度,因此這應該不是一個大問題。為了解決可能的問題,我也在情況 0 中\iroha返回了,這只發生在您這樣做並且標籤尚未解析時(在本例中返回 0)。\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}

在此輸入影像描述

相關內容