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 請輸入要替換...