使用 enscript 和 Consolas TrueType 字体打印错误

使用 enscript 和 Consolas TrueType 字体打印错误

我正在尝试使用enscript此 Python 脚本的 PDF 源代码列表创建:

import numpy as np

def f1(x):
    return x * x * np.sin(x)

但是我得到这个输出: 在此输入图像描述

我正在使用这个命令行:

enscript --filter="cat %s | iconv -f utf-8 -t iso-8859-1" -v -rG --font="Consolas@12" --highlight=python -o - -M Letter --color=0 -X 88591 test_enscript.py | ps2pdf - a.pdf
AFM: scanning path...
AFM: reading font map "/usr/local/share/enscript/afm/font.map"
AFM: reading font map "/home/arrigo/fonts/Consolas/font.map"
downloading font "Consolas"
states: autoloading `lang_enscript' from `/usr/local/share/enscript/hl/lang_enscript.st'
states: autoloading `style_emacs' from `/usr/local/share/enscript/hl/style_emacs.st'
states: autoloading `default_faces' from `/usr/local/share/enscript/hl/default_faces.st'
states: autoloading `python' from `/usr/local/share/enscript/hl/python.st'
processing file "test_enscript.py"...
[ 1 page * 1 copy ] left in -
1 character was missing

看起来空间没有正确映射到 iso-8859 编码。我已经按照说明安装了 Consolas 字体文件这里。我认为 enscript 应该能够渲染这个文件。我在 Ubuntu 23.10 下运行它。有任何想法吗?

答案1

我也不是字体专家,错过字体中的“空格”字符当然似乎没有帮助,只是因为您不需要它;enscript仍然需要知道字符的宽度,以便可以计算在哪里换行,等等。

我没有真正的解决方案,但这里有两个可能的技巧。第一种方法是简单地将?后续 PostScript 中的字符替换为空格(在它成为 pdf 之前)。这假设您的输入没有真实?字符。例如,该import numpy as np行生成

59 690 M
(?numpy?as?np) s

M这是移动到 x,y 位置的命令,也是s打印字符串的命令(...)。 PostScript 将字符串括在().您可以添加一个sed命令来替换这些“?”与“”,因为你有固定宽度的字体:

sed '/(.*)/s/?/ /g'

另一种方法是将空格字符度量添加到.afm文件中。我还没有阅读格式,但似乎您可以在适当的位置添加一行,并增加条目数。例如,我发现callig15.afm来自 reportlab 没有空格字符条目(十进制 32),正如我们所看到的:

....
StartCharMetrics 168
C 0 ; WX 143 ; N grave ; B 30 744 113 831 ;
...
C 29 ; WX 394 ; N fl ; B -188 -231 811 523 ;
C 33 ; WX 206 ; N exclam ; B 40 -7 392 341 ;
...

我们可以将条目计数从 168 增加到 169,并添加一个C 32条目,例如:

sed -i fonts/callig.afm -e '
/StartCharMetrics/s/168/169/
/^C 29 /a\
C 32 ; WX 555 ; N space ; B 0 0 0 0 ;
'

这似乎对我有用。您需要选择WX 555适合您字体的宽度值。

相关内容