Mehrere Beiträge von einem Autor

Jakob H. hinzugefügt 7 Monaten her
beantwortet

Hallo,

ich versuche gerade eine Komponente zu entwerfen, die nur ausgegeben wird, wenn von einem Autor mehrere Werke zitiert werden.

Ziel soll sein:

Autor kommt nur einmal vor. Bei der Erstnennung Müller, Der Warenhandel im Lichte der Zeit, [weiter Angabe zum Werk]. Bei der Zweitnennung: Müller, supra note 5, p. 18


Mehrere Werke vom Autor (bei der Erstnennung) Müller, Der Warenhandel im Lichte der Zeit [weitere Angaben zum Werk], (hereinafter cited as "Müller, Warenhandel")

Wird der Titel ein zweites Mal genanntn, soll erscheinen: Müller, Warenhandel, supra note 5, p. 18


Als Der Generelle plan ist, dass ich eine neue Komponente mit Kurzbeleg erstelle. Dort soll es code geben, der standardmäßig handled = true setzt, sodass die ganze Komponente einfach unterdrückt wird; werden mehrere Werke des Autors identifiziert, soll handled = false sein, damit die Komponente ausgegeben wird.


Mir fehlt derzeit aber noch der code für "Wenn zwei Werke vom Autor", dann handled = false.

Gibt es dafür schon einen fertigen code?


Achso, ich benutze gerade noch citavi 5, werde aber in den nächsten Tagen auf citavi 6 upgraden.

Vielen Dank

Jakob

Antworten (12)

Foto
2

Guten Tag Jakob

Sie müssten eine neue Vorlage nutzen. Unter Citavi 5 nutzen Sie dafür das Skript, das Sie hier finden. Unter Citavi 6 nutzen Sie dafür die eingebaute Bedingung «Andere Titel desselben Autors, Herausgebers oder Organisation werden ebenfalls zitiert».

Freundliche Grüsse

Peter

Foto
1

Lieber Peter,

vielen Dank für den hilfreichen Hinweis.


Gibt es auch eine Möglichkeit, Citavi 6 so zu programmieren, dass der Zusatz "(hereinafter cited as "Müller, Warenhandel")" nur eingesetzt wird, wenn der Titel dann später auch tatsächlich nochmal zitiert wird? Wenn ich die Vorlage mit der Bedingung versehe, dass andere Titel des Autors ebenfalls zitiert werden, wird die Vorlage auch dann verwendet, wenn der Titel selbst gar nicht nochmals vorkommt, der Zusatz also gar nicht gebraucht wird. Bei allen Werken, die nur einmal zitiert werden, soll der Zusatz nicht auftauchen.

Danke und viele Grüße,

Max Mayer

Foto
1

Lieber Max

Wenn Sie Ihre Vorlagen so gestalten, wie hier gezeigt, sollten Sie das gewünschte Ergebnis erhalten:

/c2a28d6c8cb80aff1fab5cb91c2bf034

Freundliche Grüsse

Peter

Foto
1

Lieber Peter,


vielen Dank für die schnelle Antwort. So habe ich das auch gemacht, aber ich glaube, dass ein Missverständnis vorliegt.


So wie vorgeschlagen, bekommt jeder Titel, wenn er das erste mal auftaucht und in noch andere Titel desselben Autors auch zitiert werden, den Zusatz (zit. als: Autor...), und zwar unabhängig davon, wie häufig dieser Titel im Dokument zitiert wird.


Ich möchte aber gerne erreichen, dass der Zusatz nur dann auftaucht, wenn der Titel, der der Zusatz bekommt, dann später tatsächlich auch noch ein weiteres mal zitiert wird. Die Vorlage bräuchte dafür (nehme ich an) noch eine zweite Bedingung, soetwas wie: "Titel wird in dieser Publikation mehrmals genannt."


Lässt sich eine solche Bedingung einrichten? Oder habe ich vielleicht etwas übersehen?

Herzliche Grüße,

Max

Foto
1

Was ist denn die vollständige Liste von Bedingungen, welche erfüllt sein müssen, damit beim ersten Mal der Kurztitel angegeben werden soll? Handelt es sich um Fußnoten oder Nachweise im Text? Wenn ich raten würde, müssten etwa die folgenden Bedingungen alle erfüllt sein, aber besser vorsichtig überprüfen:

  • Es gibt mehr als einen Titel vom selben Autor
  • Der aktuelle Titel wird mehr als einmal zitiert
  • Der aktuelle Titel hat neben dem Erstzitat mindestens ein Folgezitat außerhalb des aktuellen Mehrfachnachweises (Spoiler: das testet unten meine falsch benannte "IsUniqueEntry"-Methode)
  • Neben dem Erstzitat des Titels gibt es mindestens ein Folgezitat des aktuellen Titels, welches nicht in der Form "Ebd." erfolgt (falls der Zitationsstil "Ebd." nutzt, das wirft die Folgefrage auf, wann das der Fall ist)
  • Der aktuelle Titel hat einen definierten Kurzbeleg
  • Der definierte Kurzbeleg ist manuell, nicht automatisch definiert

Ich würde dafür dann keine neue Vorlage erstellen, sondern in die Vorlage für den Vollnachweis eine Komponente aufnehmen, deren Output unterdrückt wird, wenn nicht alle Bedingungen erfüllt sind. Für Fußnoten würde ich dann folgenden Komponentenfilter einsetzen (das beantwortet dann übrigens auch die Ausgangsfrage, welche ich übersehen hatte, obwohl das doch mein Spezialgebiet ist, aber anders als Peters Ansatz), aber die Ebd.-Logik müsste ggf. angepasst werden.

using System.Linq;
using System.Collections.Generic;
using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Metadata;
using SwissAcademic.Collections;
using SwissAcademic.Drawing;

using System.Globalization;
using System.Text.RegularExpressions;

namespace SwissAcademic.Citavi.Citations
{
	public class ComponentPartFilter
		:
		IComponentPartFilter
	{
		public IEnumerable<ITextUnit> GetTextUnits(ComponentPart componentPart, Template template, Citation citation, out bool handled)
		{
			handled = true;
			
			// User Options
			
			bool CitationStyleUsesIbid = true;

			// Static Variables and Checks
			
			if (citation == null) return null;
			
			Reference reference = citation.Reference;
			if (reference == null) return null;		
			
			PlaceholderCitation thisPlaceholderCitation = citation as PlaceholderCitation;
			if (thisPlaceholderCitation == null) return null;
			
			FootnoteCitation thisFootnoteCitation = citation as FootnoteCitation;
			if (thisFootnoteCitation == null) return null;
		
			CitationManager citationManager = citation.CitationManager;	
			if (citationManager == null) return null;	
			
			IList<Person> thisAuthors = reference.AuthorsOrEditorsOrOrganizations as IList<Person>;
									
			// Dynamic Variables
			
			TextUnitCollection output = new TextUnitCollection();
			
			bool NeedsShortformIntroduction = false;		
			bool AuthorHasMultipleTitlesBool = false;
			bool IsCitedOnceOtherThanWithIbid = false;
			
			// The Magic
			
			if (thisPlaceholderCitation.IsUniquePlaceholderCitation) return null;
			
			if (thisPlaceholderCitation.IsUniqueEntry()) return null;			
			
			if  (!(reference.CitationKeyUpdateType != 0 && !string.IsNullOrEmpty(reference.CitationKey))) return null;
			
			if (!AuthorHasMultipleTitlesBool) return null;			
	
			foreach (BibliographyCitation otherBibliographyCitation in citationManager.BibliographyCitations)
			{
				if (otherBibliographyCitation == null) continue;
				if (otherBibliographyCitation.Reference == null) continue;
				if (otherBibliographyCitation.Reference == reference) continue;
				
				IList<Person> otherAuthors = otherBibliographyCitation.Reference.AuthorsOrEditorsOrOrganizations as IList<Person>;
				
				if (otherAuthors == null || !otherAuthors.Any()) continue;
				
				if (CollectionUtility.ContentEquals(otherAuthors, thisAuthors, true))
				{
					AuthorHasMultipleTitlesBool = true;
				}
			}			
			
			if (!CitationStyleUsesIbid)
			{
				IsCitedOnceOtherThanWithIbid = true;
			}
			else	
			{								
				FootnoteCitation precedingFootnoteCitation = null;
				foreach (FootnoteCitation otherFootnoteCitation in citationManager.FootnoteCitations)
				{	
					if (otherFootnoteCitation == thisFootnoteCitation) continue;
					if (otherFootnoteCitation.Reference == null) continue;
					if (otherFootnoteCitation.Reference != reference) continue;	
					
					if (otherFootnoteCitation.PreviousFootnoteCitation != null)
					{
						precedingFootnoteCitation = otherFootnoteCitation.PreviousFootnoteCitation;
					}
					
					if (
							reference.CitationKeyUpdateType != 0 &&
							// The otherFootnoteCitation must not be ibid, so it needs to meet one of the following alternatively sufficient conditions
							(
								// (1) It is from a different reference than the citation immediately preceding it
								otherFootnoteCitation.Reference != precedingFootnoteCitation.Reference
								// (2) It is one more than one footnote away from its predecessor
								|| otherFootnoteCitation.FootnoteIndex >= precedingFootnoteCitation.FootnoteIndex +2
								// It is on a different page than its predecessor
								|| otherFootnoteCitation.PageInPublication > precedingFootnoteCitation.PageInPublication
							)				
						)
					{
						IsCitedOnceOtherThanWithIbid = true;
						break;
					}
				}
			}
			
			if (
					AuthorHasMultipleTitlesBool
					&& IsCitedOnceOtherThanWithIbid
				)
			{
				NeedsShortformIntroduction = true;
			}
			
			if (!NeedsShortformIntroduction)
			{
				return null;

			}
			
			output = componentPart.GetTextUnitsUnfiltered(citation, template);
			
			return output;		
		}
	}
	public static class PlaceholderCitationExtension
	{
		public static bool IsUniqueEntry(this PlaceholderCitation placeholderCitation)
		{
			bool IsUniqueEntry = false;
			
			CitationManager citationManager = placeholderCitation.CitationManager;
			if (citationManager == null) return false;
			
			List<PlaceholderCitation> placeholderCitations = citationManager.PlaceholderCitations.ToList();
			if (placeholderCitations == null) return false;
			
			PlaceholderEntry entry = placeholderCitation.Entry;
			if (entry == null) return false;
			
			Reference reference = placeholderCitation.Reference;
			if (reference == null) return false;
			
			if (placeholderCitations.Where(p => p.Reference == reference && p.Entry.Placeholder != entry.Placeholder).ToList().Count == 0) IsUniqueEntry = true;
			
			return IsUniqueEntry;
		}
	}
}
Für den Liebhaber: IsCitedOnceOtherThanWithIbid sollte wahrscheinlich auch in eine Erweiterunsgsmethode umgewandelt werden, so wie IsUniqueEntry.

Foto
1

Ach was soll der Geiz, wir machen einfach alles mit Erweiterungsmethoden, und kommentieren unseren Code sogar halbwegs anständig (aber nur halbwegs, ich bleibe bei meiner Überschrift "The Magic").


using System.Linq;
using System.Collections.Generic;
using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Metadata;
using SwissAcademic.Collections;
using SwissAcademic.Drawing;

using System.Globalization;
using System.Text.RegularExpressions;

namespace SwissAcademic.Citavi.Citations
{
	public class ComponentPartFilter
		:
		IComponentPartFilter
	{
		public IEnumerable<ITextUnit> GetTextUnits(ComponentPart componentPart, Template template, Citation citation, out bool handled)
		{
			handled = true;

			// User Options

			bool CitationStyleUsesIbid = true;

			// Static Variables and Sanity Checks

			if (citation == null) return null;

			Reference reference = citation.Reference;
			if (reference == null) return null;

			PlaceholderCitation thisPlaceholderCitation = citation as PlaceholderCitation;
			if (thisPlaceholderCitation == null) return null;

			FootnoteCitation thisFootnoteCitation = citation as FootnoteCitation;
			if (thisFootnoteCitation == null) return null;

			CitationManager citationManager = citation.CitationManager;
			if (citationManager == null) return null;

			IList<Person> thisAuthors = reference.AuthorsOrEditorsOrOrganizations as IList<Person>;

			// Dynamic Variables

			TextUnitCollection output = new TextUnitCollection();

			bool NeedsShortformIntroduction = false;
			bool AuthorHasMultipleTitlesBool = false;
			bool IsCitedOnceOtherThanWithIbid = false;

			// The Magic
			
			// The current reference is cited more than once

			if (thisPlaceholderCitation.IsUniquePlaceholderCitation) return null;
			
			// The current reference is cited in a different "Placeholder", i.e. in a different multiple citation

			if (thisPlaceholderCitation.IsUniquePlaceholder()) return null;
			
			// The current refereence has a defined short title and the short title is manually set

			if  (!(reference.CitationKeyUpdateType != 0 && !string.IsNullOrEmpty(reference.CitationKey))) return null;
			
			// There is more than one reference by the same author in the publication

			AuthorHasMultipleTitlesBool = thisPlaceholderCitation.AuthorHasMultipleTitlesBool();			
			
			// If this is the only reference from this author, and the reference does not use a shortform, we can stop here

			if (!AuthorHasMultipleTitlesBool) return null;
			
			// The citation style uses ibid and the current citation is cited at least once in a subsequent citation without ibid

			if (!CitationStyleUsesIbid)
			{
				IsCitedOnceOtherThanWithIbid = true;
			}
			else
			{
				IsCitedOnceOtherThanWithIbid = thisFootnoteCitation.IsCitedOnceOtherThanWithIbidInFootnotes();
			}
			
			// Now we see whether to print the shortform introduction

			if (
					AuthorHasMultipleTitlesBool
					&& IsCitedOnceOtherThanWithIbid
				)
			{
				NeedsShortformIntroduction = true;
			}

			if (!NeedsShortformIntroduction)
			{
				return null;
			}

			output = componentPart.GetTextUnitsUnfiltered(citation, template);

			return output;
		}
	}
	public static class PlaceholderCitationExtension
	{
		public static bool AuthorHasMultipleTitlesBool(this PlaceholderCitation placeholderCitation)
		{
			if (placeholderCitation == null) return false;
			
			CitationManager citationManager = placeholderCitation.CitationManager;
			if (citationManager == null) return false;
			
			List<BibliographyCitation> bibliographyCitations = citationManager.BibliographyCitations.ToList();
			if (bibliographyCitations == null) return false;
			
			Reference reference = placeholderCitation.Reference;
			if (reference == null) return false;
			
			if (reference.AuthorsOrEditorsOrOrganizations == null) return false;
			
			bool AuthorHasMultipleTitlesBool = false;
			
			if (bibliographyCitations.Where(b => 
						b.Reference != reference
						&& b.Reference.AuthorsOrEditorsOrOrganizations != null
						&& b.Reference.AuthorsOrEditorsOrOrganizations.SequenceEqual(reference.AuthorsOrEditorsOrOrganizations)
					).ToList().Count > 0)
				AuthorHasMultipleTitlesBool = true;
			
			return AuthorHasMultipleTitlesBool;
		}
		public static bool IsCitedOnceOtherThanWithIbidInFootnotes(this FootnoteCitation footnoteCitation)
		{
			if (footnoteCitation == null) return false;
			
			CitationManager citationManager = footnoteCitation.CitationManager;
			if (citationManager == null) return false;
			
			List<FootnoteCitation> footnoteCitations = citationManager.FootnoteCitations.ToList();
			if (footnoteCitations == null) return false;
			
			Reference reference = footnoteCitation.Reference;
			if (reference == null) return false;
			
			
			bool IsCitedOnceOtherThanWithIbidInFootnotes = false;
			
			if (footnoteCitations.Where(f => 
						f.Reference == reference 
						&& f.PreviousFootnoteCitation != null
						&& (f.Reference != f.PreviousFootnoteCitation.Reference
							|| f.FootnoteIndex >= f.PreviousFootnoteCitation.FootnoteIndex + 2
							|| f.PageInPublication > f.PreviousFootnoteCitation.PageInPublication
					)).ToList().Count > 0)
				IsCitedOnceOtherThanWithIbidInFootnotes = true;
			
			return IsCitedOnceOtherThanWithIbidInFootnotes;
		}		
		public static bool IsUniquePlaceholder(this PlaceholderCitation placeholderCitation)
		{
			if (placeholderCitation == null) return false;

			CitationManager citationManager = placeholderCitation.CitationManager;
			if (citationManager == null) return false;

			List<PlaceholderCitation> placeholderCitations = citationManager.PlaceholderCitations.ToList();
			if (placeholderCitations == null) return false;

			PlaceholderEntry entry = placeholderCitation.Entry;
			if (entry == null) return false;

			Reference reference = placeholderCitation.Reference;
			if (reference == null) return false;
			
			bool IsUniquePlaceholder = false;

			if (placeholderCitations.Where(p => 
						p.Reference == reference 
						&& p.Entry.Placeholder != entry.Placeholder
					).ToList().Count == 0)
				IsUniquePlaceholder = true;

			return IsUniquePlaceholder;
		}
	}
}

Foto
1

Wow.

Das sieht großartig aus, vielen Dank! Wie lernt man eigentlich in Citavi zu programmieren?

Die Nachweise kommen in der Tat ausschließlich in Fußnoten, die letzten beiden Bedingungen in Deiner Liste (Der aktuelle Titel hat einen definierten Kurzbeleg und Der definierte Kurzbeleg ist manuell, nicht automatisch definiert) sind für mich nicht nötig, der ibid-Filter ist sehr scharfsinnig und natürlich konsequent, aber auch nicht unbedingt nötig.


Leider finktioniert es nicht. Ich habs ausprobiert, möglicherweise habe ich etwas falsch gemacht. Ich habe


  1. eine neue Komponente erstellt, die (hereafter Autor, Herausgeber oder Institution [Nachname], Kurzbeleg [italic]) auswirft;
  2. bei "Ausgabe der Komponente per Programmcode filtern" einen Haken gesetzt;
  3. Deinen Code im Code-Editor anstelle des standardcodes eingesetzt;
  4. die Komponente in die Standardvorlage für Fußnoten eingesetzt.
  5. Den Zitierstil gespeichert;
  6. In mein Dokument am Anfang eine Monographie zitiert, die sonst nicht mehr vorkommt und deren Autor noch andere Titel zitiert werden.

Der Nachweis hat trotzdem den Zusatz (hereafter...). Möglicherweise habe ich was übersehen, aber mir fehlt glaube ich die Kompetenz, das herauszufinden. Wenn Ihr den Fehler schnell ausmachen könnt, bin ich Euch dankbar, aber ich merke auch, dass das ganze sehr aufwendig wird. Danke schonmal für Eure ganze Hilfe, wenn es Euch langsam zu intensiv wird, kann ich das auch verstehen.

Viele Grüße!

Max

Foto
Foto
2

Naja, bisher hielt sich mein Beitrag im Rahmen. Den Code habe ich sowieso so ähnlich für mich. Ich gucke mir das morgen früh Mal an, woran es scheitern könnte.

On Fri, Aug 10, 2018, 23:05 Citavi Service, <service@citavi.com> wrote:

Foto
2

Ich hab den Code jetzt noch mal vereinfacht, auf Grundlage der gewünschten Bedingungen und ein paar Überbleibsel aus meinem komplexeren Code noch entfernt.


Damit erhalte ich die im Screenshot ersichtlichen Ergebnisse.


Was das Lernen angeht: ich habe mir einfach die Vorlagen- und Komponentenbedingungen angeguckt, die es bereits gibt, und daran rumgebessert. Das wichtigste ist es, sich die Bedingungslogik klar vor Augen zu führen. Alles danach ist nur stundenlanges rumprobieren, bis der Editor keinen Fehler mehr auswirft.


using System.Linq;
using System.Collections.Generic;
using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Metadata;
using SwissAcademic.Collections;
using SwissAcademic.Drawing;

using System.Globalization;
using System.Text.RegularExpressions;

namespace SwissAcademic.Citavi.Citations
{
	public class ComponentPartFilter
		:
		IComponentPartFilter
	{
		public IEnumerable<ITextUnit> GetTextUnits(ComponentPart componentPart, Template template, Citation citation, out bool handled)
		{
			handled = false;

			// Static Variables and Sanity Checks

			if (citation == null) return null;

			Reference reference = citation.Reference;
			if (reference == null) return null;

			PlaceholderCitation thisPlaceholderCitation = citation as PlaceholderCitation;
			if (thisPlaceholderCitation == null) return null;

			FootnoteCitation thisFootnoteCitation = citation as FootnoteCitation;
			if (thisFootnoteCitation == null) return null;

			CitationManager citationManager = citation.CitationManager;
			if (citationManager == null) return null;
			// The Magic
			
			// The current reference is cited more than once

			if (thisPlaceholderCitation.IsUniquePlaceholderCitation) handled = true;
			
			// The current reference has a short title

			if  (string.IsNullOrEmpty(reference.CitationKey)) handled = true;
			
			// There is more than one reference by the same author in the publication

			if (!citation.AuthorHasMultipleTitles()) handled = true;		

			return null;
		}
	}
	public static class CitationExtensions
    {
        public static bool AuthorHasMultipleTitles(this Citation citation)
        {
            if (citation == null) return false;

            CitationManager citationManager = citation.CitationManager;
            if (citationManager == null) return false;

            List<BibliographyCitation> bibliographyCitations = citationManager.BibliographyCitations.ToList();
            if (bibliographyCitations == null) return false;

            Reference reference = citation.Reference;
            if (reference == null) return false;

            if (reference.AuthorsOrEditorsOrOrganizations == null) return false;

            bool AuthorHasMultipleTitlesBool = false;

            if (bibliographyCitations.Where(b =>
                        b.Reference != reference
                        && b.Reference.AuthorsOrEditorsOrOrganizations != null
                        && b.Reference.AuthorsOrEditorsOrOrganizations.SequenceEqual(reference.AuthorsOrEditorsOrOrganizations)
                    ).ToList().Count > 0)
                AuthorHasMultipleTitlesBool = true;

            return AuthorHasMultipleTitlesBool;
        }
	}
}

Foto
1

Vielen Dank!

Klappt bei mir leider immer noch nicht. Der Titel wird auch dann mit dem Zusatz ausgeworfen, wenn er sonst im Dokument nicht mehr vorkommt (s. Screenshot). Keine Ahnung, woran das liegt. Die bedingte Komponente steht in der Standardvorlage für Monographien in Fußnoten und der Titel ist als Monographie angelegt. Hast Du eine Ahnung, woran das liegen könnte?

Foto
1

So hundertprozentig erklären kann ich es mir nicht. Der dafür relevante Test ist IsUniquePlaceholderCitation und der ist nicht auf meinem Mist gewachsen, der ist Citavi-intern. Der Screenshot sieht aber so aus, als ob das Citavi 5 wäre, korrekt? Vielleicht funktionierte das da nicht immer? Ich kann mich nicht mehr dran erinnern, seit wann ich das mit diesem IsUniquePlaceholderCitation mache. Es ist ein bißchen spekulativ meinerseits, zugegebenermaßen, es daran festzumachen, aber ich kann das Problem auch nicht reproduzieren. Macht es denn einen Unterschied, wenn die entsprechende Zeile

if (thisFootnoteCitation.IsUniqueFootnote) handled = true;
lautet?

PS. In Zeile 3 von Fn. 1 sollte es glaube ich Custom statt Costom heißen.

PPS. Generell fällt mir auf, aber da soll jeder nach seiner Facon seelig werden, dass im Screenshot immer Kurztitel eingeführt werden, selbst wenn im Folgezitat der volle Titel verwendet wird. OSCOLA selber sagt ja gar nichts zur Einführung des Kurztitels, deswegen können wir das Problem auch nicht auf Citavi abwälzen, aber bswp. McGill Guide verlangt die Einführung nur, wenn die Kurzform vom vollen Titel verschieden ist.

Foto
1

Ich hab nach einigen Wochen den code nochmal in einem neuen Dokument verwendet und hier funktioniert es! Keine Ahnung, was hier anders ist. Vielen Dank jedenfalls nochmal!