大多数现代字体都采用 Unicode 编码,但仅提供 Unicode 定义的整个字形范围的子集。大多数缺乏拉丁语扩展附加范围 (http://www.unicode.org/charts/PDF/U1E00.pdf)。在 TeX 中,ASCII 范围之外的字符可以用\"a
for ä、\=a
for ā、\.n
for ṅ 等命令来构造。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}