改变 CJK 字符的基线

改变 CJK 字符的基线

我使用 XeLaTeX 和 xeCJK 包来排版中文。我已将 macOS 上的宋体 SC 字体设置为主字体,同时在某些地方也使用黑体 SC 和仿宋体。

我注意到 Songti SC 中的字符基线比其他字符低,如下图所示: 宋体基线 其中红线为英文字符的基线。(线条和字体名称是使用图像编辑软件添加的)

基本上,我的问题是:我怎样才能改变仅 Songti SC 字符的基线?

以下是我想到的一个缺陷实现。我修改了以下代码片段:包含“CJK 后备系列字体”字符的垂直中文文本,这是一个最小工作示例:

\documentclass{minimal}
\usepackage{xeCJK}
\usepackage{xpatch}

% Define fonts
\setCJKmainfont{Songti SC}
\newCJKfontfamily\heiti{Heiti SC}
\newCJKfontfamily\fangsong{FangSong}

% Raise the baseline of Songti SC characters by 0.05em
% This is done by wrapping every CJK character in a raisebox
\makeatletter
\let\original@CJKsymbol\CJKsymbol
\let\original@CJKpunctsymbol\CJKpunctsymbol
\edef\CJKmovesymbol#1{\raise.05em\hbox{\original@CJKsymbol{#1}}}
\edef\CJKmovepunctsymbol#1{\raise.05em\hbox{\original@CJKpunctsymbol{#1}}}
% Only shift non-puncts because puncts seems in their place
\def\CJKraisebaseline{%
    \let\CJKsymbol\CJKmovesymbol
}
\def\CJKresetbaseline{%
    \let\CJKsymbol\original@CJKsymbol
}
% When switching to Heiti and FangSong, revert settings
\xpretocmd\heiti{\CJKresetbaseline}{}{}
\xpretocmd\fangsong{\CJKresetbaseline}{}{}
\makeatother

% Activate!
\CJKraisebaseline

\begin{document}

{\heiti 这是黑体:}这是$a^b_c$宋体(This is $a^b_c$ English){\fangsong 这是仿宋}

\end{document}

生成结果: 宋体基线移位

效果很好,只是 CJK 字符和内联数学之间的空格缺失了。我尝试使用以下方法修复此问题:

\everymath{~}

但这也改变了数学的显示风格,并且在英文字符包围的数学上增加了一个额外的空格。

所以我的问题是:有什么办法可以解决这个问题吗?或者,是否有更好的方法来解决基线偏移问题?

相关内容