Come inserire i riferimenti incrociati

Adobe framemaker Frequently asked questions

come inserire i riferimenti incrociati?

In FrameMaker esistono due tipi di riferimenti incrociati: i riferimenti incrociati puntuali e i riferimenti incrociati ai paragrafi. (Esiste un terzo tipo, i riferimenti incrociati agli elementi, disponibile solo in FrameMaker+SGML. Questo tutorial non tratterà i riferimenti incrociati agli elementi). Sia i riferimenti incrociati ai paragrafi che quelli puntuali sono simili, in quanto è necessario inserire un oggetto Xref che punti a un marcatore di riferimento incrociato. L'oggetto Xref ha una proprietà XRefSrcText che deve corrispondere esattamente al testo del marcatore del marcatore di riferimento incrociato. Iniziamo con i riferimenti incrociati puntuali, poiché sono un po' più semplici da utilizzare.

Riferimenti incrociati puntuali

Come esempio, ecco una tabella che contiene i nomi delle procedure di manutenzione che si verificano in un documento. Vogliamo utilizzare FrameScript per creare riferimenti incrociati dalle voci della tabella alle procedure effettive nel documento. Ogni titolo di procedura utilizza un formato di paragrafo Heading2.

Aggiunta di marcatori di riferimento incrociato
Un principio che applichiamo quando risolvono problemi con FrameScript è suddividere il problema in piccole attività. La nostra prima attività è inserire marcatori di riferimento incrociato in ogni paragrafo di intestazione della procedura. Poiché sappiamo che le procedure iniziano con paragrafi Heading2, inseriremo marcatori solo in quei paragrafi. Il testo del marcatore verrà impostato sul testo del paragrafo. È importante che ogni marcatore di riferimento incrociato nel documento contenga testo univoco. Nel nostro esempio, assumeremo che ogni paragrafo Heading2 contenga testo univoco rispetto a tutti gli altri paragrafi Heading2 nel documento.

// Test per un documento attivo.
If ActiveDoc = 0
MsgBox 'Nessun documento attivo. ';
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);
// Imposta il testo del marcatore al testo del paragrafo.
Set vMarker.MarkerText = vPgf.Text;
EndIf
EndLoop


Ogni paragrafo Heading2 avrà un marcatore di riferimento incrociato all'inizio con il testo del paragrafo come testo del marcatore. Ecco uno dei paragrafi Heading2 con la finestra del marcatore che mostra il testo del marcatore.

FrameScriptTutorials

Poiché stiamo creando marcatori con FrameScript anziché con l'interfaccia di FrameMaker, esaminiamo le proprietà del marcatore. È possibile eseguire il codice seguente con l'ancoraggio del marcatore selezionato per visualizzare le proprietà del marcatore. Notare che la proprietà MarkerText è il testo visualizzato nella finestra di dialogo Marcatore.

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 'Nessun marcatore selezionato. ';
EndIf


FrameScriptTutorials

Aggiunta dei riferimenti incrociati
Ora possiamo accedere alla tabella e fare in modo che uno script aggiunga riferimenti incrociati ai marcatori ("punti") inseriti in precedenza. Assumeremo che il cursore sia nella tabella quando viene eseguito il codice seguente.

// Test per un documento attivo.
If ActiveDoc = 0
MsgBox 'Non c'è un documento attivo. ';
LeaveSub;
Else
Set vCurrentDoc = ActiveDoc;
EndIf


// Imposta una variabile per la tabella corrente.
Set vTbl = vCurrentDoc.SelectedTbl;
// Assicurati che il cursore sia in una tabella.
If vTbl.ObjectName not= 'Tbl'
MsgBox 'Non c'è una tabella selezionata. ';
LeaveSub; // Esci dallo script.
EndIf
// Trova la prima riga del corpo nella tabella.
Set vRow = vTbl.FirstRowInTbl;
Loop While(vRow.RowType = RowHeading)
Set vRow = vRow.NextRowInTbl;
EndLoop
// Vai alla prima cella nella prima riga del corpo.
Set vCell = vRow.FirstCellInRow;


Ora che siamo nella prima cella, possiamo iniziare un ciclo verso il basso attraverso le celle. Per ogni cella, è necessario "selezionare" il testo in modo che il nuovo riferimento incrociato possa sostituirlo. La proprietà XRefSrcText dell'XRef (riferimento incrociato) verrà impostata sul testo selezionato poiché corrisponderà al testo del marcatore del marcatore di riferimento incrociato corrispondente inserito in precedenza. Per selezionare il testo, creeremo un intervallo di testo, elimineremo il testo e quindi inseriremo l'oggetto XRef al suo posto.

// Inizia il ciclo.
Loop While(vCell)
// Seleziona il testo creando un intervallo di testo.
New TextRange NewVar(vTextRange) Object(vCell.FirstPgf)
Offset(0) Offset(ObjEndOffset-1);
// Imposta una variabile per il testo dell'intervallo di testo.
Set vXRefSrcText = vTextRange.Text;
// Elimina il testo.
Delete Text TextRange(vTextRange);
// Inserisci il riferimento incrociato.
New XRef Format('Heading & Page') TextLoc(vCell.FirstPgf)
NewVar(vXRef);
Set vXRef.XRefSrcText = vXRefSrcText;
// Vai alla cella successiva e ripeti il ciclo.
Set vCell = vCell.CellBelowInCol;
EndLoop
// Aggiorna i riferimenti incrociati.
Update DocObject(vCurrentDoc) XRefs Everything;


La tabella ora mostra il testo originale sostituito dai riferimenti incrociati. Se fai doppio clic su uno dei riferimenti incrociati, si aprirà la finestra di dialogo Riferimento incrociato come mostrato di seguito.

FrameScriptTutorials

L'aspetto fondamentale da ricordare è che la proprietà XRef.XRefSrcText deve corrispondere esattamente alla proprietà XRef.MarkerText del marcatore corrispondente, altrimenti avrai un riferimento incrociato non risolto. Per visualizzare le proprietà del riferimento incrociato, evidenzia uno dei riferimenti incrociati ed esegui il codice seguente. Notare la proprietà 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 'Nessun riferimento incrociato selezionato. ';
EndIf


Riferimenti incrociati a altri documenti
Un'altra proprietà importante da notare è la proprietà XRefFile. Per il riferimento incrociato precedente è una stringa NULL perché è un riferimento incrociato interno. Se facessimo un riferimento incrociato a un altro file, la proprietà XRefFile conterrebbe il percorso assoluto dell'altro file.

Riferimenti incrociati ai paragrafi

Prima di discutere l'inserimento di riferimenti incrociati ai paragrafi con FrameScript, rivediamo come differiscono dai riferimenti incrociati puntuali nell'interfaccia di FrameMaker. Quando inserisci un riferimento incrociato puntuale con FrameMaker, devi inserire un marcatore di riferimento incrociato prima di inserire il riferimento incrociato. Devi creare un "punto" che apparirà nella finestra di dialogo Riferimento incrociato.
Al contrario, i riferimenti incrociati ai paragrafi non richiedono l'inserimento anticipato di un marcatore di riferimento incrociato. Invece, punti al paragrafo desiderato nella finestra di dialogo Riferimento incrociato, fai clic su Inserisci e FrameMaker inserisce il riferimento incrociato e il marcatore di riferimento incrociato nei posti appropriati.
Una volta inseriti, i riferimenti incrociati puntuali e ai paragrafi non differiscono nelle loro proprietà sottostanti di base. Tutti i riferimenti incrociati sono accessibili come oggetti XRef da FrameScript. C'è una differenza, tuttavia, nel modo in cui vengono presentati nella finestra di dialogo Riferimento incrociato di FrameMaker. Quando fai doppio clic su un riferimento incrociato puntuale, la finestra di dialogo mostra i marcatori Cross-Ref nel Tipo di origine e il testo del marcatore nell'elenco a destra. Facendo doppio clic su un riferimento incrociato ai paragrafi vengono mostrati l'etichetta di paragrafo del paragrafo di origine nel Tipo di origine e il testo del paragrafo per ognuno dei paragrafi dell'etichetta di paragrafo selezionata nell'elenco a destra. Di seguito è riportata la finestra di dialogo Riferimento incrociato che mostra un riferimento incrociato ai paragrafi.
La differenza tra i tipi di riferimento incrociato deriva da una differenza nella sintassi dei marcatori di riferimento incrociato. Per vedere questo, inserisci un riferimento incrociato ai paragrafi, fai Ctrl+Alt+clic sul riferimento incrociato per andare all'origine e apri la finestra del marcatore. Vedrai la sintassi del marcatore che FrameMaker inserisce con un riferimento incrociato ai paragrafi. Di seguito è riportata una finestra del marcatore di esempio seguita dalle proprietà XRef.

FrameScriptTutorials

Come i marcatori di riferimento incrociato puntuale inseriti in precedenza, puoi vedere il testo del paragrafo di origine nella finestra del marcatore e la proprietà XRefSrcText. Inoltre, il testo del paragrafo è preceduto da un numero di cinque cifre (seguito da due punti e spazio) e dal nome del formato di paragrafo del paragrafo di origine (seguito da due punti e spazio). Questi due componenti aggiuntivi nella proprietà XRefSrcText dell'XRef fanno sì che FrameMaker "veda" questo come un riferimento incrociato ai paragrafi.

Mantenimento dei marcatori di riferimento incrociato univoci
C'è un altro motivo per la diversa sintassi tra i riferimenti incrociati ai paragrafi e quelli puntuali. È essenziale che i marcatori Cross-Ref all'interno di un documento siano univoci. Sebbene sia possibile avere più di un riferimento incrociato che punta a un singolo marcatore Cross-Ref, non è possibile avere un singolo riferimento incrociato che cerca di puntare a più di un marcatore con lo stesso testo del marcatore. Quando inserisci riferimenti incrociati puntuali, spetta a te assicurarti che ogni marcatore Cross-Ref sia univoco. Quando inserisci riferimenti incrociati ai paragrafi, FrameMaker assicura che i marcatori che inserisce siano univoci utilizzando la sintassi speciale, in particolare il numero di serie di cinque cifre davanti.

Il testo del marcatore di riferimento incrociato non deve mai essere modificato dopo l'inserimento dei marcatori. Potresti avere diversi riferimenti incrociati che puntano allo stesso marcatore; se modifichi il testo del marcatore, i riferimenti incrociati diventerebbero irrisolti. Allo stesso modo, la modifica del testo del paragrafo di origine non modificherà il testo del marcatore.
Prima di scrivere codice per inserire riferimenti incrociati ai paragrafi, ecco i punti importanti da ricordare su entrambi i tipi di riferimenti incrociati.

  • Un riferimento incrociato risolto avrà un valore stringa XRefSrcText che corrisponde esattamente al valore stringa MarkerText di un marcatore Cross-Ref.
  • Entrambi i tipi di riferimenti incrociati sono funzionalmente identici; vengono solo presentati diversamente nella finestra di dialogo Riferimento incrociato di FrameMaker.
  • Il testo del marcatore Cross-Ref deve essere sempre univoco all'interno di un documento per entrambi i tipi di riferimenti incrociati.
  • Il testo di un marcatore Cross-Ref non deve mai essere modificato, anche se l'etichetta di paragrafo o il testo del suo paragrafo cambiano.



Aggiunta di riferimenti incrociati ai paragrafi
Useremo lo stesso esempio che abbiamo utilizzato con i riferimenti incrociati puntuali, eccetto che questa volta inseriremo il riferimento incrociato e il suo marcatore corrispondente contemporaneamente. Nel nostro esempio precedente, abbiamo inserito tutti i marcatori per primi e poi i riferimenti incrociati. Abbiamo assunto che per ogni voce nella tabella, ci sarebbe un paragrafo Heading2 esattamente corrispondente nel documento. Questa potrebbe non sempre essere un'ipotesi sicura e potrebbe risultare in riferimenti incrociati irrisolti.
Inizieremo con il nostro ciclo attraverso la tabella. L'elenco di codice completo è di seguito.

// Test per un documento attivo.
If ActiveDoc = 0
MsgBox 'Non c'è un documento attivo. ';
LeaveSub;
Else
Set vCurrentDoc = ActiveDoc;
EndIf
// Imposta una variabile per la tabella corrente.
Set vTbl = vCurrentDoc.SelectedTbl;
// Assicurati che il cursore sia in una tabella.
If vTbl.ObjectName not= 'Tbl'
MsgBox 'Non c'è una tabella selezionata. ';
LeaveSub; // Esci dallo script.
EndIf
// Crea un elenco di proprietà per il colore rosso.
Get Object Type(Color) Name('Red') DocObject(vCurrentDoc)
NewVar(vColor);
New PropertyList NewVar(vProps) Color(vColor);
// Trova la prima riga del corpo nella tabella.
Set vRow = vTbl.FirstRowInTbl;
Loop While(vRow.RowType = RowHeading)
Set vRow = vRow.NextRowInTbl;
EndLoop
// Vai alla prima cella nella prima riga del corpo.
Set vCell = vRow.FirstCellInRow;
// Inizia il ciclo.
Loop While(vCell)
// Seleziona il testo creando un intervallo di testo.
New TextRange NewVar(vTextRange) Object(vCell.FirstPgf)
Offset(0) Offset(ObjEndOffset-1);
// Imposta una variabile per il testo dell'intervallo di testo.
Set vXRefSrcText = vTextRange.Text;
// Esegui una subroutine per trovare l'intestazione corrispondente.
Set vHeadingFound = 0;
Run FindSourceHeading Returns vMarkerText(vXRefSrcText);
If vHeadingFound = 1
// Elimina il testo.
Delete Text TextRange(vTextRange);
// Inserisci il riferimento incrociato.
New XRef Format('Heading & Page') TextLoc(vCell.FirstPgf)
NewVar(vXRef);
Set vXRef.XRefSrcText = vXRefSrcText;
Else
// Se l'intestazione corrispondente non può essere trovata, colora il testo in rosso in modo che si noti.
Apply TextProperties TextRange(vTextRange)
Properties(vProps);
EndIf
// Vai alla cella successiva e ripeti il ciclo.
Set vCell = vCell.CellBelowInCol;
EndLoop
// Aggiorna i riferimenti incrociati.
Update DocObject(vCurrentDoc) XRefs Everything;


Per ogni voce nella tabella, eseguiremo una subroutine denominata FindSourceHeading che tenta di individuare l'intestazione corrispondente nel documento. Se non trova un'intestazione corrispondente con lo stesso testo, applicherà il colore rosso al testo nella cella della tabella in modo da poter sapere facilmente che c'è un problema. Ecco l'elenco di codice per la subroutine.

Sub FindSourceHeading
//
Loop ForEach(Pgf) In(vCurrentDoc) LoopVar(vPgf)
If vPgf.Name = 'Heading2'
// Verifica se il testo del paragrafo è lo stesso del testo della cella della tabella.
If vPgf.Text = vXRefSrcText
// Crea testo del marcatore con sintassi di riferimento incrociato ai paragrafi.
// Ottieni l'ID univoco del paragrafo e convertilo in una stringa.
New String NewVar(vMarkerText) Value(vPgf.Unique);
// Rilascia il primo carattere in modo da ottenere 5 cifre.
Get String FromString(vMarkerText) NewVar(vMarkerText)
StartPos(vMarkerText.Size - 4);
// Aggiungi l'etichetta di paragrafo e il testo.
Set vMarkerText = vMarkerText + ': ' + vPgf.Name + ': ' +
vPgf.Text;
// Aggiungi il marcatore di riferimento incrociato.
New Marker NewVar(vMarker) MarkerName('Cross-Ref')
TextLoc(vPgf);
// Imposta il testo del marcatore al testo del paragrafo.
Set vMarker.MarkerText = vMarkerText;
// Imposta la variabile vHeadingFound su 1.
Set vHeadingFound = 1;
// Esci dalla subroutine.
LeaveSub;
EndIf
EndIf
EndLoop
//
EndSub


Notare che questo codice è simile allo script precedente che ha inserito i marcatori di riferimento incrociato puntuale. È un semplice ciclo attraverso i paragrafi del documento alla ricerca di paragrafi Heading2. Ha un test aggiuntivo per verificare se il testo del paragrafo corrisponde al testo della cella della tabella.


Comments