Тема: Создание формулы из текста
В общем, нужно автоматизировать и поставить горячую клавишу, чтобы текст (plain text) переводился в формулу и раза два переходил в «Профессиональный» вид.
Да, во вложении пошаговый пример, описывающий проблему.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
В общем, нужно автоматизировать и поставить горячую клавишу, чтобы текст (plain text) переводился в формулу и раза два переходил в «Профессиональный» вид.
Да, во вложении пошаговый пример, описывающий проблему.
Попробовал решить проблему, возникла другая...
В общем, включил панель «Разработчик», записал макрос, код получился таким:
Sub MyCreateEquationBlockFromSel()
Selection.OMaths.Add Range:=Selection.Range
Selection.OMaths.Linearize
Selection.OMaths.BuildUp
Selection.OMaths.BuildUp
End Sub
Но! внезапно автозамена не сработала (как так?!).
"\int" "\of" не были переведены в соответствующие символы Unicode.
Нашёл коллекции (как я понял, это нечто похожее на ассоциативный массив или словарь) OMathAutoCorrect.Entries и ещё AutoCorrect.Entries. А вот дальше ступор.
Впервые на VBA пишу, непривычно.
Необходимо заменить все \int \of \sum и так далее на символы ∫, ▒, ∑ соответственно до перевода в формулу.
внешняя ссылка
внешняя ссылка
Также этот список автозамены красуется в «Параметры»→«Правописание»→«Параметры автозамены» на вкладке «Автозамена математическими символами».
Первая ссылка ведёт на статью «Linear format equations and Math AutoCorrect in Word 2010» на office.microsoft.com, вторая на бумагу в формате pdf «Unicode Nearly Plain-Text Encoding of Mathematics»
Sub MyCreateEquationBlockFromSel()
Dim MyEntry, MyEntries, MyRange
Set MyEntries = Application.OMathAutoCorrect.Entries
Set MyRange = Selection.Range
With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
For MyEntry = MyEntries.Count - 1 To 2 Step -1
'For Each MyEntry In Application.OMathAutoCorrect.Entries
If MyEntry <> 84 Then
With Selection.Find
.Text = MyEntries(MyEntry).Name
.Replacement.Text = MyEntries(MyEntry).Value
End With
Selection.Find.Execute Replace:=wdReplaceAll
End If
Next MyEntry
Selection.OMaths.Add Range:=MyRange
Selection.OMaths.Linearize
Selection.OMaths.BuildUp
End Sub
Промежуточная версия индус-кода. Работаетъ, блин.
файлы 2007 и 2010 г. смотреть не могу, есть в 2003 или скриншот, того, что переделываете
Sub MyCreateEquationBlockFromSel()
Selection.OMaths.Add Range:=Selection.Range
Selection.OMaths.Linearize
Selection.OMaths.BuildUp
Application.ScreenUpdating = True
End Sub
Sub MyReplaceAll()
Dim MyEntry As Integer, MyEntries, MyRange
Set MyEntries = Application.OMathAutoCorrect.Entries
Set MyRange = Selection.Range
With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Application.ScreenUpdating = False
For MyEntry = MyEntries.Count - 1 To 1 Step -1
'For Each MyEntry In Application.OMathAutoCorrect.Entries
If MyEntry <> 84 Then
With Selection.Find
.Text = MyEntries(MyEntry).Name
.Replacement.Text = MyEntries(MyEntry).Value
End With
Selection.Find.Execute Replace:=wdReplaceAll
End If
Next MyEntry
End Sub
К сообщению добавил скриншот test.docx
Теперь вся задача свелась к поиску команд типа "\<тут кучка букв><символ «небуква»>".
Допустим p1 = "\<тут кучка букв>", а p2 = "<символ «небуква»>".
То, как я понимаю, выражение
Application.OMathAutoCorrect.Entries(p1).Valuе
будет возвращать символ, на к-рый нужно изменить p1...
Вот, больше ничего не знаю. Не знаю, ни как выделить эти команды, ни заменить именно найденную, ни удалить символ p2, если тот пробел.
Давайте попробуем, текст: Просто текст формулы выделите и одну строчку макроса пройдите
ф = Trim (Selection)
чему равно ф??
Ничего не поменялось, вернул сам текст формулы:
"\int\of(x+1)dx/(x\sqrt(ln x+1))=\int\of d(ln x+1)/\sqrt(ln x+1)=2\sqrt(ln x+1)+c
"
ступил
ф = Len(Trim (Selection))
чему равно ф??
81
Кстати, я тут обнаружил, читая сайт этот, что регулярки в Word2010 оказываются встроены! Т.е. в поиске, включив заранее «Подстановочные знаки», можно ввести:
(\\[A-Za-z]{1;})(?)
И он будет как раз искать то, что мне нужно.
С каждым часом я приближаюсь к решению задачки, медленно, но верно. Эта тема чуть ли не личный дневник решения данной задачки.
81 это хорошо!!
двигаемся дальше, я так понял \int\of это означает что надо заменить на вытянутую букву s??, напомните как знак называется
там строго будет так "\int\of" или по небрежности пользователь может что то не написать но знающий поймёт??
Вы ответьте, пока сегодня до завтра никак:
потому что у меня: Если редактор формул недоступен, его необходимо установить
Вставка формулы
1.Укажите место для вставки формулы.
2.В меню Вставка выберите команду Объект, а затем откройте вкладку Создание.
3.В списке Тип объекта выберите Microsoft Equation 3.0.
Если редактор формул недоступен, его необходимо установить.
4.Нажмите кнопку OK.
5.Создайте формулу, выборирая символы на панели инструментов (Панель инструментов. Строка с кнопками и другими элементами управления, служащими для выполнения команд. Чтобы вызвать панель инструментов, нажмите клавишу ALT, а затем клавиши SHIFT+F10.) Формула и вводя переменные и числа с клавиатуры. Верхняя строка панели инструментов Формула содержит более 150 математических символов. Нижняя строка используется для выбора разнообразных шаблонов, предназначенных для построения дробей, интегралов, сумм и других сложных выражений.
Для получения справочных сведений выберите команду Вызов справки в меню Справка.
6.Чтобы вернуться в Microsoft Word, щелкните документ.
\int -> ∫ (знак интеграла)
\of -> ▒ (знак n-арного оператора)
Кстати, обновил код, теперь уже заглядывает в коллекцию как надо:
Sub MyReplaceAll()
Dim MyEntry As Integer, MyEntries, MyRange
Set MyEntries = Application.OMathAutoCorrect.Entries
With Selection.Find
.ClearFormatting
.Text = "\\[A-Za-z]{2;}"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Application.ScreenUpdating = False
While Selection.Find.Execute = True
Selection.Text = MyEntries(Selection.Text).Value
Wend
Application.ScreenUpdating = True
End Sub
\of -> ▒ (знак n-арного оператора)
Не уловил как он выглядит???
Собственно, прямоугольник в точечку - ▒. Это абстрактный символ, описанный тут - внешняя ссылка .
знак интеграла не нашёл в Вставка > Символ, он там есть??
Собственно, прямоугольник в точечку - ▒. - Качнул опять же до завтра, дома нет читателя ПДФ
как у Вас успехи???, кое-что я научился делать
'Gamma - «Г», Code U+0393 - "0393" - Число_шестнадцатиричное
Selection.TypeText Text:=ChrW$(CLng("&H" & "0393"))
'Int - интеграл, в виде вытянутой «S», Code U+222B - "222B" - Число_шестнадцатиричное
Selection.TypeText Text:=ChrW$(CLng("&H" & "222B"))
Я ограничил поиск (ищет только в пределах выделенного текста), также добавил проверку на содержание элемента в коллекции OMathAutoCorrectEntries с помощью конструкции "On Error GoTo <label>". Получился в итоге такой вот код:
Sub MyReplaceSelected()
Dim MyEntries As OMathAutoCorrectEntries, MyString As String, _
MyRange As Range
Set MyEntries = Application.OMathAutoCorrect.Entries
Set MyRange = Selection.Range
Debug.Print MyRange.Start; MyRange.End
On Error GoTo NotExists:
Application.ScreenUpdating = False
With Selection.Find
.ClearFormatting
.Text = "\\[A-Za-z]{2;}"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
While .Execute And Selection.Range.End - 1 < MyRange.End
MyString = MyEntries(Selection.Text).Value
Selection.Text = MyString
NotExists:
Wend
End With
Application.ScreenUpdating = True
End Sub
Уже более красивый код и более рабочий. :3
Я ограничил поиск (ищет только в пределах выделенного текста), также добавил проверку на содержание элемента в коллекции OMathAutoCorrectEntries с помощью конструкции "On Error GoTo <label>".
Чтобы его опробовать, что нужно написать?? чтобы потом можно было выделить и пробовать код??
Над этим попробовать можно:
\int\of(x+1)dx/(x\sqrt(ln x+1))=\int\of d(ln x+1)/\sqrt(ln x+1)=2\sqrt(ln x+1)+c
(a+b)^n=\sum_(k=0)^n\of (n|k)a^k b^(n-k)
Работает, наверное, только с 2007го офиса.
может и с 2007 г., а так выделяет: MyEntries As OMathAutoCorrectEntries
сообщение функция не определана, библиотека??? какая???
Word 2007, 2010 only.
по теме:
внешняя ссылка
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться