Stil der Kurztitel ändern

Max H. hinzugefügt 4 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 :)

Antworten (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
5

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
1

Hallo,


das AddOn „Kurztitel-Schema anpassen“ ist eine große Hilfe, Vorgaben zur Formatierung der pdf-Dateinamen umzusetzen. Mit einem Detail bin ich aber nicht zufrieden: Sollen die im Dateinamen enthaltene Autorennamen in Großbuchstaben dargestellt werden, dann lässt sich das zwar im „ShortTitleGenerator.ccs“ so einstellen, diese Einstellung wird aber vom AddOn nicht berücksichtigt. Die im Dateinamen enthaltenen Autorennamen erscheinen also nicht wie gewünscht in Großbuchstaben („MÜLLER“), sondern so, wie im Citavi-Titel eingetragen („Müller“).


Mache ich da einen Fehler und falls nein, könnte das bitte noch angepasst werden?


Danke und Gruß


Jan

Foto
1

Bei mir funktioniert zwar das obere Makro, das untere bzw. das AddOn aber leider nicht. Ich habe basierend auf den verfügbaren Zitationsstilen einen eigenen erstellt und diesen als "ShortTitleGenerator.ccs" in dem Ordner "C:\Program Files (x86)\Citavi 6\Custom Citation Styles" gespeichert. Anschließend habe ich erst Citavi geschlossen und dann die Datei "ShortTitleGenerator.dll" heruntergeladen und diese in dem von mir manuell erstellten Ordner "C:\Program Files (x86)\Citavi 6\AddOns" gespeichert. Wenn ich nun bei einer bestehenden Referenz eine lokale Datei hinzufüge, wird jedoch weiterhin der Citavi Kurztitel zur Benennung dieser Datei verwendet. Wenn ich die Idee des Makros richtig verstehe, sollte der Titel nun aber eigentlich automatisch nach dem Zitationsstil in der Datei "ShortTitleGenerator.dll" benannt werden.

Kann mir jemand sagen, was ich falsch mache bzw. falsch verstehe?

Weitere Infos: Ich nutze Citavi 6.8 über eine Campus-Lizenz und arbeite an einem lokal auf einem Windows 10 (64 bit) Computer gespeicherten Projekt. Wenn ich auf die hier beschriebene Art "Original-Add-Ons" von Citavi installieren möchte, funktioniert das ebenfalls nicht (über den Add-On-Manager hingegen schon). Wenn ich das untere Makro ausführe, passe ich da entsprechend die Zeile

string styleName = "Juristisches Zitieren (Riehm) [Copy].ccs";
an.

Viele Grüße

Fabian

Foto
1

Hi, das Thema ist zwar schon etwas älter, aber immer noch super hilfreich.

Das AddOn von Github funktioniert bei mir auch. Allerdings ist mir gerade ein Fehler aufgefallen: Wenn ich in eine Kategorie klicke, in der noch keine Titel aufgenommen sind, öffnet Citavi ja einen neuen Titel (also eher ein leeres Formular, um einen neuen Titel aufzunehmen). Scheinbar sorgt das AddOn dann aber dafür, dass Citavi einfriert. Kann das sein? Und ließe sich das noch beheben.

Bin gerade mal durch den Quellcode bei Github gegangen, muss aber gestehen, dass es mich einiges an Einarbeitungszeit kosten würde, selbst auf Fehlersuche zu gehen. Deshalb wollte ich erst mal nachfragen, ob das jemand mit wenig Aufwand hinbekommen würde.

Vielen Dank schon mal.

PS: Eventuell kann es aber auch an meinem verwendeten Stil liegen - der ist vielleicht zu komplex. Aber bei bestehenden Titeln funktioniert es alles super.

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

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