Como testar se comandos do tipo \printdate não imprimem texto 'vazio'?

Como testar se comandos do tipo \printdate não imprimem texto 'vazio'?

Esta é uma pergunta complementar paraComo verificar se a entrada `country = {}` está vazia em uma biblioteca BibLaTeX personalizada?

Eu tenho uma biblioteca BibLaTeX personalizada com a entrada BiBLaTeX Contribution, que uso para gerenciar todas as minhas contribuições orais e de pôsteres em conferências, workshops etc. Graças à ajuda que recebi no site mencionado acima, tenho um bom sistema de trabalho.

No entanto, existem algumas questões cosméticas: tenho uma entrada chamada periodque inclui o período de tempo de, por exemplo, uma conferência. Deve aparecer atrás do título do evento entre colchetes (veja exemplo abaixo). Em um .dbxarquivo, declaro o campo de entrada periodcomo um tipo de dados de data e, portanto, posso chamar o comando \printperiod. Até agora tudo bem.

Em algumas entradas do BibLaTeX, este campo periodestá vazio, então period = {}.

Como posso descobrir através de uma condição 'if', 'then' 'else', se \printperiodestá imprimindo texto, para dizer if period = {}?

Eu tentei e outras coisas \iffieldundef{period}, \ifciteindexmas não consegui funcionar.

Até agora, aqui está primeiro o 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}

A saída do MWE

Como se pode observar, a segunda citação possui um () atrás do título do evento, pois o campo ‘ponto final’ está vazio, period = {}. Neste caso, os dois colchetes não devem aparecer, mas sim uma vírgula e um espaço.

Obrigado por alguma ajuda.

PS: Pequena pergunta adicional: Como posso mudar, por exemplo, May 31para May 31$^{\rm st}$?

Responder1

Há uma combinação de duas questões aqui.

O número 1 é que você não deve escrever formatação simples em bibmacros ou citar comandos, você deve usar \DeclareFieldFormate amigos.

Então escreva

\DeclareFieldFormat{perioddate}{\mkbibparens{#1}}

e depois

\printperioddate

e a data do período será colocada entre parênteses. Com este método você não precisa verificar se o campo está vazio. Se estiver vazio você não ganha nada, se contiver algo você recebe de volta no formato correto. Se você realmente precisa verificar se uma data está definida, o método padrão é verificar a parte do ano

\iffieldundef{periodyear}
  {<no date>}
  {<date>}

biblatexsó imprimirá uma data se tiver um ano e se a data tiver um ano, biblateximprime pelo menos isso.

Tudo isso não funciona com biblatex3.7/Biber 2.8, entretanto, se você inserir campos vazios 'explicitamente' como

perioddate = {}

Nesse caso você vai voltar, periodyear = {}o que confunde a todos, porque no que biblatexdiz respeito isso conta como um ano definido.

Este é um bug conhecido que será resolvido com o Biber 2.8, vejahttps://github.com/plk/biblatex/issues/528.

Enquanto isso, tudo o que você pode fazer é abandonar o estranho hábito de escrever perioddate = {}em campos vazios, em vez de deixá-los completamente fora da entrada. Se por algum motivo você não quiser fazer isso, deixe o Biber fazer isso por você com

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=perioddate, match=\regexp{^$}, final]
      \step[fieldset=perioddate, null]
      }
    }
}

informação relacionada