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.

Feedback zur Entwicklung eines Zitationsstils für Common Law

Erhalten Sie Hilfe bei der Anwendung juristischer Zitationsstile.

Feedback zur Entwicklung eines Zitationsstils für Common Law

Postby jay-squared » 2015-11-08 18:23

Liebes Citavi-Team,

Der folgende Post ist keine Frage, sondern ein hoffentlich interessanter und relevanter Erfahrungsbericht.

Ich muß meine alte Meinung revidieren. Nicht nur wünschte ich, ich würde mich für Tennis interessieren. Ich habe auch festgestellt, dass Citavi viel besser in der Lage ist, Common-Law-Entscheidungen (ich sag immer Common Law-Entscheidungen, ist aber quatsch. Etwa 30 % meiner Entscheidungen kommen aus Québec) abzubilden, als ich es vor drei Monaten noch gedacht habe; mehr als dass, ich glaube sogar, Citavi kann die Darstellung von Gericht und Jurisdiktion sinnvoll automatisieren. Ich möchte hier einmal meinen Ansatz etwas erläutern und Fragen, welche ich an verschiedener Stelle gebündelt habe, weil er vielleicht vom Interesse für die Entwickler ist, wie Common-Law-Entscheidungen zitiert werden können, und wie Citavis derzeitiges Datenmodell und Zitationsstilmodell dafür fruchtbar gemacht werden kann.

Ich bin inzwischen dazu übergegangen, beim Erstzitat einer Common-Law-Gerichtsentscheidung eine Vorlage zu verwenden, welche nur noch aus zwei Komponenten besteht. Eine simple Style-of-Cause-Komponente, die nur insoweit programmiert ist, dass diese bei Angabe der Option 1 nicht gedruckt wird (für den Fall, dass ich den Style of Cause im Text habe, und in der Fußnote nur den Nachweis brauche). Die zweite Komponente ist eine komplexe programmierte Komponente mit 600 Zeilen Code. Sie ist so lang, weil sie im wesentlichen drei komplexe Aspekte abbilden muss:

1. Angaben zu Gericht und Jurisdiktion.
2. Parallelfundstellen
3. Kurzform und Angabe der verwendeten Parallelfundstelle

1. Gericht und Jurisdiktion

Der erste Aspekt ist im Wesentlichen die Konsequenz folgender Regel, welche ich beispielhaft dem McGill Guide entnommen habe, die aber ähnlich wohl auch etwa in OSCOLA, Bluebook, AGLC gilt.

When necessary, indicate the jurisdiction and court in parentheses at the end of the citation, following all parallel citations. The jurisdiction and level of court are indicated in a neutral citation. Therefore, if a neutral citation is provided, it is unnecessary to include an abbreviation for the jurisdiction or level of court. If the jurisdiction is evident from the name of any reporter, reference is made only to the level of court. If both the jurisdiction and the level of court are evident from the title of the reporter, reference does not need to be made to either.


Für amerikanische Entscheidungen:

Provide the court and the jurisdiction in parentheses, using the abbreviations from Appendices B and F. Omit the jurisdiction if it is obvious from the name of the reporter. Omit the court if it is the highest court in its jurisdiction.


Dass bedeutet, der McGill Guide geht von der Prämisse aus, dass Gericht und Jurisdiktion anzugeben sind; ob dies entbehrlich ist, ist eine Funktion einerseits der angegebenen Reporter, anderseits des Gerichts. Gerichte wie der Oberste Gerichtshof Kanadas oder Australiens enthalten in ihrer Abkürzung bereits die Jurisdiktion. Ebenso gibt es weltweit nur ein House of Lords. Daher kann die Jurisdiktion sich auch aus dem Gericht ergeben, auch wenn das aus der oben zitierten Regel des McGill-Guides nicht direkt folgt.

Statt daher im Notizfeld der Entscheidung anzugeben, ob Gericht oder Jurisdiktion erforderlich sind, kann ich einfach von der Prämisse ausgehen, dass diese erforderlich sind

Code: Select all
bool needsJurisdictionBool = true;
bool needsCourtBool = true;


und dann einerseits beim Gericht, andererseits beim Reporter abfragen, ob diese das eine oder andere definieren. Das sieht dann so aus:

Code: Select all
if (court.Notes.Contains("jurisdiction")) needsJurisdictionBool = false;
if (court.Notes.Contains("court")) needsCourtBool = false;


oder im Kontext

Code: Select all
IList<Person> courts = citation.Reference.Organizations as IList<Person>;
string courtsString = string.Empty;
foreach (Person court in courts)
{
  if (court == null) continue;
  if (court.Notes.Contains("jurisdiction")) needsJurisdictionBool = false;
  if (court.Notes.Contains("court")) needsCourtBool = false;
  if (!string.IsNullOrEmpty(court.Abbreviation))
  {
    if (!string.IsNullOrEmpty(courtsString)) courtsString += ", ";
    courtsString += court.Abbreviation;
  }
  else if (!string.IsNullOrEmpty(court.LastName))
  {
    if (!string.IsNullOrEmpty(courtsString)) courtsString += ", ";
    courtsString += court.LastName;
  }
}


und

Code: Select all
if (reference.Periodical.Notes.Contains("jurisdiction")) needsJurisdictionBool = false;
if (reference.Periodical.Notes.Contains("court")) needsCourtBool = false;


So kann der Ziterstil unterscheiden zwischen

    1. Air Canada v British Columbia [1989] 1 SCR 1161; 59 DLR (4th) 161 (gar keine Angabe nötig)
    2. 642947 Ontario Ltd v Fleischer (2001), 56 OR (3d) 417; 209 DLR (4th) 182 (CA) (Angabe des Gerichts nötig)
    3. Olympia & York Developments Ltd v Royal Trust Co (1993), 20 CBR (3d) 165 (Ont Gen Div) (Angabe von Gericht und Jurisdiktion)
    4. Ellisor v Ellisor 630 SW2d 746 (Tex 1st Dist 1982) (Nur Angabe des Gerichts nötig, da Entscheidung des höchsten Gerichts dieser Jurisdiktion)
    5. Symphony Space v Pergola Props 88 NY2d 466; 669 NE2d 799; 646 NYS2d 641 (1996) (nix nötig, der NY Court of Appeals ist das höchste Gericht in New York, und New York wird durch den Reporter identifiziert)

2. Parallelfundstellen

Der zweite Gesichtspunkt ist der, dass ich Parallelfundstellen angeben will, diese aber sauber formatieren möchte, und manchmal aus dem einem, manchmal aus dem anderen Reporter zitiere. Die Lösung dafür ist meines Erachtens, mehrere Titel anzulegen, welche von Citavi in der Zitation alle verarbeitet werden. Die Sortierung kann dabei ebenfalls automatisch erfolgen. So sagt etwa der McGill Guide

Where a judgment is not reported in either an official or semi-official reporter, cite to an unofficial reporter. Whenever possible, the following guidelines should be followed: General reporters (e.g. Western Weekly Reports) are preferred to specific reporters (e.g. Canadian Criminal Cases). Reporters covering a large geographic area (e.g. Dominion Law Reports) are preferred to reporters covering a smaller geographic area (e.g. Saskatchewan Reports). Reporters that are most readily available are preferred.


In etwas umständlicher Ausdrucksweise, sagt das Bluebook meines Erachtens auf mehreren hundert Seiten nicht mehr.

Abbbilden kann ich das, indem ich einmal abfrage, ob irgend ein anderer Titel im Projekt Parallelfundstelle ist

Code: Select all
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 (!String.IsNullOrEmpty(citation.Reference.Title) && citation.Reference.Title == reference.Title) parallelReferencesList.Add(reference);
  if (String.IsNullOrEmpty(citation.Reference.Title) && !String.IsNullOrEmpty(citation.Reference.SpecificField2) && citation.Reference.SpecificField2 == reference.SpecificField2) parallelReferencesList.Add(reference);
  if (reference.Periodical.Notes.ToStringSafe().Contains("neutral"))hasNeutralReporter = true;
  if (reference != citation.Reference)hasParallelReporter = true;            
  if (reference.Periodical.Notes.Contains("jurisdiction")) needsJurisdictionBool = false;
  if (reference.Periodical.Notes.Contains("court")) needsCourtBool = false;
}
     
parallelReferencesList.Sort(new PeriodicalComparer());


andererseits durch eine automatische Sortierung, welche danach guckt, wie der Reporter im Notizfeld kategorisiert wird; als Kategorien habe ich neutral, official, semi, national, regional, local, topical, electronical genommen, welche in der Reihenfolge sortiert werden. Am Besten wäre es noch, subsidär bei zwei gleichen Kategorien schlicht alphabetisch zu sortieren.

Code: Select all
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 (periodicalString.Contains("W.L.R.")) return "ob"; // WLR should always come after the more specialized ICLR reports
    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";      
  }
}


So wird etwa die folgende Fundstelle immer sauber sortiert, egal welchen der fünf Titel ich zitiere.

Bond Development Corp v Esquimalt (Township) 2006 BCCA 248; 268 DLR (4th) 69; [2006] 6 WWR 473; 52 BCLR (4th) 243; 18 BLR (4th) 169


Einziger Schwachpunkt von Citavi dazu derzeit: Die Parallel-Titel werden nicht alle automatisch in das Projekt übernommen. Das kann auch ein Feature sein, weil es erlaubt, feiner zu steuern, welche der als Parallelfundstellen in Citavi erfassten Titel ich im Dokument haben möchte, aber dann wäre es schön, Titel dem Word-Projekt verfügbar zu machen, ohne Blindzitate machen zu müssen (also solche, die ich nur mache, damit die Titeldaten dem Word-AddIn zur Verfügung stehen).

3. Angabe der verwendeten Fundstelle und der Kurzform beim ersten Zitat

Der dritte Aspekt, ist der, dass im ersten Zitat ggf. angegeben werden muss, ob ich eine Kurzform verwende, und welchen Reporter ich konkret verwende. Das kann ich ebenfalls automatisiert abfragen:

Code: Select all
bool needsPrimaryReporter = false;
bool needsShortformIntro = false;

for (int i = 1; i > -1; i++)   // der Loop kommt mir etwas hackig vor, sauberer waere es wohl zu testen, dass i kleiner
                // gleich dem hoechsten index von citationManager.FootnoteCitations ist, aber ich weiss
                // nicht, wie ich an diese Variable drankomme
{
  FootnoteCitation precedingFootnoteCitation;
  FootnoteCitation prePrecedingFootnoteCitation;
 
  try   {precedingFootnoteCitation  = citationManager.FootnoteCitations[i];}
  catch {   break;}
 
  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;
 
  prePrecedingFootnoteCitation  = citationManager.FootnoteCitations[i-1];         

  if(precedingFootnoteCitation.Reference != citation.Reference) continue;
  else if(
      precedingFootnoteCitation != citation &&
      precedingFootnoteCitation.Reference == citation.Reference &&
      citation.Reference.CitationKeyUpdateType != 0 && !string.IsNullOrEmpty(citation.Reference.CitationKey) &&
      // the otherFootnoteCitation should not be ibid, so it should meet one of the following sufficient conditions
      (
        // (1) it needs to be different from the citation immediately preceding it
        precedingFootnoteCitation.Reference != prePrecedingFootnoteCitation.Reference ||
        // (2) whatever that does
        !precedingFootnoteCitation.IsRepeatingFootnote ||
        // (3) it is one more than one footnote away from its predecessor
        precedingFootnoteCitation.FootnoteIndex >= prePrecedingFootnoteCitation.FootnoteIndex +2
      )            
    )
  {
    needsShortformIntro = true;
  }
  else
  {
    continue;
  }
}


Abschließend: Hier ist die gesamte Komponente im Kontext

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.
         
         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 = ",";
         string parallelPeriodicalsSeparatorString = ";";
         string quotationPageRangeMarginPrefixString = "[";
         string quotationPageRangeMarginSuffixString = "]";
      
         LiteralTextUnit shortformIntroPrefixLiteral = new LiteralTextUnit("[");
         LiteralTextUnit shortformIntroSuffixLiteral = new LiteralTextUnit("]");

         LiteralTextUnit openingQuotesLiteral = new LiteralTextUnit("‘");
         LiteralTextUnit closingQuotesLiteral = new LiteralTextUnit("’");
      
         LiteralTextUnit shortTitleLiteral;   
         
         LiteralTextUnit spaceLiteral = new LiteralTextUnit(spaceString);
         LiteralTextUnit commaLiteral = new LiteralTextUnit(commaString);
         
         LiteralTextUnit parallelPeriodicalsSeparatorLiteral =  new LiteralTextUnit(parallelPeriodicalsSeparatorString);
         LiteralTextUnit quotationPageRangeMarginPrefixLiteral = new LiteralTextUnit(quotationPageRangeMarginPrefixString);
         LiteralTextUnit quotationPageRangeMarginSuffixLiteral = new LiteralTextUnit(quotationPageRangeMarginSuffixString);
         
         LiteralTextUnit prefixDateYearLiteral = new LiteralTextUnit("(");
         LiteralTextUnit suffixDateYearLiteral = new LiteralTextUnit("), ");
         
         LiteralTextUnit prefixYearLiteral = new LiteralTextUnit("[");
         LiteralTextUnit suffixYearLiteral = new LiteralTextUnit("]");
         
         LiteralTextUnit prefixVolumeLiteral = new LiteralTextUnit("");
         LiteralTextUnit suffixVolumeLiteral = new LiteralTextUnit("");
         
         LiteralTextUnit prefixNumberLiteral = new LiteralTextUnit(" ");
         LiteralTextUnit suffixNumberLiteral = new LiteralTextUnit("");   
         
         spaceLiteral.FontStyle = FontStyle.Neutral;
         commaLiteral.FontStyle = FontStyle.Neutral;         
         shortformIntroPrefixLiteral.FontStyle = FontStyle.Neutral;
         shortformIntroSuffixLiteral.FontStyle = FontStyle.Neutral;
         
         CitationManager citationManager = citation.CitationManager;
         Project project = citation.Reference.Project;
         
         // Certain variations exist in how cases are cited from different jurisdictions, so we need to establish from what jurisdiction a case comes
         
         string jurisdiction = citation.Reference.CustomField4;
         
         List<string> jurisdictionsCanada = new List<string>
            {
            "Can.", "N.L.", "N.B.", "N.B.", "Queb.", "Ont.", "Man.", "Sask.", "Alta.", "B.C.", "Nun.", "N.W.T.", "Yuk."         
         };
         
         List<string> jurisdictionsUSA = new List<string>
           {
            "USA",
            
            "1st Cir.", "2nd Cir.", "3d Cir.", "4th Cir.", "5th Cir.", "6th Cir.", "7th Cir.", "8th Cir.", "9th Cir.", "10th Cir.", "Fed. Circ.", "D.C. Cir.",
            
            "N.D. Ala.", "M.D. Ala.", "S.D. Ala.", "D. Alaska", "D. Ariz.", "E.D. Ark.", "W.D. Ark.", "C.D. Cal.", "E.D. Cal.", "N.D. Cal.", "S.D. Cal.",
            "D. Col.", "D. Conn.", "D. Del.", "D.D.C.", "N.D. Fla.", "M.D. Fla.", "S.D. Fla.", "N.D. Ga.", "M.D. Ga.", "S.D. Ga.", "D. Guam", "D. Haw.",
            "D. Idaho", "N.D. Ill.", "C.D. Ill.", "S.D. Ill.", "N.D. Ind.", "S.D. Ind.", "N.D. Iowa", "S.D. Iowa", "D. Kan.", "E.D. Ky.", "W.D. Ky.",
            "E.D. La.", "M.D. La.", "W.D. La.", "D. Me.", "D. Md.", "D. Mass.", "E.D. Mich.", "W.D. Mich.", "D. Minn.", "N.D. Miss.", "S.D. Miss.",
            "E.D. Mo.", "W.D. Mo.", "D. Mont.", "D. Neb.", "D. Nev.", "D.N.H.", "D.N.J.", "D.N.M.", "E.D.N.Y", "N.D.N.Y", "S.D.N.Y.", "W.D.N.Y",
            "E.D.N.C.", "M.D.N.C.", "W.D.N.C.", "D.N.D.", "D.N. Mar. I.", "N.D. Ohio", "S.D. Ohio", "E.D. Okla.", "N.D. Okla.", "W.D. Okla.",
            "D. Ore.", "E.D. Pa.", "M.D. Pa.", "W.D. Pa.", "D.P.R.", "D.R.I.", "D.S.C.", "D.S.D.", "E.D. Tenn.", "M.D. Tenn.", "W.D. Tenn.", "E.D. Tex.",
            "N.D. Tex.", "S.D. Tex.", "W.D. Tex.", "D. Utah", "D. Vt.", "D.V.I.", "E.D. Va.", "W.D. Va.", "E.D. Wash.", "W.D. Wash.", "N.D. W. Va.",
            "S.D. W. Va.", "E.D. Wis.", "W.D. Wis.", "D. Wyo.",
            
            "Ala.", "Alaska", "Ariz.", "Ark.", "Cal.", "Col.", "Conn.", "Del.", "Fla.", "Ga.", "Guam", "Haw.", "Idaho", "Ill.", "Ind.", "Iowa",
            "Kan.", " Ky.", "La.", "Me.", "Md.", "Mass.", "Mich.", "Minn.", "Miss.", "Mo.", "Mont.", "Neb.", "Nev.", "N.H.", "N.J.", "N.M.", "N.Y",
            "N.C.", "N.D.", "Mar. I.", "Ohio", "Okla.", "Ore.", "Pa.", "Pa.", "Pa.", "P.R.", "R.I.", "S.C.", "S.D.", "Tenn.", "Tex.", "Utah",
            "Vt.", "V.I.", "Va.", "Wash.", "W. Va.", "Wis.", "Wyo."            
         };
         
         bool Canada = jurisdictionsCanada.Any(jurisdiction.Contains);
         bool USA = jurisdictionsUSA.Any(jurisdiction.Contains);
         
         // We start on the assumption that the reporters neither indicate jurisdiction, nor the right court
         
         bool needsJurisdictionBool = true;
         bool needsCourtBool = true;
         
         IList<Person> courts = citation.Reference.Organizations as IList<Person>;
         string courtsString = string.Empty;
         foreach (Person court in courts)
         {
            if (court == null) continue;
            // Sometimes, the court itself makes details on jurisdiction or court unnecessary.
            // Namely for US cases where we don't indicate the court if it is the highest court in the jurisdiction.
            // In that case, the court entry should have a court in the Notes field.
            // Some court abbreviations, like SCC or HCA also identify the jurisdiction, so the Notes field of that court should
            // include the word jurisdiction.
            if (court.Notes.Contains("jurisdiction")) needsJurisdictionBool = false;
            if (court.Notes.Contains("court")) needsCourtBool = false;
            if (!string.IsNullOrEmpty(court.Abbreviation))
            {
               if (!string.IsNullOrEmpty(courtsString)) courtsString += ", ";
               courtsString += court.Abbreviation;
            }
            else if (!string.IsNullOrEmpty(court.LastName))
            {
               if (!string.IsNullOrEmpty(courtsString)) courtsString += ", ";
               courtsString += court.LastName;
            }
         }
         
         // In certain circumstances, we need to print the actual year of the date the decision was rendered.
         // Examples are Canadian cases where the date differs from the reporter year and all American cases.
         
         string dateyear = "";
         if (citation.Reference.Date != null)
         {
            string dateString = citation.Reference.Date;            
            DateTime dateValue;
            DateTimeInformation.TryParse(dateString, out dateValue);
            int year = dateValue.Year;      
            dateyear = dateValue.ToString("yyyy");
         }               
         
         LiteralTextUnit dateyearLiteral = new LiteralTextUnit(dateyear);
         
         // We now 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 (!String.IsNullOrEmpty(citation.Reference.Title) && citation.Reference.Title == reference.Title) parallelReferencesList.Add(reference);
            if (String.IsNullOrEmpty(citation.Reference.Title) && !String.IsNullOrEmpty(citation.Reference.SpecificField2) && citation.Reference.SpecificField2 == reference.SpecificField2) parallelReferencesList.Add(reference);
            if (reference.Periodical.Notes.ToStringSafe().Contains("neutral"))hasNeutralReporter = true;
            if (reference != citation.Reference)hasParallelReporter = true;            
            if (reference.Periodical.Notes.Contains("jurisdiction")) needsJurisdictionBool = false;   // Sometimes, one of the reporters makes details on jurisdiction (e.g. "O.R.")
            if (reference.Periodical.Notes.Contains("court")) needsCourtBool = false;            // or court (e.g. "S.C.R.") unnecessary.
         }
         
         // 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);
            }
            
            bool hasVolume = !string.IsNullOrEmpty(reference.Volume);
            bool hasYear = !string.IsNullOrEmpty(reference.Year);
            bool hasNumber = !string.IsNullOrEmpty(reference.Number);
            bool hasDateyear = !string.IsNullOrEmpty(reference.Date);
            bool needsDateyear = false;
            
            var periodical = reference.Periodical;
            string periodicalString = string.Empty;         
         
            if (!string.IsNullOrEmpty(periodical.StandardAbbreviation))
            {
               periodicalString += periodical.StandardAbbreviation;
            }
            else if (!string.IsNullOrEmpty(periodical.FullName))
            {
               periodicalString += periodical.FullName;
            }
            
            LiteralTextUnit periodicalLiteral = new LiteralTextUnit(periodicalString);
            
            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);
            
            // Here we construct the year, volume and number element of the citation.
            
            // Canadian decisions should include the year of the date the decision was rendered in case this differs from the reporter year info
            
            if(!string.IsNullOrEmpty(reference.Year) && hasDateyear && dateyear != reference.Year && (Canada))
            {
               needsDateyear = true;
            }
            
            if (USA)
            {
               if (!onlyStyleOfCause || j > 0)
               {
                  output.Add(spaceLiteral);
               }
               output.Add(prefixVolumeLiteral);
               output.Add(volumeLiteral);
               output.Add(suffixVolumeLiteral);
            }            
            else if(isNeutralCitation && Canada)
            {
               if (!onlyStyleOfCause || j > 0)
               {
                  output.Add(spaceLiteral);
               }
               output.Add(yearLiteral);
            }
            else if(j == 0 && needsDateyear && !hasVolume && hasYear && !hasNumber)
            {
               if (!onlyStyleOfCause || j > 0)
               {
                  output.Add(spaceLiteral);
               };
               output.Add(prefixDateYearLiteral);
               output.Add(dateyearLiteral);
               output.Add(suffixDateYearLiteral);
               output.Add(prefixYearLiteral);
               output.Add(yearLiteral);
               output.Add(suffixYearLiteral);
            }
            else if(!hasVolume && hasYear && !hasNumber)
            {
               if (!onlyStyleOfCause || j > 0)
               {
                  output.Add(spaceLiteral);
               }
               output.Add(prefixYearLiteral);
               output.Add(yearLiteral);
               output.Add(suffixYearLiteral);
            }
            else if(j == 0 && needsDateyear && hasYear && hasNumber)
            {
               if (!onlyStyleOfCause || j > 0)
               {
                  output.Add(spaceLiteral);
               }
               output.Add(prefixDateYearLiteral);
               output.Add(dateyearLiteral);
               output.Add(suffixDateYearLiteral);
               output.Add(prefixYearLiteral);
               output.Add(yearLiteral);
               output.Add(suffixYearLiteral);
               output.Add(prefixNumberLiteral);
               output.Add(numberLiteral);
               output.Add(suffixNumberLiteral);

            }
            else if(hasYear && hasNumber)
            {
               if (!onlyStyleOfCause || j > 0)
               {
                  output.Add(spaceLiteral);
               }
               output.Add(prefixYearLiteral);
               output.Add(yearLiteral);
               output.Add(suffixYearLiteral);
               output.Add(prefixNumberLiteral);
               output.Add(numberLiteral);
               output.Add(suffixNumberLiteral);

            }
            else if(j == 0 && hasDateyear && hasVolume)
            {
               if (!onlyStyleOfCause || j > 0)
               {
                  output.Add(spaceLiteral);
               }
               output.Add(prefixDateYearLiteral);
               output.Add(dateyearLiteral);
               output.Add(suffixDateYearLiteral);
               output.Add(prefixVolumeLiteral);
               output.Add(volumeLiteral);
               output.Add(suffixVolumeLiteral);
            }
            else if(hasVolume)
            {
               if (!onlyStyleOfCause || j > 0)
               {
                  output.Add(spaceLiteral);
               }
               output.Add(prefixVolumeLiteral);
               output.Add(volumeLiteral);
               output.Add(suffixVolumeLiteral);
            }
            
            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)
            {            
                  if (!needsCourtBool && !needsJurisdictionBool) output.Add(pinpointPrefixIfAfterNumberLiteral);
               output.Add(pinpointPrefixLiteral);
               output.Add(spaceLiteral);
               output.Add(quotationPageRangeLiteral);
            }
         }
         
         // Now we add the court & jurisdiction info, and - for American cases - the year of the date the decision was rendered
                        
         LiteralTextUnit courtLiteral = new LiteralTextUnit(courtsString);
         LiteralTextUnit jurisdictionLiteral = new LiteralTextUnit(citation.Reference.CustomField4);
         LiteralTextUnit outputPrefix = new LiteralTextUnit(" (");
         LiteralTextUnit outputSuffix = new LiteralTextUnit(")");

         if (USA && needsCourtBool && !needsJurisdictionBool)
         {
            output.Add(outputPrefix);
               output.Add(courtLiteral);
            output.Add(spaceLiteral);
            output.Add(dateyearLiteral);
               output.Add(outputSuffix);
         }
         else if(USA && needsJurisdictionBool && !needsCourtBool)
         {
               output.Add(outputPrefix);;
               output.Add(jurisdictionLiteral);
            output.Add(spaceLiteral);
            output.Add(dateyearLiteral);
               output.Add(outputSuffix);
           }
         else if(USA && needsJurisdictionBool && needsCourtBool)
         {
            output.Add(outputPrefix);
               output.Add(jurisdictionLiteral);
               output.Add(spaceLiteral);
               output.Add(courtLiteral);
            output.Add(spaceLiteral);
            output.Add(dateyearLiteral);
               output.Add(outputSuffix);
         }
         else if (USA)
         {
            output.Add(outputPrefix);
               output.Add(dateyearLiteral);
               output.Add(outputSuffix);
         }
         else if (needsCourtBool && !needsJurisdictionBool)
         {
            output.Add(outputPrefix);
               output.Add(courtLiteral);
               output.Add(outputSuffix);
         }
         else if(needsJurisdictionBool && !needsCourtBool)
         {
               output.Add(outputPrefix);
               output.Add(jurisdictionLiteral);
               output.Add(outputSuffix);
           }
         else if(needsJurisdictionBool && needsCourtBool)
         {
            output.Add(outputPrefix);
               output.Add(jurisdictionLiteral);
               output.Add(spaceLiteral);
               output.Add(courtLiteral);           
               output.Add(outputSuffix);
         }
         
         // And now we see if we need to print the shortform info and the actually cited reporter.
         // If we do, we print it.
         
         if (thisPlaceholderCitation != null) // We don't need to do that if the citation is a BibliographyCitation
         {                     
            bool needsPrimaryReporter = false;
            bool needsShortformIntro = false;
            
            // Now we loop through all references and see if the shortform is used or a pinpoint given.
            // TO DO:    I suppose it might be a good idea first to test whether it actually has more than one reporter
            //          or a shortform so we don't do this performance heavy loop without it being necessary.
            
            for (int i = 1; i > -1; i++)   // der Loop kommt mir etwas hackig vor, sauberer waere es wohl zu testen, dass i kleiner
                                    // gleich dem hoechsten index von citationManager.FootnoteCitations ist, aber ich weiss
                                    // nicht, wie ich an diese Variable drankomme
            {
               FootnoteCitation precedingFootnoteCitation;
               FootnoteCitation prePrecedingFootnoteCitation;
               
               try   {precedingFootnoteCitation  = citationManager.FootnoteCitations[i];}
               catch {   break;}
               
               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;
               
               prePrecedingFootnoteCitation  = citationManager.FootnoteCitations[i-1];         

               if(precedingFootnoteCitation.Reference != citation.Reference) continue;
               else if(
                     precedingFootnoteCitation != citation &&
                     precedingFootnoteCitation.Reference == citation.Reference &&
                     citation.Reference.CitationKeyUpdateType != 0 && !string.IsNullOrEmpty(citation.Reference.CitationKey) &&
                     // the otherFootnoteCitation should not be ibid, so it should meet one of the following sufficient conditions
                     (
                        // (1) it needs to be different from the citation immediately preceding it
                        precedingFootnoteCitation.Reference != prePrecedingFootnoteCitation.Reference ||
                        // (2) whatever that does
                        !precedingFootnoteCitation.IsRepeatingFootnote ||
                        // (3) it is one more than one footnote away from its predecessor
                        precedingFootnoteCitation.FootnoteIndex >= prePrecedingFootnoteCitation.FootnoteIndex +2
                     )            
                  )
               {
                  needsShortformIntro = true;
               }
               else
               {
                  continue;
               }
            }
            
            // If it needs either shortform intro or the cited reporter info, we'll print it now.
            
            if (needsShortformIntro || needsPrimaryReporter)
            {
               output.Add(spaceLiteral);
               output.Add(shortformIntroPrefixLiteral);
            }
            
            if (needsShortformIntro)
            {

               shortTitleLiteral = new LiteralTextUnit(citation.Reference.CitationKey);               
               shortTitleLiteral.FontStyle = FontStyle.Italic;
               output.Add(shortTitleLiteral);

               if (needsPrimaryReporter)
               {
                  output.Add(commaLiteral);
                  output.Add(spaceLiteral);
               }
            }            
            if (needsPrimaryReporter)
            {
               
               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;
               }
               
               string primaryReporterIntroString = "cited to";
               LiteralTextUnit primaryReporterLiteral = new LiteralTextUnit(periodicalString);
               LiteralTextUnit primaryReporterIntroLiteral = new LiteralTextUnit(primaryReporterIntroString);         
               
               output.Add(primaryReporterIntroLiteral);
               output.Add(spaceLiteral);
               output.Add(primaryReporterLiteral);                  
            }         
            if (needsShortformIntro || needsPrimaryReporter) 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 (periodicalString.Contains("W.L.R.")) return "ob"; // WLR should always come after the more specialized ICLR reports
         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";      
      }
   }
}
jay-squared
Citavi Expert
 

Re: Feedback zur Entwicklung eines Zitationsstils für Common

Postby Peter Meurer » 2015-11-09 14:23

Lieber Jay-Squared

Ich bin sehr beeindruckt von Ihren Ausführungen, auch wenn es für mich als Nicht-Juristen nicht einfach ist, Ihnen zu folgen. Ich bin sicher, andere NutzerInnen werden über eine Suche zu Ihren Ausführungen gelangen und qualifizierteres Feedback liefern können als ich.

Freundliche Grüsse
Peter
Peter Meurer
Citavi Customer Service
 

Re: Feedback zur Entwicklung eines Zitationsstils für Common

Postby jay-squared » 2016-08-17 14:27

Aus gegebenem Anlass: ich habe den Code bzgl. Kurzform oder verwendete Fundstelle überarbeitet:

Code: Select all
bool needsPrimaryReporter = false;
         bool needsShortformIntro = false;
         
         if (thisPlaceholderCitation != null && needsIntroduction) // We don't need to do that if the citation is a BibliographyCitation
         {                     
            foreach (PlaceholderCitation precedingPlaceholderCitation in citationManager.PlaceholderCitations)
            {                     
               FootnoteCitation precedingFootnoteCitation = precedingPlaceholderCitation as FootnoteCitation;
               
               if (precedingPlaceholderCitation == null || precedingPlaceholderCitation.Reference == null) continue;
               
               // Neither shortform nor cited reporter are needed if the only other match is this citation
               
               if (precedingPlaceholderCitation == thisPlaceholderCitation) continue;
               
               // I suppose we can also skip if the preceding footnote index is the same as the current one,
               // but it would be better to check if the two are in the same multiple citation
               
               if (precedingFootnoteCitation != null && thisFootnoteCitation != null)
               {
                  if (precedingFootnoteCitation.FootnoteIndex == thisFootnoteCitation.FootnoteIndex) continue;
               }
               
               // Let's check if the preceding placeholder citation is one of the current case
               
               if (!parallelReferencesList.Contains(precedingPlaceholderCitation.Reference)) continue;
               
               // First we see whether we need to indicate the cited reporter
               
               if (!hasNeutralReporter && hasParallelReporter && precedingPlaceholderCitation.Entry.PageRange != null) needsPrimaryReporter = true;
               
               // Now let us see whether a short form is used somewhere
               
               if (precedingPlaceholderCitation.PreviousCitation == null || precedingPlaceholderCitation.PreviousCitation.Reference == null) continue;
               
               if (citation.Reference.CitationKeyUpdateType == 0 || string.IsNullOrEmpty(citation.Reference.CitationKey)) continue;
               
               if (precedingFootnoteCitation == null) continue;
               
               FootnoteCitation prePrecedingFootnoteCitation = precedingFootnoteCitation.PreviousFootnoteCitation;         
               
               if (
                     // the otherFootnoteCitation should not be ibid, so it should meet one of the following sufficient conditions
                     // (1) it needs to be different from the citation immediately preceding it
                     precedingFootnoteCitation.Reference != prePrecedingFootnoteCitation.Reference ||
                     // (2) whatever that does
                     !precedingFootnoteCitation.IsRepeatingFootnote ||
                     // (3) it is one more than one footnote away from its predecessor
                     precedingFootnoteCitation.FootnoteIndex >= prePrecedingFootnoteCitation.FootnoteIndex + 2         
                  )
               {
                  needsShortformIntro = true;
                  break;
               }
               else
               {
                  continue;
               }
            }
         }
jay-squared
Citavi Expert
 


Return to Juristische Zitationsstile anwenden