LaTeX (carte)/Etichete și referințe

De la Wikimanuale, o colecţie de manuale libere !


Introducere[modificare]

Un alt avantaj al sistemului LaTeX este acela că puteți crea cu ușurință referințe la aproape orice este numerotat (secțiuni, figuri, formule), iar LaTeX va avea grijă de numerotarea referințelor, actualizând aceste date când este necesar. Comenzile utilizate nu depind de obiectele la care faceți trimiteri, aceste comenzi fiind:

\label{marker}
dai obiectului la care vrei să creezi referințe un marker, un fel de nume.
\ref{marker}
poți face trimiteri la obiectul marcat mai devreme. Această comandă afișează numărul care a fost atribuit obiectului.
\pageref{marker}
Tipărește numărul paginii pe care se găsește obiectul.

LaTeX va determina automat numerotarea corectă pentru obiectele din document; markerul folosit pentru a eticheta obiectul nu va apare nicăieri în document. Apoi LaTeX va înlocui șirul de caractere "\ref{marker}" cu numărul corespunzător ce a fost atribuit obiectului. Dacă faceți trimiteri la un marker care nu există, LaTeX va compila cu succes documentul, dar va da un avertisment (referințe nedefinite):

LaTeX Warning: There were undefined references.

și va înlocui "\ref{marker necunoscut}" cu "??" (astfel că va fi ușor de găsit în document).

După cum probabil ați ghicit deja, este un proces care se defășoară în două faze: mai întâi, compilatorul trebuie să memoreze etichetele cu numărul corespunzător de folosit pentru trimiteri, apoi trebuie să înlocuiască \ref cu acest număr. De aceea, când utilizați referințe, trebuie să compilați documentul de două ori pentru a vedea outputul corespunzător. Dacă compilați documentul numai o dată, LaTeX va folosi informațiile mai vechi colectate la compilările anterioare (care pot fi învechite), însă compilatorul vă va informa, afișând pe ecran la sfârșitul compilării:

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

(Avertisment LaTeX: Eticheta(ele) se poate să se fi schimbat. Recompilați pentru a actualiza referințele.)

Cu ajutorul comenzii \pageref{} puteți ajuta cititorul să găsească obiectul la care s-a făcut trimitere, oferind și numărul paginii unde poate fi găsit. Puteți scrie ceva de genul:

Vezi figura~\ref{fig:test} de pe pagina~\pageref{fig:test}.

Deoarece poți utiliza exact aceleași comenzi pentru a face trimiteri la aproape orice, s-ar putea să fii puțin confuzionat după ce ai introdus o mulțime de referințe. Se obișnuiește în rândul utilizatorilor LaTeX să se adauge câteva litere la etichetă pentru a descrie obiectul la care se fac trimiteri. Iată un exemplu:

cap: capitol
sec: secțiune
fig: figură
tab: tabel
ec: ecuație
cod: afișare de cod

Urmând această convenție, eticheta unei figuri va arăta așa: \label{fig:figură}, etc. Nu sunteți obligați să utilizați acest tip de prefixe. Puteți folosi orice șir de caractere ca argument al comenzii \label{...}, însă aceste prefixe devin tot mai utile pe măsură ce documentul crește în dimensiune.

O altă sugestie: încercați să evitați să folosiți numere în etichete. E mai bine să descrieți obiectul. În felul acesta, dacă schimbați ordinea obiectelor, nu va trebui să redenumiți toate etichetele și referințele acestora.

Dacă vreți să vedeți marcatorii utilizați și în documentul de ieșire, puteți folosi pachetul showkeys; acesta poate fi foarte util în faza de dezvoltare a documentului. Pentru mai multe informații, vezi capitolul Pachete.

Exemple[modificare]

Iată câteva exemple concrete, însă veți observa că sunt asemănătoare, întrucât utilizează aceleași comenzi.

Secțiuni[modificare]

\section{Salutări}
\label{sec:salut}

Salut!

\section{Referințe}

Am salutat în secțiunea \ref{sec:salut}.

Puteți plasa eticheta oriunde în secțiune; oricum, pentru a evita confuzia, este mai bine să o așezați imediat după începutul secțiunii. Notați că markerul începe cu sec:, după cum s-a sugerat mai devreme. Se face apoi referire la etichetă într-o secțiune diferită.

Imagini[modificare]

Puteți face referire la o imagine prin inserarea ei în mediul flotant figure.

\begin{figure}
 \centering
 \includegraphics[width=0.5\textwidth]{pescarus}
 \caption{Prim-plan al unui pescăruș}
 \label{pescarus}
\end{figure}
Figura \ref{pescarus} prezintă o fotografie a unui pescăruș.

Când se declară o etichetă într-un mediu ce gestionează elemente flotante, comanda \ref{...} va returna numărul figurii/tabelului respective, însă trebuie să apară după titlu (caption). Când se declară în afara mediului, va returna numărul secțiunii. Pentru a fi complet sigură, eticheta oricărei imagini sau tabel poate fi introdusă în comanda \caption{}, ca în:

\caption{Prim-plan al unui pescăruș\label{pescarus}}

Vezi capitolul Elemente flotante, figuri și note pentru mai multe informații despre figure și alte medii similare.

Corectarea etichetelor greșite[modificare]

Comanda \label trebuie să apară după (sau înăuntrul) \caption. Altfel, va selecta numărul secțiunii sau listei curente în locul celui dorit.

\begin{figure}
  \begin{center}
    \includegraphics[width=0.5\textwidth]{pescarus}
    \caption{Prim-plan al unui pescăruș} \label{fig:pescarus} 
  \end{center}
\end{figure}

Probleme cu linkuri la tabele și figuri gestionate de hyperref[modificare]

În cazul în care folosiți pachetul hyperref pentru a crea un PDF, linkurile la tabele sau figuri vor indica spre titlul tabelului sau figurii, care este întotdeauna așezat sub tabelul sau figura respective[1]. De aceea, tabelul sau figura nu vor fi vizibile, dacă sunt situate deasupra pointerului și trebuie să derulați pagina în sus pentru a le vedea. Dacă vreți ca linkul să indice spre partea superioară a imaginii, puteți folosi pachetul hypcap:

\usepackage[all]{hypcap}

Aveți grijă să includeți acest pachet după ce includeți pachetul hyperref, care altfel ar trebui să fie încărcat ultimul.

Formule[modificare]

Iată un exemplu ce prezintă cum puteți crea referințe la formule:

\begin{minipage}{0.5\textwidth}
 \begin{equation} \label{ec:rezolv}
  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}

 \medskip

 și am rezolvat ecuația \ref{ec:rezolv}.
\end{minipage}

După cum vedeți, eticheta este așezată puțin după începutul modului matematic. Pentru a face o referință la formulă, trebuie să folosiți un mediu care adună numere. De cele mai multe ori, veți utiliza mediul equation; asta este cea mai bună alegere pentru formule scrise pe o linie, fie că folosiți pachetul amsmath sau nu. Notați de asemenea prefixul ec: din etichetă.

eqref[modificare]

Pachetul amsmath adaugă o comandă nouă pentru referențierea formulelor: \eqref{}. Merge exact la fel ca \ref{}, însă adaugă paranteze drepte astfel încât, în loc să tipărească un număr simplu ca 5, va tipări (5). Acest lucru poate fi util prin evidențierea diferențelor dintre formule și alte lucruri, fără a fi necesar să repetați cuvântul "formula" înaintea oricărei referințe. Outputul său poate fi modificat după cum doriți; pentru mai multe informații, vezi documentația pachetului amsmath.

numberwithin[modificare]

Pachetul amsmath adaugă comanda \numberwithin{contor1}{contor2} ce înlocuiește argumentul simplu contor1 cu unul mai sofisticat contor2.contor1. Spre exemplu, \numberwithin{equation}{section} în preambul va adăuga numărul secțiunii înaintea tuturor numerelor ecuațiilor.

Pachetul varioref[modificare]

Pachetul varioref introduce o comandă nouă, numită \vref{}. Această comandă este utilizată exact ca \ref, însă are un output diferit conform contextului. Dacă obiectul la care trebuie creată referința este pe aceeași pagină, merge exact la fel ca \ref; dacă obiectul este îndepărtat, va afișa ceva în genul "5 pe pagina 25", adică adaugă automat numărul paginii. Dacă obiectul este apropiat, poate utiliza automat fraze mai rafinate, cum ar fi "pe pagina următoare" sau "pe pagina impară", conform cu contextul și clasa documentului.

Această comandă trebuie utilizată cu mare atenție. Generează mai mult de un cuvânt, astfel că se poate întâmpla ca outputul său să fie afișat pe două pagini diferite. În acest caz, algoritmul poate fi confuzionat și cauza apariția unei bucle. Haideți să vedem un exemplu. Etichetați un obiect pe pagina 23, iar outputul comenzii \vref este între paginile 23 și 24. Dacă ar fi pe pagina 23, ar fi afișat la fel ca în cazul comenzii de bază ref, dacă s-ar situa pe pagina 24, ar fi tipărit sub forma "pe pagina anterioară", însă dacă este pe amândouă, ar putea determina apariția unor erori ciudate la compilare, care ar putea fi foarte greu de rezolvat. Puteți să credeți că acest lucru se întâmplă numai foarte rar; din păcate, dacă scrieți un document lung, puteți avea sute de referințe, astfel că situații de genul acesta au șanse să apară. O cale de a evita problemele acestea în timpul dezvoltării este să folosiți comanda standard ref tot timpul și să o convertiți la vref când documentul este aproape de versiunea finală, iar apoi să faceți ajustări pentru a rezolva eventualele probleme.

Pachetul hyperref și \autoref{}[modificare]

Pachetul hyperref introduce încă o comandă utilă: \autoref{}. Această comandă creează o referință cu text adițional corespunzător tipului trimiterii, toate constituind o hiperlegătură (hyperlink). Spre exemplu, comanda \autoref{sec:intro} ar crea un hyperlink la comanda \label{sec:intro}, oriunde ar fi. Presupunând că această etichetă indică spre o secțiune, hyperlinkul ar conține textul "section 3.4", sau ceva similar (lista completă a denumirilor implicite poate fi consultată aici). Notați că, deși există o comandă \autoref* ce produce un prefix fără link (util dacă eticheta este pe aceeași pagină cu referința), nu există o comandă \Autoref care să producă versiuni care încep cu litere mari (utile, spre exemplu, la începutul frazelor); însă de vreme ce scrierea cu litere mari sau denumirile autoref au fost alese de autorul pachetului, puteți modifica textul prefixului prin redefinirea \tipautorefname la prefixul dorit, ca în:

\def\sectionautorefname{Section}

Această truc de redenumire poate fi folosit, desigur, și în alte scopuri.

  • Dacă doriți să aveți o referință cu un hyperlink, însă nu doriți textul predefinit oferit de comanda \autoref{}, puteți realiza acest lucru cu o comandă de genul \hyperref[sec:intro]{Anexă~\ref*{sec:intro}}. Notați că puteți dezactiva crearea de hyperlinkuri în hyperref, iar apoi utiliza aceste comenzi pentru a genera text automat.
  • Rețineți că eticheta (\label) trebuie plasată într-un mediu cu un contor, cum este un tabel sau o figură. Altfel, nu doar că numărul va face referire la secțiunea curentă, după cum a fost menționat mai devreme, dar de asemenea numele se va referi la mediul anterior cu un contor. Spre exemplu, dacă puneți o etichetă după ce se termină codul pentru o figură, eticheta tot va spune "figura n", unde 'n' este numărul secțiunii curente.

Pachetul hyperref și \nameref{}[modificare]

Pachetul hyperref include automat și pachetul nameref, precum și o comandă cu același nume din pachet. Este similară cu \autoref{}, însă inserează un text corespunzător numelui secțiunii, de exemplu:

\section{Prima secțiune} \label{marker}
\section{A doua secțiune}
În secțiunea \nameref{marker} am definit...

Pachetul hyperref și \phantomsection[modificare]

Când definiți o etichetă (\label) în afara unei figuri, tabel, sau altor obiecte flotante, eticheta indică secțiunea curentă. În unele cazuri, acest comportament nu este ce ați dori și ați prefera ca linkul generat să indice către linia unde este definită eticheta. Asta se poate face cu comanda \phantomsection, ca în exemplul următor:

% Linkul indică spre linia de mai jos
\phantomsection
\label{eticheta}

Referințe[modificare]

  1. http://www.ctan.org/tex-archive/macros/latex/contrib/hyperref/README


Anterior: Teoreme LaTeX Următor: Indexare