von MoeWe » Mo 1. Jun 2020, 09:51
Das liegt an der etwas merkwürdigen Eigenart von unsrtdin, obwohl es ein numerischer Stil ist, das optionale Argument von \bibitem für ein eigenes (dann eigentlich immer nicht numerisches) Zitierlabel zu nutzen. Während plain z.B. in der .bbl-Datei, die LaTeX für die Zitate und das Literaturverzeichnis einliest,
\begin{thebibliography}{1}
\bibitem{Ref1A}
The authorA.
\newblock The titlea.
\newblock In {\em The bookA}, 2000.
\end{thebibliography}
produziert, macht unsrtdin
\begin{thebibliography}{2}
% this bibliography is generated by unsrtdin.bst [8.2] from 2005-12-21
\providecommand{\url}[1]{\texttt{#1}}
\expandafter\ifx\csname urlstyle\endcsname\relax
\providecommand{\doi}[1]{doi: #1}\else
\providecommand{\doi}{doi: \begingroup \urlstyle{rm}\Url}\fi
\bibitem[1]{Ref1B}
\textsc{authorB}, The:
\newblock The TitleB.
\newblock {In: }\emph{The bookB}, 2000
\end{thebibliography}
Wenn das optionale Argument von \bibitem verwendet wird, dann unterstützt multibib die Option labeled faktisch nicht mehr. Man kann multibib etwas auf die Sprünge helfen, indem man den Code, den es für \@bibitem (\bibitem ohne optionales Argument) nutzt, auch auf \@lbibitem (\bibitem mit optionalem Argument) ausbreitet. Schön anzusehen ist das nicht, aber es funktioniert.
\documentclass[11pt]{article}
\usepackage[resetlabels,labeled]{multibib}
\makeatletter
% Code für \@lbibitem analog zum Code für \@bibitem zugefügt
\def\newcites#1#2{%
\def\@suffixlist{#1,}%
\@for\@newrefname:=#2\do{%
\mylop\@suffixlist\to\@suffix
\expandafter\protected@edef\csname refname\@suffix\endcsname
{\@newrefname}%
\if@filesw
\expandafter\newwrite\csname @auxout\@suffix\endcsname
\expandafter\edef\csname @auxout\@suffix name\endcsname{\@suffix}%
\begingroup
\makeatletter
\@input@{\csname @auxout\@suffix name\endcsname .aux}%
\endgroup
\immediate\openout\csname @auxout\@suffix\endcsname
\csname @auxout\@suffix name\endcsname .aux
\fi
\@for\@citename:=\@mb@citenamelist\do{%
\expandafter\edef\csname \@citename\@suffix\endcsname{%
\let\noexpand\@citex\noexpand\mb@@citex
\let\noexpand\@newciteauxhandle\csname @auxout\@suffix\endcsname
\noexpand\csname\@citename\endcsname}%
}%
\expandafter\edef\csname nocite\@suffix\endcsname##1{{%
\let\noexpand\@auxout\csname @auxout\@suffix\endcsname
\noexpand\nocite{##1}}}%
\iflabeled % if option labeled
\expandafter\edef\csname @bibitem\@suffix\endcsname##1{%
\noexpand\item
\noexpand\if@filesw \noexpand\immediate\noexpand\write\noexpand\@auxout
{\noexpand\string\noexpand\bibcite{##1}%
{\@suffix\noexpand\the\noexpand\value{\noexpand\@listctr}}}%
\noexpand\fi
\noexpand\ignorespaces}%
\expandafter\edef\csname @lbibitem\@suffix\endcsname[##1]##2{%
\noexpand\item[\noexpand\@biblabel{##1}\noexpand\hfill]
\noexpand\if@filesw
{\noexpand\let\noexpand\protect\string\noexpand
\noexpand\immediate
\noexpand\write\noexpand\@auxout{%
\noexpand\string\noexpand\bibcite{##2}{\@suffix##1}}}
\noexpand\fi\noexpand\ignorespaces}%
\expandafter\edef\csname @biblabel\@suffix\endcsname##1{[\@suffix##1]}%
\fi % end if option labeled
\expandafter\edef\csname bibliography\@suffix\endcsname##1{{%
\let\noexpand\temp@auxout\noexpand\@auxout
\let\noexpand\addtocontents\noexpand\mb@addtocontents
\let\noexpand\@auxout\csname @auxout\@suffix\endcsname
\let\noexpand\jobname
\expandafter\noexpand\csname @auxout\@suffix name\endcsname
\let\noexpand\refname
\expandafter\noexpand\csname refname\@suffix\endcsname
\let\noexpand\bibname
\expandafter\noexpand\csname refname\@suffix\endcsname
\iflabeled
\let\noexpand\@bibitem
\expandafter\noexpand\csname @bibitem\@suffix\endcsname
\let\noexpand\@lbibitem
\expandafter\noexpand\csname @lbibitem\@suffix\endcsname
\let\noexpand\@biblabel
\expandafter\noexpand\csname @biblabel\@suffix\endcsname
\fi
\noexpand\bibliography{##1}%
}}
\expandafter\edef\csname bibliographystyle\@suffix\endcsname##1{%
\noexpand\if@filesw
\noexpand\immediate\noexpand\write\csname @auxout\@suffix\endcsname
{\noexpand\string\noexpand\bibstyle{##1}}%
\noexpand\fi}
}%
}
\makeatother
\begin{filecontents}{references.bib}
@inproceedings{Ref1,
title = {The Title},
year = {2000},
booktitle = {The book},
author = {The author},
}
\end{filecontents}
\begin{filecontents}{referencesA.bib}
@inproceedings{Ref1A,
title = {The TitleA},
year = {2000},
booktitle = {The bookA},
author = {The authorA},
}
\end{filecontents}
\begin{filecontents}{referencesB.bib}
@inproceedings{Ref1B,
title = {The TitleB},
year = {2000},
booktitle = {The bookB},
author = {The authorB},
}
\end{filecontents}
\newcites{A,B}{{The other list},{And annother list}}
\begin{document}
Citation from bib \cite{Ref1} and bib A \citeA{Ref1A} and at bib B \citeB{Ref1B}.
\bibliographystyle{unsrtdin}
\bibliography{references}
\bibliographystyleA{unsrtdin}
% multibib funktioniert nicht wenn statt plain unsrtdin verwendet wird
\bibliographyA{referencesA}
\bibliographystyleB{unsrtdin}
\bibliographyB{referencesB}
\end{document}
------
Ein anderer Lösungsansatz wäre es, unsrtdin die oben erwähnte Unart auszutreiben, das numerische Label in \bibitem zu setzen.
Dafür muss man in einer umbenannten Kopie(!) von unsrtdin.bst (sagen wir unsrtdin-nolab.bst) den Block
FUNCTION {output.bibitem}
{ newline$
"\bibitem[" write$
label write$%
"]{" write$
cite$ write$
"}" write$
newline$
""
before.all 'output.state :=
}
auf
FUNCTION {output.bibitem}
{ newline$
"\bibitem{" write$
cite$ write$
"}" write$
newline$
""
before.all 'output.state :=
}
verkürzen.
Füg dann noch einen Kurzen Kommentar zu Beginn der Datei mit der Änderung und dem Datum hinzu. Der Unterschied zu unsrtdin.bst in diff ist dann
--- unsrtdin.bst 2006-02-13 18:40:12.000000000 +0100
+++ unsrtdin-nolab.bst 2020-06-01 09:28:43.104700200 +0200
@@ -1,3 +1,6 @@
+%%%% unsrtdin-nolab.bst
+%%%% 2020-06-01
+%%%% avoid numeric labels in \bibitem
%% UNSRTDIN.BST Ausgabe [8.2] 2006-01-02
%% mit doi-, urn-, url-Funktionen
%% ersetzt UNSRTDIN.BST Ausgabe [8.1b3] 22.2.2005
@@ -286,9 +289,7 @@
FUNCTION {output.bibitem}
{ newline$
- "\bibitem[" write$
- label write$%
- "]{" write$
+ "\bibitem{" write$
cite$ write$
"}" write$
newline$
Wenn Du nicht weißt, wo Du unsrtdin.bst finden kannst, dann kannst Du die Datei mit kpsewhich unsrtin.bst in der Kommandozeile auf Deinem Rechner aufspüren. Du kannst die Datei aber auch von CTAN runterladen: https://ctan.org/tex-archive/biblio/bib ... an/din1505
Beachte, dass Deine umbenannte Kopie unsrtdin-nolab.bst an einem Ort sein muss, wo BibTeX sie finden kann. Für einmalige Anwendung ist es am einfachsten, die Datei in den gleichen Ordner zu legen, in dem auch Deine Haupt-TeX-Datei liegt. Siehe auch https://texfaq.org/FAQ-inst-wlcf
----
Wenn Dich niemand zwingt, unsrtdin zu verwenden, kannst Du darüber nachdenken, den Stil nicht zu nutzen. Die Norm DIN 1505-2, die der Stil implementiert, ist von 1984 und wurde schon 2013 von DIN-ISO 690 abgelöst und ist nicht mehr gültig. (Ferner find ich, dass einige typographische Entscheidungen in der DIN 1505-2 fraglich sind: Leerzeichen von dem Semikolon?)
Wenn Du noch nicht mal auf BibTeX festgelegt bist, dann würde ich Dir den Umstieg zu biblatex+Biber ans Herz legen. Da gehen solche Dinger viel schöner. (Z.B. musst Du nicht micht verschiedenen .bib-Dateien arbeiten, sondern kannst die Einträge direkt nach bestimmten Kriterien filtern.) Wenn wirklich nach Dateizugehörigkeit gefiltert werden soll, dann könnte man Dein Beispiel wie folgt implementieren
\documentclass[11pt]{article}
\usepackage[backend=biber, style=numeric, defernumbers=true]{biblatex}
\DeclareSourcemap{
\maps[datatype=bibtex, overwrite]{
\map{
\perdatasource{referencesA.bib}
\step[fieldset=keywords, fieldvalue={,}, appendstrict]
\step[fieldset=keywords, fieldvalue=A, append]
}
\map{
\perdatasource{referencesB.bib}
\step[fieldset=keywords, fieldvalue={,}, appendstrict]
\step[fieldset=keywords, fieldvalue=B, append]
}
}
}
\begin{filecontents}{references.bib}
@inproceedings{Ref1,
title = {The Title},
year = {2000},
booktitle = {The book},
author = {The author},
}
\end{filecontents}
\begin{filecontents}{referencesA.bib}
@inproceedings{Ref1A,
title = {The TitleA},
year = {2000},
booktitle = {The bookA},
author = {The authorA},
}
\end{filecontents}
\begin{filecontents}{referencesB.bib}
@inproceedings{Ref1B,
title = {The TitleB},
year = {2000},
booktitle = {The bookB},
author = {The authorB},
}
\end{filecontents}
\addbibresource{references.bib}
\addbibresource{referencesA.bib}
\addbibresource{referencesB.bib}
\begin{document}
Citation from bib \autocite{Ref1} and bib A \autocite{Ref1A} and at bib B \autocite{Ref1B}.
\printbibliography[notkeyword=A,notkeyword=B, title={Bib}]
\newrefcontext[labelprefix=A]
\printbibliography[keyword=A, title={Bib A}]
\newrefcontext[labelprefix=B]
\printbibliography[keyword=B, title={Bib B}]
\end{document}
Aber wie gesagt, wenn die Dateizugehörigkeit nur eine künstliche Methode ist, um nach anderen Eigenschaften zu filtern, dann geht es unter Umtsänden viel schöner.
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=numeric, defernumbers, backend=biber]{biblatex}
\addbibresource{biblatex-examples.bib}
\begin{document}
Lorem \autocite{sigfridsson}
ipsum \autocite{worman}
dolor \autocite{geer}
sit \autocite{nussbaum}
amet \autocite{cicero}
consectur \autocite{moran}
\newrefcontext[labelprefix=A]
\printbibliography[type=article, title={Artikel}]
\newrefcontext[labelprefix=B]
\printbibliography[type=book, title={Bücher}]
\newrefcontext[labelprefix=R]
\printbibliography[nottype=article, nottype=book, title={Anderes}]
\end{document}
Das liegt an der etwas merkwürdigen Eigenart von `unsrtdin`, obwohl es ein numerischer Stil ist, das optionale Argument von `\bibitem` für ein eigenes (dann eigentlich immer nicht numerisches) Zitierlabel zu nutzen. Während `plain` z.B. in der `.bbl`-Datei, die LaTeX für die Zitate und das Literaturverzeichnis einliest,
```
\begin{thebibliography}{1}
\bibitem{Ref1A}
The authorA.
\newblock The titlea.
\newblock In {\em The bookA}, 2000.
\end{thebibliography}
```
produziert, macht `unsrtdin`
```
\begin{thebibliography}{2}
% this bibliography is generated by unsrtdin.bst [8.2] from 2005-12-21
\providecommand{\url}[1]{\texttt{#1}}
\expandafter\ifx\csname urlstyle\endcsname\relax
\providecommand{\doi}[1]{doi: #1}\else
\providecommand{\doi}{doi: \begingroup \urlstyle{rm}\Url}\fi
\bibitem[1]{Ref1B}
\textsc{authorB}, The:
\newblock The TitleB.
\newblock {In: }\emph{The bookB}, 2000
\end{thebibliography}
```
Wenn das optionale Argument von `\bibitem` verwendet wird, dann unterstützt `multibib` die Option `labeled` faktisch nicht mehr. Man kann `multibib` etwas auf die Sprünge helfen, indem man den Code, den es für `\@bibitem` (`\bibitem` ohne optionales Argument) nutzt, auch auf `\@lbibitem` (`\bibitem` mit optionalem Argument) ausbreitet. Schön anzusehen ist das nicht, aber es funktioniert.
```
\documentclass[11pt]{article}
\usepackage[resetlabels,labeled]{multibib}
\makeatletter
% Code für \@lbibitem analog zum Code für \@bibitem zugefügt
\def\newcites#1#2{%
\def\@suffixlist{#1,}%
\@for\@newrefname:=#2\do{%
\mylop\@suffixlist\to\@suffix
\expandafter\protected@edef\csname refname\@suffix\endcsname
{\@newrefname}%
\if@filesw
\expandafter\newwrite\csname @auxout\@suffix\endcsname
\expandafter\edef\csname @auxout\@suffix name\endcsname{\@suffix}%
\begingroup
\makeatletter
\@input@{\csname @auxout\@suffix name\endcsname .aux}%
\endgroup
\immediate\openout\csname @auxout\@suffix\endcsname
\csname @auxout\@suffix name\endcsname .aux
\fi
\@for\@citename:=\@mb@citenamelist\do{%
\expandafter\edef\csname \@citename\@suffix\endcsname{%
\let\noexpand\@citex\noexpand\mb@@citex
\let\noexpand\@newciteauxhandle\csname @auxout\@suffix\endcsname
\noexpand\csname\@citename\endcsname}%
}%
\expandafter\edef\csname nocite\@suffix\endcsname##1{{%
\let\noexpand\@auxout\csname @auxout\@suffix\endcsname
\noexpand\nocite{##1}}}%
\iflabeled % if option labeled
\expandafter\edef\csname @bibitem\@suffix\endcsname##1{%
\noexpand\item
\noexpand\if@filesw \noexpand\immediate\noexpand\write\noexpand\@auxout
{\noexpand\string\noexpand\bibcite{##1}%
{\@suffix\noexpand\the\noexpand\value{\noexpand\@listctr}}}%
\noexpand\fi
\noexpand\ignorespaces}%
\expandafter\edef\csname @lbibitem\@suffix\endcsname[##1]##2{%
\noexpand\item[\noexpand\@biblabel{##1}\noexpand\hfill]
\noexpand\if@filesw
{\noexpand\let\noexpand\protect\string\noexpand
\noexpand\immediate
\noexpand\write\noexpand\@auxout{%
\noexpand\string\noexpand\bibcite{##2}{\@suffix##1}}}
\noexpand\fi\noexpand\ignorespaces}%
\expandafter\edef\csname @biblabel\@suffix\endcsname##1{[\@suffix##1]}%
\fi % end if option labeled
\expandafter\edef\csname bibliography\@suffix\endcsname##1{{%
\let\noexpand\temp@auxout\noexpand\@auxout
\let\noexpand\addtocontents\noexpand\mb@addtocontents
\let\noexpand\@auxout\csname @auxout\@suffix\endcsname
\let\noexpand\jobname
\expandafter\noexpand\csname @auxout\@suffix name\endcsname
\let\noexpand\refname
\expandafter\noexpand\csname refname\@suffix\endcsname
\let\noexpand\bibname
\expandafter\noexpand\csname refname\@suffix\endcsname
\iflabeled
\let\noexpand\@bibitem
\expandafter\noexpand\csname @bibitem\@suffix\endcsname
\let\noexpand\@lbibitem
\expandafter\noexpand\csname @lbibitem\@suffix\endcsname
\let\noexpand\@biblabel
\expandafter\noexpand\csname @biblabel\@suffix\endcsname
\fi
\noexpand\bibliography{##1}%
}}
\expandafter\edef\csname bibliographystyle\@suffix\endcsname##1{%
\noexpand\if@filesw
\noexpand\immediate\noexpand\write\csname @auxout\@suffix\endcsname
{\noexpand\string\noexpand\bibstyle{##1}}%
\noexpand\fi}
}%
}
\makeatother
\begin{filecontents}{references.bib}
@inproceedings{Ref1,
title = {The Title},
year = {2000},
booktitle = {The book},
author = {The author},
}
\end{filecontents}
\begin{filecontents}{referencesA.bib}
@inproceedings{Ref1A,
title = {The TitleA},
year = {2000},
booktitle = {The bookA},
author = {The authorA},
}
\end{filecontents}
\begin{filecontents}{referencesB.bib}
@inproceedings{Ref1B,
title = {The TitleB},
year = {2000},
booktitle = {The bookB},
author = {The authorB},
}
\end{filecontents}
\newcites{A,B}{{The other list},{And annother list}}
\begin{document}
Citation from bib \cite{Ref1} and bib A \citeA{Ref1A} and at bib B \citeB{Ref1B}.
\bibliographystyle{unsrtdin}
\bibliography{references}
\bibliographystyleA{unsrtdin}
% multibib funktioniert nicht wenn statt plain unsrtdin verwendet wird
\bibliographyA{referencesA}
\bibliographystyleB{unsrtdin}
\bibliographyB{referencesB}
\end{document}
```
------
Ein anderer Lösungsansatz wäre es, `unsrtdin` die oben erwähnte Unart auszutreiben, das numerische Label in `\bibitem` zu setzen.
Dafür muss man in einer umbenannten Kopie(!) von `unsrtdin.bst` (sagen wir `unsrtdin-nolab.bst`) den Block
```
FUNCTION {output.bibitem}
{ newline$
"\bibitem[" write$
label write$%
"]{" write$
cite$ write$
"}" write$
newline$
""
before.all 'output.state :=
}
```
auf
```
FUNCTION {output.bibitem}
{ newline$
"\bibitem{" write$
cite$ write$
"}" write$
newline$
""
before.all 'output.state :=
}
```
verkürzen.
Füg dann noch einen Kurzen Kommentar zu Beginn der Datei mit der Änderung und dem Datum hinzu. Der Unterschied zu `unsrtdin.bst` in `diff` ist dann
```
--- unsrtdin.bst 2006-02-13 18:40:12.000000000 +0100
+++ unsrtdin-nolab.bst 2020-06-01 09:28:43.104700200 +0200
@@ -1,3 +1,6 @@
+%%%% unsrtdin-nolab.bst
+%%%% 2020-06-01
+%%%% avoid numeric labels in \bibitem
%% UNSRTDIN.BST Ausgabe [8.2] 2006-01-02
%% mit doi-, urn-, url-Funktionen
%% ersetzt UNSRTDIN.BST Ausgabe [8.1b3] 22.2.2005
@@ -286,9 +289,7 @@
FUNCTION {output.bibitem}
{ newline$
- "\bibitem[" write$
- label write$%
- "]{" write$
+ "\bibitem{" write$
cite$ write$
"}" write$
newline$
```
Wenn Du nicht weißt, wo Du `unsrtdin.bst` finden kannst, dann kannst Du die Datei mit `kpsewhich unsrtin.bst` in der Kommandozeile auf Deinem Rechner aufspüren. Du kannst die Datei aber auch von CTAN runterladen: https://ctan.org/tex-archive/biblio/bibtex/contrib/german/din1505
Beachte, dass Deine umbenannte Kopie `unsrtdin-nolab.bst` an einem Ort sein muss, wo BibTeX sie finden kann. Für einmalige Anwendung ist es am einfachsten, die Datei in den gleichen Ordner zu legen, in dem auch Deine Haupt-TeX-Datei liegt. Siehe auch https://texfaq.org/FAQ-inst-wlcf
----
Wenn Dich niemand zwingt, `unsrtdin` zu verwenden, kannst Du darüber nachdenken, den Stil nicht zu nutzen. Die Norm DIN 1505-2, die der Stil implementiert, ist von 1984 und wurde schon 2013 von DIN-ISO 690 abgelöst und ist nicht mehr gültig. (Ferner find ich, dass einige typographische Entscheidungen in der DIN 1505-2 fraglich sind: Leerzeichen von dem Semikolon?)
Wenn Du noch nicht mal auf BibTeX festgelegt bist, dann würde ich Dir den Umstieg zu `biblatex`+Biber ans Herz legen. Da gehen solche Dinger viel schöner. (Z.B. musst Du nicht micht verschiedenen `.bib`-Dateien arbeiten, sondern kannst die Einträge direkt nach bestimmten Kriterien filtern.) Wenn wirklich nach Dateizugehörigkeit gefiltert werden soll, dann könnte man Dein Beispiel wie folgt implementieren
```
\documentclass[11pt]{article}
\usepackage[backend=biber, style=numeric, defernumbers=true]{biblatex}
\DeclareSourcemap{
\maps[datatype=bibtex, overwrite]{
\map{
\perdatasource{referencesA.bib}
\step[fieldset=keywords, fieldvalue={,}, appendstrict]
\step[fieldset=keywords, fieldvalue=A, append]
}
\map{
\perdatasource{referencesB.bib}
\step[fieldset=keywords, fieldvalue={,}, appendstrict]
\step[fieldset=keywords, fieldvalue=B, append]
}
}
}
\begin{filecontents}{references.bib}
@inproceedings{Ref1,
title = {The Title},
year = {2000},
booktitle = {The book},
author = {The author},
}
\end{filecontents}
\begin{filecontents}{referencesA.bib}
@inproceedings{Ref1A,
title = {The TitleA},
year = {2000},
booktitle = {The bookA},
author = {The authorA},
}
\end{filecontents}
\begin{filecontents}{referencesB.bib}
@inproceedings{Ref1B,
title = {The TitleB},
year = {2000},
booktitle = {The bookB},
author = {The authorB},
}
\end{filecontents}
\addbibresource{references.bib}
\addbibresource{referencesA.bib}
\addbibresource{referencesB.bib}
\begin{document}
Citation from bib \autocite{Ref1} and bib A \autocite{Ref1A} and at bib B \autocite{Ref1B}.
\printbibliography[notkeyword=A,notkeyword=B, title={Bib}]
\newrefcontext[labelprefix=A]
\printbibliography[keyword=A, title={Bib A}]
\newrefcontext[labelprefix=B]
\printbibliography[keyword=B, title={Bib B}]
\end{document}
```
Aber wie gesagt, wenn die Dateizugehörigkeit nur eine künstliche Methode ist, um nach anderen Eigenschaften zu filtern, dann geht es unter Umtsänden viel schöner.
```
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=numeric, defernumbers, backend=biber]{biblatex}
\addbibresource{biblatex-examples.bib}
\begin{document}
Lorem \autocite{sigfridsson}
ipsum \autocite{worman}
dolor \autocite{geer}
sit \autocite{nussbaum}
amet \autocite{cicero}
consectur \autocite{moran}
\newrefcontext[labelprefix=A]
\printbibliography[type=article, title={Artikel}]
\newrefcontext[labelprefix=B]
\printbibliography[type=book, title={Bücher}]
\newrefcontext[labelprefix=R]
\printbibliography[nottype=article, nottype=book, title={Anderes}]
\end{document}
```