von MoeWe » Sa 7. Mär 2020, 10:10
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
\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
\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}
Soweit es [tt]biblatex[/tt] 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 [tt]biblatex[/tt] verankert und auch bei BibTeX-basierten Lösungen und [tt]natbib[/tt] so.
[b]Es gibt eine sehr hacky Möglichkeit, die ich absolut [i]nicht[/i] empfehlen kann[/b]. Sie basiert darauf, dass die Zitate durch ein externes Programm (Biber oder BibTeX) bereitgestellt werden. Daher schreibt [tt]biblatex[/tt] die gewünschten Zitate in eine Hilfsdatei. Dies geschieht normalerweise sofort mit [tt]\immediate\write[/tt]. Aber wir können versuchen, stattdessen [tt]\write[/tt] zu nutzen, das den Schreibvorgang verzögert, bis die Umgebung des [tt]\write[/tt]-Befehls tatsächlich auf einer Seite auftaucht ([i]shipout[/i]). Das bedeutet aber, dass wir sehr genau aufpassen müssen, dass alle involvierten Makros noch die richtige Definition haben (da das [tt]\write[/tt] 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.
[b]Machbarkeitsstudie: Nutzung auf eigene Gefahr[/b]
[code]\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}[/code]
Da ich nicht glaube, dass es generell möglich ist, [tt]biblatex[/tt] 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 [tt]biblatex[/tt] mit verzögertem Schreiben nutzen kann, dann bin ich ganz Ohr.
Die gleiche Idee geht übrigens auch bei [p]natbib[/p].
[b]Machbarkeitsstudie: Eltern haften für ihre Kinder[/b]
[code]\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}[/code]