%20setzt%20leere%20Klammern%2C%20wenn%20das%20Datum%20leer%20ist.png)
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}
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 \printtext
nicht 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 biblatex
Codes 's verwenden, \ifthenelse
verwendet der meiste neuere Code etoolbox
's \ifboolexpr
. Beachten Sie, dass intern für biblatex
kein Feld vorhanden ist . date
Wenn Sie auf die Existenz von testen möchten, date
ist 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-apa
kürzlich eine Version von implementiert wurde, \printtext
die 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 biblatex
Kern 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}
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}