Forenindex » Programmierung/Entwicklung » AppleScript » gleichmässige Verteilung der Tabulatoren

gleichmässige Verteilung der Tabulatoren

Anonym
Beiträge gesamt: 22827

5. Nov 2003, 23:06
Bewertung:

gelesen: 5582

Beitrag als Lesezeichen
Hallo zusammen,

grüble schon seit einiger Zeit darüber nach, ob es nicht möglich ist ein Script zu fertigen, mit dem ich die Tabulatoren gleichmässig verteilen kann. Ist mir noch nicht gelungen.
Habe verschiedene (Katalog-)Texte mit Tabellen, bei denen mal 4 oder 5 oder 7 Spalten erscheinen. Könnte man die nicht per Skript ordentlich verteilen.
Habt Ihr da Erfahrungen?

Würde mich über Eure Antworten freuen,

Gruß

Andreas :?  :?:

gleichmässige Verteilung der Tabulatoren

Hans Haesler
  
Beiträge gesamt: 5826

6. Nov 2003, 00:12
Bewertung:

gelesen: 5581

Beitrag als Lesezeichen
Hallo Andreas,

ich nehme an, dass keine Tabulator-Positionen definiert sind und dass das Script dies vornehmen sollte.
Welche Ausrichtung wünschest Du Dir? Beginnen die Zeilen mit Text oder mit einem Tabulatoren?

Könntest Du mir ein Muster-Dokument senden mit zwei, drei unformatierten Beispielen und die gleichen
Texte, aber mit den definierten Tab-Stops?

Und: benutzt Du immer noch QuarkXPress 4.11?

Hans Haesler <hsa@ringier.ch>

gleichmässige Verteilung der Tabulatoren

Anonym
Beiträge gesamt: 22827

6. Nov 2003, 11:41
Bewertung:

gelesen: 5581

Beitrag als Lesezeichen
Hallo Hans,

vorab: was wäre dieses Forum ohne dich?

Vielleicht erinnerst du dich, dass ich primär mit FileMaker arbeite.
Habe nun eine umfassende Database-Publishing-Lösung entwickelt, bei der aber immer wieder was zu optimieren ist.
Hier nun also die Tabulatorengeschichte.
Im folgenden sind Denkirrtümer nicht ganz ausgeschlossen und für einen Hinweis bin ich dankbar:

Es werden also Katalogdaten exportiert, die dann in XPress als Text mit XPressmarken importiert werden.
Da diese Daten immer unterschiedlich sein können, macht eine Defintion der Tabstopps in XPress (noch immer 4.11, bis ich eines besseren belehrt werde) nicht viel Sinn, vorallem, weil ich in FM steuern kann, wieviele Spalten ich anlegen will (eigentlich eher Textbox-Breiten).
Und nun denke ich mir, wäre so eine gleichmäßige Verteilung der Tabbs (der Problematik der unterschiedlichen Texte und deren Länge wohl eingedenk) doch ne dolle Sache.

Der Aufbau sieht folgendermaßen aus:
Erst ne Bestellnummer (linksbündig) dann ein Textlein (linksbündig) tja und dann meistens (außer in der Tabellenüberschift) Zahlenwerte (rechtsbündig, gekrönt von einem Preis, der eigentlich ja wohl immer ganz rechts stehen könnte.

Es sind also nicht bestimmte Quarkdokumente, die zu knacken sind, sondern die werden immer wieder generiert.

Hoffe das war nicht zu viel und zu wirr.

Freundlichen Gruß

Andreas

Wer Schreibfehler findet, darf sie gern behalten!

gleichmässige Verteilung der Tabulatoren

Hans Haesler
  
Beiträge gesamt: 5826

6. Nov 2003, 12:49
Bewertung:

gelesen: 5581

Beitrag als Lesezeichen
Hallo Andreas,

&#133; oder: was wäre ich ohne dieses Forum? Wenn nur die Fragen öfters etwas leichter wären. ;-)

Also &#133; wenn ich richtig verstehe, dann möchtest Du die Kolonnenbreiten nach der Länge der Zeilen ausrichten. Es wäre schon schwierig genug, jeder Kolonne die gleiche Breite zuzuweisen &#133; Doch: ich habe eine Idee, wie man es anpacken könnte. Aber die Umsetzung wird zeitaufwendig sein. Und im Moment bin ich mitten in den Vorbereitungen für eine Schulung. Ich muss Dich also leider bis Sonntag, 16. November warten lassen.

In der Zwischenzeit: könntest Du mir ein Musterdokument zukommen lassen? In einer Box der Tabellentext, wie er eingeflossen ist. Und eine Kopie dieser Box mit definierten Tabstops. Danke für die Geduld.

Hans Haesler <hsa@ringier.ch>

gleichmässige Verteilung der Tabulatoren

Hans Haesler
  
Beiträge gesamt: 5826

16. Nov 2003, 22:31
Bewertung:

gelesen: 5581

Beitrag als Lesezeichen
Hallo Andreas,

wie versprochen, habe ich mich heute Deinem Problem angenommen und es tatsächlich geschafft, die Tabellenspalten gleichmässig zu verteilen. Es war noch schwieriger, als ich es mir vorgestellt hatte, weil die Breite der einzelnen Elemente nur buchstabenweise ausgezogen werden kann. Diese Werte müssen in Bruchzahlen umgewandelt und dann addiert werden.

Das Script funktioniert &#133; aber nur mit einer bekannten Anzahl von Spalten. Nächste Etappe: Die dynamische Dimension einbauen. Das heisst, das Script so erweitern, dass es sich der Anzahl Spalten anpasst. Und dazu brauche ich noch etwas Zeit. Ich werde mich wieder melden.

Hans Haesler <hsa@ringier.ch>

gleichmässige Verteilung der Tabulatoren

Anonym
Beiträge gesamt: 22827

19. Nov 2003, 17:00
Bewertung:

gelesen: 5581

Beitrag als Lesezeichen
Hallo Hans,

was soll ich sagen?

Finde ich ja wirklich toll, dass du dich damit so ausführlich beschäftigst! (War selber ein wenig mit anderen Sachen blockiert...)

Würde mich sehr interessieren, wie Du das bislang gemacht hast?

Willst Du noch von mir die Daten?

Wie gesagt, es ist ein Textexport mit XPress-Marken, die Stile sind dann in XPress formatiert.

Bislang habe ich aber nur Tabulatoren drin, deren jeweilige Position aber noch nicht berücksichtigt ist.

Spalten werden in  FM definiert, bzw. Satzspiegel und dann wieviele Spalten (plus Abstand), sprich jeweils soviele Textrahmen nebeneinander, wie angegeben (also eigentlich nicht das Spaltenformat von XPress).


Habe eigentlich ein schlechtes Gewissen, dass Du Dich da so reinkniest. Vergelt's Gott!

Viele Grüsse

Andreas

gleichmässige Verteilung der Tabulatoren

Hans Haesler
  
Beiträge gesamt: 5826

19. Nov 2003, 18:21
Bewertung:

gelesen: 5581

Beitrag als Lesezeichen
Hallo Andreas,

kein Problem! Heute war ich den ganzen Tag abwesend. Und heute Abend muss ich eine dringende Arbeit fertigstellen.

Ich kann nur so zwischenhinein die Entwicklung vorantreiben. Es ist ziemlich zeitaufwendig, weil bei einem nicht korrekten Ergebnis wieder alle Zwischenresultate untersucht und analysiert werden müssen. Gestern Abend hatte ich die dynamische Version des Scripts fertiggestellt. Bei der Musterbox mit vier Tabulatoren klappte es wunderbar. Dann fügte ich eine weitere Kolonne ein und &#133; es klappte nicht mehr.

Ja, ich hätte gerne ein konkretes Dokument mit zwei Boxen. Die erste mit dem Text im "Rohzustand" und die zweite in welcher die Tabstops definiert sind.

Hans Haesler <hsa@ringier.ch>

gleichmässige Verteilung der Tabulatoren

Hans Haesler
  
Beiträge gesamt: 5826

24. Nov 2003, 15:08
Bewertung:

gelesen: 5581

Beitrag als Lesezeichen
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>

gleichmässige Verteilung der Tabulatoren

Anonym
Beiträge gesamt: 22827

4. Dez 2003, 11:25
Bewertung:

gelesen: 5581

Beitrag als Lesezeichen
:|
Hallo Hans,

tut mir furchbar leid, dass ich mich jetzt erst melde, nachdem du hier eine Doktorarbeit abgeliefert hast. Aber es war einfach zu viel los und ich öfters unterwegs.Hrmpf...

Das hört sich wahrlich kompliziert an und ich würde mich freuen, wenn du mir das Werk per e-mail zusenden würdest, falls du mir nicht zu sehr grollst. (andreasbodenstein@yahoo.com)

Es hört sich alles sehr logisch an und ich bin gespannt, wie es läuft und aufgebaut ist.

Also nochmals Entschuldigung für die späte Rückmeldung. Sie soll nicht von Desinteresse zeugen, im Gegenteil!

Viele Grüße

Andreas

gleichmässige Verteilung der Tabulatoren

Hans Haesler
  
Beiträge gesamt: 5826

4. Dez 2003, 15:44
Bewertung:

gelesen: 5581

Beitrag als Lesezeichen
Halloooooo Andreas,

ich habe mich schon Sorgen um Dich gemacht. ;-) Im Ernst: kein Problem. Jeder hat seine Verpflichtungen und Prioritäten.

Nochmals in Kürze die Grenzen des Scripts. Die Ausrichtung der Tabulator-Definitionen ist fix im Script definiert: die beiden ersten Kolonnen sind links aliniert, alle weiteren rechts. Das Problem dabei ist, dass das Script für einen andern Typ von Tabelle angepasst werden muss.

Mehr Flexibilität würde aber vom Anwender verlangen, dass er zum Beispiel im ersten Absatz die Tabulatoren an ungefährer Position setzt und dass das Script die Ausrichtungen übernehmen würde. Denkbar ist auch ein Dialog, in welchem mit Checkboxen die Ausrichtung mitgeteilt werden könnte.

Aber dadurch würde die Umsetzung erheblich komplizierter. Deshalb versuchen wir es zuerst mit der fertigen Lösung. Das Script ist unterwegs.

Hans Haesler <hsa@ringier.ch>

gleichmässige Verteilung der Tabulatoren

Hans Haesler
  
Beiträge gesamt: 5826

4. Dez 2003, 22:07
Bewertung:

gelesen: 5581

Beitrag als Lesezeichen
Also &#133; ich habs befürchtet: Andreas meldete, dass das Script mit seinem Dokument nicht funktioniert. Er hängte es an die Message. Die Ursache war rasch gefunden: Der Textabstand der Box ist nicht Null, sondern 1 pt.

Das Script nimmt aber die Gesamtbreite der Box für den Wert des letzten Tabs. Aber wegen des Textabstandes hat dieser keinen Platz und eine Fehlermeldung wird generiert.

Ich habe das Script jetzt so geändert, dass auch der Textabstand berücksichtigt wird.

Hans Haesler <hsa@ringier.ch>