ムニャムニャ……。
\bxjs@label@sect 節付#1の番号を出力する。節付XXXに対して、\labelXXXが定義済ならそれが出力書式 を表す。未定義ならばカウンタの出力書式\theXXXが使われる。
1864\def\bxjs@label@sect#1{%
1865 \expandafter\ifx\csname label#1\endcsname\relax
1866 \csname the#1\endcsname
1867 \else \csname label#1\endcsname
1868 \fi}
1869\def\@seccntformat#1{\bxjs@label@sect{#1}\quad}
\@secapp 節番号の接頭辞。
\@secpos 節番号の接尾辞。
69
1870\ifnum\bxjs@label@section=\bxjs@label@section@compat\else
1871\def\@secapp{\presectionname}
1872\def\@secpos{\postsectionname}
1873\fi
\labelsection 節番号の出力書式。
1874\ifnum\bxjs@label@section=\bxjs@label@section@modern
1875\def\labelsection{\@secapp\thesection\@secpos}
1876\fi
■構成要素 \@startsectionマクロは6個の必須引数と,オプションとして*と1個の オプション引数と1個の必須引数をとります。
\@startsection{名}{レベル}{字下げ}{前アキ}{後アキ}{スタイル}
*[別見出し]{見出し}
それぞれの引数の意味は次の通りです。
名 ユーザレベルコマンドの名前です(例: section)。
レベル 見 出 し の 深 さ を 示 す 数 値 で す (chapter=1, section=2, …)。 こ の 数 値 が secnumdepth 以下のとき見出し番号を出力します。
字下げ 見出しの字下げ量です。
前アキ この値の絶対値が見出し上側の空きです。負の場合は,見出し直後の段落をインデ ントしません。
後アキ 正の場合は,見出しの下の空きです。負の場合は,絶対値が見出しの右の空きです
(見出しと同じ行から本文を始めます)。 スタイル 見出しの文字スタイルの設定です。
* この*印がないと,見出し番号を付け,見出し番号のカウンタに1を加算します。
別見出し 目次や柱に出力する見出しです。
見出し 見出しです。
見出しの命令は通常\@startsectionとその最初の6個の引数として定義されます。
次 は \@startsection の 定 義 で す。 情 報 処 理 学 会 論 文 誌 ス タ イ ル フ ァ イ ル
(ipsjcommon.sty)を参考にさせていただきましたが,完全に行送りが \baselineskip の整数倍にならなくてもいいから前の行と重ならないようにしました。
1877\def\@startsection#1#2#3#4#5#6{%
1878 \if@noskipsec \leavevmode \fi
1879 \par
1880% 見出し上の空きを \@tempskipa にセットする
1881 \@tempskipa #4\relax
1882% \@afterindent は見出し直後の段落を字下げするかどうかを表すスイッチ 1883 \if@english \@afterindentfalse \else \@afterindenttrue \fi
1884% 見出し上の空きが負なら見出し直後の段落を字下げしない 1885 \ifdim \@tempskipa <\z@
1886 \@tempskipa -\@tempskipa \@afterindentfalse
1887 \fi
1888 \if@nobreak
1889% \everypar{\everyparhook}% これは間違い 1890 \everypar{}%
1891 \else
1892 \addpenalty\@secpenalty
1893% 次の行は削除
1894% \addvspace\@tempskipa
1895% 次の \noindent まで追加
1896 \ifdim \@tempskipa >\z@
1897 \if@slide\else
1898 \null
1899 \vspace*{-\baselineskip}%
1900 \fi
1901 \vskip\@tempskipa
1902 \fi
1903 \fi
1904 \noindent
1905% 追加終わり 1906 \@ifstar
1907 {\@ssect{#3}{#4}{#5}{#6}}%
1908 {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
\@sectと\@xsectは,前のアキがちょうどゼロの場合にもうまくいくように,多少変え てあります。\everyparhookも挿入しています。
\everyparhookの挿入はeveryparhook=compatの時のみ行う。
\bxjs@if@ceph everyparhook=compatである場合にのみ直後のトークンを実行する。
1909\ifnum\bxjs@everyparhook=\bxjs@everyparhook@compat
1910 \let\bxjs@if@ceph\@firstofone
1911\else \let\bxjs@if@ceph\@gobble
1912\fi
1913\def\@sect#1#2#3#4#5#6[#7]#8{%
1914 \ifnum #2>\c@secnumdepth
1915 \let\@svsec\@empty
1916 \else
1917 \refstepcounter{#1}%
1918 \protected@edef\@svsec{\@seccntformat{#1}\relax}%
1919 \fi
1920% 見出し後の空きを \@tempskipa にセット 1921 \@tempskipa #5\relax
1922% 条件判断の順序を入れ換えました 1923 \ifdim \@tempskipa<\z@
1924 \def\@svsechd{%
1925 #6{\hskip #3\relax
71
1926 \@svsec #8}%
1927 \csname #1mark\endcsname{#7}%
1928 \addcontentsline{toc}{#1}{%
1929 \ifnum #2>\c@secnumdepth \else
1930 \protect\numberline{\bxjs@label@sect{#1}}%
1931 \fi
1932 #7}}% 目次にフルネームを載せるなら #8
1933 \else
1934 \begingroup
1935 \interlinepenalty \@M % 下から移動
1936 #6{%
1937 \@hangfrom{\hskip #3\relax\@svsec}%
1938% \interlinepenalty \@M % 上に移動 1939 #8\@@par}%
1940 \endgroup
1941 \csname #1mark\endcsname{#7}%
1942 \addcontentsline{toc}{#1}{%
1943 \ifnum #2>\c@secnumdepth \else
1944 \protect\numberline{\bxjs@label@sect{#1}}%
1945 \fi
1946 #7}% 目次にフルネームを載せるならここは #8
1947 \fi
1948 \@xsect{#5}}
二つ挿入した \everyparhookのうち後者が \paragraph 類の後で2回実行され,それ 以降は前者が実行されます。
[2016-07-28]slideオプションとtwocolumnオプションを同時に指定した場合の罫線の 位置を微調整しました。
1949\def\@xsect#1{%
1950% 見出しの後ろの空きを \@tempskipa にセット
1951 \@tempskipa #1\relax
1952% 条件判断の順序を変えました 1953 \ifdim \@tempskipa<\z@
1954 \@nobreakfalse
1955 \global\@noskipsectrue
1956 \everypar{%
1957 \if@noskipsec
1958 \global\@noskipsecfalse
1959 {\setbox\z@\lastbox}%
1960 \clubpenalty\@M
1961 \begingroup \@svsechd \endgroup
1962 \unskip
1963 \@tempskipa #1\relax
1964 \hskip -\@tempskipa
1965 \else
1966 \clubpenalty \@clubpenalty
1967 \everypar\expandafter{\bxjs@if@ceph\everyparhook}%
1968 \fi\bxjs@if@ceph\everyparhook}%
1969 \else
1970 \par \nobreak
1971 \vskip \@tempskipa
1972 \@afterheading
1973 \fi
1974 \if@slide
1975 {\vskip\if@twocolumn-5\jsc@mpt\else-6\jsc@mpt\fi
1976 \maybeblue\hrule height0\jsc@mpt depth1\jsc@mpt
1977 \vskip\if@twocolumn 4\jsc@mpt\else 7\jsc@mpt\fi\relax}%
1978 \fi
1979 \par % 2000-12-18
1980 \ignorespaces}
1981\def\@ssect#1#2#3#4#5{%
1982 \@tempskipa #3\relax
1983 \ifdim \@tempskipa<\z@
1984 \def\@svsechd{#4{\hskip #1\relax #5}}%
1985 \else
1986 \begingroup
1987 #4{%
1988 \@hangfrom{\hskip #1}%
1989 \interlinepenalty \@M #5\@@par}%
1990 \endgroup
1991 \fi
1992 \@xsect{#3}}
■柱関係の命令
\chaptermark
\sectionmark
\subsectionmark
\subsubsectionmark
\paragraphmark
\subparagraphmark
\...markの形の命令を初期化します(第7節参照)。\chaptermark 以外はLATEX本体で 定義済みです。
1993\newcommand*\chaptermark[1]{}
1994% \newcommand*{\sectionmark}[1]{}
1995% \newcommand*{\subsectionmark}[1]{}
1996% \newcommand*{\subsubsectionmark}[1]{}
1997% \newcommand*{\paragraphmark}[1]{}
1998% \newcommand*{\subparagraphmark}[1]{}
■カウンタの定義
\c@secnumdepth secnumdepthは第何レベルの見出しまで番号を付けるかを決めるカウンタです。
1999%<!book&!report>\setcounter{secnumdepth}{3}
2000%<book|report>\setcounter{secnumdepth}{2}
\c@chapter
\c@section
\c@subsection
\c@subsubsection
\c@paragraph
\c@subparagraph
見出し番号のカウンタです。\newcounterの第1引数が新たに作るカウンタです。これは 第2引数が増加するたびに0に戻されます。第2引数は定義済みのカウンタです。
2001\newcounter{part}
2002%<book|report>\newcounter{chapter}
2003%<book|report>\newcounter{section}[chapter]
2004%<!book&!report>\newcounter{section}
73
2005\newcounter{subsection}[section]
2006\newcounter{subsubsection}[subsection]
2007\newcounter{paragraph}[subsubsection]
2008\newcounter{subparagraph}[paragraph]
\thepart
\thechapter
\thesection
\thesubsection
\thesubsubsection
\theparagraph
\thesubparagraph
カウンタの値を出力する命令\the何々を定義します。
カウンタを出力するコマンドには次のものがあります。
\arabic{COUNTER} 1, 2, 3, …
\roman{COUNTER} i, ii, iii, …
\Roman{COUNTER} I, II, III, …
\alph{COUNTER} a, b, c, …
\Alph{COUNTER} A, B, C, …
\kansuji{COUNTER} 一,二,三, …
以下ではスペース節約のため@の付いた内部表現を多用しています。
2009\renewcommand{\thepart}{\@Roman\c@part}
2010%<*!book&!report>
2011\ifnum\bxjs@label@section=\bxjs@label@section@compat
2012\renewcommand{\thesection}{\presectionname\@arabic\c@section\postsectionname}
2013\renewcommand{\thesubsection}{\@arabic\c@section.\@arabic\c@subsection}
2014\else
2015\renewcommand{\thesection}{\@arabic\c@section}
2016\renewcommand{\thesubsection}{\thesection.\@arabic\c@subsection}
2017\fi
2018%</!book&!report>
2019%<*book|report>
2020\renewcommand{\thechapter}{\@arabic\c@chapter}
2021\renewcommand{\thesection}{\thechapter.\@arabic\c@section}
2022\renewcommand{\thesubsection}{\thesection.\@arabic\c@subsection}
2023%</book|report>
2024\renewcommand{\thesubsubsection}{%
2025 \thesubsection.\@arabic\c@subsubsection}
2026\renewcommand{\theparagraph}{%
2027 \thesubsubsection.\@arabic\c@paragraph}
2028\renewcommand{\thesubparagraph}{%
2029 \theparagraph.\@arabic\c@subparagraph}
\@chapapp
\@chappos
\@chapappの初期値は \prechaptername(第)です。
\@chapposの初期値は\postchaptername(章)です。
\appendixは\@chapappを\appendixnameに,\@chapposを空に再定義します。
[2003-03-02]\@secappは外しました。
2030%<book|report>\newcommand{\@chapapp}{\prechaptername}
2031%<book|report>\newcommand{\@chappos}{\postchaptername}
■前付,本文,後付 本のうち章番号があるのが「本文」,それ以外が「前付」「後付」です。
\frontmatter ページ番号をローマ数字にし,章番号を付けないようにします。
[2017-03-05]\frontmatterと\mainmatter の2つの命令は,改丁または改ページした 後で\pagenumbering{...}でノンブルを1にリセットします。長い間\frontmatterは
openanyのときに単なる改ページとしていましたが,これではノンブルをリセットする際に
偶奇逆転が起こる場合がありました。openanyかどうかに依らず奇数ページまで繰るように 修正することで,問題を解消しました。実は,LATEXの標準クラスでは1998年に修正され ていた問題です(コミュニティ版pLATEXの標準クラス2017/03/05も参照)。
2032%<*book|report>
2033\newcommand\frontmatter{%
2034 \pltx@cleartooddpage
2035 \@mainmatterfalse
2036 \pagenumbering{roman}}
\mainmatter ページ番号を算用数字にし,章番号を付けるようにします。
2037\newcommand\mainmatter{%
2038 \pltx@cleartooddpage
2039 \@mainmattertrue
2040 \pagenumbering{arabic}}
\backmatter 章番号を付けないようにします。ページ番号の付け方は変わりません。
2041\newcommand\backmatter{%
2042 \if@openleft
2043 \cleardoublepage
2044 \else\if@openright
2045 \cleardoublepage
2046 \else
2047 \clearpage
2048 \fi\fi
2049 \@mainmatterfalse}
2050%</book|report>
■部
\part 新しい部を始めます。
\secdefを使って見出しを定義しています。このマクロは二つの引数をとります。
\secdef{星なし}{星あり} 星なし *のない形の定義です。
星あり *のある形の定義です。
\secdefは次のようにして使います。
\def\chapter { ... \secdef \CMDA \CMDB }
\def\CMDA [#1]#2{....} % \chapter[...]{...} の定義
\def\CMDB #1{....} % \chapter*{...} の定義 まずbook とreport のクラス以外です。
75
2051%<*!book&!report>
2052\newcommand\part{%
2053 \if@noskipsec \leavevmode \fi
2054 \par
2055 \addvspace{4ex}%
2056 \if@english \@afterindentfalse \else \@afterindenttrue \fi
2057 \secdef\@part\@spart}
2058%</!book&!report>
bookおよび reportクラスの場合は,少し複雑です。
2059%<*book|report>
2060\newcommand\part{%
2061 \if@openleft
2062 \cleardoublepage
2063 \else\if@openright
2064 \cleardoublepage
2065 \else
2066 \clearpage
2067 \fi\fi
2068 \thispagestyle{empty}% 欧文用標準スタイルでは plain
2069 \if@twocolumn
2070 \onecolumn
2071 \@restonecoltrue
2072 \else
2073 \@restonecolfalse
2074 \fi
2075 \null\vfil
2076 \secdef\@part\@spart}
2077%</book|report>
\@part 部の見出しを出力します。\bfseriesを\headfontに変えました。
bookおよびreport クラス以外ではsecnumdepthが−1 より大きいとき部番号を付け ます。
2078%<*!book&!report>
2079\def\@part[#1]#2{%
2080 \ifnum \c@secnumdepth >\m@ne
2081 \refstepcounter{part}%
2082 \addcontentsline{toc}{part}{%
2083 \prepartname\thepart\postpartname\hspace{1\jsZw}#1}%
2084 \else
2085 \addcontentsline{toc}{part}{#1}%
2086 \fi
2087 \markboth{}{}%
2088 {\parindent\z@
2089 \raggedright
2090 \interlinepenalty \@M
2091 \normalfont
2092 \ifnum \c@secnumdepth >\m@ne
2093 \Large\headfont\prepartname\thepart\postpartname
2094 \par\nobreak
2095 \fi
2096 \huge \headfont #2%
2097 \markboth{}{}\par}%
2098 \nobreak
2099 \vskip 3ex
2100 \@afterheading}
2101%</!book&!report>
bookおよびreportクラスではsecnumdepthが−2より大きいとき部番号を付けます。
2102%<*book|report>
2103\def\@part[#1]#2{%
2104 \ifnum \c@secnumdepth >-2\relax
2105 \refstepcounter{part}%
2106 \addcontentsline{toc}{part}{%
2107 \prepartname\thepart\postpartname\hspace{1\jsZw}#1}%
2108 \else
2109 \addcontentsline{toc}{part}{#1}%
2110 \fi
2111 \markboth{}{}%
2112 {\centering
2113 \interlinepenalty \@M
2114 \normalfont
2115 \ifnum \c@secnumdepth >-2\relax
2116 \huge\headfont \prepartname\thepart\postpartname
2117 \par\vskip20\p@?
2118 \fi
2119 \Huge \headfont #2\par}%
2120 \@endpart}
2121%</book|report>
\@spart 番号を付けない部です。
2122%<*!book&!report>
2123\def\@spart#1{{%
2124 \parindent \z@ \raggedright
2125 \interlinepenalty \@M
2126 \normalfont
2127 \huge \headfont #1\par}%
2128 \nobreak
2129 \vskip 3ex
2130 \@afterheading}
2131%</!book&!report>
2132%<*book|report>
2133\def\@spart#1{{%
2134 \centering
2135 \interlinepenalty \@M
2136 \normalfont
2137 \Huge \headfont #1\par}%
2138 \@endpart}
77
2139%</book|report>
\@endpart \@partと\@spartの最後で実行されるマクロです。両面印刷のときは白ページを追加しま
す。二段組のときには,二段組に戻します。
[2016-12-13]openanyのときには白ページが追加されるのは変なので,その場合は追加し
ないようにしました。このバグはLATEXではclasses.dtx v1.4b (2000/05/19)で修正されて います。
2140%<*book|report>
2141\def\@endpart{\vfil\newpage
2142 \if@twoside
2143 \if@openleft %% added (2017/02/24)
2144 \null\thispagestyle{empty}\newpage
2145 \else\if@openright %% added (2016/12/13)
2146 \null\thispagestyle{empty}\newpage
2147 \fi\fi %% added (2016/12/13, 2017/02/24)
2148 \fi
2149 \if@restonecol
2150 \twocolumn
2151 \fi}
2152%</book|report>
■章
\chapter 章の最初のページスタイルは,全体がemptyでなければplainにします。また,\@topnum を0にして,章見出しの上に図や表が来ないようにします。
2153%<*book|report>
2154\newcommand{\chapter}{%
2155 \if@openleft\cleardoublepage\else
2156 \if@openright\cleardoublepage\else\clearpage\fi\fi
2157 \plainifnotempty % 元: \thispagestyle{plain}
2158 \global\@topnum\z@
2159 \if@english \@afterindentfalse \else \@afterindenttrue \fi
2160 \secdef
2161 {\@omit@numberfalse\@chapter}%
2162 {\@omit@numbertrue\@schapter}}
\@chapter 章見出しを出力します。secnumdepthが0以上かつ\@mainmatterが真のとき章番号を出 力します。
2163\def\@chapter[#1]#2{%
2164 \ifnum \c@secnumdepth >\m@ne
2165 \if@mainmatter
2166 \refstepcounter{chapter}%
2167 \typeout{\@chapapp\thechapter\@chappos}%
2168 \addcontentsline{toc}{chapter}%
2169 {\protect\numberline
2170% %{\if@english\thechapter\else\@chapapp\thechapter\@chappos\fi}%
2171 {\@chapapp\thechapter\@chappos}%
2172 #1}%
2173 \else\addcontentsline{toc}{chapter}{#1}\fi
2174 \else
2175 \addcontentsline{toc}{chapter}{#1}%
2176 \fi
2177 \chaptermark{#1}%
2178 \addtocontents{lof}{\protect\addvspace{10\jsc@mpt}}%
2179 \addtocontents{lot}{\protect\addvspace{10\jsc@mpt}}%
2180 \if@twocolumn
2181 \@topnewpage[\@makechapterhead{#2}]%
2182 \else
2183 \@makechapterhead{#2}%
2184 \@afterheading
2185 \fi}
\@makechapterhead 実際に章見出しを組み立てます。\bfseriesを\headfontに変えました。
2186\def\@makechapterhead#1{%
2187 \vspace*{2\Cvs}% 欧文は50pt
2188 {\parindent \z@ \raggedright \normalfont
2189 \ifnum \c@secnumdepth >\m@ne
2190 \if@mainmatter
2191 \huge\headfont \@chapapp\thechapter\@chappos
2192 \par\nobreak
2193 \vskip \Cvs % 欧文は20pt
2194 \fi
2195 \fi
2196 \interlinepenalty\@M
2197 \Huge \headfont #1\par\nobreak
2198 \vskip 3\Cvs}} % 欧文は40pt
\@schapter \chapter*{...}コマンドの本体です。\chaptermarkを補いました。
2199\def\@schapter#1{%
2200 \chaptermark{#1}%
2201 \if@twocolumn
2202 \@topnewpage[\@makeschapterhead{#1}]%
2203 \else
2204 \@makeschapterhead{#1}\@afterheading
2205 \fi}
\@makeschapterhead 番号なしの章見出しです。
2206\def\@makeschapterhead#1{%
2207 \vspace*{2\Cvs}% 欧文は50pt
2208 {\parindent \z@ \raggedright
2209 \normalfont
2210 \interlinepenalty\@M
2211 \Huge \headfont #1\par\nobreak
2212 \vskip 3\Cvs}} % 欧文は40pt
2213%</book|report>
79
■下位レベルの見出し
\section 欧文版では\@startsectionの第4引数を負にして最初の段落の字下げを禁止しています
が,和文版では正にして字下げするようにしています。
段組のときはなるべく左右の段が狂わないように工夫しています。
2214\if@twocolumn
2215 \newcommand{\section}{%
2216%<jspf>\ifx\maketitle\relax\else\maketitle\fi
2217 \@startsection{section}{1}{\z@}%
2218%<!kiyou> {0.6\Cvs}{0.4\Cvs}%
2219%<kiyou> {\Cvs}{0.5\Cvs}%
2220% {\normalfont\large\headfont\@secapp}}
2221 {\normalfont\large\headfont\raggedright}}
2222\else
2223 \newcommand{\section}{%
2224 \if@slide\clearpage\fi
2225 \@startsection{section}{1}{\z@}%
2226 {\Cvs \@plus.5\Cdp \@minus.2\Cdp}% 前アキ 2227 {.5\Cvs \@plus.3\Cdp}% 後アキ
2228% {\normalfont\Large\headfont\@secapp}}
2229 {\normalfont\Large\headfont\raggedright}}
2230\fi
\subsection 同上です。
2231\if@twocolumn
2232 \newcommand{\subsection}{\@startsection{subsection}{2}{\z@}%
2233 {\z@}{\if@slide .4\Cvs \else \z@ \fi}%
2234 {\normalfont\normalsize\headfont}}
2235\else
2236 \newcommand{\subsection}{\@startsection{subsection}{2}{\z@}%
2237 {\Cvs \@plus.5\Cdp \@minus.2\Cdp}% 前アキ
2238 {.5\Cvs \@plus.3\Cdp}% 後アキ 2239 {\normalfont\large\headfont}}
2240\fi
\subsubsection [2016-07-22]slideオプション指定時に\subsubsectionの文字列と罫線が重なる問題に 対処しました(forum:1982)。
2241\if@twocolumn
2242 \newcommand{\subsubsection}{\@startsection{subsubsection}{3}{\z@}%
2243 {\z@}{\if@slide .4\Cvs \else \z@ \fi}%
2244 {\normalfont\normalsize\headfont}}
2245\else
2246 \newcommand{\subsubsection}{\@startsection{subsubsection}{3}{\z@}%
2247 {\Cvs \@plus.5\Cdp \@minus.2\Cdp}%
2248 {\if@slide .5\Cvs \@plus.3\Cdp \else \z@ \fi}%
2249 {\normalfont\normalsize\headfont}}
2250\fi