Quellen-Nr. in Abbildungsunterschrift niedriger als im Text

Erstellung eines Literaturverzeichnisses mit BibTeX, Biber, BibLaTeX und Co.
Micha

Quellen-Nr. in Abbildungsunterschrift niedriger als im Text

Beitrag von Micha »

Hallo,

ich verwende Biblatex mit Citavi für meine Quellen.
Zu folgendem Problem konnte ich bisher keine Lösung finden:

Nach Abstatz 1 füge ich eine Abbildung ein. In der caption dieser Abbildung verweise ich auf Quelle A. Im nächsten Abschnitt zitiere ich Quelle B. So sieht der Code aus:

Abschnitt 1
Abbildung \cite{A}
Abschnitt 2 \cite{B}

Als float landet die Abbildung dann (korrekt) auf der nächsten Seite, nach Abschnitt 2. Dadurch ergibt sich jedoch im PDF eine falsche Reihenfolge der Quellennummern, nämlich:

Abschnitt 1
Abschnitt 2 [2]
Abbildung [1]

Natürliche könnte ich nun manuell Absatz 2 vor die Abbildung im Code schieben, aber gerade solche manuellen Eingriffe möchte ich ja mit Latex vermeiden.

Gibt es eine Möglichkeit, dass Latex automatisch erkennt, dass die Reihenfolge im PDF anders ist, als im Code? Bzw. eine Möglichkeit, dass die Zuordnung anhand der Reihenfolge im kompilierten File erfolgt?

Schon mal herzlichen Dank!
Micha

Gast

Beitrag von Gast »

Wie wäre es mit einem Minimalbeispiel?

Micha^

Beitrag von Micha^ »

Ich habe mein bestes gegeben, um ein halbwegs vernünftiges Minimalbeispiel zu generieren. Hier ist die Quellenreihenfolge bei [1] und [2] korrekt, allerdings kommt [4] vor [3].

Code: Alles auswählen

\documentclass[fontsize=12pt,DIV=12,BCOR=2cm,a4paper,bibtotoc]{scrreprt}
\usepackage[style=ieee]{biblatex}
\addbibresource{literatur_biblatex.bib}
\usepackage{graphicx}

\begin{document}
\chapter{Minimalbeispiel}
\section{korrekte Reihenfolge}
Absatz 1 \par
\begin{figure}[h!bt]
	\centering
	\includegraphics[width=\textwidth, height=10cm]{1.PNG}
	\caption{Bildunterschrift \cite{AuthorA.2007}}
\end{figure}
Absatz 2 \cite{AuthorB.2007} \par

\section{falsche Reihenfolge} 
%wenn Bild  zu groß, um auf gleicher Seite angezeigt zu werden:
Absatz 1 \par
\begin{figure}[h!bt]
	\centering
	\includegraphics[width=\textwidth, height=10cm]{1.PNG}
	\caption{Bildunterschrift \cite{AuthorA2.2007}}
\end{figure}
Absatz 2 \cite{AuthorB2.2007} \par

\printbibliography

\end{document}
Beispiel-.bib-Datei:

Code: Alles auswählen

@article{AuthorA.2007,
 author = {AuthorA, A.},
 year = {2007},
 title = {Article Title}
}

@article{AuthorB.2007,
 author = {AuthorB, B.},
 year = {2007},
 title = {Article Title}
}

@article{AuthorA2.2007,
 author = {AuthorA2, A.},
 year = {2007},
 title = {Article Title}
}

@article{AuthorB2.2007,
 author = {AuthorB2, B.},
 year = {2007},
 title = {Article Title}
}

Gast

Beitrag von Gast »

Ich würde generell die Literaturverweise im Abbildungsverzeichnis weglassen, also beispielsweise

Code: Alles auswählen

\caption[Bildunterschrift]{Bildunterschrift \cite{AuthorA.2007}}
verwenden. Jedenfalls sind Literaturverweise, Fußnoten etc. in Verzeichnissen wie dem Abbildungsverzeichnis eher unüblich.

BTW: Du solltest einmal einen Blick in die log-Datei werfen. Dort wird vor einer veralteten Option gewarnt und auch gleich erklärt, wie man es besser macht. Das ist insofern relevant, als der KOMA-Script-Autor angekündigt hat, dass er obsoletes aus KOMA-Script entfernen will.

MoeWe
Forum-Guru
Forum-Guru
Beiträge: 264
Registriert: Fr 30. Aug 2019, 15:35
Kontaktdaten:

Beitrag von MoeWe »

Soweit es biblatex betrifft, kannst Du davon ausgehen, dass Dein Code linear (monoton?) von oben nach unten gelesen und ausgeführt wird. Das bedeutet, dass die Reihenfolge der Quellen im Code relevant ist und nicht die in der Ausgabe. Das ist sehr tief in biblatex verankert und auch bei BibTeX-basierten Lösungen und natbib so.

Es gibt eine sehr hacky Möglichkeit, die ich absolut nicht empfehlen kann. Sie basiert darauf, dass die Zitate durch ein externes Programm (Biber oder BibTeX) bereitgestellt werden. Daher schreibt biblatex die gewünschten Zitate in eine Hilfsdatei. Dies geschieht normalerweise sofort mit \immediate\write. Aber wir können versuchen, stattdessen \write zu nutzen, das den Schreibvorgang verzögert, bis die Umgebung des \write-Befehls tatsächlich auf einer Seite auftaucht (shipout). Das bedeutet aber, dass wir sehr genau aufpassen müssen, dass alle involvierten Makros noch die richtige Definition haben (da das \write potenziell an einer anderen Stelle ausgeführt wird, als der Rest des Codes). Das habe ich für einen Zähler nicht hinbekommen, daher habe ich ihn weggelassen. Das macht hier tatsächlich nichts aus, ist aber keine gute Idee. Du solltest daher den folgenden Code eher als Machbarkeitsstudie verstehen und nicht einfach so in Dein echtes Dokument übernehmen.

Machbarkeitsstudie: Nutzung auf eigene Gefahr

Code: Alles auswählen

\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage{graphicx}
\usepackage{lipsum}

\usepackage[style=numeric, sorting=none, backend=biber]{biblatex}

\makeatletter
\protected\def\blx@auxwrite@nonimmediate#1#2#3{%
  \if@filesw
    \begingroup
    \blx@safe@actives
    \let\protect\string
    #2%
    \edef\blx@tempa{\write#1{#3}}%
    \blx@tempa
    \endgroup
  \fi}

% das ist KEINE gute Idee
\protected\def\blx@bibreq#1{%
  \begingroup
  \blx@xmlsanitizeafter{\def\blx@tempa}{#1}%
  \let\blx@tempb\@empty
  % Only output as \nocited if a key wasn't also directly \cite'd
  % Since citekey output is sequential as cites are read, the .bcf might contain
  % duplicate keys with differring nocite attributes if \nocite{X} and \cite{X} both occur
  % but biber deals with this and priorities \cites
  \ifboolexpr{test {\ifinlist{#1}\blx@nocites}
              and
              not test {\ifinlist{#1}\blx@directcites}}
    {\def\blx@tempb{ nocite="1"}}
    {}%
  % citeall is always order "0" - this makes no real difference as biber
  % ignores all other citekeys in the section if citeall is present
  \ifstrequal{*}{#1}
    {\blx@auxwrite@nonimmediate\blx@bcfout{}{\blx@xml@citekey{\blx@tempa}{\blx@tempb}{0}}}
    {\blx@auxwrite@nonimmediate\blx@bcfout{}{\blx@xml@citekey{\blx@tempa}{\blx@tempb}{1}}}%
  % statt "1" müssten wir hier eigentlich
  % \expandafter\the\csname blx@sectionciteorder@\the\c@refsection\endcsname
  % haben, aber der Zähler hat dann den falschen Wert, da seine
  % Berechnung nicht verzögert wird...
  \endgroup}
\makeatother

\addbibresource{biblatex-examples.bib}


\begin{document}
\lipsum[1-2]
\begin{figure}[b]
\centering
\includegraphics[width=0.5\textwidth]{example-image}
\caption[Dolor]{Dolor \autocite{sigfridsson}}
\end{figure}

\lipsum[3] \autocite{worman}
\end{document}
Da ich nicht glaube, dass es generell möglich ist, biblatex auf verzögertes Schreiben umzustellen, bleibt mir nur, Dir die zugegebenermaßen unattraktive manuelle Umsortierung Deines Quellcodes vorzuschlagen. Oder Du nimmst einen Zitierstil, bei dem die Zitierreihenfolge egal ist.

Wenn jemand eine Idee hat, wie man biblatex mit verzögertem Schreiben nutzen kann, dann bin ich ganz Ohr.

Die gleiche Idee geht übrigens auch bei natbib.
Machbarkeitsstudie: Eltern haften für ihre Kinder

Code: Alles auswählen

\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage{graphicx}
\usepackage{lipsum}

\usepackage[numbers]{natbib}

\makeatletter
\renewcommand\nocite[1]{\@bsphack
  \@for\@citeb:=#1\do{%
    \@safe@activestrue
    \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
    \@safe@activesfalse
    \if@filesw
      \expandafter\write\expandafter\@auxout
        \expandafter{\expandafter\string\expandafter\citation\expandafter{\@citeb}}%
    \fi
    \if*\@citeb\else
    \@ifundefined{b@\@citeb\@extra@b@citeb}{%
       \NAT@citeundefined \PackageWarning{natbib}%
       {Citation `\@citeb' undefined}}{}\fi}%
  \@esphack}

\renewcommand\NAT@sort@cites[1]{%
  \let\NAT@cite@list\@empty
  \@for\@citeb:=#1\do{\expandafter\NAT@star@cite\@citeb\@@}%
  \if@filesw
    \expandafter\write\expandafter\@auxout
      \expandafter{\expandafter\string\expandafter\citation\expandafter{\NAT@cite@list}}%
  \fi
  \@ifnum{\NAT@sort>\z@}{%
    \expandafter\NAT@sort@cites@\expandafter{\NAT@cite@list}%
  }{}%
}%
\makeatother


\begin{document}
\lipsum[1-2]
\begin{figure}[b]
\centering
\includegraphics[width=0.5\textwidth]{example-image}
\caption[Dolor]{Dolor \cite{sigfridsson}}
\end{figure}

\lipsum[3] \cite{worman}

\bibliographystyle{unsrtnat}
\bibliography{biblatex-examples}
\end{document}

Micha

Beitrag von Micha »

Danke, MoeWe, für deine Machbarkeitsstudie. Fortgeschrittene dürfen das gerne mal ausprobieren. :wink:
Ich als Anfänger traue mich das noch nicht und werde deshalb die Reihenfolge in der finalen Version manuell überprüfen und ggf. anpassen müssen.

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4025
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

Grundsätzlich sind Gleitumgebungen unabhängige Objekte. Du weißt nicht, wann der Leser sie sich anschaut und wo sie platziert werden. Das bedeutet, dass es nie wirklich möglich ist, fortlaufende Zähler "richtig" mit dem Haupttext zu synchronisieren. Es gibt oft einen Konflikt zwischen der visuellen Reihenfolge und der (wahrscheinlichen) Lesereihenfolge:

Wenn du die Gleitumgebung dort hast, wo sie referenziert wird, dann wird das wahrscheinlich so gelesen

wie in Abbildung 1 gezeigt -> gehe zu Abbildung 1, cite [1] -> zurück zum Text cite [2].

D.h. die Reihenfolge der cite-Nummer ist erstmal völlig in Ordnung.

Wenn aber so gelesen wird:

wie in Abbildung 1 gezeigt (schaue ich später erstmal weiterlesen) zurück zum Text cite [2].

Dann ist man vielleicht irritiert, wo cite [1] ist (falls man überhaupt darauf achtet).

M.E. gibt es dafür keine vernünftige, logische Lösung. Entweder verzichte auf citeorder, oder lebe mit den gelegentlichen Sprüngen.

@moewe: "Wenn jemand eine Idee hat, wie man biblatex mit verzögertem Schreiben nutzen kann, dann bin ich ganz Ohr."

Nun, ich würde nicht wirklich versuchen, alles zu verzögern. Es reicht doch ein \(z)label.

Antworten