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.

Neuen PageRange mit versch. StartPage und EndPage erzeugen

Fragen zur Bedienung von Citavi 5

Neuen PageRange mit versch. StartPage und EndPage erzeugen

Postby jay-squared » 2016-09-11 12:58

Systeminformationen: [ -, -, -, -, -, - ]

Liebes Citavi-Team,

das fällt wahrscheinlich unter die Kategorie "JJ macht sich zu viele Gedanken, und erwartet auch kurzfristig keine Antwort". Ich glaube aber dennoch, dass meine Frage durchaus vom allgemeinen Interesse ist, insbesondere für den, welcher sehr genau nachhalten möchte, welche Wissenselemente im Text bereits verarbeitet sind, und welche nicht.

Wie ich hier dargelegt habe, ist es u.U. besser, mehrere Nachweise aus dem selben Werk im Wege eines Mehrfachnachweises einzutragen, statt eines Nachweises mit mehreren Seitenbereichen. Denn nur der Mehrfachnachweis erlaubt, nachzuhalten, welche Wissenselemente verwendet wurden. Nun hat die bei am verlinkten Orte angebenene Lösung einen Nachteil: Sie funktioniert nicht, wenn die Seitenbereiche der Einzelnachweise des selben Titels überlappende oder direkt benachbarte Seiten haben. Sprich, da kann sowas rauskommen: "S. 35, 35, 36, 38-42, 43-45" obwohl es besser wäre, daraus würde "S. 35-36, 38-45".

Auch das geht. Und zwar, indem der Seitenbereich des ersten Nachweises des Titels im Mehrfachnachweis – per programmierter Komponente - alle Nachweise im aktuellen Mehrfachnachweis durchguckt, und dann alle Seitenbereiche des identischen Titels sammelt, und versucht, so weit wie möglich zu kombinieren. (Anm.: die Vorlage des wiederholten Nachweises des selben Titels im selben Mehrfachnachweis sollte dann so aussehen, dass sie einen statischen Text enthält, der durch nichts ersetzt wird. Weitere Anm.: wie man sogleich sehen wird, mache ich eine Ausnahme für solche Nachweise desselben Titels im selben Mehrfachnachweis, welcher einen definierten Präfix oder Suffix hat. Ich denke, der Grund ist klar.)

Das geht auch per Code, aber mein Code hat ein kleines Schönheitsproblem. Mir gelingt es nicht, ein neuen PageRange zu definieren, der eine Startseite verschieden von der Endseite hat.

Code: Select all
PageRange pageRange = new PageRange(35, 36)

klappt nicht, da "new PageRange" keine zwei Argumente nimmt.

Code: Select all
PageRange pageRange = new PageRange();
pageRange.StartPage = 35;
pageRange.EndPage = 36;

klappt nicht, da StartPage und EndPage read-only sind.

Code: Select all
PageRange pageRange = new PageRange();
pageRange = pageRange.Update("35-36")

klappt nicht, da dies nur StartPage definiert, nicht aber EndPage.

Ich habe mich jetzt damit beholfen, dass ich eine eigene Klasse definiert habe, welche in der Tat zwei Argumente nimmt, aber das gelbe vom Ei ist das ersichtlich nicht, weil beim Wechsel von PageRange zu meiner eigenen Klasse ParsedPageRange zwangsläufig was verloren geht. So gehe ich derzeit vor (Code zugebenermaßen auch insgesamt etwas inkomplett, läuft aber):

Code: Select all
using System;
using System.Linq;
using System.Collections.Generic;
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;         
         var output = new TextUnitCollection();
         
         PlaceholderCitation thisPlaceholderCitation = citation as PlaceholderCitation;
         if (thisPlaceholderCitation == null) return null;
         
         CitationManager citationManager = thisPlaceholderCitation.CitationManager;                  
         
         // Literal Text Units
         
         LiteralTextUnit spaceLiteral = new LiteralTextUnit(" ", FontStyle.Neutral);
         LiteralTextUnit commaLiteral = new LiteralTextUnit(",", FontStyle.Neutral);   
         
         // Page
         
         LiteralTextUnit pinpointPagePrefixAfterNumberLiteral = new LiteralTextUnit("");
         LiteralTextUnit pinpointPagePrefixLiteral = new LiteralTextUnit(" at ");
         
         // Margins
         
         LiteralTextUnit pinpointMarginPrefixAfterNumberLiteral = new LiteralTextUnit("");
         LiteralTextUnit pinpointMarginSingleMarginPrefixLiteral = new LiteralTextUnit(" at para ");
         LiteralTextUnit pinpointMarginMultipleMarginsPrefixLiteral = new LiteralTextUnit(" at paras ");
         
         LiteralTextUnit pinpointPageRangeSeparatorLiteral = new LiteralTextUnit("–");

         LiteralTextUnit pinpointMarginsOuterPrefixLiteral = new LiteralTextUnit("");
         LiteralTextUnit pinpointMarginsOuterSuffixLiteral = new LiteralTextUnit("");
         LiteralTextUnit pinpointMarginsInnerPrefixLiteral = new LiteralTextUnit("");
         LiteralTextUnit pinpointMarginsInnerSuffixLiteral = new LiteralTextUnit("");
         
         LiteralTextUnit pinpointMarginsRangeSeparatorLiteral = new LiteralTextUnit("–");
         
         LiteralTextUnit rangeSeparatorLiteral = new LiteralTextUnit(string.Empty);
         LiteralTextUnit pinpointPrefixLiteral = new LiteralTextUnit(string.Empty);
         
         // Collecting the page ranges
         
         List<PlaceholderCitation> placeholderCitationsList = citationManager.PlaceholderCitations.ToList().Where(p =>
            p.Entry.Placeholder == thisPlaceholderCitation.Entry.Placeholder &&
            p.PageRange.NumberingType == thisPlaceholderCitation.PageRange.NumberingType &&
            string.IsNullOrEmpty(p.Entry.Suffix) &&
            string.IsNullOrEmpty(p.Entry.Prefix)         
            ).ToList();
         
         List<PageRange> pageRangesList = new List<PageRange>();
                  
         List<LiteralTextUnit> pinpointsLiteralList = new List<LiteralTextUnit>();
         
         foreach (PlaceholderCitation placeholderCitation in placeholderCitationsList)
         {
            if (placeholderCitation.PageRange != null)
            {            
               pageRangesList.Add(placeholderCitation.PageRange);
            }
         }
         
         List<ParsedPageRange> parsedPageRangeList = new List<ParsedPageRange>();
         parsedPageRangeList = MergeAdjacent(pageRangesList);
         
         if (parsedPageRangeList.Count > 0)
         {
            
            if (thisPlaceholderCitation.PageRange.NumberingType == NumberingType.Page)
            {
               rangeSeparatorLiteral = pinpointPageRangeSeparatorLiteral;
               pinpointPrefixLiteral = pinpointPagePrefixLiteral;
            }
            
            pinpointsLiteralList.Add(pinpointPrefixLiteral);
            
         }
         
         int i = 0;
         
         foreach (ParsedPageRange parsedPageRange in parsedPageRangeList)
         {
            if (i > 0)
            {
               pinpointsLiteralList.Add(commaLiteral);
               pinpointsLiteralList.Add(spaceLiteral);
            }
            
            pinpointsLiteralList.Add(new LiteralTextUnit(parsedPageRange.StartPage.ToString()));
            
            if (parsedPageRange.EndPage.CompareTo(parsedPageRange.StartPage) > 0)
            {
               pinpointsLiteralList.Add(rangeSeparatorLiteral);
               pinpointsLiteralList.Add(new LiteralTextUnit(parsedPageRange.EndPage.ToString()));
            }
            
            i = i +1;
         }
         
         if (pinpointsLiteralList.Count > 0)
         {
            output.AddRange(pinpointsLiteralList);
         }         

         return output;
      }
      public static List<ParsedPageRange> MergeAdjacent(List<PageRange> pageRangesList)
       {
         List<ParsedPageRange> newList = new List<ParsedPageRange>();
         
         pageRangesList.Sort((x, y) => x.StartPage.CompareTo(y.StartPage));
         
         PageNumber currentEndPage = pageRangesList[0].EndPage;
           PageNumber currentStartPage = pageRangesList[0].StartPage;
         
         var first = pageRangesList.FirstOrDefault();
         var last = pageRangesList.Last();
         foreach (PageRange item in pageRangesList)
         {
            bool IsDiscreteRange = false;
                        
            if (pageRangesList.Count == 1)
            {
               newList.Add(new ParsedPageRange(currentStartPage, currentEndPage));
               break;
            }
            else if (item == first)
            {
               continue;
            }
            else if (item.StartPage.CompareTo(currentStartPage) >= 0 && item.EndPage.CompareTo(currentEndPage) <= 0)
            {
               // schieb nen Ruhigen, der aktuelle Seitenbereich ist eh schon enthalten
            }
            else if (item.StartPage.Number.GetValueOrDefault().CompareTo(currentEndPage.Number.GetValueOrDefault() + 1) < 1 )
            {
               currentEndPage = item.EndPage;
            }
            else
            {
               IsDiscreteRange = true;
            }
                        
            if (IsDiscreteRange)
            {
               newList.Add(new ParsedPageRange(currentStartPage, currentEndPage));
               currentStartPage = item.StartPage;
               currentEndPage  = item.EndPage;               
            }
            if ((newList.Count == 0 || IsDiscreteRange) && item == last)
            {
               newList.Add(new ParsedPageRange(currentStartPage, currentEndPage));
            }
         }         
         return newList;
       }
   }
   public class ParsedPageRange
    {
      public PageNumber StartPage { get; set; }
      public PageNumber EndPage { get; set; }
      
      public ParsedPageRange(PageNumber startPage, PageNumber endPage)
       {
           StartPage = startPage;
         EndPage = endPage;
       }
   }
}
jay-squared
Citavi Expert
 

Re: Neuen PageRange mit versch. StartPage und EndPage erzeug

Postby lutzeslife » 2016-09-11 15:59

Hallo JJ,

auch wenn ich nicht der Support bin, antworte ich mal kurz. Bei PageRange handelt es sich um ein Struct. Diese verhält sich anders als Klassen in C#. Das heißt, immer wenn du es irgendwo zuweist, wird eine Kopie des Originals ohne Referenz erzeugt (genaueres im Netz zu finden)

Code: Select all
foreach (PlaceholderCitation placeholderCitation in placeholderCitationsList)
         {
            if (placeholderCitation.PageRange != null)
            {           
               pageRangesList.Add(placeholderCitation.PageRange);
            }
         }


Du erzeugst hier jedes Mal eine Kopie des PagRange Objektes weswegen deine Änderungen sich nicht auswirken.

Code: Select all
PageRange pageRange = new PageRange();
pageRange = pageRange.Update("35-36")


Das ist der richtige Ansatz, nur dass du es nicht dem Original zuweist. Ich bin jetzt nicht ganz firm, was Zitation angeht, aber du holst ja das PageRange-Objekt aus:

Code: Select all
 foreach (PlaceholderCitation placeholderCitation in placeholderCitationsList)
         {
            if (placeholderCitation.PageRange != null)
            {           
               pageRangesList.Add(placeholderCitation.PageRange);
            }
         }


Wenn du also den PageRange des placeholderCitation Objektes ändern will, dann musst du ihm die Änderung auch direkt zuweisen:

Code: Select all
 foreach (PlaceholderCitation placeholderCitation in placeholderCitationsList)
         {
            if (placeholderCitation.PageRange != null)
            {           
               placeholderCitation.PageRange = placeholderCitation.PageRange.Update("44-55")
            }
         }


Ich hoffe, das war verständlich. Wenn es nur darum geht, statt der eigenen Klasse ein - ich nenne es mal - Dummy-Objekt zu erzeugen, um die Zahlen zu ändern, dann sollte es so gehen:

Code: Select all
 foreach (PageRange item in pageRangesList)
         {
            bool IsDiscreteRange = false;
                       
            if (pageRangesList.Count == 1)
            {
               newList.Add(pageRange.Update(string.format("{0}-{1}",currentStartPage.OriginalString, currentEndPage.OriginalString)));
               break;
            }


Da du hier ...

Code: Select all
pinpointsLiteralList.Add(new LiteralTextUnit(parsedPageRange.StartPage.ToString()));
           
            if (parsedPageRange.EndPage.CompareTo(parsedPageRange.StartPage) > 0)
            {
               pinpointsLiteralList.Add(rangeSeparatorLiteral);
               pinpointsLiteralList.Add(new LiteralTextUnit(parsedPageRange.EndPage.ToString()));
            }


... nur mit den strings arbeitest, brauchst du ja eigentlich kein Dummy Objekt. Und das Arbeiten mit deiner eigenen Klasse sollte damit auch keine Probleme bereiten. Falls du das mit dem Struct testen willst, hier einfach entsprechend im MacroEditor und einer Testdatei ...

Code: Select all
   public static void Main()
   {

         //if this macro should ALWAYS affect all titles in active project, choose first option
         //if this macro should affect just filtered rows if there is a filter applied and ALL if not, choose second option
         
         //ProjectReferenceCollection references = Program.ActiveProjectShell.Project.References;      
         List<Reference> references = Program.ActiveProjectShell.PrimaryMainForm.GetFilteredReferences();
         
         //if we need a ref to the active project
         SwissAcademic.Citavi.Project activeProject = Program.ActiveProjectShell.Project;
         
         
         Reference reference = references.FirstOrDefault();
      
         if(reference!=null)
         {

         // 1. das Original wird ersetzt   
         reference.PageRange= reference.PageRange.Update("66-67");
         
         // 2. Kopie wird erzeugt => keine Auswirkungen auf das Original Objekt
         //var pageRange = reference.PageRange;   
         //pageRange=pageRange.Update("70-77");
         
         // 3. Wert aus der Kopie wird wieder in das Original zurück geschrieben
         //var pageRange = reference.PageRange;   
         //reference.PageRange=pageRange.Update("70-77");
         }
      
   }


Gruß
Daniel
lutzeslife
 

Re: Neuen PageRange mit versch. StartPage und EndPage erzeug

Postby lutzeslife » 2016-09-11 18:04

Hey JJ,

falls du nicht jedes mal eine neue Klasse anlegen willst, für solche kleinen Zwecke würden auch Tupel gehen:

Beschreibung

Gruß

Daniel
lutzeslife
 

Re: Neuen PageRange mit versch. StartPage und EndPage erzeug

Postby jay-squared » 2016-09-11 19:51

Hallo Daniel,

perfekt. Das mit den Kopien des Originals hatte ich - da es im anderen Kontext schon mal vorkam - schon vermutet. Werde mich wohl mal in die Struct einlesen müssen. Ich wollte das mit dem .Update am selben Objekt nur nicht unversucht lassen.

Ich habe mich für die Dummy-Methode erschienen, da ich ja vielleicht auch mal komplexere Sachen als nur die Ausgabe des Strings machen möchte. Dass war im Prinzip auch das, was mich an der eigenen Klasse gestört hat. Wenn ich in einem Kontext bin, in dem ich dann doch auch den NumberingType verwursten möchte, wird es meiner Ansicht nach irgendwann zu komplex, eine komplette Klasse zu bauen, bloß um alle Eigenschaften parat zu haben, wenn ich das genauso gut über Dummy-Objekte des Original-Struct lösen kann. Ich weiß nur nicht, wie ich selber auf die Idee gekommen wäre, dass

Code: Select all
Update(string.format("{0}-{1}",currentStartPage.OriginalString, currentEndPage.OriginalString))


die Methode ist, ein PageRange mit Anfang und Ende zu bekommen.

Eine kleine Ergänzung für Mitleser: da pageRange vorher nicht definiert ist, klappt das nur in der Form:

Code: Select all
PageRange pageRange = new PageRange();
               newList.Add(pageRange.Update(string.Format("{0}-{1}",currentStartPage.OriginalString, currentEndPage.OriginalString)));


Und man muss natürlich überall im Vergleich zu meiner Ausgangsmethode die Art der Liste ändern, da diese ja jetzt nicht mehr die Sonderanfertigung der Klasse nimmt.

Nochmal vielen Dank!

Beste Grüße
JJ
jay-squared
Citavi Expert
 

Re: Neuen PageRange mit versch. StartPage und EndPage erzeug

Postby lutzeslife » 2016-09-11 20:07

Hallo JJ,

das mit den .OriginStrings ist mir nur gekommen über IntelliSense des MacroEditors. Wenn du bei einem Objekt einen . setzt kommt doch so eine kleine Context-Anzeige welche Methoden und Eigenschaften verfügbar sind. Darüber findet man die Update() Methode. Wenn du "pageRange.Update(" eingibst, dann wird ja eine IntelliSense (diese kleinen Popups) Hilfe angezeigt welche Methodenvarianten bei Update() es gibt. Grundsätzlich schaue ich welche Werte zurück gegeben werden von den einzelnen Eigenschaften.

Code: Select all
Update(string.format("{0}-{1}",currentStartPage.OriginalString, currentEndPage.OriginalString))

PageRange ist recht intelligent und versucht den string zu parsen. Das geht in der Regel gut. OriginalString ist ja nur die originale Zeichenkette die beim Erstellen vorlag.

Vielleicht solltest du noch eine angepasste Version posten, dann kann ich auch nochmal schauen ob mir was auffällt ;)

Gruß
Daniel
lutzeslife
 

Re: Neuen PageRange mit versch. StartPage und EndPage erzeug

Postby jay-squared » 2016-09-11 21:16

Hallo Daniel,

Danke für den Einsatz.

Ich glaube, meine anfängliche Variante

Code: Select all
pageRange = pageRange.Update("35-36")
newList.Add(pageRange)


bzw.

Code: Select all
pageRange = pageRange.Update(currentStartPage.ToString() + "-" + currentEndPage.ToString() )
newList.Add(pageRange)


kommt Deiner ja doch recht nahe – wenngleich bei weitem nicht so elegant, aber irgendwie wollte er es damit nicht. Das kann allerdings auch damals daran gelegen haben, dass mein Test mit dem "wann ist ein Seitenbereich nah dran, wann nicht" noch nicht so 100% funktioniert. Man muss auch noch den Fall abfedern, dass es keinen OriginalString für die EndPage gibt, was ich jetzt per

Code: Select all
if(string.IsNullOrEmpty(currentEndPage.OriginalString)) currentEndPage = currentStartPage;
mache.

Im Ganzen bin ich jetzt soweit:

Code: Select all
using System;
using System.Linq;
using System.Collections.Generic;
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;         
         var output = new TextUnitCollection();
         
         PlaceholderCitation thisPlaceholderCitation = citation as PlaceholderCitation;
         if (thisPlaceholderCitation == null) return null;
         
         CitationManager citationManager = thisPlaceholderCitation.CitationManager;                  
         
         // Literal Text Units
         
         LiteralTextUnit spaceLiteral = new LiteralTextUnit(" ", FontStyle.Neutral);
         LiteralTextUnit commaLiteral = new LiteralTextUnit(",", FontStyle.Neutral);   
         
         // Page
         
         LiteralTextUnit pinpointPagePrefixAfterNumberLiteral = new LiteralTextUnit("");
         LiteralTextUnit pinpointPagePrefixLiteral = new LiteralTextUnit(" at ");
         
         // Margins
         
         LiteralTextUnit pinpointMarginPrefixAfterNumberLiteral = new LiteralTextUnit("");
         LiteralTextUnit pinpointMarginSingleMarginPrefixLiteral = new LiteralTextUnit(" at para ");
         LiteralTextUnit pinpointMarginMultipleMarginsPrefixLiteral = new LiteralTextUnit(" at paras ");
         
         LiteralTextUnit pinpointPageRangeSeparatorLiteral = new LiteralTextUnit(" to ");

         LiteralTextUnit pinpointMarginsOuterPrefixLiteral = new LiteralTextUnit("");
         LiteralTextUnit pinpointMarginsOuterSuffixLiteral = new LiteralTextUnit("");
         LiteralTextUnit pinpointMarginsInnerPrefixLiteral = new LiteralTextUnit("");
         LiteralTextUnit pinpointMarginsInnerSuffixLiteral = new LiteralTextUnit("");
         
         LiteralTextUnit pinpointMarginsRangeSeparatorLiteral = new LiteralTextUnit(" to ");
         
         LiteralTextUnit rangeSeparatorLiteral = new LiteralTextUnit(string.Empty);
         LiteralTextUnit pinpointPrefixLiteral = new LiteralTextUnit(string.Empty);
         
         // Collecting the page ranges
         
         List<PlaceholderCitation> placeholderCitationsList = citationManager.PlaceholderCitations.ToList().Where(p =>
            p.Entry.Placeholder == thisPlaceholderCitation.Entry.Placeholder &&
            p.PageRange.NumberingType == thisPlaceholderCitation.PageRange.NumberingType &&
            string.IsNullOrEmpty(p.Entry.Suffix) &&
            string.IsNullOrEmpty(p.Entry.Prefix)         
            ).ToList();
         
         List<PageRange> pageRangesList = new List<PageRange>();
                  
         List<LiteralTextUnit> pinpointsLiteralList = new List<LiteralTextUnit>();
         
         foreach (PlaceholderCitation placeholderCitation in placeholderCitationsList)
         {
            if (placeholderCitation.PageRange != null)
            {            
               pageRangesList.Add(placeholderCitation.PageRange);
            }
         }
         
         List<PageRange> parsedPageRangeList = new List<PageRange>();
         parsedPageRangeList = MergeAdjacent(pageRangesList);
         
         if (parsedPageRangeList.Count > 0)
         {
            
            if (thisPlaceholderCitation.PageRange.NumberingType == NumberingType.Page)
            {
               rangeSeparatorLiteral = pinpointPageRangeSeparatorLiteral;
               pinpointPrefixLiteral = pinpointPagePrefixLiteral;
            }
            
            pinpointsLiteralList.Add(pinpointPrefixLiteral);
            
         }
         
         int i = 0;
         
         foreach (PageRange parsedPageRange in parsedPageRangeList)
         {
            if (i > 0)
            {
               pinpointsLiteralList.Add(commaLiteral);
               pinpointsLiteralList.Add(spaceLiteral);
            }
            
            pinpointsLiteralList.Add(new LiteralTextUnit(parsedPageRange.StartPage.ToString()));
            
            if (parsedPageRange.EndPage.CompareTo(parsedPageRange.StartPage) > 0)
            {
               pinpointsLiteralList.Add(rangeSeparatorLiteral);
               pinpointsLiteralList.Add(new LiteralTextUnit(parsedPageRange.EndPage.ToString()));
            }
            
            i = i +1;
         }
         
         if (pinpointsLiteralList.Count > 0)
         {
            output.AddRange(pinpointsLiteralList);
         }         

         return output;
      }
      public static List<PageRange> MergeAdjacent(List<PageRange> pageRangesList)
       {
         List<PageRange> newList = new List<PageRange>();
         
         pageRangesList.Sort((x, y) => x.StartPage.CompareTo(y.StartPage));
         
         PageNumber currentEndPage = pageRangesList[0].EndPage;
           PageNumber currentStartPage = pageRangesList[0].StartPage;
         
         if(string.IsNullOrEmpty(currentEndPage.OriginalString)) currentEndPage = currentStartPage;
         
         var first = pageRangesList.FirstOrDefault();
         var last = pageRangesList.Last();
         foreach (PageRange item in pageRangesList)
         {
            bool IsDiscreteRange = false;
                        
            if (pageRangesList.Count == 1)
            {
               //newList.Add(new ParsedPageRange(currentStartPage, currentEndPage));
               PageRange pageRange = new PageRange();
               newList.Add(pageRange.Update(string.Format("{0}-{1}",currentStartPage.OriginalString, currentEndPage.OriginalString)));
               break;
            }
            else if (item == first)
            {
               continue;
            }
            else if (item.StartPage.CompareTo(currentStartPage) >= 0 && item.EndPage.CompareTo(currentEndPage) <= 0)
            {
               // schieb nen Ruhigen, der aktuelle Seitenbereich ist eh schon enthalten
            }
            else if (item.StartPage.Number.GetValueOrDefault().CompareTo(currentEndPage.Number.GetValueOrDefault() + 1) < 1 )
            {
               currentEndPage = item.EndPage;
               if(string.IsNullOrEmpty(currentEndPage.OriginalString)) currentEndPage = item.StartPage;
            }
            else
            {
               IsDiscreteRange = true;
            }
                        
            if (IsDiscreteRange)
            {
               PageRange pageRange = new PageRange();
               newList.Add(pageRange.Update(string.Format("{0}-{1}",currentStartPage.OriginalString, currentEndPage.OriginalString)));
               currentStartPage = item.StartPage;
               currentEndPage  = item.EndPage;
               if(string.IsNullOrEmpty(currentEndPage.OriginalString)) currentEndPage = currentStartPage;
            }
            if ((newList.Count == 0 || IsDiscreteRange) && item == last)
            {
               PageRange pageRange = new PageRange();
               newList.Add(pageRange.Update(string.Format("{0}-{1}",currentStartPage.OriginalString, currentEndPage.OriginalString)));
            }
         }         
         return newList;
       }
   }
}


Das ganze ist halt leider noch nicht fertig, weil ich a) noch nicht sicher bin, ob das kollabieren der überlappenden oder angrenzenden Seitenbereiche 100% funktioniert, und b) Endziel halt ist, dass auch die NumberingTypes mit übernommen werden (also ein Doppelupdate des Dummy-Objekts), so dass danach unterschieden werden kann. Das ist aber im Prinzip reine Frickelarbeit.

Beste Grüße
JJ
jay-squared
Citavi Expert
 


Return to Citavi 5 Support (Deutsch)