Copy link to clipboard
Copied
Before I spend hours investigating something that isn't possible, I thought I'd ask the experts.
Is it possible to insert a variable automatically when inserting an Element? I.e. If I insert a ProdName Element, it automatically inserts the variable ProductName. We don't use DITA or XML or any scripting, so would prever to do this (if possible) natively.
Thanks,
Quintin
Here is a script that will insert a ProductName user variable automatically when you insert a ProdName element. Save the code to a text file and put it in this folder:
C:\Users\<UserName>\AppData\Roaming\Adobe\FrameMaker\<Version>\startup
where <UserName> is your Windows login name and <Version> is your FrameMaker version. You may have to create the startup folder.
Quit and restart FrameMaker and try inserting a ProdName element.
If the script is useful to you, please consider visiting http://give.roswellpark.org/goto/rickquatro
...Copy link to clipboard
Copied
You just gave me something to ruminate on as I go to bed. You can't do it with stock FrameMaker, but I have an idea for a simple script. I will report back tomorrow.
Copy link to clipboard
Copied
Thanks, but we specifically don't want to run a script to achieve this. If FrameMaker can't do this natively, that's fine too. I was just hoping there was a way to it natively (similar to auto inserting Child Elements.)
Thanks,
Quintin
Copy link to clipboard
Copied
Here is a script that will insert a ProductName user variable automatically when you insert a ProdName element. Save the code to a text file and put it in this folder:
C:\Users\<UserName>\AppData\Roaming\Adobe\FrameMaker\<Version>\startup
where <UserName> is your Windows login name and <Version> is your FrameMaker version. You may have to create the startup folder.
Quit and restart FrameMaker and try inserting a ProdName element.
If the script is useful to you, please consider visiting http://give.roswellpark.org/goto/rickquatro
#target framemaker
Notification (Constants.FA_Note_PostInsertElement, true);
function Notify (note, object, sparam, iparam) {
var doc, element;
switch (note) {
// This event will be triggered after an element is inserted.
case Constants.FA_Note_PostInsertElement:
doc = object;
element = doc.ElementSelection.beg.parent;
// Check which element is the last one inserted.
if (element.ElementDef.Name === "ProdName") {
// Insert a user variable.
insertVariable (element, "ProductName", doc);
}
break;
}
}
function insertVariable (element, name, doc) {
var textLoc;
textLoc = doc.ElementLocToTextLoc (doc.ElementSelection.beg);
doc.NewAnchoredFormattedVar (name, textLoc);
}
Copy link to clipboard
Copied
Quintin,
There are a few techniques that get close to what you want, but they are not pretty. Before I list them, indulge me in an anecodte from my distant past. Decades ago I read a paper on user interfaces (I really wish I remember where I read it, so I could credit the author, but haven't been able to locate it). It included a story about two users of a graphics package, which was something such as the following. One user gushed about how wonderful the software was. The other complained that it did not provide a method of drawing butterflies. "No problem," said the other. "Just insert a white tulip upside down." The message, of course, was that solutions should be intuitive. The methods I list below are upside-down tulips. They are:
In more detail:
Use system variables
FrameMaker supports two types of system variables: user variables and system variables. You can create and name user variables as needed. A container element cannot insert a user variable, which is what you would like to do. However, an element can be a system variable. The available system variables are predefined so you cannot create a new one called ProductName, but you can redefine the text displayed by a system variable. Therefore, if there is a system variable your documents will never, ever use, you can define that variable to be the product name. For example, if you will not be using Sub Section Number, your EDD can define an element called ProductName that displays the Sub Section Number variable. To define the product name, in a particular document, a writer would have to define Sub Section Number to the product name (that's the "white tulip upside down" part), but once that is done inserting the ProductName element would display the desired text.
Create a product-specific EDD
If the number of products is small, you can create a different EDD for each one. The only difference among the various EDDs would be the definition of a container called ProductName, defined to be an empty text-range with a prefix (or suffix) that contains the product name. Defining its general-rule to be <EMPTY> prevents the writer from entering content into the element, but the prefix causes it to display the product name.
To maintain the different EDDs, define a variable in the EDD called ProductName to be the name of a particular product. Use this variable in the definition of the prefix.
Simple as the differences among the various EDDs is, maintaining them all can be tedious and susceptible to human error. Tassos Anastasiou and I have a plugin that automatically updates all the variations whenever you make a change to one of them.
Use a cross-reference instead of a variable
Another possibility is to use a cross-reference instead of a variable. In particular, create a new element called ProductName. Make ProductName a container with the general rule <TEXT> and make it a valid highest-level element. Have the writers create a new flow either in a different document or on a reference page of a document in one of the actual books. In this flow, the author of each book will insert a ProductName element whose text is the desired product name. The text of a second, unstructured flow on the same page can document the purpose of the other flow. Then, to insert the product name into the book, the writer would insert a cross-reference to the ProductName element in the separate document or reference page.
--Lynne
Copy link to clipboard
Copied
Hi Lynne, I love the white upside-down tulip workarounds! -Rick
Copy link to clipboard
Copied
Your variable needs to be defined as an element. Are you trying to insert an unstructured variable in a structured doc?
Copy link to clipboard
Copied
Hmmm - in hind sight I should have included more backgroun in my original question, but was hoping that a simple question would result in a simple answer (is that ever the case with FM?)
We use a standard, pre-defined, set of Variables in all our documents. 'ProductName' is just one of them. These are maintained in a single Master document. 'ProductName', along with a few other variables, are updated depending on the document. The content of the variable will change, but the variable name is consistent across all documents, i.e. in document A, ProductName = MyProduct, in document B, ProductName = YourProduct, etc.
@Lynne A. Price I'm not sure if the System Variable option would work for us as it refers to an Element/paragraph style - neither are associated with the Variable. We have too many documents (requiring various variations of the Variable content) to make maintaining multiple EDDs practical. Using a cross-reference would also not work as it too would require the Variable to be a Element or have a specific paragraph style.
@Matt-Tech Comm Tools That is sort of what I want to do - define my variable as an Element, but not 'hardcode' the content of the Element and have it updated from a Variable.
@frameexpert Your solution would work, though I'm not fond of the idea of using a script. It would mean that we would need to constantly maintain it when we change our EDD/Variables master list.
In conclusion to my original question, my takeaway answer would be: Yes, if we change the way we treat these variables. No, if wewant to continue using the Variables in the same way.
Copy link to clipboard
Copied
I put together my script as a quick solution. It could be modified to use an outside settings file where the element names/variable names could be configured with different EDDs/templates, etc. I can understand your hesitation, but if you insert a lot of these elements and variables, the small trouble of changing script settings could be paid back quickly and continually.
One way you could make it more convenient is to always make your Element names match the corresponding user variable names. Then the script just has to check if a variable exists that matches particular element that the user is inserting.
Copy link to clipboard
Copied
I actually think my solution is the best white, upside-down tulip 🙂
Copy link to clipboard
Copied
I do like your solution the best. I am typically in favour of automating things as much as possible. I'm just not a big fan of customisation in order to change a product's behaviour to make it do something it wasn't designed to do.