Änderung Citation Style

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Änderung Citation Style

Re: Änderung Citation Style

von MoeWe » Fr 25. Feb 2022, 16:30

`\AtEveryBibitem` ist im Allgemeinen nicht der richtige Ort, um etwas auszugeben.

Für Anpassungen auf dem Niveau solltest Du Dich einmal generell mit der Funktionsweise von biblatex-Stilen auseinandersetzen. Ich verweise dazu gerne nochmal (viewtopic.php?p=110261#p110261) auf die Artikel von Dominik Waßenhoven in der TeXnischen Komödie (https://archiv.dante.de/DTK/PDF/komoedie_2008_2.pdf und https://archiv.dante.de/DTK/PDF/komoedie_2008_4.pdf, aber wieder wichtig zu erwähnen: die Artikel sind schon etwas älter, viele Details haben sich geändert, aber das Grundprinzip ist noch immer gleich. Lies die Artikel eher als grundsätzliche Erklärung und nicht als copy-und-paste-bare Anleitung für einen neuen Stil.) (Siehe auch viewtopic.php?f=15&t=24292.)

Wichtig für Dich ist, dass Literaturverzeichnis-Stile für jeden Typen, den sie unterstützen, einen sogenannten driver definieren. Bei den Standard-Stilen leben die driver in standard.bbx, der für Online ist in Zeile 469-500. Wenn ein Eintrag im Literaturverzeichnis ausgegeben werden soll, geht biblatex zum passenden driver und arbeitet den von oben nach unten ab. Ein driver besteht normalerweise aus einer Reihe von Bibmakros, die mittels diverser biblatex-Befehle für die Ausgabe verschiedenster Felder sorgen.

Wenn Du also die Ausgabe von @online-Quellen ändern willst, musst Du Dir den driver für @online ansehen, die dort genutzten Makros analysieren und dann die Makros umdefinieren oder den driver umbauen.

Re: Änderung Citation Style

von Sam85 » Mi 23. Feb 2022, 13:32

Hallo Gast,

nein, ich erwarte keine fertige Lösung. Eigentlich ist meine Frage auch nur darauf ausgerichtet, den Einstiegspunkt für das If Konstrukt zu finden. Ist sowas der korrekte Einstieg? Und wenn ich das Else frei lasse, wird dann das ausgegeben was ohne diese Abfrage passieren würde?
%Literaturverzeichnis: Online
\DeclareFieldFormat[online]{date}{\mkbibparens{#1}}
\DeclareFieldFormat[online]{url}{<\url{#1}>}
\DeclareFieldFormat[online]{urldate}{[{Zugriff}\addspace{#1}]}

	\AtEveryBibitem{
		\ifentrytype{online}{
			\ifnameundef{author}{
				\usebibmacro{url}\setunit*{\addspace}
				\usebibmacro{urldate}
			}{}
		}{}
	}
Das Ergebnis ist nur nicht ganz korrekt...

Re: Änderung Citation Style

von gast. » Di 22. Feb 2022, 14:39

Sam85 hat geschrieben:
Di 22. Feb 2022, 14:05
ich vermute das ist der gesamte Kontext was die Literaturangaben betrifft.
Du mutest jedem einzelnen Helfer zu, dass er daraus einen lauffähigen Code bastelt, der hoffentlich dem entspricht, was du verwendest, damit er damit testen kann. Warum beachtest du nicht den Link, den MoeWe dir nicht grundlos bereits zweimal an die Hand gegeben hat?

Re: Änderung Citation Style

von Sam85 » Di 22. Feb 2022, 14:05

Hi MoeWe,

ich vermute das ist der gesamte Kontext was die Literaturangaben betrifft. Wie gesagt, ich habe das Beispiel von hier https://github.com/andygrunwald/FOM-LaTeX-Template und nur minimale Anpassung vorgenommen.
\usepackage[
backend=biber,
style=ext-authoryear-ibid, % Auskommentieren und nächste Zeile einkommentieren, falls "Ebd." (ebenda) nicht für sich-wiederholende Fussnoten genutzt werden soll.
%style=ext-authoryear,
maxcitenames=3,	% mindestens 3 Namen ausgeben bevor et. al. kommt
maxbibnames=999,
mergedate=false,
date=iso,
seconds=true, %werden nicht verwendet, so werden aber Warnungen unterdrückt.
urldate=iso,
innamebeforetitle,
dashed=false,
autocite=footnote,
doi=false,
useprefix=true, % 'von' im Namen beachten (beim Anzeigen)
mincrossrefs = 1
]{biblatex}%iso dateformat für YYYY-MM-DD

%weitere Anpassungen für BibLaTex
\input{skripte/modsBiblatex2018}
\usepackage{xpatch}

\setlength\bibhang{1cm}

%%% Weitere Optionen
%\boolitem[false]{citexref} %Wenn incollection, inbook, inproceedings genutzt wird nicht den zugehörigen parent auch in Literaturverzeichnis aufnehmen

%Aufräumen, die Felder werden laut Leitfaden nicht benötigt.
\AtEveryBibitem{
	\ifentrytype{book}
		{
		    \clearfield{issn}
		    \clearfield{doi}
		    \clearfield{isbn}
		    \clearfield{url}
		    \clearfield{eprint}
		}{}
	\ifentrytype{collection}
		{
			\clearfield{issn}
			\clearfield{doi}
			\clearfield{isbn}
			\clearfield{url}
			\clearfield{eprint}
		}{}
	\ifentrytype{incollection}
		{
			\clearfield{issn}
			\clearfield{doi}
			\clearfield{isbn}
			\clearfield{url}
			\clearfield{eprint}
		}{}
	\ifentrytype{article}
		{
			\clearfield{issn}
			\clearfield{doi}
			\clearfield{isbn}
			\clearfield{url}
			\clearfield{eprint}
		}{}
	\ifentrytype{inproceedings}
		{
			\clearfield{issn}
			\clearfield{doi}
			\clearfield{isbn}
			\clearfield{url}
			\clearfield{eprint}
		}{}
	\ifentrytype{online}
		{
			\clearfield{location}
			\clearfield{urltime}
			\clearfield{organization}
		}{}
}

%Kein Punkt am Ende des Literaturverzeichnisses
\renewcommand*{\finentrypunct}{}

\renewcommand*{\newunitpunct}{\addcomma\space}

\DeclareDelimFormat[bib,biblist]{nametitledelim}{\addcolon\space}
\DeclareDelimFormat{titleyeardelim}{\newunitpunct}

%Namen kursiv schreiben
\renewcommand*{\mkbibnamefamily}{\mkbibemph}
\renewcommand*{\mkbibnamegiven}{\mkbibemph}
\renewcommand*{\mkbibnamesuffix}{\mkbibemph}
\renewcommand*{\mkbibnameprefix}{\mkbibemph}

% Die Trennung mehrerer Autorennamen erfolgt durch Kommata.
% siehe Beispiele im Leitfaden S. 16
% Die folgende Zeile würde mit Semikolon trennen
%\DeclareDelimFormat{multinamedelim}{\addsemicolon\addspace}

%Delimiter für mehrere und letzten Namen gleich setzen
\DeclareDelimAlias{finalnamedelim}{multinamedelim}

\DeclareNameAlias{default}{family-given}

%Nach Namen sortieren
\DeclareNameAlias{sortname}{default}  

\DeclareFieldFormat{editortype}{\mkbibparens{#1}}
\DeclareDelimFormat{editortypedelim}{\addspace}
\DeclareFieldFormat{translatortype}{\mkbibparens{#1}}
\DeclareDelimFormat{translatortypedelim}{\addspace}
\DeclareDelimFormat[bib,biblist]{innametitledelim}{\addcomma\space}

\DeclareFieldFormat*{citetitle}{#1}
\DeclareFieldFormat*{title}{#1}
\DeclareFieldFormat*{booktitle}{#1}
\DeclareFieldFormat*{journaltitle}{#1}

\xpatchbibdriver{online}
  {\usebibmacro{organization+location+date}\newunit\newblock}
  {}
  {}{}

%Literaturverzeichnis: Online
\DeclareFieldFormat[online]{date}{\mkbibparens{#1}}
\DeclareFieldFormat[online]{url}{<\url{#1}>}
\DeclareFieldFormat[online]{urldate}{[{Zugriff}\addspace{#1}]}

\renewbibmacro*{url+urldate}
	{%
  		\usebibmacro{url}%
  		\ifentrytype{online}
    		{
    			\setunit*{\addspace}%
     			\iffieldundef{year}
       				{\printtext[date]{}}
       				{\usebibmacro{date}}
   			}{}
 		\setunit*{\addspace}%
  		\usebibmacro{urldate}
  	}

%\renewbibmacro*{url+urldate}{%
%	\usebibmacro{url}%
%	\ifentrytype{online}
%	{\setunit*{\addspace}%
%		\usebibmacro{date}}
%	{}
%	\setunit*{\addspace}%
%	\usebibmacro{urldate}}

%\ifentrytype{online}
%	{%
%		\ifnameundef{author}	
%			{%
%		\usebibmacro{url}
%		\usebibmacro{urldate}
%			}{}%
%	}{}

%Verhindern, dass bei mehreren Quellen des gleichen Autors im gleichen Jahr
%Buchstaben nach der Jahreszahl angezeigt werden wenn sich das Keyword in usera unterscheidet.
\DeclareExtradate{
  \scope{
    \field{labelyear}
    \field{year}
    }
    \scope{
      \field{usera}
     }
}

%% Anzeige des Jahres nach dem Stichwort (usera) im Literaturverzeichnis
%% Wenn das Jahr bei Online-Quellen nicht explizit angegeben wurde, wird nach
%% dem Stichwort 'o. J.' ausgegeben. Nach der URL steht dann 'keine
%% Datumsangabe'. Ist das Jahr definiert, wird es an beiden Stellen ausgegeben.
%% Das Zugriffsdatum (urldate) spielt hier keine Rolle.
%% Für Nicht-Online-Quellen wird nichts geändert.
\renewbibmacro*{date+extradate}{%
  \printtext[parens]{%
    \printfield{usera}%
    \setunit{\printdelim{titleyeardelim}}%
    \ifentrytype{online}
       {\setunit*{\addspace\addcomma\addspace}%
         \iffieldundef{year}
           {\bibstring{nodate}}
       {\printlabeldateextra}}%
       {\printlabeldateextra}}}

%% Anzeige des Jahres nach dem Stichwort (usera) in der Fussnote
%% das Stichwort hat der Aufrufer hier schon ausgegeben.
%% siehe auch Kommentar zu: \renewbibmacro*{date+extradate}
\renewbibmacro*{cite:labeldate+extradate}{%
    \ifentrytype{online}
       {\setunit*{\addspace\addcomma\addspace}%
         \iffieldundef{year}
           {\bibstring{nodate}}
       {\printlabeldateextra}}%
       {\printlabeldateextra}}

%Abkürzungen Literaturverzeichnis
\DefineBibliographyStrings{german}
	{
	  	nodate    	= {o\adddot\addspace J\adddot},
	 	andothers 	= {et\addabbrvspace al\adddot}
	}

\DefineBibliographyStrings{english}
	{
		nodate    	= {n\adddot\addspace d\adddot},
	  	andothers 	= {et\addabbrvspace al\adddot}
	}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[notfield=translator, final]
      \step[notfield=editor, final]
      \step[fieldset=author, fieldvalue={{{\langde{o\noexpand\adddot\addspace V\noexpand\adddot}\langen{Anon}}}}]
    }
    \map{
      \pernottype{online}
      \step[fieldset=location, fieldvalue={\langde{o\noexpand\adddot\addspace O\noexpand\adddot}\langen{s\noexpand\adddot I\noexpand\adddot}}]
    }
  }
}

\renewbibmacro*{cite}{%
  \iffieldundef{shorthand}
    {\ifthenelse{\ifnameundef{labelname}\OR\iffieldundef{labelyear}}
       {\usebibmacro{cite:label}%
        \setunit{\printdelim{nonametitledelim}}}
       {\printnames{labelname}%
        \setunit{\printdelim{nametitledelim}}}%
     \printfield{usera}%
     \setunit{\printdelim{titleyeardelim}}%
     \usebibmacro{cite:labeldate+extradate}}
    {\usebibmacro{cite:shorthand}}}

    \renewcommand*{\jourvoldelim}{\addcomma\addspace}% Trennung zwischen journalname und Volume. Sonst Space; Laut Leitfaden richtig
    %Aufgrund der Änderung bzgl des Issues 169 in der thesis_main.tex musste ich die Zeile auskommentieren. Konnte aber das Verhalten, dass die Fußnoten grün sind, im nachhinein nicht feststellen.
    %\hypersetup{hidelinks} %sonst sind Fußnoten grün. Dadurch werden Links allerdings nicht mehr farbig dargestellt

\renewbibmacro*{journal+issuetitle}{%
  \usebibmacro{journal}%
  \setunit*{\jourvoldelim}%
  \iffieldundef{series}
    {}
    {\setunit*{\jourserdelim}%
     \printfield{series}%
     \setunit{\servoldelim}}%
  \iffieldundef{volume}
    {}
    {\printfield{volume}}
  \iffieldundef{labelyear}
  {}
  {
  (\thefield{year}) %Ansonsten wird wenn kein Volume angegeben ist ein Komma vorangestellt
  }
  \setunit*{\addcomma\addspace Nr\adddot\addspace}
  \printfield{number}
  \iffieldundef{eid}
  {}
  {\printfield{eid}}
}

% Postnote ist der Text in der zweiten eckigen Klammer bei einem Zitat
% wenn es keinen solchen Eintrag gibt, dann auch nicht ausgeben, z.B. 'o. S.'
% Wenn man das will, kann man das 'o. S.' ja explizit angeben. Andernfalls steht
% sonst auch bei Webseiten 'o. S.' da, was laut Leitfaden nicht ok ist.
\renewbibmacro*{postnote}{%
  \setunit{\postnotedelim}%
  \iffieldundef{postnote}
    {} %{\printtext{\langde{o.S\adddot}\langen{no page number}}}
    {\printfield{postnote}}}

% Abstand bei Änderung Anfangsbuchstabe ca. 1.5 Zeilen
\setlength{\bibinitsep}{0.75cm}

% nur in den Zitaten/Fussnoten den Vornamen abkürzen (nicht im
% Literaturverzeichnis)

\DeclareDelimFormat{nonameyeardelim}{\addcomma\space}
\DeclareDelimFormat{nameyeardelim}{\addcomma\space}

\renewbibmacro*{cite}{%
  \iffieldundef{shorthand}
    {\ifthenelse{\ifciteibid\AND\NOT\iffirstonpage}
       {\usebibmacro{cite:ibid}}
    {\printtext[bibhyperref]{\ifthenelse{\ifnameundef{labelname}\OR\iffieldundef{labelyear}}
       {\usebibmacro{cite:label}%
        \setunit{\printdelim{nonameyeardelim}}}
      {\toggletrue{abx@bool@giveninits}%
        \printnames[family-given]{labelname}%
        \setunit{\printdelim{nameyeardelim}}}%
      \printfield{usera}%
      \setunit{\printdelim{titleyeardelim}}%
     \usebibmacro{cite:labeldate+extradate}}}}
   {\usebibmacro{cite:shorthand}}}

Re: Änderung Citation Style

von MoeWe » Fr 18. Feb 2022, 07:30

Ein so kurzer Code-Ausschnitt ist leider bei weitem nicht genug, um ein Urteil treffen zu können. So ist mir überhaupt nicht klar, in welchem Kontext dieser Code aufgerufen wird. Treffende Hilfe in einem solchen Fall bräuchte ein Minimalbeispiel.

Grundsätzlich tut der gezeigte Code nur etwas, wenn der aktuell verarbeitete Eintrag ein @online-Eintrag ohne author ist. Dann gibt er erst die URL (mit \usebibmacro{url}, das standardmäßig als \newbibmacro*{url}{\printfield{url}} definiert ist) und dann das Abrufdatum (mit \usebibmacro{urldate}, das standardmäßig als \newbibmacro*{urldate}{\printurldate} definiert ist) aus. An der Stelle sollte ich erwähnen, das Zeichensetzung (auch Leerzeichen) innerhalb von \bibmacros (und auch dazwischen) nicht direkt, sondern immer mit \setunit und Freunden erfolgen sollte. Daher ist die Standarddefinition von url+urldate auch
\newbibmacro*{url+urldate}{%
  \usebibmacro{url}%
  \iffieldundef{urlyear}
    {}
    {\setunit*{\addspace}%
     \usebibmacro{urldate}}}
Dem solltest Du folgen, indem Du nicht ein Leerzeichen erzeugst, indem Du nach \usebibmacro{url} das Zeilenende nicht kommentierst, sondern \setunit nimmst. Bei Dir also in etwa
\ifentrytype{online}
  {\ifnameundef{author}	
    {\usebibmacro{url}%
     \iffieldundef{urlyear}
       {}
       {\setunit*{\addspace}%
        \usebibmacro{urldate}}}
    {}}
  {}

Re: Änderung Citation Style

von Sam85 » Do 17. Feb 2022, 22:53

Hi,
hab mich jetzt länger nicht damit beschäftigen können und wollte das mit dem if clause endlich unterbringen.
Ich war der Ansicht, es sollte reichen das true abzufangen weil das false bestimmt das ursprüngliche Ergebnis darstellt. Leider klappt das nicht. Mein Plan ist, ifentrytype ist online dann ifnameundef nur die URL und das Datum. Wie setze ich das richtig um?

Freue mich über Input.
\ifentrytype{online}
	{%
		\ifnameundef{author}	
			{%
		\usebibmacro{url}
		\usebibmacro{urldate}
			}{}%
	}{}

Re: Änderung Citation Style

von MoeWe » So 2. Jan 2022, 09:58

Mit \renewbibmacro*{url+urldate} definierst Du ein Bibmakro namens url+urldate um. Normalerweise wird dieses Makro im Literaturverzeichnis von allen Typen verwendet. (Jeder Typ hat einen eigenen bibliography driver, der bestimmt, wie die Ausgabe im Literaturverzeichnis aussieht. Ein bibliography driver ruft meist eine Anzahl an Bibmakros auf, um die Ausgabe zu erledigen. Siehe z.B. den aktuellen @online-driver, standard.bbx, Z. 469-500. Das url+urldate-Makro wird standardmäßig universell verwendet.) Das bedeutet, dass Du dadurch die Ausgabe der URL und des Abrufdatums im Literaturverzeichnis anpasst.

Der gezeigte Code definiert das standardmäßig (in biblatex.def, Z. 2924-2929) als
\newbibmacro*{url+urldate}{%
  \usebibmacro{url}%
  \iffieldundef{urlyear}
    {}
    {\setunit*{\addspace}%
     \usebibmacro{urldate}}}
definierte Makro etwas um.

Noch immer wird die URL ausgegeben (unabhängig vom Typ). Dann wird - nur für @online (mit \ifentrytype{online}{<true>}{<false>}) - nach einem Leerzeichen auch das date, also das Publikationsdatum, ausgegeben. (Wie gesagt ist das \printtext[date]{} nicht sinnvoll, da es nichts tut. \printtext[<format>]{<text>} gibt den gegebenen Text <text> im Format <format> aus. In der hier genutzten Eingabe ist <text> leer. Das ist ein Sonderfall, auf den biblatex extra testet und in dem gar nichts passiert. Das \iffieldundef{year} kann man sich ebenfalls sparen, da \usebibmacro{date} clever genug ist, nichts zu tun, wenn das Datum nicht definiert ist.) Schließlich kommt für alle Typen wieder ein Leerzeichen und dann das Abrufdatum.

Mit year und date muss man ein bisschen aufpassen. Die beziehen sich auf das gleiche, nämlich das Publikationsdatum. Zunächst ist es so, dass in der Eingabe - in der .bib-Datei - sowohl year als auch date valide Felder sind. year ist dabei als mit BibTeX-Stilen abwärtskompatible Alternative für date gedacht. Man kann nicht beide gleichzeitig haben! Im biblatex-Code, wie Du in hier schreibst, gibt es kein Feld date. Dort wird date in einzelne Datumsbestandteile aufgeschlüsselt. Wie das genau passiert, muss man nicht wissen, wenn man einfach \usebibmacro{date} oder \printdate nutzt, um das Datum auszugeben. Was man aber wissen sollte, ist, dass es im Allgemeinen nicht sinnvoll ist, Code einzuführen, der date und year in Bibmakros zu unterscheiden versucht. Mit \iffieldundef{year} testet man, ob ein Datum vorhanden ist (egal ob es in der Eingabe date oder year war). \printfield{year} sollte man nicht nutzen, da es nicht für alle Eingaben korrekt funktioniert, \printfield{date} funktioniert gar nicht, da es auf der LaTeX-Seite kein Feld date gibt. Stattdessen nimmt man - wie oben erwähnt - \printdate und Co. (hier in Form von [t]\usebibmacro{date}[/tt] das als \printdate definiert ist).

Zu den fehlenden %: Die Regeln von TeX sind hier nicht ganz trivial. Für eine korrekte Antwort möchte ich wie oben auf https://tex.stackexchange.com/q/7453/35864 und die dort genannten weiterführenden Links verweisen. (Wenn Dir eine deutsche Version lieber ist, sieh Dir https://texwelt.de/fragen/16/ an.)

In Text ist es normalerweise gewünscht, dass ein Zeilenende ein Leerzeichen ist. Schließlich liest man ein Zeilenende wie ein Leerzeichen und es wäre unpraktisch und kontraintuitiv, explizit Leerzeichen vor dem Zeilenende einfügen zu müssen, um sie im Text erscheinen zu lassen. In Makrodefinitionen ist es häufig nicht gewollt, dass alle Zeilenenden (die oftmals für eine bessere Übersicht im Code eingeführt wurden) ein Leerzeichen produzieren. Daher muss dort oft ein % stehen. Das hat jetzt nichts unbedingt damit zu tun, ob man sich innerhalb geschweifter Klammern befindet oder nicht (obwohl man sich bei Makrodefinitionen eigentlich immer innerhalb von geschweiften Klammern befindet).

Nun ist es so, dass biblatex dadurch wie es Zeichensetzung handhabt (idealerweise mit \setunit und Co.), in einigen Situationen einen zusätzlichen Schutz vor ungewollten Leerzeichen eingebaut hat. Daher ist es sehr gut möglich, dass eine Vielzahl von (eigentlich) fehlenden % kein Problem verursachen. Es ist aber dennoch eine gute Idee, sich mit den Regeln für % vertraut zu machen und sie korrekt zu setzen. Denn alles kann auch biblatex nicht.

Re: Änderung Citation Style

von Sam85 » Sa 1. Jan 2022, 22:09

Hi Moewe,

ich hab mich gestern Nacht auch etwas damit auseinander gesetzt und muss dir bei vielem zustimmen :).
Die Vorlage habe ich von hier: (habe bisher nur kleine Dinge geändert wie Doppelpunkt und so schnick schnack, weil es im Großen und Ganzen stimmig ist).
https://github.com/andygrunwald/FOM-LaTeX-Template

Wenn ich das hier richtig verstanden habe dann kann damit die Bibliography "Url und Urldate" überschrieben werden.
Und als erstes die "url" und zwar nur wenn es sich um einen "online" eintrag handelt. Dann wird zuerst ein Leerzeichen eingefügt und dann eine wenn Klausel auf das "year" angewendet. Wenn also das "year" nicht definiert ist, ich nehme an leer ist, dann soll "date" ausgegeben werden, andernfalls nicht. Dann wieder Leerzeichen und "urldate". Deute ich den Code richtig?
\renewbibmacro*{url+urldate}
	{
  		\usebibmacro{url}
  		\ifentrytype{online}
    		{
    			\setunit*{\addspace}
     			\iffieldundef{year}
       				{\printtext[date]{}}
       				{\usebibmacro{date}}
   			}
    	{}
  		\setunit*{\addspace}
  		\usebibmacro{urldate}
  	}
 
Das mit dem \ifnameundef werde ich gleich mal testen, danach habe ich gesucht. Danke schön.

Edit:
Zu den %: d.h. am Ende einer Zeile, die in der Nächsten fortgesetzt wird, muss um ein Leerzeichen zu vermeiden, das % gesetzt werden? Gilt das nur für Kontext innerhalb der {}?

Re: Änderung Citation Style

von MoeWe » Sa 1. Jan 2022, 10:10

Grundsätzlich kannst Du mit \iffieldundef{<field>}{<true>}{<false>}, \iflistundef{<field>}{<true>}{<false>}, \ifnameundef{<field>}{<true>}{<false>} je nach Typ des relevanten Feldes (siehe biblatex-Anleitung, insbes. §2.2 Entry Fields) prüfen, ob ein Feld leer/nicht vorhanden ist. Für author also
\ifnameundef{author}
  {no author}
  {yes, there is an author}
Oftmals ist es in biblatex gar nicht unbedingt nötig, mit viel \iffieldundef zu hantieren, da die Zeichensetzung beispielsweise durch einen zusätzlichen Mechanismus vom Vorhandensein konkreter Felder abgekoppelt werden kann. In Deinem Fall wird man aber um den Befehl wohl kaum herumkommen.

\mkbibparens{<text>} erzeugt die Ausgabe "(<text>)", fügt also um das Argument einfach runde Klammern ein. (Das stimmt nicht ganz: Wenn sich um die runden Klammern weitere von biblatex kontrollierte Klammern befinden, dann alternieren runde und eckige Klammern.)

Im Kontext von \DeclareFieldFormat ist #1 der Inhalt des relevanten Feldes. Das field format wird später genutzt, um die Ausgabe des Feldes zu kontrollieren. Wenn dort also \mkbibparens{#1}, dann wird dieses Feld später in Klammern ausgegeben.

Der Codeblock
\renewbibmacro*{url+urldate}
	{
  		\usebibmacro{url}
  		\ifentrytype{online}
    		{
    			\setunit*{\addspace}
     			\iffieldundef{year}
       				{\printtext[date]{}}
       				{\usebibmacro{date}}
   			}
    	{}
  		\setunit*{\addspace}
  		\usebibmacro{urldate}
  	}
hat einige Merkwürdigkeiten.

Zunächst muss man bei LaTeX wissen, dass Zeilenenden wie normale Leerzeichen behandelt werden. Das bedeutet, dass ein Zeilenende ein Leerzeichen in der Ausgabe verursachen kann. In Definition wie in \renewbibmacro ist das oftmals nicht gewünscht. Bei biblatex ist es im hier sicher nicht gewünscht, da in diesem Kontext nur \setunit und Kollegen Zeichensetzung vornehmen sollten. Siehe auch https://tex.stackexchange.com/q/7453/35864

Ferner tut \printtext[date]{} nichts Vernünftiges. Bei ansonsten korrekter Nutzung ist das \iffieldundef{year} vor \usebibmacro{date} eh nicht notwendig, da \usebibmacro{date} von sich aus, nichts tut, wenn kein Datum (also kein year) da ist.

Ich würde eher bei
\renewbibmacro*{url+urldate}{%
  \usebibmacro{url}%
  \ifentrytype{online}
    {\setunit*{\addspace}%
     \usebibmacro{date}}
    {}
  \setunit*{\addspace}%
  \usebibmacro{urldate}}
rauskommen.

Re: Änderung Citation Style

von Sam85 » Fr 31. Dez 2021, 23:26

Hi ,

ich habe nebenläufig mal eine Frage. Wenn ich im Literaturverzeichnis für die Onlinequelle eine Wenn Klausel einbinden möchte, wie gehe ich da vor? Bin leider nicht wirklich in der Materie und hatte nur eine Vorlage gefunden und würde diese jetzt soweit abändern. Ggf. kann mir jemand erklären was bei dem Code passiert. Was löst das "mkbibparens" aus und das "#1" an den diversen Stellen.

Freue mich auf eine Antwort. Danke schön.
literatur online
	if no author
		url, "Zugriff am" urldate
	else
		author (usera, year): title, <url> (date) ["Zugriff" urldate] 
\xpatchbibdriver{online}
  {\usebibmacro{organization+location+date}\newunit\newblock}
  {}
  {}{}

%Literaturverzeichnis: Online
\DeclareFieldFormat[online]{date}{\mkbibparens{#1}}
\DeclareFieldFormat{urldate}{[\langde{Zugriff}\langen{Access}\addspace{#1}]}
\DeclareFieldFormat[online]{url}{<\url{#1}>}
\renewbibmacro*{url+urldate}
	{
  		\usebibmacro{url}
  		\ifentrytype{online}
    		{
    			\setunit*{\addspace}
     			\iffieldundef{year}
       				{\printtext[date]{}}
       				{\usebibmacro{date}}
   			}
    	{}
  		\setunit*{\addspace}
  		\usebibmacro{urldate}
  	}
Und so ähnlich wird es dann wohl bei der Citation auch aussehen.
citation online
	if no author
		url, "Zugriff am" urldate.
	else		
		author, usera, year, page.

Nach oben