von MoeWe » So 26. Feb 2023, 07:48
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}
Der gezeigte [i]driver[/i] für [tt]@book[/tt] hat einige Probleme. Zunächst fällt auf, dass er einige sinnvolle Makros der Standarddefinition wie [tt]begentry[/tt] und [tt]finentry[/tt] nicht verwendet. Das muss jetzt per se nicht schlecht sein, sorgt aber dafür, dass Du letztendlich Flexibilität einbüßt. Zeichensetzungsbefehle wie [tt]\addcolon[/tt] sollten innerhalb eines [i]drivers[/i] eigentlich nie außerhalb von [tt]\setunit[/tt] und Co. stehen. [tt]\printlist{title}[/tt] sollte nichts tun, da [tt]title[/tt] keine Liste ist. Ferner sollte am Zeilenende ein [tt]%[/tt] stehen, um ungewollte Leerzeichen zu verhindern. Gewollte Leerzeichen sollten mit [tt]\setunit[/tt] und Co. erzeugt werden. Bei dem [tt]\iffieldundef{edition}[/tt] fehlen Klammern für die [tt]<false>[/tt]-Branch, weswegen das [tt]\addcomma[/tt] als [tt]<false>[/tt]-Branch interpretiert wird (vielleicht ist das sogar gewollt, aber bitte tu Dir den Gefallen und schreib die Klammern hin). Bei [tt]\usebibmacro*{publisher+location+date}[/tt] folgt am Ende ein unnützes [tt]{}[/tt] (über zwei Zeilen verteilt). [tt]\printfield{adress}[/tt] sollte gar nichts tun, denn es gibt intern für [tt]biblatex[/tt] kein Feld [tt]adress[/tt]. [tt]address[/tt] (mit zwei d) ist ein Alias für [tt]location[/tt], der von Biber/BibTeX aufgelöst wird.
Da mir nicht immer ganz klar ist, was die Intention hinter den Veränderung des [i]drivers[/i] sind, nimmst Du es mir hoffentlich nicht übel, wenn ich den Code einfach rauswerfe und mit der Standarddefinition arbeite. Die verwendet nämlich das [i]bibmacro[/i] [tt]series+number[/tt] für die Reihenangabe. Es reicht, wenn wir dieses Makro anpassen. Normalerweise können wir uns bei Zeichensetzung auf [tt]biblatex[/tt]s [i]puntuation buffer[/i] und Befehle wie [tt]\DeclareFieldFormat[/tt] 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 [tt]number[/tt] ohne [tt]series[/tt] 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 [tt]\iffieldundef{series}[/tt] um zu schauen, ob die Reihe da ist. Nur in diesem Fall schreiben wir [tt]series[/tt] und [tt]number[/tt] innerhalb eines [tt]\printtext[parens]{...}[/tt], das seinen gesamten Inhalt in Klammern setzt.
[code]\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}[/code]