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.

Parallelfundstellen

Erhalten Sie Hilfe bei der Anwendung juristischer Zitationsstile.

Parallelfundstellen

Postby jay-squared » 2016-05-29 15:01

Hallo zusammen,

auf besonderen Wunsch eines einzelnen Herrens wollte ich an dieser Stelle noch einmal mein Vorgehen bzgl. Parallelfundstellen für juristische Entscheidungen erläutern. Ich nutze dafür nicht das Feld "Parallelfundstellen", sondern erfasse jede Parallelfundstelle als einzelnen Titel.

Anders als der Fragesteller hier geht es mir nicht darum, Pinpoints in allen Parallelfundstellen zu drucken. Das zu machen geht mit der dort beschriebenen Lösung, welche ebenfalls darauf beruht, dass alle Parallelfundstellen als eigene Titel erfasst werden.

Mir geht es nur darum, dass bei der (ggf. Erst-) Nennung eines Titels (Urteils) alle Parallelfundstellen mit angegeben werden können.

Der Trick besteht darin, eine Komponente zu haben, deren Inhalt nicht allein aus dem Titel des aktuellen Nachweises besteht, sondern welche das gesamte Projekt durchguckt, ob irgendein Titel Parallelfundstelle des Titels aktuellen Nachweises ist.

Hier greift eine Beschränkung des WordAddIns. Dieses kann nicht alle Titel des Projekts durchgehen, sondern nur solche, welche im Word-Dokument stehen. Dafür gibt es drei Auswege. Erstens, man nutzt nicht das WordAddIn, sondern die Platzhalter. Zweitens, man fügt die gewünschten Parallelfundstellen als Blindzitate ein, etwa ganz am Schluss, sodass man diese nach Umwandlung in ein Word-Dokument löschen kann, oder drittens, man hat eine Vorlage, welche eine Bedingung enthält "Nachweis ist Parallelfundstelle zu vorherigen Nachweis", und wenn diese wahr ist, wird ein Text gedruckt, für den eine Ersetzung durch nichts definiert ist. Dann muss man nur noch beim ersten Mal, wenn man ein Urteil als Nachweis einfügt, die Parallelfundstellen mit einfügen; diese erscheinen dann nicht, aber die Titeldaten stehen dem WordAddIn zur Verfügung. Die Vorlagenbedingung könnte etwa so aussehen:

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

namespace SwissAcademic.Citavi.Citations
{
   public class CustomTemplateCondition
      :
      ITemplateConditionMacro
   {
      public bool IsTemplateForReference(ConditionalTemplate template, Citation citation)
      {
         if (citation == null) return false;
         if (citation.Reference == null) return false;
                  
            FootnoteCitation footnoteCitation = citation as FootnoteCitation;
            if (footnoteCitation == null) return false;
         
            FootnoteCitation previousFootnoteCitation  = footnoteCitation.PreviousFootnoteCitation;
            if (previousFootnoteCitation == null) return false;
     
           if (footnoteCitation.FootnoteIndex != previousFootnoteCitation.FootnoteIndex) return false;         
         
            if (!citation.Reference.Organizations.SequenceEqual(previousFootnoteCitation.Reference.Organizations)) return false;
         
            if (footnoteCitation.Reference.Date != previousFootnoteCitation.Reference.Date) return false;
         
         if (footnoteCitation.Reference.SpecificField2 != null  && previousFootnoteCitation.Reference.SpecificField2 != null && footnoteCitation.Reference.SpecificField2 != previousFootnoteCitation.Reference.SpecificField2) return false;
         
         if (footnoteCitation.Reference.Title != previousFootnoteCitation.Reference.Title) return false;
         
         return true;
         
      }
   }
}


Als Text wird dann "#Parallel" gedruckt, und dafür habe ich eine Ersetzung auf nix definiert.

Nun zur Angabe der Parallelfundstellen in der Vorlage. Dafür habe ich eine prgrammierte Komponten welche die Angaben zu Zeitschrift, Jahr, Jahrgang, und Seite dieses Parallelfundstellentitels zusätzlich zu denen des Titels des aktuellen Nachweises gedruckt werden.

Ich wollte außerdem, daß alle Parallelfundstellen immer automatisch logisch sortiert werden. Ich habe das gemacht, in dem im Notizfeld der Zeitschrift Schlagworte stehen, und zwar "official" (=amtliche Sammlung), "semi" (=halb-amtliche Sammlung), "nominate" (=Sammlungen aus dem angelsächsischen Raum, welche nach dem Hrsg. benannt sind), "national", "regional", und "local" (nicht so wichtig in Deutschland, aber ggf. in anderen Ländern), "topical" (Fachzeitschriften) und "electronic" (=Datenbanken). Wer sich gleich die Sortierlogik anschaut, wird feststellen, dass es auch leicht geht, diese so anzupassen, dass beliebige Zeitschriften bevorzugt werden, wenn etwa der Z-Verlag drauf besteht, dass Urteile immer zuerst mit Zeitscrhift XZ nachgewiesen werden o.Ä.

Die Komponente sieht so aus:

Code: Select all
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text.RegularExpressions;

using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Metadata;
using SwissAcademic.Collections;
using SwissAcademic.Drawing;

namespace SwissAcademic.Citavi.Citations
{
   public class ComponentPartFilter
      :
      IComponentPartFilter
   {
      public IEnumerable<ITextUnit> GetTextUnits(ComponentPart componentPart, Template template, Citation citation, out bool handled)
      {
         handled = true;
         
         bool NoPeriods = true;   // Set to false if you don't want the component to remove periods after abbreviations.
         bool GermanStyle = true;   // Set to true if you want the citation to follow German style.
         
         if (citation == null) return null;
            if (citation.Reference == null) return null;
         
         var output = new TextUnitCollection();
         
         PlaceholderCitation thisPlaceholderCitation = citation as PlaceholderCitation;
         BibliographyCitation thisBibliographyCitation = citation as BibliographyCitation;
         
         string spaceString = " ";
         string commaString = ",";
         LiteralTextUnit spaceLiteral = new LiteralTextUnit(spaceString);
         LiteralTextUnit commaLiteral = new LiteralTextUnit(commaString);
         
         string parallelPeriodicalsSeparatorString = ";"; // the string between parallel reporters, other options are e.g. " = "
         string parallelPeriodicalsInitialSeparatorString = ",";
         LiteralTextUnit parallelPeriodicalsSeparatorLiteral =  new LiteralTextUnit(parallelPeriodicalsSeparatorString);
         LiteralTextUnit parallelPeriodicalsInitialSeparatorLiteral =  new LiteralTextUnit(parallelPeriodicalsInitialSeparatorString);
      
         LiteralTextUnit shortformIntroPrefixLiteral = new LiteralTextUnit("[");
         LiteralTextUnit shortformIntroSuffixLiteral = new LiteralTextUnit("]");

         string primaryReporterIntroString = "cited to";
         LiteralTextUnit primaryReporterIntroLiteral = new LiteralTextUnit(primaryReporterIntroString);

         string quotationPageRangeMarginPrefixString = "["; // the prefix before margin numbers
         string quotationPageRangeMarginSuffixString = "]"; //  the suffix after margin numbers
         LiteralTextUnit quotationPageRangeMarginPrefixLiteral = new LiteralTextUnit(quotationPageRangeMarginPrefixString);
         LiteralTextUnit quotationPageRangeMarginSuffixLiteral = new LiteralTextUnit(quotationPageRangeMarginSuffixString);
      
         LiteralTextUnit shortTitleLiteral;

                  
         CitationManager citationManager = citation.CitationManager;
         Project project = citation.Reference.Project;
               
         // We look for all parallel publications of the same decision.
                                             
         List<Reference> parallelReferencesList = new List<Reference>();
         
         bool hasParallelReporter = false;
         bool hasNeutralReporter = false;
                  
         foreach (Reference reference in project.References)
         {   
            if (reference.ReferenceType != ReferenceType.CourtDecision) continue;
            if (reference.Periodical == null) continue;
            if (!citation.Reference.Organizations.SequenceEqual(reference.Organizations)) continue;         
              if (citation.Reference.Date != null && reference.Date != null && citation.Reference.Date != reference.Date) continue;
            if (citation.Reference.SpecificField2 != null && reference.SpecificField2 != null && citation.Reference.SpecificField2 == reference.SpecificField2) parallelReferencesList.Add(reference);
            if (reference.Periodical.Notes.ToStringSafe().Contains("neutral"))hasNeutralReporter = true;
            if (reference != citation.Reference)hasParallelReporter = true;            
         }
         
         // Now we sort them by the order defined below, which mostly relies on the Note field for each periodical to sort "neutral", (e.g. "SCC")
         // "official" (e.g. "S.C.R."), "semi"-official (e.g. "O.R." or ICLR reports), "national" (e.g. "D.L.R."), "regional" (e.g. "W.W.R."),
         // "local" (e.g. "Sask. R."), "topical" (e.g. "B.L.R."), and purely "electronical" (e.g. "O.J.") reporters in that order. The type of reporter
         // is specified in the periodical.Notes field which the PeriodicalComparer looks at.
                  
         parallelReferencesList.Sort(new PeriodicalComparer());         
         
         // Now we construct the actual citation for each reporter.
         
         // The date year should - if at all - only be printed for the first reference,
         // thus we use j to index the references in the parallelReferencesList.
         
         int j =0;    
         
         foreach (Reference reference in parallelReferencesList)
         {
            
            if (j > 0)
            {
               output.Add(parallelPeriodicalsSeparatorLiteral);
            }
            else
            {
               output.Add(parallelPeriodicalsInitialSeparatorLiteral);
            }
            
            bool hasVolume = !string.IsNullOrEmpty(reference.Volume);
            bool hasYear = !string.IsNullOrEmpty(reference.Year);
            
            var periodical = reference.Periodical;
            string periodicalString = string.Empty;
            
            string pageRangeString = reference.PageRange.StartPage.ToStringSafe();
            LiteralTextUnit pageRangeLiteral = new LiteralTextUnit(pageRangeString);
         
            bool isNeutralCitation = reference.Periodical.Notes.ToStringSafe().Contains("neutral");
            
            bool onlyStyleOfCause = false;
            if (thisPlaceholderCitation != null && thisPlaceholderCitation.FormatOption1) onlyStyleOfCause = true;
            
            LiteralTextUnit yearLiteral = new LiteralTextUnit(reference.Year);
            LiteralTextUnit volumeLiteral = new LiteralTextUnit(reference.Volume);
            LiteralTextUnit numberLiteral = new LiteralTextUnit(reference.Number);            
            
            if (!string.IsNullOrEmpty(periodical.StandardAbbreviation))
            {
               periodicalString += periodical.StandardAbbreviation;
            }
            else if (!string.IsNullOrEmpty(periodical.FullName))
            {
               periodicalString += periodical.FullName;
            }
            
            LiteralTextUnit periodicalLiteral = new LiteralTextUnit(periodicalString);            
            
            if (GermanStyle)
            {
               output.Add(spaceLiteral);
               output.Add(periodicalLiteral);
               
               // Here we construct the year, volume and number element of the citation.
                     
               if (hasVolume && hasYear)
               {
                  if (!onlyStyleOfCause || j > 0)
                  {
                     output.Add(spaceLiteral);
                  }
                  output.Add(volumeLiteral);
                  output.Add(spaceLiteral);
                  output.Add(yearLiteral);
               }
               if (hasVolume && !hasYear)
               {
                  output.Add(spaceLiteral);
                  output.Add(volumeLiteral);
               }
               else if (hasYear)
               {
                  output.Add(spaceLiteral);
                  output.Add(yearLiteral);
               }               
               output.Add(commaLiteral);
            }
            else // Non-german Style citation
            {
               if (hasVolume && hasYear)
               {
                  output.Add(yearLiteral);
                  output.Add(commaLiteral);
                  output.Add(spaceLiteral);
                  output.Add(volumeLiteral);
                  output.Add(spaceLiteral);
                  output.Add(periodicalLiteral);

               }
               if (hasVolume && !hasYear)
               {
                  output.Add(spaceLiteral);
                  output.Add(volumeLiteral);
                  output.Add(spaceLiteral);
                  output.Add(periodicalLiteral);
               }
               else if (hasYear)
               {
                  output.Add(spaceLiteral);
                  output.Add(new LiteralTextUnit("["));
                  output.Add(yearLiteral);
                  output.Add(new LiteralTextUnit("]"));
                  output.Add(spaceLiteral);
                  output.Add(periodicalLiteral);
               }
            }
            
            
            
            output.Add(spaceLiteral);
            output.Add(pageRangeLiteral);
            
            j = j + 1 ;            
         }

         foreach (ITextUnit textUnit in output)
         {
            textUnit.FontStyle = FontStyle.Neutral;
         }
                  
         // Now we print the pinpoint.
                  
         string pinpointPrefixIfAfterNumberString = "";
         string pinpointPrefixString = " at ";   
         
         // We don't need to do that if the citation is a BibliographyCitation or if there is no pinpoint
         bool hasPinpoint = false;
         if (thisPlaceholderCitation != null)
         {
            if (thisPlaceholderCitation.PageRange.PrettyString != "")
            {
               hasPinpoint = true;
            }
         }
         
         if (hasPinpoint)
         {         
            
            string quotationPageRangeString = thisPlaceholderCitation.PageRange.PrettyString;
            
            LiteralTextUnit pinpointPrefixIfAfterNumberLiteral = new LiteralTextUnit(pinpointPrefixIfAfterNumberString);
            LiteralTextUnit pinpointPrefixLiteral = new LiteralTextUnit(pinpointPrefixString);            
            LiteralTextUnit quotationPageRangeLiteral = new LiteralTextUnit(quotationPageRangeString);
            
            if (thisPlaceholderCitation.PageRange.NumberingType == NumberingType.Margin)
            {            
               output.Add(pinpointPrefixLiteral);
               output.Add(quotationPageRangeMarginPrefixLiteral);
               output.Add(quotationPageRangeLiteral);
               output.Add(quotationPageRangeMarginSuffixLiteral);
            }
            if (thisPlaceholderCitation.PageRange.NumberingType == NumberingType.Page)
            {            
                    output.Add(pinpointPrefixLiteral);
               output.Add(spaceLiteral);
               output.Add(quotationPageRangeLiteral);
            }
         }
         
         // And now we see if we need to print the shortform info and the actually cited reporter.
         // If we do, we print it.
         
         bool needsNoIntroduction = false;
         
         if (thisPlaceholderCitation != null &&
            (hasNeutralReporter || parallelReferencesList.Count <= 1 ) &&
            (citation.Reference.CitationKeyUpdateType == 0 || string.IsNullOrEmpty(citation.Reference.CitationKey)))
         {
            needsNoIntroduction = true;
         }
         
         if (thisPlaceholderCitation != null && !needsNoIntroduction) // We don't need to do that if the citation is a BibliographyCitation
         {                     
            bool needsPrimaryReporter = false;
                     
            foreach (FootnoteCitation precedingFootnoteCitation in citationManager.FootnoteCitations)
            {
               FootnoteCitation prePrecedingFootnoteCitation;
               
               if (precedingFootnoteCitation == null || precedingFootnoteCitation.Reference == null) continue;
               
               var  precedingPlaceholderCitation = precedingFootnoteCitation as PlaceholderCitation;
               
               if (precedingPlaceholderCitation.Reference == citation.Reference && !hasNeutralReporter && hasParallelReporter && precedingPlaceholderCitation.Entry.PageRange != null) needsPrimaryReporter = true;
            }
            
            // If it needs the cited reporter info, we'll print it now.
            
            if (parallelReferencesList.Count > 1 && needsPrimaryReporter)
            {
               output.Add(spaceLiteral);
               output.Add(shortformIntroPrefixLiteral);
            
               var periodical = citation.Reference.Periodical;
               string periodicalString = string.Empty;         
            
               if (!string.IsNullOrEmpty(periodical.StandardAbbreviation))
               {
                  periodicalString += periodical.StandardAbbreviation;
               }
               else if (!string.IsNullOrEmpty(periodical.FullName))
               {
                  periodicalString += periodical.FullName;
               }

               LiteralTextUnit primaryReporterLiteral = new LiteralTextUnit(periodicalString);
                        
               
               output.Add(primaryReporterIntroLiteral);
               output.Add(spaceLiteral);
               output.Add(primaryReporterLiteral);
               output.Add(shortformIntroSuffixLiteral);
            }         
         }      
         
            
      // Finalizing the output
         
      if (NoPeriods)
      {
         foreach (ITextUnit textUnit in output)
         {
            var pattern1 = @"(?<=\p{Lu})\. ?(?=\p{Lu}\.)";
            textUnit.Text = Regex.Replace(textUnit.Text, pattern1, "");

            var pattern2 = @"\.";
            textUnit.Text = Regex.Replace(textUnit.Text, pattern2, "");
         }
      }

      return output;         
      }
   }
   class PeriodicalComparer : IComparer<SwissAcademic.Citavi.Reference>
   {
      public int Compare(SwissAcademic.Citavi.Reference xReference, SwissAcademic.Citavi.Reference yReference)
      {   
         var xPeriodicalRanking = GetPeriodicalRanking(xReference);
         var yPeriodicalRanking = GetPeriodicalRanking(yReference);
         return xPeriodicalRanking.CompareTo(yPeriodicalRanking);
      }
      private string GetPeriodicalRanking(SwissAcademic.Citavi.Reference reference)
      {
         string periodicalString = string.Empty;
         if (!string.IsNullOrEmpty(reference.Periodical.StandardAbbreviation))
         {
            periodicalString += reference.Periodical.StandardAbbreviation;
         }
         else if (!string.IsNullOrEmpty(reference.Periodical.FullName))
         {
            periodicalString += reference.Periodical.FullName;
         }                           
         
         if (string.IsNullOrEmpty(periodicalString)) return "zz";

         else if (reference.Periodical.Notes.ToStringSafe().Contains("neutral")) return "aa";
         
         // Here we leave room for customizations in case a publisher wants you to cite one reporter over another
         
         else if (reference.Periodical.Notes.ToStringSafe().Contains("official")) return "na";
         else if (reference.Periodical.Notes.ToStringSafe().Contains("semi")) return "oa";
         else if (reference.Periodical.Notes.ToStringSafe().Contains("nominate")) return "pa";
         else if (reference.Periodical.Notes.ToStringSafe().Contains("national")) return "qa";
         else if (reference.Periodical.Notes.ToStringSafe().Contains("regional")) return "ra";
         else if (reference.Periodical.Notes.ToStringSafe().Contains("local")) return "sa";
         else if (reference.Periodical.Notes.ToStringSafe().Contains("topical")) return "ta";
         else if (reference.Periodical.Notes.ToStringSafe().Contains("electronic")) return "ua";
         
         else return "zz";      
      }
   }
}


Damit kriege ich dann solche Nachweise hin:

BGH, 21 January 1999, I ZB 15/94, NJW 1999, 3490; GRUR 1999, 731 at 11–13 [cited to GRUR]


Der von mir vergebene Name der Komponente ist übrigens "CourtDecision, D/Reporters+Pinpoint". Ich erwähne dass, weil es vielleicht wichtig ist zu wissen, dass die programmierte Komponente auch die Nachweisseite=Pinpoint druckt.

Ich hoffe, mein Code bietet eine Grundlage, um das ganze nach Belieben selber anzupassen.
jay-squared
Citavi Expert
 

Re: Parallelfundstellen

Postby Felix Magin » 2016-08-23 13:33

Perfekt, danke!

(dieser Beitrag ist nur da, damit ich den Thread leichter wiederfinde)
Felix Magin
Citavi Expert
 


Return to Juristische Zitationsstile anwenden