Ich versuche seit geraumer Zeit, mir einen bibliography driver für Pakete zu definieren. Das mache ich mit biblatex mit biber als Backend. Im großen und ganzen bin ich mit dem Ergebnis, dass ihr unten sehen könnt, zufrieden. Was mir aber nicht gelingen will, ist, ein neues Feld maintainer zu definieren. Oder genauer: es ist definiert, weder biblatex noch biber beschweren sich, aber die Information landet nicht in der Bibliographie. Ich habe den Verdacht, dass ich noch eine passende source map definieren muss, aber ehrlich gesagt werde ich aus dem entsprechenden Teil der biblatex-Dokumentation nicht recht schlau, trotz einiger Beispiele, die dort gegeben sind.

\documentclass{article}

\usepackage{filecontents}
\usepackage[backend=biber,style=alphabetic]{biblatex}
\addbibresource{\jobname.bib}

\begin{filecontents}{\jobname.bib}
@package{chngcntr,
  title      = {chngcntr} ,
  subtitle   = {Changing counter properties} ,
  author     = {Peter Wilson} ,
  maintainer = {Will Robertson} ,
  date       = {2009-09-02} ,
  version    = {1.0a} ,
  url        = {http://mirror.ctan.org/macros/latex/contrib/chngcntr}
}
\end{filecontents}

\DeclareBibliographyDriver{package}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author}%
  \setunit{\addcomma\addspace}%
  \usebibmacro{maintainer}%
  \setunit{\labelnamepunct}\newblock
  \usebibmacro{maintitle+title}%
  \printfield{version}%
  \setunit{\addcomma\addspace}%
  \usebibmacro{date}%
  \newunit\newblock
  \usebibmacro{url+urldate}%
  \newunit\newblock
  \usebibmacro{finentry}%
}

\newbibmacro*{maintainer}{%
  \printnames{maintainer}%
  \printfield{maintainer}%
}

\DeclareNameAlias{maintainer}{default}
\DeclareIndexNameAlias{maintainer}{default}
\DeclareNameFormat{maintainer}{#1}
\DeclareFieldFormat[package]{title}{{\packageformat#1}}
% this doesn not seem to have any effect:
\DeclareFieldFormat[package]{subtitle}{\mkbibemph{#1}}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldset=maintainer, fieldtarget=author]
    }
  }
}

\newcommand*\packageformat{\sffamily}

\begin{document}
See~\cite{chngcntr}

\printbibliography
\end{document}

alt text


Bonusfrage: wieso hat \DeclareFieldFormat[package]{subtitle}{\mkbibemph{#1}} keinen Effekt? Statt dessen wird das Format für title verwendet. \DeclareFieldFormat[package]{title}{{\packageformat#1}} funktioniert wunderbar. Offenbar wird subtitle einfach als Teil von title gesetzt, was gut und logisch ist. Dennoch hätte ich erwartet, dass die Formatierung sich ändern ließe.

gefragt 14 Sep '13, 17:27

cgnieder's gravatar image

cgnieder
22.1k253463
Akzeptiert-Rate: 60%

bearbeitet 15 Sep '13, 14:06


Versuch es mal mit dem Befehl \DeclareDatamodelFields (WICHTIG: Funktioniert nur mit biber!). In der biblatex Anleitung steht dazu auf Seite 149 (v2.7a 14/07/2013):

The default data model is defined in the core biblatex file blx-dm.def […]. […] In practice, changing the data model means that you can define the entrytypes and fields for your datasources and validate your data against the data model. Naturally, this is not much use unless your style supports any new entrytypes or fields and it raises issues of portability between styles […].

Um es kurz zu fassen, soweit ich es verstanden habe, kannst du damit einfach neue Felder und Eingangs-Typen definieren. Der Rest ist – mehr oder weniger – einfach:

  • Die Datei blx-dm.def suchen,
  • herausfinden durch welchen Befehl z.B. author definiert wurde (da ich annehme, dass author und maintainer beide ähnliche Typen sind),
  • dieselben Einstellungen nehmen mit denen auch author definiert wurde, und damit in der eigenen benutzerdefinieten Datei biblatex-dm.cfg ein neues Feld (z.B. maintainer) definieren.

Hier ist das Beispiel:

\documentclass{article}

\usepackage{filecontents}
\usepackage[backend=biber,style=alphabetic]{biblatex}
\usepackage[ngerman]{babel}

\begin{filecontents*}{\jobname.bib}
@package{chngcntr,
  title      = {chngcntr} ,
  subtitle   = {Changing counter properties} ,
  author     = {Peter Wilson} ,
  maintainer = {Will Robertson} ,
  date       = {2009-09-02} ,
  version    = {1.0a} ,
  url        = {http://mirror.ctan.org/macros/latex/contrib/chngcntr}
}
\end{filecontents*}

\addbibresource{\jobname.bib}

\DeclareBibliographyDriver{package}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author}%
  \setunit{\addcomma\addspace}%
  \usebibmacro{maintainer}%
  \setunit{\labelnamepunct}\newblock
  \usebibmacro{maintitle+title}%
  \printfield{version}%
  \setunit{\addcomma\addspace}%
  \usebibmacro{date}%
  \newunit\newblock
  \usebibmacro{url+urldate}%
  \newunit\newblock
  \usebibmacro{finentry}%
}

\NewBibliographyString{maintainer}
\DefineBibliographyStrings{ngerman}{%
  maintainer = {Die Person die gerade daran arbeitet}
}

\newbibmacro*{maintainer}{%
  \printtext{%
    \ifnameundef{maintainer}
      {}
      {\bibstring{maintainer}%
      \setunit{\addcolon\addspace}%
      \printnames{maintainer}}%
}}

\DeclareNameAlias{maintainer}{default}

\begin{filecontents*}{biblatex-dm.cfg}
\ProvidesFile{biblatex-dm.cfg}
\DeclareDatamodelFields[type=list, datatype=name]{maintainer}
\endinput
\end{filecontents*}

\newcommand*\packageformat{\sffamily}

\begin{document}
See~\cite{chngcntr}

\printbibliography
\end{document}

Noch einmal der Hinweis: Funktioniert nur mit biber! Außerdem gehört \DeclareDatamodelFields in die eigens-definierte Datei biblatex-dm.cfg. Außerdem habe ich noch den bibstring maintainer definiert, damit man Autor und Maintaier besser außeinanderhalten kann.

alt text


Zur Bonusfrage: Das Feld title und subtitle sind miteinander gekoppelt und werden durch den bibmacro-Befehl title gesetzt. In biblatex.def der Befehl title folgendermaßen definiert:

\newbibmacro*{title}{%
  \ifboolexpr{
    test {\iffieldundef{title}}
    and
    test {\iffieldundef{subtitle}}
  }
    {}
    {\printtext[title]{%
       \printfield[titlecase]{title}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase]{subtitle}}%
     \newunit}%
  \printfield{titleaddon}}

Das bedeutet: Zum einem werden title und subtitle von außen durch \printtext[title] formatiert. Wenn nun das Feld-Format „title“ als fett definiert wurde (durch \DeclareFieldFormat{title}{\textbf{#1}} ), werden sowohl title als auch subtitle automatisch fett.

Um nun zu verstehen, warum man subtitle nicht allein verändern kann, ist es wichtig den Befehl \printfield[Format]{Feld} zu verstehen. Wenn nur das benötigte Argument angegeben wird (z.B. \printfield{Test}) und kein optionales, so wird das Format automatisch zum Inhalt des benötigten Arguments (\printfield{Test} = \printfield[Test]{Test}). Hier kannst du einfach \DeclareFieldFormat{Test}{ \textbf{#1} } schreiben und Test wird Fett ausgegeben.

Wenn nun das optionale Argument angegeben wird, zählt dieses als Format. Wenn also \printfield[Versuch]{Test} steht, kannst du \DeclareFieldFormat{Test}{ \textbf{#1} } sooft ändern wie du willst, da das Feld ja durch „Versuch“ formatiert wird. Eine Formatänderung wäre hier durch \DeclareFieldFormat{Versuch}{ \textbf{#1} } erreichbar.

Und so ist es auch hier: \printfield[titlecase]{subtitle} bedeutet, dass das Feld subtitle durch „titlecase“ formatiert wird. Du kannst also das Format „subtitle“ sooft verändern wie du willst, das Feld subtitle wird ja durch das Format „titlecase“ formatiert. Willst du nun das subtitle Feld formatieren, änderst du entweder die „titlecase“ Formatierung (was auch zu einer Formatänderung beim Feld title führen würde, also unerwünscht ist) oder du löscht das [titlecase] bei subtitle:

\renewbibmacro*{title}{%
  \ifboolexpr{
    test {\iffieldundef{title}}
    and
    test {\iffieldundef{subtitle}}
  }
    {}
    {\printtext[title]{%
       \printfield[titlecase]{title}%
       \setunit{\subtitlepunct}%
       \printfield{subtitle}}% selbe wie \printfield[subtitle]{subtitle}
     \newunit}%
  \printfield{titleaddon}}

Dadurch kannst du das subtitle Feld durch \DeclareFieldFormat{subtitle}{ \emph{#1} } formatieren (wobei du beachten musst, dass es ja noch zusätzlich mit „title“ formatiert wird; „title“= fett, „subtitle“= kursiv =>Titel subtitle )

PS. Da das Format „title“ sowohl title als auch subtitle formatiert, bedeutet das, dass du einfach \DeclareFieldFormat[package]{title}{\textsf{#1}} schreiben kannst und beide Felder haben keine Serifen.

Permanenter link

beantwortet 15 Sep '13, 09:28

Epllus's gravatar image

Epllus
620269
Akzeptiert-Rate: 46%

bearbeitet 15 Sep '13, 15:17

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×222
×50

gestellte Frage: 14 Sep '13, 17:27

Frage wurde gesehen: 13,821 Mal

zuletzt geändert: 16 Sep '13, 13:19