考慮以下 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}