2018年3月23日

jlreq.cls,見出しにまつわる次のあたりはしっくりこない.どげんかせんといかん気もするが,気がしているだけでそのうち忘れそうなのでメモ.

目次

目次を作る機構.通常のarticleでは次のようになっている.

  • \sectionなど(から呼び出される\@startsection)内で\addcontentslineが呼び出される.
  • \addcontentslineは見出し文字列などの目次への追加を行うが,その際の整形は\contentslineに回される.
  • \contentslineの実態は\l@<見出し命令名>
  • article.clsなどは\l@<見出し命令名>を個別に定義する.

jlreq.clsでもこの機構を踏襲し,\l@<見出し命令名>を最終的に呼び出すようにしている(\@startsectionを使っているわけではないが).

しっくりこないのは,この\l@<見出し命令名>である.従って,目次出力をカスタマイズしたければ,\l@<見出し命令名>を再定義すればよい……のだが,@入り命令なので,基本的にいじるように考えられているわけではない.

いじれないならいじれないのでよく,jlreq.clsには\Declare***Headingという命令群があり,そこの中で\l@<見出し命令名>を定義している.ただこの\l@<見出し命令名>がきちんとできているのかが実はあまり自信がない.\l@<見出し命令名>は通常\@dottedtoclineを呼び出す.この命令の第三引数には,ラベル部分の長さを指定する.この長さを自動で取得しないとならないのだが……今ので大丈夫なんでしょーか.ユーザレベルで書き換えられるならばちょっとくらい駄目でもいいんですが,上述のようにそういう感じの作りにはなっていないので…….

目次を出力するか否か

また目次話だけど.見出し命令を書いたとしても,目次への出力が行われるとは限らない.例えばarticle.clsの場合,*付きだと出ない.もう少しややこしいのはbook.clsの\chapterで,前付内ではラベルは目次に出力されない(見出し文字列のみになる)という動きをする.book.clsでは\chapterを直接定義しているのでよいのだが,jlreq.clsとしてはあくまで\Declare***Headingという汎用命令の枠組みで押さえないとならない.

というわけで苦し紛れに,\jlreq@heading@maketoc@<命令名>という命令が見出し用命令から呼び出されるようにしてある.もちろん\Declare***Heading内でとりあえずの定義がされるし,\jlreq@heading@maketoc@chapterはクラスファイル内で再定義される.苦し紛れ感半端ねぇ…….

前付とか

book.clsには\frontmatterとか\mainmatterとかいう命令があって,jlreq.clsでもbookオプション指定時に定義される.で,前付内では,\chapterのラベルがでなかったりする.(上でも同じようなことを言っているけど,上は目次での話.こっちは実際の見出しの話.)jlreq.clsではこれを実現するために次のようにしている.

  • \frontmatterで現在の\chapter\SaveHeadingを使って保存し,\ModifyHeading{chapter}{label_format={}}を実行する.
  • \mainmatter\chapterを復帰させる.

というわけで\frontmatter\mainmatterの間で \chapterが再定義されていたらアウトである.そんなことは普通ないだろうけど…….

もやもやはするけど,まぁこれはこれでよいかなと思うし,\frontmatterとかをユーザが再定義すればいいかなと思うので(一般にこれが再定義するものだと思われてはいない気がするけど),前の二つに比べるとしっくりきてない度は低いのですが.

0 件のコメント:

コメントを投稿

コメントの追加にはサードパーティーCookieの許可が必要です