根号記号とカウンタのインクリメント

根号記号とカウンタのインクリメント

- novice alpha の投稿
返信数: 4
数式モードで根号の中身にカウンタが関与する状況です.

根号にオプション引数があって,例えば
$¥sqrt[n]{¥thea_counter¥stepcounter{a_counter}}$
となっている場合で困っています.TeX のコンパイル過程で,多重に展開されるようで,根号の前後でカウンタの値に跳躍が発生します.根号の中身の「カウンタの値とインクリメント」の登場回数で何重になるかが決まるのですが,どうも抜け出す方法が思いつかずに困っています.コントロール・シークエンスを ¥root ¥of の形で実行しても全く同一の結果になります.

根号にオプション引数がない場合はこの問題は発生しません.根号の中身を分数にしても,根号内の高さには依存しないようで,オプション引数の有無にかかわらず,カウンタの結果はやはりそのままでした.

根号のサイズを予め与えてはどうかと思い,
$¥sqrt[n]{¥makebox[2em]{$¥thea_counter¥stepcounter{a_counter}}$}$
としても,結果は不変でした.¥makebox のオプション引数の値を長くして,その中に複数回,カウンタの値表示とインクリメントを実行させても,何も変わりませんでした.

¥tracingmacros=1 として調べたのですが,どうも不慣れな私には解読不可能なようです.

どなたかお詳しい方,ご教示をお願い致します.

novice alpha への返信

Re: 根号記号とカウンタのインクリメント

- 匿 名 の投稿
\mathchoice による「4 重分岐」では,その分岐先の 4 個の数式を「あらかじめすべて処理」したうえで記憶しておく
(そして,後から実際に用いられるスタイルに対応する処理結果をはめ込む),ということが原因です
(単純にいえば,「そういう仕様」ということです).詳しくは『The TeXbook』等を参照してください.

もちろん,下のサンプルに示すような回避法はあります…… が,おそらく emath として知られるパッケージ群を用いたほうがお幸せになれるのかもしれません.

\documentclass{article}
%%% amsmath 不使用時
%\makeatletter
%\def\root#1\of{%
%  \setbox\rootbox\hbox{%
%      $\m@th\scriptscriptstyle{#1}$%
%      \@root@save@counters\expandafter}\@tempa
%  \mathpalette\r@@t}
%\def\r@@t#1#2{%
%  \setbox\z@\hbox{\@root@restore@counters $\m@th#1\sqrtsign{#2}$}%
%  \dimen@\ht\z@ \advance\dimen@-\dp\z@
%  \mkern5mu\raise.6\dimen@\copy\rootbox
%  \mkern-10mu\box\z@}
%\def\@root@save@counters{%
%  \def\@elt##1{%
%      \expandafter\ifx\csname c@##1\endcsname\c@page\else
%        \global\expandafter\noexpand\csname c@##1\endcsname
%                \number\csname c@##1\endcsname\relax
%      \fi}%
%  \edef\@tempa{\def\noexpand\@root@restore@counters{\cl@@ckpt}}}
%\makeatother

%%% amsmath 使用時
\usepackage{amsmath}
\makeatletter
\def\plainroot@#1\of#2{%
  \setbox\rootbox\hbox{%
      $\m@th\scriptscriptstyle{#1}$%
      \@root@save@counters\expandafter}\@tempa
  \mathchoice
      {\r@@t\displaystyle{#2}}%
      {\r@@t\textstyle{#2}}%
      {\r@@t\scriptstyle{#2}}%
      {\r@@t\scriptscriptstyle{#2}}%
  \egroup}
\def\r@@t#1#2{%
  \setboxz@h{\@root@restore@counters $\m@th#1\sqrtsign{#2}$}%
  \dimen@\ht\z@\advance\dimen@-\dp\z@
  \setbox\@ne\hbox{$\m@th#1\mskip\uproot@ mu$}%
  \advance\dimen@ by1.667\wd\@ne
  \mkern-\leftroot@ mu\mkern5mu\raise.6\dimen@\copy\rootbox
  \mkern-10mu\mkern\leftroot@ mu\boxz@}
\def\@root@save@counters{%
  \def\@elt##1{%
      \expandafter\ifx\csname c@##1\endcsname\c@page\else
        \global\expandafter\noexpand\csname c@##1\endcsname
                \number\csname c@##1\endcsname\relax
      \fi}%
  \edef\@tempa{\def\noexpand\@root@restore@counters{\cl@@ckpt}}}
\makeatother

%%% 実験用マクロ
\newcounter{foo}
\def\zzz{\fbox{\stepcounter{foo}\thefoo}}

\begin{document}
\section{サンプル}

$\sqrt[\uproot5 \zzz]{\zzz}$,
$\sqrt[\uproot5 \zzz]{\sqrt[\uproot5 \zzz]{\zzz}}$
and
\begin{gather}
  \sqrt{\zzz} = \sqrt[\uproot5 \zzz]{\zzz} \\
    \sqrt{\zzz\zzz}
  = \sqrt[\uproot5 \zzz]{\zzz\zzz}
\end{gather}
\end{document}
匿 名 への返信

Re: 根号記号とカウンタのインクリメント

- novice alpha の投稿
> \mathchoice による「4 重分岐」では,その分岐先の 4 個の数式を「あらかじめすべて処理」したうえで記憶しておく
> (そして,後から実際に用いられるスタイルに対応する処理結果をはめ込む),ということが原因です

¥mathchoice というのですか.無知にして知りませんでした.これで手懸りが得られました.ありがとうございます.

> (単純にいえば,「そういう仕様」ということです).

そうだろうとは思いましたが,The TeXBook でどこを探すべきか,難渋しておりました.

> 詳しくは『The TeXbook』等を参照してください.

はい,わかりました.

> もちろん,下のサンプルに示すような回避法はあります…… が,おそらく emath として知られるパッケージ群を用いたほうがお幸せになれるのかもしれません.

パッケージが便利なのは知っていますが,どうも自分の環境に余計な負担を掛けそうな気がして最低限にしていました.だからどういうパッケージがあるかなんて,無知もいいところでした.ご教示ありがとうございます.

このサンプルと,次のご返事でいただいたサンプルとでとりあえずしのごうかと考えております.

ご丁寧に教えていただき,誠にありがとうございます.

novice alpha への返信

Re: 根号記号とカウンタのインクリメント

- 匿 名 の投稿
「その場しのぎ」でよければ,次の例のように「オプションつきの \sqrt の引数中では \stepcounter を
実行しないで済むようにあらかじめ文字列化したものを用意する」という方法でもどうにかなるでしょう.

\documentclass{article}
\usepackage{amsmath}

\newcounter{foo}

\begin{document}
\section{サンプル}

$\stepcounter{foo}\edef\tempA{\arabic{foo}}%
\stepcounter{foo}\edef\tempB{\arabic{foo}}%
\sqrt[\uproot5 \fbox{\tempA}]{\fbox{\tempB}}$,
$\stepcounter{foo}\edef\tempA{\arabic{foo}}%
\stepcounter{foo}\edef\tempB{\arabic{foo}}%
\stepcounter{foo}\edef\tempC{\arabic{foo}}%
\sqrt[\uproot5 \fbox{\tempA}]{\sqrt[\uproot5 \fbox{\tempB}]{\fbox{\tempC}}}$
and
\begin{gather}
  \sqrt{\fbox{\stepcounter{foo}\arabic{foo}}}
  =
  \stepcounter{foo}\edef\tempA{\arabic{foo}}%
  \stepcounter{foo}\edef\tempB{\arabic{foo}}%
  \sqrt[\uproot5 \fbox{\tempA}]{\fbox{\tempB}}
  \\
  \sqrt{\fbox{\stepcounter{foo}\arabic{foo}}
        \fbox{\stepcounter{foo}\arabic{foo}}}
  =
  \stepcounter{foo}\edef\tempA{\arabic{foo}}%
  \stepcounter{foo}\edef\tempB{\arabic{foo}}%
  \stepcounter{foo}\edef\tempC{\arabic{foo}}%
  \sqrt[\uproot5 \fbox{\tempA}]{\sqrt[\uproot5 \fbox{\tempB}]{\fbox{\tempC}}}
\end{gather}
\end{document}
匿 名 への返信

Re: 根号記号とカウンタのインクリメント

- novice alpha の投稿
次の例のように「オプションつきの \sqrt の引数中では \stepcounter を
実行しないで済むようにあらかじめ文字列化したものを用意する」という方法でもどうにかなるでしょう.

実は私が目論んだうちの一つはこれでした.でもどうにも方法が思い浮かばず,苦労しておりました.大変勉強になります.ありがとうございます.