我正在使用软件包编写一份中英文混合文档xeCJK
。我想使用 Kaiti SC 字体添加一些假粗体标题。当我使用该AutoFakeBold
选项执行此操作时,无法复制生成的 PDF 中的字符。我该如何解决这个问题?
它似乎xeCJK
是fontspec
在窗帘后面加载的,所以问题可能与它有关。
这是 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。此技术用于zhmCJK
zhmCJK
包。如果你对此感兴趣,可以阅读文档化的源代码。
然而,在以下情况下正确应用此技术是相当棘手的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 错误,我认为目前没有办法解决这个问题。