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, 12:41

maphy-psd's gravatar image

maphy-psd
37141017
Akzeptiert-Rate: 25%

bearbeitet 20 Aug '14, 20:19

cgnieder's gravatar image

cgnieder
22.1k243463

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, 15: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, 19: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, 19:54) cgnieder

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

(02 Jul '14, 20: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, 20:17

cgnieder's gravatar image

cgnieder
22.1k243463
Akzeptiert-Rate: 60%

bearbeitet 29 Jul '14, 14:21

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

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

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

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

(02 Jul '14, 22:03) cgnieder

Er will es korrigieren. ;-)

(03 Jul '14, 10:31) maphy-psd
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

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ügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×28
×13
×5
×2

gestellte Frage: 02 Jul '14, 12:41

Frage wurde gesehen: 11,304 Mal

zuletzt geändert: 20 Aug '14, 20:19