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 .dbx
Datei deklariere ich das Eingabefeld period
als Datumsdatentyp und kann daher den Befehl aufrufen \printperiod
. So weit, so gut.
In einigen BibLaTeX-Einträgen period
ist dieses Feld leer, daher period = {}
.
Wie kann ich über eine „wenn“, „dann“ und „sonst“ Bedingung herausfinden, ob \printperiod
Text gedruckt wird, also ob period = {}
?
Ich habe es und andere Dinge ausprobiert \iffieldundef{period}
, \ifciteindex
aber 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}
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 31
in ä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 \DeclareFieldFormat
und 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>}
biblatex
druckt ein Datum nur dann, wenn es ein Jahr enthält, und wenn das Datum ein Jahr enthält, biblatex
wird mindestens dieses gedruckt.
Dies alles funktioniert biblatex
jedoch 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 biblatex
dies 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]
}
}
}