使用 fontspec 和双语文档的小型大写字母 (xelatex)

使用 fontspec 和双语文档的小型大写字母 (xelatex)

中出现了一个奇怪的问题fontspec。在 MWE 和下图中,您会看到 fontspec 在 时会呈现希腊小写字母,Script=Greek但在 时不会呈现拉丁小写字母,反之亦然Script=Latin。这有什么问题,如何修复?

注意:如果可能的话,我不想让 LaTeX 知道我使用的是哪种语言,我想要一个全局解决方案。

提前致谢。

\documentclass{minimal}

\usepackage{fontspec}
\newfontfamily{\greek}[Script=Greek]{CMU Serif}
\newfontfamily{\latin}[Script=Latin]{CMU Serif}

\begin{document}
\noindent
{\greek\scshape Παράξενο Aυτό, Don't You Think?} \\
{\latin\scshape Παράξενο Αυτό, Don't You Think?}
\end{document}

你不觉得这很奇怪吗?

答案1

它不是 fontspec,而是字体。它已实现小型大写字母功能,因此其他脚本已禁用该功能。

使用 xelatex 没有什么可以做的(除了正确选择语言,我认为你应该这样做,因为它还会设置正确的连字模式)。

你可以尝试使用 lualatex 来修复字体。下面的方法有效,但我真的不确定这是否是声明该功能的正确方法,以及是否也需要更改其他一些值。

\documentclass{article}

\usepackage{fontspec}

\usepackage{luacode}

\begin{luacode}

local patch_cmuserif = function (fontdata)
 if fontdata.psname == "CMUSerif-Roman"
 then
  for i, v in ipairs(fontdata.resources.sequences) do
   if 
   fontdata.resources.sequences[i].features.name==s_s_1 
   or
   fontdata.resources.sequences[i].features.name==s_s_3
   then
    fontdata.resources.sequences[i].features.smcp={
       ["dflt"]={["dflt"]=true,}, 
       ["cyrl"]={["dflt"]=true,},
       ["latn"]={["dflt"]=true,},
       ["grek"]={["dflt"]=true,},
        }
   end 
  end
 end
end



luatexbase.add_to_callback
 (
  "luaotfload.patch_font",
  patch_cmuserif,
  "change_cmuserif"
 )
\end{luacode}


\newfontfamily{\greek}[Script=Greek]{CMU Serif}
\newfontfamily{\latin}[Script=Latin]{CMU Serif}

\begin{document}


\noindent
{\greek\scshape Παράξενο Aυτό, Don't You Think?} \\
{\latin\scshape Παράξενο Αυτό, Don't You Think?}
\end{document}

在此处输入图片描述

相关内容