\section
コマンドは章建てを行うマクロで、 章番号を管理して自動
的に章番号を付けて出力する。 またこのコマンドは、 ページの一番下に章建
てが来るのを防ぐなどの多くの機能を含んでいる。 この章建ての文字の大き
さを章ごとに指定するのは大変である。
LaTeX の章建ての文字はデフォルトでは\Large\bf
で出力している。
これを普通の文字の大きさで出力したいときには次のように行う。 最初に
ART12.STYを覗いてみる。 \section
を定義しているマクロは次
のようになっている。
\def\section{\@startsection {section}{1}{\z@}{-3.5ex plus -1ex minus -.2ex}{2.3ex plus .2ex}{\Large\bf}}最後の
\Large\bf
が文字の大きさを決めているので、 このマクロを
KOHO.STYにコピーして\Large\bf
を\normalsize
に変更す
れば、章建ての文字の大きさを普通の文字の大きさに変えることができる。
また、章建ては論文誌によって大きく形の異なる書式の一つである。 を
入れる、 センタリングを行う、 あるいは\subsection
だけアンダーラ
インを引く等の書式が考えられる。
この解説の場合\section
マクロでは . はじめにの
ように§ と`.'(ピリオド)を章番号に付けている。 これは
JARTICLE.STY
中の\thssection
の定義を変更した。
しかし、大きな変更のときにはLATEX.TEX
中のマクロ定義を変更する必
要がある。 LaTeX では\@startsection
というマクロによって全ての
章建てを統括して作り上げている。 つまり、 chapter
,
section
, subsection
などのマクロはすべて
\@startsection
を用いて jart10.sty
中に定義されている。 こ
の\@startsection
はLATEX.TEX
で定義されており注釈文がある。
これより次の\@sect
マクロが\section
を作り上げていることが
わかる。
\def\@startsection#1#2#3#4#5#6{\if@noskipsec \leavevmode \fi \par \@tempskipa #4\relax \@afterindenttrue \ifdim \@tempskipa <\z@ \@tempskipa -\@tempskipa \@afterindentfalse\fi \if@nobreak \everypar{}\else \addpenalty{\@secpenalty}\addvspace{\@tempskipa}\fi \@ifstar {\@ssect{#3}{#4}{#5}{#6}}{\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} \def\@sect#1#2#3#4#5#6[#7]#8{\ifnum #2>\c@secnumdepth \def\@svsec{}\else \refstepcounter{#1}\edef\@svsec{\csname the#1\endcsname\hskip 1em }\fi \@tempskipa #5\relax \ifdim \@tempskipa>\z@ \begingroup #6\relax \@hangfrom{\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\par} \endgroup \csname #1mark\endcsname{#7}\addcontentsline {toc}{#1}{\ifnum #2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}\fi #7}\else \def\@svsechd{#6\hskip #3\@svsec #8\csname #1mark\endcsname {#7}\addcontentsline {toc}{#1}{\ifnum #2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}\fi #7}}\fi \@xsect{#5}}章建てを大きく変更するときにはこの部分を
LATEX.TEX
(5900行付近)
からコピーして変更する。
この\@sect
マクロを読むのはかなり面倒なので注釈文と対応させて読
む。 ここの注釈文は次のようになっている。
% \@sect{NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}[ARG1]{ARG2} == % BEGIN % IF LEVEL > \c@secnumdepth % THEN \@svsec :=L null % ELSE \refstepcounter{NAME} % \@svsec :=L BEGIN \theNAME END % FI % IF AFTERSKIP > 0 % THEN \begingroup % STYLE % \@hangfrom{\hskip INDENT\@svsec} % {\interlinepenalty 10000 ARG2\par} % \endgroup % \NAMEmark{ARG1} % \addcontentsline{toc}{NAME} % { IF LEVEL > \c@secnumdepth % ELSE \protect\numberline{\theNAME} FI % ARG1 } % ELSE \@svsechd == BEGIN STYLE % \hskip INDENT\@svsec % ARG2 % \NAMEmark{ARG1} % \addcontentsline{toc}{NAME} % { IF LEVEL > \c@secnumdepth % ELSE \protect\numberline{\theNAME} FI % ARG1 } % END % FI % \@xsect{AFTERSKIP} % ENDこれを読むと章建てがいろいろな処理をしていることがわかる。 それでは、 内部を変更してみよう。
レベルが1である章(jarticle書式ではsection
、 jreport書式では
chapter
)をセンタリングするときには
........ \begingroup #6\relax \@hangfrom{\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\par} \endgroup ........を次のように変更する。
........ \ifnum #2=1 \begin{center} \else \fi \begingroup #6\relax \@hangfrom{\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\par} \endgroup \ifnum #2=1 \end{center} \else \fi ........大抵のことはこの
\@sect
をコピーして変更することにより可能である。
ところで、LaTeX の\section
コマンドでは章題直後の最初の行はイン
デントされない。 しかしJLaTeX では章題直後の最初の行もインデントされ
ている。 LaTeX でインデントするように変更するには、
\ART12.STY
で
\section
を定義している所を変更する。
\def\section{\@startsection {section}{1}{\z@}{-3.5ex plus -1ex minus -.2ex}{2.3ex plus .2ex}{\Large\bf}}
\@startsection
についてはLATEX.TEX
またはART12.DOC
中の注釈文によると BEFORESKIPの値が負であればインデントされない。
そこで、
\def\section{\@startsection {section}{1}{\z@}{3.5ex plus 1ex minus .2ex}{2.3ex plus .2ex}{\Large\bf}}のように BEFORESKIPの値を正にするとインデントされる。
また、 AFTERSKIPの値は正の時には通常通りの改行される章建てになる が、 負の時には改行されずに本文が続く。