\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の値は正の時には通常通りの改行される章建てになる が、 負の時には改行されずに本文が続く。