Biblatex neuen Entrytype Norm definieren

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


joa*k
Forum-Anfänger
Forum-Anfänger
Beiträge: 30
Registriert: Fr 8. Aug 2014, 07:58

Biblatex neuen Entrytype Norm definieren

Beitrag von joa*k »

Hallo zusammen,

ich habe mir in Jabref einen neuen Entrytype "norm" erstellt.

Sieht dann beispislweise so aus
@Norm{ISO225143,
  Title                    = {Statistische Verfahren im Prozessmanagement - Fähigkeit und Leistung - Teil 3: Maschinenfähigkeitsuntersuchungen für Messwerte von diskreten Teilen},
  Number                   = {ISO 22514-3},
  Type                     = {Norm},
  Year                     = {2008},
  Author                   = {ISO 22514-3},
  Owner                    = {q295535},
  Timestamp                = {2015.08.26}
}
Ich möchte das in meinem Literaturverzeichnis dann folgendes steht:

[ISO 22514-3]
Norm ISO 22514-3 2008. Statistische Verfahren im Prozessmanagement - Fähigkeit und Leistung - Teil 3: Maschinenfähigkeitsuntersuchungen für Messwerte von diskreten Teilen

Also quasi
Type Number Year. Title

Dies bekomme ich aber irgendwie nicht aif die Reihe.
%Einstellungen fürs Literaturverzeichnis
\usepackage[citestyle=authoryear-comp,bibstyle=authortitle,sorting=nyt,dashed=false,url=false,isbn=false,maxcitenames=1,firstinits= true,backend=bibtex]{biblatex} 

\renewcommand*{\mkbibnamelast}[1]{\textsc{#1}} 

% Namensortierung: esrt Nachname, dann Vorname 
\DeclareNameAlias{sortname}{last-first} 

% Zitat im Text mit eckiger Klammer 
\DeclareCiteCommand{\mycite}[\mkbibbrackets] 
   {\usebibmacro{cite:init}% 
    \usebibmacro{prenote}} 
   {\usebibmacro{citeindex}% 
    \usebibmacro{cite}} 
   {} 
   {\usebibmacro{postnote}} 

% Anführungszeichen weg für bestimmte Typen
%\DeclareFieldFormat 
%   [article,inbook,incollection,inproceedings,patent,thesis,unpublished] 
%   {title}{#1\isdot}

%Anführungszeichen weg für alle
\DeclareFieldFormat*{title}{#1\isdot}

\newcounter{mymaxcitenames} 
\AtBeginDocument{% 
   \setcounter{mymaxcitenames}{\value{maxnames}}% 
} 

\renewbibmacro*{begentry}{% 
   \printtext[brackets]{% 
     \begingroup 
     \defcounter{maxnames}{\value{mymaxcitenames}}% 
     \printnames{labelname}% 
     \setunit{\nameyeardelim}% 
     \usebibmacro{cite:labelyear+extrayear}% 
     \endgroup 
     }% 
   \newline 
} 


\renewbibmacro*{name:andothers}{% 
   \ifboolexpr{ 
     test {\ifnumequal{\value{listcount}}{\value{liststop}}} 
     and 
     test \ifmorenames 
   } 
     {\ifnumgreater{\value{liststop}}{1} 
        {\finalandcomma} 
        {}% 
      \andothersdelim\bibstring[\textsc]{andothers}} 
     {}} 

\renewcommand*{\finalnamedelim}{% 
   \ifnumgreater{\value{liststop}}{2}{\finalandcomma}{}% 
   \addspace\bibstring[\textsc]{and}\space} 

\renewcommand*{\labelnamepunct}{\addcolon\space} 

\addbibresource{Literatur.bib} 

%Überschrift in Literaturverzeichnis ändern 
\defbibheading{head}{\section*{Literaturverzeichnis}} 

%Abstand zwischen den Einträgen vergrößern
\setlength{\bibitemsep}{12pt}
So erstelle ich mein Literaturverzeichnis und ich dachte ich könnte das so modifizieren:
\begin{filecontents}{norm.dbx}
\DeclareDatamodelEntrytypes{norm}
%\DeclareDatamodelFields[type=field, datatype=literal]{institution}
\DeclareDatamodelEntryfields[norm]{type,number,title}
\end{filecontents}

\DeclareBibliographyDriver{standard}{%
      \usebibmacro{bibindex}%
      \usebibmacro{begentry}%
      \printfield{type}\setunit{\addspace}\newblock\printfield{number}%
			\newunit\newblock
      \usebibmacro{title}%
      \setunit{\addspace}
      \printfield{year}%      
   \usebibmacro{finentry}
´Funktioniert aber leider nicht.
Kann mir jemand einen Tipp geben woran es hackt?[/i]

Gast

Beitrag von Gast »

Nun, zunächst definierst Du den Treiber für @standard, schreibst dann aber überall @Norm und norm. Standardmäßig kennt biblatex nur @standard, Du könntest ihm Norm beibringen das lohnt sich aber, da @standard schon existiert, nur bedingt. (Du musst natürlich JabRef überreden, mitzumachen, wenn das wirklich nicht geht, können wir auch nach einer Lösung für @norm suchen - am einfachsten wäre ein Alias.)

Ansonsten habe ich Dein Beispiel leider noch nicht getestet, da es kein Minimalbeispiel ist, sondern aus mehreren Schnipseln besteht, die ich erst zusammenbauen müsste, das dauert aber.
Eine bessere Problembeschreibung als "funktioniert nicht" wäre auch hilfreich gewesen.

Von der Idee her, sollte der restliche Code aber grob das machen, was Du möchtest.

Gast

Beitrag von Gast »

Ah, ein bisschen was habe ich noch.

Wenn Du die tollen neuen Data-Model-Features nutzen möchtest (die .dbx-Datei), dann solltest Du Biber nutzen und nicht BibTeX.
Bis zu einem gewissen Grade kann auch die .bst-Datei hacken und das ganze mit BibTeX zum laufen kriegen, aber das ist wenig komfortabel und Biber bietet noch andere Vorteile.

Deinem Treiber fehlt außerdem die schließende Klammer } am Ende.

Du musst natürlich noch die Zitierbefehle anpassen, damit Du im Zitat auch das richtige siehst. Mit shorthand kannst Du das ganze etwas abkürzen.

sudo
Forum-Guru
Forum-Guru
Beiträge: 459
Registriert: Mi 3. Okt 2012, 11:32

Beitrag von sudo »

Schau auch mal bei biblatex, biber und DIN-Norm vorbei. Wie der Titel schon sagt, braucht man aber das vom Gast angesprochene biber dafür.
Ein vollständiges Minimalbeispiel (VM) zu erzeugen, ist gar nicht schwer und hilft ganz oft, Fehler selber zu finden. Ohne bekommt man selten gute Antworten. Anleitungen findest du z.B. im golatex Wiki auf TeXWelt oder minimalbeipiel.de
Außerdem hilft das Lesen dieser Seite, Fragen richtig zu stellen.

joa*k
Forum-Anfänger
Forum-Anfänger
Beiträge: 30
Registriert: Fr 8. Aug 2014, 07:58

Beitrag von joa*k »

Hallo zusammen und Danke erst mal für die Antworten.

Ich möchte das wenn es irgendwie möglich ist gerne in biblatex ohne biber lösen.

Weiter gekommen bin ich allerdings trotz recherche imme rnoch nicht.

Hier nochmal ein lauffähiges Minimalbeispiel
\begin{filecontents}{myLit.bib}
@Norm{DIN9001,
  Title                    = {Qualitätsmanagementsysteme – Anforderungen},
  Number                   = {DIN EN ISO 9001},
  Type                     = {Norm},
  Year                     = {2014},
  Author                   = {Norm DIN EN ISO 9001},
}
@Book{Klein1993,
  Title                    = {Statistische Tolerierung: Qualität der konstruktiven Gestaltung},
  Author                   = {B. Klein and F. Mannewitz},
  Publisher                = {Carl Hanser Verlag, München/Wien},
  Year                     = {1993},
}
\end{filecontents}

\documentclass{article} 
\usepackage[ngerman]{babel} 
% wegen deutschen Umlauten
\usepackage[ansinew]{inputenc}

\usepackage[citestyle=authoryear-comp,bibstyle=authortitle,sorting=nyt,dashed=false,url=false,isbn=false,maxcitenames=1,firstinits= true,backend=bibtex]{biblatex} 

\renewcommand*{\mkbibnamelast}[1]{\textsc{#1}} 

% Namensortierung: esrt Nachname, dann Vorname 
\DeclareNameAlias{sortname}{last-first} 

% Zitat im Text mit eckiger Klammer 
\DeclareCiteCommand{\mycite}[\mkbibbrackets] 
   {\usebibmacro{cite:init}% 
    \usebibmacro{prenote}} 
   {\usebibmacro{citeindex}% 
    \usebibmacro{cite}} 
   {} 
   {\usebibmacro{postnote}} 

% Anführungszeichen weg für bestimmte Typen
%\DeclareFieldFormat 
%   [article,inbook,incollection,inproceedings,patent,thesis,unpublished] 
%   {title}{#1\isdot}
%Anführungszeichen weg für alle
\DeclareFieldFormat*{title}{#1\isdot}

\newcounter{mymaxcitenames} 
\AtBeginDocument{% 
   \setcounter{mymaxcitenames}{\value{maxnames}}% 
} 

\renewbibmacro*{begentry}{% 
   \printtext[brackets]{% 
     \begingroup 
     \defcounter{maxnames}{\value{mymaxcitenames}}% 
     \printnames{labelname}% 
     \setunit{\nameyeardelim}% 
     \usebibmacro{cite:labelyear+extrayear}% 
     \endgroup 
     }% 
   \newline 
} 


\renewbibmacro*{name:andothers}{% 
   \ifboolexpr{ 
     test {\ifnumequal{\value{listcount}}{\value{liststop}}} 
     and 
     test \ifmorenames 
   } 
     {\ifnumgreater{\value{liststop}}{1} 
        {\finalandcomma} 
        {}% 
      \andothersdelim\bibstring[\textsc]{andothers}} 
     {}} 

\renewcommand*{\finalnamedelim}{% 
   \ifnumgreater{\value{liststop}}{2}{\finalandcomma}{}% 
   \addspace\bibstring[\textsc]{and}\space} 

\renewcommand*{\labelnamepunct}{\addcolon\space} 

%%%%%%%%%%%%%%%%%%%NORM

\DeclareBibliographyDriver{norm}{%
      \usebibmacro{bibindex}%
      \usebibmacro{begentry}%
      \printfield{type}\setunit{\addspace}\newblock\printfield{number}%
			\newunit\newblock
      \usebibmacro{title}%
      \setunit{\addspace}
      \printfield{year}%      
   \usebibmacro{finentry}}

%%%%%%%%%%%%%%%%%%%%

\addbibresource{myLit.bib} 





%Überschrift in Literaturverzeichnis ändern 
\defbibheading{head}{\section*{Literaturverzeichnis}} 

\setlength{\bibitemsep}{12pt}

\begin{document} 
Ein bisschen Text \mycite{DIN9001}.\\
Ein bisschen Text \mycite{Klein1993}.


\printbibliography 
\end{document} 
hier bei bekomme ich folgende Warnung angezeigt:
BibTeX> Warning--entry type for "DIN9001" isn't style-file defined
Mein Problem ist jetzt das meines Erachtens meine Neudefinition gar nichts ändert. Ich habe wirklich versucht etwas brauchbares im Internet zu finden, komme aber einfach nicht weiter.

Wäre super wenn mir jemand helfen kann.

Danke im Voraus![/code]

sudo
Forum-Guru
Forum-Guru
Beiträge: 459
Registriert: Mi 3. Okt 2012, 11:32

Beitrag von sudo »

joa*k hat geschrieben:Ich möchte das wenn es irgendwie möglich ist gerne in biblatex ohne biber lösen.
Warum?
Ein vollständiges Minimalbeispiel (VM) zu erzeugen, ist gar nicht schwer und hilft ganz oft, Fehler selber zu finden. Ohne bekommt man selten gute Antworten. Anleitungen findest du z.B. im golatex Wiki auf TeXWelt oder minimalbeipiel.de
Außerdem hilft das Lesen dieser Seite, Fragen richtig zu stellen.

joa*k
Forum-Anfänger
Forum-Anfänger
Beiträge: 30
Registriert: Fr 8. Aug 2014, 07:58

Beitrag von joa*k »

Warum nicht? :-)

Gast

Beitrag von Gast »

Der Fehler kommt, da Du den Typ @norm verwendest und nicht wie oben vorgeschlagen den Typ @standard. (Denn biblatex kennt @norm nicht; @standard ist zwar normalerweise nur ein Alias zu @misc, wenn Du aber einen Treiber definierst kommen wir da weiter.)
Du musst also überall standard statt norm schreiben.

Ich finde es etwas unsinnig, den Autor der Norm als Author = {Norm DIN EN ISO 9001}, anzugeben, mach das lieber weg, Du verwendest den Autor ja auch gar nicht.

Wenn Du dann noch das shorthand-Feld einfach mit deinem gewünschten Zitierformat befüllst, z.B. shorthand = {DIN EN ISO 9001},, bist Du schon fast fertig (ja mit Biber ginge das auch automatisch und man kann sicher auch den Cite-Befehl anpassen, dass er das auch ohne shorthand hinbekommt, aber warum - besonders letzteres macht alles nur weniger portabel; der Tipp wurde oben übrigens auch schon erwähnt.)

joa*k
Forum-Anfänger
Forum-Anfänger
Beiträge: 30
Registriert: Fr 8. Aug 2014, 07:58

Beitrag von joa*k »

So weit, so gut! :-)
Danke schon mal für die Hilfe.

Es sieht jetzt so aus:
\begin{filecontents}{myLit.bib}
@standard{DIN9001,
  Title                    = {Qualitätsmanagementsysteme – Anforderungen},
  Number                   = {DIN EN ISO 9001},
  Type                     = {Norm},
  Year                     = {2014},
	Shorthand								 = {DIN EN ISO 9001}
}
@Book{Klein1993,
  Title                    = {Statistische Tolerierung: Qualität der konstruktiven Gestaltung},
  Author                   = {B. Klein and F. Mannewitz},
  Publisher                = {Carl Hanser Verlag, München/Wien},
  Year                     = {1993}
}
\end{filecontents}

\documentclass{article} 
\usepackage[ngerman]{babel} 
% wegen deutschen Umlauten
\usepackage[ansinew]{inputenc}

\usepackage[citestyle=authoryear-comp,bibstyle=authortitle,sorting=nyt,dashed=false,url=false,isbn=false,maxcitenames=1,firstinits= true,backend=bibtex]{biblatex} 

\renewcommand*{\mkbibnamelast}[1]{\textsc{#1}} 

% Namensortierung: esrt Nachname, dann Vorname 
\DeclareNameAlias{sortname}{last-first} 

% Zitat im Text mit eckiger Klammer 
\DeclareCiteCommand{\mycite}[\mkbibbrackets] 
   {\usebibmacro{cite:init}% 
    \usebibmacro{prenote}} 
   {\usebibmacro{citeindex}% 
    \usebibmacro{cite}} 
   {} 
   {\usebibmacro{postnote}} 

% Anführungszeichen weg für bestimmte Typen
%\DeclareFieldFormat 
%   [article,inbook,incollection,inproceedings,patent,thesis,unpublished] 
%   {title}{#1\isdot}
%Anführungszeichen weg für alle
\DeclareFieldFormat*{title}{#1\isdot}

\newcounter{mymaxcitenames} 
\AtBeginDocument{% 
   \setcounter{mymaxcitenames}{\value{maxnames}}% 
} 

\renewbibmacro*{begentry}{% 
   \printtext[brackets]{% 
     \begingroup 
     \defcounter{maxnames}{\value{mymaxcitenames}}% 
     \printnames{labelname}% 
     \setunit{\nameyeardelim}% 
     \usebibmacro{cite:labelyear+extrayear}% 
     \endgroup 
     }% 
   \newline 
} 



\renewbibmacro*{name:andothers}{% 
   \ifboolexpr{ 
     test {\ifnumequal{\value{listcount}}{\value{liststop}}} 
     and 
     test \ifmorenames 
   } 
     {\ifnumgreater{\value{liststop}}{1} 
        {\finalandcomma} 
        {}% 
      \andothersdelim\bibstring[\textsc]{andothers}} 
     {}} 

\renewcommand*{\finalnamedelim}{% 
   \ifnumgreater{\value{liststop}}{2}{\finalandcomma}{}% 
   \addspace\bibstring[\textsc]{and}\space} 

\renewcommand*{\labelnamepunct}{\addcolon\space} 

%%%%%%%%%%%%%%%%%%%NORM
%\DeclareBibliographyAlias{norm}{standard}

\DeclareBibliographyDriver{standard}{%
      \usebibmacro{bibindex}%
      \usebibmacro{begentry}%
      \printfield{type}\setunit{\addspace}\newblock\printfield{number}%
			\setunit{\addspace}
			\printfield{year}% 
			\newunit\newblock
      \usebibmacro{title}% 
			\usebibmacro{finentry}}

\DeclareFieldFormat[standard]{title}{\mkbibemph{#1}} 


%%%%%%%%%%%%%%%%%%%%

\addbibresource{myLit.bib} 





%Überschrift in Literaturverzeichnis ändern 
\defbibheading{head}{\section*{Literaturverzeichnis}} 

\setlength{\bibitemsep}{12pt}

\begin{document} 
Ein bisschen Text \mycite{DIN9001}.\\
Ein bisschen Text \mycite{Klein1993}.


\printbibliography 
\end{document} 
Und klappt. Das Einzige was mir jetzt noch fehlt ist wie ich den \renewbibmacro so modifiziere das er bei \ifentrytype{standard} mit shorthand anzeigt im Literaturverzeichnis bei allen anederen Einträgen aber so bleibt wie er definiert ist. Da stehe ich mal wieder auf dem Schlauch.

Gast

Beitrag von Gast »

Ja das liegt an diesem begentry macro, probier mal diese Definition, die ich eins zu eins aus authoryear.cbx geklaut habe
\renewbibmacro*{begentry}{%
   \printtext[brackets]{%
     \begingroup
     \defcounter{maxnames}{\value{mymaxcitenames}}%
     \iffieldundef{shorthand}
       {\ifthenelse{\ifnameundef{labelname}\OR\iffieldundef{labelyear}}
         {\usebibmacro{cite:label}%
          \setunit{\addspace}}
         {\printnames{labelname}%
          \setunit{\nameyeardelim}}%
        \usebibmacro{cite:labelyear+extrayear}}
       {\usebibmacro{cite:shorthand}}%
     \endgroup
     }%
   \newline
}

Antworten