我正在使用 xelatex,在通过\caps
(包、、soul
)进行格式化时,结尾的 utf8 符号被删除(“gītā”变成“gīt”,见下图)。有人注意到这个问题并能帮忙吗?soulutf8
polyglossia
该文件可简化如下:
% xelatex, texlive 2013
\documentclass[]{scrbook}
\usepackage{polyglossia}
\usepackage{xltxtra}
\usepackage{soul,soulutf8}
\begin{document}
\caps{gītā}
\end{document}
更新:
感谢大家的帮助,我可以重新定义该文档如下,并更好地理解此事:
% xelatex, texlive 2013
\documentclass[]{scrbook}
\usepackage{polyglossia} % calls fontspec
\setmainfont
[Ligatures=TeX,
SmallCapsFeatures={LetterSpace=3.0}, % \textsc{} rather than \caps{} from "soul"
Numbers=OldStyle,
]
{TeX Gyre Pagella} % could be any unicode font which supports small capitals
\begin{document}
\textsc{gītā}
\end{document}
如果有人能简要解释一下“fontspec”中的 \textsc{} 与字母间距、“soul”中的 \caps{} 以及“microtype”提供的功能之间的主要区别,我将不胜感激。
答案1
软件包soul
使用字体检查字符标记\SOUL@tt
。这在 LaTeX 中定义为:
\newfont\SOUL@tt{ectt1000}
但是,您使用的是支持 Unicode 的 TeX 引擎。字体中有许多字符不可用ectt1000
。该.log
文件包含以下消息:
Missing character: There is no ī in font ectt1000!
Missing character: There is no ā in font ectt1000!
解决方法是重新定义\SOUL@tt
以使用更好的字体:
\documentclass[]{scrbook}
\usepackage{polyglossia}
\usepackage{xltxtra}
\usepackage{soul}
\makeatletter
\sbox0{\ttfamily\global\let\SOUL@tt\ttfamily}
\makeatother
\begin{document}
\caps{gītā}
\end{document}
评论:
此软件包
soulutf8
旨在支持 8 位 TeX 引擎的 UTF-8,其中 Unicode 字符由多个 TeX 字符/标记组成,字符代码 < 256,编码为 UTF-8。这需要更改解析器soul
。但是,XeTeX 和 LuaTeX 支持将 Unicode 字符作为单个标记/大字符。因此,的解析器
soul
不需要更改,soulutf8
也不需要且不应使用。
答案2
您不需soul
要这样做,因为字母间距可以直接通过 来定义fontspec
。
\documentclass{scrbook}
\usepackage{fontspec}
\setmainfont[
Ligatures=TeX,
SmallCapsFont=Latin Modern Roman Caps,
SmallCapsFeatures={LetterSpace=2.5},
]{Latin Modern Roman}
\begin{document}
\textsc{gītā}
\scriptsize\MakeUppercase{gītā} % for checking
\end{document}