名前: 本田 日時: 2002-10-24 18:44:40 IPアドレス: 61.114.8.*
>>12257 >helvet.sty のオプションの処理 \ProcessOptionsWithKVの処理のことですよね. hyperrefの中にあったんですけどPSNFSSにも導入されてたのは知らなかったです. #どっちももともとRahzさんの作ったものですね これはパッケージを作るときには便利なマクロです. まず,keyvalを使って,<key>=<val>が使えるようにします. そのためには,keyvalの\define@keyを使います. 今回は \RequirePackage{keyval} \define@key{stxtt}{scaled}[0.95]{\def\@ttscalefactor{#1}} のようにします. \define@keyは \defin@key{<prefix>}{<key>}[<default>]{<action>} のように引数をとり,<defalut>の部分はオプションです. 内部的に\KV@<prefix>@<key>という形のマクロを生成します. オプションの<default>は 本来<key>=<val>の形で与えられるオプションが<key>だけで 与えられたときに使われて,そのときは<key>=<default>と解釈されます. <action>はその<key>=<val>が与えられたときの動作を定義して, <val>の値は<action>中で#1で参照できます. 詳細はkeyval.dtxをご覧下さい #なお,@nifty/FTEX/MES6の過去ログに #みなもさんによるkeyvalの詳細な解析があります 本体の\ProcessOptionsWithKVは引数に 上の\define@keyの<prefix>を取るようになってます. \def\ProcessOptionsWithKV#1{% \let\@tempc\relax%%%%%これは不要ですけどhelvet.styのままにしておきます. \let\stxtt@tempa\@empty \@for\CurrentOption:=\@classoptionslist\do{% \@ifundefined{KV@#1@\CurrentOption}% {}% {\edef\stxtt@tempa{\stxtt@tempa,\CurrentOption,}}% }% \edef\stxtt@tempa{% \noexpand\setkeys{#1}{% \stxtt@tempa\@ptionlist{\@currname.\@currext}% }% }% \stxtt@tempa } \ProcessOptionsWithKV{stxtt} ここでは\HV@tempaの変りに\sxtt@tempaとしました. \@classoptionslistには\documentclassのオプションが格納されています. \documentclassのオプションに<key>=<val>もしくは<key>が 記述されたときのための処理が最初の\@forです. このループは\documentclassのオプションのリストの各要素が <key>だけのときはその<key>が\define@key{<prefix>}{key}....で定義されている ときは,\stxtt@tempaに追加します. そうではないときは無視します. <key>=<val>の形のときはそのまま\stxtt@tempaに追加します. 次の\edef\stxtt@tempaによって, \RequirePackageで自分自身が読み込まれたときの オプションのリスト(\@ptionlist{\@currname.\@currext}に保存されています)を \stxtt@tempaに追加します. 結果,\stxtt@tempaは, \@setkeys{#1}{<処理される<key>=<val>または<key>のリスト引数>} となります. \@setkeysは<key>=<val>の形のリストを第二引数として 第一引数に与えられた<prefix>のもとで その<key>=<val>によって定められる<action>を実行するマクロです. 最後に\stxtt@tempaが展開されて,それで\@setkeysが展開されます. \AtEndOfPackage{% \let\@unprocessedoptions\relax } \renewcommand{\ttdefault}{stxtt} \endinput \AtEndOfPackageでやっていることは 実行されなかったオプション\@unprocessedoptionsを\relaxにすることで エラーを回避しています. 実際は,このように\ProcessOptionsを \ProcessOptionsWithKVにしてしまうと この\@unprocessedoptionsには「すべてのオプション」が残ってて, 問答無用で\RequirePackage由来の処理でエラーになってしまうので \relaxにしてしまいます. #「間違ったオプション」の検出は\@setkeysがやってくれます. あとは\DeclareFontShapeなどをot1stxtt.fdに移せば 大丈夫だと思います. ##実験してないのでタイポとかがあるかもしれませんm(_ _)m
この書き込みへの返事: