Skip to content

Instantly share code, notes, and snippets.

@uchida
Last active January 1, 2021 04:35
Show Gist options
  • Save uchida/4545280 to your computer and use it in GitHub Desktop.
Save uchida/4545280 to your computer and use it in GitHub Desktop.
Sphinx と LaTeX を使うときの 小技

Sphinx と LaTeX を使うときの 小技

著者:打田 旭宏
ライセンス:CC-BY 3.0
更新日時:Tue Nov 19 03:22:41 UTC 2024

Sphinx の LaTeX 出力を利用するときに見栄えを凝るのに知っておくとよいかもしれない小技をまとめました。

以下では プリアンブル (preamble) という LaTeX 用語がよくでてきます。 preamble は序文や前置きといった意味の単語ですが、 LaTeX では特に実際の文書の内容となる \begin{document}...\end{\document} の前の部分を差しています。 このプリアンブルの中では主に利用するコマンドの定義やパッケージの読み込み等を行ないます。 HTML でいえば <head> タグが近い概念です。

sphinx は LaTeX 出力するときに conf.py の latex_elements['preamble'] をプリアンブルに書き込むので、 以下でプリアンブルに設定/追加する場合 latex_elements['preamble'] に書き込みます。 LaTeX のコマンドは \ バックスラッシュ(あるいは ¥)で始まるので conf.py 内にプリアンブルを書く場合は文字列の前に r を書いて raw 文字列にしておきましょう。

また LaTeX では % から改行までをコメントとして扱います。

モノクロで印刷するために、できるだけ素の pdf がモノクロになるようする設定法です。

PC 等で閲覧する場合はハイパーリンクに色がついていると便利ですが、 印刷する際には不要かもしれません。 リンクに色をつけないようにするには、プリアンブルに以下を追加します。:

\hypersetup{colorlinks=false} % ハイパーリンクの色を無効に

コードハイライトをモノクロにするには conf.py に以下を書いておきます:

pygments_style = 'bw' # pygments のスタイルを bw (Black & White) にする

これは、LaTeX に限らず全ての出力結果でモノクロになります。

プリアンブルに以下を追加しておいて:

\usepackage{layout}

本文で:

.. raw:: latex

   \layout % レイアウトを表示

すると現在のレイアウト情報が表示されます。 表示される変数の値をプリアンブルで \setlength{変数}{長さ}\addlength{変数}{長さ} を使って設定できます。 長さは 10pt10mm 10cm のように指定できます。

目次を出力したくない場合は、以下のようにします。

latex_elements['tableofcontents'] = r'''
\pagenumbering{arabic} % ページ番号をアラビア数字に
\pagestyle{normal} % ページスタイルを normal に変更
'''

Sphinx のドキュメントには特別な場合以外は上書きしなくていいと書いてあるので注意が必要かもしれません。

さらにヘッダ、フッタの表示が通常と異なる形式で表示されます。 ヘッダ、フッタを制御したい場合は後述の fancyhdr パッケージを使うのがいいでしょう。

latex_elements['printindex'] = ''

Sphinx のドキュメントには特別な場合以外は上書きしなくていいと書いてあるので注意が必要かもしれません。

Sphinxで薄い本を書いてみた - 検討!目論見委員会Z にあるコードブロックに枠線をつける方法をプリアンブルで設定するには以下のようにします:

\let\OrigVerbatim\OriginalVerbatim
\renewcommand{\OriginalVerbatim}[1][1]{\OrigVerbatim[#1,frame=single]}

これが何をやっているのか気になる人は sphinx.sty\Verbatim の再定義あたりを参照して下さい。

Sphinx が LaTeX 出力のために用意している sphinx.sty では normalplain という2つのページスタイルを再定義しています。 ヘッダやフッタに手を加える場合は、同じように normalplain を改めて再定義すると問題が少ないでしょう。

normalplain それぞれのページスタイルを簡単に説明すると、 normal が通常利用されるスタイルで plain は簡単にいえば \chapter があるページに適用されるスタイルです。 これは 見出しとヘッダで章の名前が重複するのを防ぐためのものです。 article 系には普通 \chapter が含まれないので normal だけ再定義すれば十分です。

再定義の例を以下に挙げます:

% normal ページスタイルの再定義
\fancypagestyle{normal}{
\fancyhf{} % 一旦設定をクリア
\fancyhead[LE]{左の偶数ページ用のヘッダ}
\fancyhead[RO]{右の奇数ページ用のヘッダ}
\fancyfoot[LE,RO]{ページ番号 \thepage}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\footrulewidth}{0.4pt}
}
% plain ページスタイルの再定義
\fancypagestyle{plain}{
\fancyhf{} % 一旦設定をクリア
\fancyfoot[LE,RO]{ページ番号 \thepage}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0.4pt}
}

\headrulewidth \footrulewidth でヘッダ、フッタの線の太さを指定できます。 0pt にすると線が引かれません。

\fancyhead, \fancyfoot でヘッダに表示する内容を設定します。 例では LERO はこれらのコマンドのオプションで配置とページを指定しています。 以下の配置とページの組み合わせが利用できます。

配置指定 意味
L 左(Left)
C 中央(Center)
R 右(Right)
ページ指定 意味
E 偶数ページ(Even)
O 奇数ページ(Odd)

\fancyfoot[C]{\thepage} のように配置だけでも利用できます。

titlesec を使うと楽かもしれません。LaTeX での利用例:

フォントを変更しても pdf 出力する場合はフォントを埋め込まないと、設定した通りに表示されない場合があります。

埋め込みの設定法については割愛しますが、以下がよくまとまっています。

フォントを変更すると全体の雰囲気が変わります。Sphinx のデフォルトは

セリフ:Times
サンセリフ:Helvetica
等幅:Courier

になっています。

Knuth が作った Computer Modern を使う場合は:

latex_elements = {
...
'fontpkg': ''
...
}

Palatino を使いたい場合は conf.py に:

latex_elements = {
...
'fontpkg': r'\usepackage{palatino}'
...
}

のようにします。

デフォルトでは r'\usepackage{times}' になっています。

サンセリフフォントだと例えば:

\usepackage{helvet}

を追加するとサンセリフが Helvetica になります。 times や palatino パッケージを使うと自動的に helvetica に変更されます。 それと、高さ等がセリフ書体と合わない場合は:

\usepackage[scaled=0.95]{helvet} % 0.95倍して使う

のようにしてサイズを調整できます。フォントパッケージは scaled オプションを持っている場合が多いようです。

等幅フォントに例えば Courier フォントを使う場合は:

\usepackage{courier}

に追加します。

ちなみに数式のフォントは、数式用の記号フォントが必要なので選べるフォントが限られます。

ちなみに The LaTeX Font Catalogue に利用できるフォントが一覧されてるようです。

デフォルトでは、フォントは埋め込まれず明朝ゴシック共に太字が利用できません。 多書体フォントを利用するように設定すれば、より凝った表示ができます。

多書体を利用した設定としては、例えば js{article,book} で以下のようにすると章等の見出しのフォントが太字になります:

\usepackage[deluxe,expert]{otf}
\renewcommand{\headfont}{\gtfamily\sffamily\bfseries} % ゴシック体、サンセリフ体、太字

上述の titlesec パッケージを利用する場合は無効になるので注意して下さい。

あるいは以下のようにして *強調* を斜体ではなく、丸ゴシック、サンセリフ体にできます:

\usepackage[deluxe,expert]{otf}
\renewcommand{\emph}[1]{\textmg{\textsf{#1}}} % 丸ゴシック、サンセリフ体

Mac ならヒラギノフォントを多書体フォントとして利用できます。 また、 日本語フォントのセットアップ - TeX Live を使おう──Linux ユーザと Mac OS X ユーザのために── ではフリーフォントで7書体利用する設定があります。

ちなみに Mac OS X のヒラギノフォントは商用利用可能なようです。 参考: Mac OS Xのヒラギノフォントは商用利用可能です。- Mac お宝鑑定団

一応、手元の Mac OS X 10.8.2 の使用許諾契約 /Library/Documentation/License.lpdf 2. には

E. フォント 本契約の契約条件に従って、お客様は、Appleソフトウェアの起動中にコンテンツを表示およびプリントするために、Appleソフトウェアに入っているフォントを使用することができます。しかし、お客様は、問題になっているフォントに付属する組み込み制限が許諾する場合のみ、コンテンツの中にフォントを組み込むことができます。これらの組み込み制限は、Font Book/プレビュー/フォント情報を表示、においてご覧になれます。

とあります。 実際に /Applications/Font Book.app を実行してヒラギノフォントのフォント情報を表示すると 埋め込み可能となっており、制限する項目も見当たらないので利用して問題ないはずです。

https://gist.github.com/raw/4545280/hiramininfo.png

Sphinx がプリアンブルの変更を認めているので、大抵のことがプリアンブル指定でできてしまいます。 一方でプリアンブルの個別指定は読みにくいので、もう少し Sphinx 側で簡単に設定できてもいい気がします。 (しかし、あまりにいろいろなことがプリアンブルでできてしまうので、どこを取り込むべきなのか迷うところです...)

この文章が何かの参考になれば幸いです。

追加するかもしれないこと

  • tocdepth
  • カウンタまわり
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment