Seite 1 von 2

Referenzieren von "Gleichung (xxx)"

Verfasst: Do 16. Mai 2013, 23:42
von Dimitri
Hallo,

Weiß jemand, warum hier nicht "Gleichung (1)", d.h. die Klammer mitreferenziert wird???

LG
\documentclass{article}
\usepackage[ngerman]{babel}

\usepackage{amsmath}
\usepackage{hyperref}

\makeatletter
\@ifdefinable\equationname{%
\let\equationname\equationautorefname
}
\def\equationautorefname~#1\@empty\@empty\null{%
\equationname~(#1\@empty\@empty\null)%
}%
\makeatother

\begin{document}

\begin{align}
\label{eq:test}
  a=b
\end{align}
\autoref{eq:test}

\end{document}

Verfasst: Sa 18. Mai 2013, 12:53
von Noch so einer
\equationrefname erwartet bei der Verwendung in hyperref kein Argument. Konkret wird es beispielsweise so verwendet:
\def\HyPsd@@autorefname#1.#2\@nil{%
  \ltx@IfUndefined{#1autorefname}{%
    \ltx@IfUndefined{#1name}{%
    }{%
      \csname#1name\endcsname\space
    }%
  }{%
    \csname#1autorefname\endcsname\space
  }%
}
Wenn Du es nun als Befehl mit Argument neu definierst, wird an der Stelle \space zum Argument. Es würde aber auch nichts nützen, wenn Du es jetzt einfach mit zwei Argumenten definierst, weil das dann wiederum nicht zur Verwendung von \HyPsd@@autorefname in \HyPdf@autorefname passt.

Erschwerend kommt hinzu, dass Deine Definition \begin{document} nicht überlebt, weil Du entweder babel oder die Zusammenarbeit von hyperref mit babel verstanden hast.

Die Frage ist also eigentlich eher: Wie kommst Du darauf, dass das funktionieren sollte? Es kann schlicht gar nicht funktionieren! Du solltest mit der Quelle der Informationen für diesen Code daher eher kritisch umgehen..

Nun könnte man natürlich mit Interna von hyperref rummurksen, bis es endlich klappt. Ich würde aber stattdessen analog zu \eqref ein \autoeqref definieren und am besten auch gleich \eqref selbst umdefinieren, so dass die Klammern ebenfalls Teil des Links werden:
\documentclass{article}
\usepackage[ngerman]{babel}

\usepackage{amsmath}
\usepackage{hyperref}

\makeatletter
\renewcommand*{\eqref}{%
  \@ifstar {\@@eqref}{\@eqref}%
}
\newcommand*{\@@eqref}[1]{%
  \textup{\tagform@{\ref*{#1}}}%
}
\newcommand*{\@eqref}[1]{%
  \hyperref[#1]{\@@eqref{#1}}%
}
\newcommand*{\autoeqref}[1]{%
  \hyperref[#1]{\equationautorefname\space\@@eqref{#1}}%
}
\makeatother

\begin{document}

\begin{align}
\label{eq:test}
  a=b
\end{align}
\autoref{eq:test} vs. \autoeqref{eq:test} vs. \eqref{eq:test}
vs. \eqref*{eq:test} vs. \ref{eq:test} vs. \ref*{eq:test}.

\end{document}
vielleicht kannst Du Heiko ja überreden, dass er zumindest die Umdefinierung von \eqref direkt in hyperref einbaut. Wäre IMHO sinnvoll.

Verfasst: So 19. Mai 2013, 21:12
von Dimitri
Dann kann ich aber nicht mehr auf Textstellen verweisen oder sehe ich das falsch???
\documentclass{article}
\usepackage[ngerman]{babel}

\usepackage{amsmath}
\usepackage{hyperref}

\makeatletter
\renewcommand*{\eqref}{%
  \@ifstar {\@@eqref}{\@eqref}%
}
\newcommand*{\@@eqref}[1]{%
  \textup{\tagform@{\ref*{#1}}}%
}
\newcommand*{\@eqref}[1]{%
  \hyperref[#1]{\@@eqref{#1}}%
}
\newcommand*{\autoeqref}[1]{%
  \hyperref[#1]{\equationautorefname\space\@@eqref{#1}}%
}
\makeatother

\begin{document}

\begin{align}
\label{eq:test}
  a=b
\end{align}
\begin{itemize}
\item[•]hallo\label{ff}
\end{itemize}
\autoref{eq:test} vs. \autoeqref{eq:test} vs. \eqref{eq:test}
vs. \eqref*{eq:test} vs. \ref{eq:test} vs. \ref*{eq:test}.\\
das geht so nicht\ref{ff}
\end{document}

Verfasst: Mo 20. Mai 2013, 08:44
von Epllus
Dimitri hat geschrieben:Dann kann ich aber nicht mehr auf Textstellen verweisen oder sehe ich das falsch???
Du siehst was falsch:
\begin{itemize} 
\item[•]hallo\label{ff} 
\end{itemize} 
auf was möchtest du verweisen? Es hat gar keine Nummer.
Mit
\begin{enumerate} 
\item hallo\label{ff} 
\end{enumerate} 
funktioniert es einwandfrei.

Grüße
Epllus

PS: @ Dimitri: Bitte den Status anpassen.

Verfasst: Mo 20. Mai 2013, 09:22
von Dimitri
Danke! :-)

Verfasst: Mi 22. Mai 2013, 21:43
von Dimitri
\documentclass{article}
\usepackage[ngerman]{babel}

\usepackage{amsmath}
\usepackage{hyperref}
\usepackage[nameinlink]{cleveref}
\crefname{Bed}{Bedingung}{Bedingungen}
\crefformat{Bed}{#2Bedingung~(#1)#3}
\crefrangeformat{Bed}{Bedingung~(#3(#1)#4) und~(#5(#2)#6)}

\makeatletter
\renewcommand*{\eqref}{%
  \@ifstar {\@@eqref}{\@eqref}%
}
\newcommand*{\@@eqref}[1]{%
  \textup{\tagform@{\ref*{#1}}}%
}
\newcommand*{\@eqref}[1]{%
  \hyperref[#1]{\@@eqref{#1}}%
}
\newcommand*{\autoeqref}[1]{%
  \hyperref[#1]{\equationautorefname\space\@@eqref{#1}}%
}
\makeatother

\begin{document}

\begin{align}
c=d\label[Bed]{eq:test1}\\
a=b\label[Bed]{eq:test2}
\end{align}
hallo \cref{eq:test1,eq:test2} --> Bemerkungen (1) und (2)

\end{document}
Hallo, ich habe Mir heute das "\crefrangeformat" gebastelt. Dabei hätte ich gerne dass "Bemerkungen (1) und (2 mit Klammer referenziert wird, aber das geschieht nicht...
Ich sitze nun schon ne ganze Weile dranrum, aber ich versteh einfach nicht was ich ändern soll. :?
Kann Mir da jemand weiterhelfen.

Verfasst: Do 23. Mai 2013, 09:31
von Besserwisser
Vor allem verwendest Du noch immer den falschen Status! Warum machst Du das? (Mit dieser Frage stimmt der Status jetzt wieder, ohne dass ich ihn ändern muss).

Verfasst: Do 23. Mai 2013, 09:38
von Dimitri
Warum?

Ich habe doch "Rückfrage" eingegeben und das von Mir war doch ne Rückfrage...

Verfasst: Do 23. Mai 2013, 11:08
von Besserwisser
Nein, das war von Dir keine Rückfrage, sondern eine weitere oder eine Ergänzungsfrage. Oder bist Du etwa ein potentieller Beantworter? Wenn Du schon so von kostenlos verfügbaren Informationen schwärmst, solltest Du sie auch nutzen! Warum schaust Du Dir nicht endlich die Erklärung zum Status an?

Verfasst: Do 23. Mai 2013, 11:30
von u_fischer
Hallo, ich habe Mir heute das "\crefrangeformat" gebastelt. Dabei hätte ich gerne dass "Bemerkungen (1) und (2 mit Klammer referenziert wird, aber das geschieht nicht...
Weil du gar kein Range benutzt. Dafür gibt es den \crefrange{eq1}{eq5}-Befehl.