为什么 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

在评论中已经讨论过editortranslator和朋友的@in作品指的是封闭的booktitle,而不是title

我们可以创建新的名称来指代 的编辑、翻译等title,我们将其称为ineditorintranslator、 ......

首先,我们需要一个.dbx包含新数据模式的文件。然后,我们只需将 的所有宏复制到editor。在我们的 MWE 中,我们只需要translatorineditorintranslator

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

示例输出


也许您发现相反的方法更合乎逻辑(尤其是看到 是bookauthorauthorbooktitle,因此我们也可以假装editortranslator、 ... 字段引用并为该工作title想出新的bookeditor、 、 ...。booktranslatorbooktitle严格来说,这种方法与标准数据模型不兼容。

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

相关内容