windows 下 xelatex 編譯中文,無法複製?
版本:texlive2016
在 windows 下,以下兩段代碼編譯的 pdf 是可以被正確複製的。
documentclass[fontset=windowsnew]{ctexart}
egin{document}
%{fseries songti 中文}
中國唐朝詩人
end{document}
documentclass[fontset=windowsnew]{ctexart}
egin{document}
fseries songti 中文
中國唐朝詩人
end{document}
但下面這段代碼,「中國唐朝詩人」部分就無法被正確複製。
documentclass[fontset=windowsnew]{ctexart}
egin{document}
{fseries songti 中文}
中國唐朝詩人
end{document}
這這個問題來源我寫的一個宏包,所以如果我沒記錯的話,texlive2015中應該是沒有這個問題的。
@劉海洋 提到的答案裡面提到13年我寫的東西。我當時為什麼沒修呢?因為我當時還不會寫代碼。
我真正開始寫代碼是2013年年底啊,到現在可是沒多少年。dvipdfmx的這個bug實際上是代碼裡面有三層字體,dvi的字體一層,pdf字體一層,實際字體一層,這三層字體對應的時候產生了偏差,這就直接影響到了字體的CMAP寫入漏掉了。換句話說,你生成了n個調用s同一個實際字體(OTF/TTF),只有第1個字體下的文本是會被記錄到CMAP裡面的,其後n-1個字體是共用第1個字體的CMAP的,那麼會造成上面的結果。實際上的行為是,有些加粗的字也能複製出來,因為相關的信息已經寫入到第一個字體的CMAP裡面了。
我本周末試著修一下。
首先說替代方案。替代方案就是自己設置字體,使用真正的粗體字體,避免 XeTeX 的偽粗體。
TeX 系統預裝的方案如 Fandol 字體,宋體是有加粗形式的,設置 ctex 選項 fontset=fandol 即可。缺點是沒有生僻字。
其他免費的方案,比如用思源宋體,自己用 xeCJK 的命令設置即可。商業字體的方案,方正、漢儀等大廠都有標宋體之類加粗的宋體可以使用,例如隨 Office 一起預裝的華文中宋。
新版本的 ctex 宏包默認關閉了偽粗體選項,也是出於排版質量的考慮。
-----------------------------------------------------------------------
下面不是解決方案,不過我可以提供一些信息。
首先,這是很早就有的問題。作為宏包開發者,我們很早就知道。問題很底層,使用裸的 XeTeX 就能重現,但與字體、使用的閱讀器也有一定關係。
馬起園在 2013 年就分析過,他自己可能忘了:xeCJK出現偽粗體時複製粘貼亂碼 - CTEX社區
但其實相關的討論更早,比如在 2011 年就有基於 pdf literal 的替代方案:xelatex 下「宋體加粗」之後的文字無法正常複製 - CTEX社區(類似做法被用在 zhmCJK 中)
最簡測試代碼如下:
% !TeX program = XeTeX
% !TeX encoding = UTF-8
font ="SimSun"
font1="SimSun":embolden=1.5