Fontspec/xeCJK AutoFakePDF 中粗体和可复制的中文字符

Fontspec/xeCJK AutoFakePDF 中粗体和可复制的中文字符

我正在使用软件包编写一份中英文混合文档xeCJK。我想使用 Kaiti SC 字体添加一些假粗体标题。当我使用该AutoFakeBold选项执行此操作时,无法复制生成的 PDF 中的字符。我该如何解决这个问题?

它似乎xeCJKfontspec在窗帘后面加载的,所以问题可能与它有关。

这是 MWE。

%!TEX TS-program = xelatex
%!TEX encoding = UTF-8 Unicode

\documentclass[12pt, a4paper]{article}

\usepackage{xeCJK}
\setCJKmainfont[Scale=1.2, AutoFakeBold=true]{Kaiti SC} % removing the bold makes the output copyable


\begin{document}

\textbf{你好}

宋代大{\color{red}文学家}苏东坡常常一个人出去旅行。他特别喜欢参观寺庙。

\end{document}

答案1

Malipivo 提供了一个使用 的解决方案\pdfliteral,该技术也适用于 XeTeX。此技术用于zhmCJKzhmCJK包。如果你对此感兴趣,可以阅读文档化的源代码。

然而,在以下情况下正确应用此技术是相当棘手的xeCJK

% !TeX program = XeLaTeX
% !TeX encoding = UTF-8
\documentclass{article}
\usepackage{xeCJK}

\setCJKmainfont{SimSun}

% value > 0
\def\xeCJKembold{0.4}

% hack into xeCJK, you don't need to understand it
\def\saveCJKnode{\dimen255\lastkern}
\def\restoreCJKnode{\kern-\dimen255\kern\dimen255}

% save old definition of \CJKsymbol and \CJKpunctsymbol for CJK output
\let\CJKoldsymbol\CJKsymbol
\let\CJKoldpunctsymbol\CJKpunctsymbol

% apply pdf literal fake bold
\def\CJKfakeboldsymbol#1{%
  \special{pdf:literal direct 2 Tr \xeCJKembold\space w}%
  \CJKoldsymbol{#1}%
  \saveCJKnode
  \special{pdf:literal direct 0 Tr}%
  \restoreCJKnode}
\def\CJKfakeboldpunctsymbol#1{%
  \special{pdf:literal direct 2 Tr \xeCJKembold\space w}%
  \CJKoldpunctsymbol{#1}%
  \saveCJKnode
  \special{pdf:literal direct 0 Tr}%
  \restoreCJKnode}
\newcommand\CJKfakebold[1]{%
  \let\CJKsymbol\CJKfakeboldsymbol
  \let\CJKpunctsymbol\CJKfakeboldpunctsymbol
  #1%
  \let\CJKsymbol\CJKoldsymbol
  \let\CJKpunctsymbol\CJKoldpunctsymbol}

\begin{document}

正常汉字。\CJKfakebold{可复制“伪粗体”汉字。English unchanged. 粗体汉字。}正常汉字。

\end{document}

在此处输入图片描述

请注意,非 CJK 字符在\CJKfakebold命令中保持不变。这是设计使然。对于英语,您应照常使用\textbf或。\bfseries

请注意,上面的代码并不完整xeCJK,例如标点符号字距调整是错误的。如果我们将此功能添加到包中,则应该更谨慎地实施它(可能以非常不同的方式)。

答案2

这是一个知道XeTeX 错误,我认为目前没有办法解决这个问题。

相关内容