Warum wird die Biblatex-Option „useeditor=true“ für Buchartikel ignoriert?

Warum wird die Biblatex-Option „useeditor=true“ für Buchartikel ignoriert?

Betrachten Sie das folgende MWE. Wie man sieht, useeditor=truewird die Option für den Eintrag ignoriert @incollectionund tatsächlich gleich behandelt wie useeditor=false. Warum? Und wie kann ich dafür sorgen, dass es darauf achtet?

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

Bildbeschreibung hier eingeben

Antwort1

In den Kommentaren wurde darauf hingewiesen, dass sich editor, translatorund Freunde bei @inArbeiten auf das Beiliegende booktitleund nicht auf beziehen title.

Wir können neue Namen erstellen, die sich auf den Herausgeber, Übersetzer usw. von beziehen. titleWir nennen sie ineditor, intranslator, ...

Zuerst brauchen wir eine .dbxDatei mit dem neuen Datenmodus. Dann müssen wir nur noch alle Makros für editor, translatornach ineditor, kopieren intranslator. In unserem MWE brauchen wir dann nur noch

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

und sind startklar

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

Beispielausgabe


Vielleicht finden Sie den umgekehrten Ansatz logischer (insbesondere angesichts der Tatsache, dass das das des bookauthorist ), sodass wir auch so tun können, als ob die Felder , , ... sich auf das beziehen und uns neue , , ... für die Arbeit ausdenken können .authorbooktitleeditortranslatortitlebookeditorbooktranslatorbooktitleDieser Ansatz ist strenggenommen nicht mit dem Standarddatenmodell kompatibel.

Die .dbx Datei ist etwas anders und die meisten Namensmakros werden in umbenannt by.... Für das MWE brauchen wir dann nur noch

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

MWE

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

verwandte Informationen