今天的 fontspec 更新破壞了 fontspec_pass_args?

今天的 fontspec 更新破壞了 fontspec_pass_args?

幾個小時前,以下程式碼完美運行(Ubuntu 上的 LuaLatex、TeXlive 2016):

\DeclareDocumentCommand \SetBaseFont { o m }
 { \__fontspec_pass_args:nnn \__fontspec_SetBaseFont:nn {#1} {#2} }
\cs_new:Nn \__fontspec_SetBaseFont:nn
 {
  \long\xdef\@basefontfeatures{#1}
  \long\xdef\@basefontname{#2}
  \global\@basefontsettrue
  \ignorespaces
 }

現在,它失敗了。在此期間,我所做的就是透過 tlmgr 更新 texlive。我自己的程式碼沒有改變。我確實注意到 fontspec 是更新的軟體包之一。

我已將其範圍縮小到fontspec_pass_args其中的行。

有其他人有類似的問題嗎?

編輯:絕對是 fontspec 程式碼的更改(這位謙虛的用戶說)。我把\__fontspec_pass_args:nnn它出現在我自己的程式碼中的所有地方都編輯掉了。然後,對於我的字體定義,與以前不同,我需要使用選項括號(即使不需要任何功能):\SetBaseFont[]{Some Font}現在我的程式碼可以編譯。幸運的是,無論問題代碼做了什麼,都不是我需要的。請注意,我對具有更簡單定義的字體使用了類似的程式碼,因此這不是\long\xdef或類似的問題。

更多編輯:

在日誌檔案中(一旦我通過如上所述的編輯來編譯程式碼),我會看到許多如下所示的訊息。我不記得以前見過他們,但也許我只是沒有註意到。由於TU涉及fontspec,這裡是一個例子。這個問題其實是透過微型檢測出來的。我使用的所有字體都是 Open Type:

Package microtype Warning: Unknown slot number of character
(microtype)                `\textgreater '
(microtype)                in font encoding `TU' in protrusion list
(microtype)                `T1-default'.

也許這是相關的,也許不是。

還有更多:

我的問題其實已經有答案了!導致錯誤的原因fontspec_pass_args很簡單,最新版本的 fontspec(2.5c,三週前)不再有該指令。因此,如果其他人沒有遇到我的問題,那是因為他們沒有在自己的程式碼中模仿舊的 fontspec 程式碼。但關於TU的奇怪訊息依然存在,而且神秘莫測。

答案1

你的問題有兩個面向:

  • microtype / TU 的內容將在計劃很快某個時候的 LaTeX2e 更新中修復

  • 關於您的程式碼破解,我將向您推薦 expl3 程式設計風格指南 (l3styleguide.pdf):

私有函數(以 開頭的\__)不應在模組之間使用。

但這可能是個過於簡短的解釋:)

\__fontspec_pass_args:nnn函數旨在操作可選參數,以便您可以編寫

\fontspec[<options>]{fontname}

或者

\fontspec{fontname}[<options>]

但不是

\fontspec[<options>]{fontname}[<options>]

這都被看到了,怎麼說呢,相當不利地在 tex.sx 聊天室的 LaTeX3 Illuminati 中,因為它違背了該xparse套件提供一致的方式來處理命令參數的基本理念。

所以我花了一段時間才放棄它,也許不幸的是,現在fontspec也允許「雙重可選」形式:

\fontspec[<options>]{fontname}[<options>]

這使用了類似的東西

\DeclareDocumentCommand \fontspec { O{} m O{} }

在第 3 方代碼中,沒有人應該需要複製\__fontspec_pass_args:nnn.

事實上,APIfontspec提供了一種無需使用內部命令即可載入字體的標準方法\__。如果這沒有提供所需的內容,請隨時在 Github 儲存庫中提出功能請求。

相關內容