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.TextIOWrapperutf-8 编码用于 TeX 输入。text.preamble和中的字符串参数canvas.text逐字传递给包装器,因此在 Python 3 中,您只需传递一个字符串,无需任何编码。编码将由包装器完成。

我原来的未简化代码还有另一个问题,这使得第一个问题很难解决。因此,为了完整起见,这是第二个问题及其解决方案。我的原始代码具有以下操作顺序:

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当前设置设置的 a 的引用。更改的文本模块设置永远不会影响画布实例。因此,您必须在创建要在其中绘制文本的画布之前设置文本模块。

感谢任何对此进行调查的人。

于 2016-11-02T19:58:01.340 回答