如果设置为大写,则删除结尾的 utf8 字符

如果设置为大写,则删除结尾的 utf8 字符

我正在使用 xelatex,在通过\caps(包、、soul)进行格式化时,结尾的 utf8 符号被删除(“gītā”变成“gīt”,见下图)。有人注意到这个问题并能帮忙吗?soulutf8polyglossia

该文件可简化如下:

% 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}

在此处输入图片描述

相关内容