使用 XeTeX 的特殊 Unicode 字符

使用 XeTeX 的特殊 Unicode 字符

大多数现代字体都采用 Unicode 编码,但仅提供 Unicode 定义的整个字形范围的子集。大多数缺乏拉丁语扩展附加范围 (http://www.unicode.org/charts/PDF/U1E00.pdf)。在 TeX 中,ASCII 范围之外的字符可以用\"afor ä、\=afor ā、\.nfor ṅ 等命令来构造。XeTeX 似乎不支持此机制。您仍然可以使用这些命令(如\d{m}获取),但如果它不在字体中,它将不会像在 TeX 中那样构造.m,因此它们在 XeTeX 中毫无用处。

然后我很高兴找到了newunicodechar可以重新定义字符的包,例如,\newunicodechar{ṃ}{\d{m}}然后在文档中输入 ṃ,但尽管这在 pdfTeX 中有效,但在 XeTeX 中却不起作用,因为后者缺少“字符构建功能”。因此,XeTeX 将再次尝试在字体中查找字符,但字体不可用。打印字符的唯一方法是用字体替换这些特殊字符(也可以通过例如\newunicodechar)。但这看起来可能相当丑陋。

类似的软件包\usepackage[utf8x]{inputenc}也与 XeLaTeX 不兼容,至少在我的安装中不兼容(MikTeX 2.9)。

至少这是我经过几个小时的反复试验得出的结论。

因此对于我的文档来说,我要么选择返回到 (pdf)LaTeX 并错过 XeLaTeX 的简单字体功能,要么必须用另一种字体替换特殊字符。

或者是否有其他方法可以解决这个问题而不必依赖 pdfLaTeX?

这是 pdfLaTeX 的 MWE,或者如果您删除 % 并将它们放在 前面,则为 XeLaTeX \usepackage{palatino}

\documentclass[a4paper,12pt]{article}

% \usepackage{fontspec}  % <----- XeLaTeX
% \defaultfontfeatures{Mapping=tex-text} 
% \setmainfont{Adobe Garamond Pro} % <-- or another font without Latin Ext. Additional

\usepackage{palatino}  % <---- pdfLaTeX

\usepackage{newunicodechar}

% \newfontfamily{\diafont}{Junicode} % <---- redefining the font works in XeLaTeX 
% \newunicodechar{ṃ}{\diafont ṃ}

\newunicodechar{ā}{\={a}} % <-- character substitution works in pdfLaTeX
\newunicodechar{ṃ}{\d{m}} %    but could also be achieved bei inputenc package
\newunicodechar{ṅ}{{\.n}}

\begin{document}
German Umlaute: 
\begin{itemize} 
\item Unicode characters: ä ö ü Ä Ö Ü 
\item by \LaTeX command: \"a \"o \"u \"A \"O \"U

\end{itemize}

a with macron above:
\begin{itemize}
\item by function: ā
\item by \LaTeX: {\=a}
\end{itemize}

m with dot underneath: 
\begin{itemize}
\item by function: ṃ
\item by \LaTeX: \d{m}
\end{itemize}

n with dot above:
\begin{itemize}
\item by function: ṅ
\item by \LaTeX: {\.n}
\end{itemize}

\end{document}

答案1

我的回答中的代码TeX 重音符号似乎不适用于 fontspec 和 xe/lua/latex给出了想法,但是对于上面的点,需要一些额外的代码。

\documentclass[a4paper,12pt]{article}

\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX} 
\setmainfont{Minion Pro} % a font without Latin Ext. Additional

\usepackage{newunicodechar}

\UndeclareUTFcomposite[\UTFencname]{x0101}{\=}{a}
\UndeclareUTFcomposite[\UTFencname]{x1E43}{\d}{m}
\UndeclareUTFcomposite[\UTFencname]{x1E45}{\.}{n}
\makeatletter
\let\d\relax
\DeclareRobustCommand{\d}[1]
  {\hmode@bgroup
   \o@lign{\relax#1\crcr\hidewidth\ltx@sh@ft{-1ex}.\hidewidth}\egroup
}
\let\.\relax
\DeclareRobustCommand{\.}[1]
  {\hmode@bgroup\vbox{% \o@lign has \vtop
   \lineskiplimit\z@
   \baselineskip\z@skip
   \lineskip.25ex
   \ialign {##\crcr\hidewidth.\hidewidth\crcr#1\crcr}}\egroup
}
\makeatother
\newunicodechar{ā}{\={a}}
\newunicodechar{ṃ}{\d{m}}
\newunicodechar{ṅ}{{\.n}}

\begin{document}
German Umlaute: 
\begin{itemize} 
\item Unicode characters: ä ö ü Ä Ö Ü 
\item by \LaTeX command: \"a \"o \"u \"A \"O \"U
\end{itemize}

a with macron above:
\begin{itemize}
\item by function: ā
\item by \LaTeX: {\=a}
\end{itemize}

m with dot underneath: 
\begin{itemize}
\item by function: ṃ
\item by \LaTeX: \d{m}
\end{itemize}

n with dot above:
\begin{itemize}
\item by function: ṅ
\item by \LaTeX: \.n
\end{itemize}

\end{document}

在此处输入图片描述

相关内容