Unterschiedliche bibindex/citeindex

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


Benji

Unterschiedliche bibindex/citeindex

Beitrag von Benji »

Hallo Zusammen

Ich würde gerne erreichen, dass ichArbeiten, welche ich selbst verfasst habe durch eine doppelte klammer kenntlich machen kann. D.h. [1] für Arbeiten anderer Personen und [[1]] für eigene Arbeiten.

In meiner alten .bst Vorlage hatte ich es so gelöst, dass ich einen eigenen Typen hatte (@MyArticle), welcher dann folgende Funktionen verwendete:
FUNCTION {output.mybibitem}
{ newline$
  "\bibitem[{[" write$
  label write$%
  "]}]{" write$
  cite$ write$
  "}" write$
  newline$
  ""
  before.all 'output.state :=
}

FUNCTION {myarticle}
{  output.mybibitem
article.common
}
Mittlerweile habe ich auf biblatex umgestellt und meine Stilvorlage als .bbx (biblatex bibliography style) und .cbx (biblatex citation style) Dateien. Die Frage ist nun, wie ich die o.g. Funktionen für biblatex umsetzten kann/könnte? Hier mal ein Minimalbeispiel:
\documentclass{scrartcl}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@Article{Einstein,
  author    = {Einstein},
}
@MyArticle{Benji,
  author    = {Benji},
}
\end{filecontents}
\usepackage[style=ieee]{biblatex}
\addbibresource{\jobname.bib}

\begin{document}
Fremdquelle \cite{Einstein}

Eigenquelle \cite{Benji} soll werden [\cite{Benji}]

\printbibliography
\end{document}
Ich wäre super dankbar, wenn jemand eine Idee oder einen Ansatz hätte.

Danke
Benji

Gast

Beitrag von Gast »

Wenn Du statt mit eigenen Entry-Typen wie @MyArticle mit keywords (z.B: mywork) arbeitest, sollte das ganz einfach sein.

Mit style=ieee ist das allerdings etwas kompliziert, da kann man zunächst nur
\DeclareFieldFormat{labelnumber}{\ifkeyword{mywork}{[#1]}{#1}}
nutzen und kommst schon ganz gut hin.

Etwas komplizierter aber stabiler können wir mit xpatch den folgenden Code nutzen.
\makeatletter
\newtoggle{cbx@lastmywork}
\xpatchbibmacro{cite:comp:comp}
  {\savefield{labelnumber}{\cbx@lastnumber}}
  {\savefield{labelnumber}{\cbx@lastnumber}%
   \ifkeyword{mywork}{\toggletrue{cbx@lastmywork}}{\togglefalse{cbx@lastmywork}}}
  {}{}
\xpatchbibmacro{cite:dump}
  {\printtext{\cbx@lastnumber}}
  {\printtext[labelnumber]{\cbx@lastnumber}}
  {}{}
\DeclareFieldFormat{labelnumber}{%
  \ifboolexpr{test {\ifkeyword{mywork}} or togl {cbx@lastmywork}}
    {[#1]}
    {#1}}
\makeatother
\documentclass{scrartcl}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@Article{Einstein,
  author    = {Einstein},
}
@Article{Benji,
  author    = {Benji},
  keywords  = {mywork},
}
\end{filecontents}
\usepackage[style=ieee]{biblatex}
\usepackage{xpatch}
\addbibresource{\jobname.bib}

\makeatletter
\newtoggle{cbx@lastmywork}
\xpatchbibmacro{cite:comp:comp}
  {\savefield{labelnumber}{\cbx@lastnumber}}
  {\savefield{labelnumber}{\cbx@lastnumber}%
   \ifkeyword{mywork}{\toggletrue{cbx@lastmywork}}{\togglefalse{cbx@lastmywork}}}
  {}{}
\xpatchbibmacro{cite:dump}
  {\printtext{\cbx@lastnumber}}
  {\printtext[labelnumber]{\cbx@lastnumber}}
  {}{}
\DeclareFieldFormat{labelnumber}{%
  \ifboolexpr{test {\ifkeyword{mywork}} or togl {cbx@lastmywork}}
    {[#1]}
    {#1}}
\makeatother

\begin{document}
Fremdquelle \cite{Einstein}

Eigenquelle \cite{Benji} and \cite{Benji,Einstein} and \cite{Einstein,Benji}

\printbibliography
\end{document}

Für style=numeric wäre
\DeclareFieldFormat{labelnumberwidth}{\ifkeyword{mywork}{[\mkbibbrackets{#1}]}{\mkbibbrackets{#1}}}

\renewbibmacro*{cite}{%
  \printtext[bibhyperref]{%
    \ifkeyword{mywork}{[}{}%
    \printfield{prefixnumber}%
    \printfield{labelnumber}%
    \ifkeyword{mywork}{]}{}%
    \ifbool{bbx:subentry}
      {\printfield{entrysetcount}}
      {}}}
zwar etwas länger aber wesentlich stabiler.


Hast Du zufällig etwas mit BibLaTeX: Highlight Self-References zu tun?

Benji

Beitrag von Benji »

Ganz herzlichen Dank. Das funktioniert prima. Durch den Ansatz habe ich auch die Lösung gefunden, wenn man mit @MyArticle und ohne Keywords arbeiten will (dann muss man halt in der bbx Datei auch die neuen Typen anlegen). Wobei die Lösung über die Keywords sehr elegant ist, da man dann nicht lauter neue Stile definieren muss, daher werde ich diese wohl bevorzugen.
\DeclareFieldFormat{labelnumber}{%
    \iffieldequalstr{entrytype}{myarticle}{[#1]}{#1}%
}
Dies funktioniert auch mit deiner "stabileren" Lösung, wenn man die entsprechende Stelle anpasst.

Zu dem verlinkten Beitrag: Das ist tatsächlich ein Kollege von mir. Ich wusste aber nicht, dass er auch so was in der Richtung haben will.

Ich hatte für meine Dissertation jetzt mal alles auf den "Aktuellen Stand" gebracht, d.h. von BibTex auf Biblatex, scrlayer-scrpage statt Fancyheading usw.

Liebe Grüße
Benji

Benji

Beitrag von Benji »

Vielleicht noch der Vollständigkeit halber: Durch das doppelte [[]] wird bei dem Literaturverzeichnis die erste Zeile dieser Einträge eingerückt. Um dies zu "verhindern" kann man \labelnumberwidth erhöhen:
\addtolength{\labelnumberwidth}{\widthof{[[]]}}
Beziehungsweise
\addtolength{\labelnumberwidth}{.5cm}
Es gibt sicher eine wesentlich elegantere Lösung...

Gast

Beitrag von Gast »

Also bei mir lässt
\documentclass{scrartcl}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@Article{Einstein,
  author    = {Einstein},
}
@Article{Benji,
  author    = {Benji},
  keywords  = {mywork},
}
\end{filecontents}
\usepackage[style=numeric]{biblatex}
\addbibresource{\jobname.bib}

\DeclareFieldFormat{labelnumberwidth}{\ifkeyword{mywork}{[\mkbibbrackets{#1}]}{\mkbibbrackets{#1}}}

\renewbibmacro*{cite}{%
  \printtext[bibhyperref]{%
    \ifkeyword{mywork}{[}{}%
    \printfield{prefixnumber}%
    \printfield{labelnumber}%
    \ifkeyword{mywork}{]}{}%
    \ifbool{bbx:subentry}
      {\printfield{entrysetcount}}
      {}}}

\begin{document}
Fremdquelle \cite{Einstein}

Eigenquelle \cite{Benji} and \cite{Benji,Einstein} and \cite{Einstein,Benji}

\printbibliography
\end{document}
keinen überflüssigen Platz.

Allerdings wurde in der neuesten Version ein Bug behoben (#342), der mit genau der \labelnumberwidth zu tun hat. Ich konnte ein Problem erzeugen, wenn ich die Änderungen im Code zurückdrehe.

Probiere also ruhig, ein Update zu machen.

Antworten