Reportlab中具有多个级别的编号段落



我想在ReportLab中创建一个具有多个级别的编号列表。我几乎到处都找过了,只能找到标签来构建一个编号列表。然而,当我编写以下代码时,我的列表如下所示:

   contents.add(Paragraph("<seq/>. Level 1 Header", h1))
   contents.add(Paragraph("<seq/>. Level 2 Header", h2))    
   contents.add(Paragraph("<seq/>. Level 1 Header", h1))
  1. 级别1标题
    1. 2级标题(<1实际上是2…stackoverflow没有显示我在写什么)
  2. 级别1页眉(<2实际上是3)

而不是像这样的东西:

  1. 一级标题

    1.1 2级标题

  2. 级别2标题

有人知道如何做到这一点吗?提前感谢!

编辑:随着@Snoozer的评论,现在是:

1. Level 1 Header
  2.1 Level 2 Header
3. Level 1 Header

这仍然是不正确的。我找不到任何能保持第一级索引值的东西。

编辑:我现在相信你想要做的是不可能的,但我有几个建议

如果您不关心精确的#.#格式,可以通过使用多个seq标记来实现。要轻松使用多个seq标记,请从seqOrder开始。这具有一个很好的特性,即每当您使用更高级别的seq标记时,较低级别都会重置。为了使您的级别看起来不同,我建议对每个级别进行不同的格式设置。

contents.add(Paragraph( ('<seqChain order="lev1 lev2"/>'
                         '<seqFormat id="lev1" value="1">'
                         '<seqFormat id="lev2" value="a">'
                         '<seq id="levelOne"/>. Level 1 Header'), h1))
contents.add(Paragraph('<seq id="levelTwo"/> Level 2 Header', h2))    
contents.add(Paragraph('<seq id="levelOne"/>. Level 1 Header', h1))
#We didn't have to reset the level 2 tag because chain takes care of it
contents.add(Paragraph('<seq id="levelTwo"/> Level 2 Header', h2))  

我发现ReportLab的RML用户指南第47页在这里很有用。我试图使用<name>标记存储当前上级的值,但在使用1次后,似乎无法重新分配<name>标记。我曾考虑过在python中使用其他编程方法来跟踪这一点,但目前您基本上是自己编写列表的。就是一个例子

level1 = 1
contents.add(Paragraph('{0}. Level 1 Header'.format(level1), h1))
level2 = 1 
contents.add(Paragraph('{0}.{1} Level 2 Header'.format(level1,level2), h2))
#Now we have to automatically increment level1
level1 += 1    
contents.add(Paragraph('{0}. Level 1 Header'.format(level1), h1))
#and manually reset level 2
level2 = 1
contents.add(Paragraph('{0}.{1} Level 2 Header'.format(level1,level2), h2))

尽管您可以定义一个函数,为您附加一段并手动迭代/重置适当的级别值。

我不确定你是在python中这样做的——我知道RML是reportlab商业版的一部分,我从来没有通过添加RML标签来构建文档。但是,如果您使用的是python,您可能希望使用Flowables构建文档,并且有一个ListFlowable可以创建这些列表。您仍然无法创建具有所需格式标签的列表,因为ListFlowable只是这些RML标签的接口。您可以在第86页的ReportLab用户指南中了解有关Flowables的更多信息

最新更新