Laufende Nummer einfügen

Hier findest du Hilfe im Umgang mit Scribus und mit deinem Projekt
Antworten
aquilifer
Beiträge: 3
Registriert: Do 19. Jan 2023, 15:28

Laufende Nummer einfügen

Beitrag von aquilifer »

Hallo zusammen!

Ich bin ein absoluter Neuling, was Scribus anbelangt. Ich hoffe deshalb, dass die Lösung (hoffentlich gibt es eine) meiner Frage nicht allzu offensichtlich ist.

Ich erstelle gerade einen umfangreichen Abbildungskatalog mit Scribus, bestehend jeweils aus Bild und Bildunterschrift. In diesem Zusammenhang suche ich nach einer Möglichkeit, eine laufende Abbildungsnummer (ähnlich der Seitenzahlfunktion) in die Bildunterschriften zu setzen, so dass ich a) diese nicht immer per Hand eintippen muss und b) sollte ich doch noch mal ein Bild löschen, nicht bei allen anderen Bildunterschriften die Abbildungsnummer ändern muss. Ist so etwas technisch möglich?

Ich wäre sehr dankbar für jeden Rat!
waldbaer59
Beiträge: 14
Registriert: Sa 7. Nov 2020, 16:05

Re: Laufende Nummer einfügen

Beitrag von waldbaer59 »

Auf Anhieb fällt mir dazu keine eingebaute Funktion ein; aber ich bin in Scribus auch noch nicht so extrem tief drin. Eine Idee, wie man sich mit einem Skript behelfen könnte habe ich freilich. Dazu müsste ich aber wissen ob es nur um eine durchgehende Nummerierung in Bildbezeichnungen geht und ob diese nicht zusätzlich noch anderweitig referenziert werden sollen.

Wenn es einfach um eine Nummerierung geht könnte ich mir vorstellen, dass man in Texten eine (vorher festgelegte und sonst nicht vorkommende) Zeichenfolge durch die laufende Nummer via Skript ersetzt. Man müsste dann aber die Version mit der Steuer-Zeichenfolge immer aufheben und die mit den eingetragenen Nummern separat abspeichern. Besser als nichts allemal, aber vielleicht hat ja ein Scribus-Crack hier eine einfache Lösung.

VLG
Stephan
waldbaer59
Beiträge: 14
Registriert: Sa 7. Nov 2020, 16:05

Re: Laufende Nummer einfügen

Beitrag von waldbaer59 »

Ich nochmal ;) ,

weil ich gerade gerne bastele, habe ich mal so etwas auf die Schnelle gestrickt. Man möge mir die etwas hölzerne Programmierung nachsehen, da ich schon einige Jahre aus der Übung bin.
Das u.g. Skript sucht in allen Texten nach der Zeichenfolge "§#§" und ersetzt diese Folge durch aufsteigende Nummern. Das Resultat sollte man dann separat abspeichern, damit man sich das Original nicht versehentlich überschreibt. Also aufpassen!
Ich weiß auch nicht, was bei Gruppierungen und gesperrten Feldern passiert; das müsste man noch herausfinden. Quick & Dirty halt, aber vielleicht trotzdem hilfreich?

Ach ja: weil das Skript nichts in ein Popup-Fenster schreibt (hab ich nur zum Test gebraucht) kann man noch den Bereich für das tkinter einsparen. Es ist aber auch nicht störend, sofern man nicht auf einen Fehler läuft, weil man tkinter auf seiner Maschine nicht installiert hat.

VLG
Stephan


Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

from __future__ import division # overrules Python 2 integer division
import sys
import locale
import calendar
import datetime
from datetime import date, timedelta
import csv
import platform

try:
    from scribus import *
except ImportError:
    print("This Python script is written for the Scribus \
      scripting interface.")
    print("It can only be run from within Scribus.")
    sys.exit(1)

try:
    from tkinter import * # python 3
    from tkinter import messagebox, filedialog, font
except ImportError:
    print("This script requires Python Tkinter properly installed.")
    messageBox('Script failed',
               'This script requires Python Tkinter properly installed.',
               ICON_CRITICAL)
    sys.exit(1)
# ****************************************************************************
# ----- Zeichenfolge, nach der in den Textfeldern gesucht werden soll
such_string = "§#§"
# ----- Zähler für Bildnummer initialisieren
bildnummer = 0

# ----- Anzahl der Seiten im Dokument ermitteln
seiten_anzahl = pageCount()

# ----- die Seiten durcharbeiten
for i in range (1,seiten_anzahl+1):
    gotoPage(i)
    element_liste = getPageItems()
    # ----- Elemente der Seite durchsehen
    for j in (element_liste):
        # ----- Wenn Textrahmen (also Typ 4)
        if j[1] == 4:
            text_inhalt = getFrameText(j[0])
            # ----- Zeichenkette ist im String drin, dann Bildnummer hochzählen, 
            # ----- im String ersetzten und zurückschreiben.
            if text_inhalt.find(such_string) >= 0:
               bildnummer += 1
               neuer_text = text_inhalt.replace(such_string, str(bildnummer))
               setText(neuer_text, j[0])
aquilifer
Beiträge: 3
Registriert: Do 19. Jan 2023, 15:28

Re: Laufende Nummer einfügen

Beitrag von aquilifer »

Vielen herzlichen Dank für deine Zeit und Mühe! Das hört sich nach einem super Lösungsansatz an. Ich habe gerade mal einige Testseiten zusammengestellt mit der entsprechenden Zeichenfolge, nur leider bekomme ich folgende Fehlermeldung:

-----
Traceback (most recent call last):
File "<string>", line 11, in <module>
File "<string>", line 1
{\rtf1\ansi\ansicpg1252\cocoartf2707
^
SyntaxError: unexpected character after line continuation character
----

Die Abbildungen + Textfelder sind nicht gruppiert oder gesperrt.
waldbaer59
Beiträge: 14
Registriert: Sa 7. Nov 2020, 16:05

Re: Laufende Nummer einfügen

Beitrag von waldbaer59 »

Eine kleine Rückfrage habe ich noch. Welches Betriebssystem nutzt du? Ich werde morgen dann nochmal der Sache nachgehen. Irgendwie sollte man das hinbekommen.
Die erste Zeile im Script verweist auf den Pfad, wo auf meinem Linux Rechner Python beheimatet ist. Unter Windows kann ich aber auch mal gucken.

VLG
Stephan
waldbaer59
Beiträge: 14
Registriert: Sa 7. Nov 2020, 16:05

Re: Laufende Nummer einfügen

Beitrag von waldbaer59 »

Ich nochmal ....

Habe mir gerade mal die Sache unter Windows angeguckt; läuft dort aber auch problemlos durch.
Dann müssen wir kurz ins 'Eingemachte' gehen.

Ich nutze Scribus 1.5.8 (Linux, habe das auch unter Windows 10 installiert) sowie Python 3.10. Allerdings habe ich heute früh unter Windows keine Probleme gehabt, auch ohne explizite zusätzliche Installation der o.g. Python-Version. Das sollte nicht das Problem sein (zumindest unter Scribus 1.5.8).

Deine Umgebung beklagt sich über ein Problem nach einem 'Line Continuation Character', also einem "\". Dazu passt aber irgendwie die angegebene Zeilennummer nicht.

Ich tippe darauf, dass das Skript in einem falschen Format abgelegt wurde. Daher stelle bitte sicher, dass das Script als 'Plain Text' und nicht im 'Rich Text Format' abgespeichert ist. Schau doch mal nach, ob dein Editor da vielleicht eine 'falsche innere Einstellung' ;) hat.

VLG
Stephan
aquilifer
Beiträge: 3
Registriert: Do 19. Jan 2023, 15:28

Re: Laufende Nummer einfügen

Beitrag von aquilifer »

Entschuldige bitte die etwas späte Antwort. Ich bin erst jetzt wieder dazu gekommen, mich der Sache anzunehmen. Es war, wie du vermutet hast, ein Problem mit rtf. Ich benutze Mac und der Texteditor hat es automatisch in dem Format abgespeichert. Vielen, vielen Dank für deine Hilfe! :pluseins:

Wenn ich dich noch mit einer kleinen Sachen behelligen darf: Wie schaffe ich es denn, dass das Skript automatisch die gesamte Bildunterschrift nach dem Vorgang des Ersetzens wieder in einen bestimmten Absatzstil bringt? Ich habe laienhaft scribus.setStyle("Bildunterschrift", neuer_text) ans Ende gesetzt, hat natürlich nicht funktioniert (der entsprechende Absatzstil "Bildunterschrift" ist natürlich definiert).
waldbaer59
Beiträge: 14
Registriert: Sa 7. Nov 2020, 16:05

Re: Laufende Nummer einfügen

Beitrag von waldbaer59 »

Ich habe ein wenig herumprobiert. Letztlich darf man wohl den Text im Textfeld nicht komplett ersetzen, sondern muss wohl die auszutauschende Zeichenkette selektieren, dann erst löschen (was nur den selektierten Bereich eliminiert) und dann die Nummer an der passenden Stelle einsetzen (insertText).

Schau mal ob das folgende Coding hier passt:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

from __future__ import division # overrules Python 2 integer division
import sys
import locale
import calendar
import datetime
from datetime import date, timedelta
import csv
import platform

try:
    from scribus import *
except ImportError:
    print("This Python script is written for the Scribus \
      scripting interface.")
    print("It can only be run from within Scribus.")
    sys.exit(1)

try:
    from tkinter import * # python 3
    from tkinter import messagebox, filedialog, font
except ImportError:
    print("This script requires Python Tkinter properly installed.")
    messageBox('Script failed',
               'This script requires Python Tkinter properly installed.',
               ICON_CRITICAL)
    sys.exit(1)
# ****************************************************************************
# ----- Zeichenfolge, nach der in den Textfeldern gesucht werden soll
such_string = "§#§"
# ----- Zähler für Bildnummer initialisieren
bildnummer = 0

# ----- Anzahl der Seiten im Dokument ermitteln
seiten_anzahl = pageCount()

# ----- die Seiten durcharbeiten
for i in range (1,seiten_anzahl+1):
    gotoPage(i)
    element_liste = getPageItems()
    # ----- Elemente der Seite durchsehen
    for j in (element_liste):
        # ----- Wenn Textrahmen (also Typ 4)
        if j[1] == 4:
            text_inhalt = getFrameText(j[0])
            # ----- Zeichenkette ist im String drin, dann Bildnummer hochzählen, 
            # ----- im String ersetzten und zurückschreiben.
            position = text_inhalt.find(such_string)
            if position >= 0:
               bildnummer += 1
               selectText(position, 3, j[0])
               deleteText(j[0])
               insertText(str(bildnummer), position, j[0])

Da ich selbst auch eine Nummerierungsmöglichkeit als durchaus nützlich betrachte, ist dieser Thread für mich eine nette Lernmöglichkeit. Ich bin gerade dabei, eine aufwendigere Version zu basteln, die auch römische Ziffern (große und kleine) zur Nummerierung vergeben kann.

Gib bitte durch, ob das jetzt so für dich 'funzt'.

VLG
Stephan
Antworten