Объявляйте разные строки для разных ссылок

Объявляйте разные строки для разных ссылок

Как объявить разные строки для разных записей? Например, для обычного URL urldate будет напечатан как "Accessed: urldate", а для Wikipedia urldate будет напечатан как "Last modified: 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. Например, authoris a name, seriesa fieldи organizationa list. Существуют различные макросы для проверки равенства между этими полями. Вы не можете использовать , \iffieldequalstrчтобы проверить, nameравно ли a заданной строке. Поскольку имена, возможно, являются самой сложной частью того, с чем biblatexприходится иметь дело, они также имеют самые сложные условия идентичности. В конце концов, никто не хотел бы, чтобы имя, указанное в файле, .bibсоответствовало Peter Smithстроке Smith, но вы хотели бы, чтобы совпадали Peter Smithи , поскольку оба формата ввода одинаково допустимы в файле . Поэтому принимает только сравнение с макросами, которые, как предполагается, уже включают правильный синтаксис имени, как указано в файле. В нашем случае .Smith, PeterPeter Smith.bibbiblatex.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. Это можно сделать, как описано вКак включить цену в библиографию?.

Связанный контент