¿Cómo intercambiar campos de bibliografía en biblatex-philosophy?

¿Cómo intercambiar campos de bibliografía en biblatex-philosophy?

En mi antigua búsqueda para hacer coincidir un estilo de bibliografía solicitado con biblatex, me gustaría saber cómo puedo intercambiar los campos "edición" y "editor" en biblatex-philosophy.

Este es el formato que necesito: Objetivo

Estoy casi todo el camino hasta allí con lo siguiente:

\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}

y .bibarchivo:

@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.}}

Qué salidas:

Intentar

Espero que el proceso también sea reproducible en otros campos, ya que estoy realmente interesado en adquirir las habilidades para hacerlo. la respuesta superioraquíHa sido muy útil para proporcionar una descripción general de alto nivel, pero los detalles aún están más allá de mi comprensión en esta etapa.

Respuesta1

No siempre es sencillo cambiar el orden de los campos biblatexcon sólo unas pocas líneas de código. Esto se debe a la estructura del biblatexmanejo de la bibliografía. biblatextiene un 'controlador' para cada tipo de entrada que define qué campos se imprimen en qué orden. Estos controladores, sin embargo, no siempre llaman \printfielddirectamente, a menudo llaman a bibmacros auxiliares que realizan la impresión.

Tome el controlador @bookde philosophy-standard.bbxcomo ejemplo.

\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}}

Puede ver que algunos campos se imprimen directamente ( \printfield{edition}), mientras que muchas otras cosas se imprimen mediante una bibmacro ( \usebibmacro{byeditor+others}).

Si tiene suerte, hay una bibmacro razonablemente corta que imprime los dos campos que desea intercambiar. Entonces cambiar el orden de los campos es tan fácil como redefinir esa bibmacro. Si desea cambiar el orden de publisher, locationy date, por ejemplo, simplemente puede redefinir publisher+location+datey eso es todo. A menudo, estas macros son utilizadas por todos los tipos de entradas por igual, por lo que ni siquiera tienes que preocuparte por eso.

Pero si desea intercambiar dos campos impresos por diferentes macros en un controlador en particular, básicamente debe reescribir ese controlador. Copiaría la definición del controlador y simplemente reorganizaría los campos. Esto puede ser tedioso y hace que su preámbulo se llene bastante rápidamente con muchas líneas de código, ya que su bibdriver promedio tiene entre 40 y 50 líneas de largo. Y tendrás que modificar todos los controladores afectados.

En esas situaciones puede resultar más práctico utilizar el paquete xpatch. Usando el \xpatchbibdrivercomando puedes reemplazar ciertos bits de la definición de un controlador. Para eliminar el editiondel controlador, @bookusted diría

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

Luego puedes agregarlo donde realmente lo desees.

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

También se deben aplicar parches estructuralmente similares a otros controladores y bibmacros.

Para que esto funcione, es fundamental que conozca la estructura del controlador subyacente.

Completamente con todos los tipos de entrada parcheados.

\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}

ingrese la descripción de la imagen aquí

información relacionada