torutkのブログ

ソフトウェア・エンジニアのブログ

Sphinxでドキュメント生成-PDF(Windowsでの始め方)(続)

昨日の日記の続きです。

Sphinxで、PDFを生成(rst2pdf)するためには、ドキュメント・プロジェクトをquickstartで作成する毎に、conf.pyの修正、make.batの修正、ja.jsonのコピーをする必要があります。ちょっと面倒ですね。

そこで、quickstartでプロジェクトを作成するときに、デフォルトでPDFの設定を入れられるよういじってみました。

sphinx-quickstartで実行される処理はquickstart.py

Sphinxをインストールすると、以下のディレクトリにSphinxスクリプトが置かれます。

  • \Lib\site-packages\Sphinx-1.0.7-py2.6.egg/sphinx/
    • quickstart.py

そこで、このquickstart.pyを修正して、PDF関係の設定を入れてみました。diff -u の結果を以下に示します。

quickstart.pyの修正
$ diff -u quickstart.py.orig quickstart.py
--- quickstart.py.orig  2011-05-11 21:52:18.408185800 +0900
+++ quickstart.py       2011-05-21 13:04:08.397668600 +0900
@@ -80,7 +80,7 @@
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
-#language = None
+language = 'ja'
 
 # There are two options for replacing |today|: either, you set today to some
 # non-false value, then it is used:

これはPDFとは関係なく、Sphinxが生成するテキスト(「目次」とか)を日本語にしています。

@@ -284,6 +284,41 @@
 #epub_tocdup = True
 '''
 
+PDF_CONFIG = '''
+
+# -- Options for PDF output --------------------------------------------
+
+# Grouping the document tree into PDF files. List of tuples
+# (source start file, target name, title, author, options).
+#
+# If there is more than one author, separate them with \\.
+# For example: r'Guido van Rossum\\Fred L. Drake, Jr., editor'
+#
+# The options element is a dictionary that lets you override
+# this config per-document.
+# For example,
+# ('index', u'MyProject', u'My Project', u'Author Name',
+# dict(pdf_compressed = True))
+# would mean that specific document would be compressed
+# regardless of the global pdf_compressed setting.
+pdf_documents = [
+('index', u'%(project_str)s', u'My Project', u'%(author_str)s'),
+]
+
+# A comma-separated list of custom stylesheets. Example:
+pdf_stylesheets = ['sphinx','kerning','a4','ja']
+# Create a compressed PDF
+# Use True/False or 1/0
+# Example: compressed=True
+#pdf_compressed = False
+# A colon-separated list of folders to search for fonts. Example:
+pdf_font_path = ['C:\Windows\Fonts']
+# Language to be used for hyphenation support
+pdf_language = "ja"
+# Mode for literal blocks wider than the frame. Can be 
+
+'''
+
 INTERSPHINX_CONFIG = '''
 
 # Example configuration for intersphinx: refer to the Python standard library.

ここでは、PDF関係の設定を記述しています。日本語決め打ちです。

プロジェクト名と著者名はsphinx-quickstartで入力したテキストを引けたので、それを変数で参照して埋めています。

フォントのパスは、Windows OSの標準パスで、かつC:ドライブ決め打ちです。

@@ -347,6 +382,7 @@
 \t@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
 \t@echo "  text       to make text files"
 \t@echo "  man        to make manual pages"
+\t@echo "  pdf        to make PDF file"
 \t@echo "  changes    to make an overview of all changed/added/deprecated items"
 \t@echo "  linkcheck  to check all external links for integrity"
 \t@echo "  doctest    to run all doctests embedded in the documentation \
@@ -433,6 +469,11 @@
 \t@echo
 \t@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
 
+pdf:
+\t$(SPHINXBUILD) -b pdf $(ALLSPHINXOPTS) $(BUILDDIR)/pdf
+\t@echo
+\t@echo "Build ninished. The PDF file is in $(BUILDDIR)/pdf."
+
 changes:
 \t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
 \t@echo
@@ -481,6 +522,7 @@
 \techo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter
 \techo.  text       to make text files
 \techo.  man        to make manual pages
+\techo.  pdf        to make PDF file
 \techo.  changes    to make an overview over all changed/added/deprecated items \techo.  linkcheck  to check all external links for integrity
 \techo.  doctest    to run all doctests embedded in the documentation if enabled
@@ -594,6 +636,14 @@
 \tgoto end
 )
 
+if "%%1" == "pdf" (
+\t%%SPHINXBUILD%% -b pdf %%ALLSPHINXOPTS%% %%BUILDDIR%%/pdf
+\tif errorLevel 1 exit /b 1
+\techo.
+\techo.Build finished. The PDF file is in %%BUILDDIR%%/pdf.
+\tgoto end
+)
+
 if "%%1" == "changes" (
 \t%%SPHINXBUILD%% -b changes %%ALLSPHINXOPTS%% %%BUILDDIR%%/changes
 \tif errorlevel 1 exit /b 1

これは、make.batに吐き出す内容です。

@@ -623,6 +673,28 @@
 :end
 '''
 
+JAJSONFILE = '''\
+{
+  "fontsAlias" : {
+     "stdFont": "meiryo",
+     "stdBold": "meiryob",
+     "stdItalic": "meiryo",
+     "stdBoldItalic": "meiryo",
+     "stdMono": "MS Gothic",
+     "stdMonoBold": "MS Gothic",
+     "stdMonoItalic": "MS Gothic",
+     "stdMonoBoldItalic": "MS Gothic"
+},
+"styles" : [
+  ["base", {
+   "wordWrap": "CJK"
+  }],
+  ["literal", {
+   "wordWrap": "None"
+  }]
+ ]
+}
+'''
 
 def mkdir_p(dir):
     if path.isdir(dir):

これは、ja.jsonファイルの内容を定義したもので、後程これをファイルに出力するスクリプトが登場します。

@@ -775,9 +847,14 @@
               'n', boolean)
 
     print '''
+Sphinx extension for PDF output via rst2pdf:'''
+    do_prompt(d, 'pdf', 'Do you want to use the PDF builder (y/N)',
+              'n', boolean)
+
+    print '''
 Please indicate if you want to use one of the following Sphinx extensions:'''
     do_prompt(d, 'ext_autodoc', 'autodoc: automatically insert docstrings '
-              'from modules (y/N)', 'n', boolean)
+                  'from modules (y/N)', d['pdf'] and 'y' or 'n', boolean)
     do_prompt(d, 'ext_doctest', 'doctest: automatically test code snippets '
               'in doctest blocks (y/N)', 'n', boolean)
     do_prompt(d, 'ext_intersphinx', 'intersphinx: link between Sphinx '
@@ -814,6 +891,8 @@
         for name in ('autodoc', 'doctest', 'intersphinx', 'todo', 'coverage',
                      'pngmath', 'jsmath', 'ifconfig', 'viewcode')
         if d['ext_' + name])
+    if d['pdf']:
+        d['extensions'] += ", 'rst2pdf.pdfbuilder'"
     d['copyright'] = time.strftime('%Y') + ', ' + d['author']
     d['author_texescaped'] = unicode(d['author']).\
                              translate(texescape.tex_escape_map)

sphinx-quickstartコマンドで、ユーザーにPDF出力を使うかどうか問い合わせる処理を追加しています。
PDF出力を使う場合、autodoc拡張を使うかどうかの問い合わせのデフォルトを'n'ではなく'y'にしています。

@@ -848,6 +927,8 @@
         conf_text += EPUB_CONFIG % d
     if d['ext_intersphinx']:
         conf_text += INTERSPHINX_CONFIG
+    if d['pdf']:
+        conf_text += PDF_CONFIG % d
 
     f = open(path.join(srcdir, 'conf.py'), 'w')
     f.write(conf_text.encode('utf-8'))

PDF出力をする場合、PDF設定文字列をconf.pyに追記するようにしています。

@@ -873,6 +954,11 @@
         f.write((BATCHFILE % d).encode('utf-8'))
         f.close()
 
+    if d['pdf']:
+        f = open(path.join(d['path'], 'ja.json'), 'w')
+        f.write((JAJSONFILE % d).encode('utf-8'))
+        f.close()
+
     print
     print bold('Finished: An initial directory structure has been created.')
     print '''

PDF出力をする場合、ja.jsonを生成するようにしています。

quickstart.pycの削除

quickstart.pyを変更したら、拡張子.pyc のファイルは削除しておきます。もしかするとpythonがタイムスタンプで自動的に削除してくれるかもしれませんが、念のため。