為不同的引用聲明不同的字串

為不同的引用聲明不同的字串

如何為不同的條目聲明不同的字串?例如,對於普通 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區分names、fields 和lists。例如,author是 a nameseriesafieldorganizationa list。有不同的巨集來檢查這些欄位之間的相等性。您不能用於\iffieldequalstr檢查 a 是否name等於給定字串。由於名稱可以說是必須處理的最複雜的部分biblatex,因此它們也具有最複雜的身份條件。畢竟,人們不希望.bib文件中給出的名稱與Peter Smithstring 匹配Smith,但您會希望Peter Smith和都Smith, Peter匹配,Peter Smith因為兩種輸入格式在文件中同樣有效.bib。因此biblatex僅接受與應該已包含文件中給出的正確名稱語法的巨集進行比較.bbl。就我們而言{}{{{}{Wikipedia}{W.}{}{}{}{}{}{}}}


另一方面。在這種情況下@wiki,為該任務定義一個專用的條目類型(人們可能喜歡稱之為 )可能會很合適。

由於您似乎使用 BibTeX 作為後端,而不是(至少在我看來)遠優於 biber,所以讓我們先探索 BibTeX 的可能性,然後繼續看看我們可以使用 biber 做得更好。

biblatex預設有六種用於自訂修改的條目類型:這些customacustomf.這裡我們將使用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定義一個新類型@wikiwiki

\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。這可以按照中所述來完成如何在參考書目中包含價格?

相關內容