
Ich arbeite derzeit an einer Art Lehrbuch für Japanisch-Mathematik-Lernende. Dann habe ich ein Zählermakro wie unten beschrieben erstellt.
Soweit ich weiß, funktioniert es in einer normalen Umgebung einwandfrei. Aber sobald ich es in eine Align-Umgebung setze, funktioniert es nicht mehr richtig. Ich glaube, es wird doppelt gezählt. Wenn ich beispielsweise \utoi dreimal verwende, beginnt es mit dem vierten Buchstaben.
Ich wäre sehr dankbar, wenn das jemand beheben könnte. Vielen Dank im Voraus.
\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}
Nur für den Fall: Um die japanische Sprache in einer TeX-Datei auszuführen, müssen Sie die folgende Datei als „latexmkrc“ erstellen.
$latex = 'uplatex';
$bibtex = 'upbibtex';
$dvipdf = 'dvipdfmx %O -o %D %S';
$makeindex = 'mendex -U %O -o %D %S';
$pdf_mode = 3;
Antwort1
Hat nichts damit zu tun, aber tun Sie es nicht. \global\newcount\kAnAc
Es ist reiner Zufall, dass \global
kein Fehler auftritt. Es macht keine Zuweisung global, die nicht bereits global ist.
AMS-Ausrichtungen werden zweimal ausgewertet, um die verschiedenen Ausrichtungsbreiten vor der endgültigen Einstellung zu messen. Das Paket speichert und stellt alle LaTeX-Zähler wieder her, um zu verhindern, dass sie doppelt hochgezählt werden. Dies geschieht jedoch nicht mit Zählern niedrigerer Ebene, die mit zugewiesen wurden \newcount
.
So können Sie ersetzen
\global\newcount\kAnAc
von
\newcounter{kAnAc}
Und
\global\advance\kAnAc\@ne%
\ifcase\kAnAc
von
\stepcounter{kAnAc}%
\ifcase\value{kAnAc}%
Alternativ können Sie den Code so belassen, wie Sie ihn haben, aber nur beim Messdurchgang inkrementieren:
\ifmeasuring@
\global\advance\kAnAc\@ne
\fi
Antwort2
Bei mehrzeiligen Anzeigen brauchen Sie den Zähler nur einmal weiterzuschalten, da amsmath
zwei Durchläufe über das Material erfolgen.
Dies kann durch Prüfen erfolgen, ob \ifmeasuring@
wahr oder falsch ist. Sie müssen die Schritte nur ausführen, wenn falsch ist, sodass \utoi
es auch innerhalb funktioniert equation
, wo die Messung nicht durchgeführt wird. Da Kanas die gleiche Breite haben, sollte dies kein großes Problem sein. Um die möglichen Probleme zu beheben, habe ich auch im Fall 0 \iroha
eine Rückgabe vorgenommen, was nur geschieht, wenn Sie dies tun und das Label noch nicht aufgelöst wurde (in diesem Fall wird 0 zurückgegeben).イ
\iroha[label]
\getrefnumber
Ich schlage auch eine andere Möglichkeit vor, mit der Anzeige von Kanas ohne den schrecklichen \batchmode
Trick zurechtzukommen.
\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}