试验了很久,终于找到解决方案。参考http://hi.baidu.com/wtx358/blog/item/8e94698969f771b40e244463.html
本质的问题是CJK支持uft8编码,但是beamer没有CJKutf8选项。因此,修改beamer.cls文件,增加一块关于CJKuft8的定义即可。
转贴上面链接中的内容:
\DeclareOptionBeamer{CJK}{\ExecuteOptionsBeamer{cjk}}
\DeclareOptionBeamer{cjk}{
\def\beamer@hypercjk{\hypersetup{CJKbookmarks=true}}
\def\beamer@activecjk{
% Activate all >128 characters.
\count@=127
\@whilenum\count@<255 \do{%
\advance\count@ by 1
\lccode`\~=\count@
\catcode\count@=\active
\lowercase{\def~{\kern1ex}}
}
}
}
把% Activate all >128 characters.改成% Activate all >=0x80 characters. 然后在后加上下面几句:
\DeclareOptionBeamer{CJKutf8}{\ExecuteOptionsBeamer{cjkutf8}}
\DeclareOptionBeamer{cjkutf8}{%
\PassOptionsToPackage{unicode}{hyperref}
\def\beamer@activecjk{
% Activate all characters >= 0x80.
\count@=127
\@whilenum\count@<254 \do{%
\advance\count@ by 1
\lccode`\~=\count@
\catcode\count@=\active
\lowercase{\def~{\kern1ex}}
}
}
}
之后用\documentclass[CJKutf8]{beamer}调用beamer类,并用\usepackage{CJKutf8}来使用CJKutf8宏包,之后按常规使用中文环境,最后用pdflatex编译 .tex文档两次即可。
其实,只要用xeCJK就不用做任何设置。
用xecjk,书签还是乱码。是beamer的问题。跟CJK没关系。
documentclass[]{beamer}
usetheme{default}
usepackage[utf8]{inputenc}
usepackage{fontspec}
usepackage{xeCJK}
setCJKmainfont{AR PL UMing CN}
title{乱码1/2}
author{YXY}
date{today}
begin{document}
frame{titlepage}
section{乱码测试}
begin{frame}
乱码测试
end{frame}
subsection{测试乱码}
begin{frame}
测试乱码
end{frame}
end{document}
xelatex编译通过,毫无乱码:)
“documentclass[]{beamer}”
usepackage[utf8]{inputenc}
这两行和起来正好用了beamer的默认格式,然后用额外的uft8和xeCJK处理汉字。这个做法很不错。有意思。
不过从逻辑上说,用beamer本身来处理汉字,由它来调用CJK(或者xeCJK),更合理。
usepackage[utf8]{inputenc}貌似标准用法,我看了网上好多theme都是这样处理的,我就照着做了,这样省心,不过编译有点慢,不知道为什么。而且,和bib一样,beamer必须编译两遍才能正常显示书签什么的,一直搞不清楚为什么。