LibreOffice打开Doc文件,公式丑.解决的办法.

OOo,TeX,KO,ABI,GIMP,Picasa,ProE,QCAD,Inkscape,Kicad,Eagle
回复
谢宝良
帖子: 1979
注册时间: 2010-05-01 21:23
送出感谢: 4 次
接收感谢: 21 次

LibreOffice打开Doc文件,公式丑.解决的办法.

#1

帖子 谢宝良 » 2013-01-29 16:11

打开doc文件,你会发现里边的公式很丑.

解决办法如下:

一、首先按照图片进行设置。(CMU Classical Serif CMU Serif 字体,网上大把。这些字体非常适合公式)


二、运行宏,强行把公式美化。

宏代码如下:

代码: 全选

Sub ChangeFormatFormula
oCurrentController = ThisComponent.getCurrentController()
oTextDocument = oCurrentController.Model
oEmbeddedObjects = oTextDocument.EmbeddedObjects
nEndIndex = oEmbeddedObjects.Count - 1
for nIndex = 0 to nEndIndex
oMathObject = oEmbeddedObjects.getByIndex(nIndex)
oModel = oMathObject.Model
if (not isNull(oModel)) then
if (not isEmpty(oModel)) then
if oModel.supportsService("com.sun.star.formula.FormulaProperties") then
' or if oMathObject.CLSID = "078B7ABA-54FC-8551-6147e776a997" then

oModel.BaseFontHeight = 10

' Variables
oModel.FontNameVariables = "CMU Classical Serif"
oModel.FontVariablesIsItalic = True
oModel.FontVariablesIsBold = False
' Functions
oModel.FontNameFunctions ="CMU Bright" 
oModel.FontFunctionsIsItalic = False
oModel.FontFunctionsIsBold = False
' Numbers
oModel.FontNameNumbers ="CMU  Serif" 
oModel.FontNumbersIsItalic = False
oModel.FontNumbersIsBold = False
' Text
rem oModel.FontNameText ="Adobe Song Std L" 
oModel.FontNameText = "CMU Classical Serif"

oModel.FontTextIsItalic =  False
oModel.FontTextIsBold = False
' Update
oXCOEO = oMathObject.ExtendedControlOverEmbeddedObject
oXCOEO.update()
end if ' if formula
end if ' if not empty
end if ' if not null
next nIndex
ThisComponent.reformat()
end sub
附件
抓图13.png
CUM字体可以从网上下载
上次由 谢宝良 在 2013-01-29 18:23,总共编辑 1 次。
谢宝良
帖子: 1979
注册时间: 2010-05-01 21:23
送出感谢: 4 次
接收感谢: 21 次

Re: LibreOffice打开Doc文件,公式丑.解决的办法.

#2

帖子 谢宝良 » 2013-01-29 16:58

其实我想把公式中的符号"" 去掉的.

公式难看的原因是Libre翻译doc的公式代码时,不正确的使用的"" 这个符号。

比如代码:n= { "sin" italic %alpha }over{ "sin" italic %beta }

如果能把代码中的" 这个符号去掉,那么公式就没问题的。


我知道公式代码的提取方法: s =oModel.Formula

这样公式的代码就被s变量指向了。
问题是如何去掉 " 这个字符? 其他的字符,我是能够去掉的,但是这个太特殊了。

怎么在vba中表示 "  字符? 有人懂吗?

上面的代码能很大程度的美化公式了,但是无法识别函数名,
比如sin的显示也按照变量的字体了。所以想干掉 "  这个字符。
谢宝良
帖子: 1979
注册时间: 2010-05-01 21:23
送出感谢: 4 次
接收感谢: 21 次

Re: LibreOffice打开Doc文件,公式丑.解决的办法.

#3

帖子 谢宝良 » 2013-01-29 18:12

可以了。这是改进后的宏(功能是把 "以及ital等删掉)。
效果非常好(有极个别的 "无法删掉)

注意:如果出现倒立 ,说明字母缺少空格,
如: GT rsup{2} 更改成 G T rsup{2} 即可正常显示公式

代码: 全选

Sub ChangeFormatFormula
oCurrentController = ThisComponent.getCurrentController()
oTextDocument = oCurrentController.Model
oEmbeddedObjects = oTextDocument.EmbeddedObjects
nEndIndex = oEmbeddedObjects.Count - 1
for nIndex = 0 to nEndIndex
oMathObject = oEmbeddedObjects.getByIndex(nIndex)
oModel = oMathObject.Model
if (not isNull(oModel)) then
if (not isEmpty(oModel)) then
if oModel.supportsService("com.sun.star.formula.FormulaProperties") then
' or if oMathObject.CLSID = "078B7ABA-54FC-8551-6147e776a997" then



oModel.BaseFontHeight = 10


s=oModel.Formula
b=CHR$(34)
c="italic"
d="ital"

s = Replace(s,b,"")
s = Replace(s,c,"")
s = Replace(s,d,"")

oModel.Formula=s

' Variables
oModel.FontNameVariables = "CMU Classical Serif"
oModel.FontVariablesIsItalic = True
oModel.FontVariablesIsBold = False
' Functions
oModel.FontNameFunctions ="CMU Bright"
oModel.FontFunctionsIsItalic = False
oModel.FontFunctionsIsBold = False
' Numbers
oModel.FontNameNumbers ="CMU  Serif"
oModel.FontNumbersIsItalic = False
oModel.FontNumbersIsBold = False
' Text
oModel.FontNameText ="Adobe Song Std L"
rem  oModel.FontNameText = "CMU Classical Serif"

oModel.FontTextIsItalic =  False
oModel.FontTextIsBold = False

rem oModel.RelativeIndexSubscript=52
rem oModel.RelativeIndexSuperscript=10
oModel.RelativeFontHeightIndices=45
oModel.RelativeFontHeightLimits=50
' Update
oXCOEO = oMathObject.ExtendedControlOverEmbeddedObject
oXCOEO.update()
end if ' if formula
end if ' if not empty
end if ' if not null
next nIndex
ThisComponent.reformat()
end sub


Function Replace(Source As String, Search As String, NewPart As String)
  Dim Result As String
  Dim StartPos As Long
  Dim CurrentPos As Long
 
  Result = ""
  StartPos = 1
  CurrentPos = 1
 
  If Search = "" Then
    Result = Source
  Else
    Do While CurrentPos <> 0
      CurrentPos = InStr(StartPos, Source, Search)
      If CurrentPos <> 0 Then
        Result = Result + Mid(Source, StartPos, _
        CurrentPos - StartPos)
        Result = Result + NewPart
        StartPos = CurrentPos + Len(Search)
      Else
        Result = Result + Mid(Source, StartPos, Len(Source))
      End If                ' Position <> 0
    Loop
  End If
 
  Replace = Result
End Function
回复

回到 “办公、图像、机械电子设计等”