
Como posso declarar strings diferentes para entradas diferentes? Por exemplo, para url comum, o urldate será impresso como "Acessado: urldate", enquanto para a Wikipedia, o urldate será impresso como "Última modificação: urldate".
Tentei algo como \iffieldequalstr mas parece não estar funcionando. Abaixo está um 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}
Responder1
Uma solução que chega bem perto do que você deseja é fazer o seguinte, declarar um novo bibstring
, apropriadamente nomeado lastmodified
, via
\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
lastmodified = {last modified}
}
Para poder comparar o nome author
precisamos de uma macro \wikitestname
. Infelizmente, no momento não existe uma maneira fácil de verificar um name* em uma string, então precisamos usar \ifnameequals
para verificar em uma macro; o formato do nome é muito específico, entretanto, você pode procurá-lo no .bbl
arquivo.
\def\wikitestname{{}{{{}{Wikipedia}{W.}{}{}{}{}{}{}}}}
Em seguida, verificamos se a entrada atualmente processada é Wiki.
\AtEveryBibitem{
\ifentrytype{online}{
\ifnameequals{author}{\wikitestname}
{\DeclareFieldFormat{urldate}{\mkbibparens{\bibstring{lastmodified}\space#1}}}
{\DeclareFieldFormat{urldate}{\mkbibparens{\bibstring{urlseen}\space#1}}}
}
}
e altere a string anterior urldate
de acordo, se necessário.
\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
distingue entre name
s, field
s e list
s. Por exemplo, author
é a name
, series
a field
e organization
a list
. Existem diferentes macros para verificar a igualdade entre esses campos. Você não pode usar \iffieldequalstr
para verificar se a é name
igual a uma determinada string. Como os nomes são indiscutivelmente a parte mais complexa daquilo biblatex
com que se deve lidar, eles também têm as condições de identidade mais complicadas. Afinal, não se deseja que o nome fornecido em um .bib
arquivo Peter Smith
corresponda à string Smith
, mas você deseja que ambos Peter Smith
e Smith, Peter
correspondam, Peter Smith
já que ambos os formatos de entrada são igualmente válidos no .bib
arquivo. Portanto, biblatex
aceita apenas a comparação com macros que já deveriam incluir a sintaxe do nome próprio, conforme fornecido no .bbl
arquivo. No nosso caso {}{{{}{Wikipedia}{W.}{}{}{}{}{}{}}}
.
Em uma nota diferente. Neste caso, pode ser bastante adequado definir um tipo de entrada dedicado (poderíamos chamá-lo de @wiki
) para esta tarefa.
Como você parece usar o BibTeX como backend e não o (pelo menos na minha opinião) o biber muito superior, vamos primeiro explorar nossas possibilidades com o BibTeX e depois ver o quanto podemos fazer melhor com o biber.
biblatex
por padrão, tem seis tipos de entrada para modificações personalizadas: customa
são customf
. Aqui usaremos customa
.
De agora em diante, se você quiser citar uma entrada do wiki, não use @online
/ @electronic
, mas @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},
}
Os campos estão conforme o esperado; observe que urldate
leva a data em que o recurso foi acessado pela última vez e date
a data em que o recurso foi modificado pela última vez, exatamente como seria de esperar.
Mais uma vez temos
\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
lastmodified = {last modified}
}
Finalmente temos o driver, o trecho de código que imprime a entrada da bibliografia
\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}%
}
Este driver é quase uma cópia individual do driver ieee.bbx
do @online
, exceto por uma ligeira modificação na date
área para imprimir "última modificação".
MWE
\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}
Com biber
podemos definir um novo tipo @wiki
apenas definindo o driver como acima comwiki
\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}%
}
O .bib
arquivo conforme o esperado
@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},
}
O MWE
\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}
Ambos os MWEs acima do rendimento
Com o biber agora é possível adicionar facilmente campos personalizados; por exemplo, um campo de licença, descrevendo os termos de uso da @wiki
entrada. Isto pode ser feito conforme descrito emComo incluir o preço na bibliografia?.