小型大写字母搭配上方长音符号,使用 CMU Serif

小型大写字母搭配上方长音符号,使用 CMU Serif

我上面有一些带长音符号的字母(实际上我只有ūA),它们工作得很好。但在小写字母中,当我设置\setmainfont{CMU Serif}它时,它完全失败了。我得到的不是小写字母,而是上面带有长音符号的小写字母。

然后,使用以下 MWE:

\documentclass{standalone}
\usepackage{fontspec}

\setmainfont{CMU Serif}

\begin{document}
āū

ĀŪ

\textsc{AāūU}
\end{document}

我得到了这个渲染

这很烦人,因为没有\setmainfont{CMU Serif}它工作得很好。但我不能删除这个字体,因为它修复了许多其他问题,只会导致这个问题。

因此,现在他们有解决方案:

快速解决方案

只需修复两个需要的字符\newunicodechar{}

长期解决方案

告诉xelatex只使用带有长音符的字符的默认字体。

说实话,快速的解决方案将会令人满意。

答案1

尽管该字体没有带有smcp长音符的预组合字符映射,但您可以告诉它使用组合长音符重音符 U+0304。这可以快速解决问题。

\documentclass{standalone}
\usepackage{fontspec}
\usepackage{newunicodechar}

\newunicodechar{ā}{\accent"0304 a}
\newunicodechar{ū}{\accent"0304 u}

\setmainfont{CMU Serif}

\begin{document}
āū

ĀŪ

\textsc{AāūU}
\end{document}

CMU Serif 字体示例

您可能希望将小写字母 A 上的长音符号向右移动。您可以使用 来实现\skew

答案2

您可以测试+smcp当前字体标识符中是否存在;如果存在,则使用\accentU+00AF MACRON 覆盖简单字母的原始字体,否则使用复合字体。

\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}

\setmainfont{CMU Serif}

\newunicodechar{ā}{\checksc{a}{ā}}
\newunicodechar{ū}{\checksc{u}{ū}}

\ExplSyntaxOn
\NewDocumentCommand{\checksc}{mm}
 {
  \str_if_in:enTF {\fontname\font}{+smcp}
   { \accent"00AF\scan_stop: #1 }
   { #2 }
 }
\prg_generate_conditional_variant:Nnn \str_if_in:nn { e } { T,F,TF }
\ExplSyntaxOff

\begin{document}

āū

ĀŪ

\textsc{AāūU}

\end{document}

在此处输入图片描述

普通字体中的 ā 和 ū 实例可以从 PDF 中正确复制粘贴;小型大写字母则不行(我认为你对此无能为力)。

降低口音的可能改进;采取行动\kern-0.1ex改变距离。

\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}

\setmainfont{CMU Serif}

\newunicodechar{ā}{\checksc{a}{ā}}
\newunicodechar{ū}{\checksc{u}{ū}}

\ExplSyntaxOn
\NewDocumentCommand{\checksc}{mm}
 {
  \str_if_in:enTF {\fontname\font}{+smcp}
   { \fauve_emulate_accent:nn { "00AF } { #1 } }
   { #2 }
 }
\prg_generate_conditional_variant:Nnn \str_if_in:nn { e } { T,F,TF }
\cs_new_protected:Nn \fauve_emulate_accent:nn
 {
  \vbox{\offinterlineskip\halign{\hfil##\hfil\cr\symbol{#1}\cr\noalign{\kern-0.1ex}\smash{#2}\cr}}
 }
\ExplSyntaxOff

\begin{document}

āū

ĀŪ

\textsc{AāūU}

\end{document}

在此处输入图片描述

答案3

\stackinset我发现使用from包是最好的解决方案stackengine。我不得不重新定义 ā\stackinset{c}{}{t}{-0.1em}{¯}{a}正如你所见,插入项应该是 unicode 字符¨因为当我使用 TeX 命令\={}(制作长音符)时结果失败了。

\documentclass{article}
\usepackage{fontspec}
\usepackage{stackengine}
\usepackage{newunicodechar}



\makeatletter
\newunicodechar{ā}{\stackinset{c}{}{t}{-0.1em}{¯}{a}}
\newunicodechar{ū}{\stackinset{c}{}{t}{-0.1em}{¯}{u}}
\makeatother

\setmainfont{CMU Serif}


\begin{document}
ā

āū

\emph{āū}
\textbf{āū}

ĀŪ

\textsc{AāūU}

\textsc{aāūu}

\end{document}

相关内容