
如何為不同的條目聲明不同的字串?例如,對於普通 url,urldate 將列印為“訪問:urldate”,而對於維基百科,urldate 將列印為“上次修改:urldate”。
我嘗試了類似 \iffieldequalstr 的東西,但它似乎不起作用。下面是一個MWE
\documentclass{article}
\usepackage[style=ieee,backend=bibtex]{biblatex}
\usepackage{xpatch}
\begin{filecontents}{\jobname.bib}
@ELECTRONIC{MEMSnet,
title = {What is {MEMS}?},
organization = {MEMSnet},
url = {http://www.memsnet.org/mems/what_is.html},
urldate = {2013-12-01},
}
@ELECTRONIC{WikiMEMS,
author = {Wikipedia},
title = {Microelectromechanical systems},
organization = {Wikipedia.org},
url = {http://en.wikipedia.org/wiki/Microelectromechanical_systems},
timestamp = {09:59},
urldate = {28 November 2013}
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\xpatchbibdriver{online}
{\printtext[parens]{\usebibmacro{date}}}
{\iffieldundef{year}
{}
{\printtext[parens]{\usebibmacro{date}}}}
{}
{\typeout{There was an error patching biblatex-ieee (ieee.bbx's @online driver)}}
\AtEveryBibitem{
\ifentrytype{online}{
\iffieldequalstr{author}{Wikipedia}{
\DefineBibliographyStrings{english}{%
urlseen = {Last modified}
}
\DeclareFieldFormat{urldate}{\mkbibbrackets{\bibstring{urlseen}\addcolon\space#1\addcomma\space\printfield{timestamp}}}
}{
\DefineBibliographyStrings{english}{%
urlseen = {Accessed}
}
\DeclareFieldFormat{urldate}{\mkbibbrackets{\bibstring{urlseen}\addcolon\space#1}}
}
}{}
}
\begin{document}
\nocite{MEMSnet,WikiMEMS,wilde,markey}
\printbibliography
\end{document}
答案1
一個非常接近您想要的解決方案是執行以下操作,透過聲明一個新的bibstring
、恰當命名的lastmodified
\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
lastmodified = {last modified}
}
為了能夠比較名稱,author
我們需要一個巨集\wikitestname
。不幸的是,目前還沒有一種簡單的方法可以根據字串檢查名稱*,因此我們需要使用\ifnameequals
巨集來檢查;名稱格式非常具體,但是您可以在文件中找到.bbl
。
\def\wikitestname{{}{{{}{Wikipedia}{W.}{}{}{}{}{}{}}}}
然後我們檢查目前處理的條目是否為 Wiki 條目
\AtEveryBibitem{
\ifentrytype{online}{
\ifnameequals{author}{\wikitestname}
{\DeclareFieldFormat{urldate}{\mkbibparens{\bibstring{lastmodified}\space#1}}}
{\DeclareFieldFormat{urldate}{\mkbibparens{\bibstring{urlseen}\space#1}}}
}
}
urldate
並根據需要相應地更改前面的字串。
\documentclass{article}
\usepackage[style=ieee,backend=bibtex]{biblatex}
\usepackage{xpatch}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@ELECTRONIC{MEMSnet,
title = {What is {MEMS}?},
organization = {MEMSnet},
url = {http://www.memsnet.org/mems/what_is.html},
urldate = {2013-12-01},
}
@ELECTRONIC{WikiMEMS,
author = {Wikipedia},
title = {Microelectromechanical systems},
organization = {Wikipedia.org},
url = {http://en.wikipedia.org/wiki/Microelectromechanical_systems},
timestamp = {09:59},
date = {2013-11-28},
urldate = {2013-12-25},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\xpatchbibdriver{online}
{\printtext[parens]{\usebibmacro{date}}}
{\iffieldundef{year}
{}
{\printtext[parens]{\usebibmacro{date}}}}
{}
{\typeout{There was an error patching biblatex-ieee (ieee.bbx's @online driver)}}
\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
lastmodified = {last modified}
}
\def\wikitestname{{}{{{}{Wikipedia}{W.}{}{}{}{}{}{}}}}
\AtEveryBibitem{
\ifentrytype{online}{
\ifnameequals{author}{\wikitestname}
{\DeclareFieldFormat{urldate}{\mkbibparens{\bibstring{lastmodified}\space#1}}}
{\DeclareFieldFormat{urldate}{\mkbibparens{\bibstring{urlseen}\space#1}}}
}
}
\begin{document}
\nocite{MEMSnet,WikiMEMS,wilde,markey}
\printbibliography
\end{document}
*
biblatex
區分name
s、field
s 和list
s。例如,author
是 a name
、series
afield
和organization
a list
。有不同的巨集來檢查這些欄位之間的相等性。您不能用於\iffieldequalstr
檢查 a 是否name
等於給定字串。由於名稱可以說是必須處理的最複雜的部分biblatex
,因此它們也具有最複雜的身份條件。畢竟,人們不希望.bib
文件中給出的名稱與Peter Smith
string 匹配Smith
,但您會希望Peter Smith
和都Smith, Peter
匹配,Peter Smith
因為兩種輸入格式在文件中同樣有效.bib
。因此biblatex
僅接受與應該已包含文件中給出的正確名稱語法的巨集進行比較.bbl
。就我們而言{}{{{}{Wikipedia}{W.}{}{}{}{}{}{}}}
。
另一方面。在這種情況下@wiki
,為該任務定義一個專用的條目類型(人們可能喜歡稱之為 )可能會很合適。
由於您似乎使用 BibTeX 作為後端,而不是(至少在我看來)遠優於 biber,所以讓我們先探索 BibTeX 的可能性,然後繼續看看我們可以使用 biber 做得更好。
biblatex
預設有六種用於自訂修改的條目類型:這些customa
是customf
.這裡我們將使用customa
.
從現在開始,如果你想引用維基條目,不要使用@online
/ @electronic
,而是使用@customa
。
@customa{WikiMEMS,
author = {Wikipedia},
title = {Microelectromechanical systems},
url = {http://en.wikipedia.org/wiki/Microelectromechanical_systems},
organization = {Wikipedia, The Free Encyclopedia},
date = {2013-11-28},
urldate = {2013-12-25},
}
這些字段符合預期;請注意,正如人們所期望的那樣,它urldate
採用上次訪問資源的日期和date
上次修改資源的日期。
我們再一次有
\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
lastmodified = {last modified}
}
最後我們有了驅動程序,即列印參考書目條目的代碼
\DeclareBibliographyDriver{customa}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author/editor+others/translator+others}%
\setunit{\addperiod\addspace}%or \setunit{\adddot\addspace}
\iffieldundef{year}%
{}
{\printtext[parens]{\bibstring{lastmodified}\space\usebibmacro{date}}}%
\setunit{\adddot\addspace}%
\usebibmacro{title}%
\setunit{\adddot\addspace}%
\printlist{language}%
\setunit{\adddot\addspace}%
\usebibmacro{byauthor}%
\setunit{\adddot\addspace}%
\usebibmacro{byeditor+others}%
\setunit{\adddot\addspace}%
\printfield{version}%
\setunit{\adddot\addspace}%
\printfield{note}%
\newunit\newblock
\printlist{organization}%
\setunit{\adddot\addspace}%
\iftoggle{bbx:eprint}
{\usebibmacro{eprint}}
{}%
\newunit\newblock
\usebibmacro{url+urldate}%
\setunit{\adddot\addspace}%
\usebibmacro{addendum+pubstate}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
\newunit\newblock
\usebibmacro{related}%
\usebibmacro{finentry}%
}
ieee.bbx
該驅動程式幾乎是的驅動程式的一對一副本,除了列印「最後修改」的區域@online
略有修改之外。date
微量元素
\documentclass{article}
\usepackage[style=ieee,backend=bibtex]{biblatex}
\usepackage{xpatch}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@ELECTRONIC{MEMSnet,
title = {What is {MEMS}?},
organization = {MEMSnet},
url = {http://www.memsnet.org/mems/what_is.html},
urldate = {2013-12-01},
}
@customa{WikiMEMS,
author = {Wikipedia},
title = {Microelectromechanical systems},
url = {http://en.wikipedia.org/wiki/Microelectromechanical_systems},
organization = {Wikipedia, The Free Encyclopedia},
date = {2013-11-28},
urldate = {2013-12-25},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\xpatchbibdriver{online}
{\printtext[parens]{\usebibmacro{date}}}
{\iffieldundef{year}
{}
{\printtext[parens]{\usebibmacro{date}}}}
{}
{\typeout{There was an error patching biblatex-ieee (ieee.bbx's @online driver)}}
\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
lastmodified = {last modified}
}
\DeclareBibliographyDriver{customa}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author/editor+others/translator+others}%
\setunit{\addperiod\addspace}%or \setunit{\adddot\addspace}
\iffieldundef{year}%
{}
{\printtext[parens]{\bibstring{lastmodified}\space\usebibmacro{date}}}%
\setunit{\adddot\addspace}%
\usebibmacro{title}%
\setunit{\adddot\addspace}%
\printlist{language}%
\setunit{\adddot\addspace}%
\usebibmacro{byauthor}%
\setunit{\adddot\addspace}%
\usebibmacro{byeditor+others}%
\setunit{\adddot\addspace}%
\printfield{version}%
\setunit{\adddot\addspace}%
\printfield{note}%
\newunit\newblock
\printlist{organization}%
\setunit{\adddot\addspace}%
\iftoggle{bbx:eprint}
{\usebibmacro{eprint}}
{}%
\newunit\newblock
\usebibmacro{url+urldate}%
\setunit{\adddot\addspace}%
\usebibmacro{addendum+pubstate}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
\newunit\newblock
\usebibmacro{related}%
\usebibmacro{finentry}%
}
\begin{document}
\nocite{MEMSnet,WikiMEMS,wilde,markey}
\printbibliography
\end{document}
我們可以透過像上面那樣定義驅動程式來biber
定義一個新類型@wiki
wiki
\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
lastmodified = {last modified}
}
\DeclareBibliographyDriver{wiki}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author/editor+others/translator+others}%
\setunit{\addperiod\addspace}%or \setunit{\adddot\addspace}
\iffieldundef{year}%
{}
{\printtext[parens]{\bibstring{lastmodified}\space\usebibmacro{date}}}%
\setunit{\adddot\addspace}%
\usebibmacro{title}%
\setunit{\adddot\addspace}%
\printlist{language}%
\setunit{\adddot\addspace}%
\usebibmacro{byauthor}%
\setunit{\adddot\addspace}%
\usebibmacro{byeditor+others}%
\setunit{\adddot\addspace}%
\printfield{version}%
\setunit{\adddot\addspace}%
\printfield{note}%
\newunit\newblock
\printlist{organization}%
\setunit{\adddot\addspace}%
\iftoggle{bbx:eprint}
{\usebibmacro{eprint}}
{}%
\newunit\newblock
\usebibmacro{url+urldate}%
\setunit{\adddot\addspace}%
\usebibmacro{addendum+pubstate}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
\newunit\newblock
\usebibmacro{related}%
\usebibmacro{finentry}%
}
文件.bib
符合預期
@wiki{WikiMEMS,
author = {Wikipedia},
title = {Microelectromechanical systems},
url = {http://en.wikipedia.org/wiki/Microelectromechanical_systems},
organization = {Wikipedia, The Free Encyclopedia},
date = {2013-11-28},
urldate = {2013-12-25},
}
氣象局
\documentclass{article}
\usepackage[style=ieee,backend=biber]{biblatex}
\usepackage{xpatch}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@ELECTRONIC{MEMSnet,
title = {What is {MEMS}?},
organization = {MEMSnet},
url = {http://www.memsnet.org/mems/what_is.html},
urldate = {2013-12-01},
}
@wiki{WikiMEMS,
author = {Wikipedia},
title = {Microelectromechanical systems},
url = {http://en.wikipedia.org/wiki/Microelectromechanical_systems},
organization = {Wikipedia, The Free Encyclopedia},
date = {2013-11-28},
urldate = {2013-12-25},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\xpatchbibdriver{online}
{\printtext[parens]{\usebibmacro{date}}}
{\iffieldundef{year}
{}
{\printtext[parens]{\usebibmacro{date}}}}
{}
{\typeout{There was an error patching biblatex-ieee (ieee.bbx's @online driver)}}
\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
lastmodified = {last modified}
}
\DeclareBibliographyDriver{wiki}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author/editor+others/translator+others}%
\setunit{\addperiod\addspace}%or \setunit{\adddot\addspace}
\iffieldundef{year}%
{}
{\printtext[parens]{\bibstring{lastmodified}\space\usebibmacro{date}}}%
\setunit{\adddot\addspace}%
\usebibmacro{title}%
\setunit{\adddot\addspace}%
\printlist{language}%
\setunit{\adddot\addspace}%
\usebibmacro{byauthor}%
\setunit{\adddot\addspace}%
\usebibmacro{byeditor+others}%
\setunit{\adddot\addspace}%
\printfield{version}%
\setunit{\adddot\addspace}%
\printfield{note}%
\newunit\newblock
\printlist{organization}%
\setunit{\adddot\addspace}%
\iftoggle{bbx:eprint}
{\usebibmacro{eprint}}
{}%
\newunit\newblock
\usebibmacro{url+urldate}%
\setunit{\adddot\addspace}%
\usebibmacro{addendum+pubstate}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
\newunit\newblock
\usebibmacro{related}%
\usebibmacro{finentry}%
}
\begin{document}
\nocite{MEMSnet,WikiMEMS,wilde,markey}
\printbibliography
\end{document}
兩個 MWE 均高於收益率
有了 biber,現在可以非常輕鬆地新增自訂欄位;例如,許可證字段,描述條目的使用條款@wiki
。這可以按照中所述來完成如何在參考書目中包含價格?。