ドキュメントの作成に、ドキュメントが簡単に作れるツール Sphinx を気に入って使っています。
先日、グリッドテーブル(Grid Table)に全角記号を入れるとエラーになるということに気がつきました。
具体的には、以下のようなものがエラーになってしまいます。
しかし、次のようにするとエラーなく処理されます。
横幅がそろっていないとエラーになるはずが、そろっているとエラーになり、ずらすとエラーがなくなるいう状態です。
困って調べたところ、Pythonのdocutilsパッケージが原因であることがわかりました。
グリッドテーブルが正しい形式になっているかを確認するときに、docutils内で、グリッドテーブルの各行の長さを計算しています。そのとき、ひらがなや漢字などの全角の文字は、半角2文字分の幅を取っているので、見た目と合わせるために、長さを2として計算されます。しかし、「→」などの全角記号が長さを1として計算されているため、見た目とずれてしまっています。
これを修正するために、以下のようにしました。環境はDebian9(stretch)です。
システム側のdocutilsを変更しないで済ませるために、ユーザのホーム以下のディレクトリにコピーをします。ここでは「.pythonlib」というディレクトリ名にしましたが、これは任意の名前で構いません。
1 2 3 4 |
$ cd $HOME $ mkdir .pythonlib $ cd .pythonlib $ cp -rp /usr/lib/python2.7/dist-packages/docutils . |
このディレクトリを、モジュールファイルのデフォルトの検索パスに追加するために、環境変数を設定します。bashならば、以下の行を環境設定ファイル(「.profile」など)に記述します。
1 |
export PYTHONPATH="$HOME/.pythonlib/" |
環境設定ファイルを読み込めば有効になります。
コピーしたdocutilsディレクトリ配下の「statemachine.py」の
1 |
if east_asian_width(char) in 'WF': # 'W'ide & 'F'ull-width |
を
1 |
if east_asian_width(char) in 'WFA': # 'W'ide & 'F'ull-width |
のように変更します(「A」を追加)。
また、今回の修正には直接関係ありませんが、整合性をとるため、コピーしたdocutilsディレクトリ配下の「utils/__init__.py」の
1 2 3 4 5 6 7 |
east_asian_widths = {'W': 2, # Wide 'F': 2, # Full-width (wide) 'Na': 1, # Narrow 'H': 1, # Half-width (narrow) 'N': 1, # Neutral (not East Asian, treated as narrow) 'A': 1} # Ambiguous (s/b wide in East Asian context, # narrow otherwise, but that doesn't work) |
を
1 2 3 4 5 6 7 |
east_asian_widths = {'W': 2, # Wide 'F': 2, # Full-width (wide) 'Na': 1, # Narrow 'H': 1, # Half-width (narrow) 'N': 1, # Neutral (not East Asian, treated as narrow) 'A': 2} # Ambiguous (s/b wide in East Asian context, # narrow otherwise, but that doesn't work) |
のように変更(「1」を「2」に変更)しておくといいと思われます。
以上で、全角記号を含んだグリッドテーブルで、見た目がそろっていればエラーが出ずに処理できるようになりました。