Hallo TeXWelt!

Mir ist ein komischer Bug im Zusammenspiel von varioref und cleveref aufgefallen. Ich würde gerne in den Anhang mit varioref's \vref verweisen. Jedoch habe ich die Anpassung von Schlosser bzgl. "ab Seite"/"auf Seite" übernommen und mit dieser hat er Probleme, wenn man in den Anhang verweist.

Open in writeLaTeX
%%%Cleveref & Varioref ab Seite statt auf Seite setzen
\makeatletter
\def\curtlabtype{}%                 << define temporary variable
\let\@old@cref@vref\cref@vref%      << save cleveref's definition
\def\cref@vref#1#2{%                << modify cleveref's definition
  \cref@gettype{#2}{\curtlabtype}%  << get type of label
  \@old@cref@vref{#1}{#2}}%         << call original macro
\vref@addto\extrasngerman{%         << modify varioref macros
  \def\reftextfaraway#1{%           << only change far away references
    \ifthenelse{\equal{\curtlabtype}{chapter}}{ab Seite}{auf Seite}~\pageref{#1}}}%
\makeatother

Ich konnte den Fehler auf die Zeile

Open in writeLaTeX
\cref@gettype{#2}{\curtlabtype}%

eingrenzen. Kommentiert man diese Zeile aus, dann läuft es durch, natürlich ohne ab/auf Seite Anpassung. Die Fehlermeldung ist

Open in writeLaTeX
Argument of \@firstoftwo has an extra }. <inserted text> \par l.41 ...pt1}. Und hier in den Appendix \vref{test} .

Nachdem ich in die jeweiligen Dokus und .sty Files geschaut habe und kein offensichtlichen Fehler entdecken kann, komme ich nun nicht mehr weiter.

Hat jemand von euch eine Idee? Danke! :)

Hier das Minimalbeispiel:

Open in writeLaTeX
\documentclass[
paper=a4,
fontsize=12pt,
]{scrreprt}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}

\usepackage{blindtext}
\usepackage[demo]{graphicx}

\usepackage[ngerman]{varioref}
%\usepackage{hyperref}
\usepackage[ngerman]{cleveref}

\usepackage{ifthen}
%%%Cleveref & Varioref ab Seite statt auf Seite setzen
\makeatletter
\def\curtlabtype{}%                 << define temporary variable
\let\@old@cref@vref\cref@vref%      << save cleveref's definition
\def\cref@vref#1#2{%                << modify cleveref's definition
  \cref@gettype{#2}{\curtlabtype}%  << get type of label, hier entsteht der Fehler
  \@old@cref@vref{#1}{#2}}%         << call original macro
\vref@addto\extrasngerman{%         << modify varioref macros
  \def\reftextfaraway#1{%           << only change far away references
    \ifthenelse{\equal{\curtlabtype}{chapter}}{ab Seite}{auf Seite}~\pageref{#1}}}%
\makeatother

\begin{document}

\chapter{Chap 1}
\label{chapt1}
\Blindtext[5]

\chapter{Chap 2}
\label{chapt2}
Ein Test auf \vref{chapt1}. Und hier in den Appendix \vref{test}.
\Blindtext

\appendix
\chapter{Chap A}
\begin{figure}[h]%
\includegraphics[width=0.5\textwidth]{}
\caption{test caption}
\label{test}
\end{figure}

\end{document}

gefragt 02 Jul '14, 06:41

maphy-psd's gravatar image

maphy-psd
316213
Akzeptiert: 71%

bearbeitet 20 Aug '14, 14:19

Clemens's gravatar image

Clemens
19.0k112960

1

Ich bekomme weder mit einem aktuellen MiKTeX 2.9 noch mit einem aktuellen TeXLive 2014 Fehlermeldungen mit dem Code.

Allerdings funktioniert die Umschaltung auf "ab Seite" für den Anhang nicht, wenn ich das Label auf die Überschrift des Anhanges A verweisen lasse. Es erscheint dann immer nach "auf Seite". Im Anhang ist der entsprechende \curtlabtype vermutlich appendix und nicht chapter.

(02 Jul '14, 09:59) esdd

Mir fällt grad auf, dass er beim ersten Lauf den Fehler anzeigt, beim zweiten Lauf läuft alles sauber durch. Die Unterscheidung nach ab/auf Seite funktioniert auch. Das Problem besteht nun eigentlich darin, dass ich in meiner Arbeit tikzexternalize aktiviert habe und durch den Fehler im 1. Lauf die Bilder nicht erstellt werden.

(02 Jul '14, 13:35) maphy-psd

Ich (akt. TL2014) bekomme beim ersten Kompilieren für jedes neue Label den Fehler, beim zweiten Durchlauf geht es. Für Label für \chapter im Anhang kann ich das falsche Verhalten, das @esdd erwähnt, bestätigen.

(02 Jul '14, 13:54) Clemens

Für Labels chapter erhalte ich ebenfalls keine Unterscheidung, für das Bild schon. Habe ebenfalls TL2014.

(02 Jul '14, 14:13) maphy-psd

Das ist kein Bug von cleveref oder varioref, sondern ein Fehler im Code, den Du zitierst. Zum einen funktioniert \cref@gettype nur, wenn das gesuchte Label existiert, also in der aux-Datei vorhanden ist. Der Code testet das aber nicht, daher beim ersten Lauf der Fehler. Zum anderen ändert sich nach \appendix der cref-Typ des \chapter-Zählers von chapter auf appendix, was der Code nicht abfragt.

Ich schlage daher zwei (oder eigentlich drei...) Änderungen an der Definition vor:

  1. Testen, ob das entsprechende Label existiert, und \cref@gettype nur aufrufen, wenn es das tut. Das vermeidet die Fehlermeldung.
  2. In \reftextfaraway nicht nur auf chapter sondern auch auf appendix testen, damit ab Seite auch nach dem Aufruf von \appendix funktioniert.
  3. Statt \def \newcommand bzw. \renewcommand verwenden. Das ist zwar eher Kosmetik, entspricht aber der empfohlenen LaTeX-Syntax.

Um die Tests bequem zu machen, lade ich etoolbox statt ifthen. Dann teste ich mit

Open in writeLaTeX
\ifcsdef{r@<labelname>}{<wahr>}{<falsch>}

ob das Label existiert. Allerdings könnte das zu Problemen führen, wenn man vor dieser Verwendung von vref ein normales ref aufruft, da letzteres das Makro \r@<label> als \relax zurücklässt, wenn das Label nicht definiert ist und \relax für \ifdef bzw \ifcsdef eine zulässige Definition ist. Du verwendest sowieso schon eine KOMA-Script-Klasse, also kannst Du bequemerweise statt dessen auf

Open in writeLaTeX
\ifundefinedorrelax{r@<labelname>}{<wahr>}{<falsch>} % oder
\scr@ifundefinedorrelax{r@<labelname>}{<wahr>}{<falsch>}

zurückgreifen. Beide werden vom Paket scrbase zur Verfügung gestellt und würden damit auch Anwendern anderer Klassen zur Verfügung stehen. (Die Definition von \ifundefinedorrelax könnte grundsätzlich durch eine KOMA-Option verhindert werden, dann stünde aber immer noch \scr@ifundefinedorrelax zur Verfügung.)

Statt \ifthenelse{\equal{\curtlabtype}{<string>}{<wahr>}{<falsch>} verwende ich etoolbox'

Open in writeLaTeX
\ifdefstring{\curtlabtype}{<string>}{<wahr>}{<falsch>}

Damit ich auf chapter und appendix in einem Schritt testen kann, verwende ich außerdem etoolbox' \ifboolexpr{ <tests> }{<wahr>}{<falsch>}:

Open in writeLaTeX
\ifboolexpr
  {
    test {\ifdefstring{\curtlabtype}{chapter}} or
    test {\ifdefstring{\curtlabtype}{appendix}}
  }
  {ab Seite}
  {auf Seite}%

Damit erhalte ich:

alt text

für folgenden Beispielcode:

Open in writeLaTeX
\documentclass[
paper=a4,
fontsize=12pt,
]{scrreprt}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}

\usepackage{blindtext}
\usepackage[demo]{graphicx}

\usepackage[ngerman]{varioref}
%\usepackage{hyperref}
\usepackage[ngerman]{cleveref}

\usepackage{etoolbox}
% Cleveref & Varioref:
%   für Kapitel `ab Seite' statt `auf Seite' setzen
\makeatletter
\newcommand*\curtlabtype{}
\let\@old@cref@vref\cref@vref
\renewcommand*\cref@vref[2]{%
  \scr@ifundefinedorrelax{r@#2}% teste, ob Label `#2' definiert ist
    {}
    {\cref@gettype{#2}{\curtlabtype}}%
  \@old@cref@vref{#1}{#2}%
}
\vref@addto\extrasngerman{%
  \renewcommand*\reftextfaraway[1]{%
    \ifboolexpr
      {
        test {\ifdefstring{\curtlabtype}{chapter}} or
        test {\ifdefstring{\curtlabtype}{appendix}}
      }
      {ab Seite}
      {auf Seite}%
    ~\pageref{#1}}%
}
\makeatother

\begin{document}

\chapter{Chap 1}
\label{chapt1}
\Blindtext[5]

\chapter{Chap 2}
\label{chapt2}
Ein Test auf \vref{chapt1}. Und hier in den Appendix \vref{test}. Hier auf \vref{chapA}.
\Blindtext

\appendix
\chapter{Chap A}\label{chapA}
\begin{figure}[h]%
\includegraphics[width=0.5\textwidth]{}
\caption{test caption}
\label{test}
\end{figure}

\end{document}
Permanenter link

beantwortet 02 Jul '14, 14:17

Clemens's gravatar image

Clemens
19.0k112960

bearbeitet 29 Jul '14, 08:21

Klappt wunderbar! Die tikzexternalize funktioniert nun ebenfalls. Vielen Dank!

Edit: "Bug"-Report an Schlosser gerade abgeschickt.

(02 Jul '14, 14:30) maphy-psd

@maphy-psd Keine Ursache :) Mal sehen, ob Joachim seinen Blogpost anpasst.

(02 Jul '14, 16:03) Clemens

Er will es korrigieren. ;-)

(03 Jul '14, 04:31) maphy-psd
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×25
×7
×2
×2

Frage gestellt: 02 Jul '14, 06:41

Frage wurde angeschaut: 2,465 Mal

Zuletzt aktualisiert: 20 Aug '14, 14:19