PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : eigene Umgebung und \autoref



xen
31-08-2006, 14:25
Hallo,

für meine eigens erstelle example Umgebung, verwende ich das xkeyval paket um optionale Parameter zu implementieren. Einer davon ist label.

Wird der Labelname übergeben so wird das Label zu Beginn der example Umgebung gesetzt.

Anschließend verweise ich auf dieses Beispiel aus einem anderen Teil des Dokuments mittels \autoref (aus dem hyperref paket)

Dieser Autoref Befehl kennt allerdings nicht meine example Umgebung, diese basiert auch NICHT auf andere Umgebungen wie List o.Ä.!

Resultat: ... siehe Abschnitt 1.1

Ziel: ...siehe Beispiel 1.1


Bisher ist es mir nicht gelungen Änderungen an Autoref bzw. dem Hyperref Paket vorzunehmen um das gewünschte Ergebnis zu erzielen.
Suche wie immer brauchbare Tipps :)

Gruß,
xen

Jollero
07-09-2006, 11:26
Lösungsvorschlag gefunden auf:
http://www.codecomments.com/archive384-2006-7-999795.html

Funktioniert bei mir mit

\newfloat{formel}{H}{for}[section]
\floatname{formel}{Formel}
\newcommand{\formelautorefname}{Formel}

Entscheidend ist wohl der erste Parameter (name) bei \newfloat...

Viele Grüße
Jens

xen
12-09-2006, 12:15
(zurück aus dem Urlaub)

Leider hat mir dein Lösungsvorschlag bisher nicht weitergeholfen. Ich habe deinen Code verwendet und daraus folgende Testumgebung implementiert:



\section{Test}

\begin{formel}
\label{1}
Dies ist ein Test!
\end{formel}

Dies ist ein Verweis: \autoref{1}

Ergebnis: ... siehe Abschnitt x.x

Gruß,
xen

Jollero
12-09-2006, 12:29
Bist du dir sicher, dass du \newcommand{\formelautorefname}{Formel} richtig gesetzt hast? Es macht keinen Sinn, dass Abschnitt als Name vor der Referenz verwendet wird, denn es muss ein entsprechender Befehl für \formelautorefname vorhanden sein, sonst würde auch nur die zahl als Referenz ausgegeben werden, anstatt Abbildung 3.1 nur 3.1...

Wann lädst du das Package float? Vielleicht kannste ja mal ein Minimalbeispiel posten?

Viele Grüße
Jens

edit:



\documentclass[10pt]{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{hyperref}
\usepackage{float}
\newfloat{formel}{H}{for}[section]
\floatname{formel}{Formel}
\newcommand{\formelautorefname}{Formel}

\begin{document}

\section{Test}

\begin{formel}
Dies ist ein Test!
\caption{hallo}
\label{test}
\end{formel}

Dies ist ein Verweis: \autoref{test}

\end{document}



Wie ich herausbekommen habe, musst du caption UND label in der Gleitumgebung verwenden, sonst zählt der label zum Abschnitt...
Viele Grüße
Jens

xen
12-09-2006, 12:54
ahhh edit und edit :)

Ok ich werds mir nochmal ansehen.

Gruß,
xen

xen
12-09-2006, 13:02
\documentclass{article}

\usepackage{float}
\usepackage{hyperref}

\newfloat{formel}{H}{for}[section]
\floatname{formel}{Formel}
\newcommand{\formelautorefname}{Formel}

\begin{document}

\section{Label Test}

\begin{formel}
\label{label1} \caption{} Dies ist ein Test!
\end{formel}

Und hier der Verweis: \autoref{label1}.

\end{document}

Also so richtig funktioniert das jetzt nicht. Die Caption darf auch nicht sichtbar sein, evtl. ist es dann der falsche Ansatz. :(

Gruß,
xen

Jollero
12-09-2006, 14:00
Vielleicht solltest du mal GENAU ausdrücken, was du haben willst... :)

Warum soll keine caption erzeugt werden, wenn du drauf verweisen möchtest? Dann weiß doch der Leser nicht, wo er hinschauen soll!! :D

Oder hast du über das xkeyval-package ein paar Sachen definiert, von der du hier nix weiter erwähnt hast? Du nimmst also auch nicht das float-Package zur Definition der example-Umgebung?

Viele Grüße
Jens

xen
12-09-2006, 15:09
Nein. Also ich bin mal so nett und poste meinen Code:


%
%
% an example environment
%

% counter for example number
\newcounter{examplenum}
\@addtoreset{examplenum}{chapter}

% blueleftbar, requ. framed package (overwritten)
\newenvironment{blueleftbar}{%
\def\FrameCommand{\fboxsep=0pt\color{tesisblue}\vr ule width 1.5pt \color{black}\hspace{10pt}}%
\MakeFramed {\advance\hsize-\width \FrameRestore}}%
{\endMakeFramed}

% xkeyval definition: Label, caption
\define@key{example@intern}{caption}{\renewcommand {\examplecaption}{#1}}
\define@key{example@intern}{label}{\renewcommand{\ examplelabel}{\ifthenelse{\equal{#1}{}}{}{\label{# 1}}}}


\newenvironment{example@intern}[1]{%
\begin{blueleftbar}%
\textbf{#1}\newline\raggedright%
}{\end{blueleftbar}}

\newenvironment{example}[1][]{%
\def\examplecaption{}%
\def\examplelabel{}%
\setkeys{example@intern}{#1}%

\renewcommand{\label}[1]{\@bsphack
\protected@write\@auxout{}%
{\string\newlabel{##1}{{\thechapter.\arabic{exampl enum}}{\thepage}{\@currentlabelname}{beispiel.\the chapter.\arabic{examplenum}}{}}}%
\@esphack}

\addtocounter{examplenum}{1}%
\begin{example@intern}{\Beispielname\,\,\thechapte r.\arabic{examplenum}%
\ifthenelse{\equal{\examplecaption}{}}{}{:\,\,\exa mplecaption}\examplelabel}}%
{\end{example@intern}}

\newenvironment{example*}[1][]{%
\def\examplecaption{}%
\setkeys{example@intern}{#1}%
\begin{example@intern}{%
\Beispielname\ifthenelse{\equal{\examplecaption}{} }{}{:\,\,\examplecaption}}}%
{\end{example@intern}}

example kann label oder/und caption übergeben werden. Die Caption befindet sich in oberster Zeile und wird nummeriert. Sie ist einfacher Text und basiert auf keinem speziellen Paket.

example* funktioniert wie example nur dass der Counter an dieser Stelle nicht erhöht wird und auch nicht dargestellt wird. Die Label Option ist hier nicht implementiert.

example@intern dient um den Code kompakt zu halten. Ausserdem erzeugt sie um die example Umgebungen die "blueleftbar", welche links vom Exampletext einen blauen Balken erzeugt.

Um die Example Umgebung verwenden zu können wird das Paket "framed" und "xkeyval" benötigt.

Gruß,
xen

xen
19-09-2006, 08:05
Ich hab nun endlich die Lösung des Problems gefunden. Lange habe ich getüfftelt :). Letztendlich habe ich innerhalb der example Umgebung den Label Befehl überschrieben.



\renewcommand{\label}[1]{\@bsphack
\protected@write\@auxout{}%
{\string\newlabel{##1}{{\thechapter.\arabic{exampl enum}}{\thepage}{\@currentlabelname}{beispiel.\the chapter.\arabic{examplenum}}{}}}%
\@esphack}


Dieser Code schreibt das Label in die AUX File z.B.:

\newlabel{label1}{{1.1}{1}{Einleitung}{beispiel.1. 1}{}}

label1 = der Labelname

1.1 = das aktuelle Chapter . der Beispielcounter (noch nicht ganz sicher...)

1 = Seite

Einleitung = Name des aktuellen Chapters/Section/...

beispiel.1.1 = hieraus ergibt sich der Text der im Verweis dargestellt wird. ...Beispiel 1.1 oder auch ...Example 1.1

In der Verarbeitung der AUX File geschehen an dieser Stelle seltsame Dinge "beispiel" wird je nach Sprache als "Beispiel" oder "Example" erzeugt. Der Punkt wird verschluckt und dient wohl nur als Seperator Char. 1.1 ist die Nummer des Beispiels und wird auch beim Autoref Verweis dargestellt.


Den Code habe ich meinem letzten Beitrag eingefügt und kann nun verwendet werden. :)
Desweiteren sollte die Label Lösung auch für weitere nicht-float Umgebung verwendet werden können.

Gruß,
xen

volcom
26-10-2006, 15:51
Ich hab ein ähnliches Problem.
Dabei soll eine Gefährdung ebenfalls mit "Gefährdung 1" referenziert werden. Die Lösung mit caption ist für mich ebenfalls nicht praktikabel und ich kenne mich nicht genug aus, um die Lösung von xen an meine Bedürfnisse anzupassen. Jemand ne Idee wie man das machen kann?

Hier ein Beispiel:
Wobei section zu Gefährdung werden soll *g*
Einfach ein \renewcommand{\sectionname}{Gefährdung} wie es im hyperref-package angegeben wird funktioniert nicht, da er sectionname nicht kennt (Weiß jemand warum?). Wäre aber durchaus möglich, da ich autoref weiter nicht verwende.

\documentclass[a4paper]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[ansinew]{inputenc}
\usepackage[T1]{fontenc}
%\usepackage{textcomp}
\usepackage{blindtext}
\usepackage[pdftex]{hyperref}
\usepackage{float}
\floatstyle{plain}

\newfloat{gefaehrdung}{th}{gefaux}
\floatname{gefaehrdung}{\textbf{G}}
\newcommand{\gefaehrdungautorefname}{Gefährdung}

\begin{document}

\newpage
\tableofcontents

\newpage
\addcontentsline{toc}{section}{Gefährdungsübersich t}
\listof{gefaehrdung}{Gefährdungsübersicht}

\newpage
\section{Gefährdungen},

\begin{gefaehrdung}[H]
\textbf{G 0} Gefahr 0
\label{bla}
\addcontentsline{gefaux}{gefaehrdung}{\textbf{G 0} Gefahr 0}
\end{gefaehrdung}

\blindtext

\begin{gefaehrdung}[H]
\textbf{G 1} Gefahr 1
\addcontentsline{gefaux}{gefaehrdung}{\textbf{G 0} Gefahr 0}
\end{gefaehrdung}

Hier ein Verweis auf \autoref{bla}

\blindtext

\end{document}

sommerfee
07-09-2007, 19:08
Letztendlich habe ich innerhalb der example Umgebung den Label Befehl überschrieben.

Keine gute Idee, da \label von einigen Paketen, wie z.B. hyperref, erweitert wird, so daß die Anzahl der Parameter von \newlabel nicht als konstant angesehen werden kann.

Die Lösung stattdessen wäre:


\addtocounter{examplenum}{1}%
durch

\refstepcounter{examplenum}
zu ersetzen.

Denn \refstepcounter erhöht nicht nur den angegebenen Zähler um 1, sondern erzeugt auch intern einen Verweis, auf den man mittels \label und \ref (bzw. \autoref} verweisen kann.

Gruß,
Axel