所以我正在尝试从Python生成后记。目前正在尝试在 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'Sxc3xb6ren Sundstrxc3xb8m'%
}{1}%
PyXInput{7}%
After parsing the return message from TeX, the following was left:
*
*! Undefined control sequence.
<argument> b'Sxc
3xb 6ren Sundstrxc 3xb 8m'
<*> }{1}
(cut after 5 lines; use errordetail.full for all output)
所以看起来乳胶接收的不是 utf-8,而是 UTF-8 的转义表示。我的问题:如何将字符串正确传递给 canvas.text?还是我的序言错了?
我也试图通过 wobsta 在 SO 上遵循这个答案,但除了太复杂之外,它也对我不起作用。(在这种情况下,看起来 PyX 不理解元字体消息(。
直接在具有相同前导码的简单 utf-8 输入文件上运行 latex顺便说一下,工作正常。
查看 PyX 代码发现了问题所在。文本模块准备一个使用 utf-8 编码的io.TextIOWrapper
,用于 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
的引用。更改的文本模块设置永远不会影响画布实例。因此,在创建要在其中绘制文本的画布之前,必须设置文本模块。
感谢任何调查此事的人。