
¿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 varioref
paquete parece tener algunas de estas características, pero presenta algunos problemas:
- No sé qué imprimir el número de página, que
vpageref
suele 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 elzref
paquete. Al cargar el user
módulo (o directamente a través del zref-user
paquete), tiene acceso a una serie de propiedades asociadas con \zlabel
(similar a 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}
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 page
son pares o impares.
\myref
podría ampliarse para incluir referencias de líneas utilizando el savepos
mó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.