处理 pl 文件中的单词边界

处理 pl 文件中的单词边界

在文件中表达替换规则的最简单方法是什么,例如“如果后面有一个字母,则将‘s’替换为‘ſ’”和“如果后面有一个非字母/单词边界,则将‘g’替换为‘g.final’” pl

语境

我仍在努力我的黑体字体使用某种风格的 LaTeX。我取得了很大进展,使它适应 vanilla pdflatex。(使用 perl 脚本为文件编写连字符部分pl,因为 FontForge 不会将连字符导出到 tfm。该脚本也位于该存储库中。)

我很难找到文件语言的文档pl。我想我之前找到过一个,但我再也找不到了。

声明是否(BOUNDARYCHAR O 14)定义了使用哪个字符来排版空格?

这是否意味着,如果我希望点和逗号也充当单词边界,我需要明确添加它们,从而扩展

(BOUNDARYCHAR O 14)
...
(LABEL BOUNDARYCHAR)
(LIG O 167 O 30)
(LIG O 166 O 27)
(STOP)
(LABEL O 163)
(LIG O 14 O 33)
(STOP)

(BOUNDARYCHAR O 14)
...
(LABEL BOUNDARYCHAR)
(LIG O 167 O 30)
(LIG O 166 O 27)
(STOP)
(LABEL O 54)
(LIG O 167 O 30)
(LIG O 166 O 27)
(STOP)
(LABEL O 56)
(LIG O 167 O 30)
(LIG O 166 O 27)
(STOP)
(LABEL O 163)
(LIG O 14 O 33)
(LIG O 54 O 33)
(LIG O 56 O 33)
(STOP)

如果我还想让其他非字母成为单词边界,情况会更糟吗?由于字母和非字母的数量都相当多,将“如果后面有一个非字母,则将‘ſ’替换为‘s’”更改为“如果后面有一个字母,则将‘s’替换为‘ſ’”似乎也不容易。有没有好的方法可以做到这一点,最好是一种不需要在每个(LABEL)块中列出字体中一半字符的方法?

答案1

我一直使用 fontinst 来做这件事。但是,如果你想直接这样做,我思考你需要这样的东西:

(BOUNDARYCHAR O 14)

这并没有为 TeX 定义一个空间。它是一个插槽。你甚至不需要在其中放入任何东西。事实上,如果你不需要为任何字符使用该插槽,即如果你可以腾出一个插槽,那么事情就会容易得多只是标记边界。它为 TeX 标记一个单词结尾。要获得单词结尾处的不同字符,您需要创建由该字符组成的连字,并告诉 TeX 在常规字符后跟边界字符时使用该连字。您的代码试图以错误的方式执行连字。

假设 h 是一个在单词末尾需要以不同方式排版的字符。那么当你在 pl 文件中看到 h 时,你可以这样做:

(LABEL C h)
(LIG O 14 O 158)

其中 h.final 来自槽 158。您可以以相同的方式处理 longs/s。如果 longs 位于槽 145,则说:

(LABEL O 145)
(LIG O 14 O C s)

(您可能需要使用 O 和插槽号而不是“C s” - 我不确定。)

免责声明:我从未尝试直接编辑这些文件。我读过它们来调试我的代码或检查一些东西或出于好奇,但我从来没有这样做过。我一直使用 fontinst 来制作它们。

但是 TeX 会逐个标记地读取行。因此,您希望它找到长整型,例如,然后找到单词边界,并在这种情况下切换到常规的 s。您的代码会将后跟 h 的单词边界替换为 h.final。这不仅不是您想要的,而且它不会起作用,因为如果 h 是下一个字符,它就不能是单词结尾的边界。

不要担心单词边界是由什么构成的。让 TeX 来担心单词边界是由什么构成的 - 你只需弄清楚在单词边界处会发生什么。

这做起来比解释起来容易,尽管我确实认为 fontinst 可以为您节省大量工作!

相关内容