Wie man querverweise einfügt

Adobe framemaker Frequently asked questions

wie man querverweise einfügt?

Es gibt zwei Arten von Querverweisen in FrameMaker: Spot-Querverweise und Absatz-Querverweise. (Es gibt einen dritten Typ, Element-Querverweise, der nur in FrameMaker+SGML verfügbar ist. Dieses Tutorial behandelt Element-Querverweise nicht). Sowohl Absatz- als auch Spot-Querverweise sind sich ähnlich, da Sie ein Xref-Objekt einfügen müssen, das auf eine Cross-Ref Marker verweist. Das Xref-Objekt hat eine XRefSrcText-Eigenschaft, die genau mit dem Marker-Text der Cross-Ref Marker übereinstimmen muss. Beginnen wir mit Spot-Querverweisen, da sie etwas einfacher zu handhaben sind.

Spot-Querverweise

Als Beispiel folgt eine Tabelle mit den Namen von Wartungsverfahren, die in einem Dokument vorkommen. Wir möchten FrameScript verwenden, um Querverweise von den Einträgen in der Tabelle zu den eigentlichen Verfahren im Dokument zu erstellen. Jeder Verfahrenstitel verwendet ein Heading2-Absatzformat.

Querverweis-Marker hinzufügen
Ein Prinzip, das wir bei der Problemlösung mit FrameScript gerne anwenden, ist die Zerlegung des Problems in kleine Aufgaben. Unsere erste Aufgabe besteht darin, Querverweis-Marker in jeden Verfahrensüberschrift-Absatz zu setzen. Da wir wissen, dass Verfahren mit Heading2-Absätzen beginnen, werden wir Marker nur in diesen Absätzen platzieren. Der Marker-Text wird auf den Text des Absatzes gesetzt. Es ist wichtig, dass jeder Querverweis-Marker im Dokument einen eindeutigen Text enthält. In unserem Beispiel gehen wir davon aus, dass jeder Heading2-Absatz Text enthält, der von allen anderen Heading2-Absätzen im Dokument eindeutig ist.

// Test für ein aktives Dokument.
If ActiveDoc = 0
MsgBox 'No active document. ';
LeaveSub;
Else
Set vCurrentDoc = ActiveDoc;
EndIf


Loop ForEach(Pgf) In(vCurrentDoc) LoopVar(vPgf)
If vPgf.Name = 'Heading2'
New Marker NewVar(vMarker) MarkerName('Cross-Ref')
TextLoc(vPgf);
// Set the marker text to the paragraph text.
Set vMarker.MarkerText = vPgf.Text;
EndIf
EndLoop


Jeder Heading2-Absatz erhält einen Querverweis-Marker am Anfang mit dem Text des Absatzes als Marker-Text. Hier ist einer der Heading2-Absätze mit dem Marker-Fenster, das den Marker-Text anzeigt.

FrameScriptTutorials

Da wir Marker mit FrameScript statt mit der FrameMaker-Oberfläche erstellen, schauen wir uns die Marker-Eigenschaften an. Sie können den folgenden Code mit dem ausgewählten Marker-Anker ausführen, um die Marker-Eigenschaften zu sehen. Beachten Sie, dass die Eigenschaft MarkerText der Text ist, der im Marker-Dialog angezeigt wird.

Get TextList InRange(TextSelection) MarkerAnchor
NewVar(vTextList);
If vTextList.Count > 0
Get Member Number(1) From(vTextList) NewVar(vMarker);
Set vMarker = vMarker.TextData;
Display vMarker.Properties;
Else
MsgBox 'There is no marker selected. ';
EndIf


FrameScriptTutorials

Querverweise hinzufügen
Jetzt können wir zur Tabelle gehen und ein Skript Querverweise zu den Markierungen („Spots") hinzufügen, die wir zuvor eingefügt haben. Wir gehen davon aus, dass sich der Cursor in der Tabelle befindet, wenn der folgende Code ausgeführt wird.

// Test für ein aktives Dokument.
If ActiveDoc = 0
MsgBox 'There is no active document. ';
LeaveSub;
Else
Set vCurrentDoc = ActiveDoc;
EndIf


// Set a variable for the current table.
Set vTbl = vCurrentDoc.SelectedTbl;
// Make sure a the cursor is in a table.
If vTbl.ObjectName not= 'Tbl'
MsgBox 'There is no selected table. ';
LeaveSub; // Exit the script.
EndIf
// Find the first body row in the table.
Set vRow = vTbl.FirstRowInTbl;
Loop While(vRow.RowType = RowHeading)
Set vRow = vRow.NextRowInTbl;
EndLoop
// Go to the first cell in the first body row.
Set vCell = vRow.FirstCellInRow;


Jetzt, da wir in der ersten Zelle sind, können wir eine Schleife durch die Zellen beginnen. Für jede Zelle müssen wir den Text „auswählen", damit der neue Querverweis ihn ersetzen kann. Die Eigenschaft XRefSrcText des XRef (Querverweis) wird auf den ausgewählten Text gesetzt, da dieser dem Marker-Text des entsprechenden Querverweis-Markers entspricht, der zuvor eingefügt wurde. Um den Text auszuwählen, erstellen wir einen Text-Bereich, löschen den Text und fügen dann das XRef-Objekt an seiner Stelle ein.

// Begin the loop.
Loop While(vCell)
// Select the text by making a TextRange.
New TextRange NewVar(vTextRange) Object(vCell.FirstPgf)
Offset(0) Offset(ObjEndOffset-1);
// Set a variable for the TextRange text.
Set vXRefSrcText = vTextRange.Text;
// Delete the text.
Delete Text TextRange(vTextRange);
// Insert the cross-reference.
New XRef Format('Heading & Page') TextLoc(vCell.FirstPgf)
NewVar(vXRef);
Set vXRef.XRefSrcText = vXRefSrcText;
// Go to the next cell and repeat the loop.
Set vCell = vCell.CellBelowInCol;
EndLoop
// Update the cross-references.
Update DocObject(vCurrentDoc) XRefs Everything;


Die Tabelle zeigt nun den ursprünglichen Text, ersetzt durch die Querverweise. Wenn Sie auf einen der Querverweise doppelklicken, wird das Querverweis-Dialogfeld wie unten gezeigt geöffnet.

FrameScriptTutorials

Das Wichtigste ist zu beachten, dass die Eigenschaft XRef.XRefSrcText genau mit der Eigenschaft XRef.MarkerText des entsprechenden Markers übereinstimmen muss. Andernfalls erhalten Sie einen nicht aufgelösten Querverweis. Um die Querverweis-Eigenschaften zu sehen, heben Sie einen der Querverweise hervor und führen den folgenden Code aus. Beachten Sie die Eigenschaft XRefSrcText.

Get TextList InRange(TextSelection) XRefBegin
NewVar(vTextList);
If vTextList.Count > 0
Get Member Number(1) From(vTextList) NewVar(XRefBegin);
Set XRefBegin = XRefBegin.TextData;
Display XRefBegin.Properties;
Else
MsgBox 'There is no cross-reference selected. ';
EndIf


Querverweise zu anderen Dokumenten
Eine weitere wichtige Eigenschaft ist die XRefFile-Eigenschaft. Bei dem obigen Querverweis ist es eine leere Zeichenkette, da es sich um einen internen Querverweis handelt. Wenn wir auf eine andere Datei verweisen würden, würde die Eigenschaft XRefFile den absoluten Pfad zur anderen Datei enthalten.

Absatz-Querverweise

Bevor wir die Einfügung von Absatz-Querverweisen mit FrameScript besprechen, schauen wir uns an, wie sie sich von Spot-Querverweisen in der FrameMaker-Oberfläche unterscheiden. Wenn Sie mit FrameMaker einen Spot-Querverweis einfügen, müssen Sie zunächst einen Querverweis-Marker einfügen, bevor Sie den Querverweis einfügen. Sie müssen einen „Spot" erstellen, der im Querverweis-Dialogfeld angezeigt wird.
Im Gegensatz dazu erfordern Absatz-Querverweise nicht die vorherige Einfügung eines Querverweis-Markers. Stattdessen verweisen Sie im Querverweis-Dialogfeld auf den gewünschten Absatz, klicken auf Einfügen, und FrameMaker fügt den Querverweis und den Querverweis-Marker an den entsprechenden Stellen ein.
Nach dem Einfügen unterscheiden sich Spot- und Absatz-Querverweise nicht in ihren grundlegenden Eigenschaften. Auf alle Querverweise wird von FrameScript als XRef-Objekte zugegriffen. Es gibt jedoch einen Unterschied in der Art, wie sie im FrameMaker-Querverweis-Dialogfeld dargestellt werden. Wenn Sie auf einen Spot-Querverweis doppelklicken, zeigt das Dialogfeld Cross-Ref Marker unter Source Type und den Marker-Text in der rechten Liste an. Durch Doppelklick auf einen Absatz-Querverweis wird das Paragraph Tag des Quellabsatzes unter Source Type und der Absatztext jedes ausgewählten Paragraph Tag-Absatzes in der rechten Liste angezeigt. Unten sehen Sie das Querverweis-Dialogfeld mit einem Absatz-Querverweis.
Der Unterschied zwischen den Querverweis-Typen ergibt sich aus einem Unterschied in der Syntax der Querverweis-Marker. Um dies zu sehen, fügen Sie einen Absatz-Querverweis ein, drücken Sie Strg+Alt+Klick auf den Querverweis, um zur Quelle zu gehen, und öffnen Sie das Marker-Fenster. Sie sehen die Syntax des Markers, den FrameMaker mit einem Absatz-Querverweis einfügt. Unten sehen Sie ein Beispiel-Marker-Fenster gefolgt von den XRef-Eigenschaften.

FrameScriptTutorials

Wie die Spot-Querverweis-Marker, die wir zuvor eingefügt haben, können Sie den Text des Quellabsatzes im Marker-Fenster und die Eigenschaft XRefSrcText sehen. Darüber hinaus wird dem Absatztext eine fünfstellige Nummer vorangestellt (gefolgt von Doppelpunkt und Leerzeichen) und der Name des Absatzformats des Quellabsatzes (gefolgt von Doppelpunkt und Leerzeichen). Diese zwei zusätzlichen Komponenten in der Eigenschaft XRefSrcText des XRef führen dazu, dass FrameMaker dies als Absatz-Querverweis „sieht".

Querverweis-Marker eindeutig halten
Es gibt einen weiteren Grund für den Unterschied in der Syntax zwischen Absatz- und Spot-Querverweisen. Es ist wichtig, dass Cross-Ref Marker innerhalb eines Dokuments eindeutig sind. Sie können zwar mehrere Querverweise haben, die auf einen einzelnen Cross-Ref Marker verweisen, aber Sie können keinen einzelnen Querverweis haben, der auf mehrere Marker mit demselben Marker-Text verweist. Wenn Sie Spot-Querverweise einfügen, müssen Sie sicherstellen, dass jeder Cross-Ref Marker eindeutig ist. Wenn Sie Absatz-Querverweise einfügen, stellt FrameMaker sicher, dass die eingefügten Marker eindeutig sind, indem es die spezielle Syntax verwendet, insbesondere die fünfstellige Seriennummer am Anfang.

Der Querverweis-Marker-Text sollte nach dem Einfügen der Marker nie geändert werden. Sie könnten mehrere Querverweise haben, die auf denselben Marker verweisen. Wenn Sie den Marker-Text ändern, würden die Querverweise nicht mehr aufgelöst. Ebenso wird das Ändern des Textes des Quellabsatzes nicht den Marker-Text ändern.
Bevor wir Code zur Einfügung von Absatz-Querverweisen schreiben, folgen hier die wichtigen Punkte, die Sie über Absatz- und Spot-Querverweise beachten sollten.

  • Ein aufgelöster Querverweis hat einen XRefSrcText-Zeichenfolgenwert, der genau mit dem MarkerText-Zeichenfolgenwert eines Cross-Ref Markers übereinstimmt.
  • Beide Querverweis-Typen sind funktional identisch; sie werden nur unterschiedlich im FrameMaker-Querverweis-Dialogfeld dargestellt.
  • Cross-Ref Marker-Text sollte immer innerhalb eines Dokuments für beide Querverweis-Typen eindeutig sein.
  • Der Text eines Cross-Ref Markers sollte niemals geändert werden, auch wenn sich das Paragraph Tag oder der Text seines Absatzes ändern.



Absatz-Querverweise hinzufügen
Wir werden das gleiche Beispiel verwenden, das wir bei Spot-Querverweisen verwendet haben, aber dieses Mal werden wir den Querverweis und seinen entsprechenden Marker gleichzeitig einfügen. In unserem vorherigen Beispiel haben wir zunächst alle Marker eingefügt und dann die Querverweise. Wir gingen davon aus, dass es für jeden Eintrag in der Tabelle genau einen entsprechenden Heading2-Absatz im Dokument gibt. Dies könnte nicht immer eine sichere Annahme sein und könnte zu nicht aufgelösten Querverweisen führen.
Wir beginnen mit unserer Schleife durch die Tabelle. Das komplette Codelisting folgt unten.

// Test für ein aktives Dokument.
If ActiveDoc = 0
MsgBox 'There is no active document. ';
LeaveSub;
Else
Set vCurrentDoc = ActiveDoc;
EndIf
// Set a variable for the current table.
Set vTbl = vCurrentDoc.SelectedTbl;
// Make sure a the cursor is in a table.
If vTbl.ObjectName not= 'Tbl'
MsgBox 'There is no selected table. ';
LeaveSub; // Exit the script.
EndIf
// Make a property list for the color red.
Get Object Type(Color) Name('Red') DocObject(vCurrentDoc)
NewVar(vColor);
New PropertyList NewVar(vProps) Color(vColor);
// Find the first body row in the table.
Set vRow = vTbl.FirstRowInTbl;
Loop While(vRow.RowType = RowHeading)
Set vRow = vRow.NextRowInTbl;
EndLoop
// Go to the first cell in the first body row.
Set vCell = vRow.FirstCellInRow;
// Begin the loop.
Loop While(vCell)
// Select the text by making a TextRange.
New TextRange NewVar(vTextRange) Object(vCell.FirstPgf)
Offset(0) Offset(ObjEndOffset-1);
// Set a variable for the TextRange text.
Set vXRefSrcText = vTextRange.Text;
// Run a subroutine to find the corresponding
heading.
Set vHeadingFound = 0;
Run FindSourceHeading Returns vMarkerText(vXRefSrcText);
If vHeadingFound = 1
// Delete the text.
Delete Text TextRange(vTextRange);
// Insert the cross-reference.
New XRef Format('Heading & Page') TextLoc(vCell.FirstPgf)
NewVar(vXRef);
Set vXRef.XRefSrcText = vXRefSrcText;
Else
// If the corresponding heading can't be found, color the
// text red so it stands out.
Apply TextProperties TextRange(vTextRange)
Properties(vProps);
EndIf
// Go to the next cell and repeat the loop.
Set vCell = vCell.CellBelowInCol;
EndLoop
// Update the cross-references.
Update DocObject(vCurrentDoc) XRefs Everything;


Für jeden Eintrag in der Tabelle werden wir eine Subroutine namens FindSourceHeading ausführen, die versucht, die entsprechende Überschrift im Dokument zu finden. Wenn sie keine entsprechende Überschrift mit demselben Text findet, wendet sie die rote Farbe auf den Text in der Tabellenzelle an, damit Sie leicht erkennen können, dass es ein Problem gibt. Hier ist das Codelisting für die Subroutine.

Sub FindSourceHeading
//
Loop ForEach(Pgf) In(vCurrentDoc) LoopVar(vPgf)
If vPgf.Name = 'Heading2'
// See if the paragraph text is the same as the table
// cell text.
If vPgf.Text = vXRefSrcText
// Make marker text with paragraph cross-ref syntax.
// Get the unique Id of the paragraph and convert it to
// a string.
New String NewVar(vMarkerText) Value(vPgf.Unique);
// Drop the first character so we end up with 5 digits.
Get String FromString(vMarkerText) NewVar(vMarkerText)
StartPos(vMarkerText.Size - 4);
// Add the paragraph tag and text.
Set vMarkerText = vMarkerText + ': ' + vPgf.Name + ': ' +
vPgf.Text;
// Add the cross-reference marker.
New Marker NewVar(vMarker) MarkerName('Cross-Ref')
TextLoc(vPgf);
// Set the marker text to the paragraph text.
Set vMarker.MarkerText = vMarkerText;
// Set the vHeadingFound variable to 1.
Set vHeadingFound = 1;
// Leave the subroutine.
LeaveSub;
EndIf
EndIf
EndLoop
//
EndSub


Beachten Sie, dass dieser Code dem früheren Skript ähnelt, das die Spot-Querverweis-Marker eingefügt hat. Es ist eine einfache Schleife durch die Absätze des Dokuments, die nach Heading2-Absätzen sucht. Er hat einen zusätzlichen Test, um zu prüfen, ob der Text des Absatzes mit dem Text der Tabellenzelle übereinstimmt.


Comments