Querverweise

In diesem Monat schauen wir uns zunächst an, welche Möglichkeiten wir in haben Querverweise auf Abschnitte, Abbildungen, Tabellen, Formeln, Seitenzahlen etc. zu setzen. Anschließend werden wir diese Möglichkeiten durch die Verwendung der Pakete cleveref, varioref, mathtools, hypcap und hyperref u. a. dahingehend erweitern, dass Verweise automatisch mit Zusätzen wie „Abbildung“ und „auf der nächsten Seite“ versehen und in der PDF anklickbar werden.

Umfrage

Bevor wir in die Beispiele einsteigen, kurz zu den Ergebnissen der inzwischen geschlossenen Umfrage aus dem letzten Monat: Leider haben insgesamt nur vier Personen teilgenommen, von denen drei sich gewünscht haben das Beispiele beider Arten vorkommen, also so wie bisher auch. Der vierte Teilnehmer wünschte sich nur konkrete Beispiele. Obwohl die statistische Relevanz dieser Umfrage eher begrenzt ist, werde ich gern dem Wunsch der Mehrheit entsprechen und auch in Zukunft versuchen Beispiele mit wechselnden Inhalten und Schwierigkeitsgraden darzustellen. Auch wenn die Umfrage geschlossen ist, freue ich mich natürlich nach wie vor über Feedback (E-Mail).

Außerdem gab es zwei Themenwünsche: „Schnittmarken“ und „Schreibschriften“. Dem ersten Wunsch werde ich schon recht bald nachkommen, der zweite ist notiert ich kann aber noch nicht sagen, wann ich dieses Thema unterbringen werde.

Einleitung

Bei vielen (umfangreicheren) Dokumenten entsteht schnell die Notwendigkeit, innerhalb desselben Verweise zu erzeugen, um bspw. auf Abbildungen oder Tabellen Bezug zu nehmen. Gibt man Verweise wie „siehe Abb. 5.1 auf der nächsten Seite“ von Hand ein, läuft man schnell Gefahr, dass solche Angaben durch Änderungen, Ergänzungen oder Streichungen im Dokument nicht mehr aktuell sind. Glücklicherweise bietet uns einen Mechanismus, um dem vorzubeugen.

Dazu ist es erforderlich, das Ziel eines Verweises mit dem Befehl \label{ziel} zu definieren. Mit \ref{ziel} kann man dann darauf Bezug nehmen und kümmert sich automatisch darum, die jeweils korrekte Verweisnummer einzufügen. Allerdings ist es erforderlich, das Dokument mindestens zwei Mal zu kompilieren, um die richtigen Verweise zu erhalten. Probleme mit fehlenden oder doppelt vorhandenen und damit uneindeutigen Lables (also Verweiszielen) werden in der .log-Datei vermerkt. Ein Verweis auf ein fehlendes Label erscheint in der PDF als doppeltes Fragezeichen, wogegen ein uneindeutiger Verweis in der PDF nicht besonders markiert wird.

Für die Benennung der Labels sollte man sich an folgende Regel halten: Der Name sollte nur aus Buchstaben, Zahlen und - bestehen. Insbesondere sollte man Umlaute, das Eszett, andere Sonderzeichen und Leerzeichen vermeiden. Nicht notwendig, aber sinnvoll ist es, jeden Namen mit einem Präfix zu versehen, um einen Überblick zu behalten, zu welcher Art Objekt ein Label gehört, also bspw. \label{fig:mona-lisa} anstelle von \label{mona-lisa} für eine Abbildung oder \label{eq:normalverteilung} für eine Gleichung. Es ist üblich – aber natürlich nicht zwingend –, den Präfix mit einem Doppelpunkt abzutrennen. Darüberhinaus sollte man für die Verweisnamen tunlichst nicht die Nummer verwenden, die das Objekt (gerade) hat, denn diese kann sich schließlich ändern und spätestens dann kann keiner mehr den Überblick behalten, welches Label zu welchem Objekt gehört: also \label{sec:einleitung} statt \label{sec:abschnitt1}.

Wichtig ist noch, dass das \label immer gesetzt wird, nachdem die entsprechende Nummer generiert wurde, also (unmittelbar) nach \section, \caption etc.

Standardfunktionen (standard.tex)

Im ersten Beispiel schauen wir uns jetzt die Möglichkeiten, die von Haus aus mitbringt, an.

Wie immer laden wir zunächst die Klasse (FAQ 2) und die üblichen Pakete zur Kodierung (FAQ 3) Schrift (FAQ 4) und Spracheinstellung (FAQ 5).

\documentclass[
   fontsize = 12pt,
   ngerman,
]{scrreprt}
 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{babel}

Außerdem laden wir lipsum, um Blindtext erzeugen zu können.

\usepackage{lipsum}
\begin{document}
 
\section{Abschnitt mit Verweisen}

Um auf ein Objekt zu Verweisen nutzen wir \ref oder \pageref, wenn wir die Seitenzahl auf der das Ziel sich befindet ausgeben wollen. Dabei nutzen wir ~ (Tilde), um ein geschütztes Leerzeichen einzufügen. Das verhindert, dass die Nummer am Zeilenende von der Bezeichnung getrennt wird.

Siehe dazu Formel~(\ref{eq:abc}) in Abschnitt~\ref{sec:blindtext}.
 
Wichtige Informationen stehen auf Seite~\pageref{p:besondere-seite}
(gehört zu Abschnitt~\ref{p:besondere-seite}).
 
Besonders zu Beachten ist Abbildung~\ref{fig:rechteck}.

Blindtext

\lipsum

Diesen Abschnitt definieren wir mit \label als Ziel (auf das wir oben bereits verwiesen haben).

\section{Bildtext und Formeln}\label{sec:blindtext}

Blindtext

\lipsum[2]

Für den Verweis auf eine Gleichung setzten wir das Label unmittelbar nach Beginn der Umgebung, so ist es auch im Code schnell zu sehen.

\begin{equation}\label{eq:abc}
   a = b + c
\end{equation}

Blindtext

\lipsum[3-4]

Um auf eine Seite (bzw. eine Textstelle) zu verweisen, setzten wir das Label mitten im Text. (\ref ergibt in diesem Fall die Abschnittsnummer.)

Auf diese Seite\label{p:besondere-seite} soll später verwiesen werden.

Blindtext

\lipsum[5-14]

Das Label für ein Gleitobjekt (hier eine Abbildung) setzten wir nach \caption.

\begin{figure}[hb!]
   \centering
   \rule{10cm}{4cm}
   \caption{Ein schwarzes Rechteck}
   \label{fig:rechteck}
\end{figure}

Blindtext

\lipsum
\end{document}

Verweise mit Links (klickbare-links.tex)

Als nächstes wollen wir uns anschauen, was wir tun müssen, damit die Verweise in der PDF anklickbar werden: Dazu laden wir das Paket hyperref und das war’s dann auch schon.

Der damit erzeugte Link auf eine Abbildung springt allerdings immer zur Beschriftung, die i. d. R. unter dem Bild steht, und nicht auf die Abbildung selbst, dieses Problem löst hypcap für uns. Da bei Tabellen die Beschriftung in der Regel darüber steht, ensteht dieses Problem hier nicht.

\documentclass[ngerman]{scrartcl}
 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{babel}
\usepackage{lipsum}

Jetzt laden wir das Paket hyperref, das bis auf wenige Ausnahmen immer als letztes geladen werden sollte.

\usepackage{hyperref}

Standardmäßig erzeugt hyperref um alle Links einen dünnen Rahmen (der nicht in allen PDF-Betrachtern und nie im Ausdruck sichtbar ist). Um diesen Rahmen zu unterdrücken, können wir die Option hidelinks benutzten. Wenn die Links stattdessen komplett farbig (auch im Ausdruck) sein sollen, nutzt man colorlinks. (Wie man die Farben ändert führt an dieser Stelle zu weit, steht aber in der Paketdokumentation.)

\hypersetup{
   colorlinks,
%   hidelinks,
}
 

hypcap ist eine der genannten Ausnahmen und muss nach hyperref geladen werden. Mit der Option figure legen wir fest, dass die Gleitumgebung {figure} so umdefiniert wird, dass der Verweis auf ihren Anfang springt.

\usepackage[figure]{hypcap}
\begin{document}

Wenn wir jetzt \ref benutzen, wird automatisch ein Link in der PDF erzeugt.

Interner Link: Abbildung~\ref{fig:rechteck}

Mit dem Paket ist es – neben vielen weiteren praktischen Funktionen, wie etwa PDF-Bookmarks – auch möglich Verweise auf Internetseiten zu setzen.

Externer Link: \href{http://tobiw.de}{Meine Seite}
 
URL: \url{http://tobiw.de}
\lipsum[1-14]
 
\begin{figure}[hb!]
   \centering
   \rule{10cm}{4cm}
   \caption{Ein schwarzes Rechteck}
   \label{fig:rechteck}
\end{figure}
 
\lipsum[1-14]
 
\end{document}

Verweise auf Formeln (formeln.tex)

Als Nächstes wollen wir die Verweise auf Formeln optimieren, um die üblichen Klammern um die Formelnummer nicht jedesmal von Hand tippen zu müssen. Dafür nutzen wir anstelle von \ref den Befehl \eqref aus dem Paket amsmath. Außerdem wollen wir, das nur die Formeln eine Nummer bekommen, auf die tatsächlich verwiesen wird, wofür wir eine Funktion von mathtools nutzen werden.

\documentclass[ngerman]{scrartcl}
 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{babel}
\usepackage{lipsum}

Neben den bereits bekannten Paketen laden wir mathtools, das intern amsmath mit lädt.

\usepackage{mathtools}% lädt amsmath

Mit dem Befehl \mathtoolsset setzten wir die Option showonlyrefs. Dadurch werden wie gewünscht nur die Gleichungen nummeriert, auf die auch verwiesen wird. (Damit das funktioniert, muss das Dokument mehrfach kompiliert werden.)

\mathtoolsset{showonlyrefs}

Der Rest des Beispiel-Codes ist relativ selbsterklärend: Wir verwenden nun konsequent \eqref, um auf Formeln zu verweisen.

Wichtig ist noch, dass das Label in Gleichungsumgebungen mit mehreren Zeilen am besten am Ende der jeweiligen Zeile gesetzt wird, um sicher zu stellen, dass es auch auf die richtige Zeile verweist.

\begin{document}
 
Siehe dazu Formel~\eqref{eq:def} unter Beachtung von
Gleichung~\eqref{eq:e} und \eqref{eq:f}.
 
\lipsum[1]
\begin{equation}\label{eq:abc}
   a = b + c
\end{equation}
\lipsum[3]
\begin{equation}\label{eq:def}
   d = e - f
\end{equation}
\lipsum[3]
\begin{align}
   e &= b^2 \label{eq:e}\\
   f &= \sqrt{c} \label{eq:f}
\end{align}
 
 
\end{document}
 

Automatische Bezeichnung (art-automatik.tex)

Nun suchen wir eine Möglichkeit, auch die Arbeit vor jeden Verweis die nötige Bezeichnung – z. B. „Abbildung“ – zu schreiben an abzugeben und finden diese Funktion im Paket cleveref.

Anstelle von \ref werden wir nun \cref verwenden. Außerdem gibt es noch den Befehl \Cref (mit großem C), der die Bezeichnung mit einem Großbuchstaben ausgibt (was im Deutschen auch bei \cref der Fall ist) und generell nicht die abgekürzter Form – z. B. „Abb.“ – benutzt. \pageref ersetzen wir durch \cpageref

\documentclass[ngerman]{scrartcl}
 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{babel}
\usepackage{lipsum}

Zusätzlich laden wir hyperref und lernen eine weitere Ausnahme: hyperref muss vor cleveref geladen werden!

\usepackage[colorlinks]{hyperref}

Das Paket laden wir mit den Optionen noabbrev, um alle Abkürzungen auszuschalten, sowie nameinlink, womit auch der Bezeichner Teil des hyperref-Links wird und nicht nur die Nummer.

\usepackage[
   noabbrev,
   nameinlink,
]{cleveref}

Leider ist cleveref nicht mit der showonlyrefs-Funktion von mathtools kompatibel. Abhilfe verspricht eigentlich das Paket autonum, das aber im Moment auch nicht korrekt arbeiten. (Ich habe den Autor bereits angeschrieben und werde hier über Updates berichten.)

%\usepackage{autonum}

Das Restdokument ist wieder ganz ähnlich. Wir sehen nun aber noch eine weitere praktische Funktion, die \cref im Gegensatz zu \ref bietet: Wir können eine kommagetrennte Liste von Labels angeben, die automatisch ausgewertet und korrekt ausgegeben wird. Die Reihenfolge in der die Labels dabei angegeben werden ist unerheblich, sie werden für die Ausgabe immer aufsteigend sortiert und ggf. zusammengefasst.

\begin{document}
 
\section{Abschnitt mit Verweisen}
 
Siehe dazu \cref{eq:abc,eq:b,eq:c} in \cref{sec:blindtext}.
 
Wichtige Informationen stehen auf \cpageref{p:besondere-seite}
(gehört zu \cref{p:besondere-seite}).
 
Besonders zu Beachten ist \cref{fig:rechteck}.
 
\lipsum
 
\section{Bildtext und Formeln}\label{sec:blindtext}
 
\lipsum[2]
 
\begin{equation}
   a = b + c \label{eq:abc}
\end{equation}
\begin{equation}
   b = \sin(x^2) \label{eq:b}
\end{equation}
\begin{equation}
   c = \cos(2x) \label{eq:c}
\end{equation}
\begin{equation}
   c = \cos(2x) \label{eq:d}
\end{equation}
 
\lipsum[3-4]
 
Auf diese Seite\label{p:besondere-seite} soll später verwiesen werden.
 
\lipsum[5-14]
 
\begin{figure}[hb!]
   \centering
   \rule{10cm}{4cm}
   \caption{Ein schwarzes Rechteck}
   \label{fig:rechteck}
\end{figure}
 
\lipsum
 
\end{document}

Verweis inkl. Seitenangabe (seiten-automatik.tex)

Im vorletzten Beispiel verwenden wir das Paket varioref, das zu der Verweisnummer automatisch die Angabe einer Seite hinzufügt. Dabei ist das Paket so intelligent, dass nicht immer „auf Seite X“ sondern je nach Verhältnis der Seitenzahl von Verweis und Ziel auch „auf der nächsten Seite“, „auf der gegenüberliegenden Seite“ o. ä. ausgeben wird. Liegen Ziel und Verweis auf derselben Seite, entfällt die Angabe automatisch. (Für die dafür nötigen Auswertungen muss mehrfach kompiliert werden.)

Anstelle von \ref verwenden wir nun \vref und \pagref ersetzen wir durch \vpageref.

\documentclass[ngerman]{scrartcl}
 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{babel}
\usepackage{lipsum}

Das Paket laden wir ohne Optionen (vor hyperref).

\usepackage{varioref}
\usepackage[colorlinks]{hyperref}

Auch hier ist der Code im Wesentlich wie bei den anderen Beispielen. Im Gegensatz zu \cref kann \vref aber keine Mehrfachangaben auswerten. Eine Ähnliche aber nicht ganz so intelligente Funktion bietet \vrefrange.

\begin{document}
 
\section{Abschnitt mit Verweisen}
 
Siehe dazu Formel~\vrefrange{eq:abc}{eq:cde} in Abschnitt~\vref{sec:blindtext}.
 
Wichtige Informationen stehen \vpageref{p:besondere-seite}
(gehört zu Abschnitt~\vref{p:besondere-seite}).
 
Besonders zu Beachten ist Abbildung~\vref{fig:rechteck}.
 
\lipsum
 
\section{Bildtext und Formeln}\label{sec:blindtext}
 
\lipsum[2]
 
\begin{equation}
   a = b + c \label{eq:abc}
\end{equation}
\begin{equation}
   b = c \cdot d
\end{equation}
\begin{equation}
   c = d - e \label{eq:cde}
\end{equation}
 
\lipsum[3-4]
 
Auf diese Seite\label{p:besondere-seite} soll später verwiesen werden.
 
\lipsum[5-14]
 
\begin{figure}[hb!]
   \centering
   \rule{10cm}{4cm}
   \caption{Ein schwarzes Rechteck}
   \label{fig:rechteck}
\end{figure}
 
\lipsum
 
\end{document}

Mit der Verwendung von varioref ergeben sich die folgenden Seitenangaben, wobei teilweise zwischen einseitig und doppelseitig angelegten Dokumenten unterschieden wird.

Verweis
auf Seite
Ziel
auf Seite
einseitiges Dokument doppelseitiges Dokument
10 10 X dito
10 9 X auf der vorherigen Seite dito
11 10 X auf der vorherigen Seite X auf der gegenüberliegenden Seite
10 11 X auf der nächsten Seite X auf der gegenüberliegenden Seite
11 12 X auf der nächsten Seite dito
10 15 X auf Seite 15 dito

Automatische Bezeichnung und Seitenangabe (vollautomatik.tex)

Als Letztes wollen wir noch die Funktionen von cleveref, varioref und hyperref kombinieren. Damit steht uns der Befehl \cref zur Verfügung, der sich nach wie vor wie oben kennen gelernt verhält, aber \vref wird so umdefiniert, dass er sich wie \cref ergänzt um die Seitenangabe verhält.

\documentclass[ngerman]{scrartcl}
 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{babel}
\usepackage{lipsum}

Beim Laden der drei Pakete müssen wir die hier gezeigte Reihenfolge unbedingt einhalten, damit alles korrekt funktioniert.

\usepackage{varioref}
\usepackage[colorlinks]{hyperref}
\usepackage[noabbrev,nameinlink]{cleveref}

Und ein letztes Mal ein ganz ähnliches Dokument. Wir können hier die Ergebnisse von \cref und \vref vergleichen. Außerdem sehen wir, dass dank der Kombination mit cleveref nun auch \vref die Angabe mehrerer Labels unterstützt.

\begin{document}
 
\section{Verweise nur mit Bezeichner}
 
Siehe dazu \cref{eq:abc,eq:bcd,eq:cde} in \cref{sec:blindtext}.
 
Wichtige Informationen stehen auf \cpageref{p:besondere-seite}
(gehört zu \cref{p:besondere-seite}).
 
Besonders zu Beachten ist \cref{fig:rechteck}.
 
\section{Verweise mit Bezeichner und Seitenverweis}
 
Siehe dazu \vref{eq:abc,eq:bcd,eq:cde} in \vref{sec:blindtext}.
(gehört zu \vref{p:besondere-seite}).
 
Besonders zu Beachten ist \vref{fig:rechteck}.
 
\lipsum
 
\section{Bildtext und Formeln}\label{sec:blindtext}
 
\lipsum[2]
 
\begin{equation}
   a = b + c \label{eq:abc}
\end{equation}
\begin{equation}
   b = c \cdot d \label{eq:bcd}
\end{equation}
\begin{equation}
   c = d - e \label{eq:cde}
\end{equation}
 
\lipsum[3-4]
 
Auf diese Seite\label{p:besondere-seite} soll später verwiesen werden.
 
\lipsum[5-14]
 
\begin{figure}[hb!]
   \centering
   \rule{10cm}{4cm}
   \caption{Ein schwarzes Rechteck}
   \label{fig:rechteck}
\end{figure}
 
\lipsum
 
\end{document}

Hinweis zum Zusammenspiel von cleveref und varioref

Im Grunde funktionieren die beiden Pakete gut zusammen. Leider gibt es in cleveref derzeit aber einen kleinen Fehler, der dafür sorgt, dass varioref Seitenverweise auf die vorherige Seite nicht korrekt erkennt und stattdessen die Seitenzahl ausgibt. Um das Problem zu beheben, muss man das Paket etoolbox laden und einen Patch durchführen. Dazu einfach den folgenden Code in die Präambel einfügen, nachdem cleveref und varioref geladen wurden.

In vollautomatik.tex ist dieser Patch bereits enthalten.

\usepackage{etoolbox}
\makeatletter
   \patchcmd\cref@old@@vpageref
      {\advance\@tempcnta-2}
      {\advance\@tempcnta-2 }{\typeout{patch ok}}{\ERRORpatchFaild}
\makeatother

Details dazu findet man bspw. auf TeX.SX bei der Frage „Varioref and previous page“.