2017年3月24日

xrパッケージ

別のファイルからの引用ができるようになるパッケージです.たとえば全く関係のない(\input\includeがされているわけではない)article1.texとarticle2.texというファイルがあっても,article1.tex内の\labelをarticle2.tex内で\refすることができるようになります.

使い方

article1.texが

\documentclass{jlreq}
\begin{document}
\section{Introduction}\label{Introduction}
……
\end{document}
のようになっていたとします.この\label{Introduction}をarticle2.tex内で引用するには,次のようにします.

\documentclass{jlreq}
\usepackage{xr}
\externaldocument{article1}% article1内の\labelを取り込む
\begin{document}
article1の節\ref{Introduction}において……
\end{document}

LaTeXで処理する際には,まずarticle1.texを(十分な回数)コンパイルします.その後article2.texをコンパイルすると,引用がなされます.(article2.texのみでは駄目なことに注意.)

ただし,これだとarticle2.tex内にも\label{Introduction}があった場合はLabel `Introduction' multiply definedとなってしまいます.これを防ぐためにxrパッケージは接頭辞を付加する機能を持っています.たとえばarticle1.texからもってくる引用には1:をつけるならば

\documentclass{jlreq}
\usepackage{xr}
\externaldocument[1:]{article1}
\begin{document}
article1の節\ref{1:Introduction}において…… % Introductionの前に1:をつけて引用する
\end{document}
とします.

zref-xrパッケージ

シンプルには上のようにxrパッケージで良いのですが,これはhyperrefパッケージと使うといまいちです.hyperrefパッケージは引用先へのリンクを張りますが,上の状況でhyperrefパッケージを使ってもarticle1.tex内のIntroductionには飛んでくれません.(実際にやるととんちんかんなところへ飛んでしまいます.)また,article1でhyperrefを読み込んでいるけどarticle2では読み込んでいない,とするとバグります.これをどうにかしているxr-hyperというパッケージがありますが,更にそれがすごくなった(多分)zref-xrパッケージがあります.名前からわかるとおりzrefパッケージの一部(xrモジュール)です.

使い方はxrパッケージとよく似ています.

% article1.tex
\documentclass[dvipdfmx]{jlreq} % dvipdfmxはhyperrefのため
\usepackage{hyperref}
\begin{document}
\section{Introduction}\label{Introduction}
……
\end{document}
% article2.tex
\documentclass[dvipdfmx]{jlreq} % dvipdfmxはhyperrefのため
\usepackage{hyperref}
\usepackage{nameref} % これが\zexternaldocumentの前までに必要
\usepackage{zref-xr}
\zxrsetup{toltxlabel} % 通常のLaTeXスタイルの\refを使う(\zexternaldocumentより前におく)
\zexternaldocument*[1:]{article1} % \zのついたexternaldocumentを使う
\begin{document}
article1の節\ref{1:Introduction}において……
\end{document}

これでarticle2.pdfからarticle1.pdfに飛べるはずです.ちなみにarticle1.tex内のhyperrefの読み込みはなくても動きますが,このときはリンクがなくなります.つまり,リンクを機能させるには参照する方とされる方双方でhyperrefパッケージの読み込みが必要です.

リンク先の変更

リンク先として選ばれるファイルは,\zexternaldocumentで指定されたファイル名の拡張子を.pdfとしたものになります.これを変更するには,

\zexternaldocument*[1:]{article1}[article3.pdf]
とします.
相互参照システムについて

zrefパッケージは通常LaTeXとは独立した相互参照システムを持っていて,zref-xrパッケージでもデフォルトではその相互参照システムが使われます.これをやめてLaTeXの相互参照システム(つまり普通の\label\ref等による相互参照)を使うために,上では

  • \zexternaldocument*付きで呼び出すことで,参照される方(article1.tex内のラベル)で通常のシステムを使うことに
  • \zxrsetup{toltxlabel}により参照する方(article2.tex内)で通常のシステムを使うことに
しています.なお,デフォルト通りzrefの提供する相互参照システムを使うには,zref-userパッケージを読み込んだ上で\zlabel\zrefを使います.

% article1.tex
\documentclass{jlreq}
\usepackage{zref-user} % zref-userを読み込む
\begin{document}
\section{Introduction}\zlabel{Introduction} % labelの代わりにzlabelを使う
……
\end{document}
% article2.tex
\documentclass{jlreq}
\usepackage{zref-xr,zref-user}
\zexternaldocument[1:]{article1}
\begin{document}
article1の節\zref{1:Introduction}において…… % \zrefを使う
\end{document}

0 件のコメント:

コメントを投稿

コメントの追加にはサードパーティーCookieの許可が必要です