Wie keinen Titel bei bestimmten Dokumententypen einfügen?

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


Zoid
Forum-Century
Forum-Century
Beiträge: 104
Registriert: Do 12. Mär 2020, 13:48

Re: Wie keinen Titel bei bestimmten Dokumententypen einfügen?

Beitrag von Zoid »

MoeWe hat geschrieben:
Di 27. Okt 2020, 08:29

Für einen Einstieg in biblatex-Progammierung empfehle ich (im deutschsprachigen Raum) die zwei Artikel von Dominik Waßenhoven in der TeXnischen Komödie 2/2008 https://archiv.dante.de/DTK/PDF/komoedie_2008_2.pdf und 4/2008 https://archiv.dante.de/DTK/PDF/komoedie_2008_4.pdf (englischsprachig kenne ich nichts dergleichen). Die sind zwar inzwischen deutlich mehr als 10 Jahre alt und in der Zeit hat sich einiges geändert (einige Dinge gehen heute einfacher, andere einfach nur anders), aber die Grundideen sind immernoch die gleichen.

Das werd ich mir mals Abendlektüre abspeichern.
Soweit habe ich gestern Nacht noch lange gesucht und gearbeitet und bin auch weiter gekommen.
Erst mal eine Anleitung, die mir geholfen hat:
http://mirror.physik-pool.tu-berlin.de/ ... blatex.pdf

Daraus habe ich meinen Code angepasst:

\documentclass[12pt,a4paper,toc=listof,parskip=full]{scrreprt}

\usepackage[backend=biber,
	style=authoryear,
	maxcitenames=2,
	isbn=false,
	giveninits=true,
	uniquename=false]{biblatex}	% Literaturverzeichnis mit Datei
				
\DeclareFieldFormat[article]{title}{{#1}}		% entfernt `` bei Titel von Artikel

\DeclareDelimFormat{finalnamedelim}{\addspace\&\space}	% tauscht ``und'' gegen ``&'' im Literaturverzeichnis
\DefineBibliographyStrings{ngerman}{andothers = {{et\,al\adddot}},}	% ersetzen von u.a. zu et al.

\DeclareSourcemap{	% entfernt Einträge bei Patenten
  \maps{
    \map{
      \pertype{patent}
      \step[fieldset=title, null]
      \step[fieldset=subtitle, null]
      \step[fieldset=titleaddon, null]
    }
  }
}

\newbibmacro*{usera}{%
\iffieldundef{usera}%
{}
{\printfield[]{usera}}}

\newbibmacro*{userb}{%
\iffieldundef{userb}%
{}
{\printfield[]{userb}}}

\DeclareBibliographyDriver{patent}{%
  \printnames{author}%
  \newunit\newblock
  \printfield[parens]{year}%
  \newunit\newblock
  \printlist{location}%
  \addspace
  \printtext{Patent Nr.}%
  \addspace
  \printfield{number}
  \newunit\newblock
  \printfield{userb}
  \addcolon\addspace
  \printfield{usera}
  \newunit\newblock  
\usebibmacro{finentry} } \addbibresource{literatur2.bib} \begin{document} \nocite{*} \printbibliography \end{document}

Auch der .bib-Eintrag wurde modernisiert, indem ich zwei individuelle Felder eingefügt habe (usera, userb):

@patent{Herrmann.6262018,
 author = {Herrmann, Anna and R{\"o}diger, Stefan and Schedler, Uwe and Schierack, Peter and Haag, Rainer},
 year = {2020},
 title = {Assay, Verfahren zu seiner Herstellung sowie seine Verwendung},
 number = {102018115391 (A1)},
 abstract = {Die Erfindung betrifft einen Assay f{\"u}r die Analyse eines komplexen Analysats. Der Assay (1) umfasst zumindest eine Schicht (10), welche umfasst:• ein por{\"o}ses dreidimensionales Polymernetzwerk (11) mit einer vorbestimmten Maschenweite, und• zumindest eine Population von in dem dreidimensionalen Polymernetzwerk (11) eingebetteten und immobilisierten Partikeln (12), jeweils umfassend einen Tr{\"a}gerpartikel (13) und eine an dem Tr{\"a}gerpartikel (13) gebundene F{\"a}ngersonde (14), die eine Targetspezies (15, 17) des Analysats zu binden vermag.Die Immobilisierung der Partikel (12) mittels des Polymernetzwerks (11) erlaubt, die Spezifit{\"a}t des Assays zu erh{\"o}hen, und erleichtert die Anwendung. In bevorzugter Ausf{\"u}hrung sind mehrere solcher Schichten aufeinander gestapelt angeordnet, wodurch der Assay (1) eine Vielzahl von Targetspezies (15, 17) in einer einzigen Messung analysieren kann.},
 holder = {{BRANDENBURGISCHE TECHNISCHE UNIV COTTBUS SENFTENBERG} and {POLYAN GES ZUR HERSTELLUNG VON POLYMEREN FUER SPEZIELLE ANWENDUNGEN UND ANALYTIK MBH}},
 usera = {Deutsches Patent- und Markenamt},
 userb = {M{\"u}nchen},
 file = {http://worldwide.espacenet.com/publicationDetails/biblio?FT=D&CC=DE&NR=102018115391A1&KC=A1},
 location = {DE},
 version = {DE201810115391 20180626},
 subtitle = {DE201810115391},
 titleaddon = {G01N33/531;C12Q1/68;G01N21/64}
}

Und bekomme somit das Ergebnis, welches ich angestrebt habe:

Unbenannt.PNG

Jetzt habe ich noch ein paar Fragen zu meinem Code:
Ist der Eintrag \DeclareSourcemap{ % entfernt Einträge bei Patenten noch relevant oder kann der auch gelöscht werden?
Lassen sich alle Einstellungen von \DeclareFieldFormat[article]{title}{{#1}} % entfernt `` bei Titel von Artike bis \usebibmacro{finentry} } in ein seperates Dokument schreiben und einbinden? Da ich noch einige andere Typen von Literaturquellen habe, würde mein Hauptdokument sonst realtiv unübersichtlich werden.

EDIT: Letzteres scheint mit \input{} möglich zu sein.


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

Re: Wie keinen Titel bei bestimmten Dokumententypen einfügen?

Beitrag von MoeWe »

Die Makros

\newbibmacro*{usera}{%
\iffieldundef{usera}%
{}
{\printfield[]{usera}}}

\newbibmacro*{userb}{%
\iffieldundef{userb}%
{}
{\printfield[]{userb}}}

kann man zu

\newbibmacro*{usera}{%
  \printfield{usera}}

\newbibmacro*{userb}{%
  \printfield{userb}}

vereinfachen. \printfield ist von sich aus schlau genug, nichts zu tun, wenn das Feld leer ist. Daher ist es nie notwendig, ein einfaches \printfield{<feld>} mit \iffieldundef{<feld>} zu schützen. (Wenn gewisse Formatierung nicht von \setunit und \printfield kommt, kann es aber sehr wohl sinnvoll sein, \iffieldundef zu nutzen. Oder wenn mehrere Felder ausgegeben werden sollen. Es gibt also durchaus viele gute Anwendungen für \iffieldundef, nur dieses Idiom hier gehört nicht dazu.)

Es ist übrigens nicht zwingend notwendig, ein Bibmakro zu definieren, um etwas in dem driver asuzugeben. Du kannst \printfield auch direkt reinschreiben. Ich finde es sinnvoll, zusammengehörige "Blöcke" zu einem Bibmakro zusammenzufassen, da käme man dann eher bei

\newbibmacro*{patent:inst+loc}{%
  \printfield{userb}%
  \setunit*{\addcolon\space}%
  \printfield{usera}%
}

raus, das man dann im driver einsetzen kann.

In der Eingabe etwas schöner ist es natürlich, wenn man statt der nichtssagenden Namen usera und userb sprechende Namen verwenden kann. Das kann am schönsten dadurch erreichen, dass man die neuen Felder bei biblatex mit einem data model anmeldet. Das ist aber auch etwas Aufwand. Man kann aber auch sprechende Namen mit einer Sourcemap zu usera und userb abbilden lassen. Dann nutzt Du beim Programmieren der Ausgabe usera und userb und musst die neuen Felder nicht groß anmelden, kannst in der Eingabe aber dennoch die sprechenden Namen nutzen. Ein paar Details dazu findet sich bei https://tex.stackexchange.com/q/163303/35864.

Beim TeX-Programmieren solltest Du immer im Hinterkopf behalten, dass das Zeilenende im Code wie ein Leerzeichen gelesen wird. Das bedeutet, dass man in einigen Kontexten ein % hinter das letzte Zeichen der Zeile schreiben muss, um ein Leerzeichen in der Ausgabe zu verhindern.
Vergleiche

A
B

und

A%
B

Das ist insbesondere bei im Kontext von biblatex wichtig, da Du dort Leerzeichen nicht einfach so einfügen solltest. Stattdessen sollte man dafür field formats (\DeclareFieldFormat) oder den punctuation buffer (\setunit) verwenden.

Daher sollte

  \printfield{usera}
  \newunit\newblock 

  \usebibmacro{finentry}
  }

eigentlich

  \printfield{usera}%
  \newunit\newblock
  \usebibmacro{finentry}%
}

sein, um keine ungewollten Leerzeichen und Leerzeilen zu erzeugen. (Es ist durchaus möglich, dass Du nach dieser Anpassung keine Änderung in der Ausgabe siehst, das hat damit zu tun, dass einige dieser Dinge Kontextabhängig sind und dass biblatex so gut wie möglich versucht, ungewollte Leerzeichen zu unterdrücken. Darauf kann man sich aber nicht in allen Lagen verlassen, daher sollte man von vornherein so programmieren, dass keine ungewollten Leerzeichen impliziert sind). Mehr zu % bei TeX.SX: https://tex.stackexchange.com/q/7453/35864

Wie bereits angesprochen, sollte Zeichensetzung in biblatex nie einfach so in einem driver oder Bibmakro erfolgen. Ein nacktes \addspace direkt im driver ist selten eine gute Idee. Stattdessen sollte man den punctuation buffer und \setunit verwenden. Warum das sinnvoll ist, habe ich in https://tex.stackexchange.com/q/409148/35864 erklärt. Zeichensetzung kann auch innerhalb von field formats (nicht aber zu Beginn oder am Ende!) zum Einsatz kommen.
So wäre z.B.

  \printfield{userb}
  \addcolon\addspace
  \printfield{usera}

durch

  \printfield{userb}%
  \setunit*{\addcolon\space}%
  \printfield{usera}%

zu ersetzen. Ich habe hier \setunit* statt \setunit* genommen. Warum kannst Du sehen, wenn Du Dir einen Eintrag mit userb und einen ohne userb (beide sollten usera haben) vergleichst. Was \setunit* macht, ist in dem Link von eben erklärt (es fügt die Zeichensetzung nur in den buffer ein, wenn der vorherige Befehl etwas ausgegeben hat).

Text wie "Patent Nr." sollte man idealerweise nicht hard-codieren sondern mit bibliography strings erledeigen lassen. Ferner ist es hier schöner, die Ausgabe durch ein field format erledigen zu lassen.

Dazu definiert man zunächst

\NewBibliographyString{patentnr}
\DefineBibliographyStrings{german}{
  patentnr = {Patent Nr\adddot},
}
\DeclareFieldFormat[patent]{number}{\bibstring{patentnr}\addspace#1}

und ersetzt dann

  \printlist{location}%
  \addspace
  \printtext{Patent Nr.}%
  \addspace
  \printfield{number}
  \newunit\newblock

durch

  \printlist{location}%
  \setunit*{addspace}%
  \printfield{number}%
  \newunit\newblock

In der Tat ist die Sourcemap jetzt nicht mehr nötig, da Du die Ausgabe des Titels durch Änderung des drivers schon selbst erledigt hast.

Du kannst Deinen biblatex-Code wie jeden anderen Präambelcode auch auslagern. Wenn der Code komplex genug ist, kannst Du aber auch einen eigenen biblatex-Stil erstellen. Mehr dazu bei https://tex.stackexchange.com/q/296732/35864


Zoid
Forum-Century
Forum-Century
Beiträge: 104
Registriert: Do 12. Mär 2020, 13:48

Re: Wie keinen Titel bei bestimmten Dokumententypen einfügen?

Beitrag von Zoid »

Danke für den reichhaltigen Input. Im Moment läuft es zwar bei mir, aber durch deine Infos kann da nochmal ordentlich was optimiert werden :D


Antworten