Anzeige:
Ergebnis 1 bis 15 von 17

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

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  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.603
    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.603
    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 11: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}

  6. #6
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    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.)

Lesezeichen

Berechtigungen

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