Re: 学習の一助になれば(最後にFAQをひとつ)

名前: ut
日時: 2007-10-31 10:46:24
IPアドレス: 157.118.27.*

>>49997 # まるで神々の会話のようなハイレベルなスレッドの隙間にこのひと月 # ほど、稚拙な独り言を書き込んで参りましたが、これで最後です。 さて。これまでの一連の独り言で、一応マクロを追いかける準備は出 来たということにして、あとはひたすら、pldoc とか source2e、各種 クラスファイルの dtx ファイルなんかを、目次やコマンドインデック スを頼りに頑張って読んで行くことになるかと。 でも、そうはいっても簡単にはいきませんので、私が最初つまづいた 部分について以下ちょっとだけ書いてみます(自分がつまづいたとこ には他の方も引っ掛かるのではないかという勝手な憶測)。 取り上げるのは、ページスタイルの中で設定されている「マーク」に ついてです(ページスタイルの設定自体は、格別理解するのが難しい とかいうわけじゃなかったのですけど、\sectionmark とかが最初よく 分かりませんでした)。 それで結局、次の記事を読むことで、(一応初級ユーザーレベルとし ては)理解することが出来ました: Dag F. Langmyhr, How to make your own document style in LaTeX2e, MAPS#13 (94.2); Nov 1994, pp. 65--72. まずはこの記事からページスタイルについて書かれた部分を引用します: ----- ここから引用 ------------------------------------------- ========================= 6.1 Designing page styles ========================= LaTeX uses the four macroes \@evenhead, \@oddhead, \@evenfoot and \@oddfoot to obtain the page header and footer for a left-hand and right-hand page (*7). A call on a page style such as \pagestyle{plain} is just a different notation for calling the macro \ps@plain which defines \@evenhead etc (*8). To define a new pagestyle xxx, one must supply the \ps@xxx macro with the necessary definitions. Sometimes the header or footer contains the name of the chapter or section found on the page. This is done in three steps: (1) The macro \chapter always calls \chaptermark with the chapter title as parameter (*9). Similarly, \section calls \sectionmark, etc. (2) \chaptermark, \sectionmark, etc., define the appearance of the running title by calling \markboth or \markright. Each pagestyle defines its own \chaptermark and \sectionmark (and other \...mark if necessary). (3) The running title is then available in \leftmark and \rightmark for use in \@evenhead or one of the others. If there have been several calls on \markboth or \markright on that page, the first one of these will be given. 〔中略〕 Another thing to remember is that some commands like \chapter contain a call on \thispagestyle{plain}. This implies that if one wants to modify the appearance of the first page of a chapter, one must either rewrite \chapter or redefine the plain pagestyle.〔以下略〕 *7 If the document does not use the twoside option, all pages are regarded as odd-numbered. *8 Calling \thispagestyle is a little more complex, but that is handled by the LaTeX kernel. *9 If \chapter is used with an optional argument, that optional argument is passed on to \chaptermark rather than the main one. ----- 引用終わり ------------------------------------------- (1) から (3) の箇条書きになっている部分(のみ)を以下ちょっと 敷衍します〔とりあえず book.cls と仮定〕。 まず、(1) にありますように、\chapter や \section は内部で \chaptermark や \sectionmark というマクロを呼び出していて、それに、\chapter や \section の *オプション引数が* 渡されます(オプション引数を指定 していない場合は、必須引数がオプション引数にコピーされます)。 \chapter の場合は、その``*''ナシの場合を受け持っている \@chapter の定義中に、   \def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne      %…中略…      \chaptermark{#1}%   %…中略…} という部分があり、\section 以下の章建てコマンドはその汎用形の \@startsection の中で``*''ナシの場合を受け持っている \@sect の 定義中に、   \def\@sect#1#2#3#4#5#6[#7]#8{%      %…中略…      \csname #1mark\endcsname{#7}%      %…中略…} という部分があるからです。 # どちらも \...mark には [ ] の中身(つまりオプション引数)が # 渡されるようになっているのがまたちょっと、我々初級ユーザーを # 惑わせるのですが、これについては、\secdef や \@dblarg という # マクロについて調べてみてください。 # あと、\csname ... \endcsname についても調べないといけないですね…。 んで、これらは一旦、引数を 1 個とってただ飲み込むだけに初期化 されます:   \newcommand*\chaptermark[1]{}; \let\sectionmark\@gobble, etc. 次に (2) についてですが、実際に \chaptermark や \sectionmark 等々がちゃんと定義されるのは、ページスタイルの設定の中でという ことになり、その際 \markboth や \markright を使っています。 両面印刷の場合の ps@headings の定義を見ますと:   \def\ps@headings{%     %…中略…   \def\chaptermark##1{%   \markboth {\MakeUppercase{%     %…中略…    \@chapapp\ \thechapter. \ %     %…中略…   ##1}}{}}%   \def\sectionmark##1{%   \markright {\MakeUppercase{%     %…中略…    \thesection. \ %     %…中略…   ##1}}}} となっています。\ps@headings の中身だけを取り出して整形し直 して、もっと見易くしてみますと:   \def\chaptermark#1{\markboth{\MakeUppercase{\@chapapp\ \thechapter. \ #1}}{ }}%   \def\sectionmark#1{\markright{\MakeUppercase{\thesection. \ #1}}} ってことです。つまり、\chapter コマンドで \chaptermark に渡さ れた引数は、\markboth の左の引数に渡され(ここが``\leftmark'' になる)、(右の引数は空なので \markboth での``rightmark''はナシ)、 \section コマンドで \sectionmark に渡された引数は、\markright の引数に渡される(ここが``rightmark''に)というわけです。 # \MakeUppercase, \@chapapp, \thechapter, \thesection は分か # りますよね。 最後に (3) にありますように、上記 (1), (2) のようにして得られ た \leftmark と \rightmark とをページスタイルの設定の中の \@oddhead, \@oddfoot, \@evenhead, \@evenfoot で使うわけです。例えば上の \ps@headings で「…中略…」とした最初の部分は次のようになって います:   \def\ps@headings{%    \let\@oddfoot\@empty\let\@evenfoot\@empty    \def\@evenhead{\thepage\hfil\slshape\leftmark}%    \def\@oddhead{{\slshape\rightmark}\hfil\thepage}%      % 以下略} うーん、これをマクロを追っかけて理解するのはスゴイ大変(以上 の説明で本当に正しいのかどうか、実は確証はないのですけど〔ス ミマセン〕、大体こんな感じなんじゃないのかなぁ)。 # ・参考: >>13656, >>19619 ## ================== ## 学習の一助になれば ## ================== ##  ・第一弾 どこに定義が書いてあるのか >>49575, >>49590; >>49660 ##  ・第二弾 お勧めのレファレンス >>49631 ##  ・第三弾 米英蘭ユーザーグループ会報記事 >>49776 ##  ・第四弾 ``@''は「at」じゃなくて「of」と読むといいかも >>49861 ##  ・第五弾 入門から初級への道(第一弾の焼き直し) >>49997 ##  ・第六弾 よく迷うところをひとつだけ >>この書き込み ### 以上、大変長々と失礼いたしました。いつか私が中級になれる ### 日が来ましたら、また書き込みをさせていただくかも知れませ ### ん。それまではまた、ROM に徹します。それでは〜 (^_^)/~~ # 訂正 1: 最初の書き込み(>>49575) # #〔誤〕 # >(1a) は (1b) の元となったものです(多分)。(1a) の中身(+ lplain.tex # >とか lfont.tex 等々 = LaTeX2.09)を各種の dtx ファイルへと切 # >り分けて… # #〔正(かな?)〕 # LaTeX2.09=lplain.tex=hyphen.tex+lfonts.tex+latex.tex # 訂正 2: 前回の書き込み(>>49997) # #〔誤〕 # >(B3) plcore.ltx # #〔正(かな?)〕 # (B3) platex.ltx (=latex.ltx+plcore.ltx) [EOF]

この書き込みへの返事:

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