2

だから私はPythonからpostscriptを生成しようとしています。現在、Python3.4.2 で PyX 0.14.1 を試していますが、もっと簡単なことを知っていれば、提案を受け付けています。

私は主に、このスレッドの PyX メーリング リストで見つかった提案に従っていました。これは Python2 で、かなり古いものです。以下は、多くの変更を加えた後の現在のコードを示しています。

from pyx import *

text.set(cls=text.LatexRunner, texenc='utf-8')
text.preamble(r'\usepackage{ucs}')
text.preamble(r'\usepackage[utf8x]{inputenc}')

c = canvas.canvas()
c.text(5, 5, "Sören Sundstrøm".encode("utf8"))

p = document.page(c, paperformat=document.paperformat.A4,
    centered=0)
d = document.document([p])
d.writePSfile('test.ps')

PyX は TexResultError で停止します。エラーの興味深い部分は、TeX で何が起こっているかを示しています。

pyx.text.TexResultError: unhandled TeX response (might be an error)
The expression passed to TeX was:
  \ProcessPyXBox{b'S\xc3\xb6ren Sundstr\xc3\xb8m'%
  }{1}%
  \PyXInput{7}%
After parsing the return message from TeX, the following was left:
  *
  *! Undefined control sequence.
  <argument> b'S\xc 
                    3\xb 6ren Sundstr\xc 3\xb 8m'
  <*> }{1}
  (cut after 5 lines; use errordetail.full for all output)

したがって、latex は utf-8 ではなく、utf-8 のエスケープ表現を受け取っているようです。私の質問: 文字列を canvas.text に正しく渡すにはどうすればよいですか? それとも私の序文が間違っていますか?

私も SO でwobsta によるこの回答に従おうとしましたが、複雑すぎるだけでなく、私にとってもうまくいきません。(この場合、PyX はメタフォント メッセージを理解していないようです)。

ちなみに、同じプリアンブルを持つ単純な utf-8 入力ファイルで latex を直接実行すると、問題なく動作します。

4

1 に答える 1

2

PyX コードを調べると、問題が明らかになりました。text モジュールは、io.TextIOWrapperTeX 入力に使用される utf-8 エンコーディングを準備します。との文字列パラメーターはtext.preambleそのままcanvas.textラッパーに渡されるため、Python 3 ではエンコードを必要とせずに文字列を渡すだけです。エンコーディングはラッパーによって行われます。

私の元の簡略化されていないコードには別の問題があり、この最初の問題を解決するのが困難でした。完全を期すために、ここに 2 番目の問題とその解決策を示します。私の元のコードには、次の操作順序がありました。

from pyx import *

c = canvas.canvas()
# doing other stuff with canvas

text.set(cls=text.LatexRunner, texenc='utf-8')
text.preamble(r'\usepackage{ucs}')
text.preamble(r'\usepackage[utf8x]{inputenc}')

c.text(5, 5, "Sören Sundstrøm")

p = document.page(c, paperformat=document.paperformat.A4,
    centered=0)
d = document.document([p])
d.writePSfile('test.ps')

キャンバスが作成されると、テキストモジュールの現在の設定text.defaulttexrunnerで設定されたへの参照が保持されるため、これも機能しません。変更されたテキスト モジュール設定がキャンバス インスタンスに影響を与えることはありません。したがって、テキストを描画するキャンバスを作成する前に、テキスト モジュールをセットアップする必要があります。

これを調べてくれた人に感謝します。

于 2016-11-02T19:58:01.340 に答える