Esta es una pregunta de seguimiento para¿Cómo verificar si la entrada `country = {}` está vacía en una biblioteca BibLaTeX personalizada?
Tengo una biblioteca BibLaTeX personalizada con la entrada BiBLaTeX Contribution
, que uso para gestionar todas mis contribuciones orales y de carteles en conferencias, talleres, etc. Gracias a la ayuda que recibí en el sitio mencionado anteriormente, tengo un buen sistema de trabajo.
Sin embargo, hay algunos problemas estéticos: tengo una entrada llamada period
que incluye el período de tiempo de, por ejemplo, una conferencia. Aparecerá detrás del título del evento entre paréntesis (ver ejemplo a continuación). En un .dbx
archivo, declaro el campo de entrada period
como un tipo de datos de fecha y, por lo tanto, puedo llamar al comando \printperiod
. Hasta ahora, todo bien.
En algunas entradas de BibLaTeX, este campo period
está vacío, por lo que period = {}
.
¿Cómo puedo saber mediante una condición 'si', 'entonces', 'si no', si \printperiod
está imprimiendo texto, para decir si period = {}
?
Lo probé \iffieldundef{period}
y \ifciteindex
otras cosas pero no consigo que funcione.
Hasta ahora, aquí está primero el MWE:
\begin{filecontents}{contribution.dbx}
\DeclareDatamodelEntrytypes{contribution}
\DeclareDatamodelFields[type=field,datatype=literal]{
type,
invited,
title,
event,
eventshort,
eventtype,
league,
url,
place,
city,
country,
year,
note,
timestamp
}
\DeclareDatamodelFields[type=field, datatype=datepart]{
year,
month,
day,
periodyear,
periodmonth,
periodday
}
\DeclareDatamodelFields[type=field, datatype=date, skipout]{
date,
period,
}
\DeclareDatamodelFields[type=list,datatype=name]{
author,
presenter,
}
\DeclareDatamodelEntryfields[contribution]{
type,
invited,
author,
presenter,
title,
event,
eventshort,
eventtype,
league,
url,
place,
city,
country,
date,
period,
year,
note,
timestamp}
\end{filecontents}
\begin{filecontents}{\jobname.bib}
@Contribution{Oral_2016_1,
Type = {Oral},
Invited = {invited},
Author = {Author1, A. and Author2, B. and Author3, C. and Author4, D.},
Presenter = {Author2, B.},
Title = {{Cool stuff about the nano-world}},
Event = {{22$^{\rm nd}$ International Conference on Nanotechnology}},
Eventshort= {{NANO-7}},
Eventtype = {Conference},
League = {International},
URL = {},
Place = {Alto University},
City = {Helsinki},
Country = {Finland},
Date = {2016-05-31},
Period = {2016-05-22/2016-06-02},
Year = {2016},
Note = {},
Timestamp = {}
}
@Contribution{Oral_2016_2,
Type = {Oral},
Invited = {},
Author = {Author1, A. and Author2, B. and Author3, C. and Author4, D.},
Presenter = {Author1, B.},
Title = {{Cool stuff about the nano-world}},
Event = {{22$^{\rm nd}$ International Workshop on NanoPhenomena}},
Eventshort= {{IWNP-8}},
Eventtype = {Workshop},
League = {International},
URL = {},
Place = {University of Nano},
City = {Tokyo},
Country = {Japan},
Date = {2016-03-04},
Period = {},
Year = {2016},
Note = {},
Timestamp = {}
}
\end{filecontents}
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[datamodel=contribution,
style=chem-acs,
dateabbrev=false,
natbib=true,
backend=biber]
{biblatex}
\addbibresource{\jobname.bib}
% My own command, which puts into format and prints the complete contribution.
\DeclareCiteCommand{\citeallstuff}
{\defcounter{maxnames}{99}%
\defcounter{minnames}{99}%
\defcounter{uniquename}{2}%
\boolfalse{citetracker}%
\boolfalse{pagetracker}%
\usebibmacro{prenote}}
{%
\ifciteindex{\indexnames*{labelname}}{}\printnames{labelname}, %
\iffieldundef{title}{}{\textit{\printtext{\printfield{title}}}\space}%
\iffieldundef{event}{}{\printtext{\printfield{event}}}%
\space(\printperiod)\addcomma\space% <============ What must I do there?
\iffieldundef{city}{}{\printtext{\printfield{city}}}%
\iffieldundef{country}{\addcomma\space}{ \printtext{(\printfield{country}})\addcomma\space}%
\printdate% <============ The same here?
\iffieldundef{note}{}{\addcomma\space\printtext{\printfield{note}}}%
\iffieldundef{invited}{}{\addcomma\space{\textbf{\printtext{\printfield{invited}}}}}
}
{\multicitedelim}
{\usebibmacro{postnote}}
\begin{document}
\noindent\citeallstuff{Oral_2016_1}\\\\\\
\citeallstuff{Oral_2016_2}
\printbibliography
\end{document}
Como se puede ver, la segunda cita tiene un () detrás del título del evento, porque el campo 'punto' está vacío period = {}
. En este caso no deberían aparecer los dos corchetes sino una coma y un espacio.
Gracias por un poco de ayuda.
PD: Pequeña pregunta adicional: ¿Cómo puedo cambiar, por ejemplo, May 31
a May 31$^{\rm st}$
?
Respuesta1
Aquí hay una combinación de dos cuestiones.
El número 1 es que no debes escribir formato simple en bibmacros ni citar comandos, debes usar \DeclareFieldFormat
y amigos.
entonces escribe
\DeclareFieldFormat{perioddate}{\mkbibparens{#1}}
y luego más tarde
\printperioddate
y la fecha del período estará entre paréntesis. Con este método no es necesario comprobar si el campo está vacío. Si está vacío no obtienes nada, si contiene algo lo recuperas en el formato correcto. Si realmente debe verificar si una fecha está definida, el método estándar es verificar la parte del año.
\iffieldundef{periodyear}
{<no date>}
{<date>}
biblatex
Solo imprimirá una fecha si tiene un año y si la fecha tiene un año, biblatex
imprime al menos eso.
Sin embargo , todo esto no funciona con biblatex
3.7/Biber 2.8, si ingresa campos vacíos 'explícitamente' como
perioddate = {}
En ese caso, obtendrá una devolución periodyear = {}
, lo que confunde a todos, porque en lo que biblatex
respecta a eso cuenta como un año definido.
Este es un error conocido que se resolverá con Biber 2.8, consultehttps://github.com/plk/biblatex/issues/528.
Mientras tanto, todo lo que puedes hacer es abandonar el extraño hábito de escribir perioddate = {}
campos vacíos en lugar de dejarlos completamente fuera de la entrada. Si por alguna razón no quieres hacer eso, deja que Biber lo haga por ti con
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=perioddate, match=\regexp{^$}, final]
\step[fieldset=perioddate, null]
}
}
}