考虑以下 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
。在我们的 MWE 中,我们只需要translator
ineditor
intranslator
\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}