Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 17

Thema: Benutzerdefinierte Referenzierung, Problem mit Sub- und Paragraph Autobenennung

  1. #1
    Registrierter Benutzer
    Registriert seit
    14.05.2009
    Beiträge
    297

    Exclamation Benutzerdefinierte Referenzierung, Problem mit Sub- und Paragraph Autobenennung

    Hallo Profis,

    ich komme bei einem für mich recht schwierigem Problem leider überhaupt nicht mehr weiter . Vielleicht kann mir da ja jmd. helfen . Folgendes:

    Ich habe damals mit Hilfe dieses Forums ein kleines Skript in LaTeX geschaffen, welches mir automatisch - u.a. in Kombination mit VarioRef für "on the following page, auf der folgenden usw. - je nach Gleitumgebung oder Abschnitt den jeweiligen Namen hinschreibt in der jeweiligen Sprache.

    Bsp 1: Siehe Abbildung 2.3 auf der folgenden Seite
    Bsp 2: Siehe Tabelle 1.3 auf Seite 20
    Bsp 3: Siehe Unterabschnitt 3.2 auf Seite 24

    Das funktioniert bisher einwandfrei, nur leider nicht bei Paragraph und Subparagraph und ich weiß nicht warum. Ich möchte wenn ich ein Label bei Sub- oder Paragraph stehen habe und mich auf dieses im Text mit

    Code:
    Siehe \myref{para:iregndwas}
    beziehe, Paragraph bzw. Subparagraph vor der Nummer stehen haben genau wie bei Abbildung, Tabelle usw. Leider steht dort aber gar nichts. Vermutlich hat LaTeX dafür keine gespeicherten Namen, da diese normalerweise ja auch nicht nummeriert werden?

    Wenn man sich die Gliederungsnummer, die er ja immerhin hinschreibt, anschaut, dann ist das auch die der drüberliegenden Ebene, nämlich der SubSubSection.

    Super wäre es, wenn er folgendes schreiben würde: Siehe Paragraph NameDesParagraphen in Unterunterabschnitt 1.2.3 (auf Seite X)

    oder

    Siehe UnterUnterParagraph NameDesUnterUnterParagraphen in Unterunterabschnitt 1.2.3 (auf Seite X)

    und das in der jeweilig eingestellten Sprache natürlich, wobei X natürlich dann nicht die Seite sein soll, wo der Unterunterabschnitt anfängt in welchem der Paragraph definiert ist sondern wo der Para- bzw. Subparagraph sich tatsächlich befindet. Weiterhin soll "auf Seite X" weggelassen werden, wenn es auf der gleichen Seite ist etc. Eben die funktionalität von VarioRef.

    Ich habe natürlich mal ein Mini-Bsp vorbereitet, damit das einleuchtender wird. Dort ist alles enthalten und man sieht, dass es nur bei den Paragraphen nicht funktioniert.

    Bin da wirklich für jeden Tipp dankbar, aber leider kenne ich mich mit der Programmierung in der Stufe auch nicht aus, so dass ich wirklich nicht weiterkomme.

    Vielen Dank schon mal.
    Grüße


    Code:
    \documentclass{scrartcl}
    \usepackage[latin1]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage[ngerman]{babel}
    \usepackage{ifthen}
    \usepackage{caption}
    \usepackage{varioref}
    \usepackage{hyperref}
     
    \begin{document}
    
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    \makeatletter
    \def\myautoref#1{% modifiziertes \HyPsd@@@autoref aus hyperref
      \expandafter\ifx\csname r@#1\endcsname\relax
        ??%
      \else
        \expandafter\expandafter\expandafter\HyPsd@autorefname
            \csname r@#1\endcsname{}{}{}{}\@nil
      \fi}
    \makeatother
    
    %Anwendungsbeispiel: \myautoref{label}
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    
    \newcommand{\myref}[1]{\myautoref{#1}\vref{#1}}
    
    
    \section{Einleitung}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subsection{Sub Einleitung}
    \label{subsec:test}
    Test Test Test Test.
    
    \paragraph{Para1}
    \label{para:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subparagraph{Sub Para1}
    \label{subpara:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
     
    \begin{figure}[htbp]
    	\centering
    	\caption{Test}
    	\label{fig:test}
    \end{figure}
    
     
    \section{Zweite Einleitung}
    Hier möchte ich auf \myref{fig:test} verweisen und hier auf \myref{subsec:test} und hier auf \myref{para:test} und hier auf \myref{subpara:test}.
    \end{document}

  2. #2
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.604
    Wenn man in die AUX-Datei schaut, sieht man, daß die \label zu den Paragraphen als "section*" abgelegt werden, warum auch immer. Vermutlich sind hyperlinks zu Paragraphen gar nicht vorgesehen, schließlich haben sie keine Nummer. \ref ergibt dementsprechend einfach die Nummer des letzten sinnvollen \label-Kommandos, in diesem Falle 1.1.

    Wenn man das trotzdem so lassen will, könnte man für "section*" einen passenden \autoref-Namen definieren, Wegen des * im Namen geht das nicht mit \newcommand, aber so:

    Code:
    \expandafter\def\csname section*autorefname\endcsname{Huba!}
    Es würde dann bei \myref{para:test} "Huba! 1.1" statt "1.1" ausgegeben werden, zumindest bei mir.

  3. #3
    Registrierter Benutzer
    Registriert seit
    14.05.2009
    Beiträge
    297
    Hey Sommerfee,

    vielen dank. Ich errinnere mich irgendwie an deinen Namen. Du hattest mir vor 1,5 Jahren - genau wie Ulrike Fischer - bei meiner "komplizierten" Diplomarbeit geholfen und ich habe einige recht umfangreiche Skriptänderungen von dir (glaube für das caption paket usw?) bekommen, das war echt gut.

    Naja nun zu diesem Thema:

    Es funktioniert schon mal ganz gut, aber ich bin noch nicht ganz zufrieden. Zunächst einmal habe ich mit meinem Halbwissen versucht das Ganze erstmal abhängig von der Sprache (nur DE und EN) zu machen, da LaTeX das in diesem mauellen Fall ja nicht tut, da selbstdefiniert. Die andere Sache ist, das ich eigentlich noch Paragraph und Subparagraph unterscheiden möchte (wenn das überhaupt geht), aber was viel wichtiger ist, dass hinter "Paragraph" der Name des Paragraphen steht wie im ersten Post beschrieben. Die tatsächliche Angabe der Seitenzahl stimmt übrigens schon von Hause aus, das ist schon mal sehr gut.

    Also so: Siehe Paragraph Para1 in Unterunterabschnitt 1.1 auf Seite 3

    Und dabei sollte Paragraph durch Subparagraph ersetzt werden, wenn es denn einer ist und Unterunterabschnitt durch den jeweiligen Abschnittstyp wo der Paragraph drin hängt, denn es muss ja nicht zwingend ein Unterunterabschnitt sein, wo der Paragraph definiert wurde.



    PS: Habe natürlich mal versucht einfach \thesection oder so in den Code zu schreiben, klappt auch, aber das ist natürlich Murks, denn a) stimmt es nur, wenn es eine Section ist und b) es ist natürlich nicht die section wo der paragraph tatsächlich drin hängt sondern die, wo die referenzierung aufgerufen wurde


    Code:
    \documentclass{scrartcl}
    \usepackage[latin1]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage[ngerman]{babel}
    \usepackage{ifthen}
    \usepackage{caption}
    \usepackage{varioref}
    \usepackage{hyperref}
     
    \begin{document}
    
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    \makeatletter
    \def\myautoref#1{% modifiziertes \HyPsd@@@autoref aus hyperref
      \expandafter\ifx\csname r@#1\endcsname\relax
        ??%
      \else
        \expandafter\expandafter\expandafter\HyPsd@autorefname
            \csname r@#1\endcsname{}{}{}{}\@nil
      \fi
      \iflanguage{english}
    	{\expandafter\def\csname section*autorefname\endcsname{paragraph}}{}
    	\iflanguage{ngerman}
    	{\expandafter\def\csname section*autorefname\endcsname{Paragraph}}{}
    }
    \makeatother
    
    %Anwendungsbeispiel: \myautoref{label}
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    
    \newcommand{\myref}[1]{\myautoref{#1}\vref{#1}}
    
    
    \section{Einleitung}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subsection{Sub Einleitung}
    \label{subsec:test}
    Test Test Test Test.
    \newpage
    \paragraph{Para1}
    \label{para:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subparagraph{Sub Para1}
    \label{subpara:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
     
    \begin{figure}[htbp]
    	\centering
    	\caption{Test}
    	\label{fig:test}
    \end{figure}
    \newpage
     
    \section{Zweite Einleitung}
    Hier möchte ich auf \myref{fig:test} verweisen und hier auf \myref{subsec:test} und hier auf \myref{para:test} und hier auf \myref{subpara:test}.
    \end{document}

  4. #4
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.604
    Zitat Zitat von sharpType Beitrag anzeigen
    Die andere Sache ist, das ich eigentlich noch Paragraph und Subparagraph unterscheiden möchte (wenn das überhaupt geht)
    Zur Zeit werden beide von hyperref als "section*" in der AUX-Datei abgelegt, also geht das so nicht. Also werfen wir den "section*autorefname"-Hack einfach dorthin, wo er sowieso hingehört, nämlich in die Tonne, und machen es doch vernünftig(er):

    Code:
    \setcounter{secnumdepth}{5}
    \renewcommand\theparagraph{\hskip-.5em\relax} % keine Nummer ausgeben
    \renewcommand\thesubparagraph{\hskip-.5em\relax} % keine Nummer ausgeben
    Das mit dem \hskip-.5em\relax ist nur ein übler Hack, auf die schnelle fällt mir aber nix anderes ein, um das störende \enskip wegzubekommen, außer vielleicht:

    Code:
    \setcounter{secnumdepth}{5}
    % \othersectionlevelsformat so umdefinieren, daß bei \paragraph und \subparagraph nix ausgegeben wird:
    \makeatletter
    \let\othersectionlevelsformat@ORI\othersectionlevelsformat
    \renewcommand\othersectionlevelsformat[3]{%
      \def\@tempa{#1}%
      \def\@tempb{paragraph}%
      \ifx\@tempa\@tempb\else
        \def\@tempb{subparagraph}%
        \ifx\@tempa\@tempb\else
          \othersectionlevelsformat@ORI{#1}{#2}{#3}%
        \fi
      \fi}
    \makeatother
    Sehr schön finde ich das aber auch nicht... (Dafür ist aber diese Variante im Gegensatz zur ersten unabhängig davon, wie \othersectionlevelsformat bei KOMA-Script definiert ist.)

    aber was viel wichtiger ist, dass hinter "Paragraph" der Name des Paragraphen steht wie im ersten Post beschrieben.
    Das geht z.B. mit \nameref{para:test}.
    Geändert von sommerfee (02-08-2011 um 10:21 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    14.05.2009
    Beiträge
    297
    Hey,

    danke. Kurz vorweg: Was meinst du mit "nix ausgegeben wird?" Etwa die Nummerierung vor Para und Subparagraph im Dokument? Wenn ja, stimmt, die soll natürlich nicht erscheinen.

    Wir kommen der Sache jetzt schon ein ganzes Stück näher, jetzt fehlt nur noch ein "kleiner Teil". Und zwar soll bei der Referenzierung nun nicht die Nummer das paragraphen stehen (die man sowieso nicht nachvollziehen kann, da nur intern) sondern: siehe Bild

    Ich kann \nameref{para:test} natürlich nicht verwenden, weil es ja in dem Befehl \myref{X} mit verwendet werden soll, d.h. automatisch. Weiterhin soll die Bezeichnung und die Nr der drüberliegenen Ebene rein (s. Bild).

    Der Inhalt des gelben Rechtecks soll durch den Inhalt des Blauen ersetzt werden.

    Nochmal mein derzeitiger Code:

    Code:
    \documentclass[pdftex,ngerman]{scrreprt} 
    \usepackage[latin1]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage[ngerman]{babel}
    \usepackage{ifthen}
    \usepackage{caption}
    \usepackage{varioref}
    \usepackage{hyperref}
     
    \begin{document}
    
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    
    \setcounter{secnumdepth}{5}
    % \othersectionlevelsformat so umdefinieren, daß bei \paragraph und \subparagraph nix ausgegeben wird:
    \makeatletter
    \let\othersectionlevelsformat@ORI\othersectionlevelsformat
    \renewcommand\othersectionlevelsformat[3]{%
      \def\@tempa{#1}%
      \def\@tempb{paragraph}%
      \ifx\@tempa\@tempb\else
        \def\@tempb{subparagraph}%
        \ifx\@tempa\@tempb\else
          \othersectionlevelsformat@ORI{#1}{#2}{#3}%
        \fi
      \fi}
    \makeatother
    
    
    \makeatletter
    \def\myautoref#1{% modifiziertes \HyPsd@@@autoref aus hyperref
      \expandafter\ifx\csname r@#1\endcsname\relax
        ??%
      \else
        \expandafter\expandafter\expandafter\HyPsd@autorefname
            \csname r@#1\endcsname{}{}{}{}\@nil
      \fi
    }
    \makeatother
    
    %Anwendungsbeispiel: \myautoref{label}
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    
    \newcommand{\myref}[1]{\myautoref{#1}\vref{#1}}
    
    
    \section{Einleitung}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subsection{Sub Einleitung}
    \label{subsec:test}
    Test Test Test Test.
    \newpage
    \paragraph{Para1}
    \label{para:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subparagraph{Sub Para1}
    \label{subpara:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
     
    \begin{figure}[htbp]
    	\centering
    	\caption{Test}
    	\label{fig:test}
    \end{figure}
    \newpage
     
    \section{Zweite Einleitung}
    Hier möchte ich auf \myref{fig:test} verweisen und hier auf \myref{subsec:test} und hier auf \myref{para:test} und hier auf \myref{subpara:test}.
    \end{document}
    Angehängte Grafiken Angehängte Grafiken

  6. #6
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.604
    Ich kann dies hier anbieten:
    Code:
    \documentclass[ngerman]{scrreprt} 
    \usepackage[latin1]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage[ngerman]{babel}
    %\usepackage{ifthen}
    \usepackage{caption}
    \usepackage{varioref}
    \usepackage{hyperref}
     
    \begin{document}
    
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    
    \setcounter{secnumdepth}{5}
    \makeatletter
    
    % Diese Ebenen sollen nicht nummeriert werden und bei \myref intern \nameref verwenden
    \caption@g@addto@list\nonumberlevelslist{paragraph,subparagraph}
    
    % \othersectionlevelsformat so umdefinieren,
    % daß bei \paragraph und \subparagraph nix ausgegeben wird:
    \let\othersectionlevelsformat@ORI\othersectionlevelsformat
    \renewcommand\othersectionlevelsformat[3]{%
      \caption@ifin@list\nonumberlevelslist{#1}{}{%
          \othersectionlevelsformat@ORI{#1}{#2}{#3}}}
    
    % Hilfsmakros, um aus dem Label in der AUX-Datei den Namen (section,subsection,...) zu gewinnen
    \newcommand*\myautorefname[2]{% modifiziertes \HyPsd@@@autoref aus hyperref
      \expandafter\ifx\csname r@#2\endcsname\relax
        ??%
      \else
        \expandafter\expandafter\expandafter#1%
            \csname r@#2\endcsname{}{}{}{}\@nil
      \fi
    }
    \def\@myname#1#2#3#4#5\@nil{\@@myname#4.\@nil}
    \def\@@myname#1.#2\@nil{#1}
    
    \newcommand*\myautoref[1]{%
      \myautorefname\HyPsd@autorefname{#1}%
    }
    
    % \myvref verwendet je nach Gliederungsebene \nameref oder \vref
    \newcommand*\myvref[1]{%
      \caption@ifin@list\nonumberlevelslist{\myautorefname\@myname{#1}}%
        {\nameref{#1}}{\vref{#1}}%
    }
    
    \makeatother
    
    %Anwendungsbeispiel: \myautoref{label}
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    
    \newcommand{\myref}[1]{\myautoref{#1}\myvref{#1}}
    
    
    \section{Einleitung}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subsection{Sub Einleitung}
    \label{subsec:test}
    Test Test Test Test.
    %\newpage
    \paragraph{Para1}
    \label{para:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subparagraph{Sub Para1}
    \label{subpara:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
     
    \begin{figure}[htbp]
    	\centering
    	\caption{Test}
    	\label{fig:test}
    \end{figure}
    \newpage
     
    \section{Zweite Einleitung}
    Hier möchte ich auf \myref{fig:test} verweisen und hier auf \myref{subsec:test} und hier auf \myref{para:test} und hier auf \myref{subpara:test}.
    \end{document}
    Dies verwendet immerhin schon 'mal je nach Gliederungsebene \vref oder \nameref.

    Um jetzt auf das Ergebnis zu kommen, was du haben möchtest, müsste man sich "nur" noch in varioref einarbeiten und den Test, ob nun die Nummer oder der Titel ausgegeben werden soll (und der im Moment in \myvref drin steckt), mit varioref verheiraten.

    (Mit varioref kenne ich mich aber nicht im geringsten aus.)

  7. #7
    Registrierter Benutzer
    Registriert seit
    14.05.2009
    Beiträge
    297
    Das sieht schon mal sehr gut aus Hut ab!
    Aber eine Menge Code, den ich nur halb verstehe

    So wie es aussieht machst du eine Liste und definierst in dieser die beiden Paragraphentypen, unterdrückst dann die textinterne Nummerierung dieser und gibst entsprechend dem Verweistyp eine Ausgabe aus. So soll es sein.

    Das was jetzt nur noch fehlt (muss auch kurz überlegen) ist ja nur noch das, was eigentlich ursprünglich (Code vom erstem Post von mir) bei Anwendung von \myref{} im Text steht, wenn ich auf z. B. eine Section verweise.

    D.h. es muss eigentlich nur so "getan werden", als wenn man auf den Abschnitt (Chapter, Section, Subsection usw.) verweist in welchem der jeweilige Paragraph enthalten/definiert ist und das dann "einfach" an den derzeitigen Stand im Falle von Para- und Subpara dranhängen, wobei das Verbindungswort "in" fix irgenwo untergebracht werden kann (gilt ja sowohl für DE als auch EN), da es nirgendswoher bezogen werden kann.

    Aber bisher geht das genau in die Richtung, wie ich es mir vorgestellt habe. Auslöser dieser ganzen Umstände ist - wenn ich es richtig sehe - auch nur die Tatsache, dass ich im Text die beiden Paragraphentypen nicht durchnummerieren lasse, also \setcounter{secnumdepth}{3} habe und nicht 5.

    Das ist halt in manchen Dokumenten vorgeschrieben, bis wie weit nummeriert werden darf/soll und trotzdem soll die Referenzierung ja irgendwie so sein, wie auch bei Section etc.

    Vielleicht stößt ja jmd auf den Post hier und kann noch die entscheidende Hilfestellung geben.

    Sommerfee, vielen Dank auf jeden fall an dieser Stelle schon mal für deine Mühe.

    Edit: Muss zugeben, glaube mich etwas vertan zu haben in Bezug auf das, was da stehen soll. Nach "Unterabschnitt 0.1.1" soll natürlich nicht!!! nochmal (wie in meinem ersten Anhang gezeigt) der Name des Abschnitts kommen, sondern lediglich (s. Anhang) die Nummer des Abschnitts wo der Para drin hängt und die richtige Seitenangabe.

    Also nochmal kurz zusammengefast (gilt für den Fall SubPara und Para): Genau wie du es bisher erreicht hast + "in X auf Y",

    wobei

    X=Bezeichnung des Abschnitts + Nummerierung zb. "Unterunterabschnitt 0.1.1" in welchem der Para drin hängt
    Y=Verhalten von Varioref mit der richtigen Seitenangabe zum Para
    Angehängte Grafiken Angehängte Grafiken
    Geändert von sharpType (03-08-2011 um 14:07 Uhr)

  8. #8
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.604
    Zitat Zitat von sharpType Beitrag anzeigen
    Also nochmal kurz zusammengefast (gilt für den Fall SubPara und Para): Genau wie du es bisher erreicht hast + "in X auf Y"
    Hier das ganze einen Schritt weiter, mit "in X":

    Code:
    \documentclass[ngerman]{scrreprt} 
    \usepackage[latin1]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage[ngerman]{babel}
    %\usepackage{ifthen}
    \usepackage{caption}
    \usepackage{varioref}
    \usepackage{hyperref}
    
    \begin{document}
    
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    
    \setcounter{secnumdepth}{5}
    \makeatletter
    
    % Diese Ebenen sollen nicht nummeriert werden und bei \myref intern \nameref verwenden
    \caption@g@addto@list\nonumberlevelslist{paragraph,subparagraph}
    
    % \othersectionlevelsformat so umdefinieren,
    % daß bei \paragraph und \subparagraph nix ausgegeben wird:
    \let\othersectionlevelsformat@ORI\othersectionlevelsformat
    \renewcommand\othersectionlevelsformat[3]{%
      \caption@ifin@list\nonumberlevelslist{#1}{}{%
          \othersectionlevelsformat@ORI{#1}{#2}{#3}}}
    
    % Hilfsmakro, um aus dem Label in der AUX-Datei den Namen (section,subsection,...)
    % bzw. die Nummer (1.2.3.4,...) oder... zu gewinnen
    % Argument #1 ist ein Makro der Form \def\#1#2#3#4#5\@nil#6\@nil{...}
    %   wobei: #1 = Nummer, z.B. "0.1.1" (Ausgabe von \ref)
    %             #2 = Aktueller Zählerstand, z.B. "1"
    %             #3 = Text, z.B. "Einleitung" (Ausgabe von \nameref)
    %             #4 = Art und Nummer des Bereichs, z.B. "subsection.0.1.1"
    %             #5 = ?
    %             #6 = Argument #2 (siehe unten)
    % Argument #2 ist ein Makro der Form \def\#1...\@nil{...}
    % Argument #3 ist das Label, z.B. "sect:test"
    \newcommand*\@myautoref[3]{% modifiziertes \HyPsd@@@autoref aus hyperref
      \expandafter\ifx\csname r@#3\endcsname\relax
        ??%
      \else
        \expandafter\expandafter\expandafter#1%
            \csname r@#3\endcsname{}{}{}{}\@nil#2\@nil
      \fi
    }
    
    % \myautorefname liefert den Bereichsnamen des Labels, z.B. "Absatz" oder "Unterabschnitt"
    \newcommand*\myautorefname[1]{%
      \@myautoref\@myautorefname\HyPsd@@autorefname{#1}%
    }
    \def\@myautorefname#1#2#3#4#5\@nil#6\@nil{% modifiziertes \HyPsd@autorefname
      #6#4.\@nil}% Argument #4 = Art und Nummer des Bereiches (siehe oben)
    
    % \mynameref liefert das identische Ergebnis wie \nameref, aber nicht als Hyperlink
    \newcommand*\mynameref[1]{%
      \@myautoref\@mynameref\relax{#1}%
    }
    \def\@mynameref#1#2#3#4#5\@nil#6\@nil{#3}% Argument #3 = Text (siehe oben)
    
    % \myvref verwendet je nach Gliederungsebene \nameref oder \vref
    \newcommand*\myvref[1]{%
      \caption@ifin@list\nonumberlevelslist{\@myautoref\@myautorefname\@myname{#1}}%
    % später ggf. \mynameref statt \nameref verwenden!?
        {\nameref{#1} in \subsectionautorefname~\mysubsection{#1}}{\vref{#1}}%
    }
    \def\@myname#1.#2\@nil{#1} % liefert z.B. "section" oder "paragraph"
    
    \newcommand*\mysubsection[1]{%
      \@myautoref\@myautorefname\@mysubsection{#1}%
    }
    \def\@mysubsection#1.#2.#3.#4.#5\@nil{#2.#3.#4} % liefert z.B. "1.2.3"
    
    \makeatother
    
    %Anwendungsbeispiel: \myautoref{label}
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    
    \newcommand{\myref}[1]{\myautorefname{#1}\myvref{#1}}
    
    \section{Einleitung}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subsection{Sub Einleitung}
    \label{subsec:test}
    Test Test Test Test.
    %\newpage
    \paragraph{Para1}
    \label{para:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subparagraph{Sub Para1}
    \label{subpara:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
     
    \begin{figure}[htbp]
    	\centering
    	\caption{Test}
    	\label{fig:test}
    \end{figure}
    \newpage
     
    \section{Zweite Einleitung}
    Hier möchte ich auf \myref{fig:test} verweisen und hier auf \myref{subsec:test} und hier auf \myref{para:test} und hier auf \myref{subpara:test}.
    \end{document}
    Fehlt "nur" noch das "auf Y". In Summe muß man also das Ausgabeformat von \vref pimpen, am besten so, daß das komplette Gedöhns (wie z.B. "Absatz Para1 in Unterabschnitt 0.1.1 auf vorheriger Seite") ein einziger Hyperlink wird, und man dann im Text selber einfach nur noch \vref{...} (statt \myref{...}) verwendet.

    Wie schon geschrieben, ich kenne das varioref-Paket überhaupt nicht, aber vielleicht geht das sogar mit dort dokumentierten Bordmitteln. Wenn man es schafft, daß \vref{...} als Linktext z.B. "TODO auf vorheriger Seite" (statt "1.2.4 auf vorheriger Seite") erzeugt, hat man quasi schon gewonnen. Dann müsste man anschließend nur noch "TODO" Schritt für Schritt durch den gewünschten Inhalt ersetzen. (Beim letzten Schritt könnte ich dann auch wieder gerne helfen.)

    (Hierbei kann es sein, daß die Verwendung von \nameref nicht mehr funktioniert, weil es quasi einen Hyperlink innerhalb des Hyperlinks erzeugen würde. Daher habe ich schon'mal als Alternative ein \mynameref bereitgestellt. Eventuell müsste man sich auch analog ein \myref für die Nummernausgabe basteln.)
    Geändert von sommerfee (05-08-2011 um 10:31 Uhr)

  9. #9
    Registrierter Benutzer
    Registriert seit
    14.05.2009
    Beiträge
    297
    Hey!

    Das ist echt abgefahren, der Code wird ja immer heftiger
    Du hast es drauf, aber folgender Fehler: Schau mal in das angehängte Minibeispiel, wenn ich nach der Section noch eine Subsection mache und dort die Paras reinhänge. Dann steht da immernoch "Unterabschnitt". Da soll auch dynamisch sein, zb wenn ich den Para in ein Chapter hänge oder worein auch immer. Glaube da ist noch ein Fehler

    Und was ich gerade gefunden habe:

    Code:
    \vpageref{para:test}.
    Ist das nicht das was wir suchen, benötigen?


    Minibsp mit Fehler:

    Code:
    \documentclass[ngerman]{scrreprt} 
    \usepackage[latin1]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage[ngerman]{babel}
    %\usepackage{ifthen}
    \usepackage{caption}
    \usepackage{varioref}
    \usepackage{hyperref}
    
    \begin{document}
    
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    
    \setcounter{secnumdepth}{5}
    \makeatletter
    
    % Diese Ebenen sollen nicht nummeriert werden und bei \myref intern \nameref verwenden
    \caption@g@addto@list\nonumberlevelslist{paragraph,subparagraph}
    
    % \othersectionlevelsformat so umdefinieren,
    % daß bei \paragraph und \subparagraph nix ausgegeben wird:
    \let\othersectionlevelsformat@ORI\othersectionlevelsformat
    \renewcommand\othersectionlevelsformat[3]{%
      \caption@ifin@list\nonumberlevelslist{#1}{}{%
          \othersectionlevelsformat@ORI{#1}{#2}{#3}}}
    
    % Hilfsmakro, um aus dem Label in der AUX-Datei den Namen (section,subsection,...)
    % bzw. die Nummer (1.2.3.4,...) oder... zu gewinnen
    % Argument #1 ist ein Makro der Form \def\#1#2#3#4#5\@nil#6\@nil{...}
    %   wobei: #1 = Nummer, z.B. "0.1.1" (Ausgabe von \ref)
    %             #2 = Aktueller Zählerstand, z.B. "1"
    %             #3 = Text, z.B. "Einleitung" (Ausgabe von \nameref)
    %             #4 = Art und Nummer des Bereichs, z.B. "subsection.0.1.1"
    %             #5 = ?
    %             #6 = Argument #2 (siehe unten)
    % Argument #2 ist ein Makro der Form \def\#1...\@nil{...}
    % Argument #3 ist das Label, z.B. "sect:test"
    \newcommand*\@myautoref[3]{% modifiziertes \HyPsd@@@autoref aus hyperref
      \expandafter\ifx\csname r@#3\endcsname\relax
        ??%
      \else
        \expandafter\expandafter\expandafter#1%
            \csname r@#3\endcsname{}{}{}{}\@nil#2\@nil
      \fi
    }
    
    % \myautorefname liefert den Bereichsnamen des Labels, z.B. "Absatz" oder "Unterabschnitt"
    \newcommand*\myautorefname[1]{%
      \@myautoref\@myautorefname\HyPsd@@autorefname{#1}%
    }
    \def\@myautorefname#1#2#3#4#5\@nil#6\@nil{% modifiziertes \HyPsd@autorefname
      #6#4.\@nil}% Argument #4 = Art und Nummer des Bereiches (siehe oben)
    
    % \mynameref liefert das identische Ergebnis wie \nameref, aber nicht als Hyperlink
    \newcommand*\mynameref[1]{%
      \@myautoref\@mynameref\relax{#1}%
    }
    \def\@mynameref#1#2#3#4#5\@nil#6\@nil{#3}% Argument #3 = Text (siehe oben)
    
    % \myvref verwendet je nach Gliederungsebene \nameref oder \vref
    \newcommand*\myvref[1]{%
      \caption@ifin@list\nonumberlevelslist{\@myautoref\@myautorefname\@myname{#1}}%
    % später ggf. \mynameref statt \nameref verwenden!?
        {\nameref{#1} in \subsectionautorefname~\mysubsection{#1}}{\vref{#1}}%
    }
    \def\@myname#1.#2\@nil{#1} % liefert z.B. "section" oder "paragraph"
    
    \newcommand*\mysubsection[1]{%
      \@myautoref\@myautorefname\@mysubsection{#1}%
    }
    \def\@mysubsection#1.#2.#3.#4.#5\@nil{#2.#3.#4} % liefert z.B. "1.2.3"
    
    \makeatother
    
    %Anwendungsbeispiel: \myautoref{label}
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    
    \newcommand{\myref}[1]{\myautorefname{#1}\myvref{#1}}
    
    
    
    
    \section{Einleitung}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subsection{Sub Einleitung}
    \subsubsection{Sub sub Einleitung}
    \label{subsec:test}
    Test Test Test Test.
    %\newpage
    \paragraph{Para1}
    \label{para:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subparagraph{Sub Para1}
    \label{subpara:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
     
    \begin{figure}[htbp]
    	\centering
    	\caption{Test}
    	\label{fig:test}
    \end{figure}
    \newpage
     
    \section{Zweite Einleitung}
    Hier möchte ich auf \myref{fig:test} verweisen und hier auf \myref{subsec:test} und hier auf \myref{para:test} und hier auf \myref{subpara:test}.
    
    
    \end{document}
    Angehängte Grafiken Angehängte Grafiken
    Geändert von sharpType (05-08-2011 um 11:54 Uhr)

  10. #10
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.604
    Zitat Zitat von sharpType Beitrag anzeigen
    Dann steht da immernoch "Unterabschnitt". Da soll auch dynamisch sein, zb wenn ich den Para in ein Chapter hänge oder worein auch immer.
    Diese Anforderung wußte ich nicht, ist aber auch kein Problem, es muß \@mysubsection dementsprechend gepimpt werden:

    Code:
    \documentclass[ngerman]{scrreprt} 
    \usepackage[latin1]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage[ngerman]{babel}
    %\usepackage{ifthen}
    \usepackage{caption}
    \usepackage{varioref}
    \usepackage{hyperref}
    
    \begin{document}
    
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    
    \setcounter{secnumdepth}{5}
    \makeatletter
    
    % Diese Ebenen sollen nicht nummeriert werden und bei \myref intern \nameref verwenden
    \caption@g@addto@list\nonumberlevelslist{paragraph,subparagraph}
    
    % \othersectionlevelsformat so umdefinieren,
    % daß bei \paragraph und \subparagraph nix ausgegeben wird:
    \let\othersectionlevelsformat@ORI\othersectionlevelsformat
    \renewcommand\othersectionlevelsformat[3]{%
      \caption@ifin@list\nonumberlevelslist{#1}{}{%
          \othersectionlevelsformat@ORI{#1}{#2}{#3}}}
    
    % Hilfsmakro, um aus dem Label in der AUX-Datei den Namen (section,subsection,...)
    % bzw. die Nummer (1.2.3.4,...) oder... zu gewinnen
    % Argument #1 ist ein Makro der Form \def\#1#2#3#4#5\@nil#6\@nil{...}
    %   wobei: #1 = Nummer, z.B. "0.1.1" (Ausgabe von \ref)
    %             #2 = Aktueller Zählerstand, z.B. "1"
    %             #3 = Text, z.B. "Einleitung" (Ausgabe von \nameref)
    %             #4 = Art und Nummer des Bereichs, z.B. "subsection.0.1.1"
    %             #5 = ?
    %             #6 = Argument #2 (siehe unten)
    % Argument #2 ist ein Makro der Form \def\#1...\@nil{...}
    % Argument #3 ist das Label, z.B. "sect:test"
    \newcommand*\@myautoref[3]{% modifiziertes \HyPsd@@@autoref aus hyperref
      \expandafter\ifx\csname r@#3\endcsname\relax
        ??%
      \else
        \expandafter\expandafter\expandafter#1%
            \csname r@#3\endcsname{}{}{}{}\@nil#2\@nil
      \fi
    }
    
    % \myautorefname liefert den Bereichsnamen des Labels, z.B. "Absatz" oder "Unterabschnitt"
    \newcommand*\myautorefname[1]{%
      \@myautoref\@myautorefname\HyPsd@@autorefname{#1}%
    }
    \def\@myautorefname#1#2#3#4#5\@nil#6\@nil{% modifiziertes \HyPsd@autorefname
      #6#4.\@nil}% Argument #4 = Art und Nummer des Bereiches (siehe oben)
    
    % \mynameref liefert das identische Ergebnis wie \nameref, aber nicht als Hyperlink
    \newcommand*\mynameref[1]{%
      \@myautoref\@mynameref\relax{#1}%
    }
    \def\@mynameref#1#2#3#4#5\@nil#6\@nil{#3}% Argument #3 = Text (siehe oben)
    
    \newcommand*\mysubsection[1]{%
      \@myautoref\@myautorefname\@mysubsection{#1}%
    }
    \def\@mysubsection#1.#2.#3.#4.#5.#6\@nil{% liefert z.B. "Abschnitt 1.2.3"
      \ifnum#5=0\relax
        \ifnum#4=0\relax
          \ifnum#3=0\relax
            \chapterautorefname~#2%
          \else
            \sectionautorefname~#2.#3%
          \fi
        \else
          \subsectionautorefname~#2.#3.#4%
        \fi
      \else
        \subsubsectionautorefname~#2.#3.#4.#5%
      \fi}
    
    % \myvref verwendet je nach Gliederungsebene \nameref oder \vref
    \newcommand*\myvref[1]{%
      \caption@ifin@list\nonumberlevelslist{\@myautoref\@myautorefname\@myname{#1}}%
    % später ggf. \mynameref statt \nameref verwenden!?
        {\nameref{#1} in \mysubsection{#1} \vpageref{#1}}{\vref{#1}}%
    }
    \def\@myname#1.#2\@nil{#1} % liefert z.B. "section" oder "paragraph"
    
    \makeatother
    
    %Anwendungsbeispiel: \myautoref{label}
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    
    \newcommand{\myref}[1]{\myautorefname{#1}\myvref{#1}}
    
    
    
    
    \section{Einleitung}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subsection{Sub Einleitung}
    \subsubsection{Sub sub Einleitung}
    \label{subsec:test}
    Test Test Test Test.
    %\newpage
    \paragraph{Para1}
    \label{para:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subparagraph{Sub Para1}
    \label{subpara:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
     
    \begin{figure}[htbp]
    	\centering
    	\caption{Test}
    	\label{fig:test}
    \end{figure}
    \newpage
     
    \section{Zweite Einleitung}
    Hier möchte ich auf \myref{fig:test} verweisen und hier auf \myref{subsec:test} und hier auf \myref{para:test} und hier auf \myref{subpara:test}.
    
    \end{document}
    Und was ich gerade gefunden habe: \vpageref{para:test}.
    Kann man nehmen, dann sind die Texte wie gewünscht. Schön finde ich es aber nicht, weil so bei "Absatz Para1 in Unterunterabschnitt 0.1.1.1 auf der vorherigen Seite" nicht der komplette Text der Hyperlink ist, sondern lediglich "Para1". Bei den anderen Links ist es IMHO auch nicht nett: "Abbildung 0.1 auf der vorherigen Seite" sollte IMHO der Hyperlink sein und nicht nur "0.1 auf der vorherigen Seite".

  11. #11
    Registrierter Benutzer
    Registriert seit
    14.05.2009
    Beiträge
    297


    Echt genial! Genau so wollte ich das haben. Das mit den "unschönen" Hyperlinks kann ich ohne Probleme so hinnehmen, das stört mich gar nicht. Selbst ganz ohne Link wäre nicht sooo schlimm gewesen, es steht ja zur Not auf jeden Fall da in der ausgedruckten Version. Aber hey das ist echt genau so, wie ich es mir vorgestellt habe. Hätte das nicht ohne deine Hilfe hinbekommen, wirklich vielen vielen Dank für deine Mühe und dein Können

    Jetzt muss das nur noch ich sage mal "nichts anderes kaputt machen", wenn ich das in mein Hauptdokument packe. Die Einstellung

    Code:
    \setcounter{secnumdepth}{5}
    könnte vielleicht kritisch werden, aber ich schau mal.

    So mal am Rande: Diesen ganzen Aufwand hat man eigentlich nur, wenn man Para und Subpara NICHT durchnummeriert, wenn ich das jetzt richtig ausprobiert habe. Naja und es steht zusätzlich nun der Name des Paras und der Abschnitt (dynamisch) in welchem dieser drin hängt im Verweis. Das war vorher ja auch nicht so, selbst mit durchnummerierung bis SubPara im Text nicht.

    Aber so ist es viel schöner und so wollt ichs haben! Klasse

  12. #12
    Registrierter Benutzer
    Registriert seit
    26.07.2008
    Ort
    Dresden
    Beiträge
    128
    Ich weiß nicht, ob ich gerade einen Denkfehler habe, aber kann man diesen Aufwand nicht auch umgehen?
    Man kann doch trotz \setcounter{secnumdepth}{5}
    die Ausgabe der Paragraphennummern verhindert, indem man einfach mit
    den Paketen titlesec und titletoc die Formatierung der Paragraphenüberschriften selbst in die Hand nimmt... und ggf einfach die Nummern weglässt?

  13. #13
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.604
    Zitat Zitat von rafael Beitrag anzeigen
    Man kann doch trotz \setcounter{secnumdepth}{5}
    die Ausgabe der Paragraphennummern verhindert, indem man einfach mit
    den Paketen titlesec und titletoc die Formatierung der Paragraphenüberschriften selbst in die Hand nimmt... und ggf einfach die Nummern weglässt?
    Kann gut sein, ich kenne titlesec nicht, noch weiß ich, ob titlesec 100%ig zu KOMA-Script kompatibel ist.

    Damit würde man sich aber sowieso nur die Umdefinition von \othersectionlevelsformat sparen, den ganzen anderen Rest ja nicht.

  14. #14
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.604
    Zitat Zitat von sommerfee Beitrag anzeigen
    Schön finde ich es aber nicht, weil so bei "Absatz Para1 in Unterunterabschnitt 0.1.1.1 auf der vorherigen Seite" nicht der komplette Text der Hyperlink ist, sondern lediglich "Para1". Bei den anderen Links ist es IMHO auch nicht nett: "Abbildung 0.1 auf der vorherigen Seite" sollte IMHO der Hyperlink sein und nicht nur "0.1 auf der vorherigen Seite".
    Da habe ich vergessen, den entscheidenen Schritt weiterzudenken. Da wir \vpageref haben, brauchen wir von varioref nichts weiter, sondern können den (linkfreien!) Text ja komplett selber bilden. Den Hyperlink machen wir dann einfach mit \hyperref:

    Code:
    \documentclass[ngerman]{scrreprt} 
    \usepackage[latin1]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage[ngerman]{babel}
    %\usepackage{ifthen}
    \usepackage{caption}
    \usepackage{varioref}
    \usepackage{hyperref}
    
    \begin{document}
    
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    
    \setcounter{secnumdepth}{5}
    \makeatletter
    
    % Diese Ebenen sollen nicht nummeriert werden und bei \myref intern \nameref verwenden
    \caption@g@addto@list\nonumberlevelslist{paragraph,subparagraph}
    
    % \othersectionlevelsformat so umdefinieren,
    % daß bei \paragraph und \subparagraph nix ausgegeben wird:
    \let\othersectionlevelsformat@ORI\othersectionlevelsformat
    \renewcommand\othersectionlevelsformat[3]{%
      \caption@ifin@list\nonumberlevelslist{#1}{}{%
          \othersectionlevelsformat@ORI{#1}{#2}{#3}}}
    
    % Hilfsmakro, um aus dem Label in der AUX-Datei den Ebenentyp (section,subsection,...)
    % bzw. den Ebenennamen (Abschnitt,Unterabschnitt,...) zu gewinnen
    % Argument #1 ist ein Makro der Form \def\#1...\@nil{...}
    % Argument #2 ist das Label, z.B. "sect:test"
    \newcommand*\@myautoref[2]{% modifiziertes \HyPsd@@@autoref aus hyperref
      \expandafter\ifx\csname r@#2\endcsname\relax
        ??%
      \else
        \expandafter\expandafter\expandafter\@@myautoref
            \csname r@#2\endcsname{}{}{}{}\@nil#1\@nil
      \fi
    }
    \def\@@myautoref#1#2#3#4#5\@nil#6\@nil{% modifiziertes \HyPsd@autorefname
      #6#4.\@nil}% Argument #4 = Art und Nummer des Bereiches
    
    % \myautorefname liefert den Bereichsnamen des Labels (mit Leerzeichen!), z.B. "Absatz " oder "Unterabschnitt "
    \newcommand*\myautorefname[1]{%
      \@myautoref\HyPsd@@autorefname{#1}%
    }
    
    \newcommand*\mysubsection[1]{%
      \@myautoref\@mysubsection{#1}%
    }
    \def\@mysubsection#1.#2.#3.#4.#5.#6\@nil{% liefert z.B. "Abschnitt 1.2.3"
      \ifnum#5=0\relax
        \ifnum#4=0\relax
          \ifnum#3=0\relax
            \chapterautorefname~#2%
          \else
            \sectionautorefname~#2.#3%
          \fi
        \else
          \subsectionautorefname~#2.#3.#4%
        \fi
      \else
        \subsubsectionautorefname~#2.#3.#4.#5%
      \fi}
    
    % \myvref verwendet je nach Gliederungsebene \nameref* oder \autoref*
    % und erzeugt einen Hyperlink-freien Text
    \newcommand*\myvref[1]{%
      \caption@ifin@list\nonumberlevelslist{\@myautoref\@myname{#1}}%
        {\myautorefname{#1}\nameref*{#1} in \mysubsection{#1} \vpageref{#1}}%
        {\autoref*{#1} \vpageref{#1}}%
    }
    \def\@myname#1.#2\@nil{#1} % liefert z.B. "section" oder "paragraph"
    
    \makeatother
    
    %+++++++++++++++++++++++++++++++++++++++ Umgebungsbezeichnungen (automatisch)
    
    % Wie \myvref, aber als Hyperlink
    \newcommand{\myref}[1]{\hyperref[#1]{\myvref{#1}}}
    
    \section{Einleitung}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subsection{Sub Einleitung}
    \subsubsection{Sub sub Einleitung}
    \label{subsec:test}
    Test Test Test Test.
    %\newpage
    \paragraph{Para1}
    \label{para:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
    
    \subparagraph{Sub Para1}
    \label{subpara:test}
    Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.Das ist ein deutscher Beispieltext.
     
    \begin{figure}[htbp]
    	\centering
    	\caption{Test}
    	\label{fig:test}
    \end{figure}
    \newpage
     
    \section{Zweite Einleitung}
    Hier möchte ich auf \myref{fig:test} verweisen und hier auf \myref{subsec:test} und hier auf \myref{para:test} und hier auf \myref{subpara:test}.
    
    \end{document}
    \mynameref habe ich bei der Gelegenheit entfernt; dies gibt es ja schon von hyperref selber angeboten und heißt dort \nameref*. \@myautoref bzw. dessen Verwendung konnte ich so wieder vereinfachen.
    Geändert von sommerfee (06-11-2011 um 09:16 Uhr)

  15. #15
    Registrierter Benutzer
    Registriert seit
    14.05.2009
    Beiträge
    297
    Vielen Dank. Sehr cool!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •