三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1426|回复: 0
打印 上一主题 下一主题

[应用技巧] 在 LaTeX 中使用含有中文的 PDF 书签的正确姿势

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-5 08:05:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

LaTeX 的 hyperref 宏包能够在 PDF 文件里生成 PDF 书签,然而「书签乱码」是困扰很多 LaTeX 使用者的麻烦问题。

早年李树钧和张林波老师共同开发了名为 gbk2uni 的小工具,用以将 filename.out 中的 GBK 编码的字符转换成八进制数据;刘海洋和李清在 ctex 宏包 / 文档类对此做了处理,使得 ctex宏包 / 文档类能够正确处理大部分的情况;后来李清编写了 xCJK2uni 宏包,使得在 pdfLaTeX 编译方式下用 CJK 的 GBK 编码模式也能正确输出 PDF 书签,而不必借用额外的工具。

这里对全部正确的方式做一个总结。

推荐的方式

最好的办法是将中文支持和版式处理都交给 ctex 宏包 / 文档类,只需要开启 hyperref 选项即可。

适用情况

  • UTF-8 + XeLaTeX(目前最最最最最最最最推荐的方式,看到它请星星眼)
  • UTF-8 + pdfLaTeX
  • UTF-8 + LaTeX – DVIPDFMx
  1. \documentclass[hyperref, UTF8]{ctexart}
  2. \begin{document}
  3. \section{中文书签不会乱码}
  4. UTF-8 编码,Xe\LaTeX{}/pdf\LaTeX{}/\LaTeX{} - DVIPDFMx 编译。
  5. \end{document}
复制代码
  1. \documentclass[hyperref, UTF8]{ctexart}
  2. \begin{document}
  3. \section{中文书签不会乱码}
  4. UTF-8 编码,Xe\LaTeX{}/pdf\LaTeX{}/\LaTeX{} - DVIPDFMx 编译。
  5. \end{document}
复制代码

适用情况(除非必要,不要使用 GBK 编码)

  • GBK + LaTeX – DVIPDFMx
  • GBK + pdfLaTeX (ctex 宏包 2.x 版本支持,当前的 1.x 版本暂不支持)





  1. \documentclass[hyperref, GBK]{ctexart}
  2. \begin{document}
  3. \section{中文书签不会乱码}
  4. GBK 编码,pdf\LaTeX{}/\LaTeX{} - DVIPDFMx 编译。
  5. \end{document}
复制代码
  1. \documentclass[hyperref, GBK]{ctexart}
  2. \begin{document}
  3. \section{中文书签不会乱码}
  4. GBK 编码,pdf\LaTeX{}/\LaTeX{} - DVIPDFMx 编译。
  5. \end{document}
复制代码
如果不想使用 ctex 宏包 / 文档类,也可以选择自己写代码进行中文支持。这时候需要做额外的代码配置,保证 PDF 书签不会乱码。

适用情况

  • UTF-8 + XeLaTeX
  1. \documentclass{article}
  2. \usepackage{xeCJK}
  3. \usepackage{hyperref}
  4. \setCJKmainfont{SimSun}
  5. \begin{document}
  6. \section{中文书签不会乱码}
  7. UTF-8 编码,Xe\LaTeX{} 编译。
  8. \end{document}
复制代码

适用情况

  • UTF-8 + pdfLaTeX
  1. \documentclass{article}
  2. \usepackage{CJKutf8}
  3. \usepackage{hyperref}
  4. \hypersetup{unicode}
  5. \AtBeginShipoutFirst{\input{zhwinfonts.tex}}
  6. \begin{document}
  7. \begin{CJK*}{UTF8}{song}
  8. \section{中文书签不会乱码}
  9. UTF-8~编码,pdf\LaTeX{}~编译。
  10. \clearpage
  11. \end{CJK*}
  12. \end{document}
复制代码

适用情况

  • UTF-8 + LaTeX – DVIPDFMx
  1. \documentclass{article}
  2. \usepackage{CJKutf8}
  3. \usepackage[dvipdfmx]{hyperref}
  4. \hypersetup{unicode}
  5. \AtBeginShipoutFirst{\input{zhwinfonts.tex}}
  6. \begin{document}
  7. \begin{CJK*}{UTF8}{song}
  8. \section{中文书签不会乱码}
  9. UTF-8~编码,\LaTeX{} - DVIPDFMx~编译。
  10. \clearpage
  11. \end{CJK*}
  12. \end{document}
复制代码

适用情况

  • GBK + pdfLaTeX (谁特么还在用 GBK 啊!摔!)
  1. \documentclass{article}
  2. \usepackage{CJK}
  3. \usepackage{xCJK2uni} % 请大家将感谢信发送至 李清 的邮箱~ : )
  4. \usepackage{hyperref}
  5. \AtBeginShipoutFirst{\input{zhwinfonts.tex}}
  6. \begin{document}
  7. \begin{CJK*}{GBK}{song}
  8. \section{中文书签不会乱码}
  9. GBK~编码,pdf\LaTeX{}~编译。
  10. \clearpage
  11. \end{CJK*}
  12. \end{document}
复制代码

适用情况

  • GBK + LaTeX – DVIPDFMx(谁特么还在用 GBK 啊!摔!)
  1. \documentclass{article}
  2. \usepackage{CJK}
  3. \usepackage[dvipdfmx]{hyperref}
  4. \hypersetup{CJKbookmarks}
  5. \AtBeginShipoutFirst{\input{zhwinfonts.tex}}
  6. \AtBeginShipoutFirst{\special{pdf:tounicode GBK-EUC-UCS2}}
  7. \begin{document}
  8. \begin{CJK*}{GBK}{song}
  9. \section{中文书签不会乱码}
  10. GBK~编码,\LaTeX{} - DVIPDFMx~编译。
  11. \clearpage
  12. \end{CJK*}
  13. \end{document}
复制代码








回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2026-1-19 23:56 , Processed in 0.029081 second(s), 23 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表