完全に個人的な備忘録

完全に個人的な備忘録。学習コストが高くなってきたので、メモしておかないと…片っ端から忘却の彼方なのです。

rst2pdfで箇条書が改行されない

少し前からSphinxを弄っている。

rst2pdfがもう少しなんだけど…って事でメモしておく。

Sphinxは以下のURLを参考にしてインストール

上記は、Windowsの例だけど、Linuxでも基本的に同じ。
先ず、easyinstallをインストールする為のインストーラをダウンロード。

$ wget http://peak.telecommunity.com/dist/ez_setup.py
--2013-02-10 21:42:20--  http://peak.telecommunity.com/dist/ez_setup.py
peak.telecommunity.com (peak.telecommunity.com) をDNSに問いあわせています... 209.190.5.234
peak.telecommunity.com (peak.telecommunity.com)|209.190.5.234|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 10240 (10K) [text/plain]
`ez_setup.py' に保存中

100%[======================================>] 10,240      24.4K/s   時間 0.4s

2013-02-10 21:42:21 (24.4 KB/s) - `ez_setup.py' へ保存完了 [10240/10240]

ダウンロードが完了したら、セットアップを実行。

$ sudo python ez_setup.py
Downloading http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg
Processing setuptools-0.6c11-py2.7.egg
Copying setuptools-0.6c11-py2.7.egg to /usr/local/lib/python2.7/dist-packages
Adding setuptools 0.6c11 to easy-install.pth file
Installing easy_install script to /usr/local/bin
Installing easy_install-2.7 script to /usr/local/bin

Installed /usr/local/lib/python2.7/dist-packages/setuptools-0.6c11-py2.7.egg
Processing dependencies for setuptools==0.6c11
Finished processing dependencies for setuptools==0.6c11

以上で、easy_installのインストール完了。続いて、Sphinxをインストール

$ sudo easy_install sphinx
Searching for sphinx
     :     :     :
Installed /usr/local/lib/python2.7/dist-packages/Pygments-1.6-py2.7.egg
Finished processing dependencies for sphinx

圧砕とインストール完了。

以下のソースをbuildしてhtmlを生成。

てすと
=======

ここは段落です。ここは段落です。ここは段落です。ここは段落です。ここは
段落です。ここは段落です。ここは段落です。

* ここは箇条書です。ここは箇条書です。ここは箇条書です。ここは箇条書で
  す。ここは箇条書です。ここは箇条書です。ここは箇条書です。ここは箇条
  書です。

.. note::

    こには、ノートディレクティブです。こには、ノートディレクティブです。
    こには、ノートディレクティブです。こには、ノートディレクティブです。

ブラウザで確認。
f:id:tarancho:20130211082638p:plain
ソースの改行位置で余分なスペースが入っている。欧文の場合、単語の途中で改行する事はなく、更に単語間にスペースが入るので、これは、仕方が無い事だと思う。

余談だが、NTT jTeXでも同じような現象が発生するので、日本語の行末にコメントマークを付けて改行するといったテクニックがあった。

日本語の行末に%
コメントマークを付けて%
改行する。

htmlでも、ある程度、ソースを書く時に意識する必要がある(改行位置を自分でコントロールする)わけだ。ところが、

によると、Sphinxの場合は、この問題を回避できるようだ。上記のページを参考にして、早速、試してみた。但し、japanesusupport.pyは以下のものを使用した。

先程のソースをbuildしてhtmlを生成。
f:id:tarancho:20130211084939p:plain
余計な空白が綺麗に取れている事が確認できた。

続いて、pdfでの出力を確認。以下のページを参考にしてrst2pdfをインストールします。

基本的に、上記のページ通り、インストール及び設定を行なった。

$ sudo easy_install rst2pdf
Searching for rst2pdf
     :     :     :
Finished processing dependencies for rst2pdf

スタイルシートを作成する前に、既存のスタイルシートを確認。

$ rst2pdf --print-stylesheet

fontsAliasで定義されているフォントを全て定義しないと、特定の部分が文字化けしたりするので要注意。表のヘッダが文字化けして随分調べたので。

とりあえず、体裁よりも、文字化けを無くす事を優先で ja.json は以下の通り設定した。この部分は、環境によってインストールされているフォントも異る可能性があるので、自分の環境に合せる必要がある。

{
    "fontsAlias" : {
        "stdFont": "fonts-japanese-mincho",
        "stdBold": "fonts-japanese-mincho",
        "stdItalic": "fonts-japanese-mincho",
        "stdBoldItalic": "fonts-japanese-mincho",
        "stdMono": "fonts-japanese-gothic",
        "stdMonoBold": "fonts-japanese-gothic",
        "stdMonoItalic": "fonts-japanese-gothic",
        "stdMonoBoldItalic": "fonts-japanese-gothic",
        "stdSans": "fonts-japanese-gothic",
        "stdSansBold": "fonts-japanese-gothic",
        "stdSansItalic": "fonts-japanese-gothic",
        "stdSansBoldItalic": "fonts-japanese-gothic"
    },
    "styles" : [
        ["base" , {
            "wordWrap": "CJK"
        }],
        ["literal" , {
            "wordWrap": "None"
        }]
    ]
}

Buildしてpdfファイルを生成。
f:id:tarancho:20130211183753p:plain
htmlの時と同様、余計な空白が表示される。今度はjapanesesupportを有効にしてBuild。
f:id:tarancho:20130211184232p:plain
しかし、結果は、非常に残念な事になった。箇条書と、ノートディレクティブが改行されないという結果になってしまった。

ここで、japanesesupport.pyに原始的なデバッグ文を入れて確認。

# -*- coding: utf-8 -*-
import re
__RGX = re.compile(r'([^!-~])[\n\r\t]+([^!-~])')

def trunc_whitespace(app, doctree, docname):
    from docutils.nodes import Text, paragraph
    if not app.config.japanesesupport_trunc_whitespace:
        return
    for node in doctree.traverse(Text):
        if isinstance(node.parent, paragraph):
            newtext = node.astext()
            #↓「非ASCII」+「"\n\r\t"たち」+「非ASCII」
            # の場合だけ置換する…
            newtext = __RGX.sub(r"\1\2", newtext)
            #newtext = newtext.strip()
            print u'debug:[前]' + Text(node.parent) # 原始的な確認
            node.parent.replace(node, Text(newtext))
            print u'debug:[後]' + Text(node.parent) # 原始的な確認

def setup(app):
    app.add_config_value('japanesesupport_trunc_whitespace', True, True)
    app.connect("doctree-resolved", trunc_whitespace)

変換前と変換後の値を確認したが、特に問題になる部分はなさそう。

…もしかして、と思い、元のソースの箇条書部分の改行を削除してみたところ、japanesesupportの有無に関わらず、箇条書とノートディレクティブは改行されなかった。

rst2pdf自体の問題か…箇条書中に空白や改行が存在しないと行末で改行してくれないって事か。或いは、余計な空白は目を瞑るか。

latexpdfでは、pTeXが日本語に対応しているので、このような問題は発生しないが、出力がやや残念な部分がある…

ま~、とりあえず、メモという事で…