Как узнать, что матем. формула вылезла за поля
От: Седьмой романтик Россия  
Дата: 15.07.04 17:04
Оценка:
Здравствуйте!

Возникла тут проблемка с автоматической обработкой RTF документов.
В документах бывают математические формулы, причём иногда они
набраны такими большими, что слегка вылазят за поля документа.
Каким бы образом отслёживать подобные штуки? Мало того, что они
вылазят так от этого ещё получается, что знак параграфа оказывается
на следующей после формулы строчке и чисто визуально возникает
пустая строка чего быть не должно по требованиям к документам.
Поиском по ^p^p такие пустые строки не находятся. В общем, посоветуйте
что-нибудь.
Posted via RSDN NNTP Server 1.9 beta
Re: Как узнать, что матем. формула вылезла за поля
От: Mout1 США  
Дата: 22.07.04 17:28
Оценка:
Здравствуйте, Седьмой романтик, Вы писали:

СР> Здравствуйте!


СР> Возникла тут проблемка с автоматической обработкой RTF документов.

СР>В документах бывают математические формулы, причём иногда они
СР>набраны такими большими, что слегка вылазят за поля документа.
СР>Каким бы образом отслёживать подобные штуки? Мало того, что они
СР>вылазят так от этого ещё получается, что знак параграфа оказывается
СР>на следующей после формулы строчке и чисто визуально возникает
СР>пустая строка чего быть не должно по требованиям к документам.
СР>Поиском по ^p^p такие пустые строки не находятся. В общем, посоветуйте
СР>что-нибудь.

Что за математические формулы? Они набраны обыкновенным текстом — или ты имеешь ввиду формулы вставленные в документ в виде OLE объектов?
Re[2]: Как узнать, что матем. формула вылезла за поля
От: Седьмой романтик Россия  
Дата: 22.07.04 18:25
Оценка:
Mout1 wrote:


> Что за математические формулы? Они набраны обыкновенным текстом — или ты

> имеешь ввиду формулы вставленные в документ в виде OLE объектов?

Я имею ввиду, набраные в Microsoft Equation. Воспроизвести легко: взять
формулу и растянуть её по горизонтали пока знак параграфа не перескочит.
Posted via RSDN NNTP Server 1.9 beta
Re[3]: Как узнать, что матем. формула вылезла за поля
От: Elena_ Россия  
Дата: 22.07.04 21:49
Оценка:
Здравствуйте, Седьмой романтик, Вы писали:

СР> Я имею ввиду, набраные в 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 США  
Дата: 23.07.04 06:06
Оценка:
Здравствуйте, Седьмой романтик, Вы писали:

СР>Mout1 wrote:



>> Что за математические формулы? Они набраны обыкновенным текстом — или ты

>> имеешь ввиду формулы вставленные в документ в виде OLE объектов?

СР> Я имею ввиду, набраные в Microsoft Equation. Воспроизвести легко: взять

СР>формулу и растянуть её по горизонтали пока знак параграфа не перескочит.

Microsoft Equation — это отдельная программулина (есть кстати и расширение — MathType), вставляется она в документ как OLE объект, его свойства доступны через InlineShapes.
Re[4]: InlineShape: узнать место на странице
От: Седьмой романтик Россия  
Дата: 23.07.04 13:45
Оценка:
Elena_ wrote:


Спасибо 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]: Как узнать, что матем. формула вылезла за поля
От: Седьмой романтик Россия  
Дата: 23.07.04 13:46
Оценка:
Mout1 wrote:

> его свойства доступны через InlineShapes.


Спасибо. Но, увы, этого недостаточно. Подробнее см. мой ответ Elena_
Posted via RSDN NNTP Server 1.9 beta
Re[5]: InlineShape: узнать место на странице
От: Elena_ Россия  
Дата: 23.07.04 20:55
Оценка:
Здравствуйте, Седьмой романтик, Вы писали:

СР>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.AlternativeText

            MsgBox "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, если его аккуратно вводить, вполне удобен для идентификации.
Пользователь — друг программиста!
Re[6]: InlineShape: узнать место на странице
От: Elena_ Россия  
Дата: 23.07.04 21:02
Оценка:
Здравствуйте, Elena_, Вы писали:

Да, кстати, насчет

СР> Попытался искать InlineShapes в выделеном тексте, но это не предусмотрено в VBA.



    For Each ishp In Selection.InlineShapes
        MsgBox ishp.AlternativeText
        
        MsgBox "page " & ishp.Range.Information(wdActiveEndAdjustedPageNumber) & " " & _
               "line " & ishp.Range.Information(wdFirstCharacterLineNumber)
        
    Next ishp
Пользователь — друг программиста!
Re[6]: InlineShape: узнать место на странице
От: Седьмой романтик Россия  
Дата: 27.07.04 19:15
Оценка:
Elena_ wrote:


> Посмотрите Information


Посмотрел. К сожалению,
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) работают нормально.
Большое спасибо, что мне хотя бы контекст удалось указать.
Posted via RSDN NNTP Server 1.9 beta
Re[7]: InlineShape: узнать место на странице
От: Elena_ Россия  
Дата: 27.07.04 20:54
Оценка:
Здравствуйте, Седьмой романтик, Вы писали:

СР> Посмотрел. К сожалению,

СР>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, то бывают отклонения от правильного значения)
Пользователь — друг программиста!
Re[8]: InlineShape: узнать место на странице
От: Седьмой романтик Россия  
Дата: 29.07.04 09:15
Оценка:
Elena_ wrote:


> Попробуйте предварительно выделять Range, чтобы он прокручивался на экран,

> хотя я попробовала в Word XP, вроде работает и так, может быть, какие-то
> настройки влияют? Что-то типа


Ура! Заработало. Спасибо Elena_!!!
Проверял в Word 2000 и Word 97. Word XP у меня отсутствует.

Вот это сработало:

         ishp.Range.Select

  
         MsgBox Selection.Information(wdHorizontalPositionRelativeToPage)


Все остальные варианты -- нет.

> К тому же я забыла указать, что лучше переводить в режим разметки страницы

> с масштабом 100. Если решим обычный, то для обычного Range должно
> выдаваться расстояние от поля, хотя для Shape вроде бы все равно от края
> страницы. Обычно рекомендуют именно разметки страницы, и 100 zoom (если
> zoom не 100, то бывают отклонения от правильного значения)

Проверил. Не влияет никак.

Спасибо ещё раз, выручила меня.
Posted via RSDN NNTP Server 1.9 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.