Archiv der Kategorie: Lernen

Element-Inhalt markieren

Im Forum frameusers-de kam die Frage auf nach einem Tastaturkürzel, mit dessen Hilfe man nur den Inhalt eines Elements markieren könnte.

Markus Wiedenmaier präsentierte daraufhin eine Lösung mit ExtendScript für FrameMaker 10, seinen Code habe ich nach FrameScript übertragen, die wichtigsten Zeilen folgen. Die aktuelle Version kann hier geladen werden:

Das Skript muss installiert werden und erstellt zur Zeit zwei Menüpunkte am Ende des Menüs „Element“, die Tastenkürzel sind Esc h e t (highlight element text) bzw. Esc h e c (highlight element content).

Event Initialize
    If (Session.ProductIsStructured)
        Local lvMenu lvCmd;

        Get Object Type(Menu) Name('ElementMenu') NewVar(lvMenu);
        New Command Name('SWAT_CMD_SELECTELEMENTTEXT')
            Label('Select text node') Shortcut('\!het')
            NewVar(lvCmd) EventProc(SelectText) 
            AddTo(lvMenu) EnabledWhen(EnableNeedsDocpOnly);
        Set lvCmd.KeyboardShortcutLabel = 'Esc h e t';
        New Command Name('SWAT_CMD_SELECTELEMENTCONTENT')
            Label('Select element content') Shortcut('\!hec')
            NewVar(lvCmd) EventProc(SelectContent) 
            AddTo(lvMenu) EnabledWhen(EnableNeedsDocpOnly);
        Set lvCmd.KeyboardShortcutLabel = 'Esc h e c';

    EndIf
EndEvent

Event SelectText
    Local lvDoc(Session.ActiveDoc);
    Local lvSel(lvDoc.ElementSelection);
    Set lvSel.Begin.Offset = 0;
    Set lvSel.End.Offset = ObjEndOffset;
    Local lvTextRange;
    // EUtl.Convert{} requires version 5
    Set lvTextRange = EUtl.Convert{lvSel, 'TextRange'};
    Set lvDoc.TextSelection = lvTextRange;
EndEvent

Event SelectContent
    Local lvDoc(Session.ActiveDoc);
    Local lvSel(lvDoc.ElementSelection);
    Local lvCurrentElement;
    If (lvSel.Begin.Child
      and lvSel.Begin.Child.ElementDef 
      and lvSel.Begin.Offset = 0)
        Set lvCurrentElement = lvSel.Begin.Child;
    Else
        Set lvCurrentElement = lvSel.Begin.Parent;
    EndIf
    Local lvTextRange;
    Set lvTextRange = lvCurrentElement.TextRange;
    Set lvTextRange.Begin.Offset = lvTextRange.Begin.Offset + 1;
    Set lvDoc.TextSelection = lvTextRange;
EndEvent
Veröffentlicht unter Lernen | Kommentare deaktiviert für Element-Inhalt markieren

Gestrichelte Linien in Tabellen

Eigentlich geht das nicht. Aber uneigentlich lässt sich für manche Fälle etwas mogeln, denn zu den Linieneigenschaften gehört neben Farbe (.Color) und Dicke (.Borderwidth) auch .Pen: Mit dieser Angabe wird einer der 16 Werte gewählt, der auch auf der Grafiken-Toolbar angeboten wird: Die ersten 8 (Werte 0…7) sind die Graustufen von 100% (Konstante: FillBlack) bis 0% (FillWhite), dann folgen sieben Muster (Werte 8…14), bevor es mit »keine Linie« (FillClear) abschließt. Und mit Hilfe dieser Muster kann man gestrichelte Linien simulieren, zugegeben mit wenig Einstellvarianten. Um dies on-the fly in einem Dokument für den Lineatur-Still »Blau« auszuprobieren, reicht folgendes kleine Skript:

Set lvObj = ActiveDoc.FirstRulingFmtInDoc;
Loop While(lvObj)
 If (lvObj.Name = 'Blau')
   Set lvObj.Pen = 11; // Werte von 8...14 ergeben gestrichelt
   Display lvObj.Properties;
 EndIf
 Set lvObj = lvObj.NextRulingFmtInDoc;
EndLoop

Ohne FrameScript geht es auch in der MIF-Datei, dort sieht es z.B. so aus:


 ...
 
 
># end of Ruling

Wie die Muster aussehen, kann von den Einstellungen des Druckertreiber abhängen, sollte sich in einer einmal erstellten PDF-Datei dann aber nicht mehr ändern. Bei den Mustern 10 (senkrecht) und 11 (waagrecht) kann es je nach Liniendicke bei vertikalen bzw. horizontalen Linien zu Ausfällen kommen. Hier eine Beispieldatei, die auch die verschiedenen Muster-Optionen zeigt: Gestrichelte Linien

Veröffentlicht unter Lernen | Kommentare deaktiviert für Gestrichelte Linien in Tabellen

Linienhintergrund automatisch erstellen

Wenn Sie Ihre Grafiken mit FrameMaker-Werkzeugen beschriften, werden Sie den Wunsch haben, die schwarzen Beschriftungslinien mit einer hellen Kontrastfarbe zu hinterlegen, damit dies auch auf dunklem Untergrund sichtbar bleibt. Zum Beispiel könnten Sie eine 1pt starke schwarze Linie mit einer 3pt weißen Linie hinterlegen wollen.

Voilá, das ist eine Aufgabe, die ich einmal mit FrameScript und ExtendScript angehen möchte, auch um die Gemeinsamkeiten und Unterschiede deutlich werden zu lassen. Wenn es Ihnen konkret hilft, fein!

Es stellt sich heraus, dass diese Teilaufgabe – wie vermutlich die meisten Aufgaben, die sich nur mit FrameMaker-Dokumenten beschäftigen – prinzipiell identisch gelöst wird. Ich gehe wie folgt vor:

Veröffentlicht unter Lernen, Lernen | 2 Kommentare

Kalender-Skript für 2011

Das FrameScript-Team stellt ein Skript zur Erstellung von Kalenderblättern mit FrameMaker bereit, quasi als Weihnachtsgeschenk. Alle weiteren Infos dazu finden sich auf

Schöne Feiertage!

Veröffentlicht unter Lernen | Kommentare deaktiviert für Kalender-Skript für 2011

»Vorgabeseiten automatisch zuweisen« und andere Meldungen unterdrücken

Im März 2009 hatte ich das Tool Push That Freakin’ Button (PTFB) vorgestellt, um bestimmte Dialoge automatisch wegklicken zu lassen. Nun, es geht auch mit FrameScript, auch wenn es manchmal ein paar Jahre dauert, bis man herausgefunden hat wie. Der Input für das folgende Skript stammt aus zwei Beiträgen in der [frame_dev]-Liste von Rick Quatro und Markus Wiedenmaier. Dieses Event-Skript (es muss installiert werden!) unterdrückt zur Zeit die Dialoge:

  • Alle Vorgabeseiten werden erneut zugewiesen…
  • Kann importierte Grafiken nicht anzeigen…
  • Die Schriftinformation für Ihr System hat sich geändert…

Dabei erscheinen die betreffenden Dialoge gar nicht erst, eine bessere Lösung als ein Auto-Klicker.

Event NoteAlert
    Local lvUnique(0) YesOperation(-10005);
    Get Member Number(1) From(Session.ActiveAlert.Properties) 
        NewVar(lvUnique);
    Set lvUnique = lvUnique.PropVal;
    If (lvUnique = 40086)
        Write Console 'NoteAlert ' + lvUnique + ': YES';
        Return Value(YesOperation);
    ElseIf (lvUnique = 40090)
        Write Console 'NoteAlert ' + lvUnique + ': YES';
        Return Value(YesOperation);
    ElseIf (lvUnique = 46001)
        If (EStr.FindString{FileName, 'All master pages will be reapplied.'} = 1)
            Write Console 'NoteAlert ' + lvUnique + ': YES';
            Return Value(YesOperation);
        ElseIf (EStr.FindString{FileName, 'Alle Vorgabeseiten werden erneut zugewiesen.'} = 1)
            Write Console 'NoteAlert ' + lvUnique + ': YES';
            Return Value(YesOperation);
        Else
            Write Console 'NoteAlert ' + lvUnique + ': ' 
                + EStr.ReplaceAll{FileName, CharLF, ' '};
        EndIf
    ElseIf (lvUnique = 0) // Alerts without unique IDs
        If (EStr.FindString{FileName, 'The font information for your system has changed.'} = 1)
            Write Console 'NoteAlert ' + lvUnique + ': YES';
            Return Value(YesOperation);
        ElseIf (EStr.FindString{FileName, 'Die Schriftinformation für Ihr System hat sich ge'} = 1)
            Write Console 'NoteAlert ' + lvUnique + ': YES';
            Return Value(YesOperation);
        Else
            Write Console 'NoteAlert ' + lvUnique + ': ' 
                + EStr.ReplaceAll{FileName, CharLF, ' '};
        EndIf
    Else
        Write Console 'NoteAlert ' + lvUnique + ': ' 
            + EStr.ReplaceAll{FileName, CharLF, ' '};
    EndIf
EndEvent

Mit Hilfe der Befehle Write Console können Sie in der Konsole nachverfolgen, bei welchen Alerts das Skript eingegriffen hat und welche zusätzlich erkannt wurden.

Kennen Sie weitere, unterdrückenswerte Meldungen?

Veröffentlicht unter Lernen | Ein Kommentar