![改变 CJK 字符的基线](https://linux22.com/image/377897/%E6%94%B9%E5%8F%98%20CJK%20%E5%AD%97%E7%AC%A6%E7%9A%84%E5%9F%BA%E7%BA%BF.png)
我使用 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{~}
但这也改变了数学的显示风格,并且在英文字符包围的数学上增加了一个额外的空格。
所以我的问题是:有什么办法可以解决这个问题吗?或者,是否有更好的方法来解决基线偏移问题?