
他のテキストに対するラベルの位置に関する詳細な情報を取得し、この情報に基づいてカスタム テキストを表示するにはどうすればよいですか?
- ラベルが直前のページにある場合(そしてこれが表面の場合)、「左ページ」と印刷します。
- ラベルが直前のページにある場合(そしてこれが裏面の場合)、「前のページ」と印刷します。
- ラベルがすぐ次のページにある場合(そしてこれが裏面の場合)、「右ページ」と印刷します。
- ラベルが次のページにある場合(そしてこれが表面の場合)、「次のページ」と印刷します。
さもないと:
- ラベルが同じ行の前にある場合は、「この行の前に」と印刷します。
- ラベルが同じページの上にある場合は、「このページの上」と印刷します。
- ラベルが同じ行の後にある場合は、「この行の後」と出力します。
- ラベルが同じページの下にある場合は、「このページの下」と印刷します。
さもないと:
- ラベルが前ページにある場合は、「前のページに」と印刷します。
- ラベルが後続のページにある場合は、「後のページに」と印刷します。
パッケージvarioref
にはこれらの機能がいくつかあるようですが、次のような問題があります。
- ページ番号を印刷するかどうかはわかりませんが、
vpageref
よくやることです。 - 私の文書では英語が使用されていないため、スペースの制御を含め、表示されるテキストをより適切に制御する必要があります。
答え1
これは、zref
パッケージモジュールをロードするとuser
(またはパッケージを介して直接zref-user
)、 に関連付けられたいくつかのプロパティにアクセスできます\zlabel
(LaTeX の に似ています\label
)。
\documentclass[twoside]{article}
\usepackage[margin=5mm,paperheight=2in,paperwidth=4in,bottom=15mm]{geometry}% http://ctan.org/pkg/geometry
\usepackage[user]{zref}% http://ctan.org/pkg/zref
\newcounter{refcnt}% Counter used with every reference
\makeatletter
\newcommand{\myref}[1]{%
\stepcounter{refcnt}\zlabel{#1@\therefcnt}%
\texttt{#1} is on page~\zref[page]{#1}.
This is page~\zref[page]{#1@\therefcnt}. \par
\texttt{#1} is on a~\ifodd\zref@extract{#1}{page}recto\else verso\fi~page.
This is a~\ifodd\zref@extract{#1@\therefcnt}{page}recto\else verso\fi~page. \par
\texttt{#1} is
\ifnum\zref@extract{#1@\therefcnt}{page}=\zref@extract{#1}{page} % same page
on this page.
\else
\ifnum\numexpr\zref@extract{#1@\therefcnt}{page}-\zref@extract{#1}{page}\relax=1 % previous page
\ifodd\zref@extract{#1@\therefcnt}{page}
on the left-hand page.
\else
on the previous page.
\fi
\else
\ifnum\numexpr\zref@extract{#1}{page}-\zref@extract{#1@\therefcnt}{page}\relax=1 % next page
\ifodd\zref@extract{#1@\therefcnt}{page}
on the next page.
\else
on the right-hand page.
\fi
\else
\ifnum\zref@extract{#1}{page}>\zref@extract{#1@\therefcnt}{page} %
\strip@pt\dimexpr\zref@extract{#1}{page}pt-\zref@extract{#1@\therefcnt}{page}pt\relax~pages ahead.
\else
\strip@pt\dimexpr\zref@extract{#1@\therefcnt}{page}pt-\zref@extract{#1}{page}pt\relax~pages before.
\fi
\fi
\fi
\fi
}
\makeatother
\begin{document}
This is~\texttt{foo}.\zlabel{foo} \par \medskip
\myref{foo}
\newpage
\myref{foo} \par \medskip
\myref{bar}
\newpage
\myref{foo} \par
This is~\texttt{bar}.\zlabel{bar}
\newpage
\myref{bar}
\end{document}
<lab>
を介して参照される各ラベルに対して\myref{<lab>}
、新しい が\zlabel
<lab>@<refcnt>
設定されます<refcnt>
。ここで、 は通常の実行カウンタです。これにより、 に関連付けられたプロパティを抽出して、<lab>@<refcnt>
で計算を実行できます。
\zref@extract{<ref>}{<prop>}
<prop>
は、計算を可能にするlabel のプロパティの拡張可能なバージョンを提供します<ref>
。上記の例では、がpage
奇数か偶数かに基づいて、表面ページと裏面ページが決定されます。
\myref
モジュールを使用して行参照を含めるように拡張することができ、これにより、「...このページの上」または「...このページの下」を参照できるようになります。これは、展開可能を使用してページ上のラベルの y 座標を抽出し、それを他のラベルと比較することsavepos
で実現されます。\zposy{<lab>}
<lab>
最初の実行時に LaTeX がエラーを報告したとしても、参照を「解決」するには少なくとも 2 回コンパイルする必要があることに注意してください。