Как поменять местами поля библиографии в biblatex-philosophy?

Как поменять местами поля библиографии в biblatex-philosophy?

В своем давнем стремлении привести запрошенный стиль библиографии в соответствие с biblatex, я хотел бы узнать, как поменять местами поля «редакция» и «редактор» в biblatex-philosophy.

Вот формат, который мне нужен: Цель

Я уже почти проделал путь к цели:

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

и .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 = {2nd ed.}}

Какие выходы:

Пытаться

Я надеюсь, что этот процесс можно будет воспроизвести и в других областях, так как я действительно заинтересован в получении навыков, необходимых для этого. Главный ответздесьоказал большую помощь в предоставлении общего обзора, но детали на данном этапе все еще находятся за пределами моего понимания.

решение1

Не всегда просто изменить порядок полей biblatexс помощью всего нескольких строк кода. Это связано со структурой biblatexобработки библиографии. biblatexимеет «драйвер» для каждого типа записи, который определяет, какие поля печатаются в каком порядке. Однако эти драйверы не всегда вызываются \printfieldнапрямую, они часто вызывают вспомогательные bibmacros, которые выполняют печать.

@bookВозьмем в качестве philosophy-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}}

Вы можете видеть, что некоторые поля печатаются напрямую ( \printfield{edition}), в то время как многие другие данные печатаются с помощью bibmacro ( \usebibmacro{byeditor+others}).

Если вам повезет, то есть достаточно короткий bibmacro, который печатает два поля, которые вы хотите поменять местами. Затем изменить порядок полей так же просто, как переопределить этот bibmacro. Если вы хотите изменить порядок publisher, locationи date, например, вы можете просто переопределить publisher+location+dateи все. Часто эти макросы используются всеми типами записей одинаково, так что вам даже не нужно беспокоиться об этом.

Но если вы хотите поменять местами два поля, которые печатаются разными макросами в определенном драйвере, то вам придется по сути переписать этот драйвер. Вы скопируете определение драйвера и просто переупорядочите поля. Это может быть утомительно и приведет к тому, что ваша преамбула довольно быстро заполнится множеством строк кода, поскольку ваш средний bibdriver имеет длину около 40-50 строк. И вам придется изменить все затронутые драйверы.

В таких ситуациях может быть удобнее использовать пакет xpatch. Используя \xpatchbibdriverкоманду , вы можете заменить определенные биты определения драйвера. Чтобы удалить editionиз драйвера, @bookвы бы сказали

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

затем вы можете добавить его туда, где вам это действительно нужно.

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

Аналогичные по структуре исправления необходимо применить и к другим драйверам и bibmacros.

Чтобы это работало, крайне важно знать структуру базового драйвера.

Полностью со всеми исправленными типами записей

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

введите описание изображения здесь

Связанный контент