自动编号文档内容
您可以自动编号文档内容,例如章节、节、表和图窗标题。将自动编号对象追加到您希望出现数字的文档中。每个自动编号都与一个编号流相关联,该编号流确定序列中每个编号的值。报告生成会根据自动编号对象在文档中相对于同一流中其他自动编号的位置,用一个编号替换该自动编号对象。例如,流中第一个自动编号对象被替换为 1,第二个被替换为 2,依此类推。您可以使用自动编号来创建分层编号方案,例如第 1.1 节和第 1.2 节。
您可以通过编程或通过在模板中定义自动编号来自动编号文档内容。
通过编程自动对内容进行编号
要以编程方式自动对文档内容进行编号,请在文档中希望出现自动生成的编号的每个位置执行以下操作。
使用
mlreportgen.dom.AutoNumber
构造函数创建一个自动编号对象。在构造函数中指定关联的自动编号流的名称。例如,此行创建一个名为chapter
的流的自动编号。chapterNumber = AutoNumber("chapter");
注意
如果指定的自动编号流不存在,则
AutoNumber
构造函数将创建具有指定名称的编号流。隐式构造的流将自动数字呈现为阿拉伯数字。要使用具有不同属性的流,请使用createAutoNumberStream
对象的Document
函数明确创建流。将
AutoNumber
追加到包含自动编号前面的文本的Text
、Paragraph
或Heading
对象。append(chapHead,chapterNumber);
将
mlreportgen.dom.CounterInc
格式对象追加到要自动编号的内容对象的Style
属性。追加CounterInc
对象会在输出段落或标题时增加与自动编号关联的流。更新后的值替换了AutoNumber
对象。chapHead.Style = {CounterInc("chapter"), WhiteSpace("preserve")};
此代码会自动对文档中的章节标题进行编号。
import mlreportgen.dom.*; d = Document("MyReport","html"); for rank = 3:5 chapHead = Heading1("Chapter ","Heading 1"); append(chapHead,AutoNumber("chapter")); append(chapHead,sprintf(". Rank %i Magic Square",rank)); chapHead.Style = {CounterInc("chapter"), ... WhiteSpace("preserve")}; append(d,chapHead); table = append(d,magic(rank)); table.Width = "2in"; end close(d); rptview(d.OutputPath);
创建分层自动编号
您可以创建分层编号方案,例如 1.1、1.2、1.3、2.1 和 2.2。当父编号发生变化时,使用 mlreportgen.dom.CounterReset
格式对象将子自动编号重置为其初始值。例如,此代码使用 CounterReset
格式的对象在每章开始时重置章节表编号流。
import mlreportgen.dom.*; d = Document("MyReport","html"); for rank = 3:2:9 chapHead = Heading(1,"Chapter "); append(chapHead, AutoNumber("chapter")); chapHead.Style = {CounterInc("chapter"), ... CounterReset("table"), ... WhiteSpace("preserve")}; append(d,chapHead); for i = 0:1; tableHead = Paragraph("Table "); append(tableHead,AutoNumber("chapter")) append(tableHead,"."); append(tableHead, AutoNumber("table")); append(tableHead, ... sprintf(". Rank %i Magic Square",rank+i)); tableHead.Style = {CounterInc("table"), ... Bold, ... FontSize("11pt"), ... WhiteSpace("preserve")}; append(d,tableHead); table = append(d,magic(rank+i)); table.Width = "2in"; end end close(d); rptview(d.OutputPath);
使用部件模板自动编号内容
您可以基于包含 Microsoft® Word、HTML 或 PDF 自动编号的模板创建文档部件对象,并将各部分重复追加到文档,从而自动对文档进行编号。
Word 报告中的自动编号
假设您将章节部件模板 Chapter
添加到 Word MyReportTemplate.dotx
报告模板的部件模板库中。该模板使用词序列 (SEQ
) 字段对章节标题进行编号。该模板还包含章节标题和章节内容的空位。
此代码使用章节部件模板来创建编号章节。此代码中的最后一条语句在 Word 中打开报告并对其进行更新。更新报告会导致 Word 将 SEQ
字段替换为章节编号。
import mlreportgen.dom.* doctype = "docx"; d = Document("MyReport",doctype,"MyReportTemplate"); for rank = 3:5 chapterPart = DocumentPart(d,"Chapter"); while ~strcmp(chapterPart.CurrentHoleId,"#end#") switch chapterPart.CurrentHoleId case "ChapterTitle" append(chapterPart, ... sprintf("Rank %i Magic Square",rank)); case "ChapterContent" table = append(chapterPart,magic(rank)); table.Width = "2in"; end moveToNextHole(chapterPart); end append(d, chapterPart); end close(d); rptview(d.OutputPath);
HTML 报告中的自动编号
要在 HTML 报告中创建自动编号,请创建使用 counter-increment
属性的文档部件,并在样式表中定义计数器。例如,要创建文档部件以与 Word 报告中的自动编号 中使用的相同程序一起使用,请在 HTML 文档库中创建类似于此代码的文档部件模板。代码定义了 chapter
计数器并指定了类 an_chapter
来保存自动编号。它还为标题和内容定义了与程序配合使用的空位。
<dptemplate name="Chapter"> <p style="counter-increment:chapter;"><span>Chapter </span> <span class="an_chapter"></span> <hole id="ChapterTitle" /></p> <hole id="ChapterContent" /> </dptemplate>
在样式表中,定义 an_chapter
类。使用 content
属性将 chapter
计数器指定为内容。
span.an_chapter:before { content: counter(chapter); }
使用与 Word 相同的程序,将 doctype
的值更改为 "html"
。
PDF 报告中的自动编号
为 PDF 创建自动编号与 HTML 类似,只是 DOM API 为 PDF 模板提供了一个 HTML 元素 <autonumber>
,可以简化自动编号。为 stream-name
元素指定 autonumber
属性。对于流名称,使用 counter-increment
属性的值,在本例中为 chapter
。
<dptemplate name="Chapter"> <p style="counter-increment:chapter;"><span>Chapter </span> <autonumber stream-name="chapter"/> <hole id="ChapterTitle" /></p> <hole id="ChapterContent" /> </dptemplate>
您不需要在样式表中添加属性来使用自动编号。
使用与 Word 相同的程序,将 doctype
的值更改为 "pdf"
。