
Как объявить разные строки для разных записей? Например, для обычного 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
различает name
s, field
s и list
s. Например, author
is a name
, series
a field
и organization
a list
. Существуют различные макросы для проверки равенства между этими полями. Вы не можете использовать , \iffieldequalstr
чтобы проверить, name
равно ли a заданной строке. Поскольку имена, возможно, являются самой сложной частью того, с чем biblatex
приходится иметь дело, они также имеют самые сложные условия идентичности. В конце концов, никто не хотел бы, чтобы имя, указанное в файле, .bib
соответствовало Peter Smith
строке 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
. Это можно сделать, как описано вКак включить цену в библиографию?.