
Como posso obter informações detalhadas sobre a localização de uma etiqueta em relação a outro texto e exibir um texto personalizado com base nessas informações?
- Se a etiqueta vier na página imediatamente anterior (e esta for a anterior), imprima "na página da esquerda".
- Se a etiqueta vier na página imediatamente anterior (e esta estiver no verso), imprima “na página anterior”.
- Se a etiqueta vier na página seguinte (e esta estiver no verso), imprima "na página direita".
- Se a etiqueta vier na página seguinte (e esta for a frente), imprima “na página seguinte”.
De outra forma:
- Se a etiqueta vier antes, na mesma linha, imprima “antes, nesta linha”.
- Se a etiqueta estiver acima na mesma página, imprima “acima, nesta página”.
- Se o rótulo vier depois, na mesma linha, imprima “depois, nesta linha”.
- Se a etiqueta estiver abaixo na mesma página, imprima “abaixo, nesta página”.
De outra forma:
- Se a etiqueta vier antes (de uma página anterior), imprima “na página anterior”.
- Se a etiqueta vier depois (de uma página posterior), imprima “em uma página posterior”.
O varioref
pacote parece ter alguns desses recursos, mas apresenta alguns problemas:
- Não sei como imprimir o número da página, o que
vpageref
tende a acontecer. - Meu documento não usa inglês, então preciso ter melhor controle sobre o texto que aparece, inclusive controle sobre os espaços.
Responder1
Isto é possível quando se utiliza ozref
pacote. Carregando o user
módulo (ou diretamente através do zref-user
pacote) você tem acesso a uma série de propriedades associadas a um \zlabel
(semelhante ao do 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 rótulo <lab>
referenciado por \myref{<lab>}
, um novo \zlabel
<lab>@<refcnt>
é definido onde <refcnt>
está um contador em execução comum. Isso permite extrair propriedades associadas para <lab>@<refcnt>
realizar cálculos.
\zref@extract{<ref>}{<prop>}
fornece uma versão expansível da propriedade <prop>
label <ref>
, permitindo cálculos. No exemplo acima, as páginas anterior e posterior são decididas com base no fato de page
ser ímpar/par.
\myref
poderia ser expandido para incluir referência de linha usando o savepos
módulo, o que permitiria referenciar "...acima, nesta página." ou "...abaixo, nesta página." Isso seria conseguido usando o expansível \zposy{<lab>}
para extrair a coordenada y do rótulo <lab>
na página e compará-la com algum outro rótulo.
Observe que você precisa compilar pelo menos duas vezes para que as referências "resolvam", apesar dos possíveis erros que o LaTeX reclama durante a primeira execução.