Eigene Sortierung Literaturverzeichnis

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


Gast

Beitrag von Gast »

Denn Sinn und Zweck von defernumbers kannst Du im folgenden Beispiel beobachten. Kompilier es erst mit defernumbers=false (also ohne die Option) und Du bekommst [1], [4]//[2], [3]. Wenn Du es mit defernumbers=true kompilierst, bekommst Du die erwartete Reihenfolge [1], [2]//[3], [4].
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=numeric, defernumbers=false, backend=biber]{biblatex}


\addbibresource{biblatex-examples.bib}


\begin{document}
\cite{sigfridsson,cicero,nussbaum,aksin}
\printbibliography[type=article,title=Paper]
\printbibliography[type=book,title=Bücher]
\end{document}
Normalerweise ist die Nummerierung der Einträge nämlich an ihre Sortierung gekoppelt und zwar so, dass einfach alle Einträge nach ihrer Position in der globalen Sortierung ihre Nummer bekommen. Da im Beispiel die globale Sortierreihenfolge aksin, cicero, nussbaum, sigfridsson ist, ergibt sich ohne defernumbers=true das erste Bild mit den scheinbar unsortierten Zahlen in den Verzeichnissen. Für geteilte Verzeichnisse ist es sinnvoller, die Zahlen nach der Reihenfolge des ersten Auftretens in einem Verzeichnis zu vergeben. Sortiert wird noch immer gleich, aber die Einträge der einzelnen Verzeichnisse werden dann nacheinander abgearbeitet, was im Allgemeinen (wenn keine Doppelbelegung vorhanden ist) dazu führt, dass die Einträge in den einzelnen Verzeichnissen kontinuierlich sind. Also [1], [2]//[3], [4].

Da Du auf meine Nachfrage mit einem Beispiel zu geteilten Verzeichnissen kamst, bei dem die Nummerierung merkwürdig war, dachte ich, dass Dir defernumbers helfen könnte. Denn die Option ist eigentlich fast immer sinnvoll, wenn man geteilte Literaturverzeichnisse im numerischen Stil hat (früher hat biblatex dazu sogar eine meiner Meinung nach sehr sinnvolle Warnung ausgegeben, aber die wurde entfernt: https://github.com/plk/biblatex/issues/493). Wenn ich ganz genau hingesehen hätte, hätte ich natürlich gesehen, dass die Reihenfolge innerhalb der einzelnen Verzeichnisse ([3], [2] und [4], [1]) dafür spricht, dass defernumbers allein nicht gut genug ist. Das ist mir entgangen.

Nun zu Deinem Problem mit der Sortierung: Biber kann die Einträge nur nach Kriterien sortieren, zu denen es Zugang hat. Das sind zuallererst die Daten in der .bib-Datei aber auch die von biblatex zurückgemeldete Zitierreihenfolge. Andere Kriterien sind mir gerade nicht bekannt.

Das heißt, dass es absolut kein Problem ist, die Einträge nur chronologisch aufsteigend oder chronologisch absteigend zu sortieren. Es gibt zum Beispiel die Schemata ynt und ydnt (wenn Du genauere Sortierungen mit Monat und Tag willst, kann man mit DeclareSortingTemplate recht einfach selbst etwas basteln). Mit etwas Trickserei kannst Du auch beklopptere Sortierungen hinbekommen.

Was nicht geht, ist dass Biber Deine Gedanken liest und nach der Liste in kannstmasehns Kopf sortiert. Aber wenn diese Liste auf einem sinnvollen Schema beruht, dass nur auf den Daten in der .bib-Datei basiert, besteht die Chance, dass man das in eine Schema gießen kann.

Wenn Du eine total willkürliche Reihenfolge möchtest, dann kannst Du das im anderen Faden erwähnte sortkey-Feld nutzen (presort würde ich lassen). Bei der Benutzung dieses Feldes ist zu beachten, dass die Sortierung als Zeichenkette (String) stattfindet und nicht als ganze Zahl, wenn man also mit der naheliegenden Methode arbeitet, einfach eine Zahl in das Feld zu schreiben, sollte man an führende Nullen denken, sonst wird 11 nach 1 aber vor 2 einsortiert.
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

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


\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{appleby,
  author  = {Humphrey Appleby},
  title   = {On the Importance of the Civil Service},
  date    = {1980},
  sortkey = {02}
}
@article{sigfridsson,
  author  = {Sigfridsson, Emma and Ryde, Ulf},
  title   = {Comparison of methods for deriving atomic charges from the
             electrostatic potential and moments},
  journal = {Journal of Computational Chemistry},
  date    = 1998,
  volume  = 19,
  number  = 4,
  pages   = {377-395},
  doi     = {10.1002/(SICI)1096-987X(199803)19:4<377::AID-JCC1>3.0.CO;2-P},
  sortkey = {01},
}
@book{elk,
  author  = {Anne Elk},
  title   = {A Theory on Brontosauruses},
  date    = {1972},
  sortkey = {04}
}
@book{uthor,
  author  = {Alice Uthor},
  title   = {Title},
  date    = {1960},
  sortkey = {03}
}
\end{filecontents}

\addbibresource{\jobname.bib}


\begin{document}
\nocite{*}
\printbibliography
\end{document}
Wer auf die führenden Nullen verzichten möchte, muss sich was eigenes basteln
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\begin{filecontents*}{sortkeyint.dbx}
\DeclareDatamodelFields[type=field, datatype=integer]{sortkeyint}
\DeclareDatamodelEntryfields{sortkeyint}
\end{filecontents*}

\usepackage[style=numeric, backend=biber, datamodel=sortkeyint]{biblatex}

\DeclareSortingTemplate{sortkeyint}{
  \sort{
    \field{presort}
  }
  \sort[final]{
    \field{sortkeyint}
  }
}

\ExecuteBibliographyOptions{sorting=sortkeyint}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{appleby,
  author     = {Humphrey Appleby},
  title      = {On the Importance of the Civil Service},
  date       = {1980},
  sortkeyint = {2}
}
@article{sigfridsson,
  author     = {Sigfridsson, Emma and Ryde, Ulf},
  title      = {Comparison of methods for deriving atomic charges from the
                electrostatic potential and moments},
  journal    = {Journal of Computational Chemistry},
  date       = 1998,
  volume     = 19,
  number     = 4,
  pages      = {377-395},
  doi        = {10.1002/(SICI)1096-987X(199803)19:4<377::AID-JCC1>3.0.CO;2-P},
  sortkeyint = {1},
}
@book{elk,
  author      = {Anne Elk},
  title       = {A Theory on Brontosauruses},
  date        = {1972},
  sortkeyint  = {04}
}
@book{uthor,
  author     = {Alice Uthor},
  title      = {Title},
  date       = {1960},
  sortkeyint = {03}
}
@book{elf,
  author     = {Editha Lf},
  title      = {Albion},
  date       = {2000},
  sortkeyint = {11}
}
\end{filecontents}

\addbibresource{\jobname.bib}


\begin{document}
\nocite{*}
\printbibliography
\end{document}
Im Allgemeinen geht sortkey also. Nur stellt sich heraus, dass in dem von Dir im Beispiel verwendeten Schema sorting=debug das Feld gerade keine Rolle spielt (ebenso wenig wie presort), denn da haben wir
\DeclareSortingTemplate{debug}{
  \sort{
    \field{entrykey}
  }
}
Nun schreibst Du aber
kannstmasehn hat geschrieben:Für die Sortierung ist die Ausgabeform ja nicht relevant. Es ging erstmal darum, dass die Reihenfolge manipulierbar ist, ohne dass etwas an den Quelldaten verändert wird.
Das geht dann doch etwas schwieriger, da dann sortkey ja rausfällt. Man kann sich dann, wie bereits von einem anderen Gast gestern (20:12) erwähnt, mit sorting=none behelfen, indem man zum Beispiel die Liste in der gewünschten Reihenfolge \nocited.
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

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

\addbibresource{biblatex-examples.bib}


\begin{document}
\nocite{sigfridsson,worman}
\printbibliography

\newrefsection
\nocite{worman,sigfridsson}
\printbibliography
\end{document}
Du siehst, dass in den unterschiedlichen Abschnitten die Verzeichnisse anders sortiert sind, aber beide dieselben unveränderten .bib-Daten nutzen.

Theoretisch könnte man den sortkey auch mit einer Biber-Sourcemap spontan im .tex-Dokument erzeugen, ohne die .bib-Daten zu ändern, aber da stellst sich mir die Frage, was der Vorteil gegenüber \nocite wäre. Da kommt es dann stark auf Deinen exakten Anwendungsfall an.

kannstmasehn
Forum-Century
Forum-Century
Beiträge: 165
Registriert: Mo 5. Mai 2014, 16:55

Beitrag von kannstmasehn »

\begin{filecontents}{\jobname.bib}
	@book{Labov1972,
		Address = {Philadelphia},
		Author = {William Labov},
		Publisher = {University of Pennsylvania Press},
		Title = {Sociolinguistic Patterns},
		Year = {1972},
		presort = {101}
	}
	
	@book{Chomsky1957,
		Address = {The Hague},
		Author = {Noam Chomsky},
		Publisher = {Mouton},
		Title = {Syntactic Structures},
		Year = {1957},
		presort = {100}
	}
\end{filecontents}

\documentclass[a4paper,11pt]{article}
\usepackage[
style=numeric
]{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
	
	\nocite{*}
	
	\printbibliography
\end{document}
Damit funktioniert es einigermaßen, jedoch wird die bibfile nicht mehr aktualisiert, nachdem sie einmal erstellt wurde, was bedeutet, dass ich sie jedes mal löschen muss.

Zur manuellen Sortierung: Es steckt leider kein Schema dahinter, lediglich die Art und Weise der Quellen, sprich Paper, Vorträge, etc. Hinzu kommt, dass z.B. Jahr und Autor nahezu überall identisch sind. Und für 10 Quellen muss nicht unbedingt ein Logarithmus her, wenn ich kurz einen Parameter festlegen kann.

Danke trotzdem.

Gast

Beitrag von Gast »

kannstmasehn hat geschrieben:Damit funktioniert es einigermaßen, jedoch wird die bibfile nicht mehr aktualisiert, nachdem sie einmal erstellt wurde
Du meinst, die filecontents-Umgebung überschreibt keine bereits existierenden Dateien? Das sollte in jeder ausführlichen LaTeX-Einführung erwähnt sein und wird auch in der Minimalbeispiel-Anleitung erklärt! Dort wird außerdem erklärt, wie man das ganz einfach ändern kann, und welche Gefahr dann von einem Minimalbeispiel ausgeht, bei dem sich der Fragesteller nicht an die Empfehlung hält, Minimalbeispiele in einem neuen Verzeichnis mit einer Kopie des Originals zu erstellen und Minimalbeispiele auch immer in einem neuen Verzeichnis zu testen. Es lohnt sich also wirklich, die Minimalbeispiel-Anleitung mal gründlich zu lesen (und sich daran zu halten).[/quote]

kannstmasehn
Forum-Century
Forum-Century
Beiträge: 165
Registriert: Mo 5. Mai 2014, 16:55

Beitrag von kannstmasehn »

Anonymous hat geschrieben:Denn Sinn und Zweck von defernumbers kannst Du im folgenden Beispiel beobachten. Kompilier es erst mit defernumbers=false (also ohne die Option) und Du bekommst [1], [4]//[2], [3]. Wenn Du es mit defernumbers=true kompilierst, bekommst Du die erwartete Reihenfolge [1], [2]//[3], [4].
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=numeric, defernumbers=false, backend=biber]{biblatex}


\addbibresource{biblatex-examples.bib}


\begin{document}
\cite{sigfridsson,cicero,nussbaum,aksin}
\printbibliography[type=article,title=Paper]
\printbibliography[type=book,title=Bücher]
\end{document}
Normalerweise ist die Nummerierung der Einträge nämlich an ihre Sortierung gekoppelt und zwar so, dass einfach alle Einträge nach ihrer Position in der globalen Sortierung ihre Nummer bekommen. Da im Beispiel die globale Sortierreihenfolge aksin, cicero, nussbaum, sigfridsson ist, ergibt sich ohne defernumbers=true das erste Bild mit den scheinbar unsortierten Zahlen in den Verzeichnissen. Für geteilte Verzeichnisse ist es sinnvoller, die Zahlen nach der Reihenfolge des ersten Auftretens in einem Verzeichnis zu vergeben. Sortiert wird noch immer gleich, aber die Einträge der einzelnen Verzeichnisse werden dann nacheinander abgearbeitet, was im Allgemeinen (wenn keine Doppelbelegung vorhanden ist) dazu führt, dass die Einträge in den einzelnen Verzeichnissen kontinuierlich sind. Also [1], [2]//[3], [4].

Da Du auf meine Nachfrage mit einem Beispiel zu geteilten Verzeichnissen kamst, bei dem die Nummerierung merkwürdig war, dachte ich, dass Dir defernumbers helfen könnte. Denn die Option ist eigentlich fast immer sinnvoll, wenn man geteilte Literaturverzeichnisse im numerischen Stil hat (früher hat biblatex dazu sogar eine meiner Meinung nach sehr sinnvolle Warnung ausgegeben, aber die wurde entfernt: https://github.com/plk/biblatex/issues/493). Wenn ich ganz genau hingesehen hätte, hätte ich natürlich gesehen, dass die Reihenfolge innerhalb der einzelnen Verzeichnisse ([3], [2] und [4], [1]) dafür spricht, dass defernumbers allein nicht gut genug ist. Das ist mir entgangen.

Nun zu Deinem Problem mit der Sortierung: Biber kann die Einträge nur nach Kriterien sortieren, zu denen es Zugang hat. Das sind zuallererst die Daten in der .bib-Datei aber auch die von biblatex zurückgemeldete Zitierreihenfolge. Andere Kriterien sind mir gerade nicht bekannt.

Das heißt, dass es absolut kein Problem ist, die Einträge nur chronologisch aufsteigend oder chronologisch absteigend zu sortieren. Es gibt zum Beispiel die Schemata ynt und ydnt (wenn Du genauere Sortierungen mit Monat und Tag willst, kann man mit DeclareSortingTemplate recht einfach selbst etwas basteln). Mit etwas Trickserei kannst Du auch beklopptere Sortierungen hinbekommen.

Was nicht geht, ist dass Biber Deine Gedanken liest und nach der Liste in kannstmasehns Kopf sortiert. Aber wenn diese Liste auf einem sinnvollen Schema beruht, dass nur auf den Daten in der .bib-Datei basiert, besteht die Chance, dass man das in eine Schema gießen kann.

Wenn Du eine total willkürliche Reihenfolge möchtest, dann kannst Du das im anderen Faden erwähnte sortkey-Feld nutzen (presort würde ich lassen). Bei der Benutzung dieses Feldes ist zu beachten, dass die Sortierung als Zeichenkette (String) stattfindet und nicht als ganze Zahl, wenn man also mit der naheliegenden Methode arbeitet, einfach eine Zahl in das Feld zu schreiben, sollte man an führende Nullen denken, sonst wird 11 nach 1 aber vor 2 einsortiert.
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

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


\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{appleby,
  author  = {Humphrey Appleby},
  title   = {On the Importance of the Civil Service},
  date    = {1980},
  sortkey = {02}
}
@article{sigfridsson,
  author  = {Sigfridsson, Emma and Ryde, Ulf},
  title   = {Comparison of methods for deriving atomic charges from the
             electrostatic potential and moments},
  journal = {Journal of Computational Chemistry},
  date    = 1998,
  volume  = 19,
  number  = 4,
  pages   = {377-395},
  doi     = {10.1002/(SICI)1096-987X(199803)19:4<377::AID-JCC1>3.0.CO;2-P},
  sortkey = {01},
}
@book{elk,
  author  = {Anne Elk},
  title   = {A Theory on Brontosauruses},
  date    = {1972},
  sortkey = {04}
}
@book{uthor,
  author  = {Alice Uthor},
  title   = {Title},
  date    = {1960},
  sortkey = {03}
}
\end{filecontents}

\addbibresource{\jobname.bib}


\begin{document}
\nocite{*}
\printbibliography
\end{document}
Wer auf die führenden Nullen verzichten möchte, muss sich was eigenes basteln
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\begin{filecontents*}{sortkeyint.dbx}
\DeclareDatamodelFields[type=field, datatype=integer]{sortkeyint}
\DeclareDatamodelEntryfields{sortkeyint}
\end{filecontents*}

\usepackage[style=numeric, backend=biber, datamodel=sortkeyint]{biblatex}

\DeclareSortingTemplate{sortkeyint}{
  \sort{
    \field{presort}
  }
  \sort[final]{
    \field{sortkeyint}
  }
}

\ExecuteBibliographyOptions{sorting=sortkeyint}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{appleby,
  author     = {Humphrey Appleby},
  title      = {On the Importance of the Civil Service},
  date       = {1980},
  sortkeyint = {2}
}
@article{sigfridsson,
  author     = {Sigfridsson, Emma and Ryde, Ulf},
  title      = {Comparison of methods for deriving atomic charges from the
                electrostatic potential and moments},
  journal    = {Journal of Computational Chemistry},
  date       = 1998,
  volume     = 19,
  number     = 4,
  pages      = {377-395},
  doi        = {10.1002/(SICI)1096-987X(199803)19:4<377::AID-JCC1>3.0.CO;2-P},
  sortkeyint = {1},
}
@book{elk,
  author      = {Anne Elk},
  title       = {A Theory on Brontosauruses},
  date        = {1972},
  sortkeyint  = {04}
}
@book{uthor,
  author     = {Alice Uthor},
  title      = {Title},
  date       = {1960},
  sortkeyint = {03}
}
@book{elf,
  author     = {Editha Lf},
  title      = {Albion},
  date       = {2000},
  sortkeyint = {11}
}
\end{filecontents}

\addbibresource{\jobname.bib}


\begin{document}
\nocite{*}
\printbibliography
\end{document}
Im Allgemeinen geht sortkey also. Nur stellt sich heraus, dass in dem von Dir im Beispiel verwendeten Schema sorting=debug das Feld gerade keine Rolle spielt (ebenso wenig wie presort), denn da haben wir
\DeclareSortingTemplate{debug}{
  \sort{
    \field{entrykey}
  }
}
Nun schreibst Du aber
kannstmasehn hat geschrieben:Für die Sortierung ist die Ausgabeform ja nicht relevant. Es ging erstmal darum, dass die Reihenfolge manipulierbar ist, ohne dass etwas an den Quelldaten verändert wird.
Das geht dann doch etwas schwieriger, da dann sortkey ja rausfällt. Man kann sich dann, wie bereits von einem anderen Gast gestern (20:12) erwähnt, mit sorting=none behelfen, indem man zum Beispiel die Liste in der gewünschten Reihenfolge \nocited.
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

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

\addbibresource{biblatex-examples.bib}


\begin{document}
\nocite{sigfridsson,worman}
\printbibliography

\newrefsection
\nocite{worman,sigfridsson}
\printbibliography
\end{document}
Du siehst, dass in den unterschiedlichen Abschnitten die Verzeichnisse anders sortiert sind, aber beide dieselben unveränderten .bib-Daten nutzen.

Theoretisch könnte man den sortkey auch mit einer Biber-Sourcemap spontan im .tex-Dokument erzeugen, ohne die .bib-Daten zu ändern, aber da stellst sich mir die Frage, was der Vorteil gegenüber \nocite wäre. Da kommt es dann stark auf Deinen exakten Anwendungsfall an.
Oh, deinen Post habe ich komplett übersehen, hat mir sehr weitergeholfen.

Habe mein Beispiel angepasst und nun funktioniert es. So sieht es am Ende aus:
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

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


\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
	@book{appleby,
		author  = {Humphrey Appleby},
		title   = {On the Importance of the Civil Service},
		date    = {1980},
		sortkey = {03},
		keywords  = {vortrag},
	}
	@article{sigfridsson,
		author  = {Sigfridsson, Emma and Ryde, Ulf},
		title   = {Comparison of methods for deriving atomic charges from the
			electrostatic potential and moments},
		journal = {Journal of Computational Chemistry},
		date    = 1998,
		volume  = 19,
		number  = 4,
		pages   = {377-395},
		doi     = {10.1002/(SICI)1096-987X(199803)19:4<377::AID-JCC1>3.0.CO;2-P},
		sortkey = {04},
		keywords  = {vortrag},
	}
	@book{elk,
		author  = {Anne Elk},
		title   = {A Theory on Brontosauruses},
		date    = {1972},
		sortkey = {02},
		keywords  = {bericht},
	}
	@book{uthor,
		author  = {Alice Uthor},
		title   = {Title},
		date    = {1960},
		sortkey = {01},
		keywords  = {test},

	}
\end{filecontents}

\addbibresource{\jobname.bib}

\begin{document}
	\nocite{*}
	
	\printbibliography[heading=subbibliography,keyword=test, title={Tests}]
	\printbibliography[heading=subbibliography,keyword=bericht, title={Berichte}]
	\printbibliography[heading=subbibliography,keyword=vortrag, title={Vorträge}]
	
\end{document}
PS: Es ist echt schwierig verschiedene Beiträge von unterschiedlichen Gästen zu trennen.

Gast

Beitrag von Gast »

kannstmasehn hat geschrieben:Es ist echt schwierig verschiedene Beiträge von unterschiedlichen Gästen zu trennen.
Gewöhne Dir einfach an, alle Beiträge zu lesen und dich dabei auf den Inhalt statt auf die Person zu konzentrieren.

Antworten