在pyx画布中插入Unicode文本

1 投票
3 回答
959 浏览
提问于 2025-04-28 18:08

我有一组UTF-8字符,想把它们放进一个用PyX生成的PDF文件里。为了让代码支持这些字符,我在文件的开头加上了# -*- coding: utf-8 -*-。我的代码大致是这样的:

# -*- coding: utf-8 -*-
c = canvas.canvas()
txt = "u'aあä'"
c.text(2, 2, "ID: %s"%txt)
c.writeEPSfile("filename.eps")

但是我还是搞不明白这个问题。

错误信息:

'ascii' codec can't encode character u'\xae' in position 47: ordinal not in range(128)
暂无标签

3 个回答

1

也许你可以从babel这个包里找到合适的设置。我在尝试插入德语的ä(一个变音符号)时遇到了同样的错误。我只是简单地添加了德语的babel包:

text.preamble(r"\usepackage[ngerman]{babel}")

之后,这样就可以顺利使用而没有错误了:

c.text(12, 34, "äöüßß")

我还使用了utf8的输入编码,我觉得这也是必要的。

进一步阅读:
https://en.wikibooks.org/wiki/LaTeX/Internationalization
https://en.wikibooks.org/wiki/LaTeX/Fonts

1

你可以设置PyX来传递Unicode字符到(La)TeX。接下来,问题就变成了如何在TeX/LaTeX中生成这些字符。下面是一个相对简单的解决方案,可以生成你想要的输出:

from pyx import *

text.set(cls=text.LatexRunner, texenc='utf-8')
text.preamble(r'\usepackage[utf8]{inputenc}')
text.preamble(r'\usepackage{newunicodechar}')
text.preamble(r"\newunicodechar{あ}{{\usefont{U}{min}{m}{n}\symbol{'102}}}") 
text.preamble(r'\DeclareFontFamily{U}{min}{}')
text.preamble(r'\DeclareFontShape{U}{min}{m}{n}{<-> udmj30}{}')

c = canvas.canvas()
c.text(0, 0, 'UID: aあä')
c.writeGSfile('utf8.png')

这直接生成了输出(这里上传的是PNG格式): 程序输出

请注意,这个操作是在Python 3上使用PyX 0.13完成的,并且使用的是一个相对标准的LaTeX安装。此外,我还参考了一些信息,来自于https://tex.stackexchange.com/questions/171611/how-to-write-a-single-hiragana-character-in-latex,关于如何在LaTeX中创建这些字符。似乎还有像CJKutf8这样的解决方案,可以设置各种字符,以便在LaTeX中直接使用Unicode字符,但这超出了我的经验范围。无论如何,只要所有设置都正确,从PyX中使用这些功能应该和直接在LaTeX中使用一样顺利。祝你好运!

1

试试这个:

# -*- coding: utf-8 -*-
c = canvas.canvas()
txt = u'aあä'.encode('utf-8')
c.text(1, 4, "UID: %s"%(txt))
c.writeEPSfile("filename.eps")

撰写回答