幾個小時前,以下程式碼完美運行(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 儲存庫中提出功能請求。