# Versionsübersicht für dinat

#### A short note for english speaking people

This page is the version history of the BibTeX style `dinat.bst`, which produce bibliographies following the german norm DIN 1505. Because this norm is only usefull for text in german, all extra documentation like these pages is in german, too. Nonetheless the styles themselves have comments and output in english. If you like to get this pages in english, too, please write me, I'll do my very best.

## Einleitung

Hier werden (hoffentlich) alle Änderungen und ihr Sinn aufgeführt, die zum Erreichen der aktuellen Version des BibTeX-Stils dinat.bst durchgeführt wurden. Ich hoffe, dass damit das Verständnis des Stils im Speziellen und von BibTeX im Allgemeinen vertieft wird.

#### Zu den letzten Änderungen

## Der Anfang

Einen neuen Stil zu schreiben kam mir zwar auch kurzzeitig in den Sinn, aber nach einigen halbherzigen Versuchen habe ich es aufgegeben (hey, ich sollte eigentlich meine Diplomarbeit schreiben!) und mich lieber auf die Modifikation eines existierenden Stils beschränkt. Als Ausgangspunkt habe ich den Stil `natdin` von Lorenzen genommen, der die grundlegende DIN-Konformität schon eingebaut hat, allerdings ziemlich fehlerhaft (und chaotisch) ist. Als Gradmesser für den Erfolg habe ich anfangs die Datei `xampl.bib` verwendet, die mit BibTeX mitgeliefert wird. Sie bietet zwar nicht unbedingt DIN-konforme Einträge, deckt aber alle Standardfälle ab.

Nachdem die Entscheidung gefallen war, einen "neuen" Stil zu produzieren, ging es an die Einarbeitung in BibTeX im Allgemeinen und `natdin` im Besonderen. Irgendwann verstand ich so ungefähr, wie BibTeX mit Hilfe der bst-Dateien aus den Einträgen der Datenbank eine TeX-Quelle erzeugt und fühlte mich gewappnet, dem Problem entgegenzutreten.

## Von NATDIN zu DINAT

Zuallererst musste ich `natdin` erstmal zum Laufen bekommen, bei mir produzierte das Ding haufenweise Fehlermeldungen und Warnungen. Fehler sind schlimmer als Warnungen, also musste ich mich zuerst um diese kümmern.

### Grundlegende Fehler

- doppelte Funktionen `or` und `conference` entfernt

Ab hier ließ sich der Stil ohne Fehler einlesen, produzierte aber noch 48 Fehler mit xampl.bib, ein bischen viel für meinen Geschmack!

### Detail-Arbeit

Nun wurden einige Änderungen durchgeführt, die die Ausgabe nicht grundlegend ändern, aber für das Verständnis des Stils gut waren. Das meiste war eigentlich einfaches Aufräumen, nur ein paar Sachen sind mir im Vorbeigehen zusätzlich aufgefallen, und so habe ich sie gleich mit geändert:

- Kommentare komplett entfernt, die meisten betrafen sowieso irgendwelche Änderungen von vorangegangenen Versionen
- Funktion `either.or.check` entfernt, wird nicht aufgerufen
- in `misc` `Norm` durch `NORM` ersetzt
- `[u.~a.~]` durch `[u.~a.]` ersetzt
- `{ 'skip$ }` durch `{ skip$ }` ersetzt
- Formatierung (Einrückungen und Umbrüche) vereinheitlicht
- Macro für `mar` geändert
- `phdthesis` eingeführt
- `format.pages.book` geändert
- Funktionen `show` und `show.stack` für Debugging eingeführt
- `"x" * "y"` zu `"xy"`zusammengezogen
- Funktionsaufrufe `'name` durch `{ name }` ersetzt
- gemeinsame Teile aus if-Zweigen verschoben bei

- `article.in.journal`
- `format.editors`
- `format.address.publisher.year`
- `format.btitle.vol`
- `format.series.number.din`
- `format.vol.year.num.pages`
- `format.in.ed.booktitle.din`
- `format.tr.number.din` (umgestellt!)
- `format.book.crossref`
- allen entry-Funktionen

- alle Kommandos ausser ENTRY, INTEGERS und STRINGS an das Ende gesetzt
- `extra.label` am Ende von `format.date` entfernt
- diverse `tie.or.space.connect` durch `*` ersetzt, falls kein festes Leerzeichen nötig

Bis hier waren alle Maßnahmen im Prinzip semantik-erhaltend, haben damit also an der Anzahl der Fehler nichts geändert! Dies sollte nun anders werden ...

### You can't pop an empty literal stack ...-Fehler

- in `calc.label` vor `sortify` ein `label` eingefügt

Das entfernte die Fehlermeldungen, die durch das Sortieren hervorgerufen wurden. Es blieben noch 12 Fehlermeldungen.

- in `article.in.journal` bei leeren `author` und `editor` kein `*`

Das behebt den `empty literal stack` bei `whole-jounal`, es bleiben noch 11 the literal stack isn't empty ...-Fehler.

### Kommentare

Ab hier war das Verständnis des Stils allerdings schon relativ groß, so dass vorher ein paar weitere Dinge in Angriff genommen werden konnten:

- Funktionen etc. kommentiert
- Funktionen umbenannt, um ihren Zweck zu beschreiben:
  `out.*`
    Schreibt den obersten Eintrag des Stacks in die bbl-Datei
  `format.*`
    Formatiert den obersten Eintrag des Stacks, d.h. baut ihn irgendwie um, packt aber keinen neuen Eintrag drauf oder entfernt einen
  `push.*`
    Legt genau einen (evtl. leeren) neuen Eintrag auf den Stack

### the literal stack isn't empty ...-Fehler

Eine naheliegende Maßname war das Einfügen von `stack$` am Ende von `out.bibitem.end` (ehemals `fin.entry`), aber das hätte nur die Symptome kuriert, nicht deren Ursache. Also ging es einzeln ans Eingemachte: Es waren alle Stellen zu suchen und zu finden, in denen irgendwas auf den Stack gelegt wurde, das hinterher nicht verarbeitet wurde. Dazu half die Umbenennung: alles mit `push` musste etwas (genauer gesagt, exakt ein Item) auf den Stack legen, alles mit `format` dagegen sollte den obersten Stack-Eintrag manipulieren, musste ihn also dazu abheben und hinterher wieder drauftun oder/und musste etwas daranhängen. Gefunden habe ich dann nur den einen Eintrag:

- in `format.article.in.journal` bei leerem Titel `*` entfernt

Damit (wenn ich nichts vergessen habe) waren alle Fehlermeldungen verschwunden, und die Hauptarbeit war getan:

### DINAT war geboren!

## Neue Funktionen

Nun ging es daran, neue Funktionen einzubauen bzw. die existierenden Formatierungen zu modifizieren:

- Macros für Zeitschriften eingefügt
- Leerzeichen vor Verweis in `format.article.crossref` eingefürht
- fette Verweise (`\textbf`) entfernt
- ein Klammerpaar ("{}") um ehemalige `\textbf` entfernt
- zusätzliche Macros für Monate entfernt
- `pages` in `incollection` und `inproceedings` hinter `series` und
`number` verschoben
- alle Ausgaben in Englisch

## URL

Neuere Stile enthalten das Feld URL, also muß das auch hier rein (außerdem brauche ich es selbst!).

- Feld `url` eingefügt
- Formatierung für `url` eingefügt
- falls das url-Paket nicht verwendet wird, `\texttt` für URL verwenden (`begin.bib`)
- bei leerem `publisher`, `author` und `editor` als Impressum die `url` verwenden
- `url` in alle Einträge vor `note` eingebaut, allerdings nur, wenn noch nicht im Impressum verwendet

## Von DINAT zu DINNAT

Nachdem der DINAT-Stil so weit gediehen war, kam ich durch Beiträge in der Newsgruppe de.comp.text.tex auf die Idee, den Stil so zu modifizieren, dass er die ganzen NATBIB-Möglichkeiten bietet, also z.B. auch `\citeyear` und die `*`-Formen.

- Klammern um `year` in das Label eingebaut (`calc.label`)

Leider gingen dabei die Marken vor den Einträgen im Literaturverzeichnis flöten, so dass ein zweiter Stil nötig wurde, der allerdings nicht mehr so richtig DIN-konform genannt werden kann. Da er aber quasi die Langform von DINAT ist, wurde er DINNAT genannt. Falls ich das jemals hinbekomme, die Marken zu erzeugen, wird DINNAT aber wieder eingestellt!

Ab jetzt müssen alle Änderungen parallel in beiden Stilen durchgeführt werden, falls nicht anders vermerkt.

Damit werden aber schon die zusätzlichen cite-Versionen ermöglicht, es fehlt allerdings noch die lange Autorenliste.

- `make.full.names` mit allen in ihr aufgerufenen Funktionen aus den anderen NAT-Stilen in `dinnat` eingefügt und hinter das bisherige Label eingebaut

## Erste Veröffentlichung am 10.4.2000

Nachdem ich soweit gekommen war, war es an der Zeit, DINAT mit der großen bösen Welt in Kontakt kommen zu lassen: Eine erste Ankündigung erfolgte in der Newsgruppe de.comp.text.tex. Das Ergebnis war nicht überwältigend, aber größer als gedacht, und vor allem positiv! Ein echter Ansporn, weiter zu arbeiten.

## Version 1.1 vom 18.4.2000

Wie üblich finden sich direkt nach Veröffentlichung der ersten Version sofort ein paar kleine Fehler, die eine Überarbeitung notwendig machen:

- `format.dashes` aus `push.url` entfernt
- `out.bibitem.start.end` in `out.bibitem.end` umbenannt (typischer Suchen-und-Ersetzen-Fehler)
- `top$` durch `warning$` ersetzt, falls es nicht für Debugging gebraucht wird
- diverse `tie.or.space.connect` durch `*` ersetzt, falls der hintere Teil auf jeden Fall länger ist, z.B. bei ISBN/ISSN
- diverse Leerzeichen vor bzw. hinter Satzzeichen etc. durch eine Tilde ersetzt (und `tie.or.space.connect` durch `*` ersetzt)
- überflüssige geschweifte Klammern entfernt
- `format.article.in.journal` vereinfacht
- `push.series.number` umgestellt

Und natürlich auch ein paar richtige Änderungen (welche erste Verison ist schon korrekt?):

- zur Label-Erzeugung durch `key` wird der ganze Eintrag genommen, nicht mehr nur die ersten drei Buchstaben (mailto: Kai Rascher)
- zur Label-Erzeugung wird der komplette `year`-Eintrag verwendet, nicht nur die letzten vier Stellen, z.B. für von-bis-Angaben (mailto: Ulf Hinze)
- bei `incollection` und `inproceedings` wird auch mit `crossref` das Kapitel angegeben
- `push.book.crossref` vereinfacht

Ab jetzt sind auch diese Webseiten verfügbar, ich hoffe, damit werden viele Fragen im Vorfeld beantwortet. Irgendwann demnächst wird diese Seite auch umziehen, auf jeden Fall steht die Adresse dann im Vorspann der Dateien.

## Version 1.2 vom 25.4.2000

Nachdem diese Stile und damit auch diese Webseiten (auf Anregungen von mailto: Rolf Niepraschk) die Aufnahme in die heiligen Hallen des CTAN im Pfad `biblio/bibtex/contrib/german/dinat/` gefunden haben, gibt es auch noch ein paar Änderungen:

- doppelte Leerzeichen entfernt
- `\natexlab` in `dinat` wieder eingeführt (warum war das eigentlich draussen?)
- in `dinnat` geschweifte Klammern um `\natexlab` und in `\bibitem[...]` entfernt
- in `misc` wird für `NORM` eine beliebige Groß-/Kleinschreibung erkannt und verwendet
- bei fehlenden Autor- etc. Angaben wird die gesamte Marke (`cite$`) als Label genommen, nicht nur ihre ersten drei Buchstaben
- `push.address.publisher.year` umgestellt
- diverse `tie.or.space.connect` durch `*` ersetzt (und Leerzeichen bzw. Tilden eingefügt)
- Kommata in `push.incoll.inproc.crossref` richtig gesetzt
- `url` nicht bei fehlenden Verlagsangaben (und nicht fehlenden Autor und Editor!)
- Titel von Normen kursiv
- `crossref` bei Normen eingefügt

## Version 2.0 vom 2.5.2000

Wenn das so weitergeht, komme ich doch noch in einen wöchentlichen Update-Rhythmus :-)

Ab jetzt gibt es zu den Änderungen auf dieser Seite auch die Namen und Mail-Adressen der Leute, die diese angeregt haben, als Dank und Ansporn sozusagen.

- überflüssiges Leerzeichen in der Namensliste durch `format.names` entfernt (mailto: Stefan Nobis)
- `urldate` als Datum des Zugriffs auf die URL eingebaut (mailto: Stefan Nobis)
- Kommentar mit Namen des Stils in `begin.bib` zur Ausgabe in die bbl-Datei eingefügt (sollte eigentlich Standard sein!)
- einen Punkt hinter den Buchtitel bei Verweisen in `incollection` und `inproceedings` gesetzt (`push.incoll.inproc.crossref`)
- Muster für den Eintrag in `natbib.cfg` berichtigt (mailto: Stefan Nobis)
- Lösung des Label-Problems in `dinnat` gefunden!
  Na gut, keine überzeugende, ist mehr ein Hack, aber wenigstens funktioniert es

Diese Lösung sollte auch mit der Formatierung per `natbib.cfg` zurechtkommen.
Falls die `natbib`-Option `numbers` oder die `\bibpunct`-Variante `n` gewählt wurde, wird auch nur ein entsprechendes numerisches Label erzeugt.

Die letzte Änderung rechtfertigt den Sprung auf Version 2.0, da nun mit einem Stil alle Zitiermöglichkeiten und Label erreicht werden können.

Diese Änderung führt darüberhinaus zur Zusammenführung der beiden Stile, so dass nur noch ein Stil, nämlich der eigentlich geplante dinat.bst, übrigbleibt.

## Version 2.1 vom 9.5.2000

Und weiter geht es im immerwährenden Kreislauf der Änderungen, selbst an meinem Geburtstag (aber schließlich erfolgte die erste Veröffentlichung auch am Geburtstag meiner Frau):

- der fünfte Parameter von `\bibpunct` in der Konfiguration `natbib.cfg` erzeugte ein zusätzliches Leerzeichen in den Zitierungen, also wurde es entfernt
- die Felder `isbn`, `issn`, `url` und `urldate` im Vorspann und auf der Webseite erklärt (demnächst wird es auch eine richtige Anleitung geben)
- für `techreport` `url` als Impressum bei leerem `institution`, nicht `publisher`
- Links hier im Dokument geändert: Mailadressen werden jetzt über `mailto:` verlinkt, Webseiten über den Namen
- alle Texte in Funktionen verlagert, um sie leichter änderbar zu machen, z.B. für Leute, die `et.al.` statt `u.a.` haben wollen (mailto: Peter Baum)
- `push.editors.organization` in `push.organization` umbenannt und umgebaut
- `push.editors` umgebaut
- damit wurde auch `push.ed.incoll` überflüssig
- `push.authors.editors` neu erstellt und eingebunden
- die letzten vier Änderungen machten auch einige Änderungen an anderen Funktionen notwendig
- kleinerer Abstand bei `u.a.`: `\,` statt `~`
- `format.article.in.journal` zu `push.article.in.journal` umgebaut
- `\cite` durch `\citep` ersetzt
- `push.crossref.editor` entfernt, da es nicht benutzt wurde
- in vielen Funktionen kleinere Umstellungen vorgenommen, um den Code verständlicher und wartungsfreundlicher zu machen

## Version 2.2 vom 12.07.2000

Nachdem die Diplomarbeit abgegeben war, war wieder Zeit für die Arbeit an dinat, dachte ich. Aber dann kam die neue Wohnung, der Umzug, das Einrichten, der neue Job usw. Aber nun ist es geschafft, eine neue Version ist fertig, wenn auch nicht so neu wie erhofft:

- `push.crossref` erstellt und eingebaut
- diverse `crossref` geändert
- `out.check` in `out.check.required` umbenannt
- `out.check.din` eingebaut für nur nach DIN fehlende Teile
- `mastersthesis` in `masterthesis` korrigiert
- `Zugriffsdatum` ebenfalls richtig geschrieben
- um `\,` geschweifte Klammern gesetzt, hoffentlich behebt das den nervigen `\nobreakspace{}`-Fehler

Vor allem für das letztere erbitte ich Meldungen, ob es geholfen hat!

## Version 2.3 vom 03.10.2000

Nun ist der erste Stress mit neuer Wohnung, neuem Job etc. weg, viele viele Vorschläge für dinat sind eingegegangen, und jetzt habe ich auch Zeit für eine neue Version gefunden. Diese bringt noch nicht die angekündigten großen Änderungen, sondern wie die vorigen vor allem Detailverbesserungen, wenn auch einige lange geforderte:

- `masterthesis` wieder in das korrekte `mastersthesis` geändert. Entschuldigung an alle für diese schlampige Korrektur, da hatte ich mich aufs Glatteis führen lassen und selbst nicht genug recherchiert. Um den Frust nicht zu groß werden zu lassen, bleibt `masterthesis` erhalten.
- die letzten Vorkommen von `u.~a.` beseitigt, nun sollten wirklich alle `\nobreakspace{}`-Fehler weg sein!
- als Abstand zwischen der Marke und dem Eintrag wird nun standardmäßig `\labelsep` verwendet, wie es sich gehört.
- `...key.organization.label` korrigiert, so dass nun die ganze Organisation als Label verwendet wird.
- in `proceedings` wird jetzt eine leere Organisation abgefangen und falls vorhanden durch (Hrsg.) ergänzt.

Und die Dokumentation ist immer noch nicht fertig.

## Version 2.4 vom 05.11.2000

Diese Version ist eine Olaf-Meltzer-Dank-Ausgabe, da er die meisten Änderungen zu dieser Version beigetragen hat. Ich hatte eigentlich nur ein wenig zu tun mit dem Zusammentragen und Veröffentlichen. Dachte ich jedenfalls, bis ich mich an die Namens-Formatierung machte ... Aber trotzdem, er hat es verdient, da er nicht nur Fragen stellt, sondern auch selbst gute Lösungen liefert!

- `inbook` verbessert. Nun wird bei der Zitierung eines einzelnen Teils eines Buchs nur eine einzelne Literaturangabe mit allen Werten genriert. Wenn dagegen mehr als ein Teil eines Buchs zitiert werden, wird das Buch mit allen Angaben aufgeführt und die jeweiligen Teile mit einem entsprechenden Verweis (mailto: Olaf Meltzer).
- überflüssigen Satzanfang aus `proceedings` entfernt (mailto: Olaf Meltzer).
- fehlenden Doppelpunkt nach Autor/Editor in `misc` ergänzt (mailto: Olaf Meltzer).
- wegen Problemen mit Adelsprädikaten wurden die Funktionen `format.full.names`, `format.names` und `sort.format.names` überarbeitet. Dabei fiel ab:
  - die Variable `numnames` konnte entfernt werden.
  - die Variable `zahl` wurde in `pos` umbenannt, da sie nicht einfach eine Zahl ist, sondern eine Position angibt.
  - die Variable `lang` wurde entfernt und statt dessen die Variable `len` verwendet.
  - das allgemeine Verständnis der Namensformatierung wurde größer!
- innerhalb der ISBN/ISSN wird laut Duden der Binde-, also Trennstrich verwendet, also keine Verdoppelung des `-` mehr (sollte eigentlich schon lange gemacht sein).
- Bei der Gelegenheit auch `format.dashes` etwas aufgeräumt und verstanden.

Zum Stand der Dokumentation siehe oben. Aber inzwischen habe ich sehr viele Beispiel-Einträge sammeln können!

## Version 2.5 vom 15.11.2000

Und direkt nach der letzten Version nun schon wieder eine neue. Es haben sich einfach ein paar Dinge ergeben, die mir sinnvoll erschienen und eine echte Verbesserung darstellen. Außerdem habe ich gerade etwas Zeit.

- In `proceedings` fehlendes `*` hinter `push.organization` angefügt (mailto: Holger Uhr).
- In `dinatlabel` wird nicht mehr `\citealt` aufgerufen, sondern ein eigenes Label (`dinat.label`) gebastelt. Dies spart einen LaTeX-Durchgang und ermöglicht vor allem das Entfernen eines Zitats aus dem Text, ohne alle `.aux`-Dateien wegschmeissen zu müssen. Ausserdem verhindert es überflüssige Links, wenn das `hypertext`-Paket verwendet wird (mailto: Ben Samwer).
- Wenn ein Wert für `key` vorhanden ist, wird dieser immer für das Label verwendet, vor `author`, `editor` etc. Die dahinterliegende Überlegung ist, dass ein `key` wohl nur angegeben wird, wenn er Sinn macht. Ist dann aber ein `author` o.Ä. vorhanden, würde `key` nirgendwo auftauchen. So lassen sich nun auch Werke mit Autorenangaben etc. mit einer evtl. üblicheren Kurzbezeichnung zitieren (mailto: Ben Samwer)
.
- Dazu wurden alle `...label`-Funktionen umgestellt und auch umbenannt.
- Und die `...sort`-Funktionen mussten ebenfalls angepasst werden.
- `longest.label.width` und `longest.label` wurden nicht benutzt, also wurden sie entfernt. Ursprünglich waren die Variablen wohl zur Bestimmung der Einrücktiefe im Literaturverzeichnis gedacht, was aber bei Autor-Jahr-Labels wenig Sinn macht, vor allem wenn man an Werke mit zwei Autoren denkt, deren Label allein schon eine ganze Zeile füllen kann.
- `initialize.longest.label` in `initialize.label` umbenannt und vereinfacht.
- `number.label` in `label.count` umbenannt.
- Die Webseite von Fehlern bereinigt.

Ein Problem bleibt die Sortierung von Einträgen mit gleichem ersten (A), aber verschiedenem zweiten Autor (B bzw. C) sowie mindestens einem weiteren Autoren (D) und unterschiedlicher Jahreszahl (1994 bzw. 1999). Das Label wird dann aus erstem Autor und Jahr gebildet (A u.a. 1994 bzw. A u.a. 1999) und entsprechend sortiert. Wird aber das Label nicht angezeigt, z.B. bei numerischer Zitierung, dann wird das Werk A, B und D 1999 trotzdem hinter A, C und D 1994 einsortiert, was zu Verwirrung führen kann. Dies ist aber nicht befriedigend zu lösen, da zur Sortierzeit nicht zwischen den beiden Zitierungsarten unterschieden werden kann. Da laut DIN nach dem Label sortiert wird, behalte ich dieses bei, da ja die numerische Zitierung nicht DIN entspricht.