600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 上古时期的 TeX Users 都有哪些当今 TeX Users 无法想象的神级操作?

上古时期的 TeX Users 都有哪些当今 TeX Users 无法想象的神级操作?

时间:2020-05-01 20:37:40

相关推荐

上古时期的 TeX Users 都有哪些当今 TeX Users 无法想象的神级操作?

刘海洋 李阿玲等 26 人赞同

上古时期的 TeX Users 都有哪些当今 TeX Users 无法想象的神级操作?
TeX 在软件中不算最复杂的一类,TeX 代码相比正经的编程语言也没那么复杂。何况写文档不是打电子游戏,所以所谓「神级操作」其实是没有的,这种叫法也让我感觉怪怪的。

而且,计算机软件的发展,总体是越来越复杂的。受限于计算机性能和人们的脑洞,二三十年前人们写的 TeX 代码是远没有今天的复杂的。像 pgfplots 这种能用宏展开计算 3D 曲面图的长达数万行的 TeX 代码怪兽,在过去那个排版厚一点的书就担心内存不足的时代才是难以想象的。

技术大概有两种,一类是从过去到现在一直在用的,基本而重要的东西;还有一类是随时间逐渐消失,不为人所知的,那一般就是淘汰的技术。上古有而今天的人无法想象的技术,大多属于不适应时代发展而淘汰的东西。所以在技术这方面没必要泥古,这和武侠小说中越古老的秘籍越厉害不是一回事。

─────────────────────────────────────────────

至于说要了解早期的 TeX 代码有点什么特别的东西,找找代码来看看就知道了。比如说,在Macros for The Art of Computer Programming里面有一小段宏,是这样的:

\newdimen\bitmapsize \bitmapsize=10pt{\catcode`\.=\active\gdef\bitmap#1:#2:#3:#4:#5:#6<#7>% ems:cols:rows:-hoff:rows+voff<hexbitmap>{{\leavevmode \let.\period \hbox to#2\bitmapsize{\special{" 0 0 moveto currentpoint translate\bitm@psize \bitm@psize scale #3 #4 true[#1 0 0 -#1 #5 #6] {<#7>} imagemask}\hss}}}\gdef\defineindexperiod{\def.{\period\par\hangindent 2em }}}\def\indexnoperiod{\par\hangindent 2em}{\catcode`p=12\catcode`t=12\gdef\bm@ff#1pt{#1}}\gdef\bitm@psize{\expandafter\bm@ff\the\bitmapsize\space}

这里面的 \bitmap 就是把输入参数作为点阵数据,直接用 \special 输出为 PostScript 代码的点阵图。

这个宏实际用起来是这样的:

\bitmap74:1.08:72:72:-3:60% G4156<0003800000000000000003c00000000000000001e00000000000000000f0000000000000%0000fc00000000000000007c00000000007000007c0000000001fc00007e0700000003fe%00007e0f8fffffffff00007e1fc7ffffffff00007c3fe3fffffffc3ffffffff001f001f8%1ffffffff801f001f8080000300001f000f80000003c0001f000f80000007e0001f000f8%00e0007f0001f000f80070007f0001f000f80038007e0001f000f8003c007c0001f000f8%001e00f80003f000f8001f00f00003e000f8000f81f00003e001f8000fc1e00003c001f8%000fc3c00007c001f0000fc3c00007c001f0000f8780f0078003f0000f8781f80f8003f0%00070f01fc0f0007e000000f03fe1f3f07e0ffffffffff1e3fffe07fffffffff3c07ffc0%3c000000003800ff80000000000078007f800000000000f0003f000000000001e0003800%01c0001c03c000200001f0001f070000000001fc003f8e0000000001ffffffcce00001e0%01ffffffc8f80001f001f8001f00fe0003f801f8001f00fffffffc01f8001f00fffffffc%01f8001f007c0003f801f8001f007c0003f001f8001f007c0003f001f8001f007c0003f0%01f8001f007c0003f001f8001f007c0003f001ffffff007c0003f001ffffff007c0003f0%01f8001f007c0003f001f8001f007c0003f001f8001f007c0003f001f8001f007c0003f0%01f8001f007c0003f001f8001f007c0003f001f8001f007c0003f001f8001f007c0003f0%01f8001f007c0003f001f8001f007c0003f001ffffff007c0003f001ffffff007c0003f0%01ffffff007ffffff001f8001f007ffffff001f8001f007c0003f001f8001f007c0003f0%01f8001f007c0003f001f8001f00fc0003f001f8000000fc0003f001f8000000fc0003c0%>%% Unicode char "97f6

其实就是秦九韶的「韶」字。用 Dvips 编译出来放大点看长这样:

看到这里就明白了,这就是个处理个别点阵字的土办法。

这种东西当今的 TeX 用户确实不大容易想象。不过这种代码读完并不会觉得这种东西是什么神级操作。至少我当时的第一感觉就是,还不如直接一个字做一个 eps 图片插图呢。编辑于 -06-12添加评论感谢 分享 收藏•没有帮助•举报•作者保留权利李阿玲 Belleve等 29 人赞同 大鹰在邀请我回答这个问题的时候,我正在青海宁夏一带活动,所以没有时间来得及回答。

TeX这个语言的繁琐之处以前也有讲过不少了,和运算型语言比较,宏语言中大有trick可玩,简单的,直接改\catcode,在加上一定量的宏这样可以在TeX中实现Basic或者Lisp的解释器。使用\expandafter以及\let等的trick也有得玩,加上一些数寄存器或者dimen寄存器可以实现一些递归宏。对于这种可以把玩的东西,初学者使用The TeXbook即可,想要cookbook就需要看Victor Eijkhout的这本书:

这个书的时代比较早,最初在TUGboat上连载,基本上把标准的TeX82中的trick都完整覆盖了。下载地址为:VictorEijkhout / TeX by Topic。当然,Victor Eijkhout还有本叫做The Computer Science of TeX and LaTeX的书,这个适合有一点计算机基础的人阅读(比如懂一点编译原理),可见The Computer Science of TeX and LaTeX。

上面提到的改catcode的,最简单的最直观的可以参考下面地址:Introduction to Poor Man's Chinese TeX。即Poor Man's 中文 TeX 簡介,中央研究院計算中心,ASPAC計畫。我当年看到这个东西的时候,真是笨的要命,一点计算机基础都没有,把这个文章的代码抄下来看了半个月才明白。这种时间可以浪费,但也就适合在大学浪费了。以前的汉字编码都是双字节编码的时代,这种改catcode的方式是最简单也最高效的,但是现在已经不怎么完全适用了,尤其是有了Unicode之后。(顺便发现了我以前写的东西:如何快速查看 LaTeX 的宏命令的实现? - LaTeX)

九十年代的汉字处理,尤其是在DOS系统之下,有着大量的点阵字体处理的场景。无论是poorman方法,CJK方法,CCT方法,中间都绕不过点阵字体。在旧的CCT之中,有个工具是专门来拼点阵生僻字的,上个月我还接触过这一部分的内容,但是这种东西在现在基本上用不到了。这种东西说起来并不长脸,只是那个时代各种匮乏的结果。

还有一个值得提一提的东西是Omega。这个东西给TeX打的补丁的长度几乎是TeX代码本身的长度。Omega本身有着复杂的排版功能,OTP/OCP之类能够使它能够处理很多复杂的语言文本。但是,这东西本身已经过时了,因为它的配置繁琐以至于开发者都是很少的几个人。和其他的引擎不同,比如XeTeX中控制layout engine的东西,文档写的清楚,写宏来控制也不难。Omega的一部分功能,现在在LuaTeX之中还能看见,但是这些功能却也是不痛不痒的。

在绘图技术上,以前有Xy-pic和PSTricks。但是现在基本上是几个独立的绘图语言+TiKZ的天下了。一方面是这些语言以及TiKZ在设计上比较现代,在应用库上也很丰富,加之页面描述语言以及各种驱动宏的开发规模比较大,所以很多老的包都使用的不多了。PSTricks这个东西,就是通过\special中添加PostScript代码,最后在DVI解析的时候,把这部分代码插到PS文件里面,这种东西确实在九十年代比较流行,甚至有个专门处理到PS的引擎VTeX(MicroPress Home Page)。但是随着2000年以来PDF的流行,PS的使用范围逐渐没落,社区里面的PS处理工具并没有比PDF丰富多少,或多或少都依赖GhostScript,甚至于dvips现在都不支持位图文件的插图。

有个有意思的东西,比如有德国的留学生说过德国现在还有不少人在使用plain TeX,我是不太惊讶的,对于英文等等,其实plain很好用,也有一部分俄罗斯人现在也用plain TeX。在plain TeX下面想要打汉字,除了pTeX系之外,XeTeX和LuaTeX或多或少都可以进行,这都依赖于特定的包和一串特定的宏。我在开始写一些plain格式的小测试文件。自由度是很高的,当然这也仅仅是指语法,想要特定的样式,LaTeX还是方便不少。

from:/question/47175617#answer-37694377

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。