Personalización de referencias de páginas relativas

Personalización de referencias de páginas relativas

¿Cómo puedo obtener información detallada sobre la ubicación de una etiqueta en relación con otro texto y mostrar un texto personalizado basado en esta información?

  • Si la etiqueta aparece en la página inmediatamente anterior (y ésta es el anverso), imprima "en la página de la izquierda".
  • Si la etiqueta viene en la página inmediatamente anterior (y ésta está al reverso), imprima "en la página anterior".
  • Si la etiqueta aparece en la página siguiente (y ésta está al reverso), imprima "en la página de la derecha".
  • Si la etiqueta aparece en la página siguiente (y ésta es el anverso), imprima "en la página siguiente".

De lo contrario:

  • Si la etiqueta aparece antes, en la misma línea, imprima "antes, en esta línea".
  • Si la etiqueta está arriba en la misma página, imprima "arriba, en esta página".
  • Si la etiqueta viene después, en la misma línea, imprima "después, en esta línea".
  • Si la etiqueta está debajo en la misma página, imprima "abajo, en esta página".

De lo contrario:

  • Si la etiqueta viene antes (una página anterior), imprima "en una página anterior".
  • Si la etiqueta viene después (una página posterior), imprima "en una página posterior".

El variorefpaquete parece tener algunas de estas características, pero presenta algunos problemas:

  • No sé qué imprimir el número de página, que vpagerefsuele ser el caso.
  • Mi documento no usa inglés, por lo que necesito tener un mejor control sobre el texto que aparece, incluido el control sobre los espacios.

Respuesta1

Esto es posible cuando se utiliza elzrefpaquete. Al cargar el usermódulo (o directamente a través del zref-userpaquete), tiene acceso a una serie de propiedades asociadas con \zlabel(similar a LaTeX \label).

ingrese la descripción de la imagen aquí

\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}

Para cada etiqueta <lab>a la que se hace referencia a través de , se establece \myref{<lab>}una nueva donde hay un contador en ejecución normal. Esto permite extraer propiedades asociadas con las que realizar cálculos.\zlabel <lab>@<refcnt><refcnt><lab>@<refcnt>

\zref@extract{<ref>}{<prop>}proporciona una versión ampliable de la propiedad <prop>de etiqueta <ref>, lo que permite realizar cálculos. En el ejemplo anterior, las páginas anverso y reverso se deciden en función de si pageson pares o impares.

\myrefpodría ampliarse para incluir referencias de líneas utilizando el saveposmódulo, lo que permitiría hacer referencias "...arriba, en esta página". o "...abajo, en esta página". Esto se lograría usando el expandible \zposy{<lab>}para extraer la coordenada y de la etiqueta <lab>en la página y compararla con alguna otra etiqueta.

Tenga en cuenta que debe compilar al menos dos veces para que las referencias se "establezcan", a pesar de los posibles errores de los que se queja LaTeX durante la primera ejecución.

información relacionada