
私は現在、日本の数学学習者向けの一種の教科書を作成中です。そこで、以下のようなカウンターマクロを作成しました。
私の知る限り、通常の環境ではうまく動作するようです。しかし、これを align 環境に置くと、正しく動作しなくなります。二重にカウントされていると思います。たとえば、\utoi を 3 回使用すると、4 番目の文字から始まります。
どなたか修正していただけると大変助かります。よろしくお願いします。
\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 アラインメントは、最終設定の前にさまざまなアラインメント幅を測定するために 2 回評価されます。パッケージは、すべての 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
複数行表示では材料の上を 2 回通過するため、カウンターを 1 回だけ進める必要があります。
これは、が true か false かをチェックすることで実行できます\ifmeasuring@
。false の場合にのみステップ実行する必要があるため、計測が行われない\utoi
内でも機能します。カナの幅は同じなので、これは大きな問題にはならないはずです。起こり得る問題を修正するために、case 0 でもreturnを作成しました。これは、ラベルがまだ解決されていない場合にのみ発生します(この場合は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}