是否有与 CJK 主字体的 itshape 等效的命令?

是否有与 CJK 主字体的 itshape 等效的命令?

如你所见,代码

\usepackage{xeCJK}
\setCJKmainfont[ItalicFont={it.otf}, BoldFont={bf.otf}]{rm.otf}

设置\rmfamillyCJK 主字体的 ,\itshapeCJK 主字体的 和\bfseriesCJK 主字体的 。我的问题是

\itshape有没有与CJK 主字体等效的命令?或者我们可以定义这样的命令吗?

\itshape显然对英文和 CJK 字符都有效,而我希望这样的命令只对 CJK 字符有效,而不对英文字符有效。顺便说一句,我不想​​定义一个直接调用\itshapeCJK 主字体中采用的字体命令,例如:

\newCJKfontfamily[yuanziti]\ziti{it.otf}

或者

\setCJKfamilyfont{yuanziti}{it.otf}
\newcommand*{\ziti}{\CJKfamily{yuanziti}}

因为当我改变\itshapeCJK 主字体时我必须\ziti再次重新定义。

答案1

目前xeCJK仅提供 CJK 字体的系列切换机制,其中包括\CJK@family、等宏\CJKdefaultfamily\xeCJK_switch_family:许多初始设置。楼主想要的是类似的形状切换机制。

尝试下面的例子非常初步和脆弱的尝试,不是一个真正的或者成熟的解决方案。

% !TeX TS-program = xelatex
\documentclass{article}
\usepackage{ctex}

\makeatletter
\ExplSyntaxOn
\cs_new:Npn \CJK@shape { \f@shape }

% patch xeCJK
\cs_set:Npn \__xeCJK_font_csname:n #1
  { xeCJK/#1/\f@series/\CJK@shape/\f@size }

\tl_set:No \l_xeCJK_current_font_tl
  { \__xeCJK_font_csname:n { \CJK@family } }

\tl_set:No \l_xeCJK_current_punct_font_tl
  { \__xeCJK_font_csname:n { \CJK@punctfamily } }

\AddToHook{normalfont}
  { \cs_set:Npn \CJK@shape { \f@shape } }

% new user commands
\cs_new:Npn \CJKitshape
  { \cs_set:Npn \CJK@shape { \itdefault } }

\cs_new:Npn \CJKupshape
  { \cs_set:Npn \CJK@shape { \updefault } }
\ExplSyntaxOff

% helper
\newcommand\test{%
  \makebox[10em][l]{%
    \expanded{{\noexpand\normalfont CJK \CJK@shape\space + En \f@shape}}}%
  \rmfamily 中文abc \heiti 中文abc\par}
\makeatother

\begin{document}
            \test
\itshape    \test
\upshape    \test

\bigskip

            \test
\CJKitshape \test
\CJKupshape \test
\end{document}

在此处输入图片描述

相关内容