Почему опция biblatex «useeditor=true» игнорируется для статей о книгах?

Почему опция biblatex «useeditor=true» игнорируется для статей о книгах?

Рассмотрим следующий MWE. Как можно увидеть, опция useeditor=trueигнорируется для @incollectionзаписи, и на самом деле она рассматривается наравне с useeditor=false. Почему? И как мне заставить ее заботиться об этом?

\documentclass{article}
\usepackage[style = authoryear-comp]{biblatex}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@INCOLLECTION{beatles1970a,
    BOOKTITLE = "Let it be (a)",
    EDITOR = "The Beatles",
    TITLE = "Maggie Mae",
    YEAR = "1970",
    PAGES = "17--18",
    OPTIONS = "useeditor=true"}
@BOOK{beatles1970b,
    TITLE = "Let it be (b)",
    EDITOR = "The Beatles",
    YEAR = "1970",
    OPTIONS = "useeditor=true"}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\nocite{*}
\printbibliography
\end{document}

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

решение1

В комментариях обсуждалось, что editor, translatorи друзья для @inработ относятся к прилагаемому booktitle, а не к title.

Мы можем создать новые имена, которые будут ссылаться на редактора, переводчика, ... title, мы будем называть их ineditor, intranslator, ...

Сначала нам нужен .dbxфайл с новым режимом данных. Затем нам просто нужно скопировать все макросы для editor, translatorв ineditor, intranslator. В нашем MWE нам тогда нужно только

\renewbibmacro*{author/translator+others}{\usebibmacro{author/ineditor+others/intranslator+others}} %% this is an ad hoc for this particular application

и готовы к работе

\documentclass{article}
\usepackage{filecontents}
\usepackage{xpatch}
\begin{filecontents}{innames.dbx}
\ProvidesFile{innames.dbx}[2015/11/01 more field for @in types]
\RequireBiber[3]
% new translator etc.  fields for "inner" work, that is translator of title (not booktitle) in @in...
\DeclareDatamodelFields[type=list,datatype=name]{ineditor, intranslator, inannotator, incommentator, inintroduction, inforeword, inafterword}
\DeclareDatamodelEntryfields[inbook,incollection,inproceedings,inreference]{ineditor, intranslator, inannotator, incommentator, inintroduction, inforeword, inafterword}
\end{filecontents}

\usepackage[style = authoryear-comp, datamodel=innames]{biblatex}

\begin{filecontents}{\jobname.bib}
@INCOLLECTION{beatles1970a,
    BOOKTITLE = "Let it be (a)",
    inEDITOR = {{The Beatles}},
    TITLE = "Maggie Mae",
    YEAR = "1970",
    PAGES = "17--18",
    OPTIONS = "useineditor=true"}
@BOOK{beatles1970b,
    TITLE = "Let it be (b)",
    EDITOR = {{The Beatles}},
    YEAR = "1970",}
\end{filecontents}
\addbibresource{\jobname.bib}

\makeatletter
\newbibmacro*{ineditorstrg}{%
  \printtext[ineditortype]{%
    \iffieldundef{ineditortype}
      {\ifboolexpr{
         test {\ifnumgreater{\value{ineditor}}{1}}
         or
         test {\ifandothers{ineditor}}
       }
         {\bibstring{editors}}
         {\bibstring{editor}}}
      {\ifbibxstring{\thefield{ineditortype}}
         {\ifboolexpr{
            test {\ifnumgreater{\value{ineditor}}{1}}
            or
            test {\ifandothers{ineditor}}
          }
            {\bibstring{\thefield{ineditortype}s}}
            {\bibstring{\thefield{ineditortype}}}}
         {\thefield{ineditortype}}}}}

\newbibmacro*{ineditor+othersstrg}{%
  \iffieldundef{ineditortype}
    {\ifboolexpr{
       test {\ifnumgreater{\value{ineditor}}{1}}
       or
       test {\ifandothers{ineditor}}
     }
       {\def\abx@tempa{editors}}
       {\def\abx@tempa{editor}}}
    {\ifboolexpr{
       test {\ifnumgreater{\value{ineditor}}{1}}
       or
       test {\ifandothers{ineditor}}
     }
       {\edef\abx@tempa{\thefield{ineditortype}s}}
       {\edef\abx@tempa{\thefield{ineditortype}}}}%
  \let\abx@tempb=\empty
  \ifnamesequal{ineditor}{intranslator}
    {\appto\abx@tempa{tr}%
     \appto\abx@tempb{\clearname{intranslator}}}
    {}%
  \ifnamesequal{ineditor}{incommentator}
    {\appto\abx@tempa{co}%
     \appto\abx@tempb{\clearname{incommentator}}}
    {\ifnamesequal{ineditor}{inannotator}
       {\appto\abx@tempa{an}%
        \appto\abx@tempb{\clearname{inannotator}}}
       {}}%
  \ifnamesequal{ineditor}{inintroduction}
    {\appto\abx@tempa{in}%
     \appto\abx@tempb{\clearname{inintroduction}}}
    {\ifnamesequal{ineditor}{inforeword}
       {\appto\abx@tempa{fo}%
        \appto\abx@tempb{\clearname{inforeword}}}
       {\ifnamesequal{ineditor}{inafterword}
          {\appto\abx@tempa{af}%
           \appto\abx@tempb{\clearname{inafterword}}}
          {}}}%
  \ifbibxstring{\abx@tempa}
    {\printtext[ineditortype]{\bibstring{\abx@tempa}}\abx@tempb}
    {\usebibmacro{ineditorstrg}}}

\newbibmacro*{intranslatorstrg}{%
  \printtext[intranslatortype]{%
    \ifboolexpr{
      test {\ifnumgreater{\value{intranslator}}{1}}
      or
      test {\ifandothers{intranslator}}
    }
      {\bibstring{translators}}
      {\bibstring{translator}}}}

\newbibmacro*{intranslator+othersstrg}{%
  \ifboolexpr{
    test {\ifnumgreater{\value{intranslator}}{1}}
    or
    test {\ifandothers{intranslator}}
  }
    {\def\abx@tempa{translators}}
    {\def\abx@tempa{translator}}%
  \ifnamesequal{intranslator}{incommentator}
    {\appto\abx@tempa{co}%
     \clearname{incommentator}}
    {\ifnamesequal{intranslator}{inannotator}
       {\appto\abx@tempa{an}%
        \clearname{inannotator}}
       {}}%
  \ifnamesequal{intranslator}{inintroduction}
    {\appto\abx@tempa{in}%
     \clearname{inintroduction}}
    {\ifnamesequal{intranslator}{inforeword}
       {\appto\abx@tempa{fo}%
        \clearname{inforeword}}
       {\ifnamesequal{intranslator}{inafterword}
          {\appto\abx@tempa{af}%
           \clearname{inafterword}}
          {}}}%
  \bibstring{\abx@tempa}}


\newbibmacro*{ineditor+others}{%
  \ifboolexpr{
    test \ifuseineditor
    and
    not test {\ifnameundef{ineditor}}
  }
    {\printnames{ineditor}%
     \setunit{\addcomma\space}%
     \usebibmacro{ineditor+othersstrg}%
     \clearname{ineditor}}
    {}}

\newbibmacro*{intranslator+others}{%
  \ifboolexpr{
    test \ifuseintranslator
    and
    not test {\ifnameundef{intranslator}}
  }
    {\printnames{intranslator}%
     \setunit{\addcomma\space}%
     \usebibmacro{intranslator+othersstrg}%
     \clearname{intranslator}}
    {}}

\newbibmacro*{author/ineditor+others/intranslator+others}{%
  \ifboolexpr{
    test \ifuseauthor
    and
    not test {\ifnameundef{author}}
  }
    {\usebibmacro{author}}
    {\ifboolexpr{
       test \ifuseineditor
       and
       not test {\ifnameundef{ineditor}}
     }
       {\usebibmacro{ineditor+others}}
       {\usebibmacro{intranslator+others}}}}

\newbibmacro*{byineditor}{%
  \ifnameundef{ineditor}
    {}
    {\usebibmacro{bytypestrg}{ineditor}{editor}%
     \setunit{\addspace}%
     \printnames[byineditor]{ineditor}%
     \newunit}%
  \usebibmacro{byineditorx}}

\newbibmacro*{byineditorx}{%
  \ifnameundef{ineditora}
    {}
    {\usebibmacro{bytypestrg}{ineditora}{editor}%
     \setunit{\addspace}%
     \printnames[byineditora]{ineditora}%
     \newunit}%
  \ifnameundef{ineditorb}
    {}
    {\usebibmacro{bytypestrg}{ineditorb}{editor}%
     \setunit{\addspace}%
     \printnames[byineditorb]{ineditorb}%
     \newunit}%
  \ifnameundef{ineditorc}
    {}
    {\usebibmacro{bytypestrg}{ineditorc}{editor}%
     \setunit{\addspace}%
     \printnames[byineditorc]{ineditorc}%
     \newunit}}

\newbibmacro*{byintranslator}{%
  \ifnameundef{intranslator}
    {}
    {\bibstring{bytranslator}%
     \setunit{\addspace}%
     \printnames[byintranslator]{intranslator}}}

\newbibmacro*{byineditor+others}{%
  \ifnameundef{ineditor}
    {}
    {\usebibmacro{byineditor+othersstrg}%
     \setunit{\addspace}%
     \printnames[byineditor]{ineditor}%
     \clearname{ineditor}%
     \newunit}%
  \usebibmacro{byineditorx}%
  \usebibmacro{byintranslator+others}}

\newbibmacro*{byintranslator+others}{%
  \ifnameundef{intranslator}
    {}
    {\usebibmacro{byintranslator+othersstrg}%
     \setunit{\addspace}%
     \printnames[byintranslator]{intranslator}%
     \clearname{intranslator}%
     \newunit}}

\newbibmacro*{byineditor+othersstrg}{%
  \iffieldundef{ineditortype}
    {\def\abx@tempa{byeditor}}
    {\edef\abx@tempa{by\thefield{ineditortype}}}%
  \let\abx@tempb=\empty
  \ifnamesequal{ineditor}{intranslator}
    {\appto\abx@tempa{tr}%
     \appto\abx@tempb{\clearname{intranslator}}}
    {}%
  \ifnamesequal{ineditor}{incommentator}
    {\appto\abx@tempa{co}%
     \appto\abx@tempb{\clearname{incommentator}}}
    {\ifnamesequal{ineditor}{inannotator}
       {\appto\abx@tempa{an}%
        \appto\abx@tempb{\clearname{inannotator}}}
       {}}%
  \ifnamesequal{ineditor}{inintroduction}
    {\appto\abx@tempa{in}%
     \appto\abx@tempb{\clearname{inintroduction}}}
    {\ifnamesequal{ineditor}{inforeword}
       {\appto\abx@tempa{fo}%
        \appto\abx@tempb{\clearname{inforeword}}}
       {\ifnamesequal{ineditor}{inafterword}
          {\appto\abx@tempa{af}%
           \appto\abx@tempb{\clearname{inafterword}}}
          {}}}%
  \ifbibxstring{\abx@tempa}
    {\printtext{\bibstring{\abx@tempa}}\abx@tempb}
    {\usebibmacro{bytypestrg}{ineditor}{editor}}}

\newbibmacro*{byintranslator+othersstrg}{%
  \def\abx@tempa{bytranslator}%
  \ifnamesequal{intranslator}{incommentator}
    {\appto\abx@tempa{co}%
     \clearname{incommentator}}
    {\ifnamesequal{intranslator}{inannotator}
       {\appto\abx@tempa{an}%
        \clearname{inannotator}}
       {}}%
  \ifnamesequal{intranslator}{inintroduction}
    {\appto\abx@tempa{in}%
     \clearname{inintroduction}}
    {\ifnamesequal{intranslator}{inforeword}
       {\appto\abx@tempa{fo}%
        \clearname{inforeword}}
       {\ifnamesequal{intranslator}{inafterword}
          {\appto\abx@tempa{af}%
           \clearname{inafterword}}
          {}}}%
  \bibstring{\abx@tempa}}
\makeatother    


\renewbibmacro*{author/translator+others}{\usebibmacro{author/ineditor+others/intranslator+others}} %% this is an ad hoc for this particular application

\begin{document}
\nocite{*}
\printbibliography
\end{document}

пример вывода


Возможно, вы найдете противоположный подход более логичным (особенно учитывая, что bookauthorявляется authorполем booktitle), поэтому мы также можем притвориться, что поля editor, translator, ... ссылаются на titleи придумать новые bookeditor, booktranslator, ... для booktitleработы.Строго говоря, такой подход несовместим со стандартной моделью данных.

Файл .dbx немного отличается, и большинство макросов имен переименованы в by.... Для MWE нам тогда нужно только

\renewbibmacro*{author/translator+others}{\usebibmacro{author/editor+others/translator+others}} %% this is an ad hoc for this particular application

\xpatchbibdriver{inbook}
  {\usebibmacro{byeditor+others}}
  {\usebibmacro{bybookeditor+others}}
  {\typeout{yes inbook}}{\typeout{no inbook}}

\xpatchbibdriver{incollection}
  {\usebibmacro{byeditor+others}}
  {\usebibmacro{bybookeditor+others}}
  {\typeout{yes incollection}}{\typeout{no incollection}}

МВЭ

\documentclass{article}
\usepackage{filecontents}
\usepackage{xpatch}
\begin{filecontents}{booknames.dbx}
\ProvidesFile{booknames.dbx}[2015/11/01 more field for @in types]
\RequireBiber[3]
\DeclareDatamodelFields[type=list,datatype=name]{bookeditor, booktranslator, bookannotator, bookcommentator, bookintroduction, bookforeword, bookafterword}
\DeclareDatamodelEntryfields[inbook,incollection,inproceedings,inreference]{bookeditor, booktranslator, bookannotator, bookcommentator, bookintroduction, bookforeword, bookafterword}
\end{filecontents}

\usepackage[style = authoryear-comp, datamodel=booknames]{biblatex}

\begin{filecontents}{\jobname.bib}
@INCOLLECTION{beatles1970a,
    BOOKTITLE = "Let it be (a)",
    EDITOR = {{The Beatles}},
    bookeditor = {James Joyce},
    booktranslator = {James Joyce},
    TITLE = "Maggie Mae",
    YEAR = "1970",
    PAGES = "17--18",
    OPTIONS = "useeditor=true"}
@BOOK{beatles1970b,
    TITLE = "Let it be (b)",
    EDITOR = {{The Beatles}},
    YEAR = "1970",}
\end{filecontents}
\addbibresource{\jobname.bib}

\makeatletter
\newbibmacro*{bybookeditor}{%
  \ifnameundef{bookeditor}
    {}
    {\usebibmacro{bytypestrg}{bookeditor}{bookeditor}%
     \setunit{\addspace}%
     \printnames[bybookeditor]{bookeditor}%
     \newunit}}


\newbibmacro*{bybooktranslator}{%
  \ifnameundef{booktranslator}
    {}
    {\bibstring{bytranslator}%
     \setunit{\addspace}%
     \printnames[bybooktranslator]{booktranslator}}}

\newbibmacro*{bybookeditor+others}{%
  \ifnameundef{bookeditor}
    {}
    {\usebibmacro{bybookeditor+othersstrg}%
     \setunit{\addspace}%
     \printnames[bybookeditor]{bookeditor}%
     \clearname{bookeditor}%
     \newunit}%
  \usebibmacro{bybooktranslator+others}}

\newbibmacro*{bybooktranslator+others}{%
  \ifnameundef{booktranslator}
    {}
    {\usebibmacro{bybooktranslator+othersstrg}%
     \setunit{\addspace}%
     \printnames[bybooktranslator]{booktranslator}%
     \clearname{booktranslator}%
     \newunit}%
  \usebibmacro{withbookothers}}


\newbibmacro*{bybookeditor+othersstrg}{%
  \iffieldundef{bookeditortype}
    {\def\abx@tempa{byeditor}}
    {\edef\abx@tempa{by\thefield{bookeditortype}}}%
  \let\abx@tempb=\empty
  \ifnamesequal{bookeditor}{booktranslator}
    {\appto\abx@tempa{tr}%
     \appto\abx@tempb{\clearname{booktranslator}}}
    {}%
  \ifnamesequal{bookeditor}{bookcommentator}
    {\appto\abx@tempa{co}%
     \appto\abx@tempb{\clearname{bookcommentator}}}
    {\ifnamesequal{bookeditor}{bookannotator}
       {\appto\abx@tempa{an}%
        \appto\abx@tempb{\clearname{bookannotator}}}
       {}}%
  \ifnamesequal{bookeditor}{bookintroduction}
    {\appto\abx@tempa{in}%
     \appto\abx@tempb{\clearname{bookintroduction}}}
    {\ifnamesequal{bookeditor}{bookforeword}
       {\appto\abx@tempa{fo}%
        \appto\abx@tempb{\clearname{bookforeword}}}
       {\ifnamesequal{bookeditor}{bookafterword}
          {\appto\abx@tempa{af}%
           \appto\abx@tempb{\clearname{bookafterword}}}
          {}}}%
  \ifbibxstring{\abx@tempa}
    {\printtext{\bibstring{\abx@tempa}}\abx@tempb}
    {\usebibmacro{bytypestrg}{bookeditor}{bookeditor}}}

\newbibmacro*{bybooktranslator+othersstrg}{%
  \def\abx@tempa{bytranslator}%
  \ifnamesequal{booktranslator}{bookcommentator}
    {\appto\abx@tempa{co}%
     \clearname{bookcommentator}}
    {\ifnamesequal{booktranslator}{bookannotator}
       {\appto\abx@tempa{an}%
        \clearname{bookannotator}}
       {}}%
  \ifnamesequal{booktranslator}{bookintroduction}
    {\appto\abx@tempa{in}%
     \clearname{bookintroduction}}
    {\ifnamesequal{booktranslator}{bookforeword}
       {\appto\abx@tempa{fo}%
        \clearname{bookforeword}}
       {\ifnamesequal{booktranslator}{bookafterword}
          {\appto\abx@tempa{af}%
           \clearname{bookafterword}}
          {}}}%
  \bibstring{\abx@tempa}}

\newbibmacro*{withbookcommentator}{%
  \ifnameundef{bookcommentator}
    {}
    {\bibstring{withcommentator}%
     \setunit{\addspace}%
     \printnames[withbookcommentator]{bookcommentator}}}

\newbibmacro*{withbookannotator}{%
  \ifnameundef{bookannotator}
    {}
    {\bibstring{withannotator}%
     \setunit{\addspace}%
     \printnames[withbookannotator]{bookannotator}}}

\newbibmacro*{withbookintroduction}{%
  \ifnameundef{bookintroduction}
    {}
    {\bibstring{withintroduction}%
     \setunit{\addspace}%
     \printnames[withbookintroduction]{bookintroduction}}}

\newbibmacro*{withbookforeword}{%
  \ifnameundef{bookforeword}
    {}
    {\bibstring{withbookforeword}%
     \setunit{\addspace}%
     \printnames[withbookforeword]{bookforeword}}}

\newbibmacro*{withbookafterword}{%
  \ifnameundef{bookafterword}
    {}
    {\bibstring{withafterword}%
     \setunit{\addspace}%
     \printnames[withbookafterword]{bookafterword}}}

\newbibmacro*{withbookothers}{%
  \usebibmacro{withbookcommentator}%
  \clearname{bookcommentator}%
  \newunit
  \usebibmacro{withbookannotator}%
  \clearname{bookannotator}%
  \newunit
  \usebibmacro{withbookintroduction}%
  \clearname{bookintroduction}%
  \newunit
  \usebibmacro{withbookforeword}%
  \clearname{bookforeword}%
  \newunit
  \usebibmacro{withbookafterword}%
  \clearname{bookafterword}}
\makeatother

\renewbibmacro*{author/translator+others}{\usebibmacro{author/editor+others/translator+others}} %% this is an ad hoc for this particular application

\xpatchbibdriver{inbook}
  {\usebibmacro{byeditor+others}}
  {\usebibmacro{bybookeditor+others}}
  {\typeout{yes inbook}}{\typeout{no inbook}}

\xpatchbibdriver{incollection}
  {\usebibmacro{byeditor+others}}
  {\usebibmacro{bybookeditor+others}}
  {\typeout{yes incollection}}{\typeout{no incollection}}

\begin{document}
\nocite{*}
\printbibliography
\end{document}

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