我正在尝试使用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
适合您字体的宽度值。