[Q] マクロの基本構造について

さて,世の中には定型文書というようなものがたくさんあり,私の研究 所にもいくつかの定型文書があります.その中に組換えDNA実験申請書 というものがありまして,科研費申請の時には必ずセットで提出するこ とになります.そこでなんとかこれをマクロ化したいと思いkkh.macな どを眺めたのですが,どうにもわからないのです^^; そこで科研費マクロの仕組みを簡単に解説したようなものがあると助か るのですが,そのようなものは存在しますでしょうか.


 TeXnician をさしおいて,novice の私が follow するのも何ですが, 94年度版マクロからおいしいとこだけ頂戴して利用していますので, 御恩返しの意味で簡単に説明させていただきます.
 今年度版でいえば kkh.mac に必要なものが全部含まれているといえます. 例えば,XY, XYBC, CBOX, XYBP, PBOX, Vrule, Hrule, Hrulethick, Vrulethick などの定義の上に短く各マクロの機能が解説されています. これらが分かればたいてい何でもできそうな気がします. 最後の方にある \kinto マクロも非常に有用です. 座標を代入する変数名は \newdimen コマンドでたくさん定義されています. 上記のマクロは kkhipc.mac などいたるところで利用されていますから御覧下さい.

後必要なことは,

 1. 作りたい定型文書の箱や文字列などの(x,y)座標を変数名と対応付ける.
    必要な変数名は自分で追加する.
 2. せっせと物指しを使って座標を測り,変数に値を代入する.
 3. 相対的に決定される座標などは,\advance や \multiply を用いて次の
    例のような形式で計算する.

    \X= 12.5cm  \advance\X by 6mm

 4. 上記のマクロを利用して,線を引いたり,文字列を整形する.
以上です.
 毎年,節操もなく書式が変更されるので,科研費マクロを 維持して下さっている皆様のご苦労は大変なものと推察します. ありがとうございます.
 私が練習にと思って作ったのは今のところ出張願いの書類だけですが, それなりに出来ています.少しは,お役に立てましたでしょうか.

 src.tex の中身には,次の様な形式が多く存在します.

\def\macro{
  \submacro{xxx}{xxx}
%
  \submacro{VVV}{VVV}
%
  \submacro{yyy}{YYY}
}
 問題になるのは,\submacro の間です. パッケージの src.tex ではこの部分は注意深く「%」を用いて つぶしてあるのですが,いろいろ書き加えるうちに, この部分がいつしか空行になり,最後には全角スペースが入ったりします。 そうなると,関連のなさそうなところにエラーが急に現れ, TeX は問題なく通るのに,印刷位置がいろいろずれる,という現象が起こります.

 この様な src.tex の形式には意味があります. つまり,\macro を定義しておくことによって, この部分を何回でも呼び出せます. そのことによって,科研費マクロは完全な先読みを行い, 2ページ目の明細から1ページ目の合計を自動記入してしまうわけです.
 つまり,\macro が呼び出される環境の違い, 例えば「現在の出力ページ数」に応じて \submacro の動作が 別々に定義されているのです。

 今回問題になった、企画の研究組織では、

\def\研究組織{
\分担者{xxx}{xxx}
%
\分担者{yyy}{xxx}
%
\分担者{zzz}{xxx}
} 
となっているわけですが,「\研究組織」は2回呼ばれます.
 1回目は1ページ目の出力中に呼ばれ,その時には, 「分担者の合計人数だけを数える」というのが「\分担者」の動作です. 2回目は2ページ目出力中に呼ばれ,この時は「分担者のリストを出力」 していきます.

 さて,上の「%」の区切りの所にもし全角スペースが 入っていたらどうなるでしょう. 1回目の1ページ目の処理の時に, 分担者人数を数える他に全角スペースを出力してしまいます. そのため,1ページ目の出力で「分担者合計人数の出力」および それ以降に1ページ目で出力される内容が,全て,全角スペース1個分だけ 下にずれてしまうわけです.

 科研費マクロではすべての出力を絶対位置座標で コントロールしているのですが,TeX 自身は相対的な動きで コントロールします. したがって,科研費マクロの出力は,何かを書いたら,必ず, そのためのペンの移動量分だけ元へ戻す,というやり方を しています(この一見「無駄な」やり方には理由がありますが, ここでは省略します). そのため,マクロのコントロールの外で全角スペースを 出力されてしまったら,その分のペン位置の移動を元に戻すことはないので, それ以降のそのページの出力がずれることになります.

 以上の様な事情があるので,全角スペースを混入させるというような エラーの場所と実際に印刷のずれが発生する場所は決して対応しないわけです.



nomura@cc.kshosen.ac.jp