Monographien mit Reihentitel im Literaturverzeichnis

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


tom2
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Fr 3. Feb 2023, 11:38

Monographien mit Reihentitel im Literaturverzeichnis

Beitrag von tom2 »

Hallo,

ich habe eine Frage zur Anzeige von Monographien im Literaturverzeichnis. Wenn diese Teil einer Reihe sind, sollen Reihentitel und Bandnummer angegeben werden, und zwar so:

Mustermann, Max (1990): Mein erster Text mit LaTeX, 2., verbesserte Auflage, (Texte schreiben am PC, 11), Berlin: Musterverlag.

Das Problem ist nun, dass LaTeX mir bei Monographien, die keiner Reihe angehören und deshalb auch kein "series"-Feld in der bib-Ddatei haben, leere Klammern ins Literaturverzeichnis schrieb statt den fehlenden Eintrag "series" zu überspringen. Ich habe das vorläufig so gelöst, dass ich alle Befehle zum Setzen von Klammern aus dem „books“-Bibliography-Driver rausgenommen habe, die ich im Zuge des Herumprobierens dort reingeschrieben hatte.

Stattdessen habe ich in meiner Bib-Datei im „series“-Feld eine öffnende Klammer vor den Reihentitel und im „number“-Feld eine schließende Klammer nach der Bandnummer gesetzt, s. unten in der bib-Datei das Buch von Maria Musterfrau. (Zum Vergleich dazu eine Monographie ohne Reihentitel von Max Mustermann).

Jetzt wirft LaTeX das gewünschte Ergebnis aus und setzt auch keine leeren Klammern mehr bei Monographien ohne Reihenangabe. Problem erledigt, könnte man sagen, allerdings ist das natürlich wirklich keine elegante Lösung.

Wäre daher sehr interessiert, wenn jemand erklären könnte, wie man das in der Tex-Datei regeln kann. Konkret: Wie kann man den Befehl „Setze Bandnummer und Reihentitel in runden Klammern nach die Auflage - wenn nicht vorhanden, überspringe dies und gehe weiter zu Ort und Verlag“ in den bibliography-driver einfügen?

Inhalt der bib-Datei "Literatur_Minimalbsp":
@book{Mustermann.1988,
 author = {Mustermann, Max},
 year = {1988},
 title = {Mein erster Text mit LaTeX},
 address = {Berlin},
 publisher = {Musterverlag}
}

@book{Musterfrau.1990,
 author = {Musterfrau, Maria},
 year = {1990},
 title = {Mein erster Text mit LaTeX},
 edition ={2., verbesserte Auflage}, 
 address = {Berlin},
 number = {11)},
 publisher = {Musterverlag},
 series = {(Texte schreiben am PC,}
}
Die Tex-Datei:

\documentclass[12pt, a4paper, openany, bibliography=totoc]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage[babel,german=guillemets]{csquotes}
\usepackage[a4paper, left=40mm, right=30mm, top=2cm, bottom=3cm]{geometry}
\usepackage[style=authoryear-icomp, backend=biber, maxnames=2,isbn=false, dashed=false, useprefix=true]{biblatex}
\bibliography{Literatur_Minimalbsp} 

\renewcommand{\postnotedelim}{\addcolon\addspace}
\DeclareFieldFormat{postnote}{#1}
\AtBeginBibliography{
	\renewcommand*{\multinamedelim}{\addnbspace\slash\space}}
\renewcommand{\labelnamepunct}{\addcolon\addspace}
\DeclareFieldFormat{title}{#1\isdot}
\DeclareFieldFormat{journaltitle}{#1\isdot} 
\DeclareFieldFormat[article]{title}{{#1}} 
\DeclareFieldFormat[incollection]{booktitle}{#1\isdot}
\DefineBibliographyStrings{ngerman}{andothers={et\addabbrvspace al\adddot}}



\DeclareBibliographyDriver{book}{%
	\usebibmacro{bibindex}%
	\usebibmacro{author/editor}%
	\addcolon\space
	\usebibmacro{maintitle+title}%
	\printlist{title}
	\printlist{subtitle}
	\addcomma
	\printfield{edition}
	\iffieldundef{edition}
	{}
	\addcomma
	\usebibmacro{byauthor}%
	\newunit
	\printlist{language}%
	\newunit\newblock
	\usebibmacro{byeditor+others}%
	\printfield {series}
	\printfield{number}
	\addcomma
	\addspace
	\usebibmacro*{publisher+location+date}{%
	}
	\printfield{adress}
	\adddot}
				
\begin{document}

Lorem ipsum

	\textcite[123]{Mustermann.1988}: "Das ist ein Zitat."\\
	\textcite[123]{Musterfrau.1990}: "Das ist ein Zitat."
		
	\printbibliography
\end{document}

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

Re: Monographien mit Reihentitel im Literaturverzeichnis

Beitrag von MoeWe »

Der gezeigte driver für @book hat einige Probleme. Zunächst fällt auf, dass er einige sinnvolle Makros der Standarddefinition wie begentry und finentry nicht verwendet. Das muss jetzt per se nicht schlecht sein, sorgt aber dafür, dass Du letztendlich Flexibilität einbüßt. Zeichensetzungsbefehle wie \addcolon sollten innerhalb eines drivers eigentlich nie außerhalb von \setunit und Co. stehen. \printlist{title} sollte nichts tun, da title keine Liste ist. Ferner sollte am Zeilenende ein % stehen, um ungewollte Leerzeichen zu verhindern. Gewollte Leerzeichen sollten mit \setunit und Co. erzeugt werden. Bei dem \iffieldundef{edition} fehlen Klammern für die <false>-Branch, weswegen das \addcomma als <false>-Branch interpretiert wird (vielleicht ist das sogar gewollt, aber bitte tu Dir den Gefallen und schreib die Klammern hin). Bei \usebibmacro*{publisher+location+date} folgt am Ende ein unnützes {} (über zwei Zeilen verteilt). \printfield{adress} sollte gar nichts tun, denn es gibt intern für biblatex kein Feld adress. address (mit zwei d) ist ein Alias für location, der von Biber/BibTeX aufgelöst wird.

Da mir nicht immer ganz klar ist, was die Intention hinter den Veränderung des drivers sind, nimmst Du es mir hoffentlich nicht übel, wenn ich den Code einfach rauswerfe und mit der Standarddefinition arbeite. Die verwendet nämlich das bibmacro series+number für die Reihenangabe. Es reicht, wenn wir dieses Makro anpassen. Normalerweise können wir uns bei Zeichensetzung auf biblatexs puntuation buffer und Befehle wie \DeclareFieldFormat verlassen, die es einfach machen, Zeichen zu setzen, ohne wissen zu müssen, welche Felder leer sind oder nicht. Hier wollen wir aber zwei Felder in dieselben Klammern schreiben. Da müssen wir dann schon vorher testen, was da ist und was nicht. Ich habe hier die Annahme gemacht, dass es keine number ohne series gibt. Ich halte das für sinnvoll. Aber es ist natürlich möglich, den Test anzupassen, um auch diesen Fall zu erlauben.

Wir brauchen dann ein \iffieldundef{series} um zu schauen, ob die Reihe da ist. Nur in diesem Fall schreiben wir series und number innerhalb eines \printtext[parens]{...}, das seinen gesamten Inhalt in Klammern setzt.
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage[babel,german=guillemets]{csquotes}
\usepackage[
  backend=biber,
  style=authoryear-icomp,
  maxnames=2,
  useprefix=true,
  dashed=false,
  isbn=false,
]{biblatex}

\renewcommand*{\newunitpunct}{\addcomma\space}

\DeclareDelimFormat[bib]{multinamedelim}{\addnbspace\slash\space}
\DeclareDelimFormat[bib]{nametitledelim}{\addcolon\space}

\DeclareFieldFormat{title}{#1\isdot}
\DeclareFieldFormat[article]{title}{#1}

\DeclareFieldFormat[incollection]{booktitle}{#1\isdot}

\DeclareFieldFormat{journaltitle}{#1\isdot}

\DefineBibliographyStrings{ngerman}{andothers={et\addabbrvspace al\adddot}}

\renewbibmacro*{series+number}{%
  \iffieldundef{series}
    {}
    {\printtext[parens]{%
       \printfield{series}%
       \setunit*{\addspace}%
       \printfield{number}%
       \newunit}}}

\DeclareDelimFormat{postnotedelim}{\addcolon\addspace}
\DeclareFieldFormat{postnote}{#1}

\begin{filecontents}{\jobname.bib}
@book{Mustermann.1988,
  author    = {Mustermann, Max},
  year      = {1988},
  title     = {Mein erster Text mit LaTeX},
  address   = {Berlin},
  publisher = {Musterverlag}
}
@book{Musterfrau.1990,
  author    = {Musterfrau, Maria},
  year      = {1990},
  title     = {Mein erster Text mit LaTeX},
  edition   = {2., verbesserte Auflage},
  address   = {Berlin},
  number    = {11},
  publisher = {Musterverlag},
  series    = {Texte schreiben am PC,}
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
  Lorem ipsum

  \textcite[123]{Mustermann.1988}: \enquote{Das ist ein Zitat.}

  \textcite[123]{Musterfrau.1990}: \enquote{Das ist ein Zitat.}

  \printbibliography
\end{document}

tom2
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Fr 3. Feb 2023, 11:38

Re: Monographien mit Reihentitel im Literaturverzeichnis

Beitrag von tom2 »

Vielen Dank für die ausführliche Antwort!

Das klappt ja wunderbar. Das Minimalbeispiel erfült nun genau das, was ich gerne haben wollte. Ich versuche nun in den kommenden Tagen, das ebenso in meinem Hauptdokument umzusetzen.

Ich freue mich besonders auch über die begleitende Erklärung - das hilft sehr, den Code Zeile für Zeile zu verstehen, und nicht nur blind etwas zu übernehmen.

Dazu fällt mir noch ein Detail auf:
\renewbibmacro*{series+number}{%
  \iffieldundef{series}
    {}
    {\printtext[parens]{%
       \printfield{series}%
       \setunit*{\addspace}%
       \printfield{number}%
       \newunit}}}
Geben hier die beiden leeren Klammern {} in der dritten Zeile die Anweisung, was im Fall zu tun ist, wenn keine "series"- und "number"-Angaben in der bib-Datei stehen? (Dann nämlich nichts zu tun und zum nächsten Eintrag weiterzugehen?) Ist das also der "false-branch"?

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

Re: Monographien mit Reihentitel im Literaturverzeichnis

Beitrag von MoeWe »

Das Konditional \iffieldundef{<field>}{<true>}{<false>} prüft die Abwesenheit des Feldes (es ist wahr bei Nichtanwesenheit des Feldes). Daher wird die <true>-Branch ausgeführt, wenn das Feld nicht vorhanden ist, und die <false>-Branch, wenn das Feld vorhanden ist.

Die leeren Klammern in Zeile 3 sind also die <true>-Branch des Konditionals \iffieldundef{series}. Die wird ausgeführt, wenn keine series vorhanden ist. In dem Fall passiert in dem gezeigten Makro nichts weiter. Wenn eine series vorhanden ist, dann wird die <false>-Branch mit all dem Formatierungscode ausgeführt.

Wie erwähnt testet der Code nur das Vorhandensein von series und nicht das von number. Diese Vereinfachung habe ich mir erlaubt, da ich den Fall number ohne series für abwegig halte.

tom2
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Fr 3. Feb 2023, 11:38

Re: Monographien mit Reihentitel im Literaturverzeichnis

Beitrag von tom2 »

Alles klar - ich hatte übersehen, dass das Konditional die NICHT-Anwesenheit testet, und war deshalb verwirrt, was der true- und was der false-branch ist.

Einen Fall von number ohne series kann ich mir auch schlecht vorstellen, insfoern ist das sicher eine sehr sinnvolle Vereinfachung.

Antworten