Kruisverwijzingen invoegen

Adobe framemaker Frequently asked questions

kruisverwijzingen invoegen?

Er zijn twee typen kruisverwijzingen in FrameMaker: puntale kruisverwijzingen en alinea-kruisverwijzingen. (Er is een derde type, elementkruisverwijzingen, alleen beschikbaar in FrameMaker+SGML. Deze zelfstudie behandelt elementkruisverwijzingen niet). Zowel alinea- als puntale kruisverwijzingen zijn vergelijkbaar, omdat u een Xref-object moet invoegen dat naar een Cross-Ref Marker verwijst. Het Xref-object heeft een XRefSrcText-eigenschap die exact moet overeenkomen met de markertekst van de Cross-Ref Marker. Laten we beginnen met puntale kruisverwijzingen, omdat deze iets eenvoudiger te gebruiken zijn.

Puntale kruisverwijzingen

Als voorbeeld volgt hier een tabel met de namen van onderhoudsprocedures die in een document voorkomen. We willen FrameScript gebruiken om kruisverwijzingen te maken van de vermeldingen in de tabel naar de werkelijke procedures in het document. Elke proceduretitel gebruikt een alineaopmaak Heading2.

Kruisverwijzingsmarkers toevoegen
Een principe dat we hier graag willen toepassen bij het oplossen van FrameScript-problemen, is het opdelen van het probleem in kleine taken. Onze eerste taak is het plaatsen van kruisverwijzingsmarkers in elke procedureopschriftalinea. Omdat we weten dat procedures beginnen met Heading2-alinea's, plaatsen we alleen in die alinea's markers. De markertekst wordt ingesteld op de tekst van de alinea. Het is belangrijk dat elke kruisverwijzingsmarker in het document unieke tekst bevat. We nemen aan dat elke Heading2-alinea in ons voorbeeld tekst bevat die uniek is voor alle andere Heading2-alinea's in het document.

// Test for an active document.
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


Elke Heading2-alinea krijgt een kruisverwijzingsmarker aan het begin met de alineiatekst als markertekst. Hier is één van de Heading2-alinea's met het markervenster dat de markertekst toont.

FrameScriptTutorials

Omdat we markers met FrameScript in plaats van de FrameMaker-interface aanmaken, bekijken we de markereigenschappen. U kunt de volgende code uitvoeren met de markeranker geselecteerd om de eigenschappen van de marker te zien. Let op: de eigenschap MarkerText is de tekst die in het dialoogvenster Marker wordt weergegeven.

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

Kruisverwijzingen toevoegen
Nu kunnen we naar de tabel gaan en een script kruisverwijzingen naar de markers ("punten") toevoegen die we eerder hebben ingevoegd. We nemen aan dat de cursor in de tabel staat wanneer de volgende code wordt uitgevoerd.

// Test for an active document.
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;


Nu we in de eerste cel zijn, kunnen we een lus door de cellen starten. Voor elke cel moeten we de tekst "selecteren" zodat de nieuwe kruisverwijzing deze kan vervangen. De eigenschap XRefSrcText van de XRef (kruisverwijzing) wordt ingesteld op de geselecteerde tekst omdat deze overeenkomt met de markertekst van de bijbehorende kruisverwijzingsmarker die eerder is ingevoegd. Om de tekst te selecteren, maken we een tekstbereik, verwijderen we de tekst en voegen we vervolgens het XRef-object op die plaats in.

// 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;


De tabel toont nu de oorspronkelijke tekst vervangen door de kruisverwijzingen. Als u op een van de kruisverwijzingen dubbelklikt, wordt het dialoogvenster Kruisverwijzing geopend, zoals hieronder weergegeven.

FrameScriptTutorials

Het belangrijkste om te onthouden is dat de eigenschap XRef.XRefSrcText exact moet overeenkomen met de eigenschap XRef.MarkerText van de bijbehorende marker, anders krijgt u een onopgeloste kruisverwijzing. Om de eigenschappen van de kruisverwijzing te zien, markeert u een van de kruisverwijzingen en voert u de volgende code uit. Let op de eigenschap 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


Kruisverwijzingen naar andere documenten
Een ander belangrijk kenmerk om op te merken is de eigenschap XRefFile. Voor de bovenstaande kruisverwijzing is dit een NULL-tekenreeks omdat het een interne kruisverwijzing is. Als we naar een ander bestand zouden verwijzen, zou de eigenschap XRefFile het absolute pad naar het andere bestand bevatten.

Alinea-kruisverwijzingen

Voordat we de invoeging van alinea-kruisverwijzingen met FrameScript bespreken, bekijken we hoe ze verschillen van puntale kruisverwijzingen in de FrameMaker-interface. Wanneer u een puntale kruisverwijzing met FrameMaker invoegt, moet u eerst een kruisverwijzingsmarker invoegen voordat u de kruisverwijzing invoegt. U moet een "punt" maken die in het dialoogvenster Kruisverwijzing verschijnt.
In tegenstelling daarvan vereisen alinea-kruisverwijzingen niet het vooraf invoegen van een kruisverwijzingsmarker. In plaats daarvan wijst u naar de gewenste alinea in het dialoogvenster Kruisverwijzing, klikt u op Invoegen, en voegt FrameMaker de kruisverwijzing en de kruisverwijzingsmarker op de juiste plaatsen in.
Na invoeging verschillen puntale en alinea-kruisverwijzingen niet in hun onderliggende basiseigenschappen. Alle kruisverwijzingen worden door FrameScript als XRef-objecten gebruikt. Er is echter een verschil in de manier waarop ze in het dialoogvenster FrameMaker Kruisverwijzing worden weergegeven. Wanneer u op een puntale kruisverwijzing dubbelklikt, toont het dialoogvenster Cross-Ref-markers onder het brontype en markertekst in de rechterkant. Als u op een alinea-kruisverwijzing dubbelklikt, ziet u het alineatiginlabel van de bronalinea onder Brontype en de alineiatekst van elk van de geselecteerde alinea's met Alineatinglabel in de rechterkant. Hieronder ziet u het dialoogvenster Kruisverwijzing met een alinea-kruisverwijzing.
Het verschil tussen de kruisverwijzingstypen komt voort uit een verschil in de syntaxis van de kruisverwijzingsmarkers. Zie dit door een alinea-kruisverwijzing in te voegen, Control-Alt-klik op de kruisverwijzing om naar de bron te gaan en open het markervenster. U ziet de syntaxis van de marker die FrameMaker invoegt met een alinea-kruisverwijzing. Hieronder vindt u een voorbeeldmarkervenster gevolgd door de XRef-eigenschappen.

FrameScriptTutorials

Net als de puntale kruisverwijzingsmarkers die we eerder hebben ingevoegd, ziet u de tekst van de bronalinea in het markervenster en de eigenschap XRefSrcText. Bovendien gaat de alineiatekst vooraf aan een vijfcijferig getal (gevolgd door een dubbele punt en spatie) en de naam van de alineaopmaak van de bronalinea (gevolgd door een dubbele punt en spatie). Deze twee aanvullende onderdelen in de eigenschap XRefSrcText van de XRef zorgen ervoor dat FrameMaker dit als een alinea-kruisverwijzing "ziet".

Kruisverwijzingsmarkers uniek houden
Er is nog een reden voor het verschillende syntaxisverschil tussen alinea- en puntale kruisverwijzingen. Het is essentieel dat Cross-Ref-markers binnen een document uniek zijn. Hoewel u meer dan één kruisverwijzing naar één Cross-Ref-marker kunt hebben, kunt u niet één kruisverwijzing hebben die naar meer dan één marker met dezelfde markertekst verwijst. Wanneer u puntale kruisverwijzingen invoegt, is het aan u om ervoor te zorgen dat elke Cross-Ref-marker uniek is. Wanneer u alinea-kruisverwijzingen invoegt, zorgt FrameMaker ervoor dat de markers die het invoegt uniek zijn door de speciale syntaxis te gebruiken, met name het vijfcijferige serienummer aan de voorkant.

De kruisverwijzingsmarkertekst mag nooit worden gewijzigd nadat de markers zijn ingevoegd. U kunt meerdere kruisverwijzingen hebben die naar dezelfde marker verwijzen; als u de markertekst wijzigt, worden de kruisverwijzingen onopgelost. Evenzo zal het wijzigen van de tekst van de bronalinea de markertekst niet wijzigen.
Voordat we code schrijven om alinea-kruisverwijzingen in te voegen, volgen hier de belangrijkste punten om te onthouden over zowel alinea- als puntale kruisverwijzingen.

  • Een opgeloste kruisverwijzing heeft een XRefSrcText-tekenreekswaarde die exact overeenkomt met de MarkerText-tekenreekswaarde van een Cross-Ref-marker.
  • Beide typen kruisverwijzingen zijn functioneel hetzelfde; ze worden alleen anders weergegeven in het dialoogvenster FrameMaker Kruisverwijzing.
  • Cross-Ref-markertekst moet altijd uniek zijn binnen een document voor beide typen kruisverwijzingen.
  • De tekst van een Cross-Ref-marker mag nooit worden gewijzigd, zelfs niet als het alineatinglabel of de tekst van de alinea verandert.



Alinea-kruisverwijzingen toevoegen
We gebruiken hetzelfde voorbeeld als bij puntale kruisverwijzingen, maar nu voegen we tegelijkertijd de kruisverwijzingen en de bijbehorende marker in. In ons vorige voorbeeld hebben we eerst alle markers ingevoegd en daarna de kruisverwijzingen. We nemen aan dat voor elk item in de tabel een exact overeenkomende Heading2-alinea in het document aanwezig is. Dit is niet altijd een veilige aanname en kan resulteren in onopgeloste kruisverwijzingen.
We beginnen met onze lus door de tabel. De volledige coderingslijst staat hieronder.

// Test for an active document.
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;


Voor elk item in de tabel gaan we een subroutine genaamd FindSourceHeading uitvoeren die probeert de bijbehorende opschrift in het document te vinden. Als er geen overeenkomstig opschrift met dezelfde tekst wordt gevonden, wordt de tekst in de tabelcel rood gemaakt, zodat u gemakkelijk kunt zien dat er een probleem is. Hier volgt de coderingslijst voor de 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


Merk op dat deze code vergelijkbaar is met het eerdere script dat de puntale kruisverwijzingsmarkers invoegde. Het is een eenvoudige lus door de alinea's van het document op zoek naar Heading2-alinea's. Het heeft een aanvullende test om te controleren of de tekst van de alinea overeenkomt met de tekst van de tabelcel.


Comments