Ответ: Новый скрипт: Footnoter
Ой. Спасибо что мордой ткнул. Отличная весчь. Подумал было, что на webfile лежит просто все в одном архиве. Несовершенство интер-фейса, елы-палы. ;-) Получается, что велосипед сегодня принялся изобретать. Идея та же - импортируем текст из ворда со сносками. Вручную выделяем блок (Footnotes) в конце материала и разверстываем. Реализация линеек через таблицы в сносочном фрейме. С таблицами в сносках удобнее работать по многим соображениям и дальше. Ниже сегодняшнее начало велосипеда, продолжение к которому теперь писать не вижу смысла, и некоторые соображения по поводу следующего.
- servo for insertion of footnote references & contents
- posibility to continue broken formatting
- automatic replace paragraph ends in multi-paragraph footnotes
- consistency check for reference numbers in both stories
Set myInDesign = CreateObject("InDesign.Application.CS")
Set myDoc = myInDesign.ActiveDocument
If myInDesign.Selection.Count > 0 Then
Set mySelection = myInDesign.Selection.FirstItem()
If TypeName(mySelection) = "Text" Then
If mySelection.Characters.Count > 0 Then
Set myStory = mySelection.ParentStory
Set myFootStyleChar = myDoc.CharacterStyles.Item("Знак сноски") 'CharacterStyle, импортрированный из ворда
Set myFirstPage = myStory.TextFrames.LastItem().Parent
Set myFootText = mySelection.Texts.LastItem()
myInDesign.Copy
Set myFootFrame = myFirstPage.TextFrames.Add
myInDesign.Selection = myFootFrame.InsertionPoints.FirstItem()
myInDesign.Paste
myInDesign.FindPreferences.AppliedCharacterStyle = myFootStyleChar
Set myFoundItems = myFootFrame.ParentStory.Search
myFootFrame.GeometricBounds = myStory.TextFrames.FirstItem().GeometricBounds
For i = 1 To myFoundItems.Count
myFoundItems.Item(i).Contents = "{" + myFoundItems.Item(i).Contents 'в одной строке таблицы окажутся строго пункты сноски (возможно из нескольких абзацев)
Next i
Set myFootTable = myFootFrame.Texts.FirstItem().ConvertToTable("}", "{", 1)
myInDesign.FindPreferences.AppliedCharacterStyle = idNothing
Set myFoundItems = myFootFrame.Search("^p^p", False, False, "^p")
With myFootTable
.HeaderRowCount = 1
.BreakFooters = idInAllTextColumns
.Rows.FirstItem().Split (1986359924) 'делим заголовок таблицы
End With
Set myFootHeaderCell = myFootTable.Cells.FirstItem()
myFootHeaderCell.TopEdgeStrokeWeight = "0.5 pt"
myFootFrame.Fit idFrameToContent
myInDesign.Selection = myFootFrame
End If
End If
Else
MsgBox "Select the (Footnotes) text at end of story and try again"
End If
Строка-заголовок таблицы, разбитая на две (три) вертикальные части, служит для управления длиной отбивающей сноску линейки. Пункты сносок, размещенные каждые в отдельной строке, легко перемещать из фрейма в фрейм по многополосной myFootStory.
Script DOES NOT CHECK for proper order of footnote’s numbers in references in main story with same in footnote story.
Для разверстки сносок в соответствии с их индексами в основном тексте необходимо связывать индексы в тексте с соответствующими строками таблиц в myFootStory. С этой целью нужно прописывать уникальную информацию в сами символы индексов.
Это было бы на раз, имей объект Character свойство label, но его нет. Можно хранить уникальную информацию о символах в редко используемых свойствах объекта Character. Наиболее подходящим кандидатами для этой цели видятся свойства UnderlineGapTint As Double и StrikeThroughGapTint. Массовая работа со сносками ведется в основном в книжных изданиях, где такие красивости как оттенок промежутков подчеркивающей линии, отличный от белого, и оттенок линии зачеркивающей, отличный от цвета основного текста, не так уж и необходимы. Свойство StrikeThroughGapTint становится активным только в случае явного указания цвета зачеркивания, но значения оттенка через скрипт нам поменять никто не мешает.
Допустимые значения обеих свойств от 0 до 100. В них можно хранить любую числовую информацию. В нашем случае – уникальный ID ячейки таблицы. Но ID бывают гораздо больше 100. Поэтому связать ячейку с индексом можно так:
myFootIndexChar.StrikeThroughGapTint = myFootCurrrentCell.ID/1000
Обратная операция - обращение к ячейке таблицы на основании найденного в основном тексте индекса:
Set myFootCurrrentCell = myFootTable.Cells.ItemByID (myFootIndexChar.StrikeThroughGapTint * 1000)
Удачного кода!
PS: Пошел придумывать еще какой-нибудь самокат
. Если что –
goldyz@yandex.ru
PPS: А VB по-любому толковее JS…