Stil der Kurztitel ändern

Max H. hinzugefügt 2 Jahren her
beantwortet

Hi, ich würde gerne alle pdfs die ich in mein Citavi Projekt eingefügt habe (die ursprünglich unübersichtliche Namen hatten) mithilfe der Kurztitel speichern Funktion in einem Ordner sammeln, undzwar in bestimmter Form: Jahr_Autor_Titel. Mit dem Kurztitel ist der Titel immer nur 5 Wörter lang und hilft somit oft nicht. Es geht um eine Abschlussarbeit mit sehr vielen Research-Kapern...

Ich hoffe jemand kann weiterhelfen :)

Kommentare (5)

Foto
1

Hallo Max,

vielen Dank für Ihre Frage.

Der Kurztitel wird erstellt nach dem Muster Nachnamen des Autors, Erscheinungsjahr, erste Wörter aus dem Titel, also z. B. Bawden 2001 – Information and digital literacies.

Sie können den Kurztitel ändern, indem Sie oberhalb eines Titels in den Kurztitel klicken und diesen bearbeiten.

Das wäre jedoch für alle Titel nötig, da sich noch kein neues Schema zur Erstellung von Kurztiteln festlegen lässt.

Anschließend lassen Sie alle PDF-Dateien mit den neuen Kurztiteln auf der Karteikarte "Titel" umbenennen:

Zahnrad-Menü unten > Alle Dateien mit dem Citavi-Kurztitel umbenennen.

Wenn Sie nur eine Auswahl der Titel Ihres Projektes zitiert haben, filtern Sie zunächst nach diesen zitierten Titeln.

Kopieren Sie diese anschließen in ein neues Projekt.

Der Attachments-Ordner des neuen Projektes enthält nur die ausgewählten PDF-Dateien.

Viele Grüße

Jana

Foto
3

Die andere Alternative ist das per Makro zu machen (Makro erstmal an einem Testprojekt oder Testtitel testen). Folgendes Makro etwa ändert die PDF-Anhänge der markierten Titel nach dem gewünschten Schema. Zwei Probleme: erstens wusste ich nicht, wie mit mehreren Autoren umgegangen werden soll, zweitens kann es passieren, dass der Dateiname sehr lang wird, es ist kein Mechanismus im Skript, welcher überlange Dateinamen verhindert.

Der wichtigste Teil ist natürlich die Zeile:

newFileName = reference.YearResolved + "_" + reference.AuthorsOrEditorsOrOrganizations.FirstOrDefault().LastName + "_" + reference.Title;
Achso, und im Vergleich zum Pabel’schen Original habe ich offenbar die Abfrage nach der Sicherheitskopie rausgenommen.


using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Net;
using System.Linq;
using System.IO;
using System.Text;
using System.Globalization;

using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Metadata;
using SwissAcademic.Citavi.Shell;
using SwissAcademic.Collections;

using System.Reflection;
using SwissAcademic.Citavi.Shell.Controls.Preview;

public static class CitaviMacro
{
	public static void Main()
	{
		if (Program.ProjectShells.Count == 0) return;		//no project open
		if (IsBackupAvailable() == false) return;			//user wants to backup his/her project first

		Program.ActiveProjectShell.PrimaryMainForm.PreviewControl.ShowNoPreview();
		
		//iterate over all references in the current filter (or over all, if there is no filter)
		List<Reference> references = Program.ActiveProjectShell.PrimaryMainForm.GetSelectedReferences();

		//reference to active Project
		Project activeProject = Program.ActiveProjectShell.Project;
		string rootPath = activeProject.Addresses.AttachmentsFolderPath;

		//counter and list references where rename failed
		int renameCounter = 0;
		List<Reference> renamingFailed = new List<Reference>();

		foreach (Reference reference in references)
		{
			if (reference.Locations.Count == 0) continue;

			int i = 0;

			var locations = reference.Locations.ToList().Where(a => a.LocationType == LocationType.ElectronicAddress && a.Address.LinkedResourceType == LinkedResourceType.AttachmentFile);

			foreach (Location location in locations)
			{
				if (location == null) return;
				if (location.Address == null) continue;
				if (location.Address.UriString == null) continue;

				i = i + 1;

				FileInfo fileInfo = new FileInfo(rootPath + "\\" + location.Address.UriString);
				string fileExtension = fileInfo.Extension;
				if (fileExtension.Equals("pdf", StringComparison.InvariantCultureIgnoreCase)) continue;

				string newFileName = String.Empty;

				try
				{
					newFileName = reference.YearResolved + "_" + reference.AuthorsOrEditorsOrOrganizations.FirstOrDefault().LastName + "_" + reference.Title;
					newFileName = CleanString(newFileName);
				}
				catch (Exception e)
				{
					string mbMessage = "Filename for " + reference.ShortTitle + " cannot be generated. Correct reference info?";
					var noInfoForFilname = MessageBox.Show(mbMessage, "Citavi Macro", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
					if (noInfoForFilname == DialogResult.Yes)
					{
						List<Reference> incorrectReference = new List<Reference>();
						incorrectReference.Add(reference);
						var filter = new ReferenceFilter(incorrectReference, "References with data missing", false);
						Program.ActiveProjectShell.PrimaryMainForm.ReferenceEditorFilterSet.Filters.ReplaceBy(new List<ReferenceFilter> { filter });
						return;
					}
					else continue;
				}

				if (locations.Count() > 1) newFileName += " (" + i.ToString() + ")";

				newFileName = rootPath + @"\" + newFileName + fileExtension;

				if (File.Exists(newFileName)) continue;

				try
				{
					location.Address.Rename(newFileName);
					renameCounter++;
				}
				catch (Exception e)
				{
					MessageBox.Show("An error has occured while renaming " + location.Address + ":\n" + e.Message, "Citavi Macro", MessageBoxButtons.OK, MessageBoxIcon.Error);
					renamingFailed.Add(reference);
				}

			}// end foreach (Location location in reference.Locations)
		}// foreach (Reference reference in references)

		// Message upon completion
		string message = "{0} Locations have been renamed.";
		message = string.Format(message, renameCounter);

		if (renamingFailed.Count == 0)
		{
			MessageBox.Show(message, "Citavi Macro", MessageBoxButtons.OK, MessageBoxIcon.Information);
			return;
		}
		else
		{
			DialogResult showFailed = MessageBox.Show(message + "\n Would you like to show a selection of references where renaming has failed?", "Citavi Macro", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
			if (showFailed == DialogResult.Yes)
			{
				var filter = new ReferenceFilter(renamingFailed, "Renaming failed", false);
				Program.ActiveProjectShell.PrimaryMainForm.ReferenceEditorFilterSet.Filters.ReplaceBy(new List<ReferenceFilter> { filter });
				return;
			}
		}

		activeProject.SaveAsync();
	}

	private static bool IsBackupAvailable()
	{
		return true;
	} // end IsBackupAvailable()

	private static string CleanString(string input)
	{
		char[] BAD_CHARS = new char[] { '?', '\\', '/', '?', '*', ':', '"', '“', '”', '‘', '’' };
		string output;
		output = input;
		output = RemoveDiacritics(output);
		output = string.Concat(output.Split(BAD_CHARS,StringSplitOptions.RemoveEmptyEntries));

		return output;
	}
	private static string RemoveDiacritics(string text)
	{
		var normalizedString = text.Normalize(NormalizationForm.FormD);
		var stringBuilder = new StringBuilder();

		foreach (var c in normalizedString)
		{
			var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
			if (unicodeCategory != UnicodeCategory.NonSpacingMark)
			{
				stringBuilder.Append(c);
			}
		}
		return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
	}
}

Foto
2

Hallo zusammen,

mich würde mal interessieren, ob zu diesem Thema bereits eine Lösung implementiert wurde?

Foto
3

Hallo Niklas

Vielen Dank für Ihre Nachfrage.

Noch gibt es keine integrierte Möglichkeit, den Automatismus beim Erstellen des Kurztitels zu ändern.

Wir könnten möglicherweise in Zukunft ein Add-on dafür anbieten.

Viele Grüße

Jana

Foto
2

Wann steht das add-on zur Verfügung?

Foto
2

Hallo Luca


Die Programmierung hat noch nicht begonnen, der Wunsch nach einer solchen Funktion steht aber auf unserer Wunschliste für unsere Entwickler.

Viele Grüße

Jana

Foto
2

Gibt es schon Neuigkeiten zu dem Addon? Danke und VG, Marie

Foto
1

Hallo Marie,

vielen Dank für Ihre Frage.

Bisher gibt es leider noch keine Neuigkeiten zum Add-on.

Viele Grüße

Susanne

Foto
3

Wenn es von diesem alten AddOn (übrigens eine absolute Knallerfunktion, welcher ich sieben Jahre nach Citavi 4 immer noch hinterweine) den Quelltext gäbe, kriegte man/ich das vielleicht hin, das so anzupassen, dass sich der Kurztitel durch einen extra-Zitationsstil selber einstellen ließe. Größtenteils ist das ja relativ trivial, weil das Erstellen des eigenen Kurztitelschemas genau das Beispiel ist, mit dem die Programmierung von Citavi-AddOns erklärt wird, ich scheitere aber daran, einen Befehl zu finden, welcher als Argument eine reference und einen CitationStyle sowie ggf. das Vorlagenset nimmt und als Ausgabe eben jenen Titel in jenem Zitationsstil ergibt.

Foto
4

Hat sich erledigt. Folgender Code funktioniert.

using System;
using System.Linq;
using System.ComponentModel;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Citations;
using SwissAcademic.Citavi.Metadata;
using SwissAcademic.Citavi.Shell;
using SwissAcademic.Collections;

public static class CitaviMacro
{
	public static void Main()
	{
		MainForm mainForm = Program.ActiveProjectShell.PrimaryMainForm;
		
		List<Reference> references = mainForm.GetSelectedReferences();	

		foreach (Reference reference in references)
		{
			reference.ShortTitle = NewShortTitle(reference);
		}
	}
	public static string NewShortTitle(Reference reference)
	{
		string newShortTitle = string.Empty;
		
		string styleName = "Juristisches Zitieren (Riehm) [Copy].ccs";
		
		Project project = Program.ActiveProjectShell.Project;
		string folder = project.Addresses.GetFolderPath(SwissAcademic.Citavi.CitaviFolder.UserData).ToString();
		var uri = new System.Uri(folder + @"\Custom Citation Styles\" + styleName);
		CitationStyle citationStyle = CitationStyle.Load(uri.AbsoluteUri);
		
		List<Reference> references = new List<Reference>();
		references.Add(reference);
		
		CitationManager citationManager = new CitationManager(Program.ActiveProjectShell.Project.Engine, citationStyle, references);
		BibliographyCitation bibliographyCitation = citationManager.BibliographyCitations.FirstOrDefault();
		List<ITextUnit> textUnits = bibliographyCitation.GetTextUnits();
		var output = new TextUnitCollection();
		
		foreach (ITextUnit textUnit in textUnits)
		{
			output.Add(textUnit);
		}
		
		newShortTitle = output.ToString();
		return newShortTitle;
	}
}
Das ist jetzt ein Makro. Wer damit rumspielen will, nur zu. Man muss halt die Zeile
string styleName = "Juristisches Zitieren (Riehm) [Copy].ccs";
anpassen. Da kann man einen beliebigten Zitationsstil reinschreiben (welcher im Ordner mit den eigenen Zitationsstilen liegt), und Resultat des Makros ist, dass der Kurztitel aller markierten Titel in der Literaturverwaltung dann dem Format der Vorlage für Einträge im Literaturverzeichnis entspricht. Am Wochenende mache ich da ein AddOn draus, das automatisch für alle Titel den Kurztitel generiert, und erwartet, dass im Custom Citation Styles-Ordner ein Stil "ShortTitleFilter.ccs" liegt.

Foto
1

Top! Besten Dank.

Foto
Foto
1

Hallo zusammen,

das AddOn sieht doch vielversprechend aus, ich kann/darf es aber auf meinem Firmen-PC nicht installieren.

Darum habe ich eine ergänzende Frage: Nach welchem Schema wird denn der Kurztitel in die Benennung des pdf übernommen? Mir scheint die Länge der Benennung einigermassen willkürlich. Konkretes Beispiel: Eine Literaturstelle erhält den automatisch definierten Kurztitel:

Nachname1, Nachname2 et al 2012 - Erste5WorteDesTitels

Mit der exakt identischen Benennung "Nachname1, Nachname2 et al 2012 - Erste5WorteDesTitels.pdf" wäre ich völlig einverstanden. Wenn ich die Datei aber über das Zahnrad -> "Dateien mit dem Citavi-Kurztitel umbenennen..." bearbeite, endet der Dateiname bereits nach dem et, also nach 3 Worten:


Nachname1, Nachname2 et.pdf

Jetzt habe ich den Kurztitel händisch bearbeitet, und so die fünf Worte des Titels entfernt:

Nachname1, Nachname2 et al 2012

Benenne ich das pdf nun erneut um, übernimmt Citavi den dann "vollständigen" Kurztitel, der dann aus 5 Worten besteht:

Nachname1, Nachname2 et al 2012.pdf

Auch wenn ich manuell die gesamten Autoreninformationen aus dem Kurztitel entferne und nur die ersten 5 Worte des Titels übernehme, besteht die Bezeichnung des pdf aus allen 5 Worten des Kurztitels:

"Erste 5 Worte des Titels.pdf"


Darum meine Frage: Wenn ich auch das Schema der Benennung des Kurztitels und damit des pdf nicht verändern kann, kann ich denn wenigstens Einfluss darauf nehmen, wie viele Worte/wie viele Informationen aus dem Kurztitel in den Dateinamen übernommen werden? In meinem Fall wäre folgender Output für die pdf wünschenswert:

Nachname1, Nachname2 et al Jahr.pdf

Das entspricht doch auch einer Länge der Dateibezeichnung von 5 Worten, und enthält alle für mich relevanten Informationen.


Viele Grüsse