我上面有一些带长音符号的字母(实际上我只有ū和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}
您可能希望将小写字母 A 上的长音符号向右移动。您可以使用 来实现\skew
。
答案2
您可以测试+smcp
当前字体标识符中是否存在;如果存在,则使用\accent
U+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}