xeCJK 通過檔名呼叫字型有問題?

時間 2021-06-06 22:31:56

1樓:

xeCJK 是通過 fontspec 巨集包 [1] 來呼叫系統字型的,這個問題其實與 xeCJK 無關:

\documentclass

\usepackage

\setmainfont

\begin

\textsl

\end

將名稱用方括號包起來表示檔名,這是 XeTeX 底層的語法。實際上 fontspec 的使用者手冊中並沒有提及這種語法,想通過檔名呼叫字型,並不需要方括號。fontspec 會檢查名稱末尾是否有 .

ttc 等常見字型副檔名來判斷,加了方括號反而會導致它判斷錯誤。所以這個問題的解決辦法是把方括號去掉。同時要注意 BoldFont、ItalicFont 等名稱也必須是檔名。

以下是原因分析,略高能,需要了解一點 LaTeX 的 NFSS [2]。

fontspec 簡單地說就是為 NFSS 提供乙個簡單的設定介面,免去手寫 .fd 的麻煩。編譯上面的例子,開啟日誌檔案,會發現下面這麼一段,它記錄了 fontspec 的設定結果:

fontspec info: "defining-font"

. . Font family '[simsun.ttc](0)' created for font '[simsun.ttc]' with options

. [Ligatures=TeX].

. . This font family consists of the following shapes39;normal' with NFSS spec.:

. . and font adjustment code39;bold' with NFSS spec.:

. . and font adjustment code39;italic' with NFSS spec.:

. . and font adjustment code39;bold italic' with NFSS spec.:

. . and font adjustment code

fontspec 會做很多事情,與這個問題有關的是下面這麼三件事:

自動設定字型族的名稱,一般是字型名稱略去空格再加上編號的形式(加編號是為了可以通過不同特性來呼叫同一字型)。從日誌中發現,這裡設定的名稱是 [simsun.ttc](0)。

如果沒有指定義大利體或粗體等字形,fontspec 會給字型名稱加上 /I 或 /B 等字尾,並馬上呼叫它們,通過 \fontname 來判斷是否設定字形。大概相當於\font\1="SimSun" at 10pt

\font\2="SimSun/I" at 10pt

\ifnum\strcmp

=\z@

%% 是同乙個字型,不設定義大利體

\else

%% 不是同乙個字型,設定義大利體

\fi但這種機制只對字型內部名稱有效,對檔名是無效的 [3]。對檔名的判斷總是不相同的,因而 fontspec 在這裡也錯誤地自動設定了義大利字形。這也是 fontspec 不支援檔名方括號語法的原因。

如果 fontspec 通過副檔名判斷出是檔名,就不會進行這一步。

fontspec 在設定義大利字形時,會自動把它設定成斜體(\slshape)的替換字形。

以上三件事合起來,造成了 NFSS 語法衝突,例子可以精簡為:\documentclass

\DeclareFontFamily

{}\DeclareFontShape

{}\DeclareFontShape

{}\begin

\fontfamily

\selectfont

\textsl

\end

\DeclareFontShape 的語法是 [2]:

其中 loading-info 由一段或者數段 fontshape-decl 組成。fontshape-decl 的語法是:

可見 size-function 後面的方括號會被認為是可選引數。在我們上面的例子中 size-function 是 ssub,cmr 就被當成了 ssub 的可選引數,fontarg 就只有 /m/n,這自然是錯誤的。

通過以上分析,我們知道,顯式指定 SlantedFont,會取代掉 fontspec 自動設定的替換字形,可以避免錯誤。最新版本(v2.4a)還可以設定 NFSSFamily 為不以方括號開頭的名字(如 songti)取代掉 fontspec 自動設定的字型族名,也可以避免錯誤。

但這兩種方法都會讓 fontspec 檔名判斷錯誤,做我們上面提到的事情 2,BoldFont 等需要是內部名稱,是檔名的話需要自己用花括號包起來。

2樓:

\documentclass

\usepackage

\setCJKmainfont

[AutoFakeSlant]

\begin

\textsl

\end

檔名如何進行批量更改?

min bob 借助軟體是很簡單,不借助軟體的話,僅僅用dos和excel也能實現。寫個不用軟體,僅僅用dos excel教程給小白看,盡量把自己碰到的問題都寫下來,也作為其他答案的補充吧。整體思路 用dos匯出檔名清單 通過excel批量修改檔名,並批量改完檔名稱 回到DOS裡批處理 複製到txt...

Windows 下檔名過長如何刪除?

小陶 1,先把要刪的檔案的目錄共享出去,方法 滑鼠右鍵目錄 授予訪問許可權 共享 特定使用者 新增Everyone使用者 改許可權讀取為讀取 寫入 點共享,共享好後,如果打不開,請設定一下共享許可權高階設定。2,在另一台電腦或者本機上,連線共享,具體方法 開啟檔案目錄,在目錄框裡輸入 共享的機器的I...

如何批量去除檔名中的某些字串?

醫學插畫動畫阿杜 看到了樓上何先生的批處理,感覺很讚啊!在其基礎上我加了點輸入指定資料夾路徑,這樣就不用吧這個批處理放在某資料夾才能用了!請儲存為 批量修改或去除資料夾下的檔案 夾 名中字串.cmd echo off set p loc 請輸入索要操作的資料夾路徑 set p str1 請輸入要替換...