1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Unsere jährliche Weihnachts-Banner-Aktion hat begonnen! Wir freuen uns auf viele, viele kreative Vorschläge.
    Mehr dazu könnt Ihr hier nachlesen: Weihnachtsbanner 2016

    Information ausblenden

Automatisches kernen in Quark XPress

Dieses Thema im Forum "AppleScript" wurde erstellt von aumic, 24.11.06.

  1. aumic

    aumic Alkmene

    Dabei seit:
    30.10.06
    Beiträge:
    32
    Hallo Forum,
    ich mache schon seit einigen Stunden an einem Script rum und finde den Fehler einfach nicht. Hoffentlich kann mir jemand einen Tipp geben.

    Das Script soll in Quark Xpress Textteile Suchen und an bestimmten Stellen Kernen; z.B. soll bei der Abkürzung "z.B." nach dem ersten Punkt um 20 Einheiten ausgetrieben werden. Wenn ich mein Script laufen lasse, bricht es ohne Fehlermeldung ab (vermutlich irgendwo ab der Zeile "set theList to the ...").
    Hier das Script:

    Code:
    global measurements
    global theList
    global theMatchingText
    
    tell application "QuarkXPress Passport"
    	activate
    	set measurements showing to false
    	my kernScript("z.B.", 2, 18)
    	my kernScript("Dr. ", 3, -22)
    	set measurements showing to true
    end tell
    
    on kernScript(kernwort, kernStelle, kernWert)
    	tell document 1 of application "QuarkXPress Passport"
    
    		try
    			set theList to the object reference of every text of every story where it is kernwort
    			if class of theList is not list then copy (coerce theList to list) to theList
    		on error
    			tell application "QuarkXPress Passport" to set measurements showing to true
    		end try
    		
    		repeat with i from 1 to the number of items in theList
    			set theMatchingText to item i of theList
    			if kernStelle then set the kern of character kernStelle of theMatchingText to kernWert
    		end repeat
    	end tell
    end kernScript
    Wäre nett, wenn sich das Script jemand anschauen könnte.

    Danke!
    Michi
     
  2. Daisy

    Daisy Uelzener Rambour

    Dabei seit:
    14.01.06
    Beiträge:
    366
    Hallo Michi,

    was mir spontan an deinem Skript ist aufgefallen ist, ist das:
    "if kernStelle then ..."

    Diese Bedingung führt zu einer Fehlermeldung (2 kann nicht in Typ boolean umgewandelt werden.). Und sicher hast du das auch nicht gemeint (if 2 ??)

    Ich denke, was du wolltest könnte wie folgt aussehen):

    Code:
    		repeat with theMatchingText in theList
    			if exists character kernStelle of theMatchingText then
    				set the kern of character kernStelle of theMatchingText to kernWert
    			end if
    		end repeat
    ... die etwas umständliche Kontruktion über den Listen-Index habe ich bei der Gelegenheit auch vereinfacht ;)

    Grüße,

    Daisy


    Nachtrag:
    Braucht's diese If-Konstruktion überhaupt? Wenn Quark ordentlich arbeitet, sollte die Liste ja eigentlich sowieso keine Elemente enthalten, die diese Bedingung nicht erfüllen ...
     
  3. aumic

    aumic Alkmene

    Dabei seit:
    30.10.06
    Beiträge:
    32
    Vielen Dank Daisy,
    sorry, dass ich erst jetzt antworte, ich musste gezwungener Maßen ein verlängertes Wochenende einlegen.

    Deine Antwort hat mir schon mal sehr geholfen!

    Das mit dem "if kernStelle then ..." ist noch ein Überbleibsel aus einer älteren Version, wo ich mehrere kernStellen definiert hatte, die ich damit auf Vorhandensein abfragen wollte.

    Deinen Vorschlag schaut um einiges eleganter aus. Ich habe ihn gleich unverändert übernommen und dabei die If-Konstruktion gleich weggelassen. Der "theMatchingText" sollte das "kernwort" beinhalten und somit auch den "character" an der "kernStelle" beinhalten.

    Ein reproduzierbares Problem habe ich allerdings noch. Hier mal der aktuelle Code:

    Code:
    global measurements
    global theList
    global theMatchingText
    
    
    tell application "QuarkXPress Passport"
    	activate
    	set measurements showing to false
    	my kernScript("d.O.", 2, 18) -- der/die Obige
    	my kernScript("Dr.jur.", 3, 30) -- doctor juris
    	set measurements showing to true
    end tell
    
    
    
    on kernScript(kernwort, kernStelle, kernWert)
    	tell document 1 of application "QuarkXPress Passport"
    		beep
    		display dialog kernwort & " wird gesucht und gekernt." buttons {"OK"}
    		
    		try
    			set theList to the object reference of every text of every story where it is kernwort
    			if class of theList is not list then copy (coerce theList to list) to theList
    		on error
    			beep 2
    		end try
    		
    		repeat with theMatchingText in theList
    			set the kern of character kernStelle of theMatchingText to kernWert
    		end repeat
    	end tell
    end kernScript
    

    Wenn ich in Quark nun den Text "Dies ist ein d.O. Test" in einen Textrahmen platziere und dann das Script laufen lasse, wird zwischen d.|O. gekernt (18 Einheiten), aber auch zwischen O|. (und hier mit 30 Einheiten!?).

    Zweite Frage: Wenn ich mehrere Kernpaare definiere, wird das Script ziemmlich langsam. Sieht jemand eine Möglichkeit, den Ablauf etwas zu beschleunigen?

    Letzte Frage: Ich habe das Script teilweise zusammenkopiert und versuche nun es zu vertehen. Warum muss in Quark die Palette ausgeblendet werden?

    Dankeschön!
    MiCHi
     
  4. Daisy

    Daisy Uelzener Rambour

    Dabei seit:
    14.01.06
    Beiträge:
    366
    Hallo Michi,

    zumindest deine erste Frage kann ich schon mal beantworten. Der Fehler liegt daran, dass du die Variable 'theList' als global definiert hast und Quark sie in dem Fall, wenn nach "Dr.jur" gesucht wird (und nix gefunden) nicht neu setzt - d.H. da steht dann immer noch das Suchergebnis von "d.O." - und dein Script kernt dementsprechend die 3. Position mit plus 30.

    Abhilfe? - Entferne alle 3 global-Definitionen - keine ist m.E. erforderlich (da du ja theList und matchingText nicht ausserhalb von "on kernScript(...)" verwenden möchtest und measurements solltest du schon überhaupt nicht als global-Variable definieren, da das eines von Quark's AppleScript-Keywords ist - und auch in deinem Script gar nicht als Variable verwendet wird).
    Um dann Fehler bei der Ausführung zu vermeiden, musst du nur noch am Anfang von "on kernScript()" theList den Wert einer leeren Liste zuweisen.
    So könnte es aussehen:


    Code:
    tell application "QuarkXPress Passport"
    	activate
    	set measurements showing to false
    	my kernScript("d.O.", 2, 18) -- der/die Obige
    	my kernScript("Dr.jur.", 3, 30) -- doctor juris
    	set measurements showing to true
    end tell
    
    
    
    on kernScript(kernwort, kernStelle, kernWert)
    	set theList to {}
    	tell document 1 of application "QuarkXPress Passport"
    		beep
    		display dialog kernwort & " wird gesucht und gekernt." buttons {"OK"}
    		
    		try
    			set theList to the object reference of every text of every story where it is kernwort
    			repeat with theMatchingText in theList
    				set the kern of character kernStelle of theMatchingText to kernWert
    			end repeat
    		on error
    			beep 2
    		end try
    		
    	end tell
    end kernScript
    Ich habe, wie du siehst, auch noch diese Zeile eliminiert:
    Code:
    			if class of theList is not list then copy (coerce theList to list) to theList
    
    Ich sehe darin keinen Sinn - mir ist zumindest nicht bekannt, dass die darüberstehende Anweisung (set theList to ...) ein Ergebnis liefern könnte, das keine List ist. Es liefert entweder eine Liste oder es tritt ein Fehler auf - beides wäre m.E. auch so erschlagen.


    Zur zweiten Frage habe ich leider gerade auch keine gute Idee und zu deiner dritten Frage - wenn das bei Quark so ist, dann 'ist das halt so'. Ich glaube nicht, dass es da etwas wirklich Relevantes zu verstehen gibt. Vielleicht wollten die Entwickler einfach das gleichzeitige Bearbeiten über ein Script und durch manuelle Usereingaben verhindern.

    Grüße,

    Daisy
     
  5. aumic

    aumic Alkmene

    Dabei seit:
    30.10.06
    Beiträge:
    32
    Hallo Daisy,
    vielen Dank für Deine sehr ausführliche Antwort!

    Ich werde mich am Wochenende nochmal ausführlich mit diesem Script beschäftigen. Ich denke aber, dank Deiner Hilfe komme ich jetzt gut damit klar!

    MiCHi
     

Diese Seite empfehlen