LaTeXでPDF出力する際のTips その2

LaTeXでPDF出力する際のTips では、

  • PDFのメタデータの文字化けの解消方法
  • PDFのタイトルや作成者を \title, \author から自動的に設定する方法

を扱った。

今度は、PDFの目次(ブックマーク、しおりと呼ぶこともあるようだが、この記事では「目次」で通す)についてのTipsを扱う。

PDFの目次をつける

デフォルトでは、hyperrefパッケージを使うと自動的にPDFの目次がつく。 \tableofcontents で出力されるものと同じようなやつだ。これが文字化けする場合は、前回の記事を読んでほしい。

pdf-bookmark-example1

PDFの目次

なお、目次をつけるには (p/lua)latex を2回以上実行しなければならない。最初に実行したときに .out ファイルが生成され、2回目に実行した時にそれが反映される。1回目の実行で .aux ファイルに書き出す \label/\ref や、.toc ファイルに書き出す \tableofcontents と同じような感じだ。

目次にセクション番号をつける

pdf-bookmark-example2

目次にセクション番号をつけた例

デフォルトでは、目次にはセクション等の番号がつかない。番号をつけるには、hyperrefの bookmarksnumbered オプションを指定する。

% 例1(platex+dvipdfmx の場合)
\documentclass[dvipdfmx]{jsarticle}
\usepackage[bookmarksnumbered]{hyperref}
\usepackage{pxjahyper}
略
% 例2(platex+dvipdfmx の場合。\hypersetup 使用)
\documentclass[dvipdfmx]{jsarticle}
\usepackage{hyperref}
\usepackage{pxjahyper}

\hypersetup{
  bookmarksnumbered
}
略
% 例3(LuaTeX-ja + LaTeX の場合)
\documentclass{ltjsarticle}
\usepackage[unicode,bookmarksnumbered]{hyperref}
略

セクションのタイトルにTeX特有の表現を使っている場合

セクションのタイトルに、数式などのTeX特有の表現を使っていると、PDFの目次での表示が崩れる可能性がある。

% 例4(platex+dvipdfmx の場合)
\documentclass[dvipdfmx]{jsarticle}
\usepackage{amssymb}
\usepackage{okumacro}
\usepackage{hyperref}
\usepackage{pxjahyper}
\title{すごい文書}
\author{天才}
\begin{document}
\maketitle
\tableofcontents
\section{はじめに}
\section{\ruby{四元数}{クォータニオン}}
\subsection{$i^2=j^2=k^2=ijk=-1$}
\section{$\mathfrak{sl}(2,\mathbf{C})$\ruby{有限次元表現}{ゆうげんじげんひょうげん}}
\end{document}

この例だと、PDF本文内での目次、セクションタイトルは意図した通りに表示されているが、PDFメタデータの目次(ブックマーク)では、 “四元数クォータニオン” “i2=j2=k2=ijk=-1” のように、ルビや添字の情報が落ちている。PDFメタデータはプレーンテキストだから、まあしょうがないと言えばそうなのだが、もうちょっと何とかならないのか。

そこで、セクションタイトルなどの本文とPDFメタデータの両方に使われる文字列に対して、(本文の中で使う)TeXのコードと、(メタデータで使う)プレーンテキストを別々に指定しよう。hyperrefパッケージはそのために \texorpdfstring マクロを提供している。

\texorpdfstring マクロは

\texorpdfstring{TeXでの表現}{プレーンテキスト(PDFメタデータ)での表現}

のように使う。

例4をもとにして \texorpdfstring を使ってみよう。ただし、Unicodeにある上付きの2を扱うために pLaTeX ではなく upLaTeX を使う。Unicodeの上付き2は textcomp パッケージの \texttwosuperior マクロで使える。

% 例5(uplatex+dvipdfmx の場合)
\documentclass[uplatex,dvipdfmx]{jsarticle}
\usepackage{amssymb}
\usepackage{textcomp} % \texttwosuperior
\usepackage{okumacro}
\usepackage{hyperref}
\usepackage{pxjahyper}
\title{すごい文書}
\author{天才}
\begin{document}
\maketitle
\tableofcontents
\section{はじめに}
\section{
  \texorpdfstring{%
    \ruby{四元数}{クォータニオン}%
  }{%
    四元数%
  }%
}
\subsection{
  \texorpdfstring{%
    $i^2=j^2=k^2=ijk=-1$%
  }{%
    i\texttwosuperior=j\texttwosuperior=k\texttwosuperior=ijk=-1%
  }%
}
\section{%
  \texorpdfstring{%
    $\mathfrak{sl}(2,\mathbf{C})$%
  }{%
    sl(2,C)%
  }
  の%
  \texorpdfstring{%
    \ruby{有限次元表現}{ゆうげんじげんひょうげん}%
  }{%
    有限次元表現%
  }%
}
\end{document}
% 例6(LuaTeX-ja の場合)
\documentclass{ltjsarticle}
\usepackage{amssymb}
\usepackage{textcomp} % \texttwosuperior
\usepackage{luatexja-ruby}
\usepackage[unicode]{hyperref}
\title{すごい文書}
\author{天才}
\begin{document}
\maketitle
\tableofcontents
\section{はじめに}
\section{
  \texorpdfstring{%
    \ruby{四元数}{クォータニオン}%
  }{%
    四元数%
  }%
}
\subsection{
  \texorpdfstring{%
    $i^2=j^2=k^2=ijk=-1$%
  }{%
    i\texttwosuperior=j\texttwosuperior=k\texttwosuperior=ijk=-1%
  }%
}
\section{%
  \texorpdfstring{%
    $\mathfrak{sl}(2,\mathbf{C})$%
  }{%
    sl(2,C)%
  }
  の%
  \texorpdfstring{%
    \ruby{有限次元表現}{ゆうげんじげんひょうげん}%
  }{%
    有限次元表現%
  }%
}
\end{document}

ちなみに、\TeX\LaTeX は、hyperref側でうまいこと処理してくれるので、自分で \texorpdfstring{\LaTeX}{LaTeX} みたいのを書かなくてもよい。

PDF用の文字列にUnicodeのコードポイントを直接指定する

上付きの2(U+00B2)は、textcompパッケージに \texttwosuperior というマクロがあってそれを使えばうまいこといったが、そういう対応するマクロがない場合は、Unicodeのその文字を直接指定しなければならない。

upLaTeX + dvipdfmx + PXjahyper の場合

otfパッケージ\UTF{XXXX} が使える。正確には、PXjahyperパッケージが \UTF を上書きしてうまいこと動作するようにしてくれる。\UTF{XXXX} じゃなくて \Ux{XXXX} でもよい。

試した感じでは、U+10000 以上のコードポイントの文字が文字化けする。

% 例7
\documentclass[uplatex,dvipdfmx]{jsarticle}
\usepackage{amssymb}
\usepackage{textcomp} % \texttwosuperior
\usepackage{otf} % \UTF
\usepackage{okumacro}
\usepackage{hyperref}
\usepackage{pxjahyper}

中略

\section{%
  \texorpdfstring{%
    $\mathfrak{sl}(2,\mathbf{C})$
  }{%
    sl(2,\UTF{2102})%
  }
  の有限次元表現
}
LuaLaTeX の場合

hyperrefパッケージの README によると、 ucs パッケージの \unichar がこの目的に使えるようである。試した限りでは \symbol やluatexja-otfパッケージの \UTF は使えない。

あるいは、直接その文字をソースに書いてもよさそうだ。

% 例8
\documentclass{ltjsarticle}
\usepackage{amssymb}
\usepackage{ucs} % \unichar
\usepackage[unicode]{hyperref}

\PrerenderUnicode{} % なんか必要っぽい

中略

\section{%
  \texorpdfstring{%
    $\mathfrak{sl}(2,\mathbf{C})$%
  }{%
    sl(2,\unichar{"2102})%
  }
  の有限次元表現%
}

または

\section{%
  \texorpdfstring{%
    $\mathfrak{sl}(2,\mathbf{C})$%
  }{%
    \unichar{"1D530}\unichar{"1D529}(2,\unichar{"1D402})%
  }
  の有限次元表現%
}

または

\section{%
  \texorpdfstring{%
    $\mathfrak{sl}(2,\mathbf{C})$%
  }{%
    𝔰𝔩(2,𝐂)%
  }
  の有限次元表現%
}

LaTeXでPDF出力する際のTips その2」への3件のフィードバック

  1. ピンバック: LaTeXでPDF出力する際のTips | 雑記帳

  2. zr_tex8r

    > 試した感じでは、U+10000 以上のコードポイントの文字が文字化けする。
    \usepackage[bigcode]{pxjahyper}
    のように、bigcodeオプションをつけると、(\UTF{…}の場合も直接文字を書く場合も)
    U+10000以上の文字が正常に処理されるようになります。
    ただしbigcodeを指定する場合は、「UTF8-UTF16」というCMapファイルがTeX環境に
    インストールされている必要があります。
    古い環境だと入っていないため、bigcodeをデフォルトにしていないのです。

    返信
  3. Tanikaz

    >>デフォルトでは、目次にはセクション等の番号がつかない。番号をつけるには、hyperrefの bookmarksnumbered オプションを指定する。

    この2行、このTipsが、ものすごく役に立ちました。

    \usepackage[pdftex,bookmarksopen,bookmarksnumbered]{hyperref}

    でコンパイルしたら、PDFのしおりが全部開いたままでオープンし、かつ、章・節番号もちゃんと(1, 2, 2.1, A, A.1…)付加されていました。完璧です。
    日付を見たら、なんと5年7か月前の投稿……(゚д゚)!あまりにも遠い昔過ぎて、涙目になります。
    しかし、今現在でも hyperref パッケージは、デフォルトで章・節番号を自動で付加してくれないので、このTipsは10年後も生き残ると思っています。どうもありがとうございます。

    返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です