為何大多數 LaTeX 編輯器連中英文混排時的自動換行都不支持?

LaTeX 對中文的支持一直不好可以理解,但是為何那麼多編輯器連最基本的中英文混排時的自動換行都做不好?是技術上的原因還是因為不重視?


不好是多不好?大多數是多大多數?

LaTeX 的中文支持(中國大陸使用):

  • 1990 年代初中科院幾個下屬單位聯合開發 CCT 系統,還有同時期的天元 TeX,都是維護十年以上的中文 TeX 系統。1993 年就出版了《CCT(TeX 軟體中文介面)中外文科技激光照排系統用戶手冊》。Knuth 的 TAOCP 中的少量漢字字體就來自 CCT 的點陣字。

  • 1997 年 Werner Lemberg 的 CJK 宏包以成熟的姿態在 TUG 上介紹:tug.org 的頁面

    此後國內產生各種字體包裝腳本、文檔譯介等,最後集大成於 ChinaTeX 套裝和 CTeX 套裝。

  • 2007 年開始的 XeTeX 支持:zhspacing、xeCJK 宏包。
  • 2009 年發布 zhmetrics,簡化字體安裝(解決了版權問題);同時 ctex-kit 項目向 CTAN 發布中文定製包。西方發布的發行版可以都很容易使用中文。
  • 2012 年,LuaTeX-ja 的譯介,zhmCJK 發布。

現在 2014 年都快過完了,二十多年來 LaTeX 的中文支持方案換了多少方案,排版了多少書籍,如何也稱不上「一直不好」。不過是一直有很多人用不好,一方面是在各種「套裝」出現前配置不易,一方面也是是因為以前資料少,入門時就不得法——不過那都是很久遠的事了。

那麼編輯器?列舉幾種常見的編輯器:

  • TeXworks:支持。開發環境:Qt。

  • WinEdt 從 2012 年初 7.0 開始支持正確的中文換行和標點禁則。開發環境:Delphi。

  • TeXmaker 支持。開發環境:Qt。

  • TeXstudio:是 TeXmaker 的分支,支持。
  • VIM:現代版本支持。
  • Emacs:現代版本支持。
  • Kile:支持。開發環境:KDE/Qt。
  • TeXshop:支持。

以上列表之外的 LaTeX 編輯器,哪還算得上「大多數」呢。

那麼,不支持中英文混排是自動折行的編輯器還有沒有?自然有的。早期一些編輯器連中文輸入顯示都不支持,更別說折行了。支持 Unicode 的編輯器基本就沒有這個問題。我們用的絕大多數編輯器都是西方人開發的(除了 Notepad++ 作者是台灣人),以前不支持 Unicode,不支持漢字折行(西文只要在空格處折行即可),再正常不過。但隨著 Unicode 的日益重要,這樣的編輯器越來越沒市場了。

那麼當開發者注意到 Unicode 的必要性以後,又難在哪裡?我認為是開發環境和背景知識。

  • 開發環境。WinEdt 是 Delphi 開發,早期 Delphi 界面沒有用 Unicode,後面再改就非常難。另一方面,如果編輯器是用 Qt 之類環境做的,如果編輯窗口就是 Qt 的控制項,那甚至可以不用做什麼特別支持,控制項自然就把斷行做好。
  • 背景知識。正確的 Unicode 斷行是非常複雜且專業的演算法,UAX #14: Unicode Line Breaking Algorithm,基本上只有瀏覽器這樣的大型軟體才會顧及。普通的西方開發者除了空格後斷行外對其他語言如何斷行一無所知,有心也無力。

舉個實例。WinEdt 在這方面就同時遭遇了多方面的困難。一方面,代碼歷史很久,90 年代中期讓一對美國夫婦開發編輯器支持中文,當然很難,雖然早在 Unicode 編碼支持之前就加入了 CJK 的整字處理功能,但仍然不能完整支持。WinEdt 遺留的 Delphi 代碼到使它到 2012 年才完成 Unicode 的移植(更換編譯環境到 Delphi XE)。這些是軟體技術上的問題。另一方面,2012 年當我給 Aleksander Simonic 發郵件詢問有關折行的問題,我一開始向他提及 UAX #14 的演算法,他回復說:

So far I did not give any consideration to word wrapping for CJK.


The above guidelines are a bit too complicated for a text editor.

A simpler algorithm (like VIM) might be feasible. Perhaps you can


give me a short sample with CJK and when I introduce this kind of


wrapping you can test it further to see that it works reasonably


well.

…………

Note that I don"t speak any language that uses characters in this


range. I will need your help to give me a sample document and do


some testing.

所以說這又是文化背景問題了。一個土生土長的中國人當然一下子就能判斷出什麼斷行是對的什麼是錯的,但土生土長的美國人不行。我又向他建議簡化的演算法:表意符後可斷行,左標點後禁止右標點前禁止斷行(左標點前右標點後可以斷行)。於是 WinEdt 7 的折行功能就正常了,而且禁則功能比其他編輯器要強。開發者通常還是很友好的。

那麼有沒有開發者懶的情形呢?大約也是有的。TUG 資助的 TeXworks 自成型後就幾乎再沒有什麼功能上的更新(最近的更新甚至僅僅是變更版本號),沒有投入,開發者也沒有動力做。LaTeX 編輯器之外類似的例子是,Source Insight 多年以來也沒有更新,一直不支持 Unicode,但軟體這麼多年一直在賣,作者也沒有動力更新——不過想必 Source Insight 的遺留代碼也很難修改。所謂的懶其實主要是沒有動力,沒有經濟回報,開發自然就慢了。


編輯器?編輯器是因為那群老美不知道世界上有些語言可以不用空白斷行。vscode 的斷行和禁則代碼還是我寫的呢(當時 @rebornix應該還沒進微軟)


推薦閱讀:

如何推薦理工專業的同學使用LaTeX排版?
如何評價「LaTeX 的編輯效率大幅低於 Word」的研究?
側重於介紹公式編輯的LaTeX中文入門書有哪些?
LaTeX 中圖和表如何並排?
怎麼把填空題的答案隱藏起來?

TAG:文本編輯器 | LaTeX |