• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Automatisches kernen in Quark XPress

aumic

Alkmene
Registriert
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
 

Daisy

Uelzener Rambour
Registriert
14.01.06
Beiträge
366
Code:
		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
Wäre nett, wenn sich das Script jemand anschauen könnte.

Danke!
Michi

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 ...
 

aumic

Alkmene
Registriert
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
 

Daisy

Uelzener Rambour
Registriert
14.01.06
Beiträge
366
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

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
 

aumic

Alkmene
Registriert
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