ト部蛸焼のブログ

日頃知ったことをアウトプットするためのブログ

titlesecパッケージで見出しの書式を変える

LaTeXにtitlesecというパッケージ*1 があります。このパッケージを用いると,sectionやsubsectionなどの見出しの書式を簡単に変更することができます。本記事ではこのtitlesecパッケージの基本的な部分について調べたことをまとめます。また,こちら(Overleafのリンク)にはtitlesecパッケージを使用した見出しの例をいくつか掲載しています*2

「細かいことはどうでも良いから例が見たい」という方は先ほどのOverleafのリンクへ飛ぶか,以下の目次で「使用例」に飛ぶことをお勧めします。

また,記事の内容に関して不明な点や誤りを発見した際には,Twitter*3などからご連絡いただけると幸いです。

titlesec.styでできること

冒頭でも述べた通り,titlesec.styによってsectionやsubsectionなどの見出しの書式を設定することができます。さらに今回は説明を省いていますが新たなレベルの見出し形式を定義することも可能です。

基本的なコマンドの説明

\titleline,\titlerule

このコマンドを用いると直線を引くことができます。

\titleline,\titleruleの仕様
\titleline[align]{material}

  • alignは左詰め(l),中央揃え(c),右詰め(r)の3つから選択

\titlerule[height]
\titlerule*[width]{text}

  • *付きの方はtextに指定した文字をwidthに指定した値の大きさの箱に入れて並べることで線を形成する

スター付きの\titleruleは例えば\titlerule*{1em}{・}とすれば

・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・

こんな感じの線を形成します。


\titlelabel

このコマンドを用いると,すべての見出しの書式を一括に変更することができます。以下の仕様に沿ってコマンドの中身を記述します。

\titlelabelの仕様
\titlelabel{label-format}

  • label-formatの部分には見出しのラベルの書式を具体的に指定します。

すべての見出しの書式を一括に変更するため,「sectionとsubsectionとで書式を変えたい」といった場合での利用は向かないようです。

\titleformat

このコマンドを用いると,特定の見出しの書式を変更することができます。非常に便利ですが,引数の数がオプション引数を含めて7個あるため使いやすいかと言われると微妙です*4。以下の仕様に沿ってコマンドの中身を記述します。

\titleformatの仕様
\titleformat{command}[shape]{format}{label}{sep}{before-code}[after-code]

  • commandには定義を変えたいコマンドを入力
  • shapeは後述
  • formatはタイトルに適用したいフォーマットを入力
  • labelはラベルの様式を記述
  • sepはラベルとタイトルの仕切りを記述
  • before-codeはタイトル本体の前に挿入したい内容を記述
  • after-codeはタイトル本体の後に挿入したい内容を記述

shapeの選択肢
\titleformatの仕様に登場したshapeは,見出しと本文の形や位置関係を決めるパラメータです。公式ドキュメントによれば以下の9つが用意されています*5。それぞれがどのような出力を与えるかについてはこちら(Overleafへのリンク)を参照ください。

[ 甲/1 ] hang
このパラメータのデフォルト値です。 \sectionのデフォルト設定と同様の出力になります。

[ 乙/2 ] block
ブロックを作ってその中にタイトルを入れます。単純な処理の場合の出力はhangと変わりませんが,例えばbefore-codeの位置に改行を挟む場合に大きな違いが現れるようです。

[ 丙/3 ] display
別の段落にラベルを配置します。\chapterのデフォルト設定と同様の出力になります。

[ 丁/4 ] runin
\paragraphのデフォルト設定と同様な出力を得ます。

[ 戊/5 ] leftmargin
左側にある紙面の余白部分にタイトルを配置します。geometryパッケージなどによって余白を狭めている場合に使用するのは良くなさそうです。

[ 己/6 ] rightmargin
右側にある紙面の余白部分にタイトルを配置します。geometryパッケージなどによって余白を狭めている場合に使用するのは良くなさそうです。

[ 庚/7 ] drop
タイトルの周りにテキストを回り込ませます。普通にコマンド定義をすると左側に少し飛び出しました。

[ 辛/8 ] wrap
dropとほぼ同じですが,スペースの自動調整が可能と公式ドキュメントには書かれています。普通にコマンド定義をしてもdropとは違い左側に飛び出さなかったため,こちらのほうが使い勝手の良いものかもしれません。

[ 壬/9 ] frame
displayに似た形式ですが,タイトルを枠で囲んで出力します。


\titlespacing

このコマンドを用いると,特定の見出しについて空隙の量を調節できます。凝った見た目の見出しを作る場合には丁寧に空白の幅を設定しておく必要があります。なお,\titleformat内のshapeの種類によって空隙の挿入される軸方向(水平方向か垂直方向か)が変わるので注意が必要です。

\titlespacingの仕様
\titlespacing*{command}{left}{before}{after}[right]

  • *は段落最初の行のインデントをなくしたい場合に付けます*6
  • leftに指定した値は以下に対応します
    • shapeがmargin系またはdropのときはタイトル幅
    • wrapのときはタイトル幅の最大値
    • runinのときはタイトル直前のインデント
  • beforeにはタイトルの前に挿入する垂直方向の隙間の量を指定
  • afterにはタイトルと本文の間の隙間の量を指定
    • hang,block,displayの場合,この値は垂直方向の量とみなされる
    • runin,drop,wrap,margin系の場合,この値は水平方向の量とみなされる
  • rightには右側の余白を設定(ただしhang,block,displayの使用時に限る)

使用例

ここまで基本的なコマンドや用語の説明をしましたが,結局は例を見て学んだり試しに出力してみて挙動を見たりする方がよく中身を理解できると思います。そこで以下にtcolorboxパッケージを併用した例を3つ示します*7。下記の出力に関するコードはこちら(Overleafのリンク)にもあります。

\titleformat{\section}[display]{\bfseries\gtfamily}{}{10pt}{%
\begin{tcolorbox}[%
    enhanced,%
    colback=white,colbacktitle=white,colframe=black,coltitle=black,%
    boxrule=1.5pt,sharp corners,%
    borderline={1.5pt}{3pt}{black},%
    ]%
    \centering\thesection\\
    \LARGE #1%
\end{tcolorbox}%
}

f:id:tobetakoyaki:20210410220610p:plain
重厚感のある見出し

\titleformat{\section}[block]{}{%
    \begin{tcolorbox}[%
        enhanced,%
        colback=white,colframe=black!25!white,%
        boxrule=1pt,leftrule=25pt,%
        overlay={%
            \draw node at ($(frame.west) + (12.5pt,0pt)$) {\hbox{\centering\Large\bfseries\gtfamily\thesection}};% 左端中央からleftruleの値の1/2だけずれた位置に数字を入力
            }%
        ]%
        \Large\bfseries\gtfamily#1%
    \end{tcolorbox}
}{0pt}{\vspace{-25pt}}

f:id:tobetakoyaki:20210410220637p:plain
枠付き見出し

ひとまず,調査は以上です。

スター付き見出しコマンド(2021.04.11 追記)

LaTeXの基本的なこととして「\section{ほげ}」で番号つきの見出しが,「\section*{ほげ}」で番号なしの見出しを挿入できます.実は,今までのコマンド定義の仕方ではスター無しのほうにはうまく対応できるものの,スター付きのほうには対応できません.

スター付きのコマンドに対応させるためには,スター無しと同様の定義をスター付き用にも作成する必要があります.その際,以下のように\titleformatのcommandのところ(第1引数)を工夫する必要があります.

% 枠無しの例
\titleformat{\section}[block]{}{#1}{10pt}{}
% 枠付きの例
\titleformat{name=\section,numberless}[block]{}{#1}{10pt}{}

「numberless」の「section」という「name」の「command」を作るというわけですね.(納得)

参考文献

1. CTAN: Package titlesec
2. にっき♪: titlesec
3. LaTeXにおいて体裁を整えるのに便利なパッケージ - Qiita (titlesecのほかにも役立ちそうなパッケージの紹介が並んでいる)

*1:https://www.ctan.org/pkg/titlesec

*2:動作の確認はOverleaf上の次の設定で行っています。コンパイラ: upLaTeX,TeX Live version: 2020。

*3:@tobetakoyaki

*4:とはいえ,見出しの書式を文章中で頻繁に変更することは恐らくありませんから,困ることはないかもしれません。

*5:私が十干を覚えたいと思っているため,インデックスに十干が付されていますがお気になさらないでください。

*6:日本語の文章では段落の最初の行だからといってインデントをなくすことはしないため,*は付けません。

*7:なお公式のドキュメントにも例の記載はありますので,ここではそれとは少し違うものの作成を目指してみました。また,気が向けばほかの例も追加する可能性があります。