Declarar diferentes cadenas para diferentes referencias

Declarar diferentes cadenas para diferentes referencias

¿Cómo puedo declarar diferentes cadenas para diferentes entradas? Por ejemplo, para una URL normal, la fecha de la URL se imprimirá como "Accedido: fecha de la URL", mientras que para Wikipedia, la fecha de la URL se imprimirá como "Última modificación: fecha de la URL".

Intenté algo como \iffieldequalstr pero parece que no funciona. A continuación se muestra un 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}

Respuesta1

Una solución que se acerca bastante a lo que desea es hacer lo siguiente: declarar un nuevo bibstring, con el nombre adecuado lastmodified, a través de

\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
  lastmodified = {last modified}
}

Para poder comparar el nombre authornecesitamos una macro \wikitestname. Desafortunadamente, hasta el momento no existe una manera fácil de comparar un nombre* con una cadena, por lo que debemos usar \ifnameequalspara compararlo con una macro; El formato del nombre es muy específico, sin embargo, puedes buscarlo en el .bblarchivo.

\def\wikitestname{{}{{{}{Wikipedia}{W.}{}{}{}{}{}{}}}}

Luego comprobamos si la entrada actualmente procesada es Wiki.

\AtEveryBibitem{
  \ifentrytype{online}{
    \ifnameequals{author}{\wikitestname}
      {\DeclareFieldFormat{urldate}{\mkbibparens{\bibstring{lastmodified}\space#1}}}
      {\DeclareFieldFormat{urldate}{\mkbibparens{\bibstring{urlseen}\space#1}}}
  }
}

y cambie la cadena anterior urldateen consecuencia si es necesario.

\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}

ingrese la descripción de la imagen aquí


* biblatexdistingue entre names, fields y lists. Por ejemplo, authores a name, seriesa fieldy organizationa list. Hay diferentes macros para comprobar la igualdad entre esos campos. No se puede utilizar \iffieldequalstrpara comprobar si a es nameigual a una cadena determinada. Dado que los nombres son posiblemente la parte más compleja de lo que biblatexse tiene que tratar, también tienen las condiciones de identidad más complicadas. Después de todo, uno no querría que el nombre dado en un .bibarchivo Peter Smithcoincidiera con la cadena Smith, pero sí querría que ambos Peter Smithy Smith, Petercoincidieran, Peter Smithya que ambos formatos de entrada son igualmente válidos en el .bibarchivo. Por lo tanto, biblatexsolo acepta comparar con macros que se supone que ya incluyen la sintaxis del nombre adecuado tal como se indica en el .bblarchivo. En nuestro caso {}{{{}{Wikipedia}{W.}{}{}{}{}{}{}}}.


En una nota diferente. En este caso, podría ser bastante adecuado definir un tipo de entrada dedicado (podría gustarle llamarlo @wiki) para esta tarea.

Como parece que utiliza BibTeX como backend y no el biber (al menos en mi opinión) muy superior, primero exploremos nuestras posibilidades con BibTeX y luego veamos cuánto mejor podemos hacer con biber.

biblatexDe forma predeterminada, tiene seis tipos de entrada para modificaciones personalizadas: estas son customapara customf. Aquí usaremos customa.

De ahora en adelante, si quieres citar una entrada de la wiki, no uses @online/ @electronic, sino @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},
}

Los campos son los esperados; tenga en cuenta que urldatetoma la fecha en que se accedió por última vez al recurso y datela fecha en que se modificó por última vez, tal como era de esperar.

Una vez más tenemos

\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
  lastmodified = {last modified}
}

Finalmente tenemos el driver, el fragmento de código que imprime la entrada de bibliografía.

\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 controlador es casi una copia uno a uno del controlador ieee.bbxde @online, salvo por una ligera modificación en el dateárea para imprimir "última modificación".

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}

En bibercambio, podemos definir un nuevo tipo @wikisimplemente definiendo el controlador como se indicó anteriormente conwiki

\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}%
}

El .bibarchivo como se esperaba

@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},
}

El 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 MWE por encima del rendimiento ingrese la descripción de la imagen aquí


Con biber ahora se pueden agregar campos personalizados muy fácilmente; por ejemplo, un campo de licencia, que describe los términos de uso del@wiki entrada. Esto se puede hacer como se describe en¿Cómo incluir precio en la bibliografía?.

información relacionada