정렬 환경에서만 카운터 오류가 발생합니까?

정렬 환경에서만 카운터 오류가 발생합니까?

저는 현재 일본 수학 학습자를 위한 일종의 교과서를 만드는 작업을 하고 있습니다. 그런 다음 아래와 같이 카운터 매크로를 만들었습니다.

내가 아는 한, 일반적인 환경에서는 잘 작동하는 것 같습니다. 하지만 일단 정렬 환경에 넣으면 더 이상 올바르게 작동하지 않습니다. 나는 그것이 이중으로 계산되었다고 생각합니다. 예를 들어, \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내부에서도 동작합니다 . equationKana의 너비는 동일하므로 이는 큰 문제가 되지 않습니다. 가능한 문제를 해결하기 위해 0의 경우에도 \iroha반환 했습니다. 이는 반환을 수행 하고 레이블이 아직 해결되지 않은 경우에만 발생합니다(이 경우 0을 반환함).\iroha[label]\getrefnumber

나는 또한 끔찍한 속임수 없이 Kana의 표시에 대처할 수 있는 다른 방법을 제안합니다 \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}

여기에 이미지 설명을 입력하세요

관련 정보