Re: align環境を使うとカウンタ値がグループ外に漏れる

名前: Dora
日時: 2010-07-09 13:52:15
IPアドレス: 61.123.195.*

>>55071 北見様 ご教示ありがとうございます。 お陰様で原因が理解できました。 とりあえず,次のような対策を講じてみました。 amsmath.sty の \measure@ の定義において,\vbox 内に展開する前後でカウンタ値を保持するために, \savecounters@,\restorecounters@ を使って,グローバルな形でカウンタ値を保存・書き戻しが行われていますが, \savecounters@,\restorecounters@ を使わず,\vbox に展開する際にだけ \stepcounter をはじめとする LaTeXカウンタ操作系命令の定義を変更して,\vbox 内に展開後,自動的にカウンタ値が元通りに復元されるようにしてみました。 \documentclass{article} \usepackage{amsmath} \usepackage{calc} \makeatletter %%% LaTeXカウンタ操作系命令のローカル版 %%%( calc.sty での定義から \global を除いたもの) \def\localsetcounter#1#2{\@ifundefined{c@#1}{\@nocounterr{#1}}% {\calc@assign@count{\csname c@#1\endcsname}{#2}}} \def\localaddtocounter#1#2{\@ifundefined{c@#1}{\@nocounterr{#1}}% {\calc@assign@count{\advance\csname c@#1\endcsname}{#2}}} \def\localstepcounter#1{% \iffirstchoice@ \localaddtocounter{#1}\@ne \begingroup \let\@elt\@stpelt \csname cl@#1\endcsname \endgroup \fi } \def\localrefstepcounter#1{\localstepcounter{#1}% \protected@edef\@currentlabel {\csname p@#1\endcsname\csname the#1\endcsname}% } %%% LaTeXカウンタ操作を一時的にローカル化する環境 \newenvironment{localizecounters}{% \let\setcounter\localsetcounter \let\stepcounter\localstepcounter \let\refstepcounter\localrefstepcounter \let\addtocounter\localaddtocounter }{} %%% amsmath.sty の \measure@ の定義を, %%% \savecounters@,\restorecounters@ の代わりに %%% localizecounters 環境に包むことで代用する形に再定義する \def\measure@#1{% \begingroup \measuring@true \global\eqnshift@\z@ \global\alignsep@\z@ \global\let\tag@lengths\@empty \global\let\field@lengths\@empty % \savecounters@ \begin{localizecounters}% \global\setbox0\vbox{% \let\math@cr@@@\math@cr@@@align@measure \everycr{\noalign{\global\tag@false \global\let\raise@tag\@empty \global\column@\z@}}% \let\label\@gobble \global\row@\z@ \tabskip\z@ \halign{\span\align@preamble\crcr #1% \math@cr@@@ \global\column@\z@ \add@amps\maxfields@\cr }% }% % \restorecounters@ \end{localizecounters}% \ifodd\maxfields@ \global\advance\maxfields@\@ne \fi \ifnum\xatlevel@=\tw@ \ifnum\maxfields@<\thr@@ \let\xatlevel@\z@ \fi \fi \setbox\z@\vbox{% \unvbox\z@ \unpenalty \global\setbox\@ne\lastbox }% \global\totwidth@\wd\@ne \if@fleqn \global\advance\totwidth@\@mathmargin \fi \global\let\maxcolumn@widths\@empty \begingroup \let\or\relax \loop \global\setbox\@ne\hbox{% \unhbox\@ne \unskip \global\setbox\thr@@\lastbox }% \ifhbox\thr@@ \xdef\maxcolumn@widths{ \or \the\wd\thr@@ \maxcolumn@widths}% \repeat \endgroup \dimen@\displaywidth \advance\dimen@-\totwidth@ \ifcase\xatlevel@ \global\alignsep@\z@ \let\minalignsep\z@ \@tempcntb\z@ \if@fleqn \@tempcnta\@ne \global\eqnshift@\@mathmargin \else \@tempcnta\tw@ \global\eqnshift@\dimen@ \global\divide\eqnshift@\@tempcnta \fi \or \@tempcntb\maxfields@ \divide\@tempcntb\tw@ \@tempcnta\@tempcntb \advance\@tempcntb\m@ne \if@fleqn \global\eqnshift@\@mathmargin \global\alignsep@\dimen@ \global\divide\alignsep@\@tempcnta \else \global\advance\@tempcnta\@ne \global\eqnshift@\dimen@ \global\divide\eqnshift@\@tempcnta \global\alignsep@\eqnshift@ \fi \or \@tempcntb\maxfields@ \divide\@tempcntb\tw@ \global\advance\@tempcntb\m@ne \global\@tempcnta\@tempcntb \global\eqnshift@\z@ \global\alignsep@\dimen@ \if@fleqn \global\advance\alignsep@\@mathmargin\relax \fi \global\divide\alignsep@\@tempcntb \fi \ifdim\alignsep@<\minalignsep\relax \global\alignsep@\minalignsep\relax \ifdim\eqnshift@>\z@ \if@fleqn\else \global\eqnshift@\displaywidth \global\advance\eqnshift@-\totwidth@ \global\advance\eqnshift@-\@tempcntb\alignsep@ \global\divide\eqnshift@\tw@ \fi \fi \fi \ifdim\eqnshift@<\z@ \global\eqnshift@\z@ \fi \calc@shift@align \global\tagshift@\totwidth@ \global\advance\tagshift@\@tempcntb\alignsep@ \if@fleqn \ifnum\xatlevel@=\tw@ \global\advance\tagshift@-\@mathmargin\relax \fi \else \global\advance\tagshift@\eqnshift@ \fi \iftagsleft@ \else \global\advance\tagshift@-\displaywidth \fi \dimen@\minalignsep\relax \global\advance\totwidth@\@tempcntb\dimen@ \ifdim\totwidth@>\displaywidth \global\let\displaywidth@\totwidth@ \else \global\let\displaywidth@\displaywidth \fi \endgroup } \begin{document} \newcount\hoge \newcounter{fuga} \count8=0 \hoge=0 \c@fuga=0 \the\count8,\the\hoge,\the\c@fuga % => 0,0,0 \bgroup \advance\count8 by5 \advance\hoge by5 \advance\c@fuga by5 \the\count8,\the\hoge,\the\c@fuga % => 5,5,5 \begin{align} % align環境を使用しても a \end{align} \egroup \the\count8,\the\hoge,\the\c@fuga % => 0,0,0 % \c@fuga の値がグループ外に漏れない \end{document}

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます。適宜改行を入れてください)