
В настоящее время я работаю над созданием своего рода учебника для японских изучающих математику. Затем я сделал макрос-счетчик, как показано ниже.
Насколько я знаю, в обычной среде это работает нормально. Но как только я помещаю его в среду align, он больше не будет работать правильно. Я думаю, что это двойной подсчет; например, когда я использую \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@
является ли значение true или false. Вам нужно выполнять шаг только при false, поэтому это \utoi
будет работать и внутри equation
, где измерение не выполняется. Поскольку у Kana одинаковая ширина, это не должно быть большой проблемой. Чтобы исправить возможные проблемы, я сделал \iroha
return イ
также в случае 0, что происходит только тогда, когда вы это делаете \iroha[label]
, а метка еще не была разрешена (в этом случае \getrefnumber
возвращается 0).
Я также предлагаю другой способ справиться с отображением Каны, не прибегая к этому ужасному \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}