
我目前正在為日本數學學習者製作一本教科書。然後,我製作了一個計數器宏,如下所示。
據我所知,它在正常環境中似乎運作得很好。但是一旦我將其放入對齊環境中,它將不再正常工作。我認為這是重複計算的;例如,當我使用 \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}