liam0205.github.io icon indicating copy to clipboard operation
liam0205.github.io copied to clipboard

在 LaTeX 中使用含有中文的 PDF 书签避免乱码的正确姿势 | 始终

Open Liam0205 opened this issue 6 years ago • 5 comments

https://liam.page/2014/11/22/latex-pdf-cjk-bookmarks/

LaTeX 的 hyperref 宏包能够在 PDF 文件里生成 PDF 书签,然而「书签乱码」是困扰很多 LaTeX 使用者的麻烦问题。 早年李树钧和张林波老师共同开发了名为 gbk2uni 的小工具,用以将 filename.out 中的 GBK 编码的字符转换成八进制数据;刘海洋和李清在 ctex 宏包/文档类对此做了处理,使得 ctex 宏包/文档类能够正确处理大部分的情况;后来李清编写了

Liam0205 avatar Jan 12 '19 08:01 Liam0205

老师,现在ctex停止维护了,我把winedt7升级到了winedt10 ,无论怎么搞目录都乱码了。

dielianjunmobei avatar May 23 '19 14:05 dielianjunmobei

@dielianjunmobei 老师,现在ctex停止维护了,我把winedt7升级到了winedt10 ,无论怎么搞目录都乱码了。

我不是老师。

CTeX 套装里的 WinEdt 被吴凌云改过,默认编码是 GBK。官方的 WinEdt,默认编码是 UTF-8。你注意这一点,再按文章所说去操作就好了。

Liam0205 avatar May 24 '19 01:05 Liam0205

@Liam0205

@dielianjunmobei 老师,现在ctex停止维护了,我把winedt7升级到了winedt10 ,无论怎么搞目录都乱码了。

我不是老师。

CTeX 套装里的 WinEdt 被吴凌云改过,默认编码是 GBK。官方的 WinEdt,默认编码是 UTF-8。你注意这一点,再按文章所说去操作就好了。

您给提供方法了,就是老师,哈哈。我用的是西交的模板写的毕业论文,文章中的方式似乎不太好用呢。我看了一下,我们学校这个模板的编码是ANSI呢。

dielianjunmobei avatar Jun 05 '19 10:06 dielianjunmobei

似乎古老的GBK+CJK+latex+dvipdfmx的方式被改动过了,下面的代码

\documentclass{article}
\usepackage{CJK}
\usepackage[dvipdfmx]{hyperref}
\hypersetup{CJKbookmarks}
%\AtBeginShipoutFirst{\input{zhwinfonts.tex}}
\AtBeginDvi{\special{pdf:tounicode GBK-EUC-UCS2}}
\begin{document}
\begin{CJK*}{GBK}{song}
\section{中文书签不会乱码}
GBK~编码,\LaTeX{} - DVIPDFMx~编译。
\clearpage
\end{CJK*}
\end{document}

报如下错误

dvipdfmx:warning: Unbalanced parens/truncated PDF literal string.
dvipdfmx:warning: Could not find a value in dictionary object.
dvipdfmx:warning: Ignoring invalid dictionary.
dvipdfmx:warning: Interpreting special command outline (pdf:) failed.
dvipdfmx:warning: >> at page="1" position="(133.768, 667.198)" (in PDF)
dvipdfmx:warning: >> xxx "pdf:outline 1<</Title(\376\377\000\xd6\80\xd0\000\xce\80\xc4..."
dvipdfmx:warning: >> Reading special command stopped around >><</Title(\376\377\000\xd6\80\xd0\000\xce\80\xc4\000\xca\80\x...<<
]

easior avatar Nov 03 '21 03:11 easior

似乎古老的GBK+CJK+latex+dvipdfmx的方式被改动过了,下面的代码

\documentclass{article}
\usepackage{CJK}
\usepackage[dvipdfmx]{hyperref}
\hypersetup{CJKbookmarks}
%\AtBeginShipoutFirst{\input{zhwinfonts.tex}}
\AtBeginDvi{\special{pdf:tounicode GBK-EUC-UCS2}}
\begin{document}
\begin{CJK*}{GBK}{song}
\section{中文书签不会乱码}
GBK~编码,\LaTeX{} - DVIPDFMx~编译。
\clearpage
\end{CJK*}
\end{document}

报如下错误

dvipdfmx:warning: Unbalanced parens/truncated PDF literal string.
dvipdfmx:warning: Could not find a value in dictionary object.
dvipdfmx:warning: Ignoring invalid dictionary.
dvipdfmx:warning: Interpreting special command outline (pdf:) failed.
dvipdfmx:warning: >> at page="1" position="(133.768, 667.198)" (in PDF)
dvipdfmx:warning: >> xxx "pdf:outline 1<</Title(\376\377\000\xd6\80\xd0\000\xce\80\xc4..."
dvipdfmx:warning: >> Reading special command stopped around >><</Title(\376\377\000\xd6\80\xd0\000\xce\80\xc4\000\xca\80\x...<<
]

又尝试了一次,发现 CJK+DVIPDFMx 的中文书签故事也被改动了

\documentclass{article}
\usepackage{CJK}
\usepackage{xCJK2uni}
\usepackage[dvipdfmx]{hyperref}
\begin{document}
\begin{CJK*}{GBK}{song}
\section{中文书签不会乱码}
GBK~编码,\LaTeX{} - DVIPDFMx~编译。
\clearpage
\end{CJK*}
\end{document}

这样就正常了

easior avatar Nov 03 '21 12:11 easior