Hallo Andreas,
es ist geschafft! :-) Allerdings ist der Code des Scripts zu umfangreich, als dass ich ihn hier zu veröffentlichen wage. Deshalb folgt nur eine kurze Beschreibung. Ich werde Dir das Script privat zustellen (sowie allen Interessierten, welche mir eine kurze Anfrage senden). Bitte teile mir Deine E-mail-Adresse mit.
Das Script beginnt mit den üblichen Tests (ist ein Dokument offen? ist nicht eine Musterseite angezeigt? ist nur eine Box ausgewählt? ist es eine Textbox?). Wenn alles okay ist, dann werden die Positionen der Tabulatoren in jeder Zeile notiert (nicht die Position in Millimetern, sondern die Stellung innerhalb der Textkette). Dazu kommen noch die Positionen des ersten und des letzten Zeichens des aktuellen Absatzes.
Im nächsten Abschnitt werden die Laufweitenwerte der Texteile, welche durch Anfang des Absatzes, Tabulatoren und Ende des Absatzes abgegrenzt sind, ermittelt. Für jeden Absatz wird eine Liste erstellt und diese Listen werden in eine endgültige Liste geschrieben.
Nun wird für jede Kolonne der grösste vorkommende Wert festgestellt. Das Problem dabei ist, dass die Listen horizontal angelegt sind, während sie vertikal abgefragt werden müssen. Damit dies gelingt, wird die Variable 'maxNum' eingesetzt. Dieser wurde beim Durchgehen der Absätze die grösste Anzahl Tabulatoren zugewiesen. Damit weiss man, wieviele Kolonnen vorkommen. Die automatische Zählervariable wird nach jedem Umgang um eins erhöht. Somit können die Werte vertikal abgefragt werden. Die Variable 'maxVal' wird zu Beginn jedes Absatzes auf Null gesetzt. Wenn ein Wert grösser ist, dann wird er ihr zugewiesen.
Nach dem Durchchecken der Werte eines Absatzes wird der Wert von 'maxVal' an eine Liste gehängt. Dann werden die Werte addiert. Das Total ist die Breite, welche die einzelnen breitesten Elemente jeder Kolonne beanspruchen. Anschliessend wird der Raum zwischen den Kolonnen errechnet, nach der Formel: (Boxenbreite minus Textbreite) geteilt durch ((Anzahl Tabs) minus 1).
Dann werden die Positionen für die Tabulatoren ausgerechnet. Recht schwierig, weil für die Position 2 der Wechsel von links nach rechts aliniert erfolgt und man deshalb zwei Textelemente plus Weissraum rechnen muss. Die Werte werden dabei auf halbe oder ganze Millimeter gerundet, damit eventuelle vertikale Linien leichter positioniert werden können. Hier ein Ausschnitt:
---
set posVal to posVal + (whiteSpace)
set defVal to (posVal div 1) + (((((posVal - (posVal div 1)) * 10) + 2.5) div 5) * 0.5)
---
Angenommen, der Wert für 'posVal' ist 36.511782836914, dann wird er dank der Formel auf 36.5 gerundet.
Jetzt muss noch die Liste mit den Definitionen für die Tab-Stops zusammengestellt werden:
---
set tabList to {}
repeat with i from 1 to (countMaxVal - 1)
tell application "QuarkXPress 4.11"
if i = 1 then
set end of tabList to {justification:left justified, position:(item i of my posList)}
else
set end of tabList to {justification:right justified, position:(item i of my posList)}
end if
end tell
end repeat
---
Am Schluss wird die Definition der Tabulatoren allen Absätzen der Auswahl zugewiesen. Dabei muss unterschieden werden, ob nur der Cursor blinkt, oder ob Text ausgewählt ist:
---
tell document 1 of application "QuarkXPress 4.11"
tell selection
if numPara = 1 then
tell paragraph 1
set tab list to tabList
end tell
else
tell every paragraph
set tab list to tabList
end tell
end if
end tell
end tell
---
Hans Haesler <hsa@ringier.ch>
als Antwort auf: [#418410]