\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의 출력

보시다시피, 두 번째 인용에는 이벤트 제목 뒤에 ()가 있습니다. '기간' 필드가 비어 있기 때문입니다 period = {}. 이 경우 두 개의 대괄호가 표시되지 않고 대신 쉼표와 공백이 표시되어야 합니다.

도움을 주셔서 감사합니다.

May 31추신: 작은 추가 질문: 예를 들어 로 어떻게 변경할 수 있습니까 May 31$^{\rm st}$?

답변1

여기에는 두 가지 문제가 결합되어 있습니다.

첫 번째는 bibmacros나 인용 명령에 단순한 서식을 작성해서는 안 되며 \DeclareFieldFormat친구를 사용해야 한다는 것입니다.

그러니 쓰세요

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

그리고 나중에

\printperioddate

기간 날짜는 괄호 안에 표시됩니다. 이 방법을 사용하면 필드가 비어 있는지 확인할 필요가 없습니다. 비어 있으면 아무것도 얻지 못하고, 무언가가 포함되어 있으면 올바른 형식으로 다시 가져옵니다. 날짜가 정의되어 있는지 꼭 확인해야 하는 경우 표준 방법은 연도 부분을 확인하는 것입니다.

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

biblatex연도가 있는 경우에만 날짜를 인쇄하고 날짜에 연도가 있는 경우 biblatex최소한 그 연도를 인쇄합니다.

이 모든 것은 biblatex3.7/Biber 2.8에서는 작동하지 않습니다. 그러나 다음과 같이 빈 필드를 '명시적으로' 입력하면

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]
      }
    }
}

관련 정보