PDFの注釈機能で遊ぶ

この記事はTeX & LaTeX Advent Calendar 2017の9日目の記事です. 8日目はmunepiさんでした.10日目はaminophenさんです.

はじめに

PDFには,注釈という文書に様々な情報を付加するための機能がある.今回は,PDFTeXから注釈機能を叩くことにより,その面白さの一端を見てみようと思う.

注釈とは

概要

PDFの注釈とは,

  1. メモや音,動画といった要素をページに付与する,もしくは
  2. インタラクティブな要素を提供する

機能である.具体的には,次のような要素をPDF文書に付与することができる.

機能
Text 付箋のように表示されるテキストを付与する
Line 直線を引く
Link ハイパーリンク機能を提供する
Stamp ゴム印を押したような効果を与える
FileAttachment ファイルを添付する
Sound 音声ファイルを付与し,再生機能を与える

これらの注釈の中には,ページが開かれた際やマウスオーバーした際などのイベントに対して,独自のアクションを設定できるものもある.

PDFTeXによる注釈の利用

TeXでPDFの注釈を使用するには,PDFの注釈オブジェクトを生成し書き込む必要がある.また,注釈を含むページにも細工をする必要がある*1

この文面だけ見ると面倒なように見えるが,PDFTeXにはこれらを簡単に扱うためのプリミティブ\pdfannotが既に準備されている.\pdfannotは次のように用いる.

\pdfannot <<サイズ指定やオブジェクト番号に関する記述>> {<<注釈オブジェクトの記述>>}

これだけではイメージは沸かないと思われるので,ファイル添付注釈を例に,具体的な使用法を示す.まず,次のコードを考える.

\documentclass{article}
\begin{document}
The source code of this PDF document is attached
on this page. 
%% read a file to pdf object
\immediate \pdfobj stream file {\jobname.tex}%
%% add file attachment annotation
\pdfannot width 1em height 1.7ex depth 0.3ex {
    /Subtype /FileAttachment
    /FS <<
        /EF << /F \the\pdflastobj\space 0 R >>
        /F (\jobname.tex)
        /Type /Filespec
    >>
}%
Oops, this text is wrapped....
\end{document}

これは,このソースコード自身を結果のPDFに添付するサンプルになっている.私の手元のAdobe Acrobat Reader DC(Windows)では次のような表示を得ることができた.

f:id:hak7a3:20171209205709p:plain

「Oops, ...」の上にピンのアイコンがあるのがわかるだろう.これをダブルクリックすると,上のコードを開くことができる.

では,\pdfannotを実際にどう使っているか見ていこう.

まず,\pdfannot{の間にアイコンの大きさ指定がある.この大きさ指定が実際に意味を持つかどうかはViewer依存だが,書いておいたほうが無難である.なお,結果を見ればわかる通り,大きさを指定しても組版には影響を与えない.

{}の間には注釈オブジェクトの内容をPDFの文法で記載する.今回はファイル添付注釈なので,/Subtype/FileAttachmentにし,/FSでファイルの詳細を与えている.ファイルそのものは\pdfannotの前に\pdfobjを使ってPDFファイル自体に取り込んでいる.

TeX芸での利用例

これだけではあまり面白くない.もう少しTeX芸っぽいことをしよう.上の例では,ファイルを外部から読み込んだが,これをソースに直接記述しよう.また,テキストファイルだと面白くないので,バイナリファイルにしよう.

結果がこれだ.

gist.github.com

なお,ChomeのPDF ViewerやGithubのViewerでは注釈の表示がされないようなので,手元にダウンロードしてみてほしい(音量注意).

まとめ

PDFの機能,もっと活用すればいいと思うよ*2

*1:ページ辞書に/Annotsエントリを追加する

*2:例えば,プログラミング系の技術書でサンプルコードを添付するとか.PDF/Xの制約により印刷所に持っていけなくなるからコスト増なのはアレ