Wie tauscht man Bibliografiefelder in Biblatex-Philosophy?

Wie tauscht man Bibliografiefelder in Biblatex-Philosophy?

In meinem bisherigen Versuch, einen angeforderten Bibliografiestil mit abzugleichen biblatex, würde ich gerne herausfinden, wie ich die Felder „Ausgabe“ und „Herausgeber“ in vertauschen kann biblatex-philosophy.

Hier ist das Format, das ich brauche: Ziel

Mit Folgendem bin ich fast am Ziel:

\documentclass[11pt, a4paper]{scrartcl}

% Bibliography preamble
\usepackage[giveninits=true, style=philosophy-modern]{biblatex}  
\addbibresource{testbib.bib}

% Some tweaks I've already made
\DeclareFieldFormat{postnote}{#1}% no postnote prefix in "normal" citation commands
\DeclareFieldFormat{multipostnote}{#1}% no postnote prefix in "multicite" commands
\DeclareFieldFormat{pages}{#1}% no prefix for the `pages` field in the bibliography

\DeclareFieldFormat[article]{title}{#1} % Remove quotations from Article title
\setlength{\yeartitle}{5.4em} % Set greater spacing between the year and the title
\setlength{\postnamesep}{2.5ex plus 2pt minus 1pt}

\begin{document}
Sentence containing citation \parencite{auerbach2003}.

\printbibliography
\end{document}

und .bibDatei:

@book{auerbach2003,
        Author = {Auerbach, Erich},
        Publisher = {Princeton University Press},
        Title = {Mimesis: the representation of reality in Western literature},
        date = {2003},
        Editor = {Trask, Willard R.},
        editortype = {translator},
        Location = {Princeton},
        edition = {2nd ed.}}

Welche Ausgaben:

Versuchen

Ich hoffe, dass der Prozess auch auf andere Bereiche übertragbar ist, da ich wirklich daran interessiert bin, die entsprechenden Fähigkeiten zu erwerben. Die beste AntwortHierhat sehr geholfen, einen Überblick auf hoher Ebene zu geben, die Details übersteigen jedoch zu diesem Zeitpunkt noch mein Verständnis.

Antwort1

biblatexEs ist nicht immer einfach, die Reihenfolge der Felder mit nur wenigen Codezeilen zu ändern . Dies liegt an der Struktur der biblatexBibliographieverwaltung von . biblatexhat für jeden Eintragstyp einen „Treiber“, der definiert, welche Felder in welcher Reihenfolge gedruckt werden. Diese Treiber werden jedoch nicht immer \printfielddirekt aufgerufen, sondern rufen häufig zusätzliche Bibmacros auf, die den Druckvorgang durchführen.

Nehmen Sie als Beispiel den Treiber für @bookfromphilosophy-standard.bbx

\DeclareBibliographyDriver{book}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author/editor+others/translator+others}%
  \setunit{\labelnamepunct}\newblock
  \usebibmacro{maintitle+title}%
  \newunit
  \printlist{language}%
  \newunit\newblock
  \usebibmacro{byauthor}%
  \newunit\newblock
  \usebibmacro{byeditor+others}%
  \newunit\newblock
  \printfield{edition}%
  \newunit
  \printfield{volumes}%
  \newunit\newblock
  \usebibmacro{series+number}%
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \usebibmacro{publisher+location+date}%
  \newunit
  \iffieldundef{maintitle}
    {\printfield{volume}%
     \printfield{part}}
    {}%
  \newunit\newblock
  \usebibmacro{chapter+pages}%
  \newunit
  \printfield{pagetotal}%
  \newunit\newblock
  \iftoggle{bbx:isbn}
    {\printfield{isbn}}
    {}%
  \newunit\newblock
  \usebibmacro{doi+eprint+url}%
  \newunit\newblock
  \usebibmacro{addendum+pubstate}%
  \newblock
  \usebibmacro{phil:related}%
  \newunit\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}

Sie können sehen, dass einige Felder direkt gedruckt werden ( ), während viele andere Dinge von einem Bibmacro ( ) \printfield{edition}gedruckt werden .\usebibmacro{byeditor+others}

Wenn Sie Glück haben, gibt es ein relativ kurzes Bibmakro, das die beiden Felder ausgibt, die Sie vertauschen möchten. Dann ist das Ändern der Reihenfolge der Felder so einfach wie das Neudefinieren dieses Bibmakros. Wenn Sie beispielsweise die Reihenfolge von publisher, locationund ändern möchten, können Sie einfach neu definieren und das war’s. Oft werden diese Makros von allen Eintragstypen gleichermaßen verwendet, sodass Sie sich darüber nicht einmal Gedanken machen müssen.datepublisher+location+date

Wenn Sie jedoch zwei Felder austauschen möchten, die von unterschiedlichen Makros in einem bestimmten Treiber gedruckt werden, müssen Sie diesen Treiber im Wesentlichen neu schreiben. Sie würden die Treiberdefinition kopieren und die Felder einfach neu anordnen. Dies kann mühsam sein und führt dazu, dass sich Ihre Präambel ziemlich schnell mit vielen Codezeilen füllt, da Ihr durchschnittlicher Bib-Treiber etwa 40 bis 50 Zeilen lang ist. Und Sie müssen alle betroffenen Treiber ändern.

In solchen Situationen kann es praktischer sein, das Paket zu verwenden xpatch. Mit dem \xpatchbibdriverBefehl können Sie bestimmte Teile der Definition eines Treibers ersetzen. Um das editionaus dem Treiber zu entfernen, @bookwürden Sie sagen

\xpatchbibdriver{book}
  {\printfield{edition}%
   \newunit}
  {}
  {}
  {\typeout{failed to remove edition from driver for 'book'}}

Sie können es dann dort hinzufügen, wo Sie es tatsächlich haben möchten

\xpatchbibdriver{book}
  {\printlist{language}%
   \newunit\newblock}
  {\printlist{language}%
   \newunit\newblock
   \printfield{edition}%
   \newunit}
  {}
  {\typeout{failed to add edition to bibmacro 'book'}}

Strukturell ähnliche Patches müssen auch auf andere Treiber und Bibmacros angewendet werden.

Damit dies funktioniert, ist es entscheidend, dass Sie die Struktur des zugrunde liegenden Treibers kennen.

Vollständig mit allen gepatchten Eintragstypen

\documentclass[11pt, a4paper]{scrartcl}

% Bibliography preamble
\usepackage[giveninits=true, style=philosophy-modern]{biblatex}  
\addbibresource{biblatex-examples.bib}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{auerbach2003,
  Author = {Auerbach, Erich},
  Publisher = {Princeton University Press},
  Title = {Mimesis: the representation of reality in Western literature},
  date = {2003},
  Editor = {Trask, Willard R.},
  editortype = {translator},
  Location = {Princeton},
  edition = {2}}
\end{filecontents}
\addbibresource{\jobname.bib}

% Some tweaks I've already made
\DeclareFieldFormat{postnote}{#1}% no postnote prefix in "normal" citation commands
\DeclareFieldFormat{multipostnote}{#1}% no postnote prefix in "multicite" commands
\DeclareFieldFormat{pages}{#1}% no prefix for the `pages` field in the bibliography

\DeclareFieldFormat[article]{title}{#1} % Remove quotations from Article title
\setlength{\yeartitle}{5.4em} % Set greater spacing between the year and the title
\setlength{\postnamesep}{2.5ex plus 2pt minus 1pt}

\usepackage{xpatch}
\newcommand*{\removeeditiondriver}[1]{%
  \xpatchbibdriver{#1}
    {\printfield{edition}%
     \newunit}
    {}
    {}
    {\typeout{failed to remove edition from driver for '#1'}}}
\forcsvlist{\removeeditiondriver}{book,collection,manual,jurisdiction}
\newcommand*{\removeeditionbibmacro}[1]{%
  \xpatchbibdriver{#1}
    {\printfield{edition}%
     \newunit}
    {}
    {}
    {\typeout{failed to remove edition from bibmacro '#1'}}}
\forcsvlist{\removeeditionbibmacro}{inbook:full,incollection:full,xrefdata}

\newcommand*{\addeditiondriver}[1]{%
  \xpatchbibdriver{#1}
    {\printlist{language}%
     \newunit\newblock}
    {\printlist{language}%
     \newunit\newblock
     \printfield{edition}%
     \newunit}
    {}
    {\typeout{failed to add edition to driver for '#1'}}}
\forcsvlist{\addeditiondriver}{book,collection,manual,jurisdiction}

\newcommand*{\addeditionbibmacroin}[1]{%
  \xpatchbibdriver{#1}
    {\usebibmacro{maintitle+booktitle}%
     \newunit\newblock}
    {\usebibmacro{maintitle+booktitle}%
     \newunit\newblock
     \printfield{edition}%
     \newunit}
    {}
    {\typeout{failed to add edition to bibmacro '#1'}}}
\forcsvlist{\addeditionbibmacroin}{inbook:full,incollection:full}

\xpretobibmacro{xrefdata}
  {\printfield{edition}%
   \newunit}
  {}
  {\typeout{failed to add edition to bibmacro '#1'}}

\begin{document}
Sentence containing citation \parencite{nietzsche:ksa,companion,auerbach2003}.

\printbibliography
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen