von MoeWe » So 16. Feb 2020, 13:21
Du hast zwei Minimalbeispiele gepostet, die sowohl Code für die Anpassung des Literaturverzeichnisses als auch Code für die Anpassung der Zitate beinhalten. Es wäre nicht sinnvoll, den Code des einen Beispiels in die .cbx und den des anderen in die .bbx zu schreiben. Zunächst musst Du aus den beiden (oder noch mehr) Vorschlägen eine Komplettlösung für Zitate und Literaturverzeichnis aussuchen oder zusammensetzen. Dann kannst Du darüber nachdenken, daraus .bbx und .cbx zu machen.
Meiner Meinung nach ist es nicht immer notwendig oder gar zielführend, gleich alle Modifikationen in .bbx- und .cbx-Dateien auszulagern. Der Code funktioniert genauso gut, wenn er in der Präambel steht. Gut, es mag einen Punkt geben, ab dem der Code in der Präambel so lang wird, dass es etwas unübersichtlich wird, je nach Geschmack, kann dieser Punkt recht schnell erreicht sein, wenn man darauf bedacht ist, dass man seine Präambel frei von viel Code halten möchte (eigentlich gar keine schlechte Einstellung: hier im Forum sieht man zu häufig Präambeln, die sich über Jahre entwickelt haben und dann in einem furchtbaren Zustand verkrustet sind, es ist immer eine gute Idee, all den Code, den man nicht braucht, wegzulassen). Wenn es also zu lang wird, kann man den Code auch in eine separate .tex-Datei auslagern und dann einfach mit \input einbinden. Dann ist es auch weg aus der Präambel, aber immer noch in einer Datei, die man schnell ansehen und ändern kann. .bbx und .cbx-Dateien sind nach meiner Erfahrung erst sinnvoll, wenn man wirklich einen wohldefinierten Stil implementieren möchte, den man plant, in der Zukunft häufiger zu benutzen.
Aber OK, gehen wir davon aus, dass eine ausgelagerte .tex-Datei nicht genug ist, und es .bbx- und .cbx-Dateien sein müssen. Dann musst Du als erstes identifizieren, welcher Code zu den Zitaten gehört und welcher zum Literaturverzeichnis. Das ist nicht immer ganz eindeutig, im Großen und Ganzen kann man sich aber an die Aufteilungen der Standardstile halten (wobei bei biblatex.def sowohl .bbx-Code als auch .cbx-Code enthält). Bei manchen Stilen ist es sehr schwer, genau zu separieren, was wohin gehört. Hier sollte es weitestgehend noch machbar sein: \renewbibmacro*{cite}, \renewbibmacro*{postnote}, \DeclareFieldFormat*{citetitle}, \DeclareLabeldate, \DeclareNameFormat{family-given:init}, \DeclareNameAlias{labelname} gehören in die .cbx, der Rest eher in die .bbx. Wobei ein paar Dinge (\renewcommand*{\mkbibcompletename}, \DeclareDelimAlias{finalnamedelim}) sowohl für Zitate als auch für das Literaturverzeichnis relevant sind. Wenn Du die .bbx und .cbx immer zusammen nutzt, dann ist es eigentlich eh wurscht, was Du wohin schreibst, aber es ist schon sinnvoll, sich zu bemühen, die Aufteilung sinnvoll zu gestalten. Außerdem ist es sinnvoll, die biblatex-Optionen auf die zwei Dateien zu verteilen und dort mit \ExecuteBibliographOptions auszuführen. Wenn die Dateien keine vollständigen Neuentwicklungen sind, sondern auf bestehenden Stilen aufbauen, dann sollten sie das mit \RequireBibliographyStyle (.bbx) bzw. \RequireCitationStyle (.cbx) anmelden. Die erste Codezeile der .bbx- oder .cbx-Datei sollte die Datei identifizieren und ein Änderungsdatum sowie, wenn gewünscht, eine Versionsnummer und kurze Beschreibung beinhalten.
sam.bbx
\ProvidesFile{sam.bbx}[2020/02/16 v0.1 bibliography style for sam85]
\RequireBibliographyStyle{ext-authoryear}
\ExecuteBibliographyOptions{
maxbibnames=999,
mincrossrefs=1,
mergedate=false,
innamebeforetitle, dashed=false,
isbn=false,
alldates=ymd,}
\setlength{\bibinitsep}{.5\baselineskip}
\setlength\bibhang{1cm}
\renewcommand*{\finentrypunct}{}
\renewcommand*{\newunitpunct}{\addcomma\space}
\DeclareDelimFormat[bib,biblist]{nametitledelim}{\addcolon\space}
\DeclareDelimFormat{titleyeardelim}{\newunitpunct}
\renewcommand*{\mkbibcompletename}{\mkbibemph}
\DeclareDelimAlias{finalnamedelim}{multinamedelim}
\DeclareNameAlias{default}{family-given}
\DeclareNameAlias{sortname}{default}
\DeclareFieldFormat{editortype}{\mkbibparens{#1}}
\DeclareDelimFormat{editortypedelim}{\addspace}
\DeclareFieldFormat{translatortype}{\mkbibparens{#1}}
\DeclareDelimFormat{translatortypedelim}{\addspace}
\DeclareDelimFormat[bib,biblist]{innametitledelim}{\addcomma\space}
\DeclareFieldFormat*{title}{#1}
\DeclareFieldFormat*{booktitle}{#1}
\DeclareFieldFormat*{journaltitle}{#1}
\newbibmacro*{organization+location}[1]{%
\printlist{location}%
\setunit*{\locdatedelim}%
\printlist{organization}%
\newunit}
\usepackage{xpatch}
\xpatchbibdriver{online}
{\usebibmacro{organization+location+date}}
{\usebibmacro{organization+location}}
{}{}
\DeclareFieldFormat[online]{date}{\mkbibparens{#1}}
\DeclareFieldFormat{url}{<\url{#1}>}% oder {$\langle$\url{#1}$\rangle$} oder \textlangle/\textrangle
\DeclareFieldFormat{urldate}{\mkbibbrackets{\bibstring{urlseen}\addcolon\space#1}}
\renewbibmacro*{url+urldate}{%
\usebibmacro{url}%
\ifentrytype{online}
{\setunit{\addspace}%
\usebibmacro{date}}
{}%
\iffieldundef{urlyear}
{}
{\setunit*{\addspace}%
\usebibmacro{urldate}}}
\renewbibmacro*{date+extradate}{%
\printtext[parens]{%
\printfield{usera}%
\setunit{\printdelim{titleyeardelim}}%
\printlabeldateextra}}
\renewbibmacro*{date}{%
\usebibmacro{bbx:ifmergeddate}
{}
{\iffieldundef{year}
{\printtext[date]{\bibstring{nodate}}}
{\printdate}}}
\DefineBibliographyStrings{german}{
nodate = {{}o.\adddot \addabbrvspace J\adddot},
andothers = {et\addabbrvspace al\adddot},
urlseen = {Zugriff},
}
\DeclareStyleSourcemap{
\maps[datatype=bibtex]{
\map{
\pernottype{set}
\step[notfield=translator, final]
\step[notfield=editor, final]
\step[fieldset=author, fieldvalue={\string{o.\noexpand\,V\noexpand\adddot\string}}, final]
\step[fieldset=sortname, fieldvalue={zzzzzzzzz}]
}
\map{
\pernottype{online}
\step[fieldset=location, fieldvalue={o.\noexpand\,O\noexpand\adddot}]
}
}
}
sam.cbx
\ProvidesFile{sam.cbx}[2020/02/16 v0.1 citation style for sam85]
\RequireCitationStyle{ext-authoryear}
\ExecuteBibliographyOptions{maxcitenames=2, labeldate=year,
autocite=footnote}
\DeclareLabeldate{%
\field{date}
\field{year}
\field{eventdate}
\field{origdate}
\literal{nodate}
}
\DeclareNameFormat{family-given:init}{%
\usebibmacro{name:family-given}
{\namepartfamily}
{\namepartgiveni}
{\namepartprefix}
{\namepartsuffix}%
\usebibmacro{name:andothers}}
\DeclareNameAlias{labelname}{family-given:init}
\DeclareFieldFormat*{citetitle}{#1}
\renewbibmacro*{cite}{%
\iffieldundef{shorthand}
{\ifthenelse{\ifnameundef{labelname}\OR\iffieldundef{labelyear}}
{\usebibmacro{cite:label}%
\setunit{\printdelim{nonametitledelim}}}
{\printnames{labelname}%
\setunit{\printdelim{nametitledelim}}}%
\printfield{usera}%
\setunit{\printdelim{titleyeardelim}}%
\usebibmacro{cite:labeldate+extradate}}
{\usebibmacro{cite:shorthand}}}
\renewbibmacro*{postnote}{%
\setunit{\postnotedelim}%
\iffieldundef{postnote}
{\printtext{o\adddot\addabbrvspace S\adddot}}
{\printfield{postnote}}}
Testdatei
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[onehalfspacing]{setspace}
\usepackage[autostyle, german=guillemets]{csquotes}
\usepackage[backend=biber, style=sam]{biblatex}
\renewcommand*{\bibfont}{\normalfont\normalsize\singlespacing}
\begin{filecontents*}{\jobname.bib}
@online{test1Mit,
author = {Artur Autor},
title = {Internetquelle mit Datum},
url = {http://example.edu/~elk/bronto.pdf},
urldate = {2018-03-26},
date = {2000-06-09},
usera = {Test Stichwort1},
}
@online{test1Ohne,
author = {Artur Autor},
title = {Internetquelle ohne Datum},
url = {http://example.edu/~elk/bronto.pdf},
urldate = {2018-03-26},
usera = {Test Stichwort2},
}
@book{test2Mit,
author = {Artur Autor},
title = {Buch mit Datum},
edition = {1},
usera = {Test Stichwort3},
publisher = {FOMVerlag},
location = {Essen},
date = {2000}
}
@book{test2Ohne,
author = {Artur Autor},
title = {Buch ohne Datum},
edition = {1},
usera = {Test Stichwort4},
publisher = {FOMVerlag},
location = {Essen},
}
\end{filecontents*}
\addbibresource{\jobname.bib}
\begin{document}
Lorem\autocite{test1Mit,test1Ohne}
ipsum\autocite{test2Mit}
dolor\autocite{test2Ohne}
\printbibliography[nottype=online]
\printbibliography[type=online,title={Internetquellen}]
\end{document}
Du hast zwei Minimalbeispiele gepostet, die sowohl Code für die Anpassung des Literaturverzeichnisses als auch Code für die Anpassung der Zitate beinhalten. Es wäre nicht sinnvoll, den Code des einen Beispiels in die [tt].cbx[/tt] und den des anderen in die [tt].bbx[/tt] zu schreiben. Zunächst musst Du aus den beiden (oder noch mehr) Vorschlägen eine Komplettlösung für Zitate und Literaturverzeichnis aussuchen oder zusammensetzen. Dann kannst Du darüber nachdenken, daraus [tt].bbx[/tt] und [tt].cbx[/tt] zu machen.
Meiner Meinung nach ist es nicht immer notwendig oder gar zielführend, gleich alle Modifikationen in [tt].bbx[/tt]- und [tt].cbx[/tt]-Dateien auszulagern. Der Code funktioniert genauso gut, wenn er in der Präambel steht. Gut, es mag einen Punkt geben, ab dem der Code in der Präambel so lang wird, dass es etwas unübersichtlich wird, je nach Geschmack, kann dieser Punkt recht schnell erreicht sein, wenn man darauf bedacht ist, dass man seine Präambel frei von viel Code halten möchte (eigentlich gar keine schlechte Einstellung: hier im Forum sieht man zu häufig Präambeln, die sich über Jahre entwickelt haben und dann in einem furchtbaren Zustand verkrustet sind, es ist immer eine gute Idee, all den Code, den man nicht braucht, wegzulassen). Wenn es also zu lang wird, kann man den Code auch in eine separate [tt].tex[/tt]-Datei auslagern und dann einfach mit [tt]\input[/tt] einbinden. Dann ist es auch weg aus der Präambel, aber immer noch in einer Datei, die man schnell ansehen und ändern kann. [tt].bbx[/tt] und [tt].cbx[/tt]-Dateien sind nach meiner Erfahrung erst sinnvoll, wenn man wirklich einen wohldefinierten Stil implementieren möchte, den man plant, in der Zukunft häufiger zu benutzen.
Aber OK, gehen wir davon aus, dass eine ausgelagerte [tt].tex[/tt]-Datei nicht genug ist, und es [tt].bbx[/tt]- und [tt].cbx[/tt]-Dateien sein müssen. Dann musst Du als erstes identifizieren, welcher Code zu den Zitaten gehört und welcher zum Literaturverzeichnis. Das ist nicht immer ganz eindeutig, im Großen und Ganzen kann man sich aber an die Aufteilungen der Standardstile halten (wobei bei [tt]biblatex.def[/tt] sowohl [tt].bbx[/tt]-Code als auch [tt].cbx[/tt]-Code enthält). Bei manchen Stilen ist es sehr schwer, genau zu separieren, was wohin gehört. Hier sollte es weitestgehend noch machbar sein: [tt]\renewbibmacro*{cite}[/tt], [tt]\renewbibmacro*{postnote}[/tt], [tt]\DeclareFieldFormat*{citetitle}[/tt], [tt]\DeclareLabeldate[/tt], [tt]\DeclareNameFormat{family-given:init}[/tt], [tt]\DeclareNameAlias{labelname}[/tt] gehören in die [tt].cbx[/tt], der Rest eher in die [tt].bbx[/tt]. Wobei ein paar Dinge ([tt]\renewcommand*{\mkbibcompletename}[/tt], [tt]\DeclareDelimAlias{finalnamedelim}[/tt]) sowohl für Zitate als auch für das Literaturverzeichnis relevant sind. Wenn Du die [tt].bbx[/tt] und [tt].cbx[/tt] immer zusammen nutzt, dann ist es eigentlich eh wurscht, was Du wohin schreibst, aber es ist schon sinnvoll, sich zu bemühen, die Aufteilung sinnvoll zu gestalten. Außerdem ist es sinnvoll, die [tt]biblatex[/tt]-Optionen auf die zwei Dateien zu verteilen und dort mit [tt]\ExecuteBibliographOptions[/tt] auszuführen. Wenn die Dateien keine vollständigen Neuentwicklungen sind, sondern auf bestehenden Stilen aufbauen, dann sollten sie das mit [tt]\RequireBibliographyStyle[/tt] ([tt].bbx[/tt]) bzw. [tt]\RequireCitationStyle[/tt] ([tt].cbx[/tt]) anmelden. Die erste Codezeile der [tt].bbx[/tt]- oder [tt].cbx[/tt]-Datei sollte die Datei identifizieren und ein Änderungsdatum sowie, wenn gewünscht, eine Versionsnummer und kurze Beschreibung beinhalten.
[tt]sam.bbx[/tt]
[code]\ProvidesFile{sam.bbx}[2020/02/16 v0.1 bibliography style for sam85]
\RequireBibliographyStyle{ext-authoryear}
\ExecuteBibliographyOptions{
maxbibnames=999,
mincrossrefs=1,
mergedate=false,
innamebeforetitle, dashed=false,
isbn=false,
alldates=ymd,}
\setlength{\bibinitsep}{.5\baselineskip}
\setlength\bibhang{1cm}
\renewcommand*{\finentrypunct}{}
\renewcommand*{\newunitpunct}{\addcomma\space}
\DeclareDelimFormat[bib,biblist]{nametitledelim}{\addcolon\space}
\DeclareDelimFormat{titleyeardelim}{\newunitpunct}
\renewcommand*{\mkbibcompletename}{\mkbibemph}
\DeclareDelimAlias{finalnamedelim}{multinamedelim}
\DeclareNameAlias{default}{family-given}
\DeclareNameAlias{sortname}{default}
\DeclareFieldFormat{editortype}{\mkbibparens{#1}}
\DeclareDelimFormat{editortypedelim}{\addspace}
\DeclareFieldFormat{translatortype}{\mkbibparens{#1}}
\DeclareDelimFormat{translatortypedelim}{\addspace}
\DeclareDelimFormat[bib,biblist]{innametitledelim}{\addcomma\space}
\DeclareFieldFormat*{title}{#1}
\DeclareFieldFormat*{booktitle}{#1}
\DeclareFieldFormat*{journaltitle}{#1}
\newbibmacro*{organization+location}[1]{%
\printlist{location}%
\setunit*{\locdatedelim}%
\printlist{organization}%
\newunit}
\usepackage{xpatch}
\xpatchbibdriver{online}
{\usebibmacro{organization+location+date}}
{\usebibmacro{organization+location}}
{}{}
\DeclareFieldFormat[online]{date}{\mkbibparens{#1}}
\DeclareFieldFormat{url}{<\url{#1}>}% oder {$\langle$\url{#1}$\rangle$} oder \textlangle/\textrangle
\DeclareFieldFormat{urldate}{\mkbibbrackets{\bibstring{urlseen}\addcolon\space#1}}
\renewbibmacro*{url+urldate}{%
\usebibmacro{url}%
\ifentrytype{online}
{\setunit{\addspace}%
\usebibmacro{date}}
{}%
\iffieldundef{urlyear}
{}
{\setunit*{\addspace}%
\usebibmacro{urldate}}}
\renewbibmacro*{date+extradate}{%
\printtext[parens]{%
\printfield{usera}%
\setunit{\printdelim{titleyeardelim}}%
\printlabeldateextra}}
\renewbibmacro*{date}{%
\usebibmacro{bbx:ifmergeddate}
{}
{\iffieldundef{year}
{\printtext[date]{\bibstring{nodate}}}
{\printdate}}}
\DefineBibliographyStrings{german}{
nodate = {{}o.\adddot \addabbrvspace J\adddot},
andothers = {et\addabbrvspace al\adddot},
urlseen = {Zugriff},
}
\DeclareStyleSourcemap{
\maps[datatype=bibtex]{
\map{
\pernottype{set}
\step[notfield=translator, final]
\step[notfield=editor, final]
\step[fieldset=author, fieldvalue={\string{o.\noexpand\,V\noexpand\adddot\string}}, final]
\step[fieldset=sortname, fieldvalue={zzzzzzzzz}]
}
\map{
\pernottype{online}
\step[fieldset=location, fieldvalue={o.\noexpand\,O\noexpand\adddot}]
}
}
}[/code]
[tt]sam.cbx[/tt]
[code]\ProvidesFile{sam.cbx}[2020/02/16 v0.1 citation style for sam85]
\RequireCitationStyle{ext-authoryear}
\ExecuteBibliographyOptions{maxcitenames=2, labeldate=year,
autocite=footnote}
\DeclareLabeldate{%
\field{date}
\field{year}
\field{eventdate}
\field{origdate}
\literal{nodate}
}
\DeclareNameFormat{family-given:init}{%
\usebibmacro{name:family-given}
{\namepartfamily}
{\namepartgiveni}
{\namepartprefix}
{\namepartsuffix}%
\usebibmacro{name:andothers}}
\DeclareNameAlias{labelname}{family-given:init}
\DeclareFieldFormat*{citetitle}{#1}
\renewbibmacro*{cite}{%
\iffieldundef{shorthand}
{\ifthenelse{\ifnameundef{labelname}\OR\iffieldundef{labelyear}}
{\usebibmacro{cite:label}%
\setunit{\printdelim{nonametitledelim}}}
{\printnames{labelname}%
\setunit{\printdelim{nametitledelim}}}%
\printfield{usera}%
\setunit{\printdelim{titleyeardelim}}%
\usebibmacro{cite:labeldate+extradate}}
{\usebibmacro{cite:shorthand}}}
\renewbibmacro*{postnote}{%
\setunit{\postnotedelim}%
\iffieldundef{postnote}
{\printtext{o\adddot\addabbrvspace S\adddot}}
{\printfield{postnote}}}[/code]
Testdatei
[code]\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[onehalfspacing]{setspace}
\usepackage[autostyle, german=guillemets]{csquotes}
\usepackage[backend=biber, style=sam]{biblatex}
\renewcommand*{\bibfont}{\normalfont\normalsize\singlespacing}
\begin{filecontents*}{\jobname.bib}
@online{test1Mit,
author = {Artur Autor},
title = {Internetquelle mit Datum},
url = {http://example.edu/~elk/bronto.pdf},
urldate = {2018-03-26},
date = {2000-06-09},
usera = {Test Stichwort1},
}
@online{test1Ohne,
author = {Artur Autor},
title = {Internetquelle ohne Datum},
url = {http://example.edu/~elk/bronto.pdf},
urldate = {2018-03-26},
usera = {Test Stichwort2},
}
@book{test2Mit,
author = {Artur Autor},
title = {Buch mit Datum},
edition = {1},
usera = {Test Stichwort3},
publisher = {FOMVerlag},
location = {Essen},
date = {2000}
}
@book{test2Ohne,
author = {Artur Autor},
title = {Buch ohne Datum},
edition = {1},
usera = {Test Stichwort4},
publisher = {FOMVerlag},
location = {Essen},
}
\end{filecontents*}
\addbibresource{\jobname.bib}
\begin{document}
Lorem\autocite{test1Mit,test1Ohne}
ipsum\autocite{test2Mit}
dolor\autocite{test2Ohne}
\printbibliography[nottype=online]
\printbibliography[type=online,title={Internetquellen}]
\end{document}[/code]