Pyx unicode text

时间:2016-10-31 21:06:14

标签: python-3.x unicode pyx

所以我试图从Python生成postscript。 目前在Python3.4.2上尝试使用PyX 0.14.1, 但如果你知道更简单的话,我愿意接受建议。

我主要关注PyX上的建议 this thread中的邮件列表。这是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)

所以看起来乳胶不接受utf-8, 但是utf-8的逃脱表示。 我的问题:如何正确地将字符串传递给canvas.text? 或者我的序言错了吗?

我也尝试在这里关注this answer by wobsta, 但除了太复杂之外,它对我也不起作用。 (在这种情况下,PyX似乎不理解metafont消息。)

直接在具有相同前导码的简单utf-8输入文件上运行latex 顺便说一下工作正常。

1 个答案:

答案 0 :(得分:2)

查看PyX代码揭示了这个问题。 文本模块使用utf-8编码准备io.TextIOWrapper以用于TeX输入。 text.preamblecanvas.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的引用,该引用是使用文本模块的当前设置设置的。更改的文本模块设置永远不会影响画布实例。因此,在创建要在其中绘制文本的画布之前,必须先设置文本模块。

感谢任何研究过此事的人。