Personalizando referências de páginas relativas

Personalizando referências de páginas relativas

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 variorefpacote parece ter alguns desses recursos, mas apresenta alguns problemas:

  • Não sei como imprimir o número da página, o que vpagereftende 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 ozrefpacote. Carregando o usermódulo (ou diretamente através do zref-userpacote) você tem acesso a uma série de propriedades associadas a um \zlabel(semelhante ao do LaTeX \label).

insira a descrição da imagem aqui

\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 pageser ímpar/par.

\myrefpoderia ser expandido para incluir referência de linha usando o saveposmó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.

informação relacionada