Wie testet man, ob Befehle wie \printdate keinen „leeren“ Text drucken?

Wie testet man, ob Befehle wie \printdate keinen „leeren“ Text drucken?

Dies ist eine Folgefrage zuWie überprüfe ich, ob der Eintrag „country = {}“ in einer benutzerdefinierten BibLaTeX-Bibliothek leer ist?

Ich habe eine benutzerdefinierte BibLaTeX-Bibliothek mit dem BiBLaTeX-Eintrag Contribution, die ich zur Verwaltung aller meiner mündlichen Beiträge und Posterbeiträge auf Konferenzen, Workshops usw. verwende. Dank der Hilfe, die ich auf der oben genannten Site erhalten habe, habe ich ein gut funktionierendes System.

Allerdings gibt es ein paar kosmetische Probleme: Ich habe einen Eintrag namens period, der den Zeitraum beispielsweise einer Konferenz enthält. Dieser soll in Klammern hinter dem Veranstaltungstitel erscheinen (siehe Beispiel unten). In einer .dbxDatei deklariere ich das Eingabefeld periodals Datumsdatentyp und kann daher den Befehl aufrufen \printperiod. So weit, so gut.

In einigen BibLaTeX-Einträgen periodist dieses Feld leer, daher period = {}.

Wie kann ich über eine „wenn“, „dann“ und „sonst“ Bedingung herausfinden, ob \printperiodText gedruckt wird, also ob period = {}?

Ich habe es und andere Dinge ausprobiert \iffieldundef{period}, \ifciteindexaber ich kriege es nicht zum Laufen.

Hier zunächst das 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}

Die Leistung des MWE

Wie man sieht, steht bei der zweiten Quellenangabe ein () hinter dem Veranstaltungstitel, da das Feld 'Zeitraum' leer ist. period = {}In diesem Fall müssten die beiden Klammern nicht erscheinen, sondern ein Komma und ein Leerzeichen.

Danke für die Hilfe.

PS: Kleine Zusatzfrage: Wie kann ich zB May 31in ändern May 31$^{\rm st}$?

Antwort1

Hier liegen zwei Probleme zusammen.

Nr. 1 ist, dass Sie keine bloße Formatierung in Bibmacros oder Zitatbefehle schreiben sollten, Sie sollten \DeclareFieldFormatund Freunde verwenden.

Also schreibe

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

und dann später

\printperioddate

und das Periodendatum wird in Klammern gesetzt. Mit dieser Methode müssen Sie nicht prüfen, ob das Feld leer ist. Wenn es leer ist, erhalten Sie nichts, wenn es etwas enthält, erhalten Sie es im richtigen Format zurück. Wenn Sie wirklich prüfen müssen, ob ein Datum definiert ist, besteht die Standardmethode darin, nach dem Jahresteil zu suchen.

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

biblatexdruckt ein Datum nur dann, wenn es ein Jahr enthält, und wenn das Datum ein Jahr enthält, biblatexwird mindestens dieses gedruckt.

Dies alles funktioniert biblatexjedoch nicht mit 3.7/Biber 2.8, wenn Sie leere Felder 'explizit' als

perioddate = {}

In diesem Fall erhalten Sie eine Antwort periodyear = {}, die alle verwirrt, da biblatexdies für alle Beteiligten als definiertes Jahr gilt.

Dies ist ein bekannter Fehler, der mit Biber 2.8 behoben wird, siehehttps://github.com/plk/biblatex/issues/528.

In der Zwischenzeit können Sie nur die seltsame Angewohnheit aufgeben, perioddate = {}leere Felder zu schreiben, anstatt sie ganz aus dem Eintrag zu entfernen. Wenn Sie das aus irgendeinem Grund nicht tun möchten, lassen Sie Biber dies für Sie tun mit

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

verwandte Informationen