Nicht verwendete Vorgabeseiten löschen

(Übersetzung von »Deleting Unused Master Pages« von Rick Quatro)

Ein Teil des Bereinigens von FrameMaker-Dokumenten besteht im Löschen nicht verwendeter Formate. Dieses Tutorial zeigt Ihnen mehrere Methoden zum Löschen nicht verwendeter Vorgabeseiten aus einem Dokument.

Name angeben

Der einfachste Ansatz liegt im Angeben des Namens einer Vorgabeseite, die Sie löschen möchten. Das folgende einfache Skript löscht eine Vorgabeseite namens »Titelseite« aus dem aktiven Dokument.

If ActiveDoc = 0
    MsgBox 'Kein aktives Dokument. ';
    LeaveSub;
Else
    Set vCurrentDoc = ActiveDoc;
EndIf
Set vPage = vCurrentDoc.FirstMasterPageInDoc;
Loop While(vPage)
    If vPage.Name = 'Titelseite'
        Set vDelete = vPage;
        Set vPage = vPage.PageNext;
        Delete Object(vDelete);
    Else
        Set vPage = vPage.PageNext;
    EndIf
EndLoop

Dies funktioniert zwar, bringt aber ein paar Probleme mit sich. Erstens wird nur eine Vorgabeseite gelöscht, obwohl Sie möglicherweise mehr als eine Vorgabeseite aus einem Dokument löschen möchten. Ein weniger offensichtliches, dafür aber gefährlicheres Problem besteht darin, dass das Skript vor dem Löschen nicht überprüft, ob die Vorgabeseite im Dokument verwendet wird. Wenn Sie über die FrameMaker-Oberfläche versuchen, eine Vorgabeseite zu löschen, die einer Seite zugewiesen ist, wird eine Warnmeldung eingeblendet.

Fehlermeldung beim Löschen von Vorgabeseiten

Im Gegensatz dazu wird FrameScript die Vorgabeseite gehorsam löschen, selbst wenn diese einer oder mehreren Seiten im Dokument zugewiesen ist. Alle Seiten, denen diese Vorgabeseite zugewiesen war, verfügen nun über keine zugewiesene Vorgabeseite mehr (»Keine«). Dies bedeutet, dass sämtliche Hintergrundobjekte wie beispielsweise Kopf- und Fußzeilen verloren gehen. Und das werden Sie doch sicher nicht wollen. Genau wie FrameMaker wird auch FrameScript die Vorgabeseiten Rechts oder Links nicht löschen.

Erzeugen einer Liste der Vorgabeseiten im Skript

Bevor Sie sich dem zweiten Problem zuwenden, behandeln Sie zunächst das Erste. Wir gehen davon aus, dass Sie mehrere Vorgabeseiten löschen möchten und außerdem wissen, dass diese nicht verwendet werden. Sie erzeugen also eine StringList, die alle Namen der zu löschenden Vorgabeseiten enthält. Dies ist der erste Teil des Skripts:

If ActiveDoc = 0
    MsgBox 'Kein aktives Dokument. ';
    LeaveSub;
Else
    Set vCurrentDoc = ActiveDoc;
EndIf
New StringList NewVar(vPagesToDelete);
Add Member('Titelseite') To(vPagesToDelete);
Add Member('Signatur') To(vPagesToDelete);
Add Member('Prozedur') To(vPagesToDelete);

Sie erzeugen eine StringList namens vPagesToDelete und fügen drei Namen von Vorgabeseiten zu dieser Liste hinzu. Mit dieser Strategie ist es sehr einfach, weitere Namen von Vorgabeseiten zum Skript hinzuzufügen oder daraus zu entfernen. Die Schleife des Skripts wird so angepasst, dass der Name der Vorgabeseite gegen vPagesToDelete geprüft wird, bevor die Seite gelöscht wird.

Set vPage = vCurrentDoc.FirstMasterPageInDoc;
Loop While(vPage)
    Find Member(vPage.Name) InList(vPagesToDelete)
        ReturnStatus(vFound);
    If vFound // Falls in der Liste, Vorgabeseite löschen.
        Set vDelete = vPage;
        Set vPage = vPage.PageNext;
        Delete Object(vDelete);
    Else
        Set vPage = vPage.PageNext;
    EndIf
EndLoop

Schützen der verwendeten Vorgabeseiten

Es besteht noch immer die Möglichkeit, eine Vorgabeseite zu löschen, die im Dokument verwendet wird. Ein Lösungsweg besteht darin, eine Schleife durch alle Seiten des Dokuments zu starten und zu ermitteln, welche Vorgabeseite jeweils zugewiesen ist. Anschließend finden Sie heraus, ob die Vorgabeseite in der Liste vPagesToDelete enthalten ist. Falls dies der Fall ist, löschen Sie den Namen dieser Vorgabeseite aus der Liste. Fügen Sie folgenden Code in das Skript ein, und zwar vor dem Code, der die Vorgabeseiten löscht:

Loop ForEach(BodyPage) In(vCurrentDoc) LoopVar(vPage)
    Find Member(vPage.MasterPage) InList(vPagesToDelete)
        ReturnStatus(vFound) ReturnPos(vPos);
    If vFound // Falls in Liste, dann aus Liste entfernen.
        Remove Member Number(vPos) From(vPagesToDelete);
    EndIf
EndLoop
//
// Überprüfen, ob noch Elemente in der Liste vorhanden sind.
// Falls nicht, Skript beenden.
If vPagesToDelete.Count = 0
    LeaveSub;
EndIf
//
Set vPage = vCurrentDoc.FirstMasterPageInDoc;
Loop While(vPage)
    Find Member(vPage.Name) InList(vPagesToDelete)
        ReturnStatus(vFound);
    If vFound // Falls in der Liste, Vorgabeseite löschen.
        Set vDelete = vPage;
        Set vPage = vPage.PageNext;
        Delete Object(vDelete);
    Else
        Set vPage = vPage.PageNext;
    EndIf
EndLoop

Beachten Sie, dass das Skript nun vor dem Löschen jeder Vorgabeseite überprüft, ob vPagesToDelete noch Elemente enthält. Es kann schließlich sein, dass alle Vorgabeseiten in Ihrer Liste im Dokument verwendet werden. Ist dies der Fall, dann muss auch keine davon gelöscht werden.

Sie werden vielleicht feststellen, dass die MasterPage-Eigenschaft einer Seite einen leeren String zurückgibt, wenn der entsprechenden Seite eine Standardvorgabeseite zugewiesen ist. Deshalb werden die Elemente Links oder Rechts durch die erste Schleife nicht aus der Liste vPagesToDelete gelöscht. Dies ist aber kein Problem, da FrameScript die Vorgabeseiten Links oder Rechts ohnehin nicht löschen würde.

Übertragen sämtlicher Aufgaben an das Skript

Eine weitere Alternative besteht darin, das Skript so anzupassen, dass es alle nicht verwendeten Vorgabeseiten bestimmt und diese dann löscht. Möglicherweise möchten Sie dies aber nicht, denn selbst wenn Sie eine Vorgabeseite momentan nicht verwenden, so brauchen Sie sie doch vielleicht zu einem späteren Zeitpunkt. Wenn Sie aber über eine gute Vorlagensammlung verfügen, können Sie gelöschte Vorgabeseiten jederzeit wiederherstellen, indem Sie sie importieren. Hier nun ein möglicher Lösungsweg:

If ActiveDoc = 0
    MsgBox 'Kein aktives Dokument. ';
    LeaveSub;
Else
    Set vCurrentDoc = ActiveDoc;
EndIf
New StringList NewVar(vPagesInUse);
Add Member('Links') To(vPagesInUse);
Add Member('Rechts') To(vPagesInUse);
Loop ForEach(BodyPage) In(vCurrentDoc) LoopVar(vPage)
    If vPage.MasterPage not= ''
        Add Member(vPage.MasterPage) To(vPagesInUse);
    EndIf
EndLoop

Bei dieser Variante erhalten Sie eine Liste vPagesInUse, die die Namen aller benutzerdefinierten Vorgabeseiten enthält, die im Dokument verwendet werden. Außerdem fügen Sie die Elemente Links und Rechts zur Liste hinzu, sodass das Skript erst gar nicht den Versuch unternimmt, eine Standardvorgabeseite zu löschen. Jetzt können Sie mit einer Schleife durch die Vorgabeseiten feststellen, ob diese verwendet werden, indem Sie überprüfen, ob sie in der Liste vorhanden sind. Falls nicht, werden Sie vom Skript gelöscht.

Set vPage = vCurrentDoc.FirstMasterPageInDoc;
Loop While(vPage)
    Find Member(vPage.Name) InList(vPagesInUse)
        ReturnStatus(vFound);
    If vFound = 0 // Falls nicht verwendet, Vorgabeseite löschen.
        Set vDelete = vPage;
        Set vPage = vPage.PageNext;
        Delete Object(vDelete);
    Else
        Set vPage = vPage.PageNext;
    EndIf
EndLoop

Klappt alles?

Februar 2008, Michael Müller-Hillebrand