我想用 LibreOffice Impress 在我的实习演示文稿中添加一个进度条,但我只找到这种使用宏的进度条
正如您所见,即使我可以添加进度百分比,也很难知道此部分有多少张幻灯片,在完成演示之前有多少张幻灯片。此宏可在此链接中找到:
https://github.com/dasaki/Impress-Progress-Bar
现在,我想要一些看起来像下面这样的东西(抱歉,GIMP 不是绘制线条或正方形的最佳图片编辑器):
如果有人有解决方案或可以执行此类操作的宏链接,我不想手动执行该正方形/圆形的进程,这会很麻烦,而且确实需要一些时间来处理它。谢谢
答案1
好吧,可能没那么复杂。我本来想从分叉那个存储库开始,但最终还是从头开始写。
目前,它正在运行(LibreOffice v6.0.2.1)。但是,设置未显示在 GUI 中。
设置
- 工具 > 宏 > 组织宏 > LibreOffice Basic...
- 我的宏 > 标准:新模块将其命名为“ProgressLine”或其他名称。
选择它然后编辑,将下面的代码复制到其中
REM ***** BASIC ***** Dim iFileNumber As Integer Dim iSectionCount As Integer Dim iSectionPage As Integer Dim iSectionIndex As Integer Dim iSectionIndexCurrent As Integer Dim oDocument As Object Dim oPage As Object Dim iPageCount As Integer Dim oPositionPageMark As New com.sun.star.awt.Point Dim oSizePageMark As New com.sun.star.awt.Size Dim oSizeSectionTitle As New com.sun.star.awt.Size Sub ProgressLine 'Default values 'sBulletShape = "com.sun.star.drawing.RectangleShape" sBulletShape = "com.sun.star.drawing.EllipseShape" 'Values are fracture of page width oSizePageMark_Width = 0.02 oSizePageMark_Height = 0.02 oSizeSectionTitle_Width = 0.20 oSizeSectionTitle_Height = 0.03 dSeparationRatioSection = 3.0 dMargin_Start = 0.05 dMargin_End = 0.10 dMargin_Side = 0.03 oFillColorPageMarkActive = RGB(255,0,0) oFillColorPageMarkInactive = RGB(240, 200, 200) oCharColorSectionTitleActive = RGB(255, 0, 0) oCharColorSectionTitleInactive = RGB(150, 150, 150) ProgressLineRemove() oDocument = ThisComponent If oDocument.supportsService("com.sun.star.drawing.GenericDrawingDocument") Then 'Load index sIndexPath = oDocument.URL sIndexPath = Mid( Left(sIndexPath, InStr(sIndexPath, ".odp")-1) & ".index",1,Len(sIndexPath)+2) iFileNumber = Freefile Open sIndexPath For Input As #iFileNumber 'First line is section total count If Not eof(#iFileNumber) Then Line Input #iFileNumber, sLine If sLine<>"" Then iSectionCount = Int(sLine) End If End If 'Remaining lines for sections: page, title iPageCount = oDocument.DrawPages.Count Dim sSectionTitle(iPageCount) As String While Not eof(#iFileNumber) Line Input #iFileNumber, sLine If sLine<>"" Then iSectionPage = Int(Left(sLine, InStr(sLine, ",")-1)) sSectionTitle(iSectionPage-1) = Right(sLine, Len(sLine)-InStr(sLine, ",")) End If Wend 'loop over pages iSectionIndex=-1 For iPageIndex=0 To iPageCount-1 If sSectionTitle(iPageIndex)<>"" Then iSectionIndex = iSectionIndex+1 End If oPage = oDocument.DrawPages(iPageIndex) oSizePageMark.Width = oPage.Width*oSizePageMark_Width oSizePageMark.Height = oPage.Width*oSizePageMark_Height dSeparation = (oPage.Width*(1-dMargin_Start-dMargin_End)-oSizePageMark.Width*iPageCount)/((iPageCount-iSectionCount)+(iSectionCount-1)*dSeparationRatioSection) 'Place new shapes, loop over page for progress iSectionIndexCurrent=-1 For iPageIndexCurrent=0 To iPageCount-1 If sSectionTitle(iPageIndexCurrent)<>"" Then iSectionIndexCurrent = iSectionIndexCurrent+1 End If oShape = oDocument.createInstance(sBulletShape) oPositionPageMark.x = (iPageIndexCurrent+iSectionIndexCurrent*(dSeparationRatioSection-1))*dSeparation+iPageIndexCurrent*oSizePageMark.Width+oPage.Width*dMargin_Start oPositionPageMark.y = oPage.Height-oPage.Width*dMargin_Side-oSizePageMark.Height oShape.Size = oSizePageMark oShape.Position = oPositionPageMark oShape.LineStyle = none If (iPageIndexCurrent=iPageIndex) Then oShape.FillColor = oFillColorPageMarkActive Else oShape.FillColor = oFillColorPageMarkInactive End If oShape.Name = "Progress Line RS_" + (iPageIndex+1)+"_"+(iPageIndexCurrent+1) oPage.add(oShape) 'Section titles, skip dummy title: "_" If sSectionTitle(iPageIndexCurrent)<>"" And sSectionTitle(iPageIndexCurrent)<>"_" Then oShape = oDocument.createInstance("com.sun.star.drawing.RectangleShape") oShape.TextVerticalAdjust = com.sun.star.drawing.TextVerticalAdjust.TOP oShape.TextHorizontalAdjust = com.sun.star.drawing.TextHorizontalAdjust.LEFT oShape.TextLeftDistance = 0 oSizeSectionTitle.Width = oPage.Width*oSizeSectionTitle_Width oSizeSectionTitle.Height = oPage.Width*oSizeSectionTitle_Height oShape.Size = oSizeSectionTitle oPositionPageMark.y = oPositionPageMark.y-oSizeSectionTitle.Height oShape.Position = oPositionPageMark oShape.LineStyle = none oShape.FillStyle = none oShape.Name = "Progress Line TS_" + (iPageIndex+1)+"_"+(iPageIndexCurrent+1) oPage.add(oShape) oShape.String = sSectionTitle(iPageIndexCurrent) oShape.CharWeight = com.sun.star.awt.FontWeight.BOLD oShape.CharFontName = "Arial" 'todo: doesn't work If iSectionIndexCurrent=iSectionIndex Then oShape.CharColor = oCharColorSectionTitleActive Else oShape.CharColor = oCharColorSectionTitleInactive End If End If Next iPageIndexCurrent Next iPageIndex Close #iFileNumber End If End Sub Sub ProgressLineRemove oDocument = ThisComponent If oDocument.supportsService("com.sun.star.drawing.GenericDrawingDocument") Then 'loop over pages iSectionIndexCurrent=0 For iPageIndex=0 To oDocument.DrawPages.Count-1 oPage = oDocument.DrawPages(iPageIndex) 'Cleanup old shapes iShapeIndex = oPage.getCount-1 Do While (iShapeIndex>=0) oShape = oPage.getByIndex(iShapeIndex) If (InStr(oShape.Name, "Progress Line") <> 0) Then oPage.remove(oShape) End If iShapeIndex = iShapeIndex-1 Loop Next iPageIndex End If End Sub
保存
工作流
添加进度条
在同一文件夹中创建索引,即一个文本文件,文件名称相同但
.index
扩展名不同5 1,_ 2,H2_a 4,H2_b 7,H2_c 10,_
- 第一行是节的总数
- 此格式的其余行:页面、章节标题
_
特殊适用于无标题部分
打开演示文稿
- 工具 > 宏 > 组织宏 > LibreOffice Basic...: 运行
ProgressLine
移除 ProgressLine
- 工具 > 宏 > 组织宏 > LibreOffice Basic...: 运行
ProgressLineRemove
笔记
- 大多数设置都集中在脚本的顶部,因此应该很容易对其进行调整。
答案2
好主意。我也下载了进度条。它确实给出了百分比数字“x %”,但没有你画的那么精细。我不是开发人员,只是刚接触 LibreOffice 宏。
我的猜测是解决方案是使用 LibreOffice Writer 目录 (TOC),并将其转换为 Presenter。
如果可以将目录条目标记为“里程碑”,并且一旦达到,就会发送缩写的缩小字体文本框,并将图标切换为占位符。
我认为必须制作多套占位符模板。例如 10、20、30、40、50、60、70、80、90、100。并且幻灯片增加或减少时会自动调用模板。
文本颜色和切换填充图标是比较难解决的部分。如果从一开始就在主幻灯片上设置,会很有帮助。
我期待(即“进步”!)有人比我更了解宏编程,能够尝试一下。