Monitoring InCopy Story Depth

Of all the reasons to use InCopy for editing copy for InDesign, being able to monitor story depth is number one. Because InCopy and InDesign share the same text composition engine, your workflow can know how long a story will be.

Layout-based or Assignment-based workflow. When the story is started in InDesign and then assigned to InCopy, the Copyfit Progress gauge in the toolbar shows the editor when the length of the story has been achieved (or overset as in the screen capture below).

Edit-first workflow. When the story starts in InCopy, the Copyfit Progress toolbar in Layout view is used to determine story length information. Story depth is displayed after D: in the toolbar. The other fields are: line count (L:), word count: (W:), character count (C:). 

Edit-first Workflow

To automate copy fitting in the Edit-first workflow the following is suggested.

Start with an InCopy template set to the column width required. (You may have several templates from which the user can choose). The following code has the user select the template from files found in the Templates folder defined by the variable templatePath. After the template is chosen, the script uses the template to open a new unnamed document in InCopy. The sample code assumes the path to this folder is inside InCopy application’s folder. You will need to change this to the location of your choice.

   tell application "Adobe InCopy CC 2014"
	set appPath to (file path as string)
	set templatePath to (appPath & "Templates")
	set templateChosen to my getTemplate(templatePath)
	set documentRef to open templateChosen
   end tell

   on getTemplate(templatePath)
	set thePrompt to "Select template for story"
	set templateChosen to choose file with prompt thePrompt default location (templatePath as alias)
	return templateChosen
   end getTemplate

Using a custom dialog for the script, you could expand the above to include input fields for the user to determine the proposed story text area depth, or to modify the text area width as needed. For this the following properties for document preferences are exposed for AppleScript:

  • text area depth
  • text area depth unit (can be set to depth chars, depth words, depth lines, depth column inches, or depth pages)
  • text area width

In addition to defining the default column width and text area depth, the template will need to include paragraph and character styles that correspond with the styles for the final document.

Styling Text

To make life easier for the user, the template may also start with dummy text styled with a default paragraph style that has its next paragraph property set. The screen shot following illustrates how the dummy text can be used to show the user how the default paragraph styles will be chained. 

By adding the following code to the script, the dummy text is selected when the document is created.

        --insert before end tell in code above
	tell documentRef
		set storyRef to object reference of paragraph 1 of story 1
		select storyRef existing selection add to
	end tell
	activate

When the user begins to type, the dummy text is replaced by the text entered. With each hard return, the paragraph style changes using the next style property for the style. This happens until the assigned style has its own style as its next style property. At this point, the text entered could be styled as follows when viewed in Layout view.

Changing Style

If the user does not want to use the default styling, the paragraph styles can be chosen manually from Incopy’s Paragraph Styles panel. Alternatively, you could provide a script to present the user with a list of suggested style groups. If the script is assigned a keyboard shortcut, a quick keystroke combination will give the user access to this list. When a styling choice is made, the following will change the style of the first paragraph.

   tell application "Adobe InCopy CC 2014"
      tell document 1
	set storyRef to object reference of paragraph 1 of story 1
	select storyRef existing selection add to
	set styleGroup to paragraph style group 1
	set styleList to name of every paragraph style of styleGroup
	set styleName to my getSelection(styleList)
	if styleName is not missing value then
	   set applied paragraph style of paragraph 1 of story 1 to paragraph style styleName
	end if
      end tell
      activate
   end tell

   on getSelection(styleList)
      set thePrompt to "Choose styling from list"
      set styleChosen to choose from list styleList with prompt thePrompt without multiple selections allowed
      if class of styleChosen is list then
	 set myStyle to item 1 of styleChosen
      else
	 set myStyle to missing value
      end if
      return myStyle
   end getSelection 

Verifying Story Depth

To enable copy fitting, you will also want your InCopy templates to be set up so that Copyfit Info is enabled (Window > Copyfit Info). In Layout mode (command + L), the Copyfit toolbar displays the number of lines, words, characters, and, most importantly, the current depth for the story (see screen capture above).

For an edit-first workflow, the story depth can be critical for the person doing page layout. The InCopy side of the workflow can convey this information using one of several methods:

  • Use the length of the story as part of the naming convention for the file when saved
  • Add the story information to a file or database

Either of these methods can be performed manually or automated using a script. This can be done when the story is saved.

Using a Script to Save the Story

A script can facilitate saving a story in a number of ways:

  • Check in the story
  • Add metadata to the file
  • Save the story to a predefined folder
  • Save a version of the story
  • Add the length of the story to the name of the file saved

For this last task, a small problem arises when using a script to determine the story depth. The depth of the story that displays in the Copyfit toolbar is not exposed, as is, for scripting. The closest to this is the baseline value of the last line for the story. For this reason, you might decide to have the user enter the number displayed in the Copyfit Progress toolbar as part of entering the name as in the script below since this figure will be slightly more accurate.

   --define folder for saving InCopy file
   set parentPath to (path to home folder from user domain) as string
   set saveFolder to parentPath & "Creative Cloud Files:InCopyFiles"
   --get name for story
   try
      set storyStr to getName ("Enter story name with story length")
   on error errStr
      activate 
      display alert errStr
      return
   end try

   tell application "Adobe InCopy CC 2014"
	set storyRef to a reference to story 1 of document 1
	--check in the story
	tell storyRef to check in
	set savePath to saveFolder & ":" & storyStr & ".icml"
	save document 1 to savePath
   end tell 

   on getName (promptStr)
	set userResponse to display dialog promptStr default answer "" default button 2
	if text returned of userResponse = "" then 
	   error "Valid string not entered"
	end if
	return text returned of userResponse
   end getName 

To have the script add the story length to the file’s saved name, make the following changes to the script above.

    • Change the prompt string for getName(promptStr) to “Enter name for story”
   set storyStr to getName("Enter name for story")
    • After the code that defines the storyRef variable, change the script to read as follows:
   set b to baseline of line -1 of storyRef
   set storyLen to "" & (b - 0.5)
   set storyName to my checkName(storyStr, storyLen)
   --check in the story
   tell storyRef to check in
   set savePath to saveFolder & ":" & storyName & ".icml"
   save document 1 to savePath
end tell
    • Add the following handler to the script:
(*truncates name and replaces dot with a hyphen*)
on checkName(storyStr, storyLen)
   set lengthStr to "" & storyLen --convert number to string
   set theOset to offset of "." in lengthStr
   if theOset > 0 then
      set startSnip to text 1 thru (theOset - 1) of lengthStr
      set endSnip to text (theOset + 1) thru (theOset + 3) of (lengthStr & "000")
      set storyName to storyStr & "_" & startSnip & "-" & endSnip
   end if
   return storyName
 end checkName 

Note: Using the code above for calculating the baseline of the last paragraph only works if the story fits within one InCopy page. If the story flows to more than one page, you would need to get a count of the pages and multiply that by the column depth for each full page and then add that to the baseline of the last paragraph.

Multi-column Layout Issues

Keep in mind that in either event the calculation may be off slightly if the InCopy story is flowed into a multi-column text frame. Even though the column widths are setup to be the same, line breaks can change when going from a single column to a multi-column layout. This may pose a problem in using an edit-first workflow as multiple columns are not supported from the InCopy side. (They are supported if the story is initiated in InDesign.) When line breaks are not a primary consideration, you may decide to have the text area width in the InCopy template set to the total column width for the target text frame. For this you would have the script test the value for the text area width and modify the length of the story accordingly:

   --in script above place the following after the tell statement to InCopy 
   tell document preferences of document 1
      set colWidth to text area width
   end tell
         
   --after setting the value for the variable storyLen, add the following
   if colWidth < 2.57 then --testing for single InCopy column
      set storylen to (storyLen /2) --for 2 column InDesign text frame
   end if  

As an example, a typical story edited as a single column and then as a double column in InCopy gave the same story depth result when saved.  

As you can see in the above, the story depths were consistent whether using a text area width set up for the single or the double-column width. These numbers were off slightly from the actual depth of the InDesign story (4.138 inches as opposed to 4.284 inches).

Even though the story depths are off slightly when using the Edit-first workflow in a multi-column environment, the layout artist on the InDesign side can plan pages based on the story depths provided. Our sample code saved the InCopy stories to a folder in Creative Cloud that was set up for a collaborative workflow. If access to Creative Cloud is an issue, you can use DropBox or Google Drive as your location for saving edited InCopy files.