\printdate のようなコマンドが「空の」テキストを印刷しないかどうかをテストするにはどうすればよいですか?

\printdate のようなコマンドが「空の」テキストを印刷しないかどうかをテストするにはどうすればよいですか?

これは次の質問に対するフォローアップですカスタム BibLaTeX ライブラリでエントリ `country = {}` が空かどうかを確認するにはどうすればよいですか?

私は BiBLaTeX エントリを含むカスタム BibLaTeX ライブラリを持っておりContribution、これを使用して会議やワークショップなどでの口頭発表やポスター発表をすべて管理しています。上記のサイトで得た助けのおかげで、うまく機能するシステムを持つことができました。

periodただし、見た目の問題がいくつかあります。たとえば、会議の期間を含む というエントリがあります。これは、イベント タイトルの後ろに括弧で囲んで表示されます (以下の例を参照)。.dbxファイルでは、エントリ フィールドをperiod日付データ型として宣言しているため、 コマンド を呼び出すことができます\printperiod。ここまでは順調です。

一部の BibLaTeX エントリではこのフィールドperiodは空なので、period = {}.

\printperiod'if'、'then'、'else' 条件を使用して、テキストが印刷されているかどうか、つまり if と表示されている場合、どうすれば確認できますかperiod = {}?

\iffieldundef{period}、その他も試してみました\ifciteindexが、うまくいきません。

これまでのところ、まず 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}

MWEの出力

ご覧のとおり、2 番目の引用では、フィールド「ピリオド」が空であるため、イベント タイトルの後ろに () が表示されますperiod = {}。この場合、2 つの括弧は表示されず、代わりにコンマとスペースが表示されます。

助けてくれてありがとう。

PS: ちょっとした追加の質問: たとえば、May 31を に変更するにはどうすればいいですかMay 31$^{\rm st}$?

答え1

ここでは 2 つの問題が組み合わされています。

1 つ目は、bibmacros や cite コマンドに単なる書式を記述するのではなく、\DeclareFieldFormatや などのコマンドを使用する必要があるということです。

だから書いて

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

そしてその後

\printperioddate

期間の日付は括弧で囲まれます。この方法では、フィールドが空かどうかをチェックする必要はありません。空の場合は何も返されませんが、何かが含まれている場合は正しい形式で返されます。日付が定義されているかどうかを本当に確認する必要がある場合は、標準的な方法は年の部分を確認することです。

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

biblatex日付に年が含まれている場合のみ日付を印刷し、日付に年が含まれている場合はbiblatex少なくともその年を印刷します。

ただし、3.7/Biber 2.8ではbiblatex、空のフィールドを「明示的に」入力すると、

perioddate = {}

その場合、あなたは戻ってくることになりますが、それは皆を混乱させるでしょう。なぜなら、それは定められた年としてカウントされるperiodyear = {}からです。biblatex

これは既知のバグであり、Biber 2.8で解決される予定です。https://github.com/plk/biblatex/issues/528

それまでの間、あなたができるのは、perioddate = {}エントリから完全に除外するのではなく、空のフィールドを書くという奇妙な習慣をやめることだけです。何らかの理由でそれをしたくない場合は、Biberに任せてください。

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

関連情報