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:
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 .bib
archivo:
@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:
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 biblatex
con sólo unas pocas líneas de código. Esto se debe a la estructura del biblatex
manejo de la bibliografía. biblatex
tiene un 'controlador' para cada tipo de entrada que define qué campos se imprimen en qué orden. Estos controladores, sin embargo, no siempre llaman \printfield
directamente, a menudo llaman a bibmacros auxiliares que realizan la impresión.
Tome el controlador @book
de philosophy-standard.bbx
como 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
, location
y date
, por ejemplo, simplemente puede redefinir publisher+location+date
y 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 \xpatchbibdriver
comando puedes reemplazar ciertos bits de la definición de un controlador. Para eliminar el edition
del controlador, @book
usted 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}