Возникла тут проблемка с автоматической обработкой RTF документов.
В документах бывают математические формулы, причём иногда они
набраны такими большими, что слегка вылазят за поля документа.
Каким бы образом отслёживать подобные штуки? Мало того, что они
вылазят так от этого ещё получается, что знак параграфа оказывается
на следующей после формулы строчке и чисто визуально возникает
пустая строка чего быть не должно по требованиям к документам.
Поиском по ^p^p такие пустые строки не находятся. В общем, посоветуйте
что-нибудь.
Posted via RSDN NNTP Server 1.9 beta
Re: Как узнать, что матем. формула вылезла за поля
Здравствуйте, Седьмой романтик, Вы писали:
СР> Здравствуйте!
СР> Возникла тут проблемка с автоматической обработкой RTF документов. СР>В документах бывают математические формулы, причём иногда они СР>набраны такими большими, что слегка вылазят за поля документа. СР>Каким бы образом отслёживать подобные штуки? Мало того, что они СР>вылазят так от этого ещё получается, что знак параграфа оказывается СР>на следующей после формулы строчке и чисто визуально возникает СР>пустая строка чего быть не должно по требованиям к документам. СР>Поиском по ^p^p такие пустые строки не находятся. В общем, посоветуйте СР>что-нибудь.
Что за математические формулы? Они набраны обыкновенным текстом — или ты имеешь ввиду формулы вставленные в документ в виде OLE объектов?
Re[2]: Как узнать, что матем. формула вылезла за поля
Здравствуйте, Седьмой романтик, Вы писали:
СР> Я имею ввиду, набраные в Microsoft Equation. Воспроизвести легко: взять СР>формулу и растянуть её по горизонтали пока знак параграфа не перескочит.
Тогда что-нибудь типа
Dim ishp As InlineShape
For Each ishp In ActiveDocument.InlineShapes
If ishp.Width > _
(ActiveDocument.PageSetup.PageWidth - _
(ActiveDocument.PageSetup.LeftMargin + ActiveDocument.PageSetup.RightMargin)) Then
MsgBox ishp.AlternativeText
ishp.Width = _
(ActiveDocument.PageSetup.PageWidth - _
(ActiveDocument.PageSetup.LeftMargin + ActiveDocument.PageSetup.RightMargin))
End If
Next ishp
Пользователь — друг программиста!
Re[3]: Как узнать, что матем. формула вылезла за поля
Здравствуйте, Седьмой романтик, Вы писали:
СР>Mout1 wrote:
>> Что за математические формулы? Они набраны обыкновенным текстом — или ты >> имеешь ввиду формулы вставленные в документ в виде OLE объектов?
СР> Я имею ввиду, набраные в Microsoft Equation. Воспроизвести легко: взять СР>формулу и растянуть её по горизонтали пока знак параграфа не перескочит.
Microsoft Equation — это отдельная программулина (есть кстати и расширение — MathType), вставляется она в документ как OLE объект, его свойства доступны через InlineShapes.
Спасибо Elena_. К сожалению, это полумера, поскольку работает только если
левая граница формулы приходится на границу листа. Иначе говоря, нет
отступа и нет текста перед объектом.
Я попытался найти какое-нибудь свойство вроде Left для InlineShape, но не
сумел найти ничего, что позволило бы написать что-то вроде
If (ishp.Width + ishp.Left) > _
(ActiveDocument.PageSetup.PageWidth - _
(ActiveDocument.PageSetup.LeftMargin +
ActiveDocument.PageSetup.RightMargin)) Then
MsgBox ishp.AlternativeText
End If
В общем, два вопроса:
1) Как узнать местоположение InlineShape на странице, т.е. не только ширину
и высоту, но и привязку к границам текущего листа.
2) Допустим я нашёл. Но надо как-то сообщить о каком конкретно объекте идёт
речь, то есть как найти контекст в тексте для объекта: в каком параграфе
находится и после каких символов текста вставлен?
Пробовал через Parent, но Parent указывает на весь документ. Попытался
искать InlineShapes в выделеном тексте, но это не предусмотрено в VBA.
Posted via RSDN NNTP Server 1.9 beta
Re[4]: Как узнать, что матем. формула вылезла за поля
Здравствуйте, Седьмой романтик, Вы писали:
СР>1) Как узнать местоположение InlineShape на странице, т.е. не только ширину СР>и высоту, но и привязку к границам текущего листа.
СР>2) Допустим я нашёл. Но надо как-то сообщить о каком конкретно объекте идёт СР>речь, то есть как найти контекст в тексте для объекта: в каком параграфе СР>находится и после каких символов текста вставлен?
Посмотрите Information
Например, типа
Dim ishp As InlineShape, rng As Range
For Each ishp In ActiveDocument.InlineShapes
If ishp.Width + ishp.Range.Information(wdHorizontalPositionRelativeToPage) > _
(ActiveDocument.PageSetup.PageWidth - ActiveDocument.PageSetup.RightMargin) Then''''' MsgBox ishp.AlternativeTextMsgBox"page " & ishp.Range.Information(wdActiveEndAdjustedPageNumber) & " " & _
"line " & ishp.Range.Information(wdFirstCharacterLineNumber)
''''' Set rng = ishp.Range
''''' Set rng = rng.Previous(Unit:=wdSentence, Count:=1)
''''' MsgBox rng.Text
ishp.Width = _
(ActiveDocument.PageSetup.PageWidth - ActiveDocument.PageSetup.RightMargin) - _
ishp.Range.Information(wdHorizontalPositionRelativeToPage)
End If
Next ishp
Вообще-то мне кажется, что AlternativeText, если его аккуратно вводить, вполне удобен для идентификации.
Посмотрел. К сожалению,
ishp.Range.Information(wdHorizontalPositionRelativeToPage) возвращает
значение -1 для всех матем. формул. Я попробовал использовать
wdHorizontalPositionRelativeToTextBoundary, но с тем же результатом.
В MSDN я прочёл, что "If the selection or range isn't within the screen
area, returns — 1" Но почему, ведь формулы отображаются нормально?
В общем, так вот думаю как же заставить Word выдать информацию о
расположении?
Вот ishp.Range.Information(wdActiveEndAdjustedPageNumber) и
ishp.Range.Information(wdFirstCharacterLineNumber) работают нормально.
Большое спасибо, что мне хотя бы контекст удалось указать.
Здравствуйте, Седьмой романтик, Вы писали:
СР> Посмотрел. К сожалению, СР>ishp.Range.Information(wdHorizontalPositionRelativeToPage) возвращает СР>значение -1 для всех матем. формул. Я попробовал использовать СР>wdHorizontalPositionRelativeToTextBoundary, но с тем же результатом. СР> В MSDN я прочёл, что "If the selection or range isn't within the screen СР>area, returns — 1" Но почему, ведь формулы отображаются нормально?
Попробуйте предварительно выделять Range, чтобы он прокручивался на экран, хотя я попробовала в Word XP, вроде работает и так, может быть, какие-то настройки влияют? Что-то типа
For Each ishp In ActiveDocument.InlineShapes
MsgBox ishp.Range.Information(wdHorizontalPositionRelativeToPage)
ishp.Range.Select
MsgBox ishp.Range.Information(wdHorizontalPositionRelativeToPage)
MsgBox Selection.Information(wdHorizontalPositionRelativeToPage)
К тому же я забыла указать, что лучше переводить в режим разметки страницы с масштабом 100. Если решим обычный, то для обычного Range должно выдаваться расстояние от поля, хотя для Shape вроде бы все равно от края страницы. Обычно рекомендуют именно разметки страницы, и 100 zoom (если zoom не 100, то бывают отклонения от правильного значения)
> Попробуйте предварительно выделять Range, чтобы он прокручивался на экран, > хотя я попробовала в Word XP, вроде работает и так, может быть, какие-то > настройки влияют? Что-то типа
Ура! Заработало. Спасибо Elena_!!!
Проверял в Word 2000 и Word 97. Word XP у меня отсутствует.
Все остальные варианты -- нет.
> К тому же я забыла указать, что лучше переводить в режим разметки страницы > с масштабом 100. Если решим обычный, то для обычного Range должно > выдаваться расстояние от поля, хотя для Shape вроде бы все равно от края > страницы. Обычно рекомендуют именно разметки страницы, и 100 zoom (если > zoom не 100, то бывают отклонения от правильного значения)