Re: フロートのオプションをマクロで指定すると無視される

名前: しっぽ愛好家
日時: 2002-08-07 11:45:39
IPアドレス: 202.224.235.*

>>9981 実は私自身も,``最初からオプションをマクロにして与える'' ことが わかっている場合には,下請けの環境を用意します. %%% トノさんのお話にもあるように,\@xfloat の類の %%% 再定義は大袈裟ですし,同時に危険です. %%% %%% そもそも,float 関係の挙動を変更するパッケージと問題なく %%% %%% 共存するか,が非常に怪しくなります… まず,\def\@fps{#2} の #2 に float のオプションが入る,というのは, マクロ定義を追いかけるとわかります.次に \@onelevel@sanitize を \@fps に適用していますが,これは \@fps の ``置換テキスト'' を文字列化 するための処理です(詳しくは後述します). さて,\@xfloat の定義の先の部分を読んでいくと, \expandafter\@tfor\expandafter\reserved@a \expandafter:\expandafter=\@fps\do... という部分があります.これは \@tfor\reserved@a:=<\@fps を展開したもの>\do... ということなので,\@fps の ``置換テキスト'' を 1 文字ずつ読んで, float のオプションの個々の文字に対応する処理 (例えば,h に対しては \@tempcnta の 1 のビットを立て, h 指定が与えられたことを記録します(*))を行います. %%% (*) なお,その後 \@tempcnta は \count\@currbox に代入されます. したがって,float のオプションが(``tbp''のような)普通の文字列である 場合には,`t',`b',`p'の各位置に配置できるものとして処理されます. 問題は,float のオプションにマクロが含まれる場合で,この場合は \@fps に \@onelevel@sanitize が適用されていることが影響します. ここに現れている \@onelevel@sanitize は, 引数を持たないマクロ \somecs に対して \@onelevel@sanitize\somecs のように用いて, ``\somecs の引数を文字列化する'' という操作を行います. 例えば,\def\somecs{\relax} のように \somecs が定義されていると, この \somecs は 1 つのコントロール・シークェンス \relax に展開されます. しかし,この \somecs に対し \@onelevel@sanitize\somecs という処理を 行うと,\somecs は ``\, r, e, l, a, x + 空白文字の 7 文字からなる文字列に 展開されるマクロ'' になるように再定義されます. %%% \def\@onelevel@sanitize#1{\edef#1{\expandafter\strip@prefix\meaning#1}} %%% \def\strip@prefix#1>{} %%% という定義と(\meaning\somecs がどのような文字列を与えるか)に基づいて %%% 実験してみてください. したがって,float のオプションを \floatoption にすると \@fps は \def\@fps{\floatoption} のように定義され,それが \@onelevel@sanitize に よってそのまま文字列化された後,\@tfor によるループ処理に用いられます. (`f',`l' のような文字は float の位置指定に関しては無視されるので, (私の思考実験が間違っていなければ)``tp''指定と同じことになるはずです.) %%% 前回の説明に比べ,あまりわかりやすくなっていないような気もしますが, %%% ご寛恕願います. いずれにせよ,\@fps に \@onelevel@sanitize を適用している, というのは \@tfor によってオプションを読み取るときに妙な誤動作を しないようにするための処置(**)なのでしょう. %%% (**) オリジナルの \@xfloat の定義の場合,float のオプションに %%% \def\someoption{AA} のように定義した \someoption を用いると %%% どのようなことになるか調べてみるとよいでしょう.

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます)