Cómo insertar referencias cruzadas

Adobe framemaker Frequently asked questions

cómo insertar referencias cruzadas?

Existen dos tipos de referencias cruzadas en FrameMaker: referencias cruzadas puntuales y referencias cruzadas de párrafo. (Existe un tercer tipo, referencias cruzadas de elemento, disponible solo en FrameMaker+SGML. Este tutorial no tratará las referencias cruzadas de elemento). Tanto las referencias cruzadas de párrafo como las puntuales son similares, en que debe insertar un objeto Xref que apunte a un marcador de referencia cruzada. El objeto Xref tiene una propiedad XRefSrcText que debe coincidir exactamente con el texto del marcador de Marcador de referencia cruzada. Comencemos con referencias cruzadas puntuales, ya que son un poco más sencillas de utilizar.

Referencias cruzadas puntuales

Como ejemplo, aquí hay una tabla que contiene los nombres de procedimientos de mantenimiento que aparecen en un documento. Queremos utilizar FrameScript para crear referencias cruzadas desde las entradas en la tabla a los procedimientos reales en el documento. Cada título de procedimiento utiliza un formato de párrafo Encabezado2.

Añadir marcadores de referencia cruzada
Un principio que nos gusta añadir aquí al resolver problemas con FrameScript es desglosar el problema en tareas pequeñas. Nuestra primera tarea es colocar marcadores de referencia cruzada en cada párrafo de encabezado de procedimiento. Dado que sabemos que los procedimientos comienzan con párrafos Encabezado2, solo colocaremos marcadores en esos párrafos. El texto del marcador se establecerá en el texto del párrafo. Es importante que cada marcador de referencia cruzada en el documento contenga texto único. Asumiremos en nuestro ejemplo que cada párrafo Encabezado2 contiene texto que es único respecto a todos los demás párrafos Encabezado2 en el documento.

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


Cada párrafo Encabezado2 tendrá un marcador de referencia cruzada al principio del mismo con el texto del párrafo como texto del marcador. Aquí está uno de los párrafos Encabezado2 con la ventana de marcador mostrando el texto del marcador.

FrameScriptTutorials

Dado que estamos creando marcadores con FrameScript en lugar de la interfaz de FrameMaker, veamos las propiedades del marcador. Puede ejecutar el código siguiente con el ancla del marcador seleccionada para ver las propiedades del marcador. Observe que la propiedad MarkerText es el texto que aparece en el diálogo Marcador.

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

Añadir las referencias cruzadas
Ahora podemos ir a la tabla y hacer que un script añada referencias cruzadas a los marcadores («puntos») que insertamos anteriormente. Asumiremos que el cursor está en la tabla cuando se ejecute el código siguiente.

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


Ahora que estamos en la primera celda, podemos comenzar un bucle hacia abajo a través de las celdas. Para cada celda, debemos «seleccionar» el texto para que la nueva referencia cruzada pueda reemplazarlo. La propiedad XRefSrcText del XRef (referencia cruzada) se establecerá en el texto seleccionado, ya que esto coincidirá con el texto del marcador del marcador de referencia cruzada correspondiente que se insertó anteriormente. Para seleccionar el texto, crearemos un rango de texto, eliminaremos el texto e insertaremos el objeto XRef en su lugar.

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


La tabla ahora muestra el texto original reemplazado por las referencias cruzadas. Si hace doble clic en una de las referencias cruzadas, se abrirá el cuadro de diálogo de referencia cruzada como se muestra a continuación.

FrameScriptTutorials

Lo importante a recordar es que la propiedad XRef.XRefSrcText debe coincidir exactamente con la propiedad XRef.MarkerText del marcador correspondiente; en caso contrario, tendrá una referencia cruzada sin resolver. Para ver las propiedades de la referencia cruzada, destaque una de las referencias cruzadas y ejecute el código siguiente. Observe la propiedad 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


Referencias cruzadas a otros documentos
Otra propiedad importante a observar es la propiedad XRefFile. Para la referencia cruzada anterior es una cadena nula porque es una referencia cruzada interna. Si estuviéramos referenciando otro archivo, la propiedad XRefFile contendría la ruta absoluta al otro archivo.

Referencias cruzadas de párrafo

Antes de discutir la inserción de referencias cruzadas de párrafo con FrameScript, revisemos cómo se diferencian de las referencias cruzadas puntuales en la interfaz de FrameMaker. Cuando inserta una referencia cruzada puntual con FrameMaker, debe insertar un marcador de referencia cruzada antes de insertar la referencia cruzada. Debe crear un «punto» que aparecerá en el cuadro de diálogo de referencia cruzada.
Por el contrario, las referencias cruzadas de párrafo no requieren la inserción de un marcador de referencia cruzada por anticipado. En su lugar, apunta al párrafo deseado en el cuadro de diálogo de referencia cruzada, hace clic en Insertar, y FrameMaker inserta la referencia cruzada y el marcador de referencia cruzada en los lugares apropiados.
Una vez insertadas, las referencias cruzadas puntuales y de párrafo no difieren en sus propiedades subyacentes básicas. Se accede a todas las referencias cruzadas como objetos XRef por FrameScript. Sin embargo, existe una diferencia en la forma en que se presentan en el cuadro de diálogo de referencia cruzada de FrameMaker. Cuando hace doble clic en una referencia cruzada puntual, el diálogo muestra marcadores de referencia cruzada en el tipo de fuente y el texto del marcador en la lista de la derecha. Al hacer doble clic en una referencia cruzada de párrafo se muestra la etiqueta de párrafo del párrafo de origen en tipo de fuente y el texto del párrafo de cada uno de los párrafos de etiqueta de párrafo seleccionados en la lista de la derecha. A continuación se muestra el cuadro de diálogo de referencia cruzada con una referencia cruzada de párrafo.
La diferencia entre los tipos de referencia cruzada proviene de una diferencia en la sintaxis de los marcadores de referencia cruzada. Para verlo, inserte una referencia cruzada de párrafo, Control-Alt-Haga clic en la referencia cruzada para ir a la fuente, y abra la ventana de marcador. Verá la sintaxis del marcador que FrameMaker inserta con una referencia cruzada de párrafo. A continuación se muestra una ventana de marcador de ejemplo seguida de las propiedades XRef.

FrameScriptTutorials

Como los marcadores de referencia cruzada puntual que insertamos anteriormente, puede ver el texto del párrafo de origen en la ventana de marcador y la propiedad XRefSrcText. Además, el texto del párrafo es precedido por un número de cinco dígitos (seguido de dos puntos y espacio), y el nombre del formato de párrafo del párrafo de origen (seguido de dos puntos y espacio). Son estos dos componentes adicionales en la propiedad XRefSrcText del XRef los que hacen que FrameMaker «vea» esto como una referencia cruzada de párrafo.

Mantener los marcadores de referencia cruzada únicos
Existe otra razón para la sintaxis diferente entre referencias cruzadas puntuales y de párrafo. Es esencial que los marcadores de referencia cruzada dentro de un documento sean únicos. Aunque puede tener más de una referencia cruzada que apunte a un único marcador de referencia cruzada, no puede tener una única referencia cruzada que intente apuntar a más de un marcador con el mismo texto de marcador. Cuando inserta referencias cruzadas puntuales, depende de usted asegurarse de que cada marcador de referencia cruzada sea único. Cuando inserta referencias cruzadas de párrafo, FrameMaker se asegura de que los marcadores que inserta sean únicos utilizando la sintaxis especial, particularmente el número de serie de cinco dígitos al principio.

El texto del marcador de referencia cruzada nunca debe cambiarse después de que se inserten los marcadores. Podría tener varias referencias cruzadas que apunten al mismo marcador; si cambia el texto del marcador, las referencias cruzadas se volverían sin resolver. Del mismo modo, cambiar el texto del párrafo de origen no cambiará el texto del marcador.
Antes de escribir código para insertar referencias cruzadas de párrafo, aquí están los puntos importantes a recordar sobre las referencias cruzadas puntuales y de párrafo.

  • Una referencia cruzada resuelta tendrá un valor de cadena XRefSrcText que coincida exactamente con el valor de cadena MarkerText de un marcador de referencia cruzada.
  • Ambos tipos de referencias cruzadas son funcionalmente idénticos; solo se presentan de forma diferente en el cuadro de diálogo de referencia cruzada de FrameMaker.
  • El texto del marcador de referencia cruzada siempre debe ser único dentro de un documento para ambos tipos de referencias cruzadas.
  • El texto de un marcador de referencia cruzada nunca debe cambiarse, incluso si la etiqueta de párrafo o el texto de su párrafo cambian.



Añadir referencias cruzadas de párrafo
Utilizaremos el mismo ejemplo que usamos con referencias cruzadas puntuales, excepto que esta vez insertaremos las referencias cruzadas y su marcador correspondiente al mismo tiempo. En nuestro ejemplo anterior, insertamos todos los marcadores primero y luego las referencias cruzadas. Asumimos que para cada entrada en la tabla, habría un párrafo Encabezado2 que coincidiera exactamente en el documento. Esto podría no ser siempre una suposición segura y podría resultar en referencias cruzadas sin resolver.
Comenzaremos con nuestro bucle a través de la tabla. El listado de código completo se encuentra a continuación.

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


Para cada entrada en la tabla, vamos a ejecutar una subrutina llamada FindSourceHeading que intenta localizar el encabezado correspondiente en el documento. Si no encuentra un encabezado correspondiente con el mismo texto, aplicará el color rojo al texto en la celda de la tabla para que pueda saber fácilmente que hay un problema. A continuación se muestra el listado de código para la subrutina.

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


Observe que este código es similar al script anterior que insertó los marcadores de referencia cruzada puntual. Es un bucle simple a través de los párrafos del documento que busca párrafos Encabezado2. Tiene una prueba adicional para ver si el texto del párrafo coincide con el texto de la celda de la tabla.


Comments