hyperrefパッケージをうまく使って、メタデータとかブックマークがついたPDF文書を作ろう。
参考文献:
PDFのメタデータを指定する
PDFファイルには、「タイトル」「作成者」「主題」などの情報を指定できる。LaTeXでhyperrefパッケージを使うと、出力されるPDFファイルについてこれらの情報を設定できる。
platex+dvipdfmxの場合
プリアンブルで \usepackage{hyperref}
する。ここで、ドライバ(dvipdfmx)を指定してやらないとおかしなことになる。指定する箇所は \documentclass
のオプションでもいい(例1)し、 \usepackage
のオプションでもいい(例2)。他のパッケージもでドライバの指定が必要かもしれないので、 \documentclass
に指定する方がいいかもしれない。
% 例1
\documentclass[dvipdfmx]{jsarticle}
\usepackage{hyperref}
% 例2
\documentclass{jsarticle}
\usepackage[dvipdfmx]{hyperref}
PDFタイトルや作成者を指定するには、hyperrefの pdftitle
オプションや pdfauthor
オプションを指定する。指定方法は、 \usepackage
のオプションとして指定する(例3)か、別途 \hypersetup
コマンドで指定する(例4)。ちなみに、PDFの主題は pdfsubject
を指定すればよい。詳しくはhyperrefのマニュアルを参照すべし。
% 例3(注意:文字化け)
\documentclass[dvipdfmx]{jsarticle}
\usepackage[pdftitle={すごい文書},pdfauthor={天才}]{hyperref}
% 例4(注意:文字化け)
\documentclass[dvipdfmx]{jsarticle}
\usepackage{hyperref}
\hypersetup{
pdftitle={すごい文書},
pdfauthor={天才}
}
だがしかし!生成されたPDFを見てみると、メタデータが文字化けしている。前世で積んだ徳が足りなかったのだろうか…。
platex+dvipdfmxでの文字化けの解消方法
昔やった時は \AtBeginShipoutFirst
とかいう謎のコマンドを使ってごにょごにょやっていた気がするが、今は PXjahyperパッケージ を使えばいい感じにやってくれるらしい。めでたしめでたし。
% 例5
\documentclass[dvipdfmx]{jsarticle}
\usepackage{hyperref}
\usepackage{pxjahyper}
\hypersetup{
pdftitle={すごい文書},
pdfauthor={天才}
}
LuaLaTeXの場合
最近はLuaTeX-jaを使って日本語文書を書いている人もいるかもしれない。(俺だ)
LuaTeXを使ってPDF出力する分には、ドライバの指定とかは必要ない。やったー!
% 例6(注意:文字化け)
\documentclass{ltjsarticle}
\usepackage[pdftitle={すごい文書},pdfauthor={天才}]{hyperref}
% 例7(注意:文字化け)
\documentclass{ltjsarticle}
\usepackage{hyperref}
\hypersetup{
pdftitle={すごい文書},
pdfauthor={天才}
}
と思ったら、タイトルや作成者が文字化けする。人類がLuaTeXを使うには100年早かったか…?いやいやそんなことはない。
文字化けを解消するには、hyperrefのオプションに pdfencoding=auto
または unicode
を指定する。(ちなみに、pdfencoding
はhyperrefのマニュアルに記載がない。READMEには記載がある)(あと、なんで pdfencoding=auto
や unicode
がデフォルトじゃないんだろう)
% 例8
\documentclass{ltjsarticle}
\usepackage[unicode,pdftitle={すごい文書},pdfauthor={天才}]{hyperref}
% 例9
\documentclass{ltjsarticle}
\usepackage[unicode]{hyperref}
\hypersetup{
pdftitle={すごい文書},
pdfauthor={天才}
}
これで文字化けが解消する。めでたしめでたし。
\title
, \author
の内容をPDFメタデータに反映させる
さて、LaTeXで文章を書く時に、\title
, \author
コマンド等でタイトルと著者を指定して、\maketitle
コマンドでタイトルをつけている人も多いだろう。このとき、LaTeXソース中にタイトルと著者名が2回ずつ出てくることになる(例10)。
% 例10(LuaLaTeX + LuaTeX-ja の場合。 platex+dvipdfmx の場合は省略)
\documentclass{ltjsarticle}
\usepackage[unicode]{hyperref}
\title{すごい文書}
\author{天才}
\hypersetup{
pdftitle={すごい文書},
pdfauthor={天才}
}
\begin{document}
\maketitle
すごい内容
\end{document}
同じ内容が2回出てくるのはちょっと…美しくない。\title
や \author
に指定した内容を使いまわせないだろうか。
そういう場合は、マニュアルには載っていない(READMEには載っている) pdfusetitle
オプションを使うといい感じにやってくれるらしい。いやいやいや……そういう重要なオプションはちゃんとマニュアルにも書いてくれよ……。
参考:
% 例11
\documentclass{ltjsarticle}
\usepackage[unicode,pdfusetitle]{hyperref}
\title{すごい文書}
\author{天才}
略
ちなみに、この便利なオプションを使わないで自力でなんとかすると、以下のようになる。
% 例12(上級者向け)
\documentclass{ltjsarticle}
\usepackage[unicode]{hyperref}
\title{すごい文書}
\author{天才}
\makeatletter
\hypersetup{
pdftitle={\@title}, % \@title は \title の後に書くこと
pdfauthor={\@author} % \@author は \author の後に書くこと
}
\makeatother
略
Beamerで \title
, \author
の内容をPDFメタデータに反映させない(追記)
Beamerを使っていると上に書いたような pdfusetitle
の設定が勝手にされるらしい。
これを抑制するには、 \documentclass
のオプションで
\documentclass[dvipdfmx,usepdftitle=false]{beamer}
とか
\documentclass[unicode,usepdftitle=false]{beamer}
のように usepdftitle=false
を指定する。…と、Beamerのマニュアルに書いてある。
あとは \hypersetup
を使えば好きなPDFタイトルを指定できる。
思ったこと
hyperrefのマニュアル見つけて喜んでたら重要なオプションがREADMEにしか書いてないという罠をなんとかしてくれ。
PDFの目次(ブックマーク)についても何か書こうと思ったが、長くなったので別の記事にする。(これだけの内容でこんなに長くなるのはおかしいッ!)
ピンバック: LaTeXでPDF出力する際のTips その2 | 雑記帳