上古时期的 TeX Users 都有哪些当今 TeX Users 无法想象的神级操作?
生活随笔
收集整理的這篇文章主要介紹了
上古时期的 TeX Users 都有哪些当今 TeX Users 无法想象的神级操作?
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
劉海洋 李阿玲?等 26 人贊同 上古時(shí)期的 TeX Users 都有哪些當(dāng)今 TeX Users 無(wú)法想象的神級(jí)操作? TeX 在軟件中不算最復(fù)雜的一類,TeX 代碼相比正經(jīng)的編程語(yǔ)言也沒(méi)那么復(fù)雜。何況寫文檔不是打電子游戲,所以所謂「神級(jí)操作」其實(shí)是沒(méi)有的,這種叫法也讓我感覺(jué)怪怪的。
而且,計(jì)算機(jī)軟件的發(fā)展,總體是越來(lái)越復(fù)雜的。受限于計(jì)算機(jī)性能和人們的腦洞,二三十年前人們寫的 TeX 代碼是遠(yuǎn)沒(méi)有今天的復(fù)雜的。像 pgfplots 這種能用宏展開(kāi)計(jì)算 3D 曲面圖的長(zhǎng)達(dá)數(shù)萬(wàn)行的 TeX 代碼怪獸,在過(guò)去那個(gè)排版厚一點(diǎn)的書就擔(dān)心內(nèi)存不足的時(shí)代才是難以想象的。
技術(shù)大概有兩種,一類是從過(guò)去到現(xiàn)在一直在用的,基本而重要的東西;還有一類是隨時(shí)間逐漸消失,不為人所知的,那一般就是淘汰的技術(shù)。上古有而今天的人無(wú)法想象的技術(shù),大多屬于不適應(yīng)時(shí)代發(fā)展而淘汰的東西。所以在技術(shù)這方面沒(méi)必要泥古,這和武俠小說(shuō)中越古老的秘籍越厲害不是一回事。
─────────────────────────────────────────────
至于說(shuō)要了解早期的 TeX 代碼有點(diǎn)什么特別的東西,找找代碼來(lái)看看就知道了。比如說(shuō),在?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 就是把輸入?yún)?shù)作為點(diǎn)陣數(shù)據(jù),直接用 \special 輸出為 PostScript 代碼的點(diǎn)陣圖。
這個(gè)宏實(shí)際用起來(lái)是這樣的:
\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 其實(shí)就是秦九韶的「韶」字。用 Dvips 編譯出來(lái)放大點(diǎn)看長(zhǎng)這樣:
看到這里就明白了,這就是個(gè)處理個(gè)別點(diǎn)陣字的土辦法。
這種東西當(dāng)今的 TeX 用戶確實(shí)不大容易想象。不過(guò)這種代碼讀完并不會(huì)覺(jué)得這種東西是什么神級(jí)操作。至少我當(dāng)時(shí)的第一感覺(jué)就是,還不如直接一個(gè)字做一個(gè) eps 圖片插圖呢。 編輯于 2016-06-12?添加評(píng)論?感謝? 分享 ?收藏???沒(méi)有幫助???舉報(bào)???作者保留權(quán)利 李阿玲 Belleve?等 29 人贊同 大鷹在邀請(qǐng)我回答這個(gè)問(wèn)題的時(shí)候,我正在青海寧夏一帶活動(dòng),所以沒(méi)有時(shí)間來(lái)得及回答。
TeX這個(gè)語(yǔ)言的繁瑣之處以前也有講過(guò)不少了,和運(yùn)算型語(yǔ)言比較,宏語(yǔ)言中大有trick可玩,簡(jiǎn)單的,直接改\catcode,在加上一定量的宏這樣可以在TeX中實(shí)現(xiàn)Basic或者Lisp的解釋器。使用\expandafter以及\let等的trick也有得玩,加上一些數(shù)寄存器或者dimen寄存器可以實(shí)現(xiàn)一些遞歸宏。對(duì)于這種可以把玩的東西,初學(xué)者使用The TeXbook即可,想要cookbook就需要看Victor Eijkhout的這本書:
這個(gè)書的時(shí)代比較早,最初在TUGboat上連載,基本上把標(biāo)準(zhǔn)的TeX82中的trick都完整覆蓋了。下載地址為:VictorEijkhout / TeX by Topic。當(dāng)然,Victor Eijkhout還有本叫做The Computer Science of TeX and LaTeX的書,這個(gè)適合有一點(diǎn)計(jì)算機(jī)基礎(chǔ)的人閱讀(比如懂一點(diǎn)編譯原理),可見(jiàn)The Computer Science of TeX and LaTeX。
上面提到的改catcode的,最簡(jiǎn)單的最直觀的可以參考下面地址:Introduction to Poor Man's Chinese TeX。即Poor Man's 中文 TeX 簡(jiǎn)介,中央研究院計(jì)算中心,ASPAC計(jì)畫。我當(dāng)年看到這個(gè)東西的時(shí)候,真是笨的要命,一點(diǎn)計(jì)算機(jī)基礎(chǔ)都沒(méi)有,把這個(gè)文章的代碼抄下來(lái)看了半個(gè)月才明白。這種時(shí)間可以浪費(fèi),但也就適合在大學(xué)浪費(fèi)了。以前的漢字編碼都是雙字節(jié)編碼的時(shí)代,這種改catcode的方式是最簡(jiǎn)單也最高效的,但是現(xiàn)在已經(jīng)不怎么完全適用了,尤其是有了Unicode之后。(順便發(fā)現(xiàn)了我以前寫的東西:如何快速查看 LaTeX 的宏命令的實(shí)現(xiàn)? - LaTeX)
九十年代的漢字處理,尤其是在DOS系統(tǒng)之下,有著大量的點(diǎn)陣字體處理的場(chǎng)景。無(wú)論是poorman方法,CJK方法,CCT方法,中間都繞不過(guò)點(diǎn)陣字體。在舊的CCT之中,有個(gè)工具是專門來(lái)拼點(diǎn)陣生僻字的,上個(gè)月我還接觸過(guò)這一部分的內(nèi)容,但是這種東西在現(xiàn)在基本上用不到了。這種東西說(shuō)起來(lái)并不長(zhǎng)臉,只是那個(gè)時(shí)代各種匱乏的結(jié)果。
還有一個(gè)值得提一提的東西是Omega。這個(gè)東西給TeX打的補(bǔ)丁的長(zhǎng)度幾乎是TeX代碼本身的長(zhǎng)度。Omega本身有著復(fù)雜的排版功能,OTP/OCP之類能夠使它能夠處理很多復(fù)雜的語(yǔ)言文本。但是,這東西本身已經(jīng)過(guò)時(shí)了,因?yàn)樗呐渲梅爆嵰灾劣陂_(kāi)發(fā)者都是很少的幾個(gè)人。和其他的引擎不同,比如XeTeX中控制layout engine的東西,文檔寫的清楚,寫宏來(lái)控制也不難。Omega的一部分功能,現(xiàn)在在LuaTeX之中還能看見(jiàn),但是這些功能卻也是不痛不癢的。
在繪圖技術(shù)上,以前有Xy-pic和PSTricks。但是現(xiàn)在基本上是幾個(gè)獨(dú)立的繪圖語(yǔ)言+TiKZ的天下了。一方面是這些語(yǔ)言以及TiKZ在設(shè)計(jì)上比較現(xiàn)代,在應(yīng)用庫(kù)上也很豐富,加之頁(yè)面描述語(yǔ)言以及各種驅(qū)動(dòng)宏的開(kāi)發(fā)規(guī)模比較大,所以很多老的包都使用的不多了。PSTricks這個(gè)東西,就是通過(guò)\special中添加PostScript代碼,最后在DVI解析的時(shí)候,把這部分代碼插到PS文件里面,這種東西確實(shí)在九十年代比較流行,甚至有個(gè)專門處理到PS的引擎VTeX(MicroPress Home Page)。但是隨著2000年以來(lái)PDF的流行,PS的使用范圍逐漸沒(méi)落,社區(qū)里面的PS處理工具并沒(méi)有比PDF豐富多少,或多或少都依賴GhostScript,甚至于dvips現(xiàn)在都不支持位圖文件的插圖。
有個(gè)有意思的東西,比如有德國(guó)的留學(xué)生說(shuō)過(guò)德國(guó)現(xiàn)在還有不少人在使用plain TeX,我是不太驚訝的,對(duì)于英文等等,其實(shí)plain很好用,也有一部分俄羅斯人現(xiàn)在也用plain TeX。在plain TeX下面想要打漢字,除了pTeX系之外,XeTeX和LuaTeX或多或少都可以進(jìn)行,這都依賴于特定的包和一串特定的宏。我在2012年開(kāi)始寫一些plain格式的小測(cè)試文件。自由度是很高的,當(dāng)然這也僅僅是指語(yǔ)法,想要特定的樣式,LaTeX還是方便不少。
from:?https://www.zhihu.com/question/47175617#answer-37694377
而且,計(jì)算機(jī)軟件的發(fā)展,總體是越來(lái)越復(fù)雜的。受限于計(jì)算機(jī)性能和人們的腦洞,二三十年前人們寫的 TeX 代碼是遠(yuǎn)沒(méi)有今天的復(fù)雜的。像 pgfplots 這種能用宏展開(kāi)計(jì)算 3D 曲面圖的長(zhǎng)達(dá)數(shù)萬(wàn)行的 TeX 代碼怪獸,在過(guò)去那個(gè)排版厚一點(diǎn)的書就擔(dān)心內(nèi)存不足的時(shí)代才是難以想象的。
技術(shù)大概有兩種,一類是從過(guò)去到現(xiàn)在一直在用的,基本而重要的東西;還有一類是隨時(shí)間逐漸消失,不為人所知的,那一般就是淘汰的技術(shù)。上古有而今天的人無(wú)法想象的技術(shù),大多屬于不適應(yīng)時(shí)代發(fā)展而淘汰的東西。所以在技術(shù)這方面沒(méi)必要泥古,這和武俠小說(shuō)中越古老的秘籍越厲害不是一回事。
─────────────────────────────────────────────
至于說(shuō)要了解早期的 TeX 代碼有點(diǎn)什么特別的東西,找找代碼來(lái)看看就知道了。比如說(shuō),在?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 就是把輸入?yún)?shù)作為點(diǎn)陣數(shù)據(jù),直接用 \special 輸出為 PostScript 代碼的點(diǎn)陣圖。
這個(gè)宏實(shí)際用起來(lái)是這樣的:
\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 其實(shí)就是秦九韶的「韶」字。用 Dvips 編譯出來(lái)放大點(diǎn)看長(zhǎng)這樣:
看到這里就明白了,這就是個(gè)處理個(gè)別點(diǎn)陣字的土辦法。
這種東西當(dāng)今的 TeX 用戶確實(shí)不大容易想象。不過(guò)這種代碼讀完并不會(huì)覺(jué)得這種東西是什么神級(jí)操作。至少我當(dāng)時(shí)的第一感覺(jué)就是,還不如直接一個(gè)字做一個(gè) eps 圖片插圖呢。 編輯于 2016-06-12?添加評(píng)論?感謝? 分享 ?收藏???沒(méi)有幫助???舉報(bào)???作者保留權(quán)利 李阿玲 Belleve?等 29 人贊同 大鷹在邀請(qǐng)我回答這個(gè)問(wèn)題的時(shí)候,我正在青海寧夏一帶活動(dòng),所以沒(méi)有時(shí)間來(lái)得及回答。
TeX這個(gè)語(yǔ)言的繁瑣之處以前也有講過(guò)不少了,和運(yùn)算型語(yǔ)言比較,宏語(yǔ)言中大有trick可玩,簡(jiǎn)單的,直接改\catcode,在加上一定量的宏這樣可以在TeX中實(shí)現(xiàn)Basic或者Lisp的解釋器。使用\expandafter以及\let等的trick也有得玩,加上一些數(shù)寄存器或者dimen寄存器可以實(shí)現(xiàn)一些遞歸宏。對(duì)于這種可以把玩的東西,初學(xué)者使用The TeXbook即可,想要cookbook就需要看Victor Eijkhout的這本書:
這個(gè)書的時(shí)代比較早,最初在TUGboat上連載,基本上把標(biāo)準(zhǔn)的TeX82中的trick都完整覆蓋了。下載地址為:VictorEijkhout / TeX by Topic。當(dāng)然,Victor Eijkhout還有本叫做The Computer Science of TeX and LaTeX的書,這個(gè)適合有一點(diǎn)計(jì)算機(jī)基礎(chǔ)的人閱讀(比如懂一點(diǎn)編譯原理),可見(jiàn)The Computer Science of TeX and LaTeX。
上面提到的改catcode的,最簡(jiǎn)單的最直觀的可以參考下面地址:Introduction to Poor Man's Chinese TeX。即Poor Man's 中文 TeX 簡(jiǎn)介,中央研究院計(jì)算中心,ASPAC計(jì)畫。我當(dāng)年看到這個(gè)東西的時(shí)候,真是笨的要命,一點(diǎn)計(jì)算機(jī)基礎(chǔ)都沒(méi)有,把這個(gè)文章的代碼抄下來(lái)看了半個(gè)月才明白。這種時(shí)間可以浪費(fèi),但也就適合在大學(xué)浪費(fèi)了。以前的漢字編碼都是雙字節(jié)編碼的時(shí)代,這種改catcode的方式是最簡(jiǎn)單也最高效的,但是現(xiàn)在已經(jīng)不怎么完全適用了,尤其是有了Unicode之后。(順便發(fā)現(xiàn)了我以前寫的東西:如何快速查看 LaTeX 的宏命令的實(shí)現(xiàn)? - LaTeX)
九十年代的漢字處理,尤其是在DOS系統(tǒng)之下,有著大量的點(diǎn)陣字體處理的場(chǎng)景。無(wú)論是poorman方法,CJK方法,CCT方法,中間都繞不過(guò)點(diǎn)陣字體。在舊的CCT之中,有個(gè)工具是專門來(lái)拼點(diǎn)陣生僻字的,上個(gè)月我還接觸過(guò)這一部分的內(nèi)容,但是這種東西在現(xiàn)在基本上用不到了。這種東西說(shuō)起來(lái)并不長(zhǎng)臉,只是那個(gè)時(shí)代各種匱乏的結(jié)果。
還有一個(gè)值得提一提的東西是Omega。這個(gè)東西給TeX打的補(bǔ)丁的長(zhǎng)度幾乎是TeX代碼本身的長(zhǎng)度。Omega本身有著復(fù)雜的排版功能,OTP/OCP之類能夠使它能夠處理很多復(fù)雜的語(yǔ)言文本。但是,這東西本身已經(jīng)過(guò)時(shí)了,因?yàn)樗呐渲梅爆嵰灾劣陂_(kāi)發(fā)者都是很少的幾個(gè)人。和其他的引擎不同,比如XeTeX中控制layout engine的東西,文檔寫的清楚,寫宏來(lái)控制也不難。Omega的一部分功能,現(xiàn)在在LuaTeX之中還能看見(jiàn),但是這些功能卻也是不痛不癢的。
在繪圖技術(shù)上,以前有Xy-pic和PSTricks。但是現(xiàn)在基本上是幾個(gè)獨(dú)立的繪圖語(yǔ)言+TiKZ的天下了。一方面是這些語(yǔ)言以及TiKZ在設(shè)計(jì)上比較現(xiàn)代,在應(yīng)用庫(kù)上也很豐富,加之頁(yè)面描述語(yǔ)言以及各種驅(qū)動(dòng)宏的開(kāi)發(fā)規(guī)模比較大,所以很多老的包都使用的不多了。PSTricks這個(gè)東西,就是通過(guò)\special中添加PostScript代碼,最后在DVI解析的時(shí)候,把這部分代碼插到PS文件里面,這種東西確實(shí)在九十年代比較流行,甚至有個(gè)專門處理到PS的引擎VTeX(MicroPress Home Page)。但是隨著2000年以來(lái)PDF的流行,PS的使用范圍逐漸沒(méi)落,社區(qū)里面的PS處理工具并沒(méi)有比PDF豐富多少,或多或少都依賴GhostScript,甚至于dvips現(xiàn)在都不支持位圖文件的插圖。
有個(gè)有意思的東西,比如有德國(guó)的留學(xué)生說(shuō)過(guò)德國(guó)現(xiàn)在還有不少人在使用plain TeX,我是不太驚訝的,對(duì)于英文等等,其實(shí)plain很好用,也有一部分俄羅斯人現(xiàn)在也用plain TeX。在plain TeX下面想要打漢字,除了pTeX系之外,XeTeX和LuaTeX或多或少都可以進(jìn)行,這都依賴于特定的包和一串特定的宏。我在2012年開(kāi)始寫一些plain格式的小測(cè)試文件。自由度是很高的,當(dāng)然這也僅僅是指語(yǔ)法,想要特定的樣式,LaTeX還是方便不少。
from:?https://www.zhihu.com/question/47175617#answer-37694377
總結(jié)
以上是生活随笔為你收集整理的上古时期的 TeX Users 都有哪些当今 TeX Users 无法想象的神级操作?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 写给准爸爸的专业指导
- 下一篇: 老鼠怕猫是鼻子决定的?!