页眉和页脚¶
在WordprocessingML文档中,页眉是与正文分开并显示在打印页顶部的文本。文档中的页眉在每一页之间通常是相同的,只是内容上有细微的差异,例如节标题或页码。这样的头也被称为运行头。
页脚在所有方面都类似于页眉,只是它显示在页面的底部。它不应与脚注混淆,因为脚注在页面之间并不一致。为了简洁起见,术语 header 在这里经常用来指可能是页眉或页脚对象的对象,相信读者能够理解它对这两种对象类型的适用性。
在书本印刷的文档中,页面在打开时双面打印,正面或 recto 每页的侧面显示在装订边的右侧和背面或 verso 每页的一侧显示在左侧。第一张打印页的页码为“1”,并且始终是直排页码。因为页是连续编号的,所以每个recto页都会收到一个 odd 页码,每个verso页都会收到一个 even 页码。
出现在矩形页上的页眉通常与反面页面上的标题不同。为了支持这种差异,可以选择使用与文档中默认的奇数页眉不同的偶数页眉。此“奇数和偶数标题”选项应用于文档级别,并影响文档的所有部分。
出现在章节(如章节)第一页的标题可能不同于后续页面的标题。支持这种差异会产生设置不同的首页页眉的选项。此“不同的首页页眉”选项应用于节级别,并且可能因文档中的节而异。
在WordprocessingML中,页眉或页脚出现在页边距区域内。除了少数例外,页眉或页脚可能包含可以出现在正文中的所有类型的内容,包括文本和图像。每个页眉和页脚都可以访问中定义的样式 /word/styles.xml
.
每个节都有自己的页眉和页脚集,尽管可以将节配置为“继承”上一节的页眉和页脚。每个节可以有三个页眉定义:默认页眉、偶数页眉和第一页页眉。如果未启用不同的偶数/奇数页眉,则默认页眉将同时出现在偶数和奇数编号的页面上。如果启用了偶数/奇数页眉,则对奇数页使用默认页眉。一组对应的三个页脚定义也是可能的。所有页眉/页脚定义都是可选的。
开放式问题¶
连续休息一下怎么样?页眉/页脚的行为是什么?
候选方案¶
每个部分都有一个标题;它从来没有:
>>> header = section.header
>>> header
<docx.hdrftr.Header object at 0x02468ACE>
上有三个标题属性 Section
: .header , .even_page_header 和 .first_page_header . 所有头对象共享相同的属性和方法。页脚有三个对应的属性。
Header是的子类 BlockItemContainer
,从中继承与 Document
,如 .add_paragraph() .
如果 w:headerReference 标头的元素不存在,该标头的定义是从上一节“继承”的。此操作是递归的,例如,第一个部分的头定义可以应用于第三个部分。继承其定义的头称为“链接到上一个”。也许与直觉相反,第一节的标题可以“链接到上一节”,即使不存在前一节。这个 .is_linked_to_previous 属性只是测试当前节中是否存在头定义:
>>> header.is_linked_to_previous
True
编辑操作对源标头透明地进行操作,前一节中的源标头具有该类型的标头(当当前部分中不存在时)。如果前面的节没有标题,则在第一次构造性编辑调用时在文档的第一节中创建一个标题:
>>> header = document.sections[0].header
>>> header.is_linked_to_previous
True
>>> header.text = 'foobar'
>>> header.is_linked_to_previous
False
将False分配给 .is_linked_to_previous 当该节不存在时,为该节创建空白标题:
>>> header.is_linked_to_previous
True
>>> header.is_linked_to_previous = False
>>> header.is_linked_to_previous
False
相反,通过将True赋值给从节中删除现有的头 .is_linked_to_previous ::
>>> header.is_linked_to_previous
False
>>> header.is_linked_to_previous = True
>>> header.is_linked_to_previous
True
文档设置对象具有读/写功能 .odd_and_even_pages_header_footer 属性,该属性指示verso和recto页将具有不同的页眉。当 .odd_and_even_pages_header_footer 是假的;它们根本不是用语言表达的。分配 True 到 .odd_and_even_pages_header_footer 不会自动创建新的偶数标头定义::
>>> document.settings.odd_and_even_pages_header_footer
False
>>> document.settings.odd_and_even_pages_header_footer = True
>>> section.even_page_header.is_linked_to_previous
True
Section 具有读/写功能 .different_first_page_header_footer 属性,该属性指示节的第一页是否应具有不同的页眉。分配 True 到 .different_first_page_header_footer 不自动创建新的首页页眉定义:
>>> section.different_first_page_header_footer
False
>>> section.different_first_page_header_footer = True
>>> section.different_first_page_header_footer
True
>>> section.first_page_header.is_linked_to_previous
True
XML样本¶
标题有七种不同的排列:
文档所有页面的标题相同:
<w:sectPr>
<w:headerReference w:type="default" r:id="rId3"/>
...
</w:sectPr>
只有一个奇怪的标题。这一部分与上面完全相同,但是 settings.xml 拥有 <w:evenAndOddHeaders> 属性:
<w:settings xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
...
<w:evenAndOddHeaders w:val="1"/>
...
</w:settings>
不同的奇偶标题:
<w:sectPr>
<w:headerReference w:type="default" r:id="rId3"/>
<w:headerReference w:type="even" r:id="rId4"/>
...
</w:sectPr>
不同的第一页页眉,后面的页都有相同的页眉:
<w:sectPr>
<w:headerReference w:type="default" r:id="rId3"/>
<w:headerReference w:type="first" r:id="rId4"/>
<w:titlePg/>
...
</w:sectPr>
不同的第一、偶数和奇数页眉:
<w:sectPr>
<w:headerReference w:type="default" r:id="rId3"/>
<w:headerReference w:type="first" r:id="rId4"/>
<w:headerReference w:type="even" r:id="rId5"/>
<w:titlePg/>
...
</w:sectPr>
标题部分:
<w:hdr>
<w:p>
<w:pPr>
<w:pStyle w:val="Header"/>
</w:pPr>
<w:r>
<w:t>Header for section-1</w:t>
</w:r>
</w:p>
</w:hdr>
言语行为¶
关闭偶数/奇数标题时,Word将设置 w:evenAndOddHeaders 设置为0,但实际上不删除偶数标头。
关闭第一页页眉时,Word会设置 w:titlePg 设置为0,但实际上不删除偶数标头。
Word将加载具有偶数页眉但没有奇数页眉的文件。
微软API¶
WdHeaderFooterIndex枚举::
EVEN_PAGES = 3
FIRST_PAGE = 2
PRIMARY = 1
在MS API中创建页脚:
section = Document.Sections(1)
footers = section.Footers # a HeadersFooters collection object
default_footer = footers(wdHeaderFooterPrimary)
default_footer.Range.Text = "Footer text"
PageSetup对象:
DifferentFirstPageHeaderFooter: Read/write {True, False, WD_UNDEFINED}
OddAndEvenPagesHeaderFooter: Read/write {True, False, WD_UNDEFINED}
架构摘要¶
<xsd:complexType name="CT_SectPr"> <!-- denormalized -->
<xsd:sequence>
<xsd:choice minOccurs="0" maxOccurs="6"/>
<xsd:element name="headerReference" type="CT_HdrFtrRef"/>
<xsd:element name="footerReference" type="CT_HdrFtrRef"/>
</xsd:choice>
<xsd:element name="footnotePr" type="CT_FtnProps" minOccurs="0"/>
<xsd:element name="endnotePr" type="CT_EdnProps" minOccurs="0"/>
<xsd:element name="type" type="CT_SectType" minOccurs="0"/>
<xsd:element name="pgSz" type="CT_PageSz" minOccurs="0"/>
<xsd:element name="pgMar" type="CT_PageMar" minOccurs="0"/>
<xsd:element name="paperSrc" type="CT_PaperSource" minOccurs="0"/>
<xsd:element name="pgBorders" type="CT_PageBorders" minOccurs="0"/>
<xsd:element name="lnNumType" type="CT_LineNumber" minOccurs="0"/>
<xsd:element name="pgNumType" type="CT_PageNumber" minOccurs="0"/>
<xsd:element name="cols" type="CT_Columns" minOccurs="0"/>
<xsd:element name="formProt" type="CT_OnOff" minOccurs="0"/>
<xsd:element name="vAlign" type="CT_VerticalJc" minOccurs="0"/>
<xsd:element name="noEndnote" type="CT_OnOff" minOccurs="0"/>
<xsd:element name="titlePg" type="CT_OnOff" minOccurs="0"/>
<xsd:element name="textDirection" type="CT_TextDirection" minOccurs="0"/>
<xsd:element name="bidi" type="CT_OnOff" minOccurs="0"/>
<xsd:element name="rtlGutter" type="CT_OnOff" minOccurs="0"/>
<xsd:element name="docGrid" type="CT_DocGrid" minOccurs="0"/>
<xsd:element name="printerSettings" type="CT_Rel" minOccurs="0"/>
<xsd:element name="sectPrChange" type="CT_SectPrChange" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="rsidRPr" type="ST_LongHexNumber"/>
<xsd:attribute name="rsidDel" type="ST_LongHexNumber"/>
<xsd:attribute name="rsidR" type="ST_LongHexNumber"/>
<xsd:attribute name="rsidSect" type="ST_LongHexNumber"/>
</xsd:complexType>
<xsd:complexType name="CT_HdrFtrRef">
<xsd:attribute ref="r:id" use="required"/>
<xsd:attribute name="type" type="ST_HdrFtr" use="required"/>
</xsd:complexType>
<xsd:simpleType name="ST_HdrFtr">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="even"/>
<xsd:enumeration value="default"/>
<xsd:enumeration value="first"/>
</xsd:restriction>
</xsd:simpleType>