如你所见,代码
\usepackage{xeCJK}
\setCJKmainfont[ItalicFont={it.otf}, BoldFont={bf.otf}]{rm.otf}
设置\rmfamilly
CJK 主字体的 ,\itshape
CJK 主字体的 和\bfseries
CJK 主字体的 。我的问题是
\itshape
有没有与CJK 主字体等效的命令?或者我们可以定义这样的命令吗?
\itshape
显然对英文和 CJK 字符都有效,而我希望这样的命令只对 CJK 字符有效,而不对英文字符有效。顺便说一句,我不想定义一个直接调用\itshape
CJK 主字体中采用的字体命令,例如:
\newCJKfontfamily[yuanziti]\ziti{it.otf}
或者
\setCJKfamilyfont{yuanziti}{it.otf}
\newcommand*{\ziti}{\CJKfamily{yuanziti}}
因为当我改变\itshape
CJK 主字体时我必须\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}