Latex/Referências internas
Introdução
[editar | editar código-fonte]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 | editar código-fonte]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 | editar código-fonte]\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 | editar código-fonte]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 | editar código-fonte]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}
Questões relacionadas a links para tabelas tabelas e figuras gerenciadas pelo pacote hyperref
[editar | editar código-fonte]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 | editar código-fonte]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:.
eqref
[editar | editar código-fonte]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
.
tag
[editar | editar código-fonte]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 | editar código-fonte]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.
cases
[editar | editar código-fonte]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 | editar código-fonte]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 | editar código-fonte]autoref
[editar | editar código-fonte]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 emhyperref
, 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 | editar código-fonte]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 | editar código-fonte]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 | editar código-fonte]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.