PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mathtools "showonlyrefs" mit autoref kompatibel machen



AureusPhoenix
14-10-2016, 10:36
Hallo alle Zusammen,
ich hoffe ihr könnt mir helfen. Folgendes Problem: Ich benutze in meinem gesamten Dokument \autoref{} zum referenzieren von allen möglichen Dingen und möchte das gerne auch so beibehalten. Nun möchte ich aber auch gerne die "showonlyrefs" Option aus Mathtools benutzen. Da gibt es nur ein Problem: Mathtools sucht nach \eqref{} Aufrufen. Logischerweise entfernt er dann einfach mal all meine Formel-Nummerierungen weil das nirgends findet. Hat jemand ne Idee, wie man das kompatibel machen könnte.

Autoref arbeitet ja sicher intern auch irgendwo mit \ref{}. Vielleicht kann man das umdefinieren. Mir fehlt nur der tiefere Einblick in Hyperref. Und selbst wenn man es nicht umdefinieren kann. Vielleicht kann man zumindest ein zusätzliches \eqref{} einbauen welches nicht ausgegeben wird, also nur dafür da ist, dass mathtools es finden kann.

Vielen Dank im Voraus!
Grüße!

klops
14-10-2016, 13:06
Ein vollständiges Minimalbeispiel (http://www.mrunix.de/forums/showthread.php?t=66921), um das Problem zu zeigen und uns etwas zum Testen in die Hand zu geben, wäre schön gewesen …


\documentclass{article}

\usepackage{mathtools}
\mathtoolsset{showonlyrefs}
\usepackage{hyperref}
\usepackage{xpatch}
\makeatletter
\xpretocmd\HyRef@autoref{\noeqref{#2}}{}{}% kleiner Hack
\makeatother

\begin{document}
\section{Test}\label{sec:ok}
\begin{equation}
\label{eq:a}
x=y
\end{equation}

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

See \autoref{eq:a} and \eqref{eq:b} in \autoref{sec:ok}.
\end{document}
\noeqref ist in der mathtools-Anleitung dokumentiert. \HyRef@autoref ist eine interne Anweisung von hyperref, die man aber braucht, um an das Argument von \autoref heran zu kommen.

AureusPhoenix
14-10-2016, 13:40
Hi klops, erstmal vielen herzlichen Dank für die Hilfe! Funktioniert ausgezeichnet.
Das mit dem Minimalbeispiel mach ich schon für gewöhnlich. Hier wusste ich aber nicht so recht was ich hätte da rein schreiben sollen, da ich ja noch gar keinen richtigen Ansatz für eine Lösung hatte.

Grüße.

klops
14-10-2016, 13:42
Wie gesagt: Ein *Beispiel, das das Problem zeigt, hätte genügt.

AureusPhoenix
29-10-2016, 00:07
Hallo Zusammen, ich muss mich leider nochmal melden. Der kleine Hack generiert ein klitzekleines Problem. Leider war ich nicht in der Lage es zu beheben.
Und zwar scheint \noeqref{} einen zusätzlichen horizontalen Abstand zu generieren. In den meisten fällen bemerkt man das gar nicht. Rutscht die Ausgabe von \autoref aber zufällig auf eine neue Zeile, dann ist es ziemlich offensichtlich. Einfach mal die vorletzte Code-Zeile im obigen Minimalbeispiel durch


\noindent See \autoref{eq:a} and \eqref{eq:b} in\\
\autoref{sec:ok}.

ersetzen. Ich hatte zunächst versucht zur Kompensation einen negativen Abstand hinter \noeqref{} einzufügen aber auch das macht bei mir an einigen Stellen Probleme. Gibt es vielleicht so etwas wie \vphantom{} was aber die Funktionalität von \noeqref{} intakt lässt?

klops
29-10-2016, 11:18
Stimmt. \noeqref fügt offenbar ein Leerzeichen ein. Lässt sich einfach beseitigen:
\documentclass{article}

\usepackage{mathtools}
\mathtoolsset{showonlyrefs}
\usepackage{hyperref}
\usepackage{xpatch}
\makeatletter
\xpretocmd\HyRef@autoref{\noeqref{#2}\unskip}{}{}% kleiner Hack
\makeatother

\begin{document}
\section{Test}\label{sec:ok}
\begin{equation}
\label{eq:a}
x=y
\end{equation}

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

See \autoref{eq:a} and \eqref{eq:b} in \autoref{sec:ok}.

\noindent See \autoref{eq:a} and \eqref{eq:b} in\\%
\autoref{sec:ok}.
\end{document}
Ob das Einfügen des Leerzeichens wirklich beabsichtigt ist, wage ich zu bezweifeln. Ich vermute eher, dass ein Bug in mathtools ist. Da fehlt eventuell in der Definition von \noeqref ein % am Ende der vorletzten Zeile von:

\newcommand\noeqref[1]{\@bsphack
\@for\@tempa:=#1\do{%
\@safe@activestrue%
\edef\@tempa{\expandafter\@firstofone\@tempa}%
\@ifundefined{r@\@tempa}{%
\protect\G@refundefinedtrue%
\@latex@warning{Reference `\@tempa' on page \thepage \space
undefined (\string\noeqref)}%
}{}%
\if@filesw\protected@write\@auxout{}%
{\string\MT@newlabel{\@tempa}}\fi%
\@safe@activesfalse}
\@esphack}
Dagegen sind drei der anderen % schlicht überflüssig (nach \@safe@activetrue, \G@refundefinedtrue und nach \fi). Vielleicht solltest Du Lars Madsen mal darauf aufmerksam machen.

Das \unskip in meinem Beispiel stört übrigens auch nicht, falls das in mathtools irgendwann einmal korrigiert werden sollte.

AureusPhoenix
29-10-2016, 22:27
Hey, super, vielen Dank!
Ich hab mir mal auf die ToDo-List geschrieben Lars Madsen zu schreiben.