Ich will die Antwort in mehrere Schritte untergliedern, um so einzelne Fähigkeiten von `biblatex` nach und nach zu einem Ganzen zusammen zu führen.
1. Text zwischen zwei Titel einer *entry set* einfügen:
-------------------------------------------------------
Wenn es lediglich darum geht, zwischen die Titel jeder *entry set* den Text »`eine überarbeitete Version erschienen in`« zu setzen, dann müsste das durch Umdefinierung von `\entrysetpunct` möglich sein:
\documentclass{article}
\usepackage{selinput}
\SelectInputMappings{
adieresis={ä},
germandbls={ß},
}
\usepackage{filecontents}
\begin{filecontents}{testbibfile.bib}
@article {Lieb_1983_Int.J.Quantum.Chem._24_p.243,
author = {Lieb, Elliott H.},
title = {Density Functionals for Coulomb Systems},
journal = {Int. J. Quantum Chem.},
volume = {24},
number = {3},
publisher = {John Wiley & Sons, Inc.},
issn = {1097-461X},
url = {http://dx.doi.org/10.1002/qua.560240302},
doi = {10.1002/qua.560240302},
pages = {243--277},
year = {1983}
}
@incollection{Lieb_1982_InBook_Physics.as.Natural.Philosophy_p.111,
author = {Lieb, Elliott H.},
editor = {Shimony, Abner and Feshbach, Herman},
booktitle = {Physics as Natural Philosophy: Essays in Honor of Laszlo Tisza on His Seventy-Fifth Birthday},
title = {Density Functionals for Coulomb Systems},
year = {1982},
publisher = {MIT Press},
address = {Cambridge, MA},
pages = {111--149}
}
\end{filecontents}
\usepackage[
backend=biber,
language=german,
style=chem-angew,
pageranges=false,
articletitle=true,
chaptertitle=true,
]{biblatex}
\renewcommand*{\entrysetpunct}{; eine überarbeitete Version erschienen in }
\bibliography{testbibfile.bib}
\defbibentryset{Lieb_constrained_search}{Lieb_1982_InBook_Physics.as.Natural.Philosophy_p.111,Lieb_1983_Int.J.Quantum.Chem._24_p.243}
\begin{document}
Die ``constrained search'' Formulierung der Dichtefunktionaltheorie stammt von Levy und Lieb\cite{Lieb_constrained_search}.
\printbibliography
\end{document}
ergibt:
![Beispiel mit Text zwischen set-Elementen][1]
2. Sprachabhängigen Terminus für den eingefügten Text verwenden:
----------------------------------------------------------------
Schöner wäre natürlich, wenn man einen neuen sprachabhängigen Terminus definieren und diesen verwenden würde, um bei Einträgen in unterschiedlichen Sprachen ggf. einen Text in der jeweiligen Sprache zu haben. Dazu muss man eine eigene `.lbx`-Datei für jede relevante Sprache anlegen, in der man den entsprechenden Terminus definiert und das Mapping für die Sprache entsprechend ändern. Das könnte beispielsweise für Deutsch so aussehen:
\documentclass{article}
\usepackage{selinput}
\SelectInputMappings{
adieresis={ä},
germandbls={ß},
}
\usepackage{filecontents}
\begin{filecontents}{testbibfile.bib}
@article {Lieb_1983_Int.J.Quantum.Chem._24_p.243,
author = {Lieb, Elliott H.},
title = {Density Functionals for Coulomb Systems},
journal = {Int. J. Quantum Chem.},
volume = {24},
number = {3},
publisher = {John Wiley & Sons, Inc.},
issn = {1097-461X},
url = {http://dx.doi.org/10.1002/qua.560240302},
doi = {10.1002/qua.560240302},
pages = {243--277},
year = {1983}
}
@incollection{Lieb_1982_InBook_Physics.as.Natural.Philosophy_p.111,
author = {Lieb, Elliott H.},
editor = {Shimony, Abner and Feshbach, Herman},
booktitle = {Physics as Natural Philosophy: Essays in Honor of Laszlo Tisza on His Seventy-Fifth Birthday},
title = {Density Functionals for Coulomb Systems},
year = {1982},
publisher = {MIT Press},
address = {Cambridge, MA},
pages = {111--149}
}
\end{filecontents}
\begin{filecontents}{revised-german.lbx}
\InheritBibliographyExtras{german}
\NewBibliographyString{revised}
\DeclareBibliographyStrings{%
revised = {{eine überarbeitete Version erschienen in}{eine überarbeitete Version erschienen in}}%
}
\end{filecontents}
\usepackage[
backend=biber,
language=german,
style=chem-angew,
pageranges=false,
articletitle=true,
chaptertitle=true,
]{biblatex}
\DeclareLanguageMapping{german}{revised-german}
\renewcommand*{\entrysetpunct}{; \bibstring{revised} }
\bibliography{testbibfile.bib}
\defbibentryset{Lieb_constrained_search}{Lieb_1982_InBook_Physics.as.Natural.Philosophy_p.111,Lieb_1983_Int.J.Quantum.Chem._24_p.243}
\begin{document}
Die ``constrained search'' Formulierung der Dichtefunktionaltheorie stammt von Levy und Lieb\cite{Lieb_constrained_search}.
\printbibliography
\end{document}
Näheres zu `.lbx`-Dateien und sprachabhängigen Bezeichnern ist der `biblatex`-Anleitung zu entnehmen.
3. Revisionen als eigene Spezialform von *entry sets*:
------------------------------------------------------
Das ist leider etwas aufwändiger. Am einfachsten wäre, wenn man für ein *entry set* einfach eine neue Option *revised* setzen könnte. Während für normale Einträge ins Literaturverzeichnis eine Option einfach über das `option`-Feld des Eintrags gesetzt werden kann, ist das für eine *entry set* leider nicht möglich, die per `\defbibentryset` definiert wird, weil sie ja keinen eigenen Eintrag in der Literaturdatenbank hat.
Als erstes muss also die Möglichkeit geschaffen werden, trotzdem eine Option zu setzen. Dazu muss man etwas tiefer in `biblatex` wühlen und findet dann, dass Optionen eines Eintrags als Makro `\abx@field@options` während der Verarbeitung des Eintrags definiert sind. Leider können wir `\abx@field@options` nicht direkt bei der Verarbeitung des Eintrags setzen, weil dies ja innerhalb der `.bbl`-Datei erfolgt, die von `biber` erzeugt wird. Stattdessen definieren wir wieder eine neue Anweisung
\newcommand*{\defrevisedset}[2]{%
% Kleiner Umweg, um auch für eine entry set eine Option definieren zu können.
\@namedef{\detokenize{#1}.dorevise}{\def\abx@field@options{revised}}%
\defbibentryset{#1}{#2}%
}
Diese neue Anweisung wird mit denselben Parametern aufgerufen wie `\defbibentryset`, definiert aber zusätzlich eine Anweisung, die aus dem Namen der *entry set* und der Endung `.dorevise` besteht.
Zusätzlich wird der Befehl zur Verarbeitung von Einträgen `\blx@bbl@entry` gepatcht:
\patchcmd[\protected]{\blx@bbl@entry}{%
\begingroup
}{%
\begingroup
% Hier die Option von \defrevisedset für den Eintrag setzen:
\@nameuse{\detokenize{#1}.dorevise}%
}{}{\@latexerr{sorry patch failed}\@eha}
Das erste Argument dieses Befehls ist wieder der Name des Eintrags, also im Falle einer *entry set* der Name der *entry set*. Die Änderung besteht nun darin, dass unmittelbar nach dem initialen `\begingroup` die zuvor definierte Anweisung ausgeführt wird, falls sie definiert ist. Falls sie nicht definiert ist, erzeugt `\@nameuse` lediglich ein `\relax`, das nicht weiter stört.
Damit ist schon einmal sichergestellt, dass für alle *revised entry sets* die Option `revised` ausgeführt ist. Jetzt muss diese Option nur noch so definiert werden, dass sie das *toggle* `blx@revised` setzt:
\define@key{blx@opt@ent}{revised}[true]{% Neue Option für Einträge
\@nameuse{toggle#1}{blx@revised}%
}
Dabei ist `blx@opt@ent` die `keyvalue`-Klasse, die `biblatex` für Optionen von Einträgen verwendet.
Zum Schluss muss `\blx@finentry@inset` noch so gepatcht werden, dass im Falle einer *revised entry set*, also wenn *toggle* `blx@revised` gesetzt ist, direkt im Anschluss an `\entrysetpunct`, auch noch der *revised*-Terminus ausgegeben wird:
\patchcmd[\protected]\blx@finentry@inset{% zu \patchcmd siehe etoolbox
\entrysetpunct
}{%
{\entrysetpunct
{% Argumentklammer auf
\entrysetpunct
% Wenn der Schalter blx@revised gesetzt ist, zusätzlich den revised-Terminus ausgeben:
\iftoggle{blx@revised}{\bibstring{revised}}{}%
}
}% Argumentklammer zu
}{}{\@latexerr{sorry patch failed}\@eha}
Die zusätzlichen Klammern um `\entrysetpunct` und `\iftoggle` mit Argumenten wurden hier für den Fall eingefügt, dass `\entrysetpunct` ein nicht geklammertes Argument eines Befehls (gegenwärtig von `\blx@setunit`) ist, damit der neu eingefügte Teil dann ebenfalls zu einem Teil dieses Arguments wird.
Alles zusammen ergibt nun also beispielsweise:
\documentclass{article}
\usepackage{selinput}
\SelectInputMappings{
adieresis={ä},
germandbls={ß},
}
\usepackage{filecontents}
\begin{filecontents}{testbibfile.bib}
@article {Lieb_1983_Int.J.Quantum.Chem._24_p.243,
author = {Lieb, Elliott H.},
title = {Density Functionals for Coulomb Systems},
journal = {Int. J. Quantum Chem.},
volume = {24},
number = {3},
publisher = {John Wiley & Sons, Inc.},
issn = {1097-461X},
url = {http://dx.doi.org/10.1002/qua.560240302},
doi = {10.1002/qua.560240302},
pages = {243--277},
year = {1983}
}
@incollection{Lieb_1982_InBook_Physics.as.Natural.Philosophy_p.111,
author = {Lieb, Elliott H.},
editor = {Shimony, Abner and Feshbach, Herman},
booktitle = {Physics as Natural Philosophy: Essays in Honor of Laszlo Tisza on His Seventy-Fifth Birthday},
title = {Density Functionals for Coulomb Systems},
year = {1982},
publisher = {MIT Press},
address = {Cambridge, MA},
pages = {111--149}
}
\end{filecontents}
\begin{filecontents}{revised-german.lbx}
\InheritBibliographyExtras{german}
\NewBibliographyString{revised}
\DeclareBibliographyStrings{%
revised = {{eine überarbeitete Version erschienen in }%
{eine überarbeitete Version erschienen in }}%
}
\end{filecontents}
\usepackage[
backend=biber,
language=german,
style=chem-angew,
pageranges=false,
articletitle=true,
chaptertitle=true,
]{biblatex}
\makeatletter
\newtoggle{blx@revised}% Neuer Schalter
% einige Anweisungen von biblatex erweitern:
% \blx@finentry@inset gibt zwischen den Titeln einer Menge \entrysetpunct aus:
\patchcmd[\protected]\blx@finentry@inset{% zu \patchcmd siehe etoolbox
\entrysetpunct
}{%
% Für den Fall, dass \entrysetpunct ein nicht geklammertes Argument von
% \blx@setunit ist, werden zusätzliche Klammern eingefügt:
{\entrysetpunct
% Wenn der Schalter blx@revised gesetzt ist, zusätzlich den revised-Terminus ausgeben:
\iftoggle{blx@revised}{\bibstring{revised}}{}}%
}{}{\@latexerr{sorry patch failed}\@eha}
% \blx@bbl@entry Verarbeitet die einzelnen Einträge des Literaturverzeichnisses:
\patchcmd[\protected]{\blx@bbl@entry}{%
\begingroup
}{%
\begingroup
% Hier die Option von \defrevisedset für den Eintrag setzen:
\@nameuse{\detokenize{#1}.dorevise}%
}{}{\@latexerr{sorry patch failed}\@eha}
\define@key{blx@opt@ent}{revised}[true]{% Neue Option für Einträge
\@nameuse{toggle#1}{blx@revised}%
}
% Und eine neue Anweisung für revised entry sets
\newcommand*{\defrevisedset}[2]{%
% Kleiner Umweg, um auch für eine entry set eine Option definieren zu können.
\@namedef{\detokenize{#1}.dorevise}{\def\abx@field@options{revised}}%
\defbibentryset{#1}{#2}%
}
\makeatother
\DeclareLanguageMapping{german}{revised-german}
\bibliography{testbibfile.bib}
\defbibentryset{Lieb_constrained_search_notrevised}{Lieb_1982_InBook_Physics.as.Natural.Philosophy_p.111,Lieb_1983_Int.J.Quantum.Chem._24_p.243}
\defrevisedset{Lieb_constrained_search_revised}{Lieb_1982_InBook_Physics.as.Natural.Philosophy_p.111,Lieb_1983_Int.J.Quantum.Chem._24_p.243}
\defrevisedset{Lieb_constrained_search_revised2}{Lieb_1982_InBook_Physics.as.Natural.Philosophy_p.111,Lieb_1983_Int.J.Quantum.Chem._24_p.243}
\defbibentryset{Lieb_constrained_search_notrevised2}{Lieb_1982_InBook_Physics.as.Natural.Philosophy_p.111,Lieb_1983_Int.J.Quantum.Chem._24_p.243}
\begin{document}
Die ``constrained search'' Formulierung der Dichtefunktionaltheorie stammt von
Levy und Lieb\cite{Lieb_constrained_search_notrevised}
bzw. \cite{Lieb_constrained_search_revised} (revised)
\cite{Lieb_constrained_search_revised2} (revised) bzw.
\cite{Lieb_constrained_search_notrevised2}
\printbibliography
\end{document}
Mit der Ausgabe:
![einige *revised* andere nicht][2]
Dass ich zur Demonstration nur auf zwei Literaturdatenbankeinträge zurückgegriffen habe, hat seine Ursache darin, dass ich den Beispielcode klein halten wollte. Natürlich ergibt es keinen Sinn, die gleiche Menge zweimal als *entry set* und zweimal als *revised entry set* zu definieren. Das diente lediglich der Demonstration. Selbstverständlich geht es auch mit ganz unterschiedlichen Mengen, von denen einige *entry sets* und einige *revised entry sets* sind.
Näheres zu den Befehlen zum Patchen und zu *toggles* ist der Anleitung zu [`etoolbox`][3] zu entnehmen. Näheres zu `keyvalue`-Optionen ist der Anleitung zum Paket [`keyvalue`][4] zu entnehmen. Beide Pakete werden von `biblatex` intern verwendet.
Letztlich ist das ganze zwar ein Hack – immerhin werden interne Makros von `biblatex` gepatcht –, aber ich hoffe, dass er Dank der Verwendung von `etoolbox` eine gewisse Robustheit gegen kleinere Änderungen in `biblatex` besitzt. Sollte ein Patch schief gehen, gibt es auf jeden Fall eine Fehlermeldung.
[1]: http://texwelt.de/wissen/upfiles/example12.png
[2]: http://texwelt.de/wissen/upfiles/example13_1.png
[3]: http://www.ctan.org/pkg/etoolbox
[4]: http://www.ctan.org/pkg/keyvalue