阅读时hymaster.tex
,部分hyacc-cm,我们发现以下语句:
重要的是使用 3.xx 版 TeX 和 3.xx 版 plain.tex。关键日期是 1989 年秋季,早期材料将不够用。在早期版本的 TeX 中,只有一种语言可以在给定时刻使用连字符 --- 除非使用 John Hobby 的“卑鄙伎俩”,这允许 Desarmenian 分发法语-英语版本的 Plain 格式。
这个“肮脏的伎俩”是什么?它显然可以让我们使用两组连字模式而无需添加\newlanguage
?
答案1
这是不是这个问题的答案。
引文中没有提到“法语-英语版本的纯文本格式”是何时发布的,但肯定是在提到的 1989 年秋季之前的某个时间。
如果你看看拖船列表按作者,你会发现雅克·德萨梅尼安发表了一篇文章拖船1984 年 11 月第 5 期第 2 号。文章标题为“如何在法语环境中运行:连字、字体、排版”。
它描述了 Plain 的法语版本(不是问题中描述的法语-英语合并版本)。简短的版本似乎是他们通过在非 ASCII 位置添加十个重音字符(和 guillemets)来定义一种特殊字体,并将生成的字体称为“French Computer Modern”(参见上面的附录)。他们在这些字体中定义了罗马和斜体类型的宏\frm
和(与继续使用常规 Computer Modern 的和\fit
一起)。然后他们为法语生成了连字模式。\rm
\it
文章还提到,有关连字符的更多细节在参考文献 [d] 中描述:
J. DÉSARMÉNIEN,用 TeX 软件对法语单词进行排序,预印本。
这似乎是几年后发表的:
J. Désarménien,法语单词的语法规则:在 TEX 中的应用, 在《技术与信息科学》卷中5,第4期,1986年(第251-265页)。
(参考文献这里和这里以及其他地方)。不幸的是,我在网上找不到这篇文章(而且我看不懂法语),所以这对我来说似乎是死路一条。但也许其他人能找到它或利用这些细节来思考一些事情。
因此(从问题中的引文来看)在 1984 年的这篇文章发表后的某个时候,Désarménien 提出了一个法语-英语合并版本,其中除了上面描述的法语连字之外,英语连字仍然可用。也许在 1986 年的论文中可以找到详细信息。
(我的想法是:从描述中提到的 John Hobby 以及 1984 年 TUGboat 文章中已经存在的一些提示来看,它可能与字体有关。TUGboat 文章提到,METAFONT 的即将推出的版本将支持 256 个插槽而不是 128 个,并且将另一个字母表的“副本”放在 256 个可用插槽的上半部分(位置 128-255)。也许这就是他们所做的(尽管 TeX 本身当时仅支持 128 个字符),并以某种方式在一半中使用英语连字符,在另一半中使用法语。)
答案2
好吧,根据 Knuth 保留(并发布)的 0 版源代码和该程序最新(2022)迭代的源代码中的一些线索,我发现了一个自己的肮脏伎俩。
首先,直到 TeX2.993(在当前 TeX3 方法之前) ,根据0,\newlanguage
每次出现都会刷新模式内存,用新的模式替换前一个模式。\patterns
tex.web
@ 每次出现 .{\patterns} 时,它都会覆盖之前输入的任何模式,因此数组不会初始化,直到 \TeX\ 看到 .{\patterns}。但是,在加载 .{INITEX} 时必须初始化一些全局变量,以防用户从未提及任何 .{\patterns}。
现在并行的代码片段在tex.web
3.141592653上给出了不同的结果
@ 每次出现 .{\patterns} 时,它都会为未来的 trie 提供更多模式,这些模式仅在尝试连字或转储格式文件时才会构建。当 trie 被压缩时,布尔变量 |trie_not_ready| 将更改为 |false|;这将禁用进一步的模式。
假设您已经恢复了以前的行为(这并不困难,但超出了当前问题的范围),使用一种语言来实现几种连字模式(或在运行时更改给定语言的模式)的一个技巧是这样的:
- 确保运行 iniTeX:此技巧不适用于预加载格式的生产版本,因为
\dump
始终禁用\patterns
。 - 为每种新“语言”分配一个新的计数器(或者只是一个新的宏);比如说
\def\rotokas{\patterns{1b 1g 1k 1p 1r 1s 1t 1v}}
\def\lingo{%
\patterns{1b 1c 1d 1f 1g 1h 1j 1k 1l 1m 1n 1p 1q 1r 1s 1t 1v 1w 1x 1z}%
}
并适当地调用该语言。
请注意,trie 和输入堆栈是有限的,因此以前的方法显然是一个临时解决方案,但仍然是一个概念证明;最好将所有替代模式放在一个定义语言的文件中(langs.tex
或其他内容),并记住 Knuth 的警告:您不能在段落中间更改模式。