This forum is read-only - Please use our new Citavi Forum instead.
Dieses Forum dient nur zur Recherche - Bitte nutzen Sie das neue Citavi Forum für Ihre Fragen.

Vorname nur bei uneindeutigen Nachnamen einfügen Topic is solved

Erhalten Sie Hilfe bei der Anwendung juristischer Zitationsstile.

Re: Vorname nur bei uneindeutigen Nachnamen einfügen

Postby KoBri2 » 2017-11-20 13:58

Liebe Susanne,

vielen Dank für das Skript. Es funktioniert allerdings in einigen Fällen noch nicht:

Bei der Autor[nur Nachname]- Komponente bei Zeitschriftenaufsätzen werden die Initialen im Zitationsstil-Editor angezeigt, nicht aber in der Fußnote in einem Word-Dokument.

Bei der Bearbeiter [nur Nachname] - Komponente in Gesetzeskommentaren habe ich es auch eingefügt, hier funktioniert es aber nicht, wenn 2 Bearbeiter gemeinsam einen Beitrag verfasst haben. Dann fehlen bei dem entsprechenden Bearbeiter die Initialen.

Bei der Autor [nur Nachname]-Komponente von Monographien funktioniert es nicht, wenn mehrere Personen die Autoren sind. Bei 4 Personen erscheint die letztgenannte Person mit Initialien, obwohl diese gar nicht die mit "Uneindeutig" makierte Person ist. Bei Autoren/Beitragsverfassern soll nach meinen Zitationsvorgaben ohnehin nicht nach der 3. Person etwas geändert/abgekürzt werden. (Dies soll nur bei Hrsg. passieren, die ich aber ohnehin nicht mit Initialen versehen möchte).

Vielen Dank für Ihre Hilfe!
KoBri2
 

Re: Vorname nur bei uneindeutigen Nachnamen einfügen

Postby Susanne Sitzler » 2017-11-21 12:26

Lieber KoBri2,

vielen Dank für Ihre Frage.

Möglicherweise hatte ich zu viel gekürzt. Folgendes Skript gibt keine ders. mehr aus und generiert keine Fehlermeldungen. Bitte testen Sie, ob es auch für Ihre Zwecke wie gewünscht funktioniert.

Allerdings ist in dem Skript der Fall von 4 und mehr Autoren nicht vorgesehen, weil von der Autoren-Komponente nur die ersten drei Autoren ausgegeben werden sollen (wie auch im Thread und im Skript erwähnt).

Code: Select all
using System;
using System.Linq;
using System.Collections.Generic;
using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Metadata;


namespace SwissAcademic.Citavi.Citations
{
   public class ComponentPartFilter
      :
      IComponentPartFilter
   {
      //Version 1.2 Takes all combinations of number/sex into account
      //Version 1.1 Takes organizations into account
      public IEnumerable<ITextUnit> GetTextUnits(ComponentPart componentPart, Template template, Citation citation, out bool handled)
      {
         handled = false;

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

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

       // Autoren ggfs. Vornamen hinzufügen
         if (componentPart == null) return null;
         if (componentPart.Elements == null || componentPart.Elements.Count == 0) return null;

         IEnumerable<PersonFieldElement> personFieldElements = componentPart.Elements.OfType<PersonFieldElement>();
         if (personFieldElements == null || personFieldElements.Count() != 1) return null;

         PersonFieldElement personFieldElement = personFieldElements.ElementAt(0);

         if (personFieldElement == null) return null;

         List<Person> AuthorsList = citation.Reference.Authors.ToList();
         if(AuthorsList.Count==0)
            return null;
         if(AuthorsList[0].Notes.Equals("Uneindeutig"))
         {
            personFieldElement.FirstGroupPersonNameOrder=PersonNameOrder.FirstNameLastName;
            personFieldElement.FirstGroupFirstNameFormat=NameFormat.AbbreviatedCompact;
            personFieldElement.FirstGroupMiddleNameUsage=MiddleNameUsage.FirstOnly;
            personFieldElement.FirstGroupMiddleNameFormat=NameFormat.AbbreviatedCompact;
         }
               // more than two authors: use "FirstGroup", "SecondGroup" and "LastPerson"
               // note that the citation style truncates the list aftre the third author, so we can content ourselves with the first three
               // and use "LastPerson" for the third one
         if(AuthorsList.Count==2) // only two authors - no need for "LastPerson"
            personFieldElement.UseDifferentFormatForLastPerson=false;
         else // more than two authors
            personFieldElement.UseDifferentFormatForLastPerson=true;
         if(AuthorsList.Count>1&& AuthorsList[1].Notes.Equals("Uneindeutig"))
         {
            personFieldElement.SecondGroupPersonNameOrder=PersonNameOrder.FirstNameLastName;
            personFieldElement.SecondGroupFirstNameFormat=NameFormat.AbbreviatedCompact;
            personFieldElement.SecondGroupMiddleNameUsage=MiddleNameUsage.FirstOnly;
            personFieldElement.SecondGroupMiddleNameFormat=NameFormat.AbbreviatedCompact;
         }
         if(AuthorsList.Count>2 && AuthorsList[2].Notes.Equals("Uneindeutig")) // third Person last - we don't show more than three here
         {
            personFieldElement.LastPersonPersonNameOrder=PersonNameOrder.FirstNameLastName;
            personFieldElement.LastPersonFirstNameFormat=NameFormat.AbbreviatedCompact;
            personFieldElement.LastPersonMiddleNameUsage=MiddleNameUsage.FirstOnly;
            personFieldElement.LastPersonMiddleNameFormat=NameFormat.AbbreviatedCompact;
         }
         

         //check for 1st PersonFieldElement in ComponentPart
         var firstPersonFieldElement = componentPart.Elements.FirstOrDefault(item => item is PersonFieldElement) as PersonFieldElement;
         if (firstPersonFieldElement == null) return null;

         //determine Persons to compare
         List<Person> thesePersons = null;
         List<Person> previousPersons = null;

         switch (firstPersonFieldElement.PropertyId)
         {
            #region Authors

            case ReferencePropertyId.Authors:
               {
                  thesePersons = citation.Reference.Authors.ToList();
                  previousPersons = citation.PreviousCitation.Reference.Authors.ToList();
               }
               break;

            #endregion Authors

            #region Editors

            case ReferencePropertyId.Editors:
               {
                  thesePersons = citation.Reference.Editors.ToList();
                  previousPersons = citation.PreviousCitation.Reference.Editors.ToList();
               }
               break;

            #endregion Editors

            #region AuthorsEditorsOrganizations

            case ReferencePropertyId.AuthorsOrEditorsOrOrganizations:
               {
                  thesePersons = citation.Reference.AuthorsOrEditorsOrOrganizations.ToList();
                  previousPersons = citation.PreviousCitation.Reference.AuthorsOrEditorsOrOrganizations.ToList();
               }
               break;

            #endregion AuthorsEditorsOrganizations

            #region Collaborators

            case ReferencePropertyId.Collaborators:
               {
                  thesePersons = citation.Reference.Collaborators.ToList();
                  previousPersons = citation.PreviousCitation.Reference.Collaborators.ToList();
               }
               break;

            #endregion Collaborators

            #region OthersInvolved

            case ReferencePropertyId.OthersInvolved:
               {
                  thesePersons = citation.Reference.OthersInvolved.ToList();
                  previousPersons = citation.PreviousCitation.Reference.OthersInvolved.ToList();
               }
               break;

            #endregion OthersInvolved
         }

         if (thesePersons == null || thesePersons.Count == 0) return null;
         if (previousPersons == null || previousPersons.Count == 0) return null;

         var equality = CheckPersonEquality(thesePersons, previousPersons);
         if (equality == PersonEquality.None) return null;

         handled = false;
         return null;

      }

      #region CheckPersonEquality

      private static PersonEquality CheckPersonEquality(List<Person> personsA, List<Person> personsB)
      {
         var personListA = personsA;
         var personListB = personsB;

         if (personListA == null || personListA.Count == 0) return PersonEquality.None;
         if (personListB == null || personListB.Count == 0) return PersonEquality.None;
         if (personListA.Count != personListB.Count) return PersonEquality.None;

         //we DO have two lists of persons of same length
         //FIRST sort by id for comparison
         var personIdComparer = new PersonIdComparer();
         personListA.Sort(personIdComparer);
         personListB.Sort(personIdComparer);


         var allCounter = personListA.Count;
         var maleCounter = 0;
         var femaleCounter = 0;
         var neutralCounter = 0;

         //loop, compare GUID/id and determine/count sex
         for (int i = 0; i < personListA.Count; i++)
         {
            var idA = personListA[i].GetValue(PersonPropertyId.Id).ToString();
            var idB = personListB[i].GetValue(PersonPropertyId.Id).ToString();

            if (!idA.Equals(idB, StringComparison.Ordinal)) return PersonEquality.None;

            //identical!
            //determine sex (just need to look at one of them, because they are identical)
            if (personListA[i].Sex == Sex.Male) maleCounter++;
            if (personListA[i].Sex == Sex.Female) femaleCounter++;
            if (personListA[i].Sex == Sex.Neutral || personListA[i].Sex == Sex.Unknown) neutralCounter++;
         }

         //still here, so ALL persons are equal, now return equality based on sex
         if (allCounter == 1 && maleCounter == 1) return PersonEquality.M;
         else if (allCounter == 1 && femaleCounter == 1) return PersonEquality.F;
         else if (allCounter == 1 && neutralCounter == 1) return PersonEquality.N;

         else if (allCounter > 1 && maleCounter == allCounter) return PersonEquality.MM;
         else if (allCounter > 1 && femaleCounter == allCounter) return PersonEquality.FF;
         else if (allCounter > 1 && neutralCounter == allCounter) return PersonEquality.NN;

         else if (allCounter > 1 && maleCounter + femaleCounter == allCounter) return PersonEquality.FM;
         else if (allCounter > 1 && femaleCounter + neutralCounter == allCounter) return PersonEquality.FN;
         else if (allCounter > 1 && maleCounter + neutralCounter == allCounter) return PersonEquality.MN;

         else if (allCounter >= 3
            && maleCounter >= 1 && femaleCounter >= 1 && neutralCounter >= 1
            && maleCounter + femaleCounter + neutralCounter == allCounter) return PersonEquality.FMN;
         else return PersonEquality.None;

      }

      #endregion CheckPersonEquality

      #region Enum PersonEquality

      public enum PersonEquality
      {
         /// <summary>
         /// None: Different persons and/or different numbers of persons.
         /// </summary>
         /// <returns></returns>
         None,

         /// <summary>
         /// Identical person, a single female (Latin: eadem)
         /// </summary>
         F,
         /// <summary>
         /// Identical person, a single male (Latin: idem)
         /// </summary>
         M,
         /// <summary>
         /// Identical persons, a single (neutral) organization (Latin: idem)
         /// </summary>
         N,

         /// <summary>
         /// Identical persons, only females, 2 or more (Latin: eaedem)
         /// </summary>
         FF,
         /// <summary>
         /// Identical persons, only males, 2 or more (Latin: eidem)
         /// </summary>
         MM,
         /// <summary>
         /// Identical persons, only (neutral) organizations, 2 or more (Latin: eadem)
         /// </summary>
         NN,

         /// <summary>
         /// Identical persons, mixed group of females and males only
         /// </summary>
         FM,
         /// <summary>
         /// Identical persons, mixed group of females and neutrals only
         /// </summary>
         FN,
         /// <summary>
         /// Identical persons, mixed group of males and neutrals only
         /// </summary>
         MN,

         /// <summary>
         /// Identical persons, mixed group of females, males and neutrals
         /// </summary>
         FMN
      }

      #endregion PersonEquality

      #region PersonIdComparer

      //The following is a sort comparer that will bring all person collections into a well defined order
      //namely in the order of their internal GUID values.
      public class PersonIdComparer : IComparer<Person>
      {
         public int Compare(Person person1, Person person2)
         {
            int returnValue = 1;
            if (person1 != null && person2 != null)
            {
               returnValue = person1.GetValue(PersonPropertyId.Id).ToString().CompareTo(person2.GetValue(PersonPropertyId.Id).ToString());
            }
            return returnValue;
         }
      }

      #endregion PersonIdComparer
   }
}

Viele Grüße
Susanne

Wurde Ihre Frage vollständig beantwortet? Bitte klicken Sie auf das grüne Häkchen (= Antwort akzeptieren) oben rechts in meiner Antwort. Andere Forenbenutzer können sich dann leichter orientieren, wenn sie auf der Suche nach einer Lösung sind.
Susanne Sitzler
Citavi Customer Service
 

Re: Vorname nur bei uneindeutigen Nachnamen einfügen

Postby KoBri2 » 2017-11-22 20:38

Vielen Dank, liebe Susanne,

jetzt funktioniert es fast.

Allerdings bleibt es dabei, dass das Skript immer, wenn die markierten Autoren mit anderen Autoren zusammen schreiben (auch, wenn es nur 2 oder 3 Personen sind), die Initialien nicht mehr ausgibt (etwa bei der Komponete Bearbeiter in Kommentar oder Autor) oder einheitlich bei allen augibt und den letzten statt kursiv normal setzt (Bei Monographien).

Ich danke Ihnen aber in jeden Fall für Ihre große Hilfe!

Viele Grüße!
KoBri2
 

Re: Vorname nur bei uneindeutigen Nachnamen einfügen

Postby Susanne Sitzler » 2017-11-23 10:03

Lieber KoBri2,

vielen Dank für Ihre Frage.

Dies müsste ein Entwickler prüfen, allerdings haben wir da angesichts der Arbeiten an Citavi 6 momentan eigentlich keine freien Kapazitäten. Ich kann daher nichts versprechen.

Wenn Sie Ihren Stil und eine Word-Datei (max. 3 Seiten), in die Sie mit dem Word Add-In die problematischen Beispiele eingefügt haben, hier in das Forum hochladen, können wir bzw. ggf. auch kundige Mitforisten der Sache aber besser auf den Grund gehen.

Viele Grüße
Susanne

Wurde Ihre Frage vollständig beantwortet? Bitte klicken Sie auf das grüne Häkchen (= Antwort akzeptieren) oben rechts in meiner Antwort. Andere Forenbenutzer können sich dann leichter orientieren, wenn sie auf der Suche nach einer Lösung sind.
Susanne Sitzler
Citavi Customer Service
 

Previous

Return to Juristische Zitationsstile anwenden