標籤:

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

正常文字,正常複製。

1 加粗文字,複製有問題。

font=["FandolSong-Regular.otf"]
font1=["FandolSong-Regular.otf"]:embolden=1.5

正常文字,正常複製。

1 加粗文字,正常複製。

ye

上述代碼是 Plain TeX 代碼,使用 xetex 命令編譯,不依賴第三方宏。

我在 Linux 下安裝的 TeX Live 2017 pretest 上測試,仍然可以重現問題。版本號:

XeTeX, Version 3.14159265-2.6-0.99998 (TeX Live 2017)
xdvipdfmx Version 20170318
evince 3.22.1

對 evince,只有加粗的 SimSun 字體選中複製有問題,且只是部分文字有問題。其他文字都正常。

相同的 pdf 文件,放在 Windows 下的 Acrobat DC 中文版中,那幾個字複製一樣有問題。


推薦閱讀:

為什麼 LaTeX 的命令以不便盲打的反斜桿開始?
從軟體工程上來說,LaTeX 爛不爛?
用LaTeX編寫習題集有哪些宏包可以使用?
為什麼Latex輸出的PDF文檔是空白的?
LaTeX 輸入矩陣裡面的元素時,使用 dfrac 後,發現字母有重疊怎麼辦?

TAG:LaTeX |