labelnamepunct vs. nametitledelim

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


Felix.Herauten
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 63
Registriert: Do 3. Mär 2022, 21:23

labelnamepunct vs. nametitledelim

Beitrag von Felix.Herauten »

Hallo,

ich möchte in meinem Literaturverzeichnis, das ich in biblatex mit authoryear-icomp formatiert habe nach Autor Jahr und vor dem Titel statt des standardmäßigen Punkts einen Doppelpunkt haben. Also statt "Müller, Tim (2000). Latex. [...]" brauche ich "Müller, Tim (2000): Latex. [...]"

Ich habe dazu im Netz den Befehl \labelnamepunct gefunden und damit funktioniert es auch (als Beispiel zeigte ich das an dem MWE, das hier im Forum als Beispiel gegeben wurde):
\begin{filecontents*}[force]{Bibliographie.bib}
@ARTICLE{Beispiel2010,
  author = {Max Muster},
  title = {goLaTeX Wiki-Beispiel},
  journal = {LaTeX Journal},
  year = {2010},
  pages = {1-3},
  timestamp = {2010.03.21},
  url = {http://www.golatex.de/wiki/index.php?title=Minimalbeispiel}
} 
\end{filecontents*}
\documentclass{scrartcl}  
\usepackage[backend=biber,style=authoryear-icomp]{biblatex}
\addbibresource{Bibliographie.bib} 

%% Hier kommt der von mir ergänzte Befehl für das gewünschte Ereignis.
\renewcommand{\labelnamepunct}{: }

\begin{document}
Dieser Beispieltext zitiert \cite{Beispiel2010} einen Artikel aus der 
Bib-Datei, welche in diesem Dokument angelegt wurde.

\printbibliography
\end{document}
Jetzt habe ich aber weiter recherchiert, weil ich nicht nur einfach Befehle abtippen will, sondern auch verstehen will, was ich da mache. Und da habe ich in der Biblatex-Anleitung auf S. 124 gefunden, dass \labelnamepunct veraltet ist und nicht mehr verwendet werden sollte. Stattdessen solle man besser \nametitledelim verwenden (S. 126). Und dort steht explizit:
In Autor-Jahr-Bibliografiestilen wird dieses Trennzeichen nach dem Autor/Editor und dem Jahr uvor dem Titel platziert. Die Standarddefinition in Bibliografien ist der jetzt veraltete \labelnamepunct und ist ansonsten ein Komma plus Zwischenwort-Leerzeichen.
(Quelle: Biblatex-Benutzerhandbuch, 3.15b, 28. Mai 2021)

Also müsste bei authoryear das gewünschte Ergebnis genauso damit erreichbar sein.

Da ich 1. immer dazulernen möchte und 2. das modernere nehmen will, da ich Angst habe, dass das veraltete irgendwann mit modernen Paketen, auf die ich nicht verzichten kann, kollidieren könnte, habe ich natürlich auch das ausprobiert. Aber damit funktioniert es leider nicht und es erscheint dennoch die Voreinstellung des Punkts statt des Doppelpunkts:
\begin{filecontents*}[force]{Bibliographie.bib}
@ARTICLE{Beispiel2010,
  author = {Max Muster},
  title = {goLaTeX Wiki-Beispiel},
  journal = {LaTeX Journal},
  year = {2010},
  pages = {1-3},
  timestamp = {2010.03.21},
  url = {http://www.golatex.de/wiki/index.php?title=Minimalbeispiel}
} 
\end{filecontents*}
\documentclass{scrartcl}  
\usepackage[backend=biber,style=authoryear-icomp]{biblatex}
\addbibresource{Bibliographie.bib} 

%% Hier kommt der von mir ergänzte Befehl für das gewünschte Ereignis.
\renewcommand{\nametitledelim}{: }

\begin{document}
Dieser Beispieltext zitiert \cite{Beispiel2010} einen Artikel aus der 
Bib-Datei, welche in diesem Dokument angelegt wurde.

\printbibliography
\end{document}
Mache ich da einen Fehler? Oder habe ich die Biblatex-Anleitung in dem Punkt falsch verstanden?

Mit dem veralteten Befehl funktioniert es zwar. Aber wie gesagt, habe ich Angst, dass es irgendwann Probleme geben könnte. Und zweitens will ich ja auch verstehen, warum das, was man eigentlich stattdessen verwenden sollte, bei mir nicht funktioniert.

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2456
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Re: labelnamepunct vs. nametitledelim

Beitrag von Bartman »

In der Beschreibung zu \labelnamepunct wird nicht nur der Befehl \nametitledelim genannt, sondern auch dessen Kontextsensitivität angesprochen. Ein dort ebenfalls enthaltener Querverweis führt den Leser zu dem passenden Abschnitt mit Beispielen.

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

Re: labelnamepunct vs. nametitledelim

Beitrag von MoeWe »

Der Vorteil von context sensitive delimiters ist, dass sie je nach Kontext unterschiedlich definiert werden können. Wenn es für den aktuellen Kontext keine Definition gibt, dann wird auf die kontexlose Globaldefinition zurückgegriffen. Definiert werden die delimiter mit \DeclareDelimFormat[<context>]{<delim>}{<definition>} (dabei ist <context> das optionale Argument und kann weggelassen werden, wenn das Argument nicht vorhanden ist, wird die Globaldefinition überschrieben) und idealerweise nicht mit \renewcommand. Aus historischen Gründen ist aber \renewcommand{\<delim>}{<def>} äquivalent zu \DeclareDelimFormat{<delim>}{<def>}, also einer Definition für den globalen Kontext.

Tatsächlich ist es so, dass nametitledelim (vor allem aus Abwärtskompatibilitätsgründen) unterschiedliche Definitionen für unterschiedliche Kontexte hat
biblatex-Dokumentation zu nametitledelim hat geschrieben: The default definition inside bibliographies is the now deprecated
\labelnamepunct (for backwrds compatibility reasons) and is a comma plus an
interword space otherwise.
im Code steht
\DeclareDelimFormat{nametitledelim}{\addcomma\space}
\DeclareDelimFormat[bib,biblist]{nametitledelim}{\labelnamepunct}
\DeclareDelimFormat[textcite]{nametitledelim}{\addspace}
Die aufmerksame Leserin wird hier ein paar kleine Diskrepanzen erkennen. Die Dokumentation wird aber in der nächsten Version etwas präziser sein.

Das bedeutet für Dich konkret, dass Du die Definition über \DeclareDelimFormat im bib-Kontext vornehmen musst. Dabei solltest Du auch das klassische Idiom \addcolon\space statt : nehmen. Denn dann kann biblatex in Problemfällen wenigstens noch versuchen, ungewollte Doppelzeichensetzung zu vermeiden (vgl. z.B. https://github.com/plk/biblatex/issues/943).
\documentclass{scrartcl}  
\usepackage[backend=biber,style=authoryear-icomp]{biblatex}

\DeclareDelimFormat[bib]{nametitledelim}{\addcolon\space}

\begin{filecontents*}{\jobname.bib}
@article{Beispiel2010,
  author  = {Max Muster},
  title   = {goLaTeX Wiki-Beispiel},
  journal = {LaTeX Journal},
  year    = {2010},
  pages   = {1-3},
  url     = {http://www.golatex.de/wiki/index.php?title=Minimalbeispiel},
} 
\end{filecontents*}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}

\begin{document}
Dieser Beispieltext zitiert \cite{Beispiel2010} einen Artikel aus der
Bib-Datei, welche in diesem Dokument angelegt wurde.

Lorem \autocite{sigfridsson}

\printbibliography
\end{document}

Felix.Herauten
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 63
Registriert: Do 3. Mär 2022, 21:23

Re: labelnamepunct vs. nametitledelim

Beitrag von Felix.Herauten »

@Bartman:
Das mit der Kontextsensitivität hatte ich gelesen, konnte aber damit nichts anfange. Und das was bei dem Querverweis stand, habe ich noch viel weniger kapiert. Und da über den ganzen Befehlen stand
"Die Befehle in diesem Abschnitt können mit \renewcommand in der Dokumentpräambel neu definiert werden."
hatte ich gedacht, ich ersetze einfach labelnamepunct durch nametitledelim und schon ist das erledigt.

@MoeWe:
Vielen Dank für die ausführliche Erklärung und das Code-Beispiel. So langsam fange ich an zu verstehen, was es mit dieser Kontextsensitivität auf sich hat. Ich habe das ausprobiert und das funktioniert prima.

Was ich noch nicht ganz verstanden habe: wenn ich das (optionale) context-Argument weglasse, wird ja die Globaldefinition überschrieben. Dann müsste es doch auch funktionieren, wenn ich das global ändere, oder? Ich habe nämlich auch mal ohne das context-Argument probiert und dann erscheint wieder der Punkt.

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

Re: labelnamepunct vs. nametitledelim

Beitrag von MoeWe »

Die Bezeichnung "Globaldefinition", die ich in Ermangelung eines besseren Namens genutzt habe, hat vielleicht ein paar falsche Konnotationen und ist daher etwas unglücklich.

Grundsätzlich hast Du Dir das System so vorzustellen. Jeder delimiter hat normalerweise eine kontextlose Definition und mögliche weitere kontext-abhängige weitere Definitionen, die z.B. wie in
\DeclareDelimFormat{nametitledelim}{\addcomma\space}
\DeclareDelimFormat[bib,biblist]{nametitledelim}{\labelnamepunct}
\DeclareDelimFormat[textcite]{nametitledelim}{\addspace}
aussehen können.

Jedes Mal, wenn der delimiter zum Einsatz kommt, prüft biblatex ob es eine Definition für den gerade aktiven Kontext gibt. Wenn ja, dann wird die ausgegeben, wenn nein, fallen wir auf die kontextlose Definition zurück.

Praktisch heißt das, dass die kontextlose Definition nur zum Einsatz kommt, wenn es keine eigene Definition für den aktuellen Kontext gibt. Diese Definition ist also nicht "global" in dem Sinne, dass sie für alle Kontexte gelten oder diese gar überschreiben würde.

In dem Beispiel hier gibt es immer die Definition
\DeclareDelimFormat[bib,biblist]{nametitledelim}{\labelnamepunct}
im bib-Kontext. Wenn Du jetzt
\DeclareDelimFormat{nametitledelim}{\addcolon\space}
sagst, dann wird die kontextlose Definition zwar geändert, die bereits vorhandene Definition im bib-Kontext bleibt, wie sie ist, und findet auch immer noch Anwendung, wenn nametitledelim im Literaturverzeichnis benötigt wird. In dem Beispiel hier zeigt sich der Doppelpunkt nur bei \parencite, denn sowohl das Literaturverzeichnis als auch \textcite haben eine kontextspezifische Definition, die Vorrang hat.
\documentclass{scrartcl}  
\usepackage[backend=biber, style=authortitle]{biblatex}

\DeclareDelimFormat{nametitledelim}{\addcolon\space}

\addbibresource{biblatex-examples.bib}

\begin{document}
Alles gut \parencite{nussbaum}

uh-oh \textcite{nussbaum}

\printbibliography
\end{document}
Wenn es mal nötig sein sollte, alle kontext-spezifischen Definitionen zu löschen, dann gibt es dafür die gesternte Variante \DeclareDelimFormat*. Warum es keine so gute Idee ist, die ohne Hintergrundwissen anzuwenden, siehst Du in
\documentclass{scrartcl}  
\usepackage[backend=biber, style=authortitle]{biblatex}

\DeclareDelimFormat*{nametitledelim}{\addcolon\space}

\addbibresource{biblatex-examples.bib}

\begin{document}
Alles gut \parencite{nussbaum}

uh-oh \textcite{nussbaum}

\printbibliography
\end{document}
Das ganze System ist übrigens völlig analog zu den typspezifischen Feldformaten. Siehe z.B. https://tex.stackexchange.com/q/462133/35864.

Der zitierte Abschnitt in der biblatex-Dokumentation geht zumindest in der aktuellen englischen Version noch weiter
The commands in this section may be redefined with \renewcommand in the
document preamble. Those marked as ‘Context Sensitive’ in the margin can also be
customised with \DeclareDelimFormat and are printed with \printdelim (§ 3.12.2).
Für die context-sensitive delimiters würde ich aber dringend von \renewcommand abraten. Obwohl es wie oben erklärt "mehr oder weniger" geht. (Daher wird da etwas ergänzt.)

Felix.Herauten
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 63
Registriert: Do 3. Mär 2022, 21:23

Re: labelnamepunct vs. nametitledelim

Beitrag von Felix.Herauten »

Und nochmal tausend Dank. Die Erklärungen haben mein Verständnis von Latex schon wieder vorangebracht. Jetzt fange ich so langsam an, das Prinzip hinter den kontextsensitiven Befehlen zu verstehen...

Antworten