
我想對作為符號的部分進行交叉引用,但在使用給出的描述後,我收到錯誤報告,指出使用的鍵盤字元在輸入編碼“utf8”中未定義。出路可能是什麼?
答案1
如果您嘗試使用該套件在 LaTeX(下面帶有標準 TeX 引擎)中排版 utf8 編碼測試,inputenc
則會發生以下情況:
- LaTeX 將透過讀入正確數量的 8 位元字元來解析 utf8 字符,這些字符可能是一個或多個,具體取決於文件中的字符。
- 這將為 LaTeX 提供一個具有特定 unicode 編號的 unicode 字元(經過一些計算),例如
00A1
- 現在 LaTeX 將嘗試排版該字符,但為此,需要有一種字體(已加載),該字體實際上包含表示 unicode 字符的字形,並且...
- LaTeX 需要知道這個事實。
- LaTeX 透過大量以下形式的聲明來了解這一點
\DeclareUnicodeCharacter{00A1}{\textexclamdown}
: - 這會將 unicode 數字轉換為 LaTeX 內部字元表示形式 (LICR)。
- 但如果沒有可用於列印該字元的字形,這不會很有幫助。因此,該
inputenc
套件僅設定那些已載入包含它們的字型的 unicode 字元。 - 例如,如果您
T1
透過載入編碼字體,\usepackage[T1]{fontenc}
那麼 LaTeX 會在內部載入檔案中定義的所有聲明t1enc.dfu
。 (對於每個已建立的 LaTeX 字型編碼,都有一個對應的.dfu
檔案。) - 但是 unicode 涵蓋了大量的字符,因此如果您碰巧在文檔中放入了一個不屬於 LaTeX 使用的任何字體編碼的字符,那麼您最終會收到錯誤訊息,告訴您該 unicode 字符未設定。
那麼對於特定文件可以採取什麼措施來解決這個問題呢?
- 第一步是識別 LaTeX 不知道的字元的 unicode 編號(這應該出現在錯誤訊息中)
- 第二步稍微複雜一些,是確定是否有任何 TeX 字體實際上包含該字元以及該字體的編碼是什麼。這裡沒有好的建議,但是有一些描述標準 LaTeX 字型編碼的文件。
- 或者,可以嘗試至少向文件添加
T1
和編碼,因為這可能會解決問題(如果它是相當常見的“西方”字元)。TS1
- 也可能是這樣的情況,你可以「偽造」該字符,比如說,如果你有某種連字符(其中在unicode中有幾種不同的連字符)並且你的編輯器添加了一個LaTeX不知道的連字符,你可以添加一個
\DeclareUnicodeCharacter
聲明第二個參數包含確實存在的替換字符。
否則,我擔心唯一的答案是使用不同的字元或使用基於 TeX 的引擎,該引擎完全啟用 unicode,並且可以本地存取具有大字元集的 unicode 字體。
關於此的更詳細的文件可以在記錄的源代碼中找到:utf8ienc.pdf
它可以在 LaTeX 發行版中,也可以從文件生成.dtx
。
答案2
我也遇到過同樣的問題,當時一個朋友想要排版一本拉丁詩歌的書,想直接使用 ō 和 ŏ 等帶有長度標記的元音(隆加和布雷維斯)。
我發現的竅門已經被包裹在一個包裹裡了,newunicodechar
。
話說
\usepackage{newunicodechar}
\newunicodechar{ō}{\={o}}
\newunicodechar{ŏ}{\u{o}}
與做的完全一樣
\DeclareUnicodeCharacter{014D}{\={o}}
\DeclareUnicodeCharacter{014F}{\u{o}}
但免除了搜尋 Unicode 表的負擔。
當然,必須確保替換文字中的內容確實可以由我們正在載入的字體生成,這可能是「節標記」的情況。
也可以看看巨集將一個字元作為參數,使其處於活動狀態,然後 \def 它。
使用這個包還有另一個優點;假設您想切換到 XeLaTeX 或 LuaLaTeX 來處理文件;然後是一個字符,例如