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.

Rückverweise im Literaturverzeichnis

Vorlagen helfen, Wenn-Dann-Regeln auf Formatierungen anzuwenden. Hier finden Sie zusätzliche Vorlagen.

Rückverweise im Literaturverzeichnis

Postby jay-squared » 2016-02-04 17:40

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

Liebes Citavi-Team,

folgendes mehr unter der Kategorie: JJ gibt an (bzw. als Referenz, wenn irgendwann mal jemand ein ähnliches Anliegen hat).

Im Nachgang an diesen Thread. Da ich im Literaturverzeichnis eine Liste aller Fußnoten anlegen kann, die den zitierten Titel enthalten, und ein Word-Makro aus der Fußnotennummer die Seite auslesen kann, kann ich per Kombination aus Citavi-Komponente und Word-VBA-Makro eine Entscheidungsliste erstellen, welche Rückverweise enthält, und so alle Seiten aufzählt, welche eine Fußnote mit dem entsprechenden Titel enthalten.

Dafür nehme ich etwa eine Komponente mit folgendem Komponentenfilter als letzte Komponente in eine Literaturverzeichnisvorlage auf:

Code: Select all
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;      
         
         bool boolTitleSequenceNumber = true;
         
         string stringPrefix = "\t";         
         string stringFootnoteIndexPrefix = "#";
         string stringFootnoteIndexSuffix = "#";
         
         Reference thisReference = citation.Reference;
         string stringBackReferences = "";
         var citationManager = citation.CitationManager;
         
         List<string> listOfFootnotes = new List<string>();
         
         for (int i = 0; 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 thisFootnoteCitation;
               
               try   {thisFootnoteCitation  = citationManager.FootnoteCitations[i];}
               catch {break;}
               
               if (thisFootnoteCitation == null || thisFootnoteCitation.Reference == null) continue;
               
               if (thisFootnoteCitation.Reference == thisReference)
               {
                  if (boolTitleSequenceNumber)
                  {
                     listOfFootnotes.Add(stringFootnoteIndexPrefix + citation.Reference.SequenceNumber + ":" + thisFootnoteCitation.FootnoteIndex.ToString() + stringFootnoteIndexSuffix);
                  }
                  else
                  {
                     listOfFootnotes.Add(stringFootnoteIndexPrefix + thisFootnoteCitation.FootnoteIndex.ToString() + stringFootnoteIndexSuffix);
                  }
                  continue;
               }               
            }
         
            var output = new TextUnitCollection();
            if (listOfFootnotes.Count > 0)
            {               
               output.Add(new LiteralTextUnit(stringPrefix));
               if (boolTitleSequenceNumber)
               {
                  stringBackReferences = string.Join("", listOfFootnotes);
               }
               else
               {
                  stringBackReferences = string.Join(", ", listOfFootnotes);      
               }
               output.Add(new LiteralTextUnit(stringBackReferences));
            }               
            return output;         
      }
   }
}


In Word lege ich dann folgendes Makro an:

Code: Select all

Sub ConvertFootnoteReferencesToPageReferences()

    Dim intCount As Integer
   
    Dim intLastPageNumber As Integer
    Dim intPageNumber As Integer
    Dim intFootnoteIndex As Integer
    Dim stringFootnoteIndex As String
    Dim stringSelection As String
    Dim stringSequenceNumberAndFootnoteIndex As String
    Dim stringSequenceNumber As String
    Dim stringLastSequenceNumber As String
   
    intLastPageNumber = 0

    Selection.HomeKey Unit:=wdStory

    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "(#)([0-9:]@)(#)"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute
   
    stringSelection = Selection.Text
    stringFootnoteIndex = Split(stringSelection, ":")(1)
    stringFootnoteIndex = TestRegExp("([0-9]+)", stringFootnoteIndex)
    stringSequenceNumber = Split(stringSelection, ":")(0)
    stringSequenceNumber = TestRegExp("([0-9]+)", stringSequenceNumber)
   
    intPageNumber = ActiveDocument.Footnotes(stringFootnoteIndex).Reference.Information(wdActiveEndPageNumber)
   
    If (Not stringSequenceNumber = stringLastSequenceNumber) Then
        Selection.Text = intPageNumber
    ElseIf (Not intPageNumber = intLastPageNumber) Then
        Selection.Text = ", " + intPageNumber
    Else
        Selection.Text = ""
    End If
   
    intLastPageNumber = intPageNumber
    stringLastSequenceNumber = stringSequenceNumber
   
    Selection.HomeKey Unit:=wdStory
   
    Do While Selection.Find.Found = True And iCount < 1000
        intCount = intCount + 1
   
        Selection.HomeKey Unit:=wdStory
        Selection.Find.Execute

        If Selection.Find.Found Then
             Selection.Find.ClearFormatting
             Selection.Find.Replacement.ClearFormatting
             With Selection.Find
                 .Text = "(#)([0-9:]@)(#)"
                 .Replacement.Text = ""
                 .Forward = True
                 .Wrap = wdFindContinue
                 .Format = False
                 .MatchCase = False
                 .MatchWholeWord = False
                 .MatchAllWordForms = False
                 .MatchSoundsLike = False
                 .MatchWildcards = True
             End With
             Selection.Find.Execute
             
             stringSelection = Selection.Text
             stringFootnoteIndex = Split(stringSelection, ":")(1)
             stringFootnoteIndex = TestRegExp("([0-9]+)", stringFootnoteIndex)
             stringSequenceNumber = Split(stringSelection, ":")(0)
             stringSequenceNumber = TestRegExp("([0-9]+)", stringSequenceNumber)
           
             intPageNumber = ActiveDocument.Footnotes(stringFootnoteIndex).Reference.Information(wdActiveEndPageNumber)
           
            If (Not stringSequenceNumber = stringLastSequenceNumber) Then
                Selection.Text = intPageNumber
            ElseIf (Not intPageNumber = intLastPageNumber) Then
                Selection.Text = ", " & intPageNumber
            Else
                Selection.Text = ""
            End If

             
             intLastPageNumber = intPageNumber
             stringLastSequenceNumber = stringSequenceNumber
             
             Selection.HomeKey Unit:=wdStory
        End If
    Loop
End Sub

  Function TestRegExp(myPattern As String, myString As String)
   'Create objects.
   Dim objRegExp As RegExp
   Dim objMatch As Match
   Dim colMatches   As MatchCollection
   Dim RetStr As String

   ' Create a regular expression object.
   Set objRegExp = New RegExp

   'Set the pattern by using the Pattern property.
   objRegExp.Pattern = myPattern

   ' Set Case Insensitivity.
   objRegExp.IgnoreCase = True

   'Set global applicability.
   objRegExp.Global = True

   'Test whether the String can be compared.
   If (objRegExp.Test(myString) = True) Then

   'Get the matches.
    Set colMatches = objRegExp.Execute(myString)   ' Execute search.

    For Each objMatch In colMatches   ' Iterate Matches collection.
      RetStr = objMatch.Value
    Next
   Else
   End If
   TestRegExp = RetStr
End Function


Und voilà. Man beachte, dass das Word-Makro schlau genug ist, Fußnoten auf der selben Seite des selben Titels und Fußnoten auf der selben Seite aber bei verschiedenen Titeln zu unterscheiden. Ist immer noch nicht so schön, wie eine reine Citavi-interne Lösung, aber vielleicht von Nutzen für Leute, welche Rückverweise in ihrem Literaturverzeichnis erstellen wollen, etwa für Entscheidungslisten.

Vorher

Vorher.png


Nachher

Nachher.png
jay-squared
Citavi Expert
 

Re: Rückverweise im Literaturverzeichnis

Postby jay-squared » 2016-02-04 17:51

Hmm, das hab ich wohl ins falsche Unterforum geschrieben. Kann man Beiträge nachträglich verschieben?
jay-squared
Citavi Expert
 

Re: Rückverweise im Literaturverzeichnis

Postby Jennifer Schultz » 2016-02-05 17:13

Hallo jay-squared,

das können Administrator machen. Soll ich das Posting in das Unterforum "Juristische Zitationssile anwenden" verschieben?

Vielen Dank für die schöne Lösung!

Freundliche Grüsse
Jennifer
Jennifer Schultz
Citavi Customer Service
 

Re: Rückverweise im Literaturverzeichnis

Postby jay-squared » 2016-02-05 17:31

Liebe Frau Schultz,

ich bin da auch ein wenig unsicher. Im Prinzip kann das ja auch für andere Disziplinen interessant sein, diese Rückverweise zu nutzen. Mein Anwendungsfall sind Entscheidungslisten, aber wer weiß, vielleicht möchte ein Historiker auflisten, wo er welche Quellen auswertet, etc. Ich hoffe ja übrigens sehr, dass das auch andere Leute nützlich finden, und das hier nicht bei reiner Angeberei meinerseits bleibt.

Ich neige zum wunderschön benannten Forum "Mit Vorlagen komplexe Formatierungen erzeugen", da es ja letztendlich darum geht, in Literaturverzeichnisvorlagen Rückverweise auszudrucken.

Herzliche Grüße
JJ
jay-squared
Citavi Expert
 

Re: Rückverweise im Literaturverzeichnis

Postby jay-squared » 2017-08-13 12:55

Ich hab das Word-Makro mal upgedated, damit zusammenhängende Seitenbereiche kollabiert werden, also 23-25 statt 23, 24, 25 als Rückverweis im Literaturverzeichnis steht. Eine Anmerkung: das Makro geht nicht mehr als 500 Platzhalter auf einmal durch. Das kann man leicht erhöhen, aber da es relativ ineffizient ist, habe ich diese Beschränkung eingebaut, damit der Computer nicht vollkommen außer Gefecht gesetzt wird.

Code: Select all
Sub ConvertFootnoteReferencesToPageReferences()

    Application.ScreenUpdating = False

    Dim intCount As Integer
   
    Dim intLastPageNumber As Integer
    Dim intPageNumber As Integer
    Dim intFootnoteIndex As Integer
    Dim stringFootnoteIndex As String
    Dim stringSelection As String
    Dim stringSequenceNumberAndFootnoteIndex As String
    Dim stringSequenceNumber As String
    Dim stringLastSequenceNumber As String
   
    Dim lastSelection As Range
   
    intLastPageNumber = -1
    stringLastSequenceNumber = -1
    stringLastLastSequenceNumber = -2
   
    Selection.HomeKey Unit:=wdStory

    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "(\{#)([0-9:]@)(\})"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute
   
    Selection.HomeKey Unit:=wdStory
   
    Set lastSelection = Selection.Range
   
    Do While Selection.Find.Found = True And intCount < 500
       
        intCount = intCount + 1

        With Selection.Find
            .Text = "(\{#)([0-9:]@)(\})"
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchAllWordForms = False
            .MatchSoundsLike = False
            .MatchWildcards = True
        End With
        Selection.Find.Execute
       
        Set currentSelection = Selection.Range
           
        If Selection.Find.Found Then
            stringSelection = Selection.Text
            stringFootnoteIndex = Split(stringSelection, ":")(1)
            stringFootnoteIndex = TestRegExp("([0-9]+)", stringFootnoteIndex)
            stringSequenceNumber = Split(stringSelection, ":")(0)
            stringSequenceNumber = TestRegExp("([0-9]+)", stringSequenceNumber)
        Else
            stringFootnoteIndex = ""
            stringSequenceNumber = ""
        End If
           
        intPageNumber = ActiveDocument.Footnotes(stringFootnoteIndex).Reference.Information(wdActiveEndPageNumber)
       
        IsFirstPageOfReference = False
        IsInTheMiddleOfRange = False
        IsLastPartOfRange = False
        IsFirstOfRange = False
       
        If (Not stringLastSequenceNumber = stringLastLastSequenceNumber) _
            Then
            IsFirstPageOfReference = True
        ElseIf (stringLastSequenceNumber = stringLastLastSequenceNumber) _
            And (stringLastSequenceNumber = stringSequenceNumber) _
            And (intLastPageNumber <= intLastLastPageNumber + 1) _
            And (intLastPageNumber >= intPageNumber - 1) _
            Then
            IsInTheMiddleOfRange = True
        ElseIf (stringLastSequenceNumber = stringLastLastSequenceNumber) _
            And (intLastPageNumber <= intLastLastPageNumber + 1) _
            Then
            IsLastPartOfRange = True
        Else
            IsFirstOfRange = True
        End If
       
        If (IsFirstPageOfReference) Then
            lastSelection.Text = intLastPageNumber
        ElseIf (IsFirstOfRange) Then
            lastSelection.Text = ", " & intLastPageNumber
        ElseIf (IsInTheMiddleOfRange) Then
            lastSelection.Text = ""
        ElseIf (IsLastPartOfRange) Then
            lastSelection.Text = "-" & intLastPageNumber
        End If
       
        ' MsgBox "Last Selection: " & lastSelection.Text & vbCrLf & _
            "IsFirstPageOfReference: " & IsFirstPageOfReference & vbCrLf & _
            "IsInTheMiddleOfRange: " & IsInTheMiddleOfRange & vbCrLf & _
            "IsLastPartOfRange: " & IsLastPartOfRange & vbCrLf & _
            "IsFirstOfRange: " & IsFirstOfRange & vbCrLf & _
            "Last Page: " & intLastPageNumber & vbCrLf & _
            "Last Last Page: " & intLastLastPageNumber & vbCrLf & _
            "Next Page: " & intPageNumber

        Selection.Move Unit:=wdCharacter, Count:=-1
       
        With Selection.Find
            .Text = "(\{#)([0-9:]@)(\})"
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchAllWordForms = False
            .MatchSoundsLike = False
            .MatchWildcards = True
        End With
        Selection.Find.Execute
       
        Set currentSelection = Selection.Range
       
        Set lastSelection = currentSelection
       
        intLastLastPageNumber = intLastPageNumber
        stringLastLastSequenceNumber = stringLastSequenceNumber
       
        intLastPageNumber = intPageNumber
        stringLastSequenceNumber = stringSequenceNumber
       
    Loop
   
    Application.ScreenUpdating = True
   
End Sub


Bei der Gelegenheit auch ein Update des Citavi-Komponentencodes, der jetzt optional schöne Fußnotenverweise oder die Platzhalter für die Seitenverweise druckt. Das Word-Makro funktioniert nicht mehr mit dem alten Komponentencode, da die Platzhalter nun anders aussehen.

Code: Select all
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;
      
      // User Options
      
      bool UsePageBackReferences = true;
      
      LiteralTextUnit globalPrefixSingleLiteral = new LiteralTextUnit("\t", FontStyle.Neutral);
      LiteralTextUnit globalPrefixMultipleLiteral = new LiteralTextUnit("\t", FontStyle.Neutral);
      LiteralTextUnit globalSuffixLiteral = new LiteralTextUnit(".", FontStyle.Neutral);
      
      LiteralTextUnit individualPrefixLiteral = new LiteralTextUnit("", FontStyle.Neutral);
      LiteralTextUnit individualSuffixLiteral = new LiteralTextUnit("", FontStyle.Neutral);
      
      LiteralTextUnit genericSeperatorLiteral = new LiteralTextUnit(", ", FontStyle.Neutral);
      LiteralTextUnit lastSeperatorLiteral = new LiteralTextUnit(" & ", FontStyle.Neutral);
      
      FontStyle footnoteIndexFontStyle = FontStyle.Neutral;
      
      // Static Variables
      
      if (citation == null) return null;
      
      Reference reference = citation.Reference;
      if (reference == null) return null;
      
      CitationManager citationManager = citation.CitationManager;
      if (citationManager == null) return null;
      
      List<FootnoteCitation> footnoteCitations = citationManager.FootnoteCitations.ToList();
      if (footnoteCitations == null) return null;
      
      // Dynamic Variables
      
      List<FootnoteCitation> thisReferenceFootnoteCitations = new List<FootnoteCitation>();
      List<int> footnoteIndexes = new List<int>();
      var output = new TextUnitCollection();
      int j = 0;
      string macroPrefix = string.Empty;
      
      // The Magic
         
      if (UsePageBackReferences)
      {
         individualPrefixLiteral = new LiteralTextUnit("{#", FontStyle.Neutral);
         individualSuffixLiteral = new LiteralTextUnit("}", FontStyle.Neutral);

         genericSeperatorLiteral = new LiteralTextUnit("", FontStyle.Neutral);
         lastSeperatorLiteral = new LiteralTextUnit("", FontStyle.Neutral);
         
         macroPrefix= citation.Reference.SequenceNumber + ":";
      }
      
      thisReferenceFootnoteCitations = footnoteCitations.Where(p => p.Reference == reference).ToList();
      
      foreach (FootnoteCitation footnoteCitation in thisReferenceFootnoteCitations)
      {
         footnoteIndexes.Add(footnoteCitation.FootnoteIndex);   
      }
            
      footnoteIndexes = new HashSet<int>(footnoteIndexes).ToList();
         
       
      if (footnoteIndexes.Count == 1)
      {
         output.Add(globalPrefixSingleLiteral);
      }
      else if (footnoteIndexes.Count > 1)
      {
         output.Add(globalPrefixMultipleLiteral);
      }      
      
      if (footnoteIndexes.Count > 0)
      {
         
         foreach (int i in footnoteIndexes)
         {
            j = j +1;
            if (footnoteIndexes.Count > 1 && j == footnoteIndexes.Count)
            {
               output.Add(lastSeperatorLiteral);
            }
            else if (footnoteIndexes.Count > 1 && j > 1)
            {
               output.Add(genericSeperatorLiteral);
            }
            output.Add(individualPrefixLiteral);
            output.Add(new LiteralTextUnit(macroPrefix + i.ToString(), footnoteIndexFontStyle));
            output.Add(individualSuffixLiteral);
            
         }
         output.Add(globalSuffixLiteral);
      }      
      
      return output;         
      }
   }
}
jay-squared
Citavi Expert
 

Re: Rückverweise im Literaturverzeichnis

Postby jay-squared » 2017-10-07 15:48

Das hat sich in Citavi 6 erledigt, da die Seite nun eine Eigenschaft der PlaceholderCitation ist. Die muss man nur noch sammeln, sortieren, und drucken.
Attachments
2017-10-07 15_44_13-Macro Editor - Citavi.png
jay-squared
Citavi Expert
 

Re: Rückverweise im Literaturverzeichnis

Postby derProf » 2017-12-15 16:27

Das klingt genau nach der Funktion, die ich gesucht habe, vielen Dank, dass du das erstellt hast. Allerdings habe da noch eine Frage & ein Problem (liegt wahrscheinlich an meinen sehr überschaubaren Programmierkünsten):
1. Ich wollte eine neue Komponente erstellen, um deinen Komponentencode dabei zu verwenden. Welches Element/Feld nehme ich denn in die Komponente, die ich mit dem Komponenten-Code filtere? Eine Komponente ohne jegliches Element anlegen ist ja nicht vorgesehen. Oder hab ich da was falsch verstanden?
2. Word stellt beim Kompilieren des Markos ein Problem fest:Sub oder Function nicht definiert, und im Debugger wird folgende hier fett unterstrichene Stelle hinterlegt:
If Selection.Find.Found Then
stringSelection = Selection.Text
stringFootnoteIndex = Split(stringSelection, ":")(1)
stringFootnoteIndex = TestRegExp("([0-9]+)", stringFootnoteIndex)
stringSequenceNumber = Split(stringSelection, ":")(0)
stringSequenceNumber = TestRegExp("([0-9]+)", stringSequenceNumber)
Attachments
Unbenannt.PNG
Fehlermeldung
derProf
 

Re: Rückverweise im Literaturverzeichnis

Postby jay-squared » 2017-12-17 18:58

1. Das keine leeren Komponenten möglich sind ist in der Tat so ein Phänomen. Das ist wie mit der Kurzbelegdefinition. Man kann das nicht leer lassen, aber weder verstehe ich warum, noch ist das ein unüberwindliches Hindernis. Man kann nämlich einfach ein Textelement reinziehen. Ist aber vollkommen egal was, da der Output eh von dem Filter überschrieben wird.
2. Man muss dem VBA-Projekt einen Verweis hinzufügen.
3. Das ganze geht wie gesagt in Citavi 6 viel einfacher. Immer noch nicht so einfach wie gewünscht, und in der aktuellen Beta gibt es das meines Erachtens auch noch einen Bug, aber evtl. wäre es doch wert, zu warten, bis Citavi 6 fertig ist und ich einen Code fertigstellen kann. Mein bisheriger Stand ist wie folgt, das klappt auch im Prinzip, aber das "mergen" braucht noch was Arbeit.

Code: Select all
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;   
         
         // User Options
         
         bool boolBackrefPages = true;
         string backreferencesPrefixString = "\t";
         
         // Static Variables
         
         if (citation == null) return null;
         
         CitationManager citationManager = citation.CitationManager;
         if (citationManager == null) return null;
         if (citationManager.PlaceholderCitations == null || citationManager.PlaceholderCitations.Count == 0) return null;
         
         Reference reference = citation.Reference;
         if (reference == null) return null;
         
         var placeholderCitationsCollection = citationManager.PlaceholderCitations.ToList().Where(p => p.Reference != null && p.Reference == reference);
         if (placeholderCitationsCollection == null) return null;
         
         List<PlaceholderCitation> placeholderCitations = placeholderCitationsCollection.ToList();
         if (placeholderCitations == null) return null;
         
         // Dynamic Variables
         
         List<int> pages = new List<int>();         
         TextUnitCollection output = new TextUnitCollection();         
         string pagesString = string.Empty;
         
         // The Magic
         
         if (!boolBackrefPages) return null;
         
         foreach (PlaceholderCitation placeholderCitation in placeholderCitations)
         {
            if (placeholderCitation == null) continue;
            if (placeholderCitation.PageInPublication == 0) continue;
            if (pages.Count == 0 || !pages.Any(i => i == placeholderCitation.PageInPublication)) pages.Add(placeholderCitation.PageInPublication);
         }
         
         pages.Sort();
         
         if (pages.Count == 0) return null;
         
         output.Add(new LiteralTextUnit(backreferencesPrefixString));
         output.AddRange(MergeAdjacent(pages));
                        
         return output;       
      }
      public static TextUnitCollection MergeAdjacent(List<int> pages)
      {
         TextUnitCollection output = new TextUnitCollection();
         
         int i = pages.Count;
         
         if (pages.Count < 1) return null;
         
         List<int> newList = new List<int>();
         
         int minPage = new int();
         int maxPage = new int();
            
         
         int first = pages.FirstOrDefault();
         int last = pages.Last();
         
         NumberingType previousPageRangeNumberingType = new NumberingType();
         bool PreviousPageRangeWasNumber = false;
                     
         foreach (int page in pages)
         {                        
            int currentStartPage = page;
            int currentEndPage = page;
            if (currentEndPage == null) currentEndPage = currentStartPage;
                        
            
            bool IsDiscreteRange = false;
            
            
            if (page == first)
            {
               minPage = currentStartPage;
               maxPage = currentEndPage;
            }
            else if (currentStartPage.CompareTo(minPage) >= 0 && currentEndPage.CompareTo(maxPage) <= 0)
            {
               // In this case, we don't have to do anything because the current page range is within the range defined by minPage & maxPage
            }
            else if (currentStartPage.CompareTo(maxPage + 1) < 1)
            {
               maxPage = currentEndPage;
            }
            else
            {
               IsDiscreteRange = true;
            }
                        
            
            if (page == first && page == last)
            {
               output.Add(new LiteralTextUnit(minPage.ToString()));               
               if (maxPage > minPage) output.Add(new LiteralTextUnit("–" + maxPage.ToString()));
            }
            else if (page == first)
            {
               output.Add(new LiteralTextUnit(minPage.ToString()));               
               if (maxPage > minPage) output.Add(new LiteralTextUnit("–" + maxPage.ToString()));
            }
            else if (IsDiscreteRange && page == last)
            {
               output.Add(new LiteralTextUnit(", " + minPage.ToString()));               
               if (maxPage > minPage) output.Add(new LiteralTextUnit("–" + maxPage.ToString()));
            }
            else if (IsDiscreteRange)
            {
               output.Add(new LiteralTextUnit(", " + minPage.ToString()));               
               if (maxPage > minPage) output.Add(new LiteralTextUnit("–" + maxPage.ToString()));               
               minPage = currentStartPage;
               maxPage = currentEndPage;;
            }
            else if (page == last)
            {
               output.Add(new LiteralTextUnit(", " + minPage.ToString()));               
               if (maxPage > minPage) output.Add(new LiteralTextUnit("–" + maxPage.ToString()));               
               minPage = currentStartPage;
               maxPage = currentEndPage;;
            }

         }         
         return output;
      } // end MergeAdjacent
   }
}


Allgemeiner wäre es schön, wenn eine Komponente "zitiert auf Seiten in Publikation" in Citavi schon dabei wäre, da ich mir vorstellen kann, dass das von vielen als nützlich empfunden würde. Aber – und der Kommentar richtet sich an Herrn Pasch – das setzt voraus, das PlaceholderCitation.PageInPublication auch dann mit Informationen gefüllt wird, wenn diese Komponente verwendet wird, nicht nur wenn von der neuen Bedingung "Vorheriger Titeleintrag steht auf derselben Seite in der Publikation" Gebrauch gemacht wird, da man an den Rückverweisen ja unabhängig von dem Ebd. in den Nachweisen Interesse haben kann.
jay-squared
Citavi Expert
 

Re: Rückverweise im Literaturverzeichnis

Postby Sebastian Pabel » 2017-12-21 16:41

Hallo, JJ

Vielen Dank für die Mühen. Ich habe das an Herrn Pasch weitergegeben, er meldet sich bei Gelegenheit.

Viele Grüße
Sebastian
Sebastian Pabel
Site Admin
 

Re: Rückverweise im Literaturverzeichnis

Postby derProf » 2017-12-27 16:22

Hallo JJ,

über die Weihnachtstage Zeit gehabt, deine Ratschläge durchzulesen und umzusetzen. Ich bin auch weiter gekommen - genau bis zur nächsten Fehlermeldung:

Laufzeitfehler '13': Typen unverträglich

steht da jetzt, im Debugger ist eine Zeile gelb hinterlegt (s.u.). Kannst du mir wohl noch einmal helfen? Besten Dank im Voraus!

PS: Citavi 6 steht uns leider nicht zur Verfügung, die dafür zuständige Stelle in unserer Einrichtung hat bereits blicken lassen, dass sie so bald nicht die Zeit für ein Update hat.
Attachments
Unbenannt.JPG
derProf
 

Next

Return to Mit Vorlagen komplexe Formatierungen erzeugen