
Ich versuche, Unterkategorien für meine Bibliographie mit Überschriften nach Jahr zu erstellen (mit Biblatex). Ich habe herausgefunden, dass ich mit defbibcheck nach Jahr wie folgt prüfen kann:
\defbibcheck{2013}{
\iffieldint{origyear}
{\ifnumequal{\thefield{origyear}}{2013}
{}
{\skipentry}
}
{\iffieldint{2013}
{\ifnumequal{\thefield{year}}{2013}
{}
{\skipentry}
}
{\skipentry}
}
}
Da es jedoch viele Jahre sind, möchte ich nicht für jedes Jahr eine Kopie davon haben. Ich dachte, ich könnte \foreach
das pgffor
Paket folgendermaßen verwenden:
\foreach \year in {2012,2013}{%
\defbibcheck{\year}{
\iffieldint{origyear}
{\ifnumequal{\thefield{origyear}}{\year}
{}
{\skipentry}
}
{\iffieldint{\year}
{\ifnumequal{\thefield{year}}{\year}
{}
{\skipentry}
}
{\skipentry}
}
}
}
\prinbibliography[check=2013]
Das Ergebnis ist jedoch: Check '2013' not found.
Gibt es eine andere Möglichkeit, dies zu tun?
Bearbeiten: Minimales, nicht funktionierendes Beispiel unten:
\documentclass{article}
\usepackage{filecontents}
\usepackage{pgffor}
\usepackage{biblatex}
\foreach \year in {2012,2013}{%
\defbibcheck{\year}{
\iffieldint{origyear}
{\ifnumequal{\thefield{origyear}}{\year}
{}
{\skipentry}
}
{\iffieldint{\year}
{\ifnumequal{\thefield{year}}{\year}
{}
{\skipentry}
}
{\skipentry}
}
}
}
\begin{filecontents*}{\jobname.bib}
@inproceedings{Bar2013,
author = {F. Bar and B. Foo},
booktitle = {The conference on nothing},
pages = {1--2},
title = {{A meaningless title}},
year = {2013}
}
@inproceedings{Bar2012,
author = {F. Bar},
booktitle = {International Conference on Information},
pages = {3--4},
title = {{Advanced functionality and performance or nothing }},
year = {2012}
}
\end{filecontents*}
\addbibresource{\jobname.bib}
\begin{document}
\nocite{*}
\printbibliography[check=2013]
\end{document}
Antwort1
Etwas wie das?
\begin{filecontents*}{\jobname.bib}
@inproceedings{Bar2011,
author = {F. Bar and B. Foo},
booktitle = {The conference 2011 on nothing},
pages = {1--2},
title = {{A meaningless title}},
year = {2011}
}
@inproceedings{Bar2013,
author = {F. Bar and B. Foo},
booktitle = {The conference 2013 on nothing},
pages = {1--2},
title = {{A meaningless title}},
year = 2013
}
@inproceedings{Bar2012,
author = {F. Bar},
booktitle = {International Conference on Information 2012},
pages = {3--4},
title = {{Advanced functionality and performance or nothing }},
year = {2012}
}
@inproceedings{Bar2012b,
author = {F. Bar and B. Foo},
booktitle = {The conference on nothing},
pages = {1--2},
title = {{A meaningless title}},
year = {2012}
}
@inproceedings{Bar2014,
author = {F. Bar and B. Foo},
booktitle = {The conference on nothing 2014},
pages = {1--2},
title = {{A meaningless title}},
year = {2014}
}
\end{filecontents*}
\documentclass{article}
\usepackage{filecontents}
\usepackage{pgffor}
\usepackage{biblatex}
\defbibcheck{ylist}{%
\iffieldint{year}{%
\xdef\fldyear{\thefield{year}}\xdef\doskip{1}%
\foreach \yr in \yrlist{%
\ifnumequal{\fldyear}{\yr}{\xdef\doskip{0}\breakforeach}{}%
}%
\ifnumequal{\doskip}{1}{\skipentry}{}%
}%
{\skipentry}%
}
\addbibresource{\jobname.bib}
\begin{document}
\def\yrlist{2012,2013,2011,2010}
Years: \yrlist
\nocite{*}
\printbibliography[check=ylist]
\end{document}
Bearbeiten: MWE
für Referenzen nach Jahr:
\begin{filecontents*}{\jobname.bib}
@inproceedings{Bar2011,
author = {F. Bar and B. Foo},
booktitle = {The conference 2011 on nothing},
pages = {1--2},
title = {{A meaningless title}},
year = {2011}
}
@inproceedings{Bar2013,
author = {F. Bar and B. Foo},
booktitle = {The conference 2013 on nothing},
pages = {1--2},
title = {{A meaningless title}},
year = 2013
}
@inproceedings{Bar2012,
author = {F. Bar},
booktitle = {International Conference on Information 2012},
pages = {3--4},
title = {{Advanced functionality and performance or nothing }},
year = {2012}
}
@inproceedings{Bar2012b,
author = {F. Bar and B. Foo},
booktitle = {The conference on nothing},
pages = {1--2},
title = {{A meaningless title}},
year = {2012}
}
@inproceedings{Bar2014,
author = {F. Bar and B. Foo},
booktitle = {The conference on nothing 2014},
pages = {1--2},
title = {{A meaningless title}},
year = {2014}
}
\end{filecontents*}
\documentclass{article}
\usepackage{filecontents}
\usepackage{pgffor}
\usepackage{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
\nocite{*}
%
\def\yrlist{2011,2012,2013}
\foreach \yr in \yrlist{%
\defbibcheck{ylist}{%
\iffieldint{year}{%
\ifnumequal{\thefield{year}}{\yr}{}{\skipentry}%
}%
{\skipentry}%
}%
\renewcommand{\refname}{REFERENCES: \yr}%
\printbibliography[check=ylist]
}
\end{document}
Antwort2
Sie könnten sich anpassenAudreys AntwortZuein sehr ähnliches Problem (Wie kann ich die Bibliographie alphabetisch aufteilen?).
\makeatletter
\def\ifskipbib{\iftoggle{blx@skipbib}}
\makeatother
\def\yearlist{}
\forcsvlist{\listadd\yearlist}{2010,2011,2012,2013}
\forlistloop{\DeclareBibliographyCategory}{\yearlist}
\renewcommand*{\do}[1]{\defbibheading{#1}{\section*{#1}}}
\dolistloop{\yearlist}
\AtDataInput{\ifskipbib{}{\addtocategory{\thefield{year}}{\thefield{entrykey}}}}
Der erste Codeblock stellt sicher, dass Einträge übersprungen werden, die nicht in der Bibliografie erscheinen (Sie möchten dort nicht, dass ein leeres Jahr 2010 steht).
Der zweite Block durchläuft alle in der zweiten Zeile angegebenen Jahre und erstellt für jedes Jahr eine andere Kategorie. Anschließend werden die Überschriften für diese Unterbibliographien definiert. Abschließend ordnet die letzte Zeile die Einträge ihrer Jahreskategorie zu.
\documentclass{article}
\usepackage{biblatex}
\begin{filecontents*}{\jobname.bib}
@inproceedings{Bar2013,
author = {F. Bar and B. Foo},
booktitle = {The conference on nothing},
pages = {1--2},
title = {{A meaningless title}},
year = {2013}
}
@inproceedings{Bar2012,
author = {F. Bar},
booktitle = {International Conference on Information},
pages = {3--4},
title = {{Advanced functionality and performance or nothing }},
year = {2012}
}
\end{filecontents*}
\makeatletter
\def\ifskipbib{\iftoggle{blx@skipbib}}
\makeatother
\def\yearlist{}
\forcsvlist{\listadd\yearlist}{2010,2011,2012,2013}
\forlistloop{\DeclareBibliographyCategory}{\yearlist}
\renewcommand*{\do}[1]{\defbibheading{#1}{\section*{#1}}}
\dolistloop{\yearlist}
\AtDataInput{\ifskipbib{}{\addtocategory{\thefield{year}}{\thefield{entrykey}}}}
\addbibresource{\jobname.bib}
\begin{document}
\nocite{*}
\printbibheading
\bibbycategory
\end{document}
Es gibt auch eine halbautomatische Version Ihres Codes.
Durch die Definition eines neuen Befehls
\newcommand{\yearcheck}[1]{%
\defbibcheck{#1}{
\iffieldint{origyear}
{\ifnumequal{\thefield{origyear}}{#1}
{}
{\skipentry}
}
{\iffieldint{year}
{\ifnumequal{\thefield{year}}{#1}
{}
{\skipentry}
}
{\skipentry}
}
}
}
Damit kann man dann Jahres-Bibchecks erstellen über
\yearcheck{2012}
\yearcheck{2013}
Das scheint innerhalb einer \foeach
Schleife wie dieser nicht zu funktionieren.\foreach \year in {2012,2013} {\yearcheck{\year}}
Oder, viel besser, über eine Schleife (danke an @g.kov)
\foreach \year in {2012,2013} {\global\yearcheck{\year}}
Der Ausdruck des Literaturverzeichnisses kann auch über eine Schleife erfolgen
\foreach \year in {2012,2013} {\printbibliography[check=\year,title={\year}]}
MWE
\documentclass{article}
\usepackage{filecontents}
\usepackage{biblatex}
\usepackage{pgffor}
\newcommand{\yearcheck}[1]{%
\defbibcheck{#1}{
\iffieldint{origyear}
{\ifnumequal{\thefield{origyear}}{#1}
{}
{\skipentry}
}
{\iffieldint{year}
{\ifnumequal{\thefield{year}}{#1}
{}
{\skipentry}
}
{\skipentry}
}
}
}
\begin{filecontents*}{\jobname.bib}
@inproceedings{Bar2013,
author = {F. Bar and B. Foo},
booktitle = {The conference on nothing},
pages = {1--2},
title = {{A meaningless title}},
year = {2013}
}
@inproceedings{Bar2012,
author = {F. Bar},
booktitle = {International Conference on Information},
pages = {3--4},
title = {{Advanced functionality and performance or nothing }},
year = {2012}
}
\end{filecontents*}
\addbibresource{\jobname.bib}
\foreach \year in {2012,2013} {\global\yearcheck{\year}}
\begin{document}
\nocite{*}
\foreach \year in {2012,2013} {\printbibliography[check=\year,title={\year}]}
\end{document}