BibLaTeX (Autorjahr) setzt leere Klammern, wenn das Datum leer ist

BibLaTeX (Autorjahr) setzt leere Klammern, wenn das Datum leer ist

Ich möchte das Feld von BibLaTeX für „in Vorbereitung“ befindliche Veröffentlichungen verwenden pubstate, die noch kein Veröffentlichungsdatum haben (leeres Datumsfeld), wie dieses im Autorjahresstil:

@Article{Test,
author       = {Author, A.},
journaltitle = {A Journal},
title        = {A Title},
pubstate     = {inpreparation},
}

Allerdings bleibt dadurch nach dem Zeitschriftennamen eine leere Klammer:

\documentclass{article}
\usepackage[backend=biber, style=authoryear]{biblatex}
\addbibresource{Bib2.bib}

\begin{document}
Test \parencite{Test}.

\printbibliography
\end{document}

Bildbeschreibung hier eingeben

Wie kann ich das entfernen?

Antwort1

Das zugrunde liegende Problem besteht darin, dass \print(field|list|names|date)der Befehl im Gegensatz zu seinen Kollegen \printtextnicht im Voraus weiß, ob er etwas drucken wird. Er wird also immer das Formatierungsargument anwenden, auch wenn sich später herausstellt, dass nichts gedruckt werden soll. Hier bedeutet das, dass wir am Ende ein leeres Klammernpaar haben.

Eine Möglichkeit, dies zu umgehen, besteht darin, vor dem Aufruf zu prüfen, ob wir etwas drucken möchten \printtext.

Während einige biblatexCodes 's verwenden, \ifthenelseverwendet der meiste neuere Code etoolbox's \ifboolexpr. Beachten Sie, dass intern für biblatexkein Feld vorhanden ist . dateWenn Sie auf die Existenz von testen möchten, dateist es besser, auf zu testen.year

\renewbibmacro*{issue+date}{%
  \ifboolexpr{test {\iffieldundef{issue}} and test {\iffieldundef{year}}}
    {}
    {\printtext[parens]{%
       \printfield{issue}%
       \setunit*{\addspace}%
       \usebibmacro{date}}%
     \newunit}}

Siehe auchhttps://github.com/plk/biblatex/issues/793.

Es könnte für manche Leute interessant sein, dass biblatex-apakürzlich eine Version von implementiert wurde, \printtextdie automatisch prüft, ob etwas gedruckt wird und die Formatierung unterdrückt, wenn dies nicht der Fall ist. Siehehttps://github.com/plk/biblatex-apa/pull/99. Wenn sich herausstellt, dass dieser Befehl keine negativen Nebenwirkungen hat, sollten wir darüber nachdenken, ihn in den biblatexKern zu verschieben, aber er muss noch weiter getestet werden (und die Implementierung fühlt sich sehr nach Betrug an).

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=authoryear, backend=biber]{biblatex}

\renewbibmacro*{issue+date}{%
  \printtexte[parens]{%
    \printfield{issue}%
    \setunit*{\addspace}%
    \usebibmacro{date}}%
  \newunit}

% implement \printtexte
\makeatletter
% Optional parens/brackets
% Thanks to egreg from https://tex.stackexchange.com/questions/53068/how-to-check-if-a-macro-value-is-empty-or-will-not-create-text-with-plain-tex-co
% for this test for expanded emptiness so that we can easily opt to not print parens around nothing
% Without this, it is very messy - you have to test all potential fields for defness first and this
% is messy because the fields in the additional info vary betwee entrytypes
\def\foreverunspace{%
  \ifnum\lastnodetype=11
    \unskip\foreverunspace
  \else
    \ifnum\lastnodetype=12
      \unkern\foreverunspace
    \else
      \ifnum\lastnodetype=13
        \unpenalty\foreverunspace
      \fi
    \fi
  \fi
}

% we need a way to save the state of the punctuation buffer
% cf. \blx@initunit in biblatex.sty for what we need to copy

% this uses the internal implementation of etoolbox toggles
% fingers crossed no one messes with it
\newrobustcmd*{\apablx@savetoggle}[1]{%
  \csletcs{apablx@savedtoggle@#1}{etb@tgl@#1}}

\newrobustcmd*{\apablx@restoretoggle}[1]{%
  \csletcs{etb@tgl@#1}{apablx@savedtoggle@#1}}

\newrobustcmd*{\apablx@savepunctstate}{%
  \apablx@savetoggle{blx@block}%
  \apablx@savetoggle{blx@unit}%
  \apablx@savetoggle{blx@insert}%
  \apablx@savetoggle{blx@lastins}%
  \apablx@savetoggle{blx@keepunit}%
  \let\apablx@savd@unitpunct\blx@unitpunct
  \let\apablx@savd@puncthook\abx@puncthook}

\newrobustcmd*{\apablx@restorepunctstate}{%
  \global\apablx@restoretoggle{blx@block}%
  \global\apablx@restoretoggle{blx@unit}%
  \global\apablx@restoretoggle{blx@insert}%
  \global\apablx@restoretoggle{blx@lastins}%
  \global\apablx@restoretoggle{blx@keepunit}%
  \global\let\blx@unitpunct\apablx@savd@unitpunct
  \global\let\abx@puncthook\apablx@savd@puncthook}

% printtext that checks if it would print anything
\newrobustcmd{\printtexte}[2][]{%
  \apablx@savepunctstate
  \setbox0=\hbox{#2\foreverunspace}%
  \apablx@restorepunctstate
  \ifdim\wd0=0pt
  \else
    \ifblank{#1}
      {\printtext{#2}}
      {\printtext[#1]{#2}}%
  \fi}
\makeatother


\begin{filecontents}{\jobname.bib}
@article{test,
  author       = {Author, A.},
  journaltitle = {A Journal},
  title        = {A Title},
  pubstate     = {inpreparation},
}
\end{filecontents}
\addbibresource{\jobname.bib}


\begin{document}
\autocite{test}
\printbibliography
\end{document}

Autor, A. (o.N.). „Ein Titel“. In: A Journal. In Vorbereitung.

Antwort2

Lösung gefunden:

\renewbibmacro*{issue+date}{%
\ifthenelse{\ifentrytype{article}\AND\iffieldundef{date}\AND\iffieldundef{issue}}
    {}
    {\ifthenelse{\iffieldundef{issue}}
        {}
        {\printtext[parens]{%
        \printfield{issue}%
        \setunit*{\addspace}%
        \usebibmacro{date}}}}%
\newunit}

verwandte Informationen