Re: \@startsection で \centering と \underline の使用

名前: しっぽ愛好家
日時: 2004-06-30 06:58:22
IPアドレス: 219.108.35.*

>>29978 \section の見出しが複数行にわたらないのでしたら, とりあえず,次のようなこともできます. \documentclass{jarticle} \makeatletter \def\section{% \@startsection{section}{1}% {0pt}{0pt}{1sp}% {\centering\normalfont\normalsize\@sechead@underline}} \def\@sechead@underline#1{\underline{#1}\@@par} \makeatother \begin{document} \section{サンプル} サンプルテキスト \end{document} ただし,トノさんのお話の 2. に挙げてあるような問題がありますので, まじめにやろうとするともう少し手間がかかるでしょう. ============================ 以下,蛇足 ================================= 関心をもつ方などいらっしゃらないでしょうが, 状況を理解するために,必要最小限の補足を行います. まず,ファイル latex.ltx における \@sect の定義は次のようになっています. \def\@sect#1#2#3#4#5#6[#7]#8{% \ifnum #2>\c@secnumdepth \let\@svsec\@empty \else \refstepcounter{#1}% \protected@edef\@svsec{\@seccntformat{#1}\relax}% \fi \@tempskipa #5\relax \ifdim \@tempskipa>\z@ \begingroup%%% (*) #6{% \@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\relax \@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}} %%% 以下,\@startsection の第 5 引数の自然長は正であるものとして説明します. ここで,(*) および (**) というコメントをつけた行に挟まれる \begingroup #6{% \@hangfrom{\hskip #3\relax\@svsec}% \interlinepenalty \@M #8\@@par}% \endgroup の部分(この部分が見出し部分の作成処理です)に注意します. この部分が #6{...} の形になっていることにより, \@startsection の第 6 引数の最後に引数を 1 個とるマクロ (e.g. \MakeUppercase,\underline)を用いても構わないようになっています. また,#8 の直後に \@@par をおいて段落を終了させているので, この \@@par が改段落可能な状況で用いられていれば, \@startsection の第 6 引数で用いられた \centering は有効です. しかし,今回の例のように \@startsection の第 6 引数の最後に \underline を 用いた場合には,#8 の後の \@@par が(\underline の処理に伴って作成される) ボックスの中に入ります.そのため,\centering を併用しても,\centering が 有効である範囲では段落が終了せず,\centering が無視されたかのような 出力になるというわけです. %%% そこで,冒頭の例では \underline の引数の外で改めて段落を %%% 終了させるように細工をしています. \@ssect の場合についてはここでは繰り返しませんが, 状況は \@sect の場合とほとんど同じです. なお,今調べた \begingroup #6{% \@hangfrom{\hskip #3\relax\@svsec}% \interlinepenalty \@M #8\@@par}% \endgroup の部分の \@@par を括弧の外に出して \begingroup #6{% \@hangfrom{\hskip #3\relax\@svsec}% \interlinepenalty \@M #8}\@@par \endgroup にするのは NG です(\@hangfrom で設定された \hangindent が 段落の終端で有効になりません). では,これで失礼いたします.

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます)