自訂相關頁面引用

自訂相關頁面引用

如何獲取有關標籤相對於其他文字的位置的詳細資訊並根據此資訊顯示自訂文字?

  • 如果標籤位於緊鄰的上一頁(且此頁為右頁),則列印「在左側頁」。
  • 如果標籤位於緊鄰的上一頁(且此頁位於反頁),請列印「在上一頁」。
  • 如果標籤位於緊鄰的下一頁(且此頁位於反頁),請列印「在右側頁」。
  • 如果標籤位於緊鄰的下一頁(且此頁為正面),請列印「在下一頁」。

否則:

  • 如果標籤位於同一行之前,則列印「在此行之前」。
  • 如果標籤位於同一頁上方,請列印「上方,在此頁」。
  • 如果標籤位於同一行之後,則列印「在此行之後」。
  • 如果標籤位於同一頁下方,請列印「下方,在此頁」。

否則:

  • 如果標籤位於前面(上一頁),則列印「在上一頁」。
  • 如果標籤出現在(較後的一頁)之後,則列印「在較後的一頁」。

varioref軟體包似乎具有其中一些功能,但這會帶來一些問題:

  • 我不列印頁碼,這vpageref往往會做。
  • 我的文件不使用英語,因此我需要更好地控制顯示的文本,包括控制空格。

答案1

當使用zref包裹。載入user模組(或直接通過zref-user套件),您可以存取與 a 相關的許多屬性\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可以擴展為包括使用該savepos模組的行引用,這將允許引用“...上方,在此頁面上”。或“…在本頁下方。”這可以透過使用可擴展\zposy{<lab>}來提取頁面上標籤的 y 座標<lab>並將其與其他標籤進行比較來實現。

請注意,儘管 LaTeX 在第一次運行期間可能會出現錯誤,但您必須至少編譯兩次才能引用“settle”。

相關內容