我最近遇到了一个奇怪的问题。以下代码:
\documentclass[14pt, a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{fontspec}
\usepackage[english, serbianc]{babel}
\usepackage{polyglossia}
\setmainlanguage[Script=Cyrillic]{serbian}
\setotherlanguage{english}
\setmainfont{XCharter}
\begin{document}
\begin{serbian}
\begin{abstract}
Чича Ђорђе жваће шљиве. Његова кћи Љиља меша џем. \textsc{АаБбВвГгДд}.
\end{abstract}
\section{Чича Ђорђе: \textsc{АаБбВвГгДд}.}
Чича Ђорђе: \textsc{АаБбВвГгДд}.
\end{serbian}
\begin{english}
\section{\foreignlanguage{serbian}{Чича Ђорђе: \textsc{АаБбВвГгДд}.}}
Чича Ђорђе: \textsc{АаБбВвГгДд}.
\end{english}
\end{document}
呈现以下结果:
如您所见,我使用的是具有丰富西里尔文支持的 XChapter,但是,它的小型大写字母在塞尔维亚语环境中不起作用,在摘要、章节名称、章节名称等中也不起作用。有趣的是,在英语语言环境中,小型大写字母在正文中起作用。我测试了其他具有良好西里尔文小型大写字母支持的字体,但出现了同样的问题。
有人知道问题可能是什么吗?我怎样才能让 XeTex 在塞尔维亚语环境以及摘要正文、章节名称、章节名称等中正确呈现 XChapter 小型大写字母?
答案1
这似乎是 的问题polyglossia
。顺便说一句,你不应该同时加载它和babel
,因为它们会互相冲突。
fontenc
另外,使用 XeLaTeX 或 LuaLaTeX 时不要加载。
\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage[english,serbianc]{babel}
\setmainfont{XCharter}
\begin{document}
\begin{abstract}
Чича Ђорђе жваће шљиве. Његова кћи Љиља меша џем. \textsc{АаБбВвГгДд}.
\end{abstract}
\section{Чича Ђорђе: \textsc{АаБбВвГгДд}.}
Чича Ђорђе: \textsc{АаБбВвГгДд}.
\begin{otherlanguage}{english}
\section{\foreignlanguage{serbian}{Чича Ђорђе: \textsc{АаБбВвГгДд}.}}
\textsc{AbcDef}\textbf{\textsc{AbcDef}}
\end{otherlanguage}
\end{document}
如果愿意,您也可以使用,但在这种情况下,您需要通过定义一个系列(也可能是和)polyglossia
来帮助包。\serbianfont
\serbianfontsf
\serbianfonttt
\documentclass[a4paper]{article}
\usepackage{polyglossia}
\usepackage{fontspec}
\setmainlanguage[script=Cyrillic]{serbian}
\setotherlanguage{english}
\setmainfont{XCharter}
\newfontfamily{\serbianfont}{XCharter}
\begin{document}
\begin{abstract}
Чича Ђорђе жваће шљиве. Његова кћи Љиља меша џем. \textsc{АаБбВвГгДд}.
\end{abstract}
\section{Чича Ђорђе: \textsc{АаБбВвГгДд}.}
Чича Ђорђе: \textsc{АаБбВвГгДд}.
\begin{otherlanguage}{english}
\section{\foreignlanguage{serbian}{Чича Ђорђе: \textsc{АаБбВвГгДд}.}}
\textsc{AbcDef}\textbf{\textsc{AbcDef}}
\end{otherlanguage}
\end{document}
答案2
首先,您尝试混合不兼容的软件包polyglossia
、fontenc
和babel
。 您想要选择babel
使用传统的 8 位编码、babel
Unicode 或Polyglossia
。
您之所以只在文本中遇到此问题,\foreignlanguage{serbian}{...}
是因为您告诉 Babel 您使用的是 语言serbianc
,而不是serbian
。您在这里混淆了babel
和polyglossia
。因此,语言没有改变,因此脚本仍然设置为拉丁语。
修复该错误后,您又会遇到另一个问题:XCharter 禁用了 的小写字母Language=Serbian
。但是,如果您设置Language=Default
,则会得到俄语而不是塞尔维亚语 б。您想Language=Default
仅设置小写字体,而解决方案是,对于babel
:
\documentclass[14pt, a4paper]{article}
\usepackage[english, serbianc]{babel}
\usepackage{fontspec}
\defaultfontfeatures[XCharter]{
UprightFont = *-Roman,
UprightFeatures = {SmallCapsFont=*-Roman},
BoldFont = *-Bold,
BoldFeatures = {SmallCapsFont=*-Bold},
ItalicFont = *-Italic,
SlantedFont = *-Slanted,
SlantedFeatures = {SmallCapsFont=*-Slanted},
BoldItalicFont = *-BoldItalic,
BoldSlantedFont = *-BoldSlanted,
BoldSlantedFeatures = {SmallCapsFont=*-BoldSlanted},
SmallCapsFeatures={Letters=SmallCaps},
Extension = .otf}
% XCharter 1.221 has liga for English but not Serbian, and a language feature
% for Serbian but not English.
\babelfont{rm}
{XCharter}
\babelfont[english]{rm}
[Ligatures=Common, Language=Default]{XCharter}
\babelfont[serbianc]{rm}
[Script=Cyrillic,
Language=Serbian,
SmallCapsFeatures={Script=Cyrillic, Language=Default, Letters=SmallCaps}
]{XCharter}
\babeltags{serbian=serbianc} % Enable \begin{serbian}, etc.
\babeltags{english=english}
\begin{document}
\begin{serbian}
\begin{abstract}
Чича Ђорђе жваће шљиве. Његова кћи Љиља меша џем. АаБбВвГгДд \textsc{АаБбВвГгДд}.
\end{abstract}
\section{АаБбВвГгДд Чича Ђорђе: \textsc{АаБбВвГгДд}.}
АаБбВвГгДд Чича Ђорђе: \textsc{АаБбВвГгДд}.
\end{serbian}
\begin{english}
\section{АаБбВвГгДд Чича Ђорђе: \textsc{АаБбВвГгДд}.}
АаБбВвГгДд Чича Ђорђе: \textsc{АаБбВвГгДд}.
\textsc{English AaBbCc}
\end{english}
\end{document}
这可以正确地为您获取塞尔维亚语小写字母以及小型大写字母。 Polyglossia 的等效项是:
\documentclass[14pt, a4paper]{article}
\usepackage{polyglossia}
\setdefaultlanguage{serbian}
\setotherlanguage{english}
\defaultfontfeatures[XCharter]{
UprightFont = *-Roman,
UprightFeatures = {SmallCapsFont=*-Roman},
BoldFont = *-Bold,
BoldFeatures = {SmallCapsFont=*-Bold},
ItalicFont = *-Italic,
SlantedFont = *-Slanted,
SlantedFeatures = {SmallCapsFont=*-Slanted},
BoldItalicFont = *-BoldItalic,
BoldSlantedFont = *-BoldSlanted,
BoldSlantedFeatures = {SmallCapsFont=*-BoldSlanted},
SmallCapsFeatures={Letters=SmallCaps},
Extension = .otf}
% XCharter 1.221 has liga for English but not Serbian, and a language feature
% for Serbian but not English.
\setmainfont[Ligatures=Common, Language=Default]{XCharter}
\newfontfamily\serbianfont{XCharter}[
Script=Cyrillic,
Language=Serbian,
SmallCapsFeatures={Script=Cyrillic, Language=Default, Letters=SmallCaps}]
\begin{document}
\begin{serbian}
\begin{abstract}
Чича Ђорђе жваће шљиве. Његова кћи Љиља меша џем. АаБбВвГгДд \textsc{АаБбВвГгДд}.
\end{abstract}
\section{АаБбВвГгДд Чича Ђорђе: \textsc{АаБбВвГгДд}.}
АаБбВвГгДд Чича Ђорђе: \textsc{АаБбВвГгДд}.
\end{serbian}
\begin{english}
\section{АаБбВвГгДд Чича Ђорђе: \textsc{АаБбВвГгДд}.}
АаБбВвГгДд Чича Ђорђе: \textsc{АаБбВвГгДд}.
\textsc{English AaBbCc}
\end{english}
\end{document}
另一种可以免除语言标记的替代方法是:
\documentclass[14pt, a4paper]{article}
\usepackage[nil]{babel}
\usepackage{fontspec}
\babelprovide[import=sr-Cyrl, onchar=fonts ids, main]{serbian}
\babelprovide[import=en, onchar=fonts ids]{english}
\defaultfontfeatures[XCharter]{
UprightFont = *-Roman,
UprightFeatures = {SmallCapsFont=*-Roman},
BoldFont = *-Bold,
BoldFeatures = {SmallCapsFont=*-Bold},
ItalicFont = *-Italic,
SlantedFont = *-Slanted,
SlantedFeatures = {SmallCapsFont=*-Slanted},
BoldItalicFont = *-BoldItalic,
BoldSlantedFont = *-BoldSlanted,
BoldSlantedFeatures = {SmallCapsFont=*-BoldSlanted},
SmallCapsFeatures={Letters=SmallCaps},
Extension = .otf}
% XCharter 1.221 has liga for English but not Serbian, and a language feature
% for Serbian but not English.
\babelfont{rm}
{XCharter}
\babelfont[english]{rm}
[Ligatures=Common, Language=Default]{XCharter}
\babelfont[serbian]{rm}
[Script=Cyrillic,
Language=Serbian,
SmallCapsFeatures={Script=Cyrillic, Language=Default, Letters=SmallCaps}
]{XCharter}
\babeltags{serbian=serbian} % Enable \begin{serbian}, etc.
\babeltags{english=english}
\begin{document}
\begin{abstract}
Чича Ђорђе жваће шљиве. Његова кћи Љиља меша џем. АаБбВвГгДд \textsc{АаБбВвГгДд}.
\end{abstract}
\section{АаБбВвГгДд Чича Ђорђе: \textsc{АаБбВвГгДд}.}
АаБбВвГгДд Чича Ђорђе: \textsc{АаБбВвГгДд}. ffi
\begin{english}
\section{АаБбВвГгДд Чича Ђорђе: \textsc{АаБбВвГгДд}.}
АаБбВвГгДд Чича Ђорђе: \textsc{АаБбВвГгДд}.
\textsc{English AaBbCc} ffi
\end{english}
\end{document}
它会自动检测您输入的是拉丁文还是西里尔文,并相应地选择语言、字体功能和连字模式,无需标签。它需要 LuaLaTeX,但也可以采用 XeLaTeX 来实现。
答案3
问题可以简化为以下
\documentclass{article}
\usepackage{fontspec}
\setmainfont{XCharter}[Script=Cyrillic,]
\setsansfont{XCharter}[Script=Cyrillic,Language=Serbian]
\begin{document}
АаБбВвГгДд \textsc{АаБбВвГгДд}.
\sffamily
АаБбВвГгДд \textsc{АаБбВвГгДд}.
\end{document}
如您所见,添加西里尔字母和塞尔维亚语会禁用小型大写字母。
polyglossia 的文档并没有真正说明如何避免使用语言功能,但以下方法似乎有效:
\documentclass{article}
\usepackage{fontspec}
\usepackage{polyglossia}
\setmainlanguage[script=Cyrillic]{serbian}
\SetLanguageKeys{serbian}{language=Default}
\setmainfont{XCharter}
\begin{document}
АаБбВвГгДд \textsc{АаБбВвГгДд}.
\end{document}