Latex/Referências internas

Predefinição:LaTeX/Top

Introdução

editar

Em LaTeX você pode facilmente criar referências para quase qualquer objeto numerado (seções, figuras, fórmulas), e o LaTeX se encarregará da numeração e atualização quando for necessário Os comandos a serem usados não dependem do que você está referenciando, eles são:

\label{marker}
você dá o objeto que quer referênciar um rótulo (marker), você pode vê-lo como um nome.
\ref{marker}
você pode referenciar o objeto que for atribuído como marker anteriormente. Isso imprime o número que foi assinalado ao objeto.
\pageref{marker}
Isso irá imprimir o número da página onde o objeto está.

LaTeX calculará a numeração correta para os objetos no documento; o marker que você usou para rotular (label) o objeto não será mostrado em nenhuma lugar no documento. Então LaTeX irá substituir o trecho "\ref{marker}" pelo número correto que foi assinalado para o objeto. Se você referenciar um marker que não existe, a compilação do documento irá ocorrer mas o LaTeX retornará uma advertência:

LaTeX Warning: There were undefined references.

e ele substituirá "\ref{unknown-marker}" por "??" (então o local poderá ser facilmente encontrado no documento).

Como você pode ter notado como isso funciona, é um processo de duas etapas: primeiro o compilador tem que armazenar as rotulações como o número correto a ser usado para referênciação, então ele substitui o \ref pelo número correto. Isso é porque, quando você usa referências, você tem que compilar seus documentos duas vezes para ver a saída apropriada. Se você compilar apenas uma, o LaTeX usará a última informação que ele colerou na compilação anteirior (que pode estar desatualizada), mas o compilador informará a você imprimindo na tela ao final da compilção:

LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.

Usando o comando \pageref{} você pode ajudar ao leitor a encontrar o objeto referenciado provendo também o número da página onde ele pode ser encontrado. Você pode escrever algo como:

Veja a figura~\ref{fig:test} na página~\pageref{fig:test}.

Uma vez que você pode usar exatamente os mesmos comandos para referenciar quase qualquer objeto, você pode ficar um pouco confuso depois de introduzir muitas referências. Isso é uma prática comum entre os usuários LaTeX para adicionar algumas letras ao rótulo para descrever o que você está referenciando. Alguns pacotes, tal como fancyref, contam com essa meta-informação. Aqui está um exemplo:

ch: chapítulo
sec: seção
subsec: subseção
fig: figura
tab: tabela
eq: equação
lst: listagem de código
itm: item de lista enumerada
alg: algorítmo
app: subseção de apêndice

Seguindo essa convenção, o rótulo se parecerá como \label{fig:my_figure}, \label{chap:my_chap}, etc. Você não é obrigado a usar esses prefixos. Você pode usar qualquer texto como argumento para \label{...}, mas esses prefixos tornam-se extremamente úteis conforme seu documento aumenta o tamanho.

Outra sugestão: tento evitar usar números dentro dos rótulos. Você faz melhor descrevendo o que o objeto se trata. Dessa forma, se você alterar a ordem dos objetos, você não terá que renomear todos seus rótulos e suas referências.

Se você quiser ser capaz de ver os rótulos que você está usando na saída do documento, você pode usar o pacote showkeys; ele pode ser bastante útil enquanto se está desenvolvendo seu documento. Para maiores informações veja a seção de Pacotes.

Exemplos

editar

Aqui vão alguns exemplos práticos, mas você notará que eles são os mesmos porque todos eles usam os mesmos comandos.

Seções

editar
\section{Greetings}
\label{sec:greetings}

Hello!

\section{Referencing}

I greeted in section~\ref{sec:greetings}.

 

Você pode posicionar o \label{...} onde desejar dentro da seção; no entanto, a fim de evitar confusão, é melhor posicioná-lo imediatamente appós o início da seção. Note como o rótulo inicia com sec:, como sugerido anteriormente. O rótulo é então referenciado em uma seção diferente. O til (~) indica um non-breaking space.

Figuras

editar

Você pode referenciar uma figura pela inserção dentro do figure floating environment.

\begin{figure}
  \centering
    \includegraphics[width=0.5\textwidth]{gull}
  \caption{Close-up of a gull}
  \label{fig:gull}
\end{figure}
Figure \ref{fig:gull} shows a photograph of a gull.
 

Quando o rótulo é declarado dentro do ambiente flutuante da figura (figure floating environment), o \ref{...} retornará o respectivo número da figura/tabela, mas após a legenda. Quando declarado fora, ele dará o número da seção. Para ser completamente seguro, o rótulo para qualquer figura ou tabela pode ir dentro do comando \caption{}, como em

\caption{Close-up of a gull\label{fig:gull}}

Veja a seção Flutuantes, Figuras e Legendas para mais informações sobre o ambiente figure e semelhantes.

Consertando rótulos errados

editar

O comando \label deve aparecer após (ou dentro) de \caption. Caso contrário, ele irá pegar a seção atual ou a número da lista ao invés do que você deseja.

\begin{figure}
  \centering
  \includegraphics[width=0.5\textwidth]{gull}
  \caption{Close-up of a gull} \label{fig:gull} 
\end{figure}
editar

No caso de você utilizar o pacote hyperref para criar um PDF, o link para as tabelas ou figuras apontarão para a legenda da figura ou da tabela, que está sempre abaixo delas [1]. Portanto a tabela ou a figura não serão visíveis, e o leitor terá que rolar a página para cima para ser possível ver o objeto apontado. Se você quer que o link aponte para o topo da imagem, você pode dar a opção hypcap para o pacote caption:

\usepackage[hypcap]{caption}

Equação

editar

Aqui está um exemplo mostrando como referenciar uma equação:

\begin{equation} \label{eq:solve}
x^2 - 5 x + 6 = 0
\end{equation}

\begin{equation}
x_1 = \frac{5 + \sqrt{25 - 4 \times 6}}{2} = 3
\end{equation}

\begin{equation}
x_2 = \frac{5 - \sqrt{25 - 4 \times 6}}{2} = 2
\end{equation}

and so we have solved equation~\ref{eq:solve}

 

Como você pode ver, o rótulo é posto após o início do modo matemático. A fim de referenciar a equação, você pode usar um ambiente que adiciona enumeração às equações. Na maior parte das vezes você estará usando o ambiente equation; que é a melhor escolha para equações de uma linha, se você está usando amsmath ou não. Note também que o rótulo contém dessa vez o prefixo eq:.

O pacote amsmath adiciona um novo comando para referenciar a equação; é o \eqref{}. Ele funciona exatamente como \ref{}, mas ele adiciona parênteses, ao invés de imprimir somente o número como 5, ele imprimirá como (5). Isso pode ser útil para ajudar ao leitor a distinguir entre a equação e outras coisas, sem a necessidade de adicionar a palavra "equação" antes de qualquer referência. A saída pode ser alterada como desejada; para mais informações veja a documentação do pacote amsmath.

O comando \tag{eqnno} é usado para manualmente atribuir números às equações onde eqnno é um trecho de texto arbitrário que você deseja que apareça no documento. É normalmente melhor usar rótulos, mas às vezes números fixos para as equações podem oferecer uma solução útil. Isso pode por exemplo ser útil se você quer repetir uma equação que é usada anteriormente, ex: \tag{\ref{eqn:before}}.

numberwithin

editar

O pacote amsmath adiciona o comando \numberwithin{countera}{counterb} que substitui o simpĺes countera por um mais sofisticado counterb.countera. Por exemplo \numberwithin{equation}{section} no preâmbulo irá prefixar o númeo da seção em todos os números das equações.

O pacote cases adiciona o \numcases e o comando \subnumcases, que produzem equações agrupadas por chave (curly-brace) com números separados para as equações seguidos por uma letra para cada equação.

O pacote varioref

editar

O pacote varioref introduz um novo comando chamado \vref{}. Esse comando é usado exatamente como o \ref, mas ele tem uma saída diferente de acordo com o contexto. Se o objeto a ser referenciado está na mesma página, ele funcionará como \ref; se o objeto está longe ele irá imprimir algo como "5 on page 25", ele adiciona o número da página automaticamente. Se o objeto está perto, ele pode usar uma sentença mais refinada como "on the next page" ou "on the facing page" automaticamente, de acordo com o contexto e a classe do documento.

Esse comando deve ser usado muito cuidadosamente. A saída dele é mais do que uma palavra, então pode acontecer que a saída dele caia em duas páginas diferentes. Nesse caso, o algorítmo pode ficar confuso e causar um loop. Vamos ver um exemplo. Você rotula um objeto na página 23 e a saída do \vref acontece de estar entre a página 23 e 24. Se ela estava na página 23, ele imprimiria como o comando básico \ref, se estava na página 24, imprimiria "on the previous page", mas está em ambas, e isso pode causar alguns erros estranhos durante o tempo de compilção que são muito dificeis de consertar. Você poderia pensar que isso acontece muito raramente; infelizmente, se você escreve um documento longo não é incomum ter centenas de referencias, então situações como essa são possíveis. Um modo de evitar problemas durante o desenvolvimento do documento é usar o padrão ref todo o tempo, e converter para vref quando o documento está próximo da versão final, e então fazer os ajustes para consertar possíveis problemas.

O pacote hyperref

editar

autoref

editar

O pacote hyperref introduz um outro comanto útil; \autoref{}. Esse comando cria uma referência com um correspondente texto adicional para o tipo de objeto alvo. Por exemplo, o comando \autoref{sec:intro} criaria um hyperlink para o comando \label{sec:intro}, onde quer que ele esteja. Assumindo que esse rótulo aponta para uma seção, o hyperlink conteria o texto "seção 3.4", ou similar (a lista completa de nomes padrão pode ser encontrada aqui). Note que, enquanto existe um comando \autoref* que produz um prefixo distinto (útil se o rótulo está na mesma página como a referência), sem alternar o comando \Autoref é definido para produzir versões capitalizadas (útil, por exemplo, quando se inicia sentenças); mas desde que a capitalização de nomes autoref forem escolhidas pelo autor do pacote, você pode customizar o texto prefixado redefinindo \typeautorefname para o prefixo que você quiser, como em:

\def\sectionautorefname{Section}

Esse truque de renomear pode, evidentemente, ser usado para outros propósitos também.

  • Se você gostaria de ter uma referência de hyperlink, mas não quer o texto predefinido que \autoref{} provê, você pode fazer isso com um comando tal como \hyperref[sec:intro]{Appendix~\ref*{sec:intro}}. Note que você pode desabilitar a criação de hyperlinks em hyperref, e somente usar esses comandos para texto automático.
  • Tenha em mente que o \label deve ser posicionado dentro de um ambiente com um enumerador (counter), tal como uma tabela ou uma figura. Caso contrário, não só o número irá referenciar a seção atual, como mencionado acima, mas o nome irá referenciar ao ambiente anterior com um enumerador. Por exemplo, se você colocar o rótulo depois de fechar a figura, o rótulo ainda dirá "figura n", em que n é o número da seção atual.

nameref

editar

O pacote hyperref também inclue automaticamente o pacote nameref, e um comando com nome similar. Ele é similar ao \autoref{}, porém insere texto correspondente ao nome da seção, por exemplo.

Entrada:

\section{MyFirstSection} \label{sec:marker}
\section{MySecondSection}
In section~\nameref{sec:marker} we defined...

Saída:

In section MyFirstSection we defined...

Ancoragem manual

editar

Quando você define um \label fora de uma figura, uma tabela, ou outro objeto flutuante, o rótulo aponta para a seção atual. Em alguns casos, esse comportamente não é o que você gostaria e você preferia que o link gerado apontasse para a linha onde o \label é definido. Isso pode ser obtido com o comando \phantomsection como no exemplo:

%A localização do link será posicionada na linha abaixo.
\phantomsection
\label{the_label}

O pacote cleveref

editar

O pacote cleveref introduz um novo comando \cref{} que inclui o tipo de objeto referenciado como \autoref{} faz. O comando subistituto \labelcref{} funciona mais como o padrão \ref{}. Referências para páginas são gerenciadas pelo comando \cpageref{}.

Os comandos \crefrange{}{} e \cpagerefrange{} esperam o início e o final do rótulo e provêem uma extensão da linguagem natural (babel habilitado). Se os rótulos são enumerados como uma lista separada por poto-e-vírgula com o usual comando \cref{}, ele irá ordená-los em grupos automaticamente.

O formato pode ser especificado no preâmbulo.

Veja também

editar

Notas e Referências

editar


Predefinição:LaTeX/Bottom