multibib Problem mit Label und unsrtdin

Erstellung eines Literaturverzeichnisses mit BibTeX, Biber, BibLaTeX und Co.
Nik84

multibib Problem mit Label und unsrtdin

Beitrag von Nik84 »

Hallo Zusammen, ich habe ein Problem mit multibib und den benutzerspezifizierten Labels. Je nach verwendetem bibliographystyle funktionieren die Labels oder eben nicht. Hatte das schonmal jemand, gibt es dafür eine Lösung/Workaround? Minimalbeispiel:

Code: Alles auswählen

\documentclass[11pt]{report}

\usepackage[resetlabels,labeled]{multibib}
\usepackage{filecontents}

\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{plain}
\bibliography{references}
\bibliographystyleA{plain}
% multibib funktioniert nicht wenn statt plain unsrtdin verwendet wird
\bibliographyA{referencesA}
\bibliographystyleB{plain}
\bibliographyB{referencesB}

\end{document}

Ergebnis mit plain:
https://ibb.co/qkzFqkg
Ergebnis mit unsrtdin:
https://ibb.co/sRj9nGY

Wie ihr seht, fehlen die labels...

Ich hoffe mir kann jemand helfen.

Schönen Abend noch
Nik


Nik84

Re: multibib Problem mit Label und unsrtdin

Beitrag von Nik84 »

Ich möchte noch Präzisieren:
Mit plain habe ich sowohl in der Bibliographie als auch im Text Labels (z.B. [A1], wobei A das Label ist). Sobald ich auf unsrtdin umstelle habe ich in der Bibliographie immer noch labels, im Text allerdings verschwinden die Label (aus [A1] wird [1]).

Viele Grüße
Nik


Bartman
Forum-Meister
Forum-Meister
Beiträge: 2159
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Re: multibib Problem mit Label und unsrtdin

Beitrag von Bartman »

Du kommst über das Kontextmenü an die Adresse der hochgeladenen Abbildung, die Du dann mit dem BBCode für das Einfügen eines Bildes anzeigen lassen kannst.

plain:
Bild
unsrtdin:
Bild

Wenn du biblatex benutzen darfst, dann solltest Du Dich in dessen Dokumentation über die Option labelprefix informieren.


MoeWe
Forum-Guru
Forum-Guru
Beiträge: 265
Registriert: Fr 30. Aug 2019, 15:35
Kontaktdaten:

Re: multibib Problem mit Label und unsrtdin

Beitrag von MoeWe »

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,

Code: Alles auswählen

\begin{thebibliography}{1}

\bibitem{Ref1A}
The authorA.
\newblock The titlea.
\newblock In {\em The bookA}, 2000.

\end{thebibliography}

produziert, macht unsrtdin

Code: Alles auswählen

\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.

Code: Alles auswählen

\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

Code: Alles auswählen

FUNCTION {output.bibitem}
{ newline$
  "\bibitem[" write$
  label write$%
  "]{" write$
  cite$ write$
  "}" write$
  newline$
  ""
  before.all 'output.state :=
}

auf

Code: Alles auswählen

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

Code: Alles auswählen

--- 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

Code: Alles auswählen

\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.

Code: Alles auswählen

\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}

Nik84

Re: multibib Problem mit Label und unsrtdin

Beitrag von Nik84 »

Hey, danke für die Rückmeldungen. Mit biber hatte ich so meine Probleme, da es dort keine (einfache) Möglichkeit für /nocite{*} für die einzelnen bibfiles gegeben hat. Daher habe ich meinen unsrtdin.bst nach dem Vorschlag von MoeWe (danke dafür!) angepasst, und das funktioniert jetzt auch. Super!

Allerdings: die fraglichen typografischen Eigenschaften, insbesondere das mit dem Semikolon, stören mich auch. Ich könnte mir demnach auch vorstellen, den Stil zu wechseln. Ich wollte mal den von MoeWe vorgeschlagene Standard DIN ISO 690 probieren, nur welchen Stil müsste ich hierfür verwenden, um auch numerische Zitate (ggfls mit Label) mit Sortierung nach Zitierreihenfolge zu erhalten?

Danke aber schon jetzt für die Hinweise, das hat mir schon echt geholfen.

LG
Nik


MoeWe
Forum-Guru
Forum-Guru
Beiträge: 265
Registriert: Fr 30. Aug 2019, 15:35
Kontaktdaten:

Re: multibib Problem mit Label und unsrtdin

Beitrag von MoeWe »

Nik84 hat geschrieben:
So 7. Jun 2020, 12:29

Allerdings: die fraglichen typografischen Eigenschaften, insbesondere das mit dem Semikolon, stören mich auch. Ich könnte mir demnach auch vorstellen, den Stil zu wechseln. Ich wollte mal den von MoeWe vorgeschlagene Standard DIN ISO 690 probieren, nur welchen Stil müsste ich hierfür verwenden, um auch numerische Zitate (ggfls mit Label) mit Sortierung nach Zitierreihenfolge zu erhalten?

Nur zur Klarstellung, ich würde niemals jemandem ISO 690 empfehlen. Ich habe nur die Tatsache erwähnt, dass DIN 1505-2 inzwischen von ISO 690 abgelöst wurde. Auch an ISO 690 finde ich einige Dinge merkwürdig, gerade wenn man die im Stil eigentlich nicht verbindlichen Teile der Beispiele (Zeichensetzung, All Caps, ...) auch als präskriptiven Teil der Norm interpretiert. Wie dem auch sei. Mir ist kein BibTeX-Stil bekannt, der ISO 690 implementieren würde. biblatex-iso690 implementiert die tschechische Übersetzung von ISO 690 (ČSN ISO 690), die, zumindest wurde mir das gesagt, einige Dinge etwas strenger interpretiert als die echte ISO 690 (zum Beispiel sind da die furchtbaren ALL CAPS für Namen offenbar Pflicht).

Numerische Stile mit Sortierung in Zitierreihenfolge gibt es einige. Die natbib-Stile (hier also unsrtnat) sind sicherlich eine solide Wahl in der BibTeX-Welt. Das Problem ist, dass die meisten Stile nur Englisch sprechen. Wenn Du ein deutsches Literaturverzeichnis möchtest ("und" statt "and", "S." statt "pp.", ...), dann gibt es babelbib (sonst sind mir auf die Schnelle auch nur din1505 und dinat bekannt, die ja beide den veralteten DIN1505-2-Standard implementieren, und jurabib, das glaub ich keinen numerischen Stil hat, aber auch nicht mehr gepflegt wird; es gibt sicher noch ein paar andere Stile). Die meisten, die heutzutage auf ein deutsches Literaturverzeichnis Wert legen, werden wohl biblatex nutzen.

Bei biblatex ist es in der Tat nicht ganz so einfach, \nocite{*} auf einzelne .bib-Dateien anzuwenden. Aber in einigen Fällen kann man durchaus eine Alternative finden. Es kommt dann aber auf Deine genauen Wünsche an. (In biblatex ist es meist viel schöner, Werke nicht mittels der Zuordnung zu bestimmten .bib-Dateien zu gruppieren, sondern andere Marker wie das keywords-Feld zu benutzen.)


Nik84

Re: multibib Problem mit Label und unsrtdin

Beitrag von Nik84 »

MoeWe hat geschrieben:
So 7. Jun 2020, 12:59

Bei `biblatex` ist es in der Tat nicht ganz so einfach, `\nocite{*}` auf einzelne `.bib`-Dateien anzuwenden. Aber in einigen Fällen kann man durchaus eine Alternative finden. Es kommt dann aber auf Deine genauen Wünsche an. (In `biblatex` ist es meist viel schöner, Werke nicht mittels der Zuordnung zu bestimmten `.bib`-Dateien zu gruppieren, sondern andere Marker wie das `keywords`-Feld zu benutzen.)

Also, im Grunde habe ich 3 bib-files (Quellen, eigene Veröffentlichungen und betreute Abschlussarbeiten). Die beiden letzteren möchte ich vollständig, also auch ohne Zitat, im Literaturverzeichnis stehen haben. Und dafür müsste ich auch nicht unbedingt alles in seperaten bibfiles stehen haben (wie du schreibst ginge es ja auch mit keywords).

Ich hatte biblatex mit biber schon vollständig umgesetzt. Die Probleme mit nocite konnte ich nicht lösen. Wenn es eine Möglichkeit gibt, ohne Zitat alles zu referenzieren, was ein bestimmtes Keyword hat (praktisch \nocite mit keyword), dann könnte ich das so machen. Aber wie gesagt, ich habe es nicht auf Anhieb hinbekommen (Mit nocite in einer eigenen refsection hat der counter irgendwie nicht hochgezählt, keine Ahnung warum. Was funktioniert hätte: Am Anfang des Dokuments alles einzeln mit Autocite zitieren auf einer seperaten Seite und diese Seite dann aus dem PDF nachträglich löschen, aber das war alles irgendwie unschön).

LG
Nik


MoeWe
Forum-Guru
Forum-Guru
Beiträge: 265
Registriert: Fr 30. Aug 2019, 15:35
Kontaktdaten:

Re: multibib Problem mit Label und unsrtdin

Beitrag von MoeWe »

Ohne Minimalbeispiel ist das natürlich etwas schwierig nachzuvollziehen, aber hier mal ein Beispiel, wie man sich eine Art selektives \nocite{*} bastelt, dass nicht für die Einträge aus references.bib gilt.

Code: Alles auswählen

\documentclass[11pt]{article}

\usepackage[backend=biber, style=numeric, defernumbers=true]{biblatex}

\DeclareSourcemap{
  \maps[datatype=bibtex, overwrite]{
    \map{
      \perdatasource{references.bib}
      \step[nocited=true, final]
      \step[entrynull]
    }
    \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      = {2001},
  booktitle = {The book},
  author    = {The Author},
}
@inproceedings{Ref2,
  title     = {The Title},
  year      = {2002},
  booktitle = {The book},
  author    = {The Buthor},
}
@inproceedings{Ref3,
  title     = {The Title},
  year      = {2003},
  booktitle = {The book},
  author    = {The Cuthor},
}
\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,Ref2}

\nocite{*}
\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}

Antworten