Xelatexで既存のPDFにしおり追加-用紙サイズについて-

Xelatexで既存のPDFにしおり追加-用紙サイズについて-

- KUNI HAYA の投稿
返信数: 3
こんにちは 初めての投稿させてもらいます.

ubuntu10.10でgnuplotで作成したグラフ(eps形式、サイズ:127mmx89mm)をepstopdfでPDFに変換したファイルが複数あります.

この複数のPDFをpdftkで一つのPDFに結合しました.

この複数ページのPDFファイルにしおりをつけたいと思い以下のようなファイルを作成しxelatexでコンパイルしました.すると目次がついて(文字化けしてます)白紙のPDFファイルができます.

そこで,\special{papersize=127mm,89mm}をいろいろ変更してみたところどうやらA4サイズの中央に表示されてるようです.

これを元のepsのサイズでしおり付きのPDFを作成するには,どうしたらいいのでしょうか?



\documentclass{article}
\usepackage{pdfpages}
\usepackage{xltxtra}
\usepackage[atend]{bookmark}
\pagestyle{empty}
\special{papersize=127mm,89mm}
\begin{document}
\bookmark[page=1,level=0]{ページ}
\includepdf[pages=-]{1page.pdf}
\end{document}
KUNI HAYA への返信

Re: Xelatexで既存のPDFにしおり追加-用紙サイズについて-

- Akira Kakuto の投稿
適当なサンプルが無いので、
xelatex sample2e
で出来た sample2e.pdf を以下のようにして pdfpages を
使ってみました。しおりは文字化けせず、ちゃんとしており、
(元々、 xdvipdfmx は UTF-8 文字列を UTF16 に変換して
から BE BOM を付け、PDF 文字列を作るようにしてあります)
PDF ページのとり込みも期待通りです。

pdfpages パッケージは十分新しいものを使用していますか?
XeTeX をちゃんとサポートしたのは、あまり昔ではないと
思いますので、最新版を入手してみてください。

\documentclass{article}
\usepackage{pdfpages}
\usepackage{xltxtra}
\usepackage[atend]{bookmark}
\pagestyle{empty}
\begin{document}
\bookmark[page=1,level=0]{ページ}
\includepdf[pages=-]{sample2e.pdf}
\end{document}

KUNI HAYA への返信

Re: Xelatexで既存のPDFにしおり追加-用紙サイズについて-

- Z. R. の投稿

(前提知識)
基本的に LaTeX のシステムでは「LaTeX が把握する用紙サイズ」と「DVIドライバ(dvips、dvipdfmx等)が把握する用紙サイズ」が別に管理されています(元々の TeX エンジンが用紙サイズを把握しないため)。後者の設定はドライバの起動コマンドのオプションで行うものですが、大抵のドライバでは TeX 文書の中で行うことも可能です(ただドライバ毎に方法が違う)。XeTeX や pdfTeX 等の「PDF を直接出す TeX エンジン」では、「DVIドライバ」をエンジン自体が兼ねていると見なすことができて、この場合は必然的に「後者の設定」は TeX 文書で行うことになります。もちろん、この 2 つの設定が食い違っていると「正しい出力」にならないので両者を一致させる必要があります。通常は「一致させる処理を行ってくれるパッケージ」(例えば hyperref や geometry パッケージ)を利用することになります。

これを踏まえると、今回の現象の原因は次のようになります。

  • papersize special 命令は、「DVIドライバの用紙サイズ」を設定するが、「LaTeX の用紙サイズ」には影響しない。後者は article クラスの既定値であるレターサイズのままである。
  • pdfpages パッケージの \includepdf 命令は、対象の PDF ページを「LaTeX の用紙サイズ」(つまりレターサイズ)の中央に配置する。
  • 従って、1 ページ目の出力は「レターサイズの中央に対象 PDF のページを配置したものの左上 127mm×89mm を切り出したもの」になる。
  • bookmark は hyperref を内部で呼び出すので、毎ページで「DVIドライバの用紙サイズ」を「LaTeX の用紙サイズ」に一致させる処理が行われる。1 ページ目の設定は papersize special 命令で上書きされたが、2 ページ以降は hyperref の処理が有効になるので、2 ページ以降のサイズはレターサイズになっている。

この事態はかなり複雑ですが、対処方法は単純で、要するに「LaTeX の用紙サイズを 127mm×89mm に設定」すればよく、これを geometry パッケージで行えば前述の通り geometry が後の面倒をみてくれます。すなわち

\papersize{papersize=127mm,89mm}

の代わりに

\usepackage[papersize={127mm,89mm}]{geometry}

を書けばよいわけです。

文字化けの原因は、単にファイルの文字コードが UTF-8 でないからだと思います。(XeTeX 自身は他の文字コードも扱えるのですが、現状の XeLaTeX は UTF-8 のみをサポートすると考えたほうがよいでしょう。)

Z. R. への返信

Re: Xelatexで既存のPDFにしおり追加-用紙サイズについて-

- KUNI HAYA の投稿
回答ありがとうございました.教えていただいたことを参考に試したところ希望通りの物ができましたので報告させていただきます.
\papersize{papersize=127mm,89mm}

の代わりに

\usepackage[papersize={127mm,89mm}]{geometry}

を書いて実行してみたところレターサイズで左上に127mmx89mmのグラフが表示される結果となりました.そこで,

\papersize{papersize=127mm,89mm}と\usepackage[papersize={127mm,89mm}]{geometry}
両方書いて見たところ127mmx89mmのPDFが出来上がりました.なぜ両方ないと悪いのかという
検証は,TeXの知識が足りないためできませんが...

あと,文字化けの件もエンコーディングをUTF-8にすることで解決しました.

以下にソースを示させていただきます.

\documentclass{article}
\usepackage{pdfpages}
\usepackage{xltxtra}
\usepackage[atend]{bookmark}
\pagestyle{empty}
%\special{papersize=127mm,89mm}
\usepackage[papersize={127mm,89mm}]{geometry}
\begin{document}
 \bookmark[page=1,level=0]{ページ}
 \includepdf[pages=-]{1page.pdf}
\end{document}

なお,xelatexは3.1415926-2.2-0.9995.2 を使っています.