3

Есть ли способ быстро изменить шрифт всех уравнений в документе? Может быть, есть встроенный стиль для них или что-то ...

Я не хочу устанавливать стиль по умолчанию для новых, но менять существующие.

3 ответа3

3

Для LibreOffice мне пришлось внести некоторые изменения в макрос, чтобы получить автоматическое обновление формулы. Я взглянул на эту тему на форумах OpenOffice рядом с нынешней.

Вот макрос, который я использовал:

REM  *****  BASIC  *****
Sub ReformatFormules
    embeddedObjects = ThisComponent.getEmbeddedObjects()
    elementNames = embeddedObjects.getElementNames()
    for i=0 to UBOUND(elementNames)
        element = embeddedObjects.getByName(elementNames(i)).Model
        oXEO = embeddedObjects.getByName(elementNames(i)).ExtendedControlOverEmbeddedObject
        iCurrentState = oXEO.currentState
        oXEO.changeState(com.sun.star.embed.EmbedStates.UI_ACTIVE)
        if (not isNull(element)) then
            if (element.supportsService("com.sun.star.formula.FormulaProperties")) then
                element.BaseFontHeight = 10
                element.FontNameVariables= "Times New Roman"
                element.FontVariablesIsItalic=1
                element.FontNameFunctions = "Times New Roman"     
                element.FontNameNumbers= "Times New Roman"        
                element.FontNameText= "Times New Roman"       
            endif
        endif
    next i
End Sub
2

Я не верю, что есть встроенный стиль для формул. Тем не менее, вы можете использовать макрос для всех формул и изменить стиль. Во французском FAQ по OpenOffice.org есть пример такого макроса:

Sub Main
    embeddedObjects = ThisComponent.getEmbeddedObjects()
    elementNames = embeddedObjects.getElementNames()
    for i=0 to UBOUND(elementNames)
        element = embeddedObjects.getByName(elementNames(i)).Model
        if (not isNull(element)) then
            if (element.supportsService("com.sun.star.formula.FormulaProperties")) then
                element.BaseFontHeight = 14
                element.FontNameVariables= "Arial"
                element.FontNameFunctions = "Arial"     
                element.FontNameNumbers= "Arial"        
                element.FontNameText= "Arial"       
            endif
        endif
    next i
    ThisComponent.reformat()
End Sub
1

Я попытался максимально упростить это и сделать так, чтобы он работал как можно быстрее (изменение состояния или "нажатие на него" было действительно очень медленным для меня), и я придумал это решение:

Sub FormulaFontSizeChanger
    f = InputBox("New font size:", "BaseFontHeight", 9)
    o = ThisComponent.getEmbeddedObjects()
    For i = 0 to o.count-1
        if (not IsNull(o(i))) and (not IsNull(o(i).Model)) then
            o(i).Model.BaseFontHeight = f
            o(i).Component.BaseFontHeight = f
            o(i).ExtendedControlOverEmbeddedObject.update()
        endif
    Next i
End Sub

Секретный соус здесь - о (я).ExtendedControlOverEmbeddedObject.update (). Это говорит libreoffice об обновлении / перерисовке встроенного объекта внутри, поэтому нам не нужно "обманывать" его при обновлении.

Похоже, что нет необходимости обновлять и компонент, и модель, но я чувствую, что лучше быть тщательным.

Кстати, я использую LibreOffice v4.3.4.1 YMMV.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .