首頁>Club>
7
回覆列表
  • 1 # 使用者6885375436487

    針對下面的一些情況,需要有不同的策略:

    pdfTeX + CJK,一定要手動加XeTeX + xeCJK,不一定要加pTeX/upTeX/pTeX-ng,一定不要加LuaTeX + LuaTeX-ja,一定不要加

    pTeX系列和LuaTeX就簡單些,因為都遵循JIS標準,之所以不需要加空格的原因是:空格會被轉換為一個glue,而這個glue通常都會比JIS中規定的要大不少,所以在“漢字-非漢字”之間插空格就會造成不當間距。其實這倆,對於空格的處理還是一如既往,如TeX82那樣的行為,只是加了很好的自動處理間距功能。

    XeTeX的不一定要加,是因為預設情況下,“漢字-非漢字”之間預設插入的是一個空格,所以蠢萌的例子其實不會有太大的視覺上的誤差,但,如果我們配置一下,如:

    那麼出來的距離就不對,所以,不一定要加空格只是適用於預設情況。XeTeX處理空格的行為也和TeX82一樣,只是可以設定一下char的class,然後在不同的class之間加入鉤子,xeCJK就是這麼插入間距的。但是由於XeTeX本身設計的原因,這類鉤子其實不是太好用。

    至於pdfTeX,萬年不建議使用,但是呢,在各大學校(211啦,985啦)都是有一批堅定的使用者的,這個時候,需要手動加空格,因為CJK包真不能處理這種間距。

    為嘛pTeX系和LuaTeX能夠進行精準的間距處理,因為在把文字處理為TeX內部連結串列之後,還會有額外的函式會遍歷一遍連結串列檢查一次間距,也就是說,要做兩次。或者換句話說,xeCJK使用宏實現的東西,在pTeX系中用C實現了,在LuaTeX中使用Lua callback實現了。

    那麼問題來了,pTeX系是怎樣判斷什麼是漢字,什麼是非漢字呢?使用一個固定是函式,判斷編碼是否在某個區間?當然不是這樣。TeX的大殺器,catcode就可以出場了。pTeX將TeX82的16個catcode擴充套件為了19個,其中有一個用來分配以代表漢字,而另一個代表諺文。

    那麼問題來了,TeX的catcode幹啥的呢?catcode是丟給TeX的狀態機用的東西。pTeX在讀取文字檔案的時候,會有上百種狀態(我不知道啥叫狀態機,你們自己理解去啊)。比如我們輸入一段英文,換行,然後我們又打了一段英文,如:

    這種情況輸出的最後將是:

    這裡面的空格glue就是某種狀態下,TeX在處理時自動輸入的。

    pTeX中多了一些狀態,比如:

    會出現結果:

    而不是:

    當然了,如果是非漢字的諺文,那麼會自動加入一個空格glue的。

    總結:空格在通常情況下會最終產生一個空格大小的glue,而在漢字處理的時候,如果手動加空格在某些場景下是會產生不太準確或者過大的間距,所以最好是不加空格,丟給TeX處理。如果手動加空格,也不是不可以,反正國內又不要求漢字與非漢字之間到底加多大的間距,所以在XeTeX等裡面加空格也可以的啊。

    擴充套件了內部狀態和catcode之後,這種機制就快捷粗暴多了,要不我能不耐下心做pTeX-ng嘛。

  • 中秋節和大豐收的關聯?
  • ”打工人”究竟是什麼人?