相対ページ参照のカスタマイズ

相対ページ参照のカスタマイズ

他のテキストに対するラベルの位置に関する詳細な情報を取得し、この情報に基づいてカスタム テキストを表示するにはどうすればよいですか?

  • ラベルが直前のページにある場合(そしてこれが表面の場合)、「左ページ」と印刷します。
  • ラベルが直前のページにある場合(そしてこれが裏面の場合)、「前のページ」と印刷します。
  • ラベルがすぐ次のページにある場合(そしてこれが裏面の場合)、「右ページ」と印刷します。
  • ラベルが次のページにある場合(そしてこれが表面の場合)、「次のページ」と印刷します。

さもないと:

  • ラベルが同じ行の前にある場合は、「この行の前に」と印刷します。
  • ラベルが同じページの上にある場合は、「このページの上」と印刷します。
  • ラベルが同じ行の後にある場合は、「この行の後」と出力します。
  • ラベルが同じページの下にある場合は、「このページの下」と印刷します。

さもないと:

  • ラベルが前ページにある場合は、「前のページに」と印刷します。
  • ラベルが後続のページにある場合は、「後のページに」と印刷します。

パッケージ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 回コンパイルする必要があることに注意してください。

関連情報