设置

设置

我想用 LibreOffice Impress 在我的实习演示文稿中添加一个进度条,但我只找到这种使用宏的进度条

在此处输入图片描述

正如您所见,即使我可以添加进度百分比,也很难知道此部分有多少张幻灯片,在完成演示之前有多少张幻灯片。此宏可在此链接中找到:

https://github.com/dasaki/Impress-Progress-Bar

现在,我想要一些看起来像下面这样的东西(抱歉,GIMP 不是绘制线条或正方形的最佳图片编辑器):

在此处输入图片描述

如果有人有解决方案或可以执行此类操作的宏链接,我不想手动执行该正方形/圆形的进程,这会很麻烦,而且确实需要一些时间来处理它。谢谢

答案1

好吧,可能没那么复杂。我本来想从分叉那个存储库开始,但最终还是从头开始写。

目前,它正在运行(LibreOffice v6.0.2.1)。但是,设置未显示在 GUI 中。

设置

  1. 工具 > 宏 > 组织宏 > LibreOffice Basic...
  2. 我的宏 > 标准:新模块将其命名为“ProgressLine”或其他名称。
  3. 选择它然后编辑,将下面的代码复制到其中

    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
    
  4. 保存

工作流

添加进度条

  1. 在同一文件夹中创建索引,即一个文本文件,文件名称相同但.index扩展名不同

    5
    1,_
    2,H2_a
    4,H2_b
    7,H2_c
    10,_
    
    • 第一行是节的总数
    • 此格式的其余行:页面、章节标题
    • _特殊适用于无标题部分
  2. 打开演示文稿

  3. 工具 > 宏 > 组织宏 > LibreOffice Basic...: 运行ProgressLine

移除 ProgressLine

  • 工具 > 宏 > 组织宏 > LibreOffice Basic...: 运行ProgressLineRemove

笔记

  • 大多数设置都集中在脚本的顶部,因此应该很容易对其进行调整。

LibreOffice-OpenOffice Impress-带有部分顶部轮廓的演示进度条

答案2

好主意。我也下载了进度条。它确实给出了百分比数字“x %”,但没有你画的那么精细。我不是开发人员,只是刚接触 LibreOffice 宏。

我的猜测是解决方案是使用 LibreOffice Writer 目录 (TOC),并将其转换为 Presenter。

如果可以将目录条目标记为“里程碑”,并且一旦达到,就会发送缩写的缩小字体文本框,并将图标切换为占位符。

我认为必须制作多套占位符模板。例如 10、20、30、40、50、60、70、80、90、100。并且幻灯片增加或减少时会自动调用模板。

文本颜色和切换填充图标是比较难解决的部分。如果从一开始就在主幻灯片上设置,会很有帮助。

我期待(即“进步”!)有人比我更了解宏编程,能够尝试一下。

相关内容