Kein Ermitteln der Eigenschaft PlaceholderCitation.PageInPublication bei Abschnittsumbruch

SirPounce hinzugefügt 3 Jahren her
gelöst

Liebes Citavi-Team,


mir ist aufgefallen, dass Funktionen des Zitierstils, welche das Ermitteln der Eigenschaft PlaceholderCitation.PageInPublication erfordern (also etwa "Ebd. nur auf gleicher Seite", aber, mit ein bisschen Aufwand auch Rückverweise aus dem Literaturverzeichnis auf die Seite des Textes, in dem der entsprechende Beitrag zitiert wurde) nicht funktionieren, wenn das Dokument einen Abschnittsumbruch - in meinem Fall Abschnittsumbruch auf nächste ungerade Seite - enthält.


Hart an Grenze zwischen Bug und Missing Feature, ist aber jedenfalls nicht deutlich erklärt.


Beste Grüße

Jan Jakob

Antworten (5)

Foto
1

Ich kann das etwa reproduzieren mit dem MWE aus diesem Beitrag. Zunächst funktioniert das Ebd. so wie erwartet, Fn. 4 ist kein Ebd., sobald ich aber vor das erste Wort einen kombinierten Seiten-/ Abschnittsumbruch auf die nächste ungerade Seite einfüge, wird Fn. 4 fälschlicherweise zu Ebd.

/7bd204de80635edd24617a6853f773bc

Foto
1

Lieber Jan Jakob

Danke für Ihren Bericht! Ich konnte den Fehler damit sofort nachstellen und habe ihn als Bug erfasst. Wir können das Problem voraussichtlich nicht mehr in Citavi 6.3 lösen, da die aktuelle Beta-Version bereits der finale Release-Kandidat ist. Es müsste ein gravierender Show Stopper hinzukommen, der uns zwingen würde, eine neue Beta-Version zu erstellen (danach sieht es zum Glück nicht aus), die den Fix schon enthalten könnte.

Freundliche Grüsse

Peter

Foto
1

In Citavi 6.3 gefixt.

Foto
1

In meinem Test so halb. Citavi "verzählt" sich jetzt. Man erstelle beispielhaft ein Dokument, welches direkt auf der ersten Seite einen Abschnittsumbruch "nächste ungerade Seite" enthält. Nun füge man auf Seite 3 einen Nachweis ein. Schließlich soll im LV die Seitenanzahl, auf welcher der Nachweis erscheint, stehen (das ist kein hypothetischer Anwendungsfall, mir wurde gerade aufgegeben, in einem Buch ein Entscheidungsverzeichnis zu erstellen, in dem die Seiten angegeben werden, auf der die Entscheidung zitiert wird.) Das mit den Rückverweisen geht per Code:

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;

			// Options

			bool boolBackrefPages = true;
			string backreferencesPrefixString = "\t";

			// Constants

			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;

			// Variables

			List<int> pages = new List<int>();
			TextUnitCollection output = new TextUnitCollection();
			string pagesString = string.Empty;

			// 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();
			
			LiteralTextUnit interRangeDividerLiteralTextUnit = new LiteralTextUnit(", ");
			LiteralTextUnit intraRangeDividerLiteralTextUnit = new LiteralTextUnit("-");

			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();

			foreach (int page in pages)
			{
				bool IsDiscreteRange = false;

				if (page == first)
				{
					minPage = page;
					maxPage = page;
				}
				else if (page.CompareTo(minPage) >= 0 && page.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 (page.CompareTo(maxPage + 1) < 1) // page is not more than one page away from the current range’s last page
				{
					maxPage = page;
				}
				else
				{
					IsDiscreteRange = true;
				}

				if (page == first && page == last)
				{
					output.Add(new LiteralTextUnit(minPage.ToString()));
				}
				else if (page == first)
				{
					output.Add(new LiteralTextUnit(minPage.ToString()));
				}
				else if (IsDiscreteRange && page == last)
				{
					output.Add(intraRangeDividerLiteralTextUnit);
					output.Add(new LiteralTextUnit(maxPage.ToString()));
					
					minPage = page;
					
					output.Add(interRangeDividerLiteralTextUnit);
					output.Add(new LiteralTextUnit(minPage.ToString()));
				}
				else if (IsDiscreteRange)
				{
					output.Add(intraRangeDividerLiteralTextUnit);
					output.Add(new LiteralTextUnit(maxPage.ToString()));
					
					minPage = page;
					maxPage = page;
					
					output.Add(interRangeDividerLiteralTextUnit);
					output.Add(new LiteralTextUnit(minPage.ToString()));					
				}				
				else if (page == last)
				{
					output.Add(intraRangeDividerLiteralTextUnit);
					output.Add(new LiteralTextUnit(maxPage.ToString()));
				}

			}
			return output;
		} // end MergeAdjacent
	}
}
Der Rückverweis sollte auf S. 3 gehen, es kommt aber S. 2 heraus.

Das ist nicht so dramatisch, weil es sich ja umgehen lässt (einfach keinen Abschnittswechsel auf ungerade Seiten machen, und das Ergebnis manuell per Leerseite zeitigen), aber ich dachte, es sei einen Hinweis wert.

Foto
1

Hallo SirPounce

Ich kann Ihre Beobachtung bestätigen. Ich will aber noch abklären lassen, was die Ursache dafür ist. Ich melde mich also nochmal.

Freundliche Grüsse

Peter

Antwort schreiben
 
Dateianlage anfügen (KEINE vertraulichen Dokumente!)