diff --git a/addons/sandbox/images/guest/Dockerfile b/addons/sandbox/images/guest/Dockerfile
index 7601695af..3069d974c 100644
--- a/addons/sandbox/images/guest/Dockerfile
+++ b/addons/sandbox/images/guest/Dockerfile
@@ -101,6 +101,10 @@ RUN set -eux; \
python3 /tmp/guest-python/check-python.py; \
sh /tmp/guest-python/check-tools.sh; \
rm -rf /tmp/guest-python
+# Helpers belong to the guest, not the documentation-only skill package.
+COPY addons/sandbox/images/guest/document-skills/ /usr/local/lib/localai/document-skills/
+COPY addons/sandbox/images/guest/check-document-skills.py /usr/local/lib/localai/document-skills/check-document-skills.py
+RUN python3 /usr/local/lib/localai/document-skills/check-document-skills.py
# The guest has no network device. Every tool must use the proxy on the
# loopback interface; the sandbox serves it with a host port handler.
ENV HTTP_PROXY=http://127.0.0.1:3128 HTTPS_PROXY=http://127.0.0.1:3128 NO_PROXY=localhost,127.0.0.1 \
diff --git a/addons/sandbox/images/guest/check-document-skills.py b/addons/sandbox/images/guest/check-document-skills.py
new file mode 100644
index 000000000..5e1d5d598
--- /dev/null
+++ b/addons/sandbox/images/guest/check-document-skills.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: MIT
+"""Exercise the installed PDF helper CLIs using only guest dependencies."""
+
+import json
+from pathlib import Path
+import subprocess
+import sys
+import tempfile
+
+from reportlab.pdfgen import canvas
+
+
+HELPERS = Path("/usr/local/lib/localai/document-skills/pdf")
+SUCCESS = "document-skills fixtures: ok"
+
+
+def require(condition, message):
+ if not condition:
+ raise RuntimeError(message)
+
+
+def run_helper(name, pdf, exit_code):
+ result = subprocess.run(
+ [sys.executable, str(HELPERS / name), str(pdf), "--json"],
+ capture_output=True, text=True, timeout=30, check=False,
+ )
+ require(result.returncode == exit_code,
+ f"{name} {pdf.name}: exit {result.returncode}, expected {exit_code}: {result.stderr}")
+ data = json.loads(result.stdout)
+ require(data["ok"] is (exit_code == 0), f"{name}: incorrect ok field")
+ require(data["page_count"] == 1 and len(data["pages"]) == 1,
+ f"{name}: incorrect page count")
+ require(data["error_count"] == sum(p["severity"] == "error" for p in data["problems"]),
+ f"{name}: incorrect error count")
+ require(data["warning_count"] == sum(p["severity"] == "warning" for p in data["problems"]),
+ f"{name}: incorrect warning count")
+ return data
+
+
+def main():
+ for name in ("content_qa.py", "verify_pdf.py", "notice.txt"):
+ require((HELPERS / name).is_file(), f"missing guest helper asset: {name}")
+ notice = (HELPERS / "notice.txt").read_text()
+ for attribution in ("MIT License", "Copyright (c) 2026 Paper Instruments, Inc.",
+ "Permission is hereby granted", "THE SOFTWARE IS PROVIDED"):
+ require(attribution in notice, f"missing helper license attribution: {attribution}")
+
+ with tempfile.TemporaryDirectory(prefix="document-skills-") as directory:
+ root = Path(directory)
+ for name, x in (("valid", 72), ("empty", None), ("defective", -144)):
+ pdf = root / f"{name}.pdf"
+ document = canvas.Canvas(str(pdf), pagesize=(612, 792), invariant=1)
+ if x is not None:
+ document.drawString(x, 720, "Sandbox PDF fixture")
+ document.showPage()
+ document.save()
+
+ for name in ("content_qa.py", "verify_pdf.py"):
+ valid = run_helper(name, root / "valid.pdf", 0)
+ require(valid["error_count"] == 0 and valid["warning_count"] == 0,
+ f"{name}: valid document reported problems")
+ empty = run_helper(name, root / "empty.pdf", 0)
+ expected = "empty_page_text" if name == "content_qa.py" else "pdf-no-extractable-text"
+ require(empty["error_count"] == 0 and empty["warning_count"] == 1,
+ f"{name}: empty-text document must warn, not fail")
+ require(empty["problems"][0]["kind"] == expected, f"{name}: missing empty-text warning")
+ require(empty["problems"][0]["page"] == 1, f"{name}: incorrect warning page")
+ if name == "content_qa.py":
+ require(valid["pages"][0]["text"].strip() == "Sandbox PDF fixture",
+ "content_qa.py: fixture text not extracted")
+ require(empty["pages"][0]["text"] == "", "empty fixture contains text")
+ else:
+ require(valid["pages"][0]["text_line_count"] > 0,
+ "verify_pdf.py: fixture text geometry not extracted")
+
+ # The PDF is openable and contains text, but that text is outside its
+ # page box. Content QA should accept it; geometry verification must not.
+ content = run_helper("content_qa.py", root / "defective.pdf", 0)
+ require(content["error_count"] == 0 and content["warning_count"] == 0,
+ "content_qa.py: changed content-only behavior")
+ defective = run_helper("verify_pdf.py", root / "defective.pdf", 1)
+ require(defective["error_count"] > 0, "verify_pdf.py: missed defective geometry")
+ require(any(p["kind"] == "layout-boundary-violation" and p["severity"] == "error"
+ and p["page"] == 1 for p in defective["problems"]),
+ "verify_pdf.py: missing boundary violation")
+ print(SUCCESS)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/core/services/studio/builtinskills/tree/pdf/scripts/content_qa.py b/addons/sandbox/images/guest/document-skills/pdf/content_qa.py
similarity index 100%
rename from core/services/studio/builtinskills/tree/pdf/scripts/content_qa.py
rename to addons/sandbox/images/guest/document-skills/pdf/content_qa.py
diff --git a/addons/sandbox/images/guest/document-skills/pdf/notice.txt b/addons/sandbox/images/guest/document-skills/pdf/notice.txt
new file mode 100644
index 000000000..ff537ce50
--- /dev/null
+++ b/addons/sandbox/images/guest/document-skills/pdf/notice.txt
@@ -0,0 +1,30 @@
+PDF helpers from Feather
+========================
+
+Source: https://github.com/paper-instruments/feather-train
+Commit: b7463092af862ebbdf4c5920c4bc9ab38ab17ad9
+Folder: feather-harness/src/feather_harness/skills/pdf/scripts
+
+The helper sources are copied without changes.
+
+MIT License
+
+Copyright (c) 2026 Paper Instruments, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/core/services/studio/builtinskills/tree/pdf/scripts/verify_pdf.py b/addons/sandbox/images/guest/document-skills/pdf/verify_pdf.py
similarity index 100%
rename from core/services/studio/builtinskills/tree/pdf/scripts/verify_pdf.py
rename to addons/sandbox/images/guest/document-skills/pdf/verify_pdf.py
diff --git a/addons/sandbox/manifest.json b/addons/sandbox/manifest.json
index 7a9333c21..15673c4d6 100644
--- a/addons/sandbox/manifest.json
+++ b/addons/sandbox/manifest.json
@@ -118,7 +118,25 @@
}
],
"title": "Sandbox"
- }
+ },
+ "skillDefinitions": [
+ {
+ "name": "docx",
+ "shadows": "docx"
+ },
+ {
+ "name": "pptx",
+ "shadows": "pptx"
+ },
+ {
+ "name": "pdf",
+ "shadows": "pdf"
+ },
+ {
+ "name": "xlsx",
+ "shadows": "xlsx"
+ }
+ ]
},
"dataFormat": {
"max": 1,
diff --git a/addons/sandbox/package/platforms.yaml b/addons/sandbox/package/platforms.yaml
index d7a55a19d..e0c91de53 100644
--- a/addons/sandbox/package/platforms.yaml
+++ b/addons/sandbox/package/platforms.yaml
@@ -26,6 +26,7 @@ executable: sandbox
manifest: addons/sandbox/manifest.json
# The directory whose content is laid at the package root (ui/sandbox.js ...).
ui: addons/sandbox/ui/dist
+skills: addons/sandbox/skills
platforms:
- platform: linux/amd64
enabled: true
diff --git a/core/services/studio/builtinskills/tree/docx/SKILL.md b/addons/sandbox/skills/docx/SKILL.md
similarity index 90%
rename from core/services/studio/builtinskills/tree/docx/SKILL.md
rename to addons/sandbox/skills/docx/SKILL.md
index d9a4c1241..fe806fbd7 100644
--- a/core/services/studio/builtinskills/tree/docx/SKILL.md
+++ b/addons/sandbox/skills/docx/SKILL.md
@@ -22,7 +22,7 @@ Use your existing knowledge of `python-docx` for normal paragraphs, runs, styles
`paper-docx` is installed under the `docx` import.
-The [Paper API companion](references/paper-api.md) maps Paper-specific capabilities to their public symbols. The [generated API reference](references/api/index.md) covers the complete public API, including the surface inherited from `python-docx`, with one page per module. It is large; search by symbol and read only the relevant section.
+The [Paper API companion](references/paper-api.md#source-c4b328c0772ccf3b) maps Paper-specific capabilities to their public symbols. The [generated API reference](references/api-002.md#source-56f84baa75bfbe31) covers the complete public API, including the surface inherited from `python-docx`, with one page per module. It is large; search by symbol and read only the relevant section.
## Package behavior
diff --git a/addons/sandbox/skills/docx/notice.txt b/addons/sandbox/skills/docx/notice.txt
new file mode 100644
index 000000000..e2afba80e
--- /dev/null
+++ b/addons/sandbox/skills/docx/notice.txt
@@ -0,0 +1,107 @@
+Sandbox document skills
+=============================
+
+The skills "docx", "xlsx", "pptx" and "pdf" are adapted from the skills of the
+Feather project.
+
+ Source: https://github.com/paper-instruments/feather-train
+ (folder feather-harness/src/feather_harness/skills)
+ Commit: b7463092af862ebbdf4c5920c4bc9ab38ab17ad9
+ Licence: MIT, Copyright (c) 2026 Paper Instruments, Inc.
+
+What was changed: the text about LibreOffice was replaced by a note that
+LibreOffice is not installed, the text about OCR was shortened in the same way,
+and the generated page of the LibreOffice-backed module "openpyxl.oracle" got
+the same note. Each of the four got one line that says to write
+helper scripts in the chat's work folder. The remaining built-in skills are not part of this package.
+
+The MIT licence of the Feather project
+--------------------------------------
+
+MIT License
+
+Copyright (c) 2026 Paper Instruments, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+The generated API pages
+-----------------------
+
+The pages under docx/references/api, xlsx/references/api and
+pptx/references/api are generated from the docstrings of the Paper libraries
+and of the libraries that they extend. The licences of those projects apply to
+that text. All three are MIT licences.
+
+paper-docx extends python-docx, and paper-pptx extends python-pptx. Steve Canny
+wrote both upstream libraries, so the two licence files of the Paper packages
+have the same text. Each applies to its own package.
+
+ paper-docx https://pypi.org/project/paper-docx/ (python-docx)
+ paper-pptx https://pypi.org/project/paper-pptx/ (python-pptx)
+
+The MIT License (MIT)
+Copyright (c) 2013 Steve Canny, https://github.com/scanny
+Portions Copyright (c) 2026 Paper Instruments, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+paper-xlsx extends openpyxl.
+
+ paper-xlsx https://pypi.org/project/paper-xlsx/ (openpyxl)
+
+This software is under the MIT Licence
+======================================
+
+Copyright (c) 2010 openpyxl
+Portions Copyright (c) 2026 Paper Instruments, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/addons/sandbox/skills/docx/references/api-001.md b/addons/sandbox/skills/docx/references/api-001.md
new file mode 100644
index 000000000..56e4dfb2d
--- /dev/null
+++ b/addons/sandbox/skills/docx/references/api-001.md
@@ -0,0 +1,5393 @@
+
+
+
+
+# `docx.api`
+
+Directly exposed API functions and classes, `Document` for now.
+
+## `Document`
+
+```python
+Document(docx: str | IO[bytes] | None = None) -> DocumentObject
+```
+
+Return a `Document` object loaded from `docx`, where `docx` can be either a path
+to a ``.docx`` file (a string) or a file-like object.
+
+If `docx` is missing or ``None``, the built-in default document "template" is
+loaded.
+
+
+
+
+
+# `docx.blkcntnr`
+
+Block item container, used by body, cell, header, etc.
+
+## `BlockItemContainer`
+
+```python
+BlockItemContainer(element: BlockItemElement, parent: t.ProvidesStoryPart)
+```
+
+Bases: `StoryChild`
+
+Base class for proxy objects that can contain block items.
+
+These containers include _Body, _Cell, header, footer, footnote, endnote, comment,
+and text box objects. Provides the shared functionality to add a block item like a
+paragraph or table.
+
+### `add_paragraph`
+
+```python
+add_paragraph(text: str = '', style: str | ParagraphStyle | None = None) -> Paragraph
+```
+
+Return paragraph newly added to the end of the content in this container.
+
+The paragraph has `text` in a single run if present, and is given paragraph
+style `style`.
+
+If `style` is `None`, no paragraph style is applied, which has the same effect
+as applying the 'Normal' style.
+
+### `add_table`
+
+```python
+add_table(rows: int, cols: int, width: Length) -> Table
+```
+
+Return table of `width` having `rows` rows and `cols` columns.
+
+The table is appended appended at the end of the content in this container.
+
+`width` is evenly distributed between the table columns.
+
+### `iter_inner_content`
+
+```python
+iter_inner_content() -> Iterator[Paragraph | Table]
+```
+
+Generate each `Paragraph` or `Table` in this container in document order.
+
+### `paragraphs`
+
+```python
+paragraphs
+```
+
+A list containing the paragraphs in this container, in document order.
+
+Read-only.
+
+### `tables`
+
+```python
+tables
+```
+
+A list containing the tables in this container, in document order.
+
+Read-only.
+
+## `BlockItemElement`
+
+```python
+BlockItemElement: TypeAlias = 'CT_Body | CT_Comment | CT_HdrFtr | CT_Tc'
+```
+
+
+
+
+
+# `docx.blocks`
+
+Anchor-relative block operations and clause-level redlines (paper-docx).
+
+## `BlockEditResult`
+
+```python
+BlockEditResult(story: str, inserted_blocks: int, deleted_blocks: int, deleted_text: Tuple[str, ...], revision_ids: Tuple[int, ...]) -> None
+```
+
+Outcome of a block-level edit.
+
+### `deleted_blocks`
+
+```python
+deleted_blocks: int
+```
+
+### `deleted_text`
+
+```python
+deleted_text: Tuple[str, ...]
+```
+
+### `inserted_blocks`
+
+```python
+inserted_blocks: int
+```
+
+### `revision_ids`
+
+```python
+revision_ids: Tuple[int, ...]
+```
+
+### `story`
+
+```python
+story: str
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `BlockTarget`
+
+```python
+BlockTarget = Union[str, Block, Span]
+```
+
+## `ListBlock`
+
+```python
+ListBlock(items: Sequence[str], kind: str = 'bullet', level: int = 0) -> None
+```
+
+A real bullet/decimal list (backed by a real numbering definition).
+
+### `items`
+
+```python
+items: Sequence[str]
+```
+
+### `kind`
+
+```python
+kind: str = 'bullet'
+```
+
+### `level`
+
+```python
+level: int = 0
+```
+
+## `RichParagraph`
+
+```python
+RichParagraph(runs: Sequence[TextRun], style: Optional[str] = None) -> None
+```
+
+A paragraph built from styled runs.
+
+### `runs`
+
+```python
+runs: Sequence[TextRun]
+```
+
+### `style`
+
+```python
+style: Optional[str] = None
+```
+
+## `TableBlock`
+
+```python
+TableBlock(rows: Sequence[Sequence[str]]) -> None
+```
+
+A simple rectangular table of plain-text cells.
+
+### `rows`
+
+```python
+rows: Sequence[Sequence[str]]
+```
+
+## `TextRun`
+
+```python
+TextRun(text: str, bold: bool = False, italic: bool = False) -> None
+```
+
+One run of a rich paragraph.
+
+### `bold`
+
+```python
+bold: bool = False
+```
+
+### `italic`
+
+```python
+italic: bool = False
+```
+
+### `text`
+
+```python
+text: str
+```
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `insert_blocks_after`
+
+```python
+insert_blocks_after(document: 'Document', anchor: BlockTarget, *, blocks: 'Sequence[object]', tracked: bool = False, author: Optional[str] = None, date: Optional[dt.datetime] = None) -> BlockEditResult
+```
+
+Insert a typed block list after `anchor`, and return a `BlockEditResult`.
+
+`blocks` mixes `RichParagraph` (styled runs), `ListBlock` (real bullet or decimal lists,
+numbering definition created on demand) and `TableBlock` (rectangular tables). Reach for
+this when you want structure rather than raw XML. Refuses a protected document, and an
+anchor that is missing, ambiguous, foreign, stale, or spans more than one paragraph.
+
+## `insert_section_after`
+
+```python
+insert_section_after(document: 'Document', anchor: BlockTarget, *, heading: str, paragraphs: Sequence[str], heading_style: str = 'Heading2', body_style: Optional[str] = None, tracked: bool = False, author: Optional[str] = None, date: Optional[dt.datetime] = None) -> BlockEditResult
+```
+
+Insert a heading plus body paragraphs after `anchor`, and return a `BlockEditResult`.
+
+With `tracked=True` each inserted paragraph is a real Word insertion attributed to
+`author` (required) and `date`. Refuses a protected document, an undefined heading
+style, and an anchor that is missing, ambiguous, foreign, stale, or spans
+more than one paragraph.
+
+## `require_anchor_owner`
+
+```python
+require_anchor_owner(document: 'Document', anchor: object, *, argument: str = 'anchor') -> None
+```
+
+Check ownership for live anchor forms; value/string anchors are inert.
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+## `tracked_delete_paragraphs`
+
+```python
+tracked_delete_paragraphs(document: 'Document', start_anchor: BlockTarget, *, end_anchor: Optional[BlockTarget] = None, count: int = 1, author: str, date: Optional[dt.datetime] = None) -> BlockEditResult
+```
+
+Mark a paragraph range deleted with real tracked changes; returns a `BlockEditResult`.
+
+Runs move into `w:del` with formatting intact and the paragraph mark is stamped, so
+accepting removes the paragraphs and rejecting restores them exactly. Refuses a
+protected document, an endpoint spanning multiple paragraphs, a range
+crossing stories or parents, a bookmarked or non-plain run, and an open field.
+
+## `tracked_replace_paragraphs`
+
+```python
+tracked_replace_paragraphs(document: 'Document', start_anchor: BlockTarget, replacement_paragraphs: Sequence[str], *, end_anchor: Optional[BlockTarget] = None, count: int = 1, body_style: Optional[str] = None, author: str, date: Optional[dt.datetime] = None) -> BlockEditResult
+```
+
+Tracked-delete a paragraph range and tracked-insert replacements after it.
+
+Returns a `BlockEditResult`. Replacements land after the last deleted paragraph. Carries
+the same refusals as `tracked_delete_paragraphs`: protection, a multi-paragraph
+endpoint, a range crossing stories, bookmarked or non-plain runs, an open field.
+
+
+
+
+
+# `docx.bookmarks`
+
+Bookmark enumeration, creation, and deletion.
+
+## `BookmarkInfo`
+
+```python
+BookmarkInfo(name: str, bookmark_id: int, story: str, text: str) -> None
+```
+
+One bookmark: its name, id, story, and the visible text it wraps.
+
+### `bookmark_id`
+
+```python
+bookmark_id: int
+```
+
+### `is_point`
+
+```python
+is_point: bool
+```
+
+### `name`
+
+```python
+name: str
+```
+
+### `story`
+
+```python
+story: str
+```
+
+### `text`
+
+```python
+text: str
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `DEL_TEXT`
+
+```python
+DEL_TEXT = qn('w:delText')
+```
+
+## `INSTR_TEXT`
+
+```python
+INSTR_TEXT = qn('w:instrText')
+```
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `create_bookmark`
+
+```python
+create_bookmark(document: 'Document', span: 'Span', name: str) -> BookmarkInfo
+```
+
+Bookmark exactly `span`'s text under `name`, and return its `BookmarkInfo`.
+
+Use this to give a span a stable target that survives later edits; cross-references and
+`add_reference_field` ride on bookmarks. Splits boundary runs so the markers wrap the
+span's characters exactly. Refuses a protected document, a foreign or stale span, and a
+name Word rejects or the document already uses.
+
+## `delete_bookmark`
+
+```python
+delete_bookmark(document: 'Document', name: str) -> None
+```
+
+Remove `name`'s markers, leaving the text in place.
+
+Use this to retire a bookmark without touching content. Refuses while a field
+instruction still references the name, since a dangling REF renders "Error! Reference
+source not found." in Word. Refuses a protected document and an unknown name.
+
+## `is_direct_run_child`
+
+```python
+is_direct_run_child(element: '_Element') -> bool
+```
+
+Whether ``element`` is a direct child of a ``w:r`` element.
+
+## `list_bookmarks`
+
+```python
+list_bookmarks(document: 'Document') -> 'List[BookmarkInfo]'
+```
+
+Every bookmark across every story, in document order.
+
+## `project_run_child`
+
+```python
+project_run_child(element: '_Element') -> RunChildProjection
+```
+
+Return the conservative text projection for a direct ``w:r`` child.
+
+## `require_span_owner`
+
+```python
+require_span_owner(document: 'Document', span: 'Span', *, argument: str = 'span') -> None
+```
+
+Refuse a live span captured from a different document package.
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+
+
+
+
+# `docx.commentops`
+
+Comment thread operations: anchored text, replies, resolution.
+
+## `COMMENTS_EXTENDED_CONTENT_TYPE`
+
+```python
+COMMENTS_EXTENDED_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtended+xml'
+```
+
+## `COMMENTS_EXTENDED_RELATIONSHIP_TYPE`
+
+```python
+COMMENTS_EXTENDED_RELATIONSHIP_TYPE = 'http://schemas.microsoft.com/office/2011/relationships/commentsExtended'
+```
+
+## `COMMENTS_EXTENSIBLE_CONTENT_TYPE`
+
+```python
+COMMENTS_EXTENSIBLE_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtensible+xml'
+```
+
+## `COMMENTS_EXTENSIBLE_RELATIONSHIP_TYPE`
+
+```python
+COMMENTS_EXTENSIBLE_RELATIONSHIP_TYPE = 'http://schemas.microsoft.com/office/2018/08/relationships/commentsExtensible'
+```
+
+## `COMMENTS_IDS_CONTENT_TYPE`
+
+```python
+COMMENTS_IDS_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsIds+xml'
+```
+
+## `COMMENTS_IDS_RELATIONSHIP_TYPE`
+
+```python
+COMMENTS_IDS_RELATIONSHIP_TYPE = 'http://schemas.microsoft.com/office/2016/09/relationships/commentsIds'
+```
+
+## `DEL_TEXT`
+
+```python
+DEL_TEXT = qn('w:delText')
+```
+
+## `INSTR_TEXT`
+
+```python
+INSTR_TEXT = qn('w:instrText')
+```
+
+## `anchored_text`
+
+```python
+anchored_text(document: 'Document', comment: 'Comment') -> str
+```
+
+The document text `comment` is anchored to, taken from its range marks.
+
+Refuses a stale or foreign comment, and a comment whose range marks are missing or
+crossed.
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `comment_thread`
+
+```python
+comment_thread(document: 'Document') -> Tuple[dict, ...]
+```
+
+Every comment with its thread state: id, author, text, resolved, parent id, and anchored
+text where available.
+
+Use it to read a whole discussion in one pass rather than walking replies. Refuses a
+stale comment and a malformed `commentsExtended` part.
+
+## `delete_comment`
+
+```python
+delete_comment(document: 'Document', comment: 'Comment') -> None
+```
+
+Delete `comment` and its replies, removing their range marks from the text.
+
+Refuses a protected document, a stale or foreign comment, and a comments part that is
+missing or ambiguous.
+
+## `is_direct_run_child`
+
+```python
+is_direct_run_child(element: '_Element') -> bool
+```
+
+Whether ``element`` is a direct child of a ``w:r`` element.
+
+## `is_resolved`
+
+```python
+is_resolved(document: 'Document', comment: 'Comment') -> bool
+```
+
+Whether `comment`'s thread is marked resolved.
+
+Reads `commentsExtended`, where Word keeps resolution state. Refuses a stale or foreign
+comment, and a malformed `commentsExtended` part.
+
+## `parent_of`
+
+```python
+parent_of(document: 'Document', comment: 'Comment') -> Optional[int]
+```
+
+The comment `comment` replies to, or None when it starts a thread.
+
+Refuses a stale or foreign comment, and a malformed `commentsExtended` part.
+
+## `project_run_child`
+
+```python
+project_run_child(element: '_Element') -> RunChildProjection
+```
+
+Return the conservative text projection for a direct ``w:r`` child.
+
+## `reply`
+
+```python
+reply(document: 'Document', comment: 'Comment', text: str, *, author: str, initials: Optional[str] = None, date: Optional[dt.datetime] = None) -> 'Comment'
+```
+
+Add a threaded reply to `comment` and return the new `Comment`.
+
+The reply gets its own comment-range start, range end, and reference around the same
+selected text. Its `w15:paraIdParent` names the parent's final comment-body paragraph; the
+reply does not reuse the parent's marker id. Creates `commentsExtended` on first use, since
+Word keeps threading outside `w:comment`. Refuses a protected document, a stale or foreign
+comment, and a comments part that is missing or ambiguous.
+
+## `require_comment_owner`
+
+```python
+require_comment_owner(document: 'Document', comment: 'Comment', *, argument: str = 'comment') -> None
+```
+
+Refuse a comment proxy from another part and detect detached proxies.
+
+## `resolve`
+
+```python
+resolve(document: 'Document', comment: 'Comment', *, resolved: bool = True) -> None
+```
+
+Mark `comment`'s thread resolved, or reopen it with `resolved=False`.
+
+Word keeps resolution in `commentsExtended` rather than on the comment, so this writes
+that part. Refuses a protected document, and a stale or foreign comment.
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+
+
+
+
+# `docx.comments`
+
+Collection providing access to comments added to this document.
+
+## `Comment`
+
+```python
+Comment(comment_elm: CT_Comment, comments_part: CommentsPart)
+```
+
+Bases: `BlockItemContainer`
+
+Proxy for a single comment in the document.
+
+Reads author, initials, date and body content, and adds paragraphs or tables. Every
+mutation revalidates that the comment is still live first, so a proxy whose part was
+removed or replaced refuses instead of writing into a detached tree.
+
+### `add_paragraph`
+
+```python
+add_paragraph(text: str = '', style: str | ParagraphStyle | None = None) -> Paragraph
+```
+
+Append a paragraph to this comment's body and return it.
+
+Re-keys the comment's `commentEx`, its replies' `paraIdParent`, and its `commentsIds` row
+onto the new last paragraph, so appending rewrites thread and resolution state. Refuses a
+protected document, and a proxy whose part was removed or replaced.
+
+### `add_table`
+
+```python
+add_table(rows: int, cols: int, width: Length) -> Table
+```
+
+Append a table to this comment's body and return it.
+
+Re-keys thread and resolution state onto the new last paragraph, as `add_paragraph` does.
+Refuses a protected document, and a proxy whose part was removed or replaced.
+
+### `author`
+
+```python
+author: str
+```
+
+Read/write. The recorded author of this comment.
+
+This field is required but can be set to the empty string.
+
+### `comment_id`
+
+```python
+comment_id: int
+```
+
+The unique identifier of this comment.
+
+### `initials`
+
+```python
+initials: str | None
+```
+
+Read/write. The recorded initials of the comment author.
+
+This attribute is optional in the XML, returns `None` if not set. Assigning `None` removes
+any existing initials from the XML.
+
+### `text`
+
+```python
+text: str
+```
+
+The text content of this comment as a string.
+
+Only content in paragraphs is included and of course all emphasis and styling is stripped.
+
+Paragraph boundaries are indicated with a newline (`"\\n"`)
+
+### `timestamp`
+
+```python
+timestamp: dt.datetime | None
+```
+
+The date and time this comment was authored.
+
+This attribute is optional in the XML, returns `None` if not set.
+
+## `Comments`
+
+```python
+Comments(comments_elm: CT_Comments, comments_part: CommentsPart)
+```
+
+Collection containing the comments added to this document.
+
+### `add_comment`
+
+```python
+add_comment(text: str = '', author: str = '', initials: str | None = '') -> Comment
+```
+
+Add a new comment to the document and return it.
+
+Assigns a unique id and writes the modern identity parts (`commentsIds`,
+`commentsExtensible`, a `w14:paraId`) that Word needs to thread replies. Refuses a
+protected document, a collection whose part was removed or replaced, and an ambiguous
+comments relationship.
+
+### `get`
+
+```python
+get(comment_id: int) -> Comment | None
+```
+
+Return the comment identified by `comment_id`, or `None` if not found.
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+## `rollback_xml_on_error`
+
+```python
+rollback_xml_on_error(root: '_Element') -> Generator[None, None, None]
+```
+
+Restore one live XML tree after an error in a local compound edit.
+
+
+
+
+
+# `docx.composition`
+
+Cross-document composition.
+
+## `CompositionFinding`
+
+```python
+CompositionFinding(kind: str, detail: str) -> None
+```
+
+### `detail`
+
+```python
+detail: str
+```
+
+### `kind`
+
+```python
+kind: str
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `CompositionReport`
+
+```python
+CompositionReport(inserted_blocks: int = 0, style_map: Dict[str, str] = dict(), imported_styles: List[str] = list(), renamed_styles: Dict[str, str] = dict(), numbering_map: Dict[int, int] = dict(), media_copied: List[str] = list(), bookmarks_renamed: Dict[str, str] = dict(), findings: List[CompositionFinding] = list(), declared_parts: List[str] = list()) -> None
+```
+
+Everything one composition call did — the declared changed-part
+budget, the reconciliation maps, and what was reported instead of done.
+
+### `bookmarks_renamed`
+
+```python
+bookmarks_renamed: Dict[str, str] = field(default_factory=dict)
+```
+
+### `declared_parts`
+
+```python
+declared_parts: List[str] = field(default_factory=list)
+```
+
+### `findings`
+
+```python
+findings: List[CompositionFinding] = field(default_factory=list)
+```
+
+### `imported_styles`
+
+```python
+imported_styles: List[str] = field(default_factory=list)
+```
+
+### `inserted_blocks`
+
+```python
+inserted_blocks: int = 0
+```
+
+### `media_copied`
+
+```python
+media_copied: List[str] = field(default_factory=list)
+```
+
+### `numbering_map`
+
+```python
+numbering_map: Dict[int, int] = field(default_factory=dict)
+```
+
+### `renamed_styles`
+
+```python
+renamed_styles: Dict[str, str] = field(default_factory=dict)
+```
+
+### `style_map`
+
+```python
+style_map: Dict[str, str] = field(default_factory=dict)
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `append_document`
+
+```python
+append_document(document: 'Document', source: 'Document', *, section: str = 'new_page', styles: str = 'match_by_name', headers: str = 'destination') -> CompositionReport
+```
+
+Append `source`'s whole body to `document`, and return a `CompositionReport`.
+
+Keeps the destination's headers and footers by default and authors no new `w:sectPr`:
+`section="new_page"` prefixes a page break, `"continuous"` appends flush.
+`headers="source"` overwrites the destination's last-section header and footer and flips
+the document-wide even/odd setting. Refuses a protected document and an empty body on
+either side. Also refuses when insertion after the destination's final paragraph,
+table, or block content control would remain inside an open field result.
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `insert_blocks_from`
+
+```python
+insert_blocks_from(document: 'Document', source: 'Document', start_anchor: 'Document', *, anchor: 'Document', end_anchor: 'Document' = None, count: int = 1, styles: str = 'match_by_name', include_start: bool = True, include_end: bool = True) -> CompositionReport
+```
+
+Copy a block range from `source` after `anchor`, and return a `CompositionReport`.
+
+Reconciles styles, numbering, media and bookmarks so the copy keeps its appearance.
+`start_anchor` and `end_anchor` identify SOURCE paragraphs whose containing top-level body
+blocks form the range endpoints. A direct body paragraph or a paragraph in a top-level
+content control can serve as an endpoint; paragraphs in tables, table cells, and text boxes
+cannot. Both endpoints are included by default; setting either inclusion flag false excludes
+that endpoint's block. With no `end_anchor`, `count` blocks are copied beginning at the start
+block or the following block when `include_start=False`. With an `end_anchor`, `count` is
+validated but does not limit the range. `include_end=False` without an end anchor raises
+`ValueError`. Refuses an empty adjusted range, a protected destination, an endpoint that is
+missing, ambiguous, or spans multiple paragraphs, and source content this package cannot
+carry over: revisions, comments, OLE objects, EMF/WMF images. Live source
+endpoints may come from any supported inspection view. A live destination
+must come from ``view="current"``; reacquire a historical destination before
+composing.
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+
+
+
+
+# `docx.controls`
+
+Content-control (structured document tag) surface — the templating
+
+## `Control`
+
+```python
+Control(sdt: '_Element', story: str, document: 'Document') -> None
+```
+
+Live proxy for one content control.
+
+### `alias`
+
+```python
+alias: Optional[str]
+```
+
+### `control_type`
+
+```python
+control_type: str
+```
+
+### `info`
+
+```python
+info() -> ControlInfo
+```
+
+### `is_data_bound`
+
+```python
+is_data_bound: bool
+```
+
+### `set_value`
+
+```python
+set_value(value: 'Union[str, bool, dt.date, dt.datetime]') -> None
+```
+
+Set the control's value, validating fully before mutating anything.
+
+Text and rich-text controls take a string, checkboxes a bool, dropdowns a value from
+their `w:listItem` choices, dates an ISO date. Refuses a protected document, a stale or
+foreign control, a locked or data-bound surface, a picture, group or building-block
+control, a dropdown value outside its choices, and an unsupported date format.
+
+### `showing_placeholder`
+
+```python
+showing_placeholder: bool
+```
+
+### `tag`
+
+```python
+tag: Optional[str]
+```
+
+### `value`
+
+```python
+value: 'Union[str, bool]'
+```
+
+The control's current value (bool for checkboxes, text otherwise).
+
+## `ControlInfo`
+
+```python
+ControlInfo(tag: Optional[str], alias: Optional[str], control_type: str, value: str, story: str, showing_placeholder: bool, is_data_bound: bool, choices: Tuple[str, ...]) -> None
+```
+
+Identity and current state of one content control.
+
+### `alias`
+
+```python
+alias: Optional[str]
+```
+
+### `choices`
+
+```python
+choices: Tuple[str, ...]
+```
+
+### `control_type`
+
+```python
+control_type: str
+```
+
+### `is_data_bound`
+
+```python
+is_data_bound: bool
+```
+
+### `showing_placeholder`
+
+```python
+showing_placeholder: bool
+```
+
+### `story`
+
+```python
+story: str
+```
+
+### `tag`
+
+```python
+tag: Optional[str]
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+### `value`
+
+```python
+value: str
+```
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `get_control`
+
+```python
+get_control(document: 'Document', *, tag: Optional[str] = None, alias: Optional[str] = None) -> Control
+```
+
+The single control matching `tag` and/or `alias`, or a typed refusal.
+
+## `iter_controls`
+
+```python
+iter_controls(document: 'Document') -> 'Iterator[Control]'
+```
+
+Every content control in every story part, document order.
+
+## `list_controls`
+
+```python
+list_controls(document: 'Document') -> Tuple[ControlInfo, ...]
+```
+
+Identity and state of every control (schema-stable via .to_dict()).
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+## `set_control_value`
+
+```python
+set_control_value(document: 'Document', value: 'Union[str, bool, dt.date, dt.datetime]', *, tag: Optional[str] = None, alias: Optional[str] = None) -> None
+```
+
+Set the value of the control that `tag` names.
+
+Refuses when no control carries the tag and when several do, plus every refusal
+`Control.set_value` raises.
+
+
+
+
+
+# `docx.dml.color`
+
+DrawingML objects related to color, ColorFormat being the most prominent.
+
+## `ColorFormat`
+
+```python
+ColorFormat(rPr_parent: RPrParent)
+```
+
+Bases: `ElementProxy`
+
+Provides access to color settings like RGB color, theme color, and luminance adjustments.
+
+### `rgb`
+
+```python
+rgb: RGBColor | None
+```
+
+An `RGBColor` value or `None` if no RGB color is specified.
+
+When `type` is `MSO_COLOR_TYPE.RGB`, the value of this property will always be an
+`RGBColor` value. It may also be an `RGBColor` value if `type` is
+`MSO_COLOR_TYPE.THEME`, as Word writes the current value of a theme color when one is
+assigned. In that case, the RGB value should be interpreted as no more than a good guess
+however, as the theme color takes precedence at rendering time. Its value is `None`
+whenever `type` is either `None` or `MSO_COLOR_TYPE.AUTO`.
+
+Assigning an `RGBColor` value causes `type` to become `MSO_COLOR_TYPE.RGB` and any
+theme color is removed. Assigning `None` causes any color to be removed such that the
+effective color is inherited from the style hierarchy.
+
+### `theme_color`
+
+```python
+theme_color: MSO_THEME_COLOR | None
+```
+
+Member of `MsoThemeColorIndex` or `None` if no theme color is specified.
+
+When `type` is `MSO_COLOR_TYPE.THEME`, the value of this property will always be a
+member of `MsoThemeColorIndex`. When `type` has any other value, the value of
+this property is `None`.
+
+Assigning a member of `MsoThemeColorIndex` causes `type` to become
+`MSO_COLOR_TYPE.THEME`. Any existing RGB value is retained but ignored by Word. Assigning
+`None` causes any color specification to be removed such that the effective color is
+inherited from the style hierarchy.
+
+### `type`
+
+```python
+type: MSO_COLOR_TYPE | None
+```
+
+Read-only.
+
+A member of `MsoColorType`, one of RGB, THEME, or AUTO, corresponding to the way this
+color is defined. Its value is `None` if no color is applied at this level, which causes
+the effective color to be inherited from the style hierarchy.
+
+## `RPrParent`
+
+```python
+RPrParent: TypeAlias = 'CT_R'
+```
+
+
+
+
+
+# `docx.document`
+
+`Document` and closely related objects.
+
+## `Document`
+
+```python
+Document(element: CT_Document, part: DocumentPart)
+```
+
+Bases: `ElementProxy`
+
+WordprocessingML (WML) document.
+
+Not intended to be constructed directly. Use `docx.Document` to open or create
+a document.
+
+### `add_comment`
+
+```python
+add_comment(runs: Run | Sequence[Run], text: str | None = '', author: str = '', initials: str | None = '') -> Comment
+```
+
+Add a comment anchored to `runs`, and return it.
+
+Pass one `Run` or a sequence; only the first and last are used, so handing over
+`paragraph.runs` works. Reach for `Span.comment` instead when the anchor should match
+exact text rather than whole runs. Refuses a protected document, runs belonging to
+another document, and a comments part that is missing or ambiguous.
+
+### `add_heading`
+
+```python
+add_heading(text: str = '', level: int = 1)
+```
+
+Return a heading paragraph newly added to the end of the document.
+
+The heading paragraph will contain `text` and have its paragraph style
+determined by `level`. If `level` is 0, the style is set to `Title`. If `level`
+is 1 (or omitted), `Heading 1` is used. Otherwise the style is set to `Heading
+{level}`. Raises `ValueError` if `level` is outside the range 0-9.
+
+### `add_page_break`
+
+```python
+add_page_break()
+```
+
+Return newly `Paragraph` object containing only a page break.
+
+### `add_paragraph`
+
+```python
+add_paragraph(text: str = '', style: str | ParagraphStyle | None = None) -> Paragraph
+```
+
+Return paragraph newly added to the end of the document.
+
+The paragraph is populated with `text` and having paragraph style `style`.
+
+`text` can contain tab (``\t``) characters, which are converted to the
+appropriate XML form for a tab. `text` can also include newline (``\n``) or
+carriage return (``\r``) characters, each of which is converted to a line
+break.
+
+### `add_picture`
+
+```python
+add_picture(image_path_or_stream: str | IO[bytes], width: int | Length | None = None, height: int | Length | None = None)
+```
+
+Return new picture shape added in its own paragraph at end of the document.
+
+The picture contains the image at `image_path_or_stream`, scaled based on
+`width` and `height`. If neither width nor height is specified, the picture
+appears at its native size. If only one is specified, it is used to compute a
+scaling factor that is then applied to the unspecified dimension, preserving the
+aspect ratio of the image. The native size of the picture is calculated using
+the dots-per-inch (dpi) value specified in the image file, defaulting to 72 dpi
+if no value is specified, as is often the case.
+
+### `add_section`
+
+```python
+add_section(start_type: WD_SECTION = WD_SECTION.NEW_PAGE)
+```
+
+Return a `Section` object newly added at the end of the document.
+
+The optional `start_type` argument must be a member of the `WdSectionStart`
+enumeration, and defaults to ``WD_SECTION.NEW_PAGE`` if not provided.
+
+### `add_table`
+
+```python
+add_table(rows: int, cols: int, style: str | _TableStyle | None = None)
+```
+
+Add a table having row and column counts of `rows` and `cols` respectively.
+
+`style` may be a table style object or a table style name. If `style` is `None`,
+the table inherits the default table style of the document.
+
+### `comments`
+
+```python
+comments: Comments
+```
+
+A `Comments` object providing access to comments added to the document.
+
+### `core_properties`
+
+```python
+core_properties
+```
+
+A `CoreProperties` object providing Dublin Core properties of document.
+
+### `inline_shapes`
+
+```python
+inline_shapes
+```
+
+The `InlineShapes` collection for this document.
+
+An inline shape is a graphical object, such as a picture, contained in a run of
+text and behaving like a character glyph, being flowed like other text in a
+paragraph.
+
+### `iter_inner_content`
+
+```python
+iter_inner_content() -> Iterator[Paragraph | Table]
+```
+
+Generate each `Paragraph` or `Table` in this document in document order.
+
+### `paragraphs`
+
+```python
+paragraphs: List[Paragraph]
+```
+
+The `Paragraph` instances in the document, in document order.
+
+Note that paragraphs within revision marks such as ```` or ```` do
+not appear in this list.
+
+### `part`
+
+```python
+part: DocumentPart
+```
+
+The `DocumentPart` object of this document.
+
+### `revisions`
+
+```python
+revisions
+```
+
+`Revisions` object enumerating tracked changes across all story parts.
+
+paper-docx addition: a fresh snapshot on each access; supports
+accept/reject of all revisions or filtered by author. See
+`docx.revision`.
+
+### `save`
+
+```python
+save(path_or_stream: str | IO[bytes])
+```
+
+Save this document to `path_or_stream`.
+
+`path_or_stream` can be either a path to a filesystem location (a string) or a
+file-like object.
+
+### `sections`
+
+```python
+sections: Sections
+```
+
+`Sections` object providing access to each section in this document.
+
+### `settings`
+
+```python
+settings: Settings
+```
+
+A `Settings` object providing access to the document-level settings.
+
+### `styles`
+
+```python
+styles
+```
+
+A `Styles` object providing access to the styles in this document.
+
+### `tables`
+
+```python
+tables: List[Table]
+```
+
+All `Table` instances in the document, in document order.
+
+Note that only tables appearing at the top level of the document appear in this
+list; a table nested inside a table cell does not appear. A table within
+revision marks such as ```` or ```` will also not appear in the
+list.
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+
+
+
+
+# `docx.drawing`
+
+DrawingML-related objects are in this subpackage.
+
+## `Drawing`
+
+```python
+Drawing(drawing: CT_Drawing, parent: t.ProvidesStoryPart)
+```
+
+Bases: `Parented`
+
+Container for a DrawingML object.
+
+### `has_picture`
+
+```python
+has_picture: bool
+```
+
+True when `drawing` contains an embedded picture.
+
+A drawing can contain a picture, but it can also contain a chart, SmartArt, or a
+drawing canvas. Methods related to a picture, like `.image`, will raise when the drawing
+does not contain a picture. Use this value to determine whether image methods will succeed.
+
+This value is `False` when a linked picture is present. This should be relatively rare and
+the image would only be retrievable from the filesystem.
+
+Note this does not distinguish between inline and floating images. The presence of either
+one will cause this value to be `True`.
+
+### `image`
+
+```python
+image: Image
+```
+
+An `Image` proxy object for the image in this (picture) drawing.
+
+Raises `ValueError` when this drawing does contains something other than a picture. Use
+`.has_picture` to qualify drawing objects before using this property.
+
+### `replace_picture`
+
+```python
+replace_picture(image_descriptor: str | IO[bytes]) -> None
+```
+
+Swap this drawing's image bytes, keeping display size and position.
+
+Always writes a new image part, so other shapes sharing the old part are unchanged;
+the old relationship stays behind. Refuses a drawing with no picture, a linked picture
+whose bytes live outside the package, and a protected document.
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+
+
+
+
+# `docx.enum.base`
+
+Base classes and other objects used by enumerations.
+
+## `BaseEnum`
+
+Bases: `int`, `Enum`
+
+Base class for Enums that do not map XML attr values.
+
+The enum's value will be an integer, corresponding to the integer assigned the
+corresponding member in the MS API enum of the same name.
+
+## `BaseXmlEnum`
+
+Bases: `int`, `Enum`
+
+Base class for Enums that also map XML attr values.
+
+The enum's value will be an integer, corresponding to the integer assigned the
+corresponding member in the MS API enum of the same name.
+
+### `from_xml`
+
+```python
+from_xml(xml_value: str | None) -> Self
+```
+
+Enumeration member corresponding to XML attribute value `xml_value`.
+
+Example::
+
+ >>> WD_PARAGRAPH_ALIGNMENT.from_xml("center")
+ WD_PARAGRAPH_ALIGNMENT.CENTER
+
+### `to_xml`
+
+```python
+to_xml(value: int | _T | None) -> str | None
+```
+
+XML value of this enum member, generally an XML attribute value.
+
+### `xml_value`
+
+```python
+xml_value: str | None
+```
+
+## `DocsPageFormatter`
+
+```python
+DocsPageFormatter(clsname: str, clsdict: Dict[str, Any])
+```
+
+Generate an .rst doc page for an enumeration.
+
+Formats a RestructuredText documention page (string) for the enumeration class parts
+passed to the constructor. An immutable one-shot service object.
+
+### `page_str`
+
+```python
+page_str
+```
+
+The RestructuredText documentation page for the enumeration.
+
+This is the only API member for the class.
+
+
+
+
+
+# `docx.enum.dml`
+
+Enumerations used by DrawingML objects.
+
+## `MSO_COLOR_TYPE`
+
+Bases: `BaseEnum`
+
+Specifies the color specification scheme.
+
+Example::
+
+ from docx.enum.dml import MSO_COLOR_TYPE
+
+ assert font.color.type == MSO_COLOR_TYPE.SCHEME
+
+MS API name: `MsoColorType`
+
+http://msdn.microsoft.com/en-us/library/office/ff864912(v=office.15).aspx
+
+### `AUTO`
+
+```python
+AUTO = (101, 'Color is determined automatically by the application.')
+```
+
+Color is determined automatically by the application.
+
+### `RGB`
+
+```python
+RGB = (1, 'Color is specified by an `RGBColor` value.')
+```
+
+Color is specified by an `RGBColor` value.
+
+### `THEME`
+
+```python
+THEME = (2, 'Color is one of the preset theme colors.')
+```
+
+Color is one of the preset theme colors.
+
+## `MSO_THEME_COLOR`
+
+```python
+MSO_THEME_COLOR = MSO_THEME_COLOR_INDEX
+```
+
+## `MSO_THEME_COLOR_INDEX`
+
+Bases: `BaseXmlEnum`
+
+Indicates the Office theme color, one of those shown in the color gallery on the
+formatting ribbon.
+
+Alias: ``MSO_THEME_COLOR``
+
+Example::
+
+ from docx.enum.dml import MSO_THEME_COLOR
+
+ font.color.theme_color = MSO_THEME_COLOR.ACCENT_1
+
+MS API name: `MsoThemeColorIndex`
+
+http://msdn.microsoft.com/en-us/library/office/ff860782(v=office.15).aspx
+
+### `ACCENT_1`
+
+```python
+ACCENT_1 = (5, 'accent1', 'Specifies the Accent 1 theme color.')
+```
+
+Specifies the Accent 1 theme color.
+
+### `ACCENT_2`
+
+```python
+ACCENT_2 = (6, 'accent2', 'Specifies the Accent 2 theme color.')
+```
+
+Specifies the Accent 2 theme color.
+
+### `ACCENT_3`
+
+```python
+ACCENT_3 = (7, 'accent3', 'Specifies the Accent 3 theme color.')
+```
+
+Specifies the Accent 3 theme color.
+
+### `ACCENT_4`
+
+```python
+ACCENT_4 = (8, 'accent4', 'Specifies the Accent 4 theme color.')
+```
+
+Specifies the Accent 4 theme color.
+
+### `ACCENT_5`
+
+```python
+ACCENT_5 = (9, 'accent5', 'Specifies the Accent 5 theme color.')
+```
+
+Specifies the Accent 5 theme color.
+
+### `ACCENT_6`
+
+```python
+ACCENT_6 = (10, 'accent6', 'Specifies the Accent 6 theme color.')
+```
+
+Specifies the Accent 6 theme color.
+
+### `BACKGROUND_1`
+
+```python
+BACKGROUND_1 = (14, 'background1', 'Specifies the Background 1 theme color.')
+```
+
+Specifies the Background 1 theme color.
+
+### `BACKGROUND_2`
+
+```python
+BACKGROUND_2 = (16, 'background2', 'Specifies the Background 2 theme color.')
+```
+
+Specifies the Background 2 theme color.
+
+### `DARK_1`
+
+```python
+DARK_1 = (1, 'dark1', 'Specifies the Dark 1 theme color.')
+```
+
+Specifies the Dark 1 theme color.
+
+### `DARK_2`
+
+```python
+DARK_2 = (3, 'dark2', 'Specifies the Dark 2 theme color.')
+```
+
+Specifies the Dark 2 theme color.
+
+### `FOLLOWED_HYPERLINK`
+
+```python
+FOLLOWED_HYPERLINK = (12, 'followedHyperlink', 'Specifies the theme color for a clicked hyperlink.')
+```
+
+Specifies the theme color for a clicked hyperlink.
+
+### `HYPERLINK`
+
+```python
+HYPERLINK = (11, 'hyperlink', 'Specifies the theme color for a hyperlink.')
+```
+
+Specifies the theme color for a hyperlink.
+
+### `LIGHT_1`
+
+```python
+LIGHT_1 = (2, 'light1', 'Specifies the Light 1 theme color.')
+```
+
+Specifies the Light 1 theme color.
+
+### `LIGHT_2`
+
+```python
+LIGHT_2 = (4, 'light2', 'Specifies the Light 2 theme color.')
+```
+
+Specifies the Light 2 theme color.
+
+### `NOT_THEME_COLOR`
+
+```python
+NOT_THEME_COLOR = (0, 'UNMAPPED', 'Indicates the color is not a theme color.')
+```
+
+Indicates the color is not a theme color.
+
+### `TEXT_1`
+
+```python
+TEXT_1 = (13, 'text1', 'Specifies the Text 1 theme color.')
+```
+
+Specifies the Text 1 theme color.
+
+### `TEXT_2`
+
+```python
+TEXT_2 = (15, 'text2', 'Specifies the Text 2 theme color.')
+```
+
+Specifies the Text 2 theme color.
+
+
+
+
+
+# `docx.enum.section`
+
+Enumerations related to the main document in WordprocessingML files.
+
+## `WD_HEADER_FOOTER`
+
+```python
+WD_HEADER_FOOTER = WD_HEADER_FOOTER_INDEX
+```
+
+## `WD_HEADER_FOOTER_INDEX`
+
+Bases: `BaseXmlEnum`
+
+Alias: **WD_HEADER_FOOTER**
+
+Specifies one of the three possible header/footer definitions for a section.
+
+For internal use only; not part of the python-docx API.
+
+MS API name: `WdHeaderFooterIndex`
+URL: https://docs.microsoft.com/en-us/office/vba/api/word.wdheaderfooterindex
+
+### `EVEN_PAGE`
+
+```python
+EVEN_PAGE = (3, 'even', 'Header for even pages of recto/verso section.')
+```
+
+Header for even pages of recto/verso section.
+
+### `FIRST_PAGE`
+
+```python
+FIRST_PAGE = (2, 'first', 'Header for first page of section.')
+```
+
+Header for first page of section.
+
+### `PRIMARY`
+
+```python
+PRIMARY = (1, 'default', 'Header for odd pages or all if no even header.')
+```
+
+Header for odd pages or all if no even header.
+
+## `WD_ORIENT`
+
+```python
+WD_ORIENT = WD_ORIENTATION
+```
+
+## `WD_ORIENTATION`
+
+Bases: `BaseXmlEnum`
+
+Alias: **WD_ORIENT**
+
+Specifies the page layout orientation.
+
+Example::
+
+ from docx.enum.section import WD_ORIENT
+
+ section = document.sections[-1] section.orientation = WD_ORIENT.LANDSCAPE
+
+MS API name: `WdOrientation`
+MS API URL: http://msdn.microsoft.com/en-us/library/office/ff837902.aspx
+
+### `LANDSCAPE`
+
+```python
+LANDSCAPE = (1, 'landscape', 'Landscape orientation.')
+```
+
+Landscape orientation.
+
+### `PORTRAIT`
+
+```python
+PORTRAIT = (0, 'portrait', 'Portrait orientation.')
+```
+
+Portrait orientation.
+
+## `WD_SECTION`
+
+```python
+WD_SECTION = WD_SECTION_START
+```
+
+## `WD_SECTION_START`
+
+Bases: `BaseXmlEnum`
+
+Alias: **WD_SECTION**
+
+Specifies the start type of a section break.
+
+Example::
+
+ from docx.enum.section import WD_SECTION
+
+ section = document.sections[0] section.start_type = WD_SECTION.NEW_PAGE
+
+MS API name: `WdSectionStart`
+MS API URL: http://msdn.microsoft.com/en-us/library/office/ff840975.aspx
+
+### `CONTINUOUS`
+
+```python
+CONTINUOUS = (0, 'continuous', 'Continuous section break.')
+```
+
+Continuous section break.
+
+### `EVEN_PAGE`
+
+```python
+EVEN_PAGE = (3, 'evenPage', 'Even pages section break.')
+```
+
+Even pages section break.
+
+### `NEW_COLUMN`
+
+```python
+NEW_COLUMN = (1, 'nextColumn', 'New column section break.')
+```
+
+New column section break.
+
+### `NEW_PAGE`
+
+```python
+NEW_PAGE = (2, 'nextPage', 'New page section break.')
+```
+
+New page section break.
+
+### `ODD_PAGE`
+
+```python
+ODD_PAGE = (4, 'oddPage', 'Section begins on next odd page.')
+```
+
+Section begins on next odd page.
+
+
+
+
+
+# `docx.enum.shape`
+
+Enumerations related to DrawingML shapes in WordprocessingML files.
+
+## `WD_INLINE_SHAPE`
+
+```python
+WD_INLINE_SHAPE = WD_INLINE_SHAPE_TYPE
+```
+
+## `WD_INLINE_SHAPE_TYPE`
+
+Bases: `Enum`
+
+Corresponds to WdInlineShapeType enumeration.
+
+http://msdn.microsoft.com/en-us/library/office/ff192587.aspx.
+
+### `CHART`
+
+```python
+CHART = 12
+```
+
+### `LINKED_PICTURE`
+
+```python
+LINKED_PICTURE = 4
+```
+
+### `NOT_IMPLEMENTED`
+
+```python
+NOT_IMPLEMENTED = -6
+```
+
+### `PICTURE`
+
+```python
+PICTURE = 3
+```
+
+### `SMART_ART`
+
+```python
+SMART_ART = 15
+```
+
+
+
+
+
+# `docx.enum.style`
+
+Enumerations related to styles.
+
+## `WD_BUILTIN_STYLE`
+
+Bases: `BaseEnum`
+
+Alias: **WD_STYLE**
+
+Specifies a built-in Microsoft Word style.
+
+Example::
+
+ from docx import Document
+ from docx.enum.style import WD_STYLE
+
+ document = Document()
+ styles = document.styles
+ style = styles[WD_STYLE.BODY_TEXT]
+
+
+MS API name: `WdBuiltinStyle`
+
+http://msdn.microsoft.com/en-us/library/office/ff835210.aspx
+
+### `BLOCK_QUOTATION`
+
+```python
+BLOCK_QUOTATION = (-85, 'Block Text.')
+```
+
+Block Text.
+
+### `BODY_TEXT`
+
+```python
+BODY_TEXT = (-67, 'Body Text.')
+```
+
+Body Text.
+
+### `BODY_TEXT_2`
+
+```python
+BODY_TEXT_2 = (-81, 'Body Text 2.')
+```
+
+Body Text 2.
+
+### `BODY_TEXT_3`
+
+```python
+BODY_TEXT_3 = (-82, 'Body Text 3.')
+```
+
+Body Text 3.
+
+### `BODY_TEXT_FIRST_INDENT`
+
+```python
+BODY_TEXT_FIRST_INDENT = (-78, 'Body Text First Indent.')
+```
+
+Body Text First Indent.
+
+### `BODY_TEXT_FIRST_INDENT_2`
+
+```python
+BODY_TEXT_FIRST_INDENT_2 = (-79, 'Body Text First Indent 2.')
+```
+
+Body Text First Indent 2.
+
+### `BODY_TEXT_INDENT`
+
+```python
+BODY_TEXT_INDENT = (-68, 'Body Text Indent.')
+```
+
+Body Text Indent.
+
+### `BODY_TEXT_INDENT_2`
+
+```python
+BODY_TEXT_INDENT_2 = (-83, 'Body Text Indent 2.')
+```
+
+Body Text Indent 2.
+
+### `BODY_TEXT_INDENT_3`
+
+```python
+BODY_TEXT_INDENT_3 = (-84, 'Body Text Indent 3.')
+```
+
+Body Text Indent 3.
+
+### `BOOK_TITLE`
+
+```python
+BOOK_TITLE = (-265, 'Book Title.')
+```
+
+Book Title.
+
+### `CAPTION`
+
+```python
+CAPTION = (-35, 'Caption.')
+```
+
+Caption.
+
+### `CLOSING`
+
+```python
+CLOSING = (-64, 'Closing.')
+```
+
+Closing.
+
+### `COMMENT_REFERENCE`
+
+```python
+COMMENT_REFERENCE = (-40, 'Comment Reference.')
+```
+
+Comment Reference.
+
+### `COMMENT_TEXT`
+
+```python
+COMMENT_TEXT = (-31, 'Comment Text.')
+```
+
+Comment Text.
+
+### `DATE`
+
+```python
+DATE = (-77, 'Date.')
+```
+
+Date.
+
+### `DEFAULT_PARAGRAPH_FONT`
+
+```python
+DEFAULT_PARAGRAPH_FONT = (-66, 'Default Paragraph Font.')
+```
+
+Default Paragraph Font.
+
+### `EMPHASIS`
+
+```python
+EMPHASIS = (-89, 'Emphasis.')
+```
+
+Emphasis.
+
+### `ENDNOTE_REFERENCE`
+
+```python
+ENDNOTE_REFERENCE = (-43, 'Endnote Reference.')
+```
+
+Endnote Reference.
+
+### `ENDNOTE_TEXT`
+
+```python
+ENDNOTE_TEXT = (-44, 'Endnote Text.')
+```
+
+Endnote Text.
+
+### `ENVELOPE_ADDRESS`
+
+```python
+ENVELOPE_ADDRESS = (-37, 'Envelope Address.')
+```
+
+Envelope Address.
+
+### `ENVELOPE_RETURN`
+
+```python
+ENVELOPE_RETURN = (-38, 'Envelope Return.')
+```
+
+Envelope Return.
+
+### `FOOTER`
+
+```python
+FOOTER = (-33, 'Footer.')
+```
+
+Footer.
+
+### `FOOTNOTE_REFERENCE`
+
+```python
+FOOTNOTE_REFERENCE = (-39, 'Footnote Reference.')
+```
+
+Footnote Reference.
+
+### `FOOTNOTE_TEXT`
+
+```python
+FOOTNOTE_TEXT = (-30, 'Footnote Text.')
+```
+
+Footnote Text.
+
+### `HEADER`
+
+```python
+HEADER = (-32, 'Header.')
+```
+
+Header.
+
+### `HEADING_1`
+
+```python
+HEADING_1 = (-2, 'Heading 1.')
+```
+
+Heading 1.
+
+### `HEADING_2`
+
+```python
+HEADING_2 = (-3, 'Heading 2.')
+```
+
+Heading 2.
+
+### `HEADING_3`
+
+```python
+HEADING_3 = (-4, 'Heading 3.')
+```
+
+Heading 3.
+
+### `HEADING_4`
+
+```python
+HEADING_4 = (-5, 'Heading 4.')
+```
+
+Heading 4.
+
+### `HEADING_5`
+
+```python
+HEADING_5 = (-6, 'Heading 5.')
+```
+
+Heading 5.
+
+### `HEADING_6`
+
+```python
+HEADING_6 = (-7, 'Heading 6.')
+```
+
+Heading 6.
+
+### `HEADING_7`
+
+```python
+HEADING_7 = (-8, 'Heading 7.')
+```
+
+Heading 7.
+
+### `HEADING_8`
+
+```python
+HEADING_8 = (-9, 'Heading 8.')
+```
+
+Heading 8.
+
+### `HEADING_9`
+
+```python
+HEADING_9 = (-10, 'Heading 9.')
+```
+
+Heading 9.
+
+### `HTML_ACRONYM`
+
+```python
+HTML_ACRONYM = (-96, 'HTML Acronym.')
+```
+
+HTML Acronym.
+
+### `HTML_ADDRESS`
+
+```python
+HTML_ADDRESS = (-97, 'HTML Address.')
+```
+
+HTML Address.
+
+### `HTML_CITE`
+
+```python
+HTML_CITE = (-98, 'HTML Cite.')
+```
+
+HTML Cite.
+
+### `HTML_CODE`
+
+```python
+HTML_CODE = (-99, 'HTML Code.')
+```
+
+HTML Code.
+
+### `HTML_DFN`
+
+```python
+HTML_DFN = (-100, 'HTML Definition.')
+```
+
+HTML Definition.
+
+### `HTML_KBD`
+
+```python
+HTML_KBD = (-101, 'HTML Keyboard.')
+```
+
+HTML Keyboard.
+
+### `HTML_NORMAL`
+
+```python
+HTML_NORMAL = (-95, 'Normal (Web).')
+```
+
+Normal (Web).
+
+### `HTML_PRE`
+
+```python
+HTML_PRE = (-102, 'HTML Preformatted.')
+```
+
+HTML Preformatted.
+
+### `HTML_SAMP`
+
+```python
+HTML_SAMP = (-103, 'HTML Sample.')
+```
+
+HTML Sample.
+
+### `HTML_TT`
+
+```python
+HTML_TT = (-104, 'HTML Typewriter.')
+```
+
+HTML Typewriter.
+
+### `HTML_VAR`
+
+```python
+HTML_VAR = (-105, 'HTML Variable.')
+```
+
+HTML Variable.
+
+### `HYPERLINK`
+
+```python
+HYPERLINK = (-86, 'Hyperlink.')
+```
+
+Hyperlink.
+
+### `HYPERLINK_FOLLOWED`
+
+```python
+HYPERLINK_FOLLOWED = (-87, 'Followed Hyperlink.')
+```
+
+Followed Hyperlink.
+
+### `INDEX_1`
+
+```python
+INDEX_1 = (-11, 'Index 1.')
+```
+
+Index 1.
+
+### `INDEX_2`
+
+```python
+INDEX_2 = (-12, 'Index 2.')
+```
+
+Index 2.
+
+### `INDEX_3`
+
+```python
+INDEX_3 = (-13, 'Index 3.')
+```
+
+Index 3.
+
+### `INDEX_4`
+
+```python
+INDEX_4 = (-14, 'Index 4.')
+```
+
+Index 4.
+
+### `INDEX_5`
+
+```python
+INDEX_5 = (-15, 'Index 5.')
+```
+
+Index 5.
+
+### `INDEX_6`
+
+```python
+INDEX_6 = (-16, 'Index 6.')
+```
+
+Index 6.
+
+### `INDEX_7`
+
+```python
+INDEX_7 = (-17, 'Index 7.')
+```
+
+Index 7.
+
+### `INDEX_8`
+
+```python
+INDEX_8 = (-18, 'Index 8.')
+```
+
+Index 8.
+
+### `INDEX_9`
+
+```python
+INDEX_9 = (-19, 'Index 9.')
+```
+
+Index 9.
+
+### `INDEX_HEADING`
+
+```python
+INDEX_HEADING = (-34, 'Index Heading')
+```
+
+Index Heading
+
+### `INTENSE_EMPHASIS`
+
+```python
+INTENSE_EMPHASIS = (-262, 'Intense Emphasis.')
+```
+
+Intense Emphasis.
+
+### `INTENSE_QUOTE`
+
+```python
+INTENSE_QUOTE = (-182, 'Intense Quote.')
+```
+
+Intense Quote.
+
+### `INTENSE_REFERENCE`
+
+```python
+INTENSE_REFERENCE = (-264, 'Intense Reference.')
+```
+
+Intense Reference.
+
+### `LINE_NUMBER`
+
+```python
+LINE_NUMBER = (-41, 'Line Number.')
+```
+
+Line Number.
+
+### `LIST`
+
+```python
+LIST = (-48, 'List.')
+```
+
+List.
+
+### `LIST_2`
+
+```python
+LIST_2 = (-51, 'List 2.')
+```
+
+List 2.
+
+### `LIST_3`
+
+```python
+LIST_3 = (-52, 'List 3.')
+```
+
+List 3.
+
+### `LIST_4`
+
+```python
+LIST_4 = (-53, 'List 4.')
+```
+
+List 4.
+
+### `LIST_5`
+
+```python
+LIST_5 = (-54, 'List 5.')
+```
+
+List 5.
+
+### `LIST_BULLET`
+
+```python
+LIST_BULLET = (-49, 'List Bullet.')
+```
+
+List Bullet.
+
+### `LIST_BULLET_2`
+
+```python
+LIST_BULLET_2 = (-55, 'List Bullet 2.')
+```
+
+List Bullet 2.
+
+### `LIST_BULLET_3`
+
+```python
+LIST_BULLET_3 = (-56, 'List Bullet 3.')
+```
+
+List Bullet 3.
+
+### `LIST_BULLET_4`
+
+```python
+LIST_BULLET_4 = (-57, 'List Bullet 4.')
+```
+
+List Bullet 4.
+
+### `LIST_BULLET_5`
+
+```python
+LIST_BULLET_5 = (-58, 'List Bullet 5.')
+```
+
+List Bullet 5.
+
+### `LIST_CONTINUE`
+
+```python
+LIST_CONTINUE = (-69, 'List Continue.')
+```
+
+List Continue.
+
+### `LIST_CONTINUE_2`
+
+```python
+LIST_CONTINUE_2 = (-70, 'List Continue 2.')
+```
+
+List Continue 2.
+
+### `LIST_CONTINUE_3`
+
+```python
+LIST_CONTINUE_3 = (-71, 'List Continue 3.')
+```
+
+List Continue 3.
+
+### `LIST_CONTINUE_4`
+
+```python
+LIST_CONTINUE_4 = (-72, 'List Continue 4.')
+```
+
+List Continue 4.
+
+### `LIST_CONTINUE_5`
+
+```python
+LIST_CONTINUE_5 = (-73, 'List Continue 5.')
+```
+
+List Continue 5.
+
+### `LIST_NUMBER`
+
+```python
+LIST_NUMBER = (-50, 'List Number.')
+```
+
+List Number.
+
+### `LIST_NUMBER_2`
+
+```python
+LIST_NUMBER_2 = (-59, 'List Number 2.')
+```
+
+List Number 2.
+
+### `LIST_NUMBER_3`
+
+```python
+LIST_NUMBER_3 = (-60, 'List Number 3.')
+```
+
+List Number 3.
+
+### `LIST_NUMBER_4`
+
+```python
+LIST_NUMBER_4 = (-61, 'List Number 4.')
+```
+
+List Number 4.
+
+### `LIST_NUMBER_5`
+
+```python
+LIST_NUMBER_5 = (-62, 'List Number 5.')
+```
+
+List Number 5.
+
+### `LIST_PARAGRAPH`
+
+```python
+LIST_PARAGRAPH = (-180, 'List Paragraph.')
+```
+
+List Paragraph.
+
+### `MACRO_TEXT`
+
+```python
+MACRO_TEXT = (-46, 'Macro Text.')
+```
+
+Macro Text.
+
+### `MESSAGE_HEADER`
+
+```python
+MESSAGE_HEADER = (-74, 'Message Header.')
+```
+
+Message Header.
+
+### `NAV_PANE`
+
+```python
+NAV_PANE = (-90, 'Document Map.')
+```
+
+Document Map.
+
+### `NORMAL`
+
+```python
+NORMAL = (-1, 'Normal.')
+```
+
+Normal.
+
+### `NORMAL_INDENT`
+
+```python
+NORMAL_INDENT = (-29, 'Normal Indent.')
+```
+
+Normal Indent.
+
+### `NORMAL_OBJECT`
+
+```python
+NORMAL_OBJECT = (-158, 'Normal (applied to an object).')
+```
+
+Normal (applied to an object).
+
+### `NORMAL_TABLE`
+
+```python
+NORMAL_TABLE = (-106, 'Normal (applied within a table).')
+```
+
+Normal (applied within a table).
+
+### `NOTE_HEADING`
+
+```python
+NOTE_HEADING = (-80, 'Note Heading.')
+```
+
+Note Heading.
+
+### `PAGE_NUMBER`
+
+```python
+PAGE_NUMBER = (-42, 'Page Number.')
+```
+
+Page Number.
+
+### `PLAIN_TEXT`
+
+```python
+PLAIN_TEXT = (-91, 'Plain Text.')
+```
+
+Plain Text.
+
+### `QUOTE`
+
+```python
+QUOTE = (-181, 'Quote.')
+```
+
+Quote.
+
+### `SALUTATION`
+
+```python
+SALUTATION = (-76, 'Salutation.')
+```
+
+Salutation.
+
+### `SIGNATURE`
+
+```python
+SIGNATURE = (-65, 'Signature.')
+```
+
+Signature.
+
+### `STRONG`
+
+```python
+STRONG = (-88, 'Strong.')
+```
+
+Strong.
+
+### `SUBTITLE`
+
+```python
+SUBTITLE = (-75, 'Subtitle.')
+```
+
+Subtitle.
+
+### `SUBTLE_EMPHASIS`
+
+```python
+SUBTLE_EMPHASIS = (-261, 'Subtle Emphasis.')
+```
+
+Subtle Emphasis.
+
+### `SUBTLE_REFERENCE`
+
+```python
+SUBTLE_REFERENCE = (-263, 'Subtle Reference.')
+```
+
+Subtle Reference.
+
+### `TABLE_COLORFUL_GRID`
+
+```python
+TABLE_COLORFUL_GRID = (-172, 'Colorful Grid.')
+```
+
+Colorful Grid.
+
+### `TABLE_COLORFUL_LIST`
+
+```python
+TABLE_COLORFUL_LIST = (-171, 'Colorful List.')
+```
+
+Colorful List.
+
+### `TABLE_COLORFUL_SHADING`
+
+```python
+TABLE_COLORFUL_SHADING = (-170, 'Colorful Shading.')
+```
+
+Colorful Shading.
+
+### `TABLE_DARK_LIST`
+
+```python
+TABLE_DARK_LIST = (-169, 'Dark List.')
+```
+
+Dark List.
+
+### `TABLE_LIGHT_GRID`
+
+```python
+TABLE_LIGHT_GRID = (-161, 'Light Grid.')
+```
+
+Light Grid.
+
+### `TABLE_LIGHT_GRID_ACCENT_1`
+
+```python
+TABLE_LIGHT_GRID_ACCENT_1 = (-175, 'Light Grid Accent 1.')
+```
+
+Light Grid Accent 1.
+
+### `TABLE_LIGHT_LIST`
+
+```python
+TABLE_LIGHT_LIST = (-160, 'Light List.')
+```
+
+Light List.
+
+### `TABLE_LIGHT_LIST_ACCENT_1`
+
+```python
+TABLE_LIGHT_LIST_ACCENT_1 = (-174, 'Light List Accent 1.')
+```
+
+Light List Accent 1.
+
+### `TABLE_LIGHT_SHADING`
+
+```python
+TABLE_LIGHT_SHADING = (-159, 'Light Shading.')
+```
+
+Light Shading.
+
+### `TABLE_LIGHT_SHADING_ACCENT_1`
+
+```python
+TABLE_LIGHT_SHADING_ACCENT_1 = (-173, 'Light Shading Accent 1.')
+```
+
+Light Shading Accent 1.
+
+### `TABLE_MEDIUM_GRID_1`
+
+```python
+TABLE_MEDIUM_GRID_1 = (-166, 'Medium Grid 1.')
+```
+
+Medium Grid 1.
+
+### `TABLE_MEDIUM_GRID_2`
+
+```python
+TABLE_MEDIUM_GRID_2 = (-167, 'Medium Grid 2.')
+```
+
+Medium Grid 2.
+
+### `TABLE_MEDIUM_GRID_3`
+
+```python
+TABLE_MEDIUM_GRID_3 = (-168, 'Medium Grid 3.')
+```
+
+Medium Grid 3.
+
+### `TABLE_MEDIUM_LIST_1`
+
+```python
+TABLE_MEDIUM_LIST_1 = (-164, 'Medium List 1.')
+```
+
+Medium List 1.
+
+### `TABLE_MEDIUM_LIST_1_ACCENT_1`
+
+```python
+TABLE_MEDIUM_LIST_1_ACCENT_1 = (-178, 'Medium List 1 Accent 1.')
+```
+
+Medium List 1 Accent 1.
+
+### `TABLE_MEDIUM_LIST_2`
+
+```python
+TABLE_MEDIUM_LIST_2 = (-165, 'Medium List 2.')
+```
+
+Medium List 2.
+
+### `TABLE_MEDIUM_SHADING_1`
+
+```python
+TABLE_MEDIUM_SHADING_1 = (-162, 'Medium Shading 1.')
+```
+
+Medium Shading 1.
+
+### `TABLE_MEDIUM_SHADING_1_ACCENT_1`
+
+```python
+TABLE_MEDIUM_SHADING_1_ACCENT_1 = (-176, 'Medium Shading 1 Accent 1.')
+```
+
+Medium Shading 1 Accent 1.
+
+### `TABLE_MEDIUM_SHADING_2`
+
+```python
+TABLE_MEDIUM_SHADING_2 = (-163, 'Medium Shading 2.')
+```
+
+Medium Shading 2.
+
+### `TABLE_MEDIUM_SHADING_2_ACCENT_1`
+
+```python
+TABLE_MEDIUM_SHADING_2_ACCENT_1 = (-177, 'Medium Shading 2 Accent 1.')
+```
+
+Medium Shading 2 Accent 1.
+
+### `TABLE_OF_AUTHORITIES`
+
+```python
+TABLE_OF_AUTHORITIES = (-45, 'Table of Authorities.')
+```
+
+Table of Authorities.
+
+### `TABLE_OF_FIGURES`
+
+```python
+TABLE_OF_FIGURES = (-36, 'Table of Figures.')
+```
+
+Table of Figures.
+
+### `TITLE`
+
+```python
+TITLE = (-63, 'Title.')
+```
+
+Title.
+
+### `TOAHEADING`
+
+```python
+TOAHEADING = (-47, 'TOA Heading.')
+```
+
+TOA Heading.
+
+### `TOC_1`
+
+```python
+TOC_1 = (-20, 'TOC 1.')
+```
+
+TOC 1.
+
+### `TOC_2`
+
+```python
+TOC_2 = (-21, 'TOC 2.')
+```
+
+TOC 2.
+
+### `TOC_3`
+
+```python
+TOC_3 = (-22, 'TOC 3.')
+```
+
+TOC 3.
+
+### `TOC_4`
+
+```python
+TOC_4 = (-23, 'TOC 4.')
+```
+
+TOC 4.
+
+### `TOC_5`
+
+```python
+TOC_5 = (-24, 'TOC 5.')
+```
+
+TOC 5.
+
+### `TOC_6`
+
+```python
+TOC_6 = (-25, 'TOC 6.')
+```
+
+TOC 6.
+
+### `TOC_7`
+
+```python
+TOC_7 = (-26, 'TOC 7.')
+```
+
+TOC 7.
+
+### `TOC_8`
+
+```python
+TOC_8 = (-27, 'TOC 8.')
+```
+
+TOC 8.
+
+### `TOC_9`
+
+```python
+TOC_9 = (-28, 'TOC 9.')
+```
+
+TOC 9.
+
+## `WD_STYLE`
+
+```python
+WD_STYLE = WD_BUILTIN_STYLE
+```
+
+## `WD_STYLE_TYPE`
+
+Bases: `BaseXmlEnum`
+
+Specifies one of the four style types: paragraph, character, list, or table.
+
+Example::
+
+ from docx import Document
+ from docx.enum.style import WD_STYLE_TYPE
+
+ styles = Document().styles
+ assert styles[0].type == WD_STYLE_TYPE.PARAGRAPH
+
+MS API name: `WdStyleType`
+
+http://msdn.microsoft.com/en-us/library/office/ff196870.aspx
+
+### `CHARACTER`
+
+```python
+CHARACTER = (2, 'character', 'Character style.')
+```
+
+Character style.
+
+### `LIST`
+
+```python
+LIST = (4, 'numbering', 'List style.')
+```
+
+List style.
+
+### `PARAGRAPH`
+
+```python
+PARAGRAPH = (1, 'paragraph', 'Paragraph style.')
+```
+
+Paragraph style.
+
+### `TABLE`
+
+```python
+TABLE = (3, 'table', 'Table style.')
+```
+
+Table style.
+
+
+
+
+
+# `docx.enum.table`
+
+Enumerations related to tables in WordprocessingML files.
+
+## `WD_ALIGN_VERTICAL`
+
+```python
+WD_ALIGN_VERTICAL = WD_CELL_VERTICAL_ALIGNMENT
+```
+
+## `WD_CELL_VERTICAL_ALIGNMENT`
+
+Bases: `BaseXmlEnum`
+
+Alias: **WD_ALIGN_VERTICAL**
+
+Specifies the vertical alignment of text in one or more cells of a table.
+
+Example::
+
+ from docx.enum.table import WD_ALIGN_VERTICAL
+
+ table = document.add_table(3, 3)
+ table.cell(0, 0).vertical_alignment = WD_ALIGN_VERTICAL.BOTTOM
+
+MS API name: `WdCellVerticalAlignment`
+
+https://msdn.microsoft.com/en-us/library/office/ff193345.aspx
+
+### `BOTH`
+
+```python
+BOTH = (101, 'both', "This is an option in the OpenXml spec, but not in Word itself. It's not clear what Word behavior this setting produces. If you find out please let us know and we'll update this documentation. Otherwise, probably best to avoid this option.")
+```
+
+This is an option in the OpenXml spec, but not in Word itself.
+
+It's not clear what Word behavior this setting produces. If you find out please let
+us know and we'll update this documentation. Otherwise, probably best to avoid this
+option.
+
+### `BOTTOM`
+
+```python
+BOTTOM = (3, 'bottom', 'Text is aligned to the bottom border of the cell.')
+```
+
+Text is aligned to the bottom border of the cell.
+
+### `CENTER`
+
+```python
+CENTER = (1, 'center', 'Text is aligned to the center of the cell.')
+```
+
+Text is aligned to the center of the cell.
+
+### `TOP`
+
+```python
+TOP = (0, 'top', 'Text is aligned to the top border of the cell.')
+```
+
+Text is aligned to the top border of the cell.
+
+## `WD_ROW_HEIGHT`
+
+```python
+WD_ROW_HEIGHT = WD_ROW_HEIGHT_RULE
+```
+
+## `WD_ROW_HEIGHT_RULE`
+
+Bases: `BaseXmlEnum`
+
+Alias: **WD_ROW_HEIGHT**
+
+Specifies the rule for determining the height of a table row
+
+Example::
+
+ from docx.enum.table import WD_ROW_HEIGHT_RULE
+
+ table = document.add_table(3, 3)
+ table.rows[0].height_rule = WD_ROW_HEIGHT_RULE.EXACTLY
+
+MS API name: `WdRowHeightRule`
+
+https://msdn.microsoft.com/en-us/library/office/ff193620.aspx
+
+### `AT_LEAST`
+
+```python
+AT_LEAST = (1, 'atLeast', 'The row height is at least a minimum specified value.')
+```
+
+The row height is at least a minimum specified value.
+
+### `AUTO`
+
+```python
+AUTO = (0, 'auto', 'The row height is adjusted to accommodate the tallest value in the row.')
+```
+
+The row height is adjusted to accommodate the tallest value in the row.
+
+### `EXACTLY`
+
+```python
+EXACTLY = (2, 'exact', 'The row height is an exact value.')
+```
+
+The row height is an exact value.
+
+## `WD_TABLE_ALIGNMENT`
+
+Bases: `BaseXmlEnum`
+
+Specifies table justification type.
+
+Example::
+
+ from docx.enum.table import WD_TABLE_ALIGNMENT
+
+ table = document.add_table(3, 3)
+ table.alignment = WD_TABLE_ALIGNMENT.CENTER
+
+MS API name: `WdRowAlignment`
+
+http://office.microsoft.com/en-us/word-help/HV080607259.aspx
+
+### `CENTER`
+
+```python
+CENTER = (1, 'center', 'Center-aligned.')
+```
+
+Center-aligned.
+
+### `LEFT`
+
+```python
+LEFT = (0, 'left', 'Left-aligned')
+```
+
+Left-aligned
+
+### `RIGHT`
+
+```python
+RIGHT = (2, 'right', 'Right-aligned.')
+```
+
+Right-aligned.
+
+## `WD_TABLE_DIRECTION`
+
+Bases: `BaseEnum`
+
+Specifies the direction in which an application orders cells in the specified
+table or row.
+
+Example::
+
+ from docx.enum.table import WD_TABLE_DIRECTION
+
+ table = document.add_table(3, 3)
+ table.direction = WD_TABLE_DIRECTION.RTL
+
+MS API name: `WdTableDirection`
+
+http://msdn.microsoft.com/en-us/library/ff835141.aspx
+
+### `LTR`
+
+```python
+LTR = (0, 'The table or row is arranged with the first column in the leftmost position.')
+```
+
+The table or row is arranged with the first column in the leftmost position.
+
+### `RTL`
+
+```python
+RTL = (1, 'The table or row is arranged with the first column in the rightmost position.')
+```
+
+The table or row is arranged with the first column in the rightmost position.
+
+
+
+
+
+# `docx.enum.text`
+
+Enumerations related to text in WordprocessingML files.
+
+## `WD_ALIGN_PARAGRAPH`
+
+```python
+WD_ALIGN_PARAGRAPH = WD_PARAGRAPH_ALIGNMENT
+```
+
+## `WD_BREAK`
+
+```python
+WD_BREAK = WD_BREAK_TYPE
+```
+
+## `WD_BREAK_TYPE`
+
+Bases: `Enum`
+
+Corresponds to WdBreakType enumeration.
+
+http://msdn.microsoft.com/en-us/library/office/ff195905.aspx.
+
+### `COLUMN`
+
+```python
+COLUMN = 8
+```
+
+### `LINE`
+
+```python
+LINE = 6
+```
+
+### `LINE_CLEAR_ALL`
+
+```python
+LINE_CLEAR_ALL = 11
+```
+
+### `LINE_CLEAR_LEFT`
+
+```python
+LINE_CLEAR_LEFT = 9
+```
+
+### `LINE_CLEAR_RIGHT`
+
+```python
+LINE_CLEAR_RIGHT = 10
+```
+
+### `PAGE`
+
+```python
+PAGE = 7
+```
+
+### `SECTION_CONTINUOUS`
+
+```python
+SECTION_CONTINUOUS = 3
+```
+
+### `SECTION_EVEN_PAGE`
+
+```python
+SECTION_EVEN_PAGE = 4
+```
+
+### `SECTION_NEXT_PAGE`
+
+```python
+SECTION_NEXT_PAGE = 2
+```
+
+### `SECTION_ODD_PAGE`
+
+```python
+SECTION_ODD_PAGE = 5
+```
+
+### `TEXT_WRAPPING`
+
+```python
+TEXT_WRAPPING = 11
+```
+
+## `WD_COLOR`
+
+```python
+WD_COLOR = WD_COLOR_INDEX
+```
+
+## `WD_COLOR_INDEX`
+
+Bases: `BaseXmlEnum`
+
+Specifies a standard preset color to apply.
+
+Used for font highlighting and perhaps other applications.
+
+* MS API name: `WdColorIndex`
+* URL: https://msdn.microsoft.com/EN-US/library/office/ff195343.aspx
+
+### `AUTO`
+
+```python
+AUTO = (0, 'default', 'Automatic color. Default; usually black.')
+```
+
+Automatic color. Default; usually black.
+
+### `BLACK`
+
+```python
+BLACK = (1, 'black', 'Black color.')
+```
+
+Black color.
+
+### `BLUE`
+
+```python
+BLUE = (2, 'blue', 'Blue color')
+```
+
+Blue color
+
+### `BRIGHT_GREEN`
+
+```python
+BRIGHT_GREEN = (4, 'green', 'Bright green color.')
+```
+
+Bright green color.
+
+### `DARK_BLUE`
+
+```python
+DARK_BLUE = (9, 'darkBlue', 'Dark blue color.')
+```
+
+Dark blue color.
+
+### `DARK_RED`
+
+```python
+DARK_RED = (13, 'darkRed', 'Dark red color.')
+```
+
+Dark red color.
+
+### `DARK_YELLOW`
+
+```python
+DARK_YELLOW = (14, 'darkYellow', 'Dark yellow color.')
+```
+
+Dark yellow color.
+
+### `GRAY_25`
+
+```python
+GRAY_25 = (16, 'lightGray', '25% shade of gray color.')
+```
+
+25% shade of gray color.
+
+### `GRAY_50`
+
+```python
+GRAY_50 = (15, 'darkGray', '50% shade of gray color.')
+```
+
+50% shade of gray color.
+
+### `GREEN`
+
+```python
+GREEN = (11, 'darkGreen', 'Green color.')
+```
+
+Green color.
+
+### `INHERITED`
+
+```python
+INHERITED = (-1, None, 'Color is inherited from the style hierarchy.')
+```
+
+Color is inherited from the style hierarchy.
+
+### `PINK`
+
+```python
+PINK = (5, 'magenta', 'Pink color.')
+```
+
+Pink color.
+
+### `RED`
+
+```python
+RED = (6, 'red', 'Red color.')
+```
+
+Red color.
+
+### `TEAL`
+
+```python
+TEAL = (10, 'darkCyan', 'Teal color.')
+```
+
+Teal color.
+
+### `TURQUOISE`
+
+```python
+TURQUOISE = (3, 'cyan', 'Turquoise color.')
+```
+
+Turquoise color.
+
+### `VIOLET`
+
+```python
+VIOLET = (12, 'darkMagenta', 'Violet color.')
+```
+
+Violet color.
+
+### `WHITE`
+
+```python
+WHITE = (8, 'white', 'White color.')
+```
+
+White color.
+
+### `YELLOW`
+
+```python
+YELLOW = (7, 'yellow', 'Yellow color.')
+```
+
+Yellow color.
+
+## `WD_LINE_SPACING`
+
+Bases: `BaseXmlEnum`
+
+Specifies a line spacing format to be applied to a paragraph.
+
+Example::
+
+ from docx.enum.text import WD_LINE_SPACING
+
+ paragraph = document.add_paragraph()
+ paragraph.line_spacing_rule = WD_LINE_SPACING.EXACTLY
+
+
+MS API name: `WdLineSpacing`
+
+URL: http://msdn.microsoft.com/en-us/library/office/ff844910.aspx
+
+### `AT_LEAST`
+
+```python
+AT_LEAST = (3, 'atLeast', 'Minimum line spacing is specified amount. Amount is specified separately.')
+```
+
+Minimum line spacing is specified amount. Amount is specified separately.
+
+### `DOUBLE`
+
+```python
+DOUBLE = (2, 'UNMAPPED', 'Double spaced.')
+```
+
+Double spaced.
+
+### `EXACTLY`
+
+```python
+EXACTLY = (4, 'exact', 'Line spacing is exactly specified amount. Amount is specified separately.')
+```
+
+Line spacing is exactly specified amount. Amount is specified separately.
+
+### `MULTIPLE`
+
+```python
+MULTIPLE = (5, 'auto', 'Line spacing is specified as multiple of line heights. Changing font size will change line spacing proportionately.')
+```
+
+Line spacing is specified as multiple of line heights. Changing font size will
+change the line spacing proportionately.
+
+### `ONE_POINT_FIVE`
+
+```python
+ONE_POINT_FIVE = (1, 'UNMAPPED', 'Space-and-a-half line spacing.')
+```
+
+Space-and-a-half line spacing.
+
+### `SINGLE`
+
+```python
+SINGLE = (0, 'UNMAPPED', 'Single spaced (default).')
+```
+
+Single spaced (default).
+
+## `WD_PARAGRAPH_ALIGNMENT`
+
+Bases: `BaseXmlEnum`
+
+Alias: **WD_ALIGN_PARAGRAPH**
+
+Specifies paragraph justification type.
+
+Example::
+
+ from docx.enum.text import WD_ALIGN_PARAGRAPH
+
+ paragraph = document.add_paragraph()
+ paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
+
+### `CENTER`
+
+```python
+CENTER = (1, 'center', 'Center-aligned.')
+```
+
+Center-aligned.
+
+### `DISTRIBUTE`
+
+```python
+DISTRIBUTE = (4, 'distribute', 'Paragraph characters are distributed to fill entire width of paragraph.')
+```
+
+Paragraph characters are distributed to fill entire width of paragraph.
+
+### `JUSTIFY`
+
+```python
+JUSTIFY = (3, 'both', 'Fully justified.')
+```
+
+Fully justified.
+
+### `JUSTIFY_HI`
+
+```python
+JUSTIFY_HI = (7, 'highKashida', 'Justified with a high character compression ratio.')
+```
+
+Justified with a high character compression ratio.
+
+### `JUSTIFY_LOW`
+
+```python
+JUSTIFY_LOW = (8, 'lowKashida', 'Justified with a low character compression ratio.')
+```
+
+Justified with a low character compression ratio.
+
+### `JUSTIFY_MED`
+
+```python
+JUSTIFY_MED = (5, 'mediumKashida', 'Justified with a medium character compression ratio.')
+```
+
+Justified with a medium character compression ratio.
+
+### `LEFT`
+
+```python
+LEFT = (0, 'left', 'Left-aligned')
+```
+
+Left-aligned
+
+### `RIGHT`
+
+```python
+RIGHT = (2, 'right', 'Right-aligned.')
+```
+
+Right-aligned.
+
+### `THAI_JUSTIFY`
+
+```python
+THAI_JUSTIFY = (9, 'thaiDistribute', 'Justified according to Thai formatting layout.')
+```
+
+Justified according to Thai formatting layout.
+
+## `WD_TAB_ALIGNMENT`
+
+Bases: `BaseXmlEnum`
+
+Specifies the tab stop alignment to apply.
+
+MS API name: `WdTabAlignment`
+
+URL: https://msdn.microsoft.com/EN-US/library/office/ff195609.aspx
+
+### `BAR`
+
+```python
+BAR = (4, 'bar', 'Bar-aligned.')
+```
+
+Bar-aligned.
+
+### `CENTER`
+
+```python
+CENTER = (1, 'center', 'Center-aligned.')
+```
+
+Center-aligned.
+
+### `CLEAR`
+
+```python
+CLEAR = (101, 'clear', 'Clear an inherited tab stop.')
+```
+
+Clear an inherited tab stop.
+
+### `DECIMAL`
+
+```python
+DECIMAL = (3, 'decimal', 'Decimal-aligned.')
+```
+
+Decimal-aligned.
+
+### `END`
+
+```python
+END = (102, 'end', 'Right-aligned. (deprecated)')
+```
+
+Right-aligned. (deprecated)
+
+### `LEFT`
+
+```python
+LEFT = (0, 'left', 'Left-aligned.')
+```
+
+Left-aligned.
+
+### `LIST`
+
+```python
+LIST = (6, 'list', 'List-aligned. (deprecated)')
+```
+
+List-aligned. (deprecated)
+
+### `NUM`
+
+```python
+NUM = (103, 'num', 'Left-aligned. (deprecated)')
+```
+
+Left-aligned. (deprecated)
+
+### `RIGHT`
+
+```python
+RIGHT = (2, 'right', 'Right-aligned.')
+```
+
+Right-aligned.
+
+### `START`
+
+```python
+START = (104, 'start', 'Left-aligned. (deprecated)')
+```
+
+Left-aligned. (deprecated)
+
+## `WD_TAB_LEADER`
+
+Bases: `BaseXmlEnum`
+
+Specifies the character to use as the leader with formatted tabs.
+
+MS API name: `WdTabLeader`
+
+URL: https://msdn.microsoft.com/en-us/library/office/ff845050.aspx
+
+### `DASHES`
+
+```python
+DASHES = (2, 'hyphen', 'Dashes.')
+```
+
+Dashes.
+
+### `DOTS`
+
+```python
+DOTS = (1, 'dot', 'Dots.')
+```
+
+Dots.
+
+### `HEAVY`
+
+```python
+HEAVY = (4, 'heavy', 'A heavy line.')
+```
+
+A heavy line.
+
+### `LINES`
+
+```python
+LINES = (3, 'underscore', 'Double lines.')
+```
+
+Double lines.
+
+### `MIDDLE_DOT`
+
+```python
+MIDDLE_DOT = (5, 'middleDot', 'A vertically-centered dot.')
+```
+
+A vertically-centered dot.
+
+### `SPACES`
+
+```python
+SPACES = (0, 'none', 'Spaces. Default.')
+```
+
+Spaces. Default.
+
+## `WD_UNDERLINE`
+
+Bases: `BaseXmlEnum`
+
+Specifies the style of underline applied to a run of characters.
+
+MS API name: `WdUnderline`
+
+URL: http://msdn.microsoft.com/en-us/library/office/ff822388.aspx
+
+### `DASH`
+
+```python
+DASH = (7, 'dash', 'Dashes.')
+```
+
+Dashes.
+
+### `DASH_HEAVY`
+
+```python
+DASH_HEAVY = (23, 'dashedHeavy', 'Heavy dashes.')
+```
+
+Heavy dashes.
+
+### `DASH_LONG`
+
+```python
+DASH_LONG = (39, 'dashLong', 'Long dashes.')
+```
+
+Long dashes.
+
+### `DASH_LONG_HEAVY`
+
+```python
+DASH_LONG_HEAVY = (55, 'dashLongHeavy', 'Long heavy dashes.')
+```
+
+Long heavy dashes.
+
+### `DOTTED`
+
+```python
+DOTTED = (4, 'dotted', 'Dots.')
+```
+
+Dots.
+
+### `DOTTED_HEAVY`
+
+```python
+DOTTED_HEAVY = (20, 'dottedHeavy', 'Heavy dots.')
+```
+
+Heavy dots.
+
+### `DOT_DASH`
+
+```python
+DOT_DASH = (9, 'dotDash', 'Alternating dots and dashes.')
+```
+
+Alternating dots and dashes.
+
+### `DOT_DASH_HEAVY`
+
+```python
+DOT_DASH_HEAVY = (25, 'dashDotHeavy', 'Alternating heavy dots and heavy dashes.')
+```
+
+Alternating heavy dots and heavy dashes.
+
+### `DOT_DOT_DASH`
+
+```python
+DOT_DOT_DASH = (10, 'dotDotDash', 'An alternating dot-dot-dash pattern.')
+```
+
+An alternating dot-dot-dash pattern.
+
+### `DOT_DOT_DASH_HEAVY`
+
+```python
+DOT_DOT_DASH_HEAVY = (26, 'dashDotDotHeavy', 'An alternating heavy dot-dot-dash pattern.')
+```
+
+An alternating heavy dot-dot-dash pattern.
+
+### `DOUBLE`
+
+```python
+DOUBLE = (3, 'double', 'A double line.')
+```
+
+A double line.
+
+### `INHERITED`
+
+```python
+INHERITED = (-1, None, 'Inherit underline setting from containing paragraph.')
+```
+
+Inherit underline setting from containing paragraph.
+
+### `NONE`
+
+```python
+NONE = (0, 'none', 'No underline.\n\nThis setting overrides any inherited underline value, so can be used to remove underline from a run that inherits underlining from its containing paragraph. Note this is not the same as assigning `None` to Run.underline. `None` is a valid assignment value, but causes the run to inherit its underline value. Assigning `WD_UNDERLINE.NONE` causes underlining to be unconditionally turned off.')
+```
+
+No underline.
+
+This setting overrides any inherited underline value, so can be used to remove
+underline from a run that inherits underlining from its containing paragraph. Note
+this is not the same as assigning `None` to Run.underline. `None` is a valid
+assignment value, but causes the run to inherit its underline value. Assigning
+``WD_UNDERLINE.NONE`` causes underlining to be unconditionally turned off.
+
+### `SINGLE`
+
+```python
+SINGLE = (1, 'single', 'A single line.\n\nNote that this setting is write-only in the sense that `True` (rather than `WD_UNDERLINE.SINGLE`) is returned for a run having this setting.')
+```
+
+A single line.
+
+Note that this setting is write-only in the sense that `True`
+(rather than ``WD_UNDERLINE.SINGLE``) is returned for a run having this setting.
+
+### `THICK`
+
+```python
+THICK = (6, 'thick', 'A single thick line.')
+```
+
+A single thick line.
+
+### `WAVY`
+
+```python
+WAVY = (11, 'wave', 'A single wavy line.')
+```
+
+A single wavy line.
+
+### `WAVY_DOUBLE`
+
+```python
+WAVY_DOUBLE = (43, 'wavyDouble', 'A double wavy line.')
+```
+
+A double wavy line.
+
+### `WAVY_HEAVY`
+
+```python
+WAVY_HEAVY = (27, 'wavyHeavy', 'A heavy wavy line.')
+```
+
+A heavy wavy line.
+
+### `WORDS`
+
+```python
+WORDS = (2, 'words', 'Underline individual words only.')
+```
+
+Underline individual words only.
+
+
+
+
+
+# `docx.errors`
+
+Typed refusals for paper-docx safe-editing APIs.
+
+## `AmbiguousTargetError`
+
+Bases: `PaperRefusal`
+
+The target specification matches more than one location.
+
+Supply a more specific exact target: for example a live span or block, a
+narrower story, or an explicit `nth` when supported. To inspect contextual
+ranking without hiding candidates, use `find_text(..., near=...)`.
+
+## `BoundaryViolationError`
+
+Bases: `PaperRefusal`
+
+The operation would cross a structural boundary it must respect.
+
+Examples: a character-level replacement spanning a paragraph boundary or
+entering/leaving a content control; a block operation selecting
+paragraphs that do not share one parent.
+
+## `DocumentProtectedError`
+
+Bases: `PaperRefusal`
+
+The document enforces an editing restriction this operation ignores.
+
+Word honors `w:documentProtection` (read-only, forms-only, comments-only,
+tracked-changes-enforced); silently editing a locked template reports
+false state. Protection is ADVISORY, not security — after reviewing why
+the document is locked, call
+`docx.protection.acknowledge_protection(document)` to proceed. paper-docx
+never strips the protection setting itself.
+
+## `MalformedPackageError`
+
+Bases: `PaperRefusal`
+
+The file is not a package this library can safely read.
+
+Raised for a damaged or inconsistent ZIP envelope, an encrypted or
+unsupported member, a member name that cannot denote one part, and a
+`[Content_Types].xml` or relationship graph that does not describe a
+readable package. Validation runs before any XML is parsed or any output is
+replaced, so this is a safe refusal: nothing was read into the object model
+and nothing on disk was touched.
+
+It does not mean the file is too large. Size and member-count ceilings were
+removed once Word was measured opening documents past all of them.
+
+## `PaperRefusal`
+
+Bases: `Exception`
+
+Base for every safe refusal raised by paper-docx APIs.
+
+A refused operation mutated nothing, in memory or on disk. The message
+states what was found and why it was unsafe to proceed.
+
+## `RelationshipPolicyError`
+
+Bases: `PaperRefusal`
+
+The operation would create or modify a package relationship unsafely.
+
+## `TargetNotFoundError`
+
+Bases: `PaperRefusal`
+
+No location matches the target specification.
+
+Also raised when a previously-valid anchor or span has gone stale — the
+underlying content changed since it was captured.
+
+## `UnsupportedStructureError`
+
+Bases: `PaperRefusal`
+
+The target involves structure this operation does not safely support.
+
+Examples: text inside a tracked deletion or field instruction; a table
+with merged or nested cells; numbering that would require authoring new
+definitions.
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+
+
+
+
+# `docx.exceptions`
+
+Exceptions used with python-docx.
+
+## `InvalidSpanError`
+
+Bases: `PythonDocxError`
+
+Raised when an invalid merge region is specified in a request to merge table
+cells.
+
+## `InvalidXmlError`
+
+Bases: `PythonDocxError`
+
+Raised when invalid XML is encountered, such as on attempt to access a missing
+required child element.
+
+## `PythonDocxError`
+
+Bases: `Exception`
+
+Generic error class.
+
+
+
+
+
+# `docx.fields`
+
+Field authoring — formulas, never values.
+
+## `add_caption`
+
+```python
+add_caption(paragraph: 'Paragraph', *, label: str = 'Figure', description: str = '') -> None
+```
+
+Append a SEQ caption (`Figure 1`, `Table 1`) to `paragraph`.
+
+Writes the field rather than the displayed integer, so Word recomputes the number on
+open. Sets the paragraph style to "Caption" without checking that the style exists.
+Refuses a protected document and an unknown label.
+
+## `add_date_field`
+
+```python
+add_date_field(paragraph: 'Paragraph', *, date_format: Optional[str] = None) -> None
+```
+
+Append a DATE field; `date_format` is Word's \@ picture, for example 'MMMM d, yyyy'.
+
+The result stays a placeholder until a renderer opens the file; this package never
+computes a date into the result. Refuses a protected document.
+
+## `add_page_count_field`
+
+```python
+add_page_count_field(paragraph: 'Paragraph') -> None
+```
+
+Append a NUMPAGES field, typically to a footer paragraph.
+
+Writes the field, not a number, so Word computes the count on open. Refuses a protected
+document.
+
+## `add_page_number_field`
+
+```python
+add_page_number_field(paragraph: 'Paragraph') -> None
+```
+
+Append a PAGE field, typically to a footer paragraph.
+
+Writes the field, not a number, so Word computes the page on open. Refuses a protected
+document.
+
+## `add_reference_field`
+
+```python
+add_reference_field(paragraph: 'Paragraph', *, bookmark: str, kind: str = 'text') -> None
+```
+
+Append a cross-reference to `bookmark`: its text (`kind="text"`), page (`"page"`), or
+paragraph number (`"number"`).
+
+Writes a REF field, so Word recomputes it on open. Refuses a protected document and an
+unknown bookmark name.
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `insert_toc_after`
+
+```python
+insert_toc_after(document: 'Document', anchor: 'Document', *, levels: Tuple[int, int] = (1, 3)) -> None
+```
+
+Insert a TOC field in a new paragraph after `anchor`.
+
+Marked dirty so the renderer builds the real table on open; heading `levels` maps to the
+\o "1-3" switch. Refuses a protected document, and an anchor that is missing, ambiguous
+foreign, or spans more than one paragraph.
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+
+
+
+
+# `docx.formatting`
+
+Effective-format resolver — read-only, provenance-bearing.
+
+## `EffectiveFormat`
+
+```python
+EffectiveFormat(properties: Dict[str, ResolvedValue], unresolved: Tuple[str, ...]) -> None
+```
+
+The resolved property map, plus what is declared unresolvable.
+
+### `properties`
+
+```python
+properties: Dict[str, ResolvedValue]
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+### `unresolved`
+
+```python
+unresolved: Tuple[str, ...]
+```
+
+### `value_of`
+
+```python
+value_of(key: str)
+```
+
+## `ResolvedValue`
+
+```python
+ResolvedValue(value: object, source: str, chain: Tuple[str, ...] = ()) -> None
+```
+
+One property's effective value and where it came from.
+
+`source` is "direct", "character_style:", "paragraph_style:", "doc_defaults",
+"toggle_xor", "agreeing_layers", "mixed", or "none". `chain` holds the contributing
+layers.
+
+### `chain`
+
+```python
+chain: Tuple[str, ...] = ()
+```
+
+### `source`
+
+```python
+source: str
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+### `value`
+
+```python
+value: object
+```
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `format_of`
+
+```python
+format_of(target) -> EffectiveFormat
+```
+
+The effective formatting of a `Run`, `Paragraph` or `Span`.
+
+Read-only and provenance-bearing: each `ResolvedValue` says where its value came from.
+Runs resolve the supported run-property subset; paragraphs resolve alignment and style
+plus the run defaults their style chain implies; spans resolve every run they touch and
+report "mixed" where runs disagree. Raises `TypeError` for anything else.
+
+
+
+
+
+# `docx.image.bmp`
+
+## `Bmp`
+
+Bases: `BaseImageHeader`
+
+Image header parser for BMP images.
+
+### `content_type`
+
+```python
+content_type
+```
+
+MIME content type for this image, unconditionally `image/bmp` for BMP
+images.
+
+### `default_ext`
+
+```python
+default_ext
+```
+
+Default filename extension, always 'bmp' for BMP images.
+
+### `from_stream`
+
+```python
+from_stream(stream)
+```
+
+Return `Bmp` instance having header properties parsed from the BMP image in
+`stream`.
+
+
+
+
+
+# `docx.image.constants`
+
+Constants specific the the image sub-package.
+
+## `JPEG_MARKER_CODE`
+
+JPEG marker codes.
+
+### `APP0`
+
+```python
+APP0 = b'\xe0'
+```
+
+### `APP1`
+
+```python
+APP1 = b'\xe1'
+```
+
+### `APP2`
+
+```python
+APP2 = b'\xe2'
+```
+
+### `APP3`
+
+```python
+APP3 = b'\xe3'
+```
+
+### `APP4`
+
+```python
+APP4 = b'\xe4'
+```
+
+### `APP5`
+
+```python
+APP5 = b'\xe5'
+```
+
+### `APP6`
+
+```python
+APP6 = b'\xe6'
+```
+
+### `APP7`
+
+```python
+APP7 = b'\xe7'
+```
+
+### `APP8`
+
+```python
+APP8 = b'\xe8'
+```
+
+### `APP9`
+
+```python
+APP9 = b'\xe9'
+```
+
+### `APPA`
+
+```python
+APPA = b'\xea'
+```
+
+### `APPB`
+
+```python
+APPB = b'\xeb'
+```
+
+### `APPC`
+
+```python
+APPC = b'\xec'
+```
+
+### `APPD`
+
+```python
+APPD = b'\xed'
+```
+
+### `APPE`
+
+```python
+APPE = b'\xee'
+```
+
+### `APPF`
+
+```python
+APPF = b'\xef'
+```
+
+### `DAC`
+
+```python
+DAC = b'\xcc'
+```
+
+### `DHP`
+
+```python
+DHP = b'\xde'
+```
+
+### `DHT`
+
+```python
+DHT = b'\xc4'
+```
+
+### `DNL`
+
+```python
+DNL = b'\xdc'
+```
+
+### `DQT`
+
+```python
+DQT = b'\xdb'
+```
+
+### `DRI`
+
+```python
+DRI = b'\xdd'
+```
+
+### `EOI`
+
+```python
+EOI = b'\xd9'
+```
+
+### `EXP`
+
+```python
+EXP = b'\xdf'
+```
+
+### `JPG`
+
+```python
+JPG = b'\xc8'
+```
+
+### `RST0`
+
+```python
+RST0 = b'\xd0'
+```
+
+### `RST1`
+
+```python
+RST1 = b'\xd1'
+```
+
+### `RST2`
+
+```python
+RST2 = b'\xd2'
+```
+
+### `RST3`
+
+```python
+RST3 = b'\xd3'
+```
+
+### `RST4`
+
+```python
+RST4 = b'\xd4'
+```
+
+### `RST5`
+
+```python
+RST5 = b'\xd5'
+```
+
+### `RST6`
+
+```python
+RST6 = b'\xd6'
+```
+
+### `RST7`
+
+```python
+RST7 = b'\xd7'
+```
+
+### `SOF0`
+
+```python
+SOF0 = b'\xc0'
+```
+
+### `SOF1`
+
+```python
+SOF1 = b'\xc1'
+```
+
+### `SOF2`
+
+```python
+SOF2 = b'\xc2'
+```
+
+### `SOF3`
+
+```python
+SOF3 = b'\xc3'
+```
+
+### `SOF5`
+
+```python
+SOF5 = b'\xc5'
+```
+
+### `SOF6`
+
+```python
+SOF6 = b'\xc6'
+```
+
+### `SOF7`
+
+```python
+SOF7 = b'\xc7'
+```
+
+### `SOF9`
+
+```python
+SOF9 = b'\xc9'
+```
+
+### `SOFA`
+
+```python
+SOFA = b'\xca'
+```
+
+### `SOFB`
+
+```python
+SOFB = b'\xcb'
+```
+
+### `SOFD`
+
+```python
+SOFD = b'\xcd'
+```
+
+### `SOFE`
+
+```python
+SOFE = b'\xce'
+```
+
+### `SOFF`
+
+```python
+SOFF = b'\xcf'
+```
+
+### `SOF_MARKER_CODES`
+
+```python
+SOF_MARKER_CODES = (SOF0, SOF1, SOF2, SOF3, SOF5, SOF6, SOF7, SOF9, SOFA, SOFB, SOFD, SOFE, SOFF)
+```
+
+### `SOI`
+
+```python
+SOI = b'\xd8'
+```
+
+### `SOS`
+
+```python
+SOS = b'\xda'
+```
+
+### `STANDALONE_MARKERS`
+
+```python
+STANDALONE_MARKERS = (TEM, SOI, EOI, RST0, RST1, RST2, RST3, RST4, RST5, RST6, RST7)
+```
+
+### `TEM`
+
+```python
+TEM = b'\x01'
+```
+
+### `is_standalone`
+
+```python
+is_standalone(marker_code)
+```
+
+### `marker_names`
+
+```python
+marker_names = {b'\x00': 'UNKNOWN', b'\xc0': 'SOF0', b'\xc2': 'SOF2', b'\xc4': 'DHT', b'\xda': 'SOS', b'\xd8': 'SOI', b'\xd9': 'EOI', b'\xdb': 'DQT', b'\xe0': 'APP0', b'\xe1': 'APP1', b'\xe2': 'APP2', b'\xed': 'APP13', b'\xee': 'APP14'}
+```
+
+## `MIME_TYPE`
+
+Image content types.
+
+### `BMP`
+
+```python
+BMP = 'image/bmp'
+```
+
+### `GIF`
+
+```python
+GIF = 'image/gif'
+```
+
+### `JPEG`
+
+```python
+JPEG = 'image/jpeg'
+```
+
+### `PNG`
+
+```python
+PNG = 'image/png'
+```
+
+### `TIFF`
+
+```python
+TIFF = 'image/tiff'
+```
+
+## `PNG_CHUNK_TYPE`
+
+PNG chunk type names.
+
+### `IEND`
+
+```python
+IEND = 'IEND'
+```
+
+### `IHDR`
+
+```python
+IHDR = 'IHDR'
+```
+
+### `pHYs`
+
+```python
+pHYs = 'pHYs'
+```
+
+## `TIFF_FLD`
+
+```python
+TIFF_FLD = TIFF_FLD_TYPE
+```
+
+## `TIFF_FLD_TYPE`
+
+Tag codes for TIFF Image File Directory (IFD) entries.
+
+### `ASCII`
+
+```python
+ASCII = 2
+```
+
+### `BYTE`
+
+```python
+BYTE = 1
+```
+
+### `LONG`
+
+```python
+LONG = 4
+```
+
+### `RATIONAL`
+
+```python
+RATIONAL = 5
+```
+
+### `SHORT`
+
+```python
+SHORT = 3
+```
+
+### `field_type_names`
+
+```python
+field_type_names = {1: 'BYTE', 2: 'ASCII char', 3: 'SHORT', 4: 'LONG', 5: 'RATIONAL'}
+```
+
+## `TIFF_TAG`
+
+Tag codes for TIFF Image File Directory (IFD) entries.
+
+### `IMAGE_LENGTH`
+
+```python
+IMAGE_LENGTH = 257
+```
+
+### `IMAGE_WIDTH`
+
+```python
+IMAGE_WIDTH = 256
+```
+
+### `RESOLUTION_UNIT`
+
+```python
+RESOLUTION_UNIT = 296
+```
+
+### `X_RESOLUTION`
+
+```python
+X_RESOLUTION = 282
+```
+
+### `Y_RESOLUTION`
+
+```python
+Y_RESOLUTION = 283
+```
+
+### `tag_names`
+
+```python
+tag_names = {254: 'NewSubfileType', 256: 'ImageWidth', 257: 'ImageLength', 258: 'BitsPerSample', 259: 'Compression', 262: 'PhotometricInterpretation', 270: 'ImageDescription', 271: 'Make', 272: 'Model', 273: 'StripOffsets', 274: 'Orientation', 277: 'SamplesPerPixel', 279: 'StripByteCounts', 282: 'XResolution', 283: 'YResolution', 284: 'PlanarConfiguration', 296: 'ResolutionUnit', 305: 'Software', 306: 'DateTime', 531: 'YCbCrPositioning', 34665: 'ExifTag', 34853: 'GPS IFD', 50341: 'PrintImageMatching'}
+```
+
+
+
+
+
+# `docx.image.exceptions`
+
+Exceptions specific the the image sub-package.
+
+## `InvalidImageStreamError`
+
+Bases: `Exception`
+
+The recognized image stream appears to be corrupted.
+
+## `UnexpectedEndOfFileError`
+
+Bases: `Exception`
+
+EOF was unexpectedly encountered while reading an image stream.
+
+## `UnrecognizedImageError`
+
+Bases: `Exception`
+
+The provided image stream could not be recognized.
+
+
+
+
+
+# `docx.image.gif`
+
+## `Gif`
+
+Bases: `BaseImageHeader`
+
+Image header parser for GIF images.
+
+Note that the GIF format does not support resolution (DPI) information. Both
+horizontal and vertical DPI default to 72.
+
+### `content_type`
+
+```python
+content_type
+```
+
+MIME content type for this image, unconditionally `image/gif` for GIF
+images.
+
+### `default_ext`
+
+```python
+default_ext
+```
+
+Default filename extension, always 'gif' for GIF images.
+
+### `from_stream`
+
+```python
+from_stream(stream)
+```
+
+Return `Gif` instance having header properties parsed from GIF image in
+`stream`.
+
+
+
+
+
+# `docx.image.helpers`
+
+## `BIG_ENDIAN`
+
+```python
+BIG_ENDIAN = '>'
+```
+
+## `LITTLE_ENDIAN`
+
+```python
+LITTLE_ENDIAN = '<'
+```
+
+## `StreamReader`
+
+```python
+StreamReader(stream, byte_order, base_offset = 0)
+```
+
+Wraps a file-like object to provide access to structured data from a binary file.
+
+Byte-order is configurable. `base_offset` is added to any base value provided to
+calculate actual location for reads.
+
+### `read`
+
+```python
+read(count)
+```
+
+Allow pass-through read() call.
+
+### `read_byte`
+
+```python
+read_byte(base, offset = 0)
+```
+
+Return the int value of the byte at the file position defined by
+self._base_offset + `base` + `offset`.
+
+If `base` is None, the byte is read from the current position in the stream.
+
+### `read_long`
+
+```python
+read_long(base, offset = 0)
+```
+
+Return the int value of the four bytes at the file position defined by
+self._base_offset + `base` + `offset`.
+
+If `base` is None, the long is read from the current position in the stream. The
+endian setting of this instance is used to interpret the byte layout of the
+long.
+
+### `read_short`
+
+```python
+read_short(base, offset = 0)
+```
+
+Return the int value of the two bytes at the file position determined by
+`base` and `offset`, similarly to ``read_long()`` above.
+
+### `read_str`
+
+```python
+read_str(char_count, base, offset = 0)
+```
+
+Return a string containing the `char_count` bytes at the file position
+determined by self._base_offset + `base` + `offset`.
+
+### `seek`
+
+```python
+seek(base, offset = 0)
+```
+
+### `tell`
+
+```python
+tell()
+```
+
+Allow pass-through tell() call.
+
+
+
+
+
+# `docx.image.image`
+
+Provides objects that can characterize image streams.
+
+## `BaseImageHeader`
+
+```python
+BaseImageHeader(px_width: int, px_height: int, horz_dpi: int, vert_dpi: int)
+```
+
+Base class for image header subclasses like `Jpeg` and `Tiff`.
+
+### `content_type`
+
+```python
+content_type: str
+```
+
+Abstract property definition, must be implemented by all subclasses.
+
+### `default_ext`
+
+```python
+default_ext: str
+```
+
+Default filename extension for images of this type.
+
+An abstract property definition, must be implemented by all subclasses.
+
+### `horz_dpi`
+
+```python
+horz_dpi
+```
+
+Integer dots per inch for the width of this image.
+
+Defaults to 72 when not present in the file, as is often the case.
+
+### `px_height`
+
+```python
+px_height
+```
+
+The vertical pixel dimension of the image.
+
+### `px_width`
+
+```python
+px_width
+```
+
+The horizontal pixel dimension of the image.
+
+### `vert_dpi`
+
+```python
+vert_dpi
+```
+
+Integer dots per inch for the height of this image.
+
+Defaults to 72 when not present in the file, as is often the case.
+
+## `Image`
+
+```python
+Image(blob: bytes, filename: str, image_header: BaseImageHeader)
+```
+
+Graphical image stream such as JPEG, PNG, or GIF with properties and methods
+required by ImagePart.
+
+### `blob`
+
+```python
+blob
+```
+
+The bytes of the image 'file'.
+
+### `content_type`
+
+```python
+content_type: str
+```
+
+MIME content type for this image, e.g. ``'image/jpeg'`` for a JPEG image.
+
+### `ext`
+
+```python
+ext()
+```
+
+The file extension for the image.
+
+If an actual one is available from a load filename it is used. Otherwise a
+canonical extension is assigned based on the content type. Does not contain the
+leading period, e.g. 'jpg', not '.jpg'.
+
+### `filename`
+
+```python
+filename
+```
+
+Original image file name, if loaded from disk, or a generic filename if
+loaded from an anonymous stream.
+
+### `from_blob`
+
+```python
+from_blob(blob: bytes) -> Image
+```
+
+Return a new `Image` subclass instance parsed from the image binary contained
+in `blob`.
+
+### `from_file`
+
+```python
+from_file(image_descriptor: str | IO[bytes])
+```
+
+Return a new `Image` subclass instance loaded from the image file identified
+by `image_descriptor`, a path or file-like object.
+
+### `height`
+
+```python
+height: Inches
+```
+
+A `Length` value representing the native height of the image, calculated from
+the values of `px_height` and `vert_dpi`.
+
+### `horz_dpi`
+
+```python
+horz_dpi: int
+```
+
+Integer dots per inch for the width of this image.
+
+Defaults to 72 when not present in the file, as is often the case.
+
+### `px_height`
+
+```python
+px_height: int
+```
+
+The vertical pixel dimension of the image.
+
+### `px_width`
+
+```python
+px_width: int
+```
+
+The horizontal pixel dimension of the image.
+
+### `scaled_dimensions`
+
+```python
+scaled_dimensions(width: int | Length | None = None, height: int | Length | None = None) -> Tuple[Length, Length]
+```
+
+(cx, cy) pair representing scaled dimensions of this image.
+
+The native dimensions of the image are scaled by applying the following rules to
+the `width` and `height` arguments.
+
+* If both `width` and `height` are specified, the return value is (`width`,
+`height`); no scaling is performed.
+* If only one is specified, it is used to compute a scaling factor that is then
+applied to the unspecified dimension, preserving the aspect ratio of the image.
+* If both `width` and `height` are `None`, the native dimensions are returned.
+
+The native dimensions are calculated using the dots-per-inch (dpi) value
+embedded in the image, defaulting to 72 dpi if no value is specified, as is
+often the case. The returned values are both `Length` objects.
+
+### `sha1`
+
+```python
+sha1()
+```
+
+SHA1 hash digest of the image blob.
+
+### `vert_dpi`
+
+```python
+vert_dpi: int
+```
+
+Integer dots per inch for the height of this image.
+
+Defaults to 72 when not present in the file, as is often the case.
+
+### `width`
+
+```python
+width: Inches
+```
+
+A `Length` value representing the native width of the image, calculated from
+the values of `px_width` and `horz_dpi`.
+
+
+
+
+
+# `docx.image.jpeg`
+
+Objects related to parsing headers of JPEG image streams.
+
+## `Exif`
+
+Bases: `Jpeg`
+
+Image header parser for Exif image format.
+
+### `from_stream`
+
+```python
+from_stream(stream)
+```
+
+Return `Exif` instance having header properties parsed from Exif image in
+`stream`.
+
+## `Jfif`
+
+Bases: `Jpeg`
+
+Image header parser for JFIF image format.
+
+### `from_stream`
+
+```python
+from_stream(stream)
+```
+
+Return a `Jfif` instance having header properties parsed from image in
+`stream`.
+
+## `Jpeg`
+
+Bases: `BaseImageHeader`
+
+Base class for JFIF and EXIF subclasses.
+
+### `content_type`
+
+```python
+content_type
+```
+
+MIME content type for this image, unconditionally `image/jpeg` for JPEG
+images.
+
+### `default_ext`
+
+```python
+default_ext
+```
+
+Default filename extension, always 'jpg' for JPG images.
+
+
+
+
+
+# `docx.image`
+
+Provides objects that can characterize image streams.
+
+## `SIGNATURES`
+
+```python
+SIGNATURES = ((Png, 0, b'\x89PNG\r\n\x1a\n'), (Jfif, 6, b'JFIF'), (Exif, 6, b'Exif'), (Gif, 0, b'GIF87a'), (Gif, 0, b'GIF89a'), (Tiff, 0, b'MM\x00*'), (Tiff, 0, b'II*\x00'), (Bmp, 0, b'BM'))
+```
+
+
+
+
+
+# `docx.image.png`
+
+## `Png`
+
+Bases: `BaseImageHeader`
+
+Image header parser for PNG images.
+
+### `content_type`
+
+```python
+content_type
+```
+
+MIME content type for this image, unconditionally `image/png` for PNG
+images.
+
+### `default_ext`
+
+```python
+default_ext
+```
+
+Default filename extension, always 'png' for PNG images.
+
+### `from_stream`
+
+```python
+from_stream(stream)
+```
+
+Return a `Png` instance having header properties parsed from image in
+`stream`.
+
+
+
+
+
+# `docx.image.tiff`
+
+## `Tiff`
+
+Bases: `BaseImageHeader`
+
+Image header parser for TIFF images.
+
+Handles both big and little endian byte ordering.
+
+### `content_type`
+
+```python
+content_type
+```
+
+Return the MIME type of this TIFF image, unconditionally the string
+``image/tiff``.
+
+### `default_ext`
+
+```python
+default_ext
+```
+
+Default filename extension, always 'tiff' for TIFF images.
+
+### `from_stream`
+
+```python
+from_stream(stream)
+```
+
+Return a `Tiff` instance containing the properties of the TIFF image in
+`stream`.
diff --git a/addons/sandbox/skills/docx/references/api-002.md b/addons/sandbox/skills/docx/references/api-002.md
new file mode 100644
index 000000000..2930d2851
--- /dev/null
+++ b/addons/sandbox/skills/docx/references/api-002.md
@@ -0,0 +1,5220 @@
+
+
+
+
+# paper-docx API reference
+
+The complete public API of `docx` 0.2.0, generated from docstrings. The distribution is `paper-docx`, a fork of python-docx; the import name is `docx`. Both what the fork adds and the API it inherits from python-docx are documented here.
+
+This index names every symbol documented here. Open the one page you need rather than reading them all.
+
+## Modules
+
+| Page | Surface |
+| --- | --- |
+| [`docx.api`](api-001.md#source-d3c6d8a2063ea1b9) | 1 member |
+| [`docx.blkcntnr`](api-001.md#source-159c84700f3fb7a9) | 2 members |
+| [`docx.blocks`](api-001.md#source-559940c98b8ab48e) | 13 members |
+| [`docx.bookmarks`](api-001.md#source-0eb8e7fe049a1194) | 11 members |
+| [`docx.commentops`](api-001.md#source-8f1e4f580e83a5d0) | 20 members |
+| [`docx.comments`](api-001.md#source-e4a8576a6dcbd98f) | 4 members |
+| [`docx.composition`](api-001.md#source-12b50f562db8cd2f) | 6 members |
+| [`docx.controls`](api-001.md#source-b8f6b3944ebc8cbd) | 8 members |
+| [`docx.dml.color`](api-001.md#source-955ea838037f755e) | 2 members |
+| [`docx.document`](api-001.md#source-1f833f98d375a316) | 2 members |
+| [`docx.drawing`](api-001.md#source-39ef763a9ce964c8) | 2 members |
+| [`docx.enum.base`](api-001.md#source-5dd3a18ad2f06af4) | 3 members |
+| [`docx.enum.dml`](api-001.md#source-d95470ef1e394d1b) | 3 members |
+| [`docx.enum.section`](api-001.md#source-29cb1aa11d41c51e) | 6 members |
+| [`docx.enum.shape`](api-001.md#source-b37d8620ff2f23a1) | 2 members |
+| [`docx.enum.style`](api-001.md#source-9434a7db09bd1c01) | 3 members |
+| [`docx.enum.table`](api-001.md#source-1f675541a0e52e24) | 6 members |
+| [`docx.enum.text`](api-001.md#source-f05e757fcce33a9d) | 10 members |
+| [`docx.errors`](api-001.md#source-15259882f4deb2a3) | 9 members |
+| [`docx.exceptions`](api-001.md#source-5ba7c82a99f28757) | 3 members |
+| [`docx.fields`](api-001.md#source-a3b4eaa58fcf5889) | 8 members |
+| [`docx.formatting`](api-001.md#source-1dec973f3b97903a) | 4 members |
+| [`docx.image`](api-001.md#source-b8c62bb744e27a81) | 1 member |
+| [`docx.image.bmp`](api-001.md#source-cdfcdfa3143e1415) | 1 member |
+| [`docx.image.constants`](api-001.md#source-cd6ae809876304fa) | 6 members |
+| [`docx.image.exceptions`](api-001.md#source-93e3b74e30e5b70d) | 3 members |
+| [`docx.image.gif`](api-001.md#source-0c70ceec21fb4450) | 1 member |
+| [`docx.image.helpers`](api-001.md#source-07b25500f249c3ce) | 3 members |
+| [`docx.image.image`](api-001.md#source-083f592a0c8631cc) | 2 members |
+| [`docx.image.jpeg`](api-001.md#source-7671e88f38d60e00) | 3 members |
+| [`docx.image.png`](api-001.md#source-1ff94a8d5409223f) | 1 member |
+| [`docx.image.tiff`](api-001.md#source-9f7686d8c790e5e0) | 1 member |
+| [`docx.links`](api-002.md#source-c169840ba53458fd) | 4 members |
+| [`docx.notes`](api-002.md#source-6b756e6a87f50fae) | 5 members |
+| [`docx.numbering`](api-002.md#source-61a628fe2ee2866a) | 11 members |
+| [`docx.opc.constants`](api-002.md#source-9a5b2f4589772f7a) | 4 members |
+| [`docx.opc.coreprops`](api-002.md#source-ff23b2e7f45659e6) | 1 member |
+| [`docx.opc.exceptions`](api-002.md#source-4eb353a0957fc371) | 2 members |
+| [`docx.opc.oxml`](api-002.md#source-4080bba1ebfeb0c5) | 15 members |
+| [`docx.opc.package`](api-002.md#source-d23a8c64e00a62f7) | 2 members |
+| [`docx.opc.packuri`](api-002.md#source-3991256132d60e2f) | 3 members |
+| [`docx.opc.part`](api-002.md#source-af3c023a316b85ae) | 3 members |
+| [`docx.opc.parts.coreprops`](api-002.md#source-90b8541a1f60e01f) | 1 member |
+| [`docx.opc.phys_pkg`](api-002.md#source-929fd048fcc3ba2b) | 4 members |
+| [`docx.opc.pkgreader`](api-002.md#source-6f13d33426ef53f2) | 4 members |
+| [`docx.opc.pkgwriter`](api-002.md#source-9ab18049af59e808) | 1 member |
+| [`docx.opc.rel`](api-002.md#source-b06938114c472f39) | 1 member |
+| [`docx.opc.shared`](api-002.md#source-174a9136bc6f2b62) | 2 members |
+| [`docx.opc.spec`](api-002.md#source-9ed61d16d8e8ea38) | 1 member |
+| [`docx.oxml.comments`](api-002.md#source-9e40b590666fa759) | 2 members |
+| [`docx.oxml.coreprops`](api-002.md#source-f2ee1e7f4466f0aa) | 1 member |
+| [`docx.oxml.document`](api-002.md#source-90fe632de8cbe585) | 2 members |
+| [`docx.oxml.drawing`](api-002.md#source-585ff05c61f1b05c) | 1 member |
+| [`docx.oxml.exceptions`](api-002.md#source-a13795e46d38261b) | 2 members |
+| [`docx.oxml.ns`](api-002.md#source-3776be9049db09e6) | 6 members |
+| [`docx.oxml.numbering`](api-002.md#source-eb336efe1afe672d) | 4 members |
+| [`docx.oxml.parser`](api-002.md#source-4e15de4882fc29ef) | 5 members |
+| [`docx.oxml.revision`](api-002.md#source-868781954bd7f97a) | 1 member |
+| [`docx.oxml.section`](api-002.md#source-5cae517757ff9cab) | 7 members |
+| [`docx.oxml.settings`](api-002.md#source-45b5f1beb29c3ab7) | 1 member |
+| [`docx.oxml.shape`](api-003.md#source-3c34f39af8be119f) | 17 members |
+| [`docx.oxml.shared`](api-003.md#source-05c954f91ee8b9d5) | 3 members |
+| [`docx.oxml.simpletypes`](api-003.md#source-6b3f05b8ff6f1d9d) | 35 members |
+| [`docx.oxml.styles`](api-003.md#source-fa6a21a66e584ad1) | 5 members |
+| [`docx.oxml.table`](api-003.md#source-3570d1cbd726407b) | 14 members |
+| [`docx.oxml.text.font`](api-003.md#source-4d4f960722b22afa) | 7 members |
+| [`docx.oxml.text.hyperlink`](api-003.md#source-7ada26ea94abbe06) | 1 member |
+| [`docx.oxml.text.pagebreak`](api-003.md#source-f3aef6b9eb6b1517) | 1 member |
+| [`docx.oxml.text.paragraph`](api-003.md#source-1e76def15bbd8450) | 1 member |
+| [`docx.oxml.text.parfmt`](api-003.md#source-ac18acaea7c8b971) | 6 members |
+| [`docx.oxml.text.run`](api-003.md#source-5569e2e09c4bff18) | 6 members |
+| [`docx.oxml.xmlchemy`](api-003.md#source-15800524d904f954) | 13 members |
+| [`docx.package`](api-003.md#source-85bd5a055971b2f8) | 17 members |
+| [`docx.parts.comments`](api-003.md#source-d07f59ec6b6091ab) | 1 member |
+| [`docx.parts.document`](api-003.md#source-feecabc5676a282a) | 1 member |
+| [`docx.parts.endnotes`](api-003.md#source-9fd9de78cb108dd6) | 1 member |
+| [`docx.parts.footnotes`](api-003.md#source-449e9230d2b2ea6f) | 1 member |
+| [`docx.parts.hdrftr`](api-003.md#source-52daf888ea897871) | 2 members |
+| [`docx.parts.image`](api-003.md#source-a83c3679f718c78a) | 1 member |
+| [`docx.parts.numbering`](api-003.md#source-dd7e507740c186b6) | 1 member |
+| [`docx.parts.settings`](api-003.md#source-56e5dd859ff03e89) | 1 member |
+| [`docx.parts.story`](api-003.md#source-926a44a16e867f59) | 1 member |
+| [`docx.parts.styles`](api-003.md#source-bae14dee2b7024de) | 1 member |
+| [`docx.protection`](api-003.md#source-dc198d86f07b14e6) | 10 members |
+| [`docx.revision`](api-003.md#source-3d87bbe7684c1331) | 5 members |
+| [`docx.search`](api-003.md#source-678e9875a3fa1ca8) | 9 members |
+| [`docx.section`](api-003.md#source-eee4067844e2f8df) | 2 members |
+| [`docx.settings`](api-003.md#source-532a135b0b75ed2c) | 1 member |
+| [`docx.shape`](api-003.md#source-1de2aab13071562e) | 2 members |
+| [`docx.shared`](api-003.md#source-09c5113e562f432e) | 15 members |
+| [`docx.story`](api-003.md#source-6248ea8bd2e0c910) | 12 members |
+| [`docx.styles`](api-003.md#source-9047785bdc7a3919) | 1 member |
+| [`docx.styles.latent`](api-003.md#source-d3ea04d7bb4f510e) | 1 member |
+| [`docx.styles.style`](api-003.md#source-382c966f01959966) | 4 members |
+| [`docx.styles.styles`](api-003.md#source-28eb6ea5b5023bcb) | 1 member |
+| [`docx.table`](api-003.md#source-ce74a9bf2d749312) | 2 members |
+| [`docx.tableops`](api-004.md#source-32cd0a2c56006650) | 5 members |
+| [`docx.text.font`](api-004.md#source-c00c94b81e29f2ef) | 1 member |
+| [`docx.text.hyperlink`](api-004.md#source-4214660cb391bec9) | 2 members |
+| [`docx.text.pagebreak`](api-004.md#source-44dfc592f980e410) | 1 member |
+| [`docx.text.paragraph`](api-004.md#source-2c1d902c346c5cdd) | 1 member |
+| [`docx.text.parfmt`](api-004.md#source-79ff58c0fb93748a) | 1 member |
+| [`docx.text.run`](api-004.md#source-1b9a14c58e608abf) | 2 members |
+| [`docx.text.tabstops`](api-004.md#source-eeaa259c323fdf65) | 2 members |
+| [`docx.types`](api-004.md#source-b2a7210fa4b39232) | 2 members |
+
+## `docx.api`
+
+Directly exposed API functions and classes, `Document` for now.
+
+Full contract: [api.md](api-001.md#source-d3c6d8a2063ea1b9)
+
+- `Document(docx=None) -> DocumentObject` — Return a `Document` object loaded from `docx`, where `docx` can be either a path
+
+## `docx.blkcntnr`
+
+Block item container, used by body, cell, header, etc.
+
+Full contract: [blkcntnr.md](api-001.md#source-159c84700f3fb7a9)
+
+- `BlockItemContainer` — Base class for proxy objects that can contain block items.
+- `BlockItemElement = 'CT_Body | CT_Comment | CT_HdrFtr | CT_Tc'`
+
+## `docx.blocks`
+
+Anchor-relative block operations and clause-level redlines (paper-docx).
+
+Full contract: [blocks.md](api-001.md#source-559940c98b8ab48e)
+
+- `BlockEditResult` — Outcome of a block-level edit.
+- `BlockTarget = Union[str, Block, Span]`
+- `ListBlock` — A real bullet/decimal list (backed by a real numbering definition).
+- `RichParagraph` — A paragraph built from styled runs.
+- `TableBlock` — A simple rectangular table of plain-text cells.
+- `TextRun` — One run of a rich paragraph.
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `insert_blocks_after(document, anchor, *, blocks, tracked=False, author=None, date=None) -> BlockEditResult` — Insert a typed block list after `anchor`, and return a `BlockEditResult`.
+- `insert_section_after(document, anchor, *, heading, paragraphs, heading_style='Heading2', body_style=None, tracked=False, author=None, date=None) -> BlockEditResult` — Insert a heading plus body paragraphs after `anchor`, and return a `BlockEditResult`.
+- `require_anchor_owner(document, anchor, *, argument='anchor') -> None` — Check ownership for live anchor forms; value/string anchors are inert.
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+- `tracked_delete_paragraphs(document, start_anchor, *, end_anchor=None, count=1, author, date=None) -> BlockEditResult` — Mark a paragraph range deleted with real tracked changes; returns a `BlockEditResult`.
+- `tracked_replace_paragraphs(document, start_anchor, replacement_paragraphs, *, end_anchor=None, count=1, body_style=None, author, date=None) -> BlockEditResult` — Tracked-delete a paragraph range and tracked-insert replacements after it.
+
+## `docx.bookmarks`
+
+Bookmark enumeration, creation, and deletion.
+
+Full contract: [bookmarks.md](api-001.md#source-0eb8e7fe049a1194)
+
+- `BookmarkInfo` — One bookmark: its name, id, story, and the visible text it wraps.
+- `DEL_TEXT = qn('w:delText')`
+- `INSTR_TEXT = qn('w:instrText')`
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `create_bookmark(document, span, name) -> BookmarkInfo` — Bookmark exactly `span`'s text under `name`, and return its `BookmarkInfo`.
+- `delete_bookmark(document, name) -> None` — Remove `name`'s markers, leaving the text in place.
+- `is_direct_run_child(element) -> bool` — Whether ``element`` is a direct child of a ``w:r`` element.
+- `list_bookmarks(document) -> 'List[BookmarkInfo]'` — Every bookmark across every story, in document order.
+- `project_run_child(element) -> RunChildProjection` — Return the conservative text projection for a direct ``w:r`` child.
+- `require_span_owner(document, span, *, argument='span') -> None` — Refuse a live span captured from a different document package.
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+
+## `docx.commentops`
+
+Comment thread operations: anchored text, replies, resolution.
+
+Full contract: [commentops.md](api-001.md#source-8f1e4f580e83a5d0)
+
+- `COMMENTS_EXTENDED_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtended+xml'`
+- `COMMENTS_EXTENDED_RELATIONSHIP_TYPE = 'http://schemas.microsoft.com/office/2011/relationships/commentsExtended'`
+- `COMMENTS_EXTENSIBLE_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtensible+xml'`
+- `COMMENTS_EXTENSIBLE_RELATIONSHIP_TYPE = 'http://schemas.microsoft.com/office/2018/08/relationships/commentsExtensible'`
+- `COMMENTS_IDS_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsIds+xml'`
+- `COMMENTS_IDS_RELATIONSHIP_TYPE = 'http://schemas.microsoft.com/office/2016/09/relationships/commentsIds'`
+- `DEL_TEXT = qn('w:delText')`
+- `INSTR_TEXT = qn('w:instrText')`
+- `anchored_text(document, comment) -> str` — The document text `comment` is anchored to, taken from its range marks.
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `comment_thread(document) -> Tuple[dict, ...]` — Every comment with its thread state: id, author, text, resolved, parent id, and anchored
+- `delete_comment(document, comment) -> None` — Delete `comment` and its replies, removing their range marks from the text.
+- `is_direct_run_child(element) -> bool` — Whether ``element`` is a direct child of a ``w:r`` element.
+- `is_resolved(document, comment) -> bool` — Whether `comment`'s thread is marked resolved.
+- `parent_of(document, comment) -> Optional[int]` — The comment `comment` replies to, or None when it starts a thread.
+- `project_run_child(element) -> RunChildProjection` — Return the conservative text projection for a direct ``w:r`` child.
+- `reply(document, comment, text, *, author, initials=None, date=None) -> 'Comment'` — Add a threaded reply to `comment` and return the new `Comment`.
+- `require_comment_owner(document, comment, *, argument='comment') -> None` — Refuse a comment proxy from another part and detect detached proxies.
+- `resolve(document, comment, *, resolved=True) -> None` — Mark `comment`'s thread resolved, or reopen it with `resolved=False`.
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+
+## `docx.comments`
+
+Collection providing access to comments added to this document.
+
+Full contract: [comments.md](api-001.md#source-e4a8576a6dcbd98f)
+
+- `Comment` — Proxy for a single comment in the document.
+- `Comments` — Collection containing the comments added to this document.
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+- `rollback_xml_on_error(root) -> Generator[None, None, None]` — Restore one live XML tree after an error in a local compound edit.
+
+## `docx.composition`
+
+Cross-document composition.
+
+Full contract: [composition.md](api-001.md#source-12b50f562db8cd2f)
+
+- `CompositionFinding`
+- `CompositionReport` — Everything one composition call did — the declared changed-part
+- `append_document(document, source, *, section='new_page', styles='match_by_name', headers='destination') -> CompositionReport` — Append `source`'s whole body to `document`, and return a `CompositionReport`.
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `insert_blocks_from(document, source, start_anchor, *, anchor, end_anchor=None, count=1, styles='match_by_name', include_start=True, include_end=True) -> CompositionReport` — Copy a block range from `source` after `anchor`, and return a `CompositionReport`.
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+
+## `docx.controls`
+
+Content-control (structured document tag) surface — the templating
+
+Full contract: [controls.md](api-001.md#source-b8f6b3944ebc8cbd)
+
+- `Control` — Live proxy for one content control.
+- `ControlInfo` — Identity and current state of one content control.
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `get_control(document, *, tag=None, alias=None) -> Control` — The single control matching `tag` and/or `alias`, or a typed refusal.
+- `iter_controls(document) -> 'Iterator[Control]'` — Every content control in every story part, document order.
+- `list_controls(document) -> Tuple[ControlInfo, ...]` — Identity and state of every control (schema-stable via .to_dict()).
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+- `set_control_value(document, value, *, tag=None, alias=None) -> None` — Set the value of the control that `tag` names.
+
+## `docx.dml.color`
+
+DrawingML objects related to color, ColorFormat being the most prominent.
+
+Full contract: [dml.color.md](api-001.md#source-955ea838037f755e)
+
+- `ColorFormat` — Provides access to color settings like RGB color, theme color, and luminance adjustments.
+- `RPrParent = 'CT_R'`
+
+## `docx.document`
+
+`Document` and closely related objects.
+
+Full contract: [document.md](api-001.md#source-1f833f98d375a316)
+
+- `Document` — WordprocessingML (WML) document.
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+
+## `docx.drawing`
+
+DrawingML-related objects are in this subpackage.
+
+Full contract: [drawing.md](api-001.md#source-39ef763a9ce964c8)
+
+- `Drawing` — Container for a DrawingML object.
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+
+## `docx.enum.base`
+
+Base classes and other objects used by enumerations.
+
+Full contract: [enum.base.md](api-001.md#source-5dd3a18ad2f06af4)
+
+- `BaseEnum` — Base class for Enums that do not map XML attr values.
+- `BaseXmlEnum` — Base class for Enums that also map XML attr values.
+- `DocsPageFormatter` — Generate an .rst doc page for an enumeration.
+
+## `docx.enum.dml`
+
+Enumerations used by DrawingML objects.
+
+Full contract: [enum.dml.md](api-001.md#source-d95470ef1e394d1b)
+
+- `MSO_COLOR_TYPE` — Specifies the color specification scheme.
+- `MSO_THEME_COLOR = MSO_THEME_COLOR_INDEX`
+- `MSO_THEME_COLOR_INDEX` — Indicates the Office theme color, one of those shown in the color gallery on the
+
+## `docx.enum.section`
+
+Enumerations related to the main document in WordprocessingML files.
+
+Full contract: [enum.section.md](api-001.md#source-29cb1aa11d41c51e)
+
+- `WD_HEADER_FOOTER = WD_HEADER_FOOTER_INDEX`
+- `WD_HEADER_FOOTER_INDEX` — Alias: **WD_HEADER_FOOTER**
+- `WD_ORIENT = WD_ORIENTATION`
+- `WD_ORIENTATION` — Alias: **WD_ORIENT**
+- `WD_SECTION = WD_SECTION_START`
+- `WD_SECTION_START` — Alias: **WD_SECTION**
+
+## `docx.enum.shape`
+
+Enumerations related to DrawingML shapes in WordprocessingML files.
+
+Full contract: [enum.shape.md](api-001.md#source-b37d8620ff2f23a1)
+
+- `WD_INLINE_SHAPE = WD_INLINE_SHAPE_TYPE`
+- `WD_INLINE_SHAPE_TYPE` — Corresponds to WdInlineShapeType enumeration.
+
+## `docx.enum.style`
+
+Enumerations related to styles.
+
+Full contract: [enum.style.md](api-001.md#source-9434a7db09bd1c01)
+
+- `WD_BUILTIN_STYLE` — Alias: **WD_STYLE**
+- `WD_STYLE = WD_BUILTIN_STYLE`
+- `WD_STYLE_TYPE` — Specifies one of the four style types: paragraph, character, list, or table.
+
+## `docx.enum.table`
+
+Enumerations related to tables in WordprocessingML files.
+
+Full contract: [enum.table.md](api-001.md#source-1f675541a0e52e24)
+
+- `WD_ALIGN_VERTICAL = WD_CELL_VERTICAL_ALIGNMENT`
+- `WD_CELL_VERTICAL_ALIGNMENT` — Alias: **WD_ALIGN_VERTICAL**
+- `WD_ROW_HEIGHT = WD_ROW_HEIGHT_RULE`
+- `WD_ROW_HEIGHT_RULE` — Alias: **WD_ROW_HEIGHT**
+- `WD_TABLE_ALIGNMENT` — Specifies table justification type.
+- `WD_TABLE_DIRECTION` — Specifies the direction in which an application orders cells in the specified
+
+## `docx.enum.text`
+
+Enumerations related to text in WordprocessingML files.
+
+Full contract: [enum.text.md](api-001.md#source-f05e757fcce33a9d)
+
+- `WD_ALIGN_PARAGRAPH = WD_PARAGRAPH_ALIGNMENT`
+- `WD_BREAK = WD_BREAK_TYPE`
+- `WD_BREAK_TYPE` — Corresponds to WdBreakType enumeration.
+- `WD_COLOR = WD_COLOR_INDEX`
+- `WD_COLOR_INDEX` — Specifies a standard preset color to apply.
+- `WD_LINE_SPACING` — Specifies a line spacing format to be applied to a paragraph.
+- `WD_PARAGRAPH_ALIGNMENT` — Alias: **WD_ALIGN_PARAGRAPH**
+- `WD_TAB_ALIGNMENT` — Specifies the tab stop alignment to apply.
+- `WD_TAB_LEADER` — Specifies the character to use as the leader with formatted tabs.
+- `WD_UNDERLINE` — Specifies the style of underline applied to a run of characters.
+
+## `docx.errors`
+
+Typed refusals for paper-docx safe-editing APIs.
+
+Full contract: [errors.md](api-001.md#source-15259882f4deb2a3)
+
+- `AmbiguousTargetError` — The target specification matches more than one location.
+- `BoundaryViolationError` — The operation would cross a structural boundary it must respect.
+- `DocumentProtectedError` — The document enforces an editing restriction this operation ignores.
+- `MalformedPackageError` — The file is not a package this library can safely read.
+- `PaperRefusal` — Base for every safe refusal raised by paper-docx APIs.
+- `RelationshipPolicyError` — The operation would create or modify a package relationship unsafely.
+- `TargetNotFoundError` — No location matches the target specification.
+- `UnsupportedStructureError` — The target involves structure this operation does not safely support.
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+
+## `docx.exceptions`
+
+Exceptions used with python-docx.
+
+Full contract: [exceptions.md](api-001.md#source-5ba7c82a99f28757)
+
+- `InvalidSpanError` — Raised when an invalid merge region is specified in a request to merge table
+- `InvalidXmlError` — Raised when invalid XML is encountered, such as on attempt to access a missing
+- `PythonDocxError` — Generic error class.
+
+## `docx.fields`
+
+Field authoring — formulas, never values.
+
+Full contract: [fields.md](api-001.md#source-a3b4eaa58fcf5889)
+
+- `add_caption(paragraph, *, label='Figure', description='') -> None` — Append a SEQ caption (`Figure 1`, `Table 1`) to `paragraph`.
+- `add_date_field(paragraph, *, date_format=None) -> None` — Append a DATE field; `date_format` is Word's \@ picture, for example 'MMMM d, yyyy'.
+- `add_page_count_field(paragraph) -> None` — Append a NUMPAGES field, typically to a footer paragraph.
+- `add_page_number_field(paragraph) -> None` — Append a PAGE field, typically to a footer paragraph.
+- `add_reference_field(paragraph, *, bookmark, kind='text') -> None` — Append a cross-reference to `bookmark`: its text (`kind="text"`), page (`"page"`), or
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `insert_toc_after(document, anchor, *, levels=(1, 3)) -> None` — Insert a TOC field in a new paragraph after `anchor`.
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+
+## `docx.formatting`
+
+Effective-format resolver — read-only, provenance-bearing.
+
+Full contract: [formatting.md](api-001.md#source-1dec973f3b97903a)
+
+- `EffectiveFormat` — The resolved property map, plus what is declared unresolvable.
+- `ResolvedValue` — One property's effective value and where it came from.
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `format_of(target) -> EffectiveFormat` — The effective formatting of a `Run`, `Paragraph` or `Span`.
+
+## `docx.image`
+
+Provides objects that can characterize image streams.
+
+Full contract: [image.md](api-001.md#source-b8c62bb744e27a81)
+
+- `SIGNATURES = ((Png, 0, b'\x89PNG\r\n\x1a\n'), (Jfif, 6, b'JFIF'), (Exif, 6, b'Exif'), (Gif, 0, b'GIF87a'), (Gif, 0, b'GIF89a'), (Tiff, 0, b'MM\x00*'), (Tiff, 0, b'II*\x00'), (Bmp, 0, b'BM'))`
+
+## `docx.image.bmp`
+
+Full contract: [image.bmp.md](api-001.md#source-cdfcdfa3143e1415)
+
+- `Bmp` — Image header parser for BMP images.
+
+## `docx.image.constants`
+
+Constants specific the the image sub-package.
+
+Full contract: [image.constants.md](api-001.md#source-cd6ae809876304fa)
+
+- `JPEG_MARKER_CODE` — JPEG marker codes.
+- `MIME_TYPE` — Image content types.
+- `PNG_CHUNK_TYPE` — PNG chunk type names.
+- `TIFF_FLD = TIFF_FLD_TYPE`
+- `TIFF_FLD_TYPE` — Tag codes for TIFF Image File Directory (IFD) entries.
+- `TIFF_TAG` — Tag codes for TIFF Image File Directory (IFD) entries.
+
+## `docx.image.exceptions`
+
+Exceptions specific the the image sub-package.
+
+Full contract: [image.exceptions.md](api-001.md#source-93e3b74e30e5b70d)
+
+- `InvalidImageStreamError` — The recognized image stream appears to be corrupted.
+- `UnexpectedEndOfFileError` — EOF was unexpectedly encountered while reading an image stream.
+- `UnrecognizedImageError` — The provided image stream could not be recognized.
+
+## `docx.image.gif`
+
+Full contract: [image.gif.md](api-001.md#source-0c70ceec21fb4450)
+
+- `Gif` — Image header parser for GIF images.
+
+## `docx.image.helpers`
+
+Full contract: [image.helpers.md](api-001.md#source-07b25500f249c3ce)
+
+- `BIG_ENDIAN = '>'`
+- `LITTLE_ENDIAN = '<'`
+- `StreamReader` — Wraps a file-like object to provide access to structured data from a binary file.
+
+## `docx.image.image`
+
+Provides objects that can characterize image streams.
+
+Full contract: [image.image.md](api-001.md#source-083f592a0c8631cc)
+
+- `BaseImageHeader` — Base class for image header subclasses like `Jpeg` and `Tiff`.
+- `Image` — Graphical image stream such as JPEG, PNG, or GIF with properties and methods
+
+## `docx.image.jpeg`
+
+Objects related to parsing headers of JPEG image streams.
+
+Full contract: [image.jpeg.md](api-001.md#source-7671e88f38d60e00)
+
+- `Exif` — Image header parser for Exif image format.
+- `Jfif` — Image header parser for JFIF image format.
+- `Jpeg` — Base class for JFIF and EXIF subclasses.
+
+## `docx.image.png`
+
+Full contract: [image.png.md](api-001.md#source-1ff94a8d5409223f)
+
+- `Png` — Image header parser for PNG images.
+
+## `docx.image.tiff`
+
+Full contract: [image.tiff.md](api-001.md#source-9f7686d8c790e5e0)
+
+- `Tiff` — Image header parser for TIFF images.
+
+## `docx.links`
+
+Create and retarget hyperlinks on existing text.
+
+Full contract: [links.md](api-002.md#source-c169840ba53458fd)
+
+- `add_hyperlink(document, span, address) -> Hyperlink` — Wrap `span`'s runs in a hyperlink pointing at `address`.
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `require_span_owner(document, span, *, argument='span') -> None` — Refuse a live span captured from a different document package.
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+
+## `docx.notes`
+
+Create footnotes and endnotes, including the note body and the mark.
+
+Full contract: [notes.md](api-002.md#source-6b756e6a87f50fae)
+
+- `add_endnote(document, span, text) -> int` — Attach an endnote to `span` and return its note id.
+- `add_footnote(document, span, text) -> int` — Attach a footnote to `span` and return its note id.
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `require_span_owner(document, span, *, argument='span') -> None` — Refuse a live span captured from a different document package.
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+
+## `docx.numbering`
+
+Numbering enumeration, application, and minimal authoring (paper-docx).
+
+Full contract: [numbering.md](api-002.md#source-61a628fe2ee2866a)
+
+- `NumberedParagraph`
+- `NumberingDefinition`
+- `NumberingLevel`
+- `NumberingReport`
+- `apply_list_style(paragraph, style_name) -> None` — Apply the existing paragraph style `style_name` to `paragraph`.
+- `apply_numbering(paragraph, *, num_id, level=0) -> None` — Give `paragraph` the existing numbering definition `num_id` at `level`.
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `ensure_bullet_definition(document) -> int` — The numId of a canonical bullet-list definition, creating it when absent.
+- `ensure_decimal_definition(document) -> int` — The numId of a canonical decimal-list definition, creating it when absent.
+- `list_numbering(document) -> NumberingReport` — Every numbering definition and every numbered paragraph in `document`.
+- `restart_numbering(document, *, num_id) -> int` — A NEW numId continuing `num_id`'s formatting but restarting the count at 1.
+
+## `docx.opc.constants`
+
+Constant values related to the Open Packaging Convention.
+
+Full contract: [opc.constants.md](api-002.md#source-9a5b2f4589772f7a)
+
+- `CONTENT_TYPE` — Content type URIs (like MIME-types) that specify a part's format.
+- `NAMESPACE` — Constant values for OPC XML namespaces.
+- `RELATIONSHIP_TARGET_MODE` — Open XML relationship target modes.
+- `RELATIONSHIP_TYPE`
+
+## `docx.opc.coreprops`
+
+Provides CoreProperties, Dublin-Core attributes of the document.
+
+Full contract: [opc.coreprops.md](api-002.md#source-ff23b2e7f45659e6)
+
+- `CoreProperties` — Corresponds to part named ``/docProps/core.xml``, containing the core document
+
+## `docx.opc.exceptions`
+
+Exceptions specific to python-opc.
+
+Full contract: [opc.exceptions.md](api-002.md#source-4eb353a0957fc371)
+
+- `OpcError` — Base error class for python-opc.
+- `PackageNotFoundError` — Raised when a package cannot be found at the specified path.
+
+## `docx.opc.oxml`
+
+Temporary stand-in for main oxml module.
+
+Full contract: [opc.oxml.md](api-002.md#source-4080bba1ebfeb0c5)
+
+- `BaseOxmlElement` — Base class for all custom element classes, to add standardized behavior to all
+- `CT_Default` — `` element that appears in `[Content_Types].xml` part.
+- `CT_Override` — ```` element, specifying the content type to be applied for a part with
+- `CT_Relationship` — `` element, representing a single relationship from source to target part.
+- `CT_Relationships` — ```` element, the root element in a .rels file.
+- `CT_Types` — ```` element, the container element for Default and Override elements in
+- `ct_namespace = element_class_lookup.get_namespace(nsmap['ct'])`
+- `element_class_lookup = etree.ElementNamespaceClassLookup()`
+- `nsmap = {'ct': NS.OPC_CONTENT_TYPES, 'pr': NS.OPC_RELATIONSHIPS, 'r': NS.OFC_RELATIONSHIPS}`
+- `oxml_parser = etree.XMLParser(remove_blank_text=True, resolve_entities=False)`
+- `parse_xml(text) -> etree._Element` — `etree.fromstring()` replacement that uses oxml parser.
+- `pr_namespace = element_class_lookup.get_namespace(nsmap['pr'])`
+- `qn(tag) -> str` — Stands for "qualified name", a utility function to turn a namespace prefixed tag
+- `serialize_for_reading(element) -> str` — Serialize `element` to human-readable XML suitable for tests.
+- `serialize_part_xml(part_elm) -> bytes` — Serialize `part_elm` etree element to XML suitable for storage as an XML part.
+
+## `docx.opc.package`
+
+Objects that implement reading and writing OPC packages.
+
+Full contract: [opc.package.md](api-002.md#source-d23a8c64e00a62f7)
+
+- `OpcPackage` — Main API class for `python-opc`.
+- `Unmarshaller` — Hosts static methods for unmarshalling a package from a `PackageReader`.
+
+## `docx.opc.packuri`
+
+Provides the PackURI value type.
+
+Full contract: [opc.packuri.md](api-002.md#source-3991256132d60e2f)
+
+- `CONTENT_TYPES_URI = PackURI('/[Content_Types].xml')`
+- `PACKAGE_URI = PackURI('/')`
+- `PackURI` — Provides access to pack URI components such as the baseURI and the filename slice.
+
+## `docx.opc.part`
+
+Open Packaging Convention (OPC) objects related to package parts.
+
+Full contract: [opc.part.md](api-002.md#source-af3c023a316b85ae)
+
+- `Part` — Base class for package parts.
+- `PartFactory` — Provides a way for client code to specify a subclass of `Part` to be constructed
+- `XmlPart` — Base class for package parts containing an XML payload, which is most of them.
+
+## `docx.opc.parts.coreprops`
+
+Core properties part, corresponds to ``/docProps/core.xml`` part in package.
+
+Full contract: [opc.parts.coreprops.md](api-002.md#source-90b8541a1f60e01f)
+
+- `CorePropertiesPart` — Corresponds to part named ``/docProps/core.xml``.
+
+## `docx.opc.phys_pkg`
+
+Provides a general interface to a `physical` OPC package, such as a zip file.
+
+Full contract: [opc.phys_pkg.md](api-002.md#source-929fd048fcc3ba2b)
+
+- `GuardedZipReader` — Validate and stream every member of an already-open ``ZipFile``.
+- `PhysPkgReader` — Factory for physical package reader objects.
+- `PhysPkgWriter` — Factory for physical package writer objects.
+- `preflight_zip(source) -> None` — Validate central-directory metadata before ``ZipFile`` opens.
+
+## `docx.opc.pkgreader`
+
+Low-level, read-only API to a serialized Open Packaging Convention (OPC) package.
+
+Full contract: [opc.pkgreader.md](api-002.md#source-6f13d33426ef53f2)
+
+- `PackageReader` — Provides access to the contents of a zip-format OPC package via its
+- `content_type_matches(actual, expected) -> bool`
+- `is_relationship_type(actual, expected) -> bool`
+- `is_xml_id(value) -> bool` — Whether ``value`` has the XML Schema ID/NCName lexical form.
+
+## `docx.opc.pkgwriter`
+
+Provides low-level, write-only API to serialized (OPC) package.
+
+Full contract: [opc.pkgwriter.md](api-002.md#source-9ab18049af59e808)
+
+- `PackageWriter` — Writes a zip-format OPC package to `pkg_file`, where `pkg_file` can be either a
+
+## `docx.opc.rel`
+
+Relationship-related objects.
+
+Full contract: [opc.rel.md](api-002.md#source-b06938114c472f39)
+
+- `Relationships` — Collection object for `_Relationship` instances, having list semantics.
+
+## `docx.opc.shared`
+
+Objects shared by opc modules.
+
+Full contract: [opc.shared.md](api-002.md#source-174a9136bc6f2b62)
+
+- `CaseInsensitiveDict` — Mapping type that behaves like dict except that it matches without respect to the
+- `cls_method_fn(method_name)` — Return method of `cls` having `method_name`.
+
+## `docx.opc.spec`
+
+Provides mappings that embody aspects of the Open XML spec ISO/IEC 29500.
+
+Full contract: [opc.spec.md](api-002.md#source-9ed61d16d8e8ea38)
+
+- `default_content_types = (('bin', CT.PML_PRINTER_SETTINGS), ('bin', CT.SML_PRINTER_SETTINGS), ('bin', CT.WML_PRINTER_SETTINGS), ('bmp', CT.BMP), ('emf', CT.X_EMF), ('fntdata', CT.X_FONTDATA), ('gif', CT.GIF), ('jpe', CT.JPEG), ('jpeg', CT.JPEG), ('jpg', CT.JPEG), ('png', CT.PNG), ('rels', CT.OPC_RELATIONSHIPS), ('tif', CT.TIFF), ('tiff', CT.TIFF), ('wdp', CT.MS_PHOTO), ('wmf', CT.X_WMF), ('xlsx', CT.SML_SHEET), ('xml', CT.XML))`
+
+## `docx.oxml.comments`
+
+Custom element classes related to document comments.
+
+Full contract: [oxml.comments.md](api-002.md#source-9e40b590666fa759)
+
+- `CT_Comment` — `w:comment` element, representing a single comment.
+- `CT_Comments` — `w:comments` element, the root element for the comments part.
+
+## `docx.oxml.coreprops`
+
+Custom element classes for core properties-related XML elements.
+
+Full contract: [oxml.coreprops.md](api-002.md#source-f2ee1e7f4466f0aa)
+
+- `CT_CoreProperties` — `` element, the root element of the Core Properties part.
+
+## `docx.oxml.document`
+
+Custom element classes that correspond to the document part, e.g. .
+
+Full contract: [oxml.document.md](api-002.md#source-90fe632de8cbe585)
+
+- `CT_Body` — `w:body`, the container element for the main document story in `document.xml`.
+- `CT_Document` — ```` element, the root element of a document.xml file.
+
+## `docx.oxml.drawing`
+
+Custom element-classes for DrawingML-related elements like ``.
+
+Full contract: [oxml.drawing.md](api-002.md#source-585ff05c61f1b05c)
+
+- `CT_Drawing` — `` element, containing a DrawingML object like a picture or chart.
+
+## `docx.oxml.exceptions`
+
+Exceptions for oxml sub-package.
+
+Full contract: [oxml.exceptions.md](api-002.md#source-a13795e46d38261b)
+
+- `InvalidXmlError` — Raised when invalid XML is encountered, such as on attempt to access a missing
+- `XmlchemyError` — Generic error class.
+
+## `docx.oxml.ns`
+
+Namespace-related objects.
+
+Full contract: [oxml.ns.md](api-002.md#source-3776be9049db09e6)
+
+- `NamespacePrefixedTag` — Value object that knows the semantics of an XML tag having a namespace prefix.
+- `nsdecls(*prefixes) -> str` — Namespace declaration including each namespace-prefix in `prefixes`.
+- `nsmap = {'a': 'http://schemas.openxmlformats.org/drawingml/2006/main', 'c': 'http://schemas.openxmlformats.org/drawingml/2006/chart', 'cp': 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties', 'dc': 'http://purl.org/dc/elements/1.1/', 'dcmitype': 'http://purl.org/dc/dcmitype/', 'dcterms': 'http://purl.org/dc/terms/', 'dgm': 'http://schemas.openxmlformats.org/drawingml/2006/diagram', 'm': 'http://schemas.openxmlformats.org/officeDocument/2006/math', 'pic': 'http://schemas.openxmlformats.org/drawingml/2006/picture', 'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', 'sl': 'http://schemas.openxmlformats.org/schemaLibrary/2006/main', 'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main', 'w14': 'http://schemas.microsoft.com/office/word/2010/wordml', 'wp': 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing', 'xml': 'http://www.w3.org/XML/1998/namespace', 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'}`
+- `nspfxmap(*nspfxs) -> Dict[str, str]` — Subset namespace-prefix mappings specified by *nspfxs*.
+- `pfxmap = {value: key for key, value in nsmap.items()}`
+- `qn(tag) -> str` — Stands for "qualified name".
+
+## `docx.oxml.numbering`
+
+Custom element classes related to the numbering part.
+
+Full contract: [oxml.numbering.md](api-002.md#source-eb336efe1afe672d)
+
+- `CT_Num` — ```` element, which represents a concrete list definition instance, having
+- `CT_NumLvl` — ```` element, which identifies a level in a list definition to
+- `CT_NumPr` — A ```` element, a container for numbering properties applied to a
+- `CT_Numbering` — ```` element, the root element of a numbering part, i.e.
+
+## `docx.oxml.parser`
+
+XML parser for python-docx.
+
+Full contract: [oxml.parser.md](api-002.md#source-4e15de4882fc29ef)
+
+- `OxmlElement(nsptag_str, attrs=None, nsdecls=None) -> BaseOxmlElement | etree._Element` — Return a 'loose' lxml element having the tag specified by `nsptag_str`.
+- `element_class_lookup = etree.ElementNamespaceClassLookup()`
+- `oxml_parser = etree.XMLParser(remove_blank_text=True, resolve_entities=False)`
+- `parse_xml(xml) -> 'BaseOxmlElement'` — Root lxml element obtained by parsing XML character string `xml`.
+- `register_element_cls(tag)` — Register an lxml custom element-class to use for `tag`.
+
+## `docx.oxml.revision`
+
+Custom element classes for the tracked-change (revision) vocabulary.
+
+Full contract: [oxml.revision.md](api-002.md#source-868781954bd7f97a)
+
+- `CT_RunTrackChange` — `w:ins` and `w:del` elements: a tracked run-level change.
+
+## `docx.oxml.section`
+
+Section-related custom element classes.
+
+Full contract: [oxml.section.md](api-002.md#source-5cae517757ff9cab)
+
+- `BlockElement = 'CT_P | CT_Tbl'`
+- `CT_HdrFtr` — `w:hdr` and `w:ftr`, the root element for header and footer part respectively.
+- `CT_HdrFtrRef` — `w:headerReference` and `w:footerReference` elements.
+- `CT_PageMar` — ```` element, defining page margins.
+- `CT_PageSz` — ```` element, defining page dimensions and orientation.
+- `CT_SectPr` — `w:sectPr` element, the container element for section properties.
+- `CT_SectType` — ```` element, defining the section start type.
+
+## `docx.oxml.settings`
+
+Custom element classes related to document settings.
+
+Full contract: [oxml.settings.md](api-002.md#source-45b5f1beb29c3ab7)
+
+- `CT_Settings` — `w:settings` element, root element for the settings part.
+
+## `docx.oxml.shape`
+
+Custom element classes for shape-related elements like ``.
+
+Full contract: [oxml.shape.md](api-003.md#source-3c34f39af8be119f)
+
+- `CT_Anchor` — `` element, container for a "floating" shape.
+- `CT_Blip` — ```` element, specifies image source and adjustments such as alpha and
+- `CT_BlipFillProperties` — ```` element, specifies picture properties.
+- `CT_GraphicalObject` — ```` element, container for a DrawingML object.
+- `CT_GraphicalObjectData` — ```` element, container for the XML of a DrawingML object.
+- `CT_Inline` — `` element, container for an inline shape.
+- `CT_NonVisualDrawingProps` — Used for ```` element, and perhaps others.
+- `CT_NonVisualPictureProperties` — ```` element, specifies picture locking and resize behaviors.
+- `CT_Picture` — ```` element, a DrawingML picture.
+- `CT_PictureNonVisual` — ```` element, non-visual picture properties.
+- `CT_Point2D` — Used for ```` element, and perhaps others.
+- `CT_PositiveSize2D` — Used for ```` element, and perhaps others later.
+- `CT_PresetGeometry2D` — ```` element, specifies an preset autoshape geometry, such as
+- `CT_RelativeRect` — ```` element, specifying picture should fill containing rectangle
+- `CT_ShapeProperties` — ```` element, specifies size and shape of picture container.
+- `CT_StretchInfoProperties` — ```` element, specifies how picture should fill its containing
+- `CT_Transform2D` — ```` element, specifies size and shape of picture container.
+
+## `docx.oxml.shared`
+
+Objects shared by modules in the docx.oxml subpackage.
+
+Full contract: [oxml.shared.md](api-003.md#source-05c954f91ee8b9d5)
+
+- `CT_DecimalNumber` — Used for ````, ````, ```` and several others,
+- `CT_OnOff` — Used for `w:b`, `w:i` elements and others.
+- `CT_String` — Used for `w:pStyle` and `w:tblStyle` elements and others.
+
+## `docx.oxml.simpletypes`
+
+Simple-type classes, corresponding to ST_* schema items.
+
+Full contract: [oxml.simpletypes.md](api-003.md#source-6b3f05b8ff6f1d9d)
+
+- `BaseIntType`
+- `BaseSimpleType` — Base class for simple-types.
+- `BaseStringEnumerationType`
+- `BaseStringType`
+- `ST_BrClear`
+- `ST_BrType`
+- `ST_Coordinate`
+- `ST_CoordinateUnqualified`
+- `ST_DateTime`
+- `ST_DecimalNumber`
+- `ST_DrawingElementId`
+- `ST_HexColor`
+- `ST_HexColorAuto` — Value for `w:color/[@val="auto"] attribute setting.
+- `ST_HpsMeasure` — Half-point measure, e.g. 24.0 represents 12.0 points.
+- `ST_Merge` — Valid values for attribute.
+- `ST_OnOff`
+- `ST_PositiveCoordinate`
+- `ST_RelationshipId`
+- `ST_SignedTwipsMeasure`
+- `ST_String`
+- `ST_TblLayoutType`
+- `ST_TblWidth`
+- `ST_TwipsMeasure`
+- `ST_UniversalMeasure`
+- `ST_VerticalAlignRun` — Valid values for `w:vertAlign/@val`.
+- `XsdAnyUri` — There's a regex in the spec this is supposed to meet...
+- `XsdBoolean`
+- `XsdId` — String that must begin with a letter or underscore and cannot contain any colons.
+- `XsdInt`
+- `XsdLong`
+- `XsdString`
+- `XsdStringEnumeration` — Set of enumerated xsd:string values.
+- `XsdToken` — Xsd:string with whitespace collapsing, e.g. multiple spaces reduced to one,
+- `XsdUnsignedInt`
+- `XsdUnsignedLong`
+
+## `docx.oxml.styles`
+
+Custom element classes related to the styles part.
+
+Full contract: [oxml.styles.md](api-003.md#source-fa6a21a66e584ad1)
+
+- `CT_LatentStyles` — `w:latentStyles` element, defining behavior defaults for latent styles and
+- `CT_LsdException` — ```` element, defining override visibility behaviors for a named
+- `CT_Style` — A ```` element, representing a style definition.
+- `CT_Styles` — ```` element, the root element of a styles part, i.e. styles.xml.
+- `styleId_from_name(name)` — Return the style id corresponding to `name`, taking into account special-case
+
+## `docx.oxml.table`
+
+Custom element classes for tables.
+
+Full contract: [oxml.table.md](api-003.md#source-3570d1cbd726407b)
+
+- `CT_Height` — Used for `w:trHeight` to specify a row height and row height rule.
+- `CT_Row` — ```` element.
+- `CT_Tbl` — ```` element.
+- `CT_TblGrid` — `w:tblGrid` element.
+- `CT_TblGridCol` — `w:gridCol` element, child of `w:tblGrid`, defines a table column.
+- `CT_TblLayoutType` — `w:tblLayout` element.
+- `CT_TblPr` — ```` element, child of ````, holds child elements that define
+- `CT_TblPrEx` — `w:tblPrEx` element, exceptions to table-properties.
+- `CT_TblWidth` — Used for `w:tblW` and `w:tcW` and others, specifies a table-related width.
+- `CT_Tc` — `w:tc` table cell element.
+- `CT_TcPr` — ```` element, defining table cell properties.
+- `CT_TrPr` — ```` element, defining table row properties.
+- `CT_VMerge` — ```` element, specifying vertical merging behavior of a cell.
+- `CT_VerticalJc` — `w:vAlign` element, specifying vertical alignment of cell.
+
+## `docx.oxml.text.font`
+
+Custom element classes related to run properties (font).
+
+Full contract: [oxml.text.font.md](api-003.md#source-4d4f960722b22afa)
+
+- `CT_Color` — `w:color` element, specifying the color of a font and perhaps other objects.
+- `CT_Fonts` — `` element.
+- `CT_Highlight` — `w:highlight` element, specifying font highlighting/background color.
+- `CT_HpsMeasure` — Used for `` element and others, specifying font size in half-points.
+- `CT_RPr` — `` element, containing the properties for a run.
+- `CT_Underline` — `` element, specifying the underlining style for a run.
+- `CT_VerticalAlignRun` — `` element, specifying subscript or superscript.
+
+## `docx.oxml.text.hyperlink`
+
+Custom element classes related to hyperlinks (CT_Hyperlink).
+
+Full contract: [oxml.text.hyperlink.md](api-003.md#source-7ada26ea94abbe06)
+
+- `CT_Hyperlink` — `` element, containing the text and address for a hyperlink.
+
+## `docx.oxml.text.pagebreak`
+
+Custom element class for rendered page-break (CT_LastRenderedPageBreak).
+
+Full contract: [oxml.text.pagebreak.md](api-003.md#source-f3aef6b9eb6b1517)
+
+- `CT_LastRenderedPageBreak` — `` element, indicating page break inserted by renderer.
+
+## `docx.oxml.text.paragraph`
+
+Custom element classes related to paragraphs (CT_P).
+
+Full contract: [oxml.text.paragraph.md](api-003.md#source-1e76def15bbd8450)
+
+- `CT_P` — `` element, containing the properties and text for a paragraph.
+
+## `docx.oxml.text.parfmt`
+
+Custom element classes related to paragraph properties (CT_PPr).
+
+Full contract: [oxml.text.parfmt.md](api-003.md#source-ac18acaea7c8b971)
+
+- `CT_Ind` — ```` element, specifying paragraph indentation.
+- `CT_Jc` — ```` element, specifying paragraph justification.
+- `CT_PPr` — ```` element, containing the properties for a paragraph.
+- `CT_Spacing` — ```` element, specifying paragraph spacing attributes such as space
+- `CT_TabStop` — `` element, representing an individual tab stop.
+- `CT_TabStops` — ```` element, container for a sorted sequence of tab stops.
+
+## `docx.oxml.text.run`
+
+Custom element classes related to text runs (CT_R).
+
+Full contract: [oxml.text.run.md](api-003.md#source-5569e2e09c4bff18)
+
+- `CT_Br` — `` element, indicating a line, page, or column break in a run.
+- `CT_Cr` — `` element, representing a carriage-return (0x0D) character within a run.
+- `CT_NoBreakHyphen` — `` element, a hyphen ineligible for a line-wrap position.
+- `CT_PTab` — `` element, representing an absolute-position tab character within a run.
+- `CT_R` — `` element, containing the properties and text for a run.
+- `CT_Text` — `` element, containing a sequence of characters within a run.
+
+## `docx.oxml.xmlchemy`
+
+Enabling declarative definition of lxml custom element classes.
+
+Full contract: [oxml.xmlchemy.md](api-003.md#source-15800524d904f954)
+
+- `BaseAttribute` — Base class for OptionalAttribute and RequiredAttribute.
+- `BaseOxmlElement` — Effective base class for all custom element classes.
+- `Choice` — Defines a child element belonging to a group, only one of which may appear as a child.
+- `MetaOxmlElement` — Metaclass for BaseOxmlElement.
+- `OneAndOnlyOne` — Defines a required child element for MetaOxmlElement.
+- `OneOrMore` — Defines a repeating child element for MetaOxmlElement that must appear at least
+- `OptionalAttribute` — Defines an optional attribute on a custom element class.
+- `RequiredAttribute` — Defines a required attribute on a custom element class.
+- `XmlString` — Provides string comparison override suitable for serialized XML that is useful
+- `ZeroOrMore` — Defines an optional repeating child element for MetaOxmlElement.
+- `ZeroOrOne` — Defines an optional child element for MetaOxmlElement.
+- `ZeroOrOneChoice` — Correspondes to an ``EG_*`` element group where at most one of its members may
+- `serialize_for_reading(element)` — Serialize `element` to human-readable XML suitable for tests.
+
+## `docx.package`
+
+WordprocessingML Package class and related objects.
+
+Full contract: [package.md](api-003.md#source-85bd5a055971b2f8)
+
+- `CompareFinding` — One difference compare REPORTS instead of redlining (declared limit).
+- `CompareResult` — The redlined document plus everything compare could not redline.
+- `ImageParts` — Collection of `ImagePart` objects corresponding to images in the package.
+- `Package` — Customizations specific to a WordprocessingML package.
+- `PackageDiagnosis` — Typed triage for a file `docx.Document()` may refuse or crash on.
+- `PackageDiff` — Part-by-part comparison of two OPC packages.
+- `PartDiff` — One byte-changed part in a package comparison.
+- `PatchSaveResult` — Outcome of a `patch_save` call.
+- `StoryTextDiff`
+- `TextDiff` — Per-story unified diffs of visible block text.
+- `compare(original, revised, *, author, date=None, granularity='word', materialize=None) -> CompareResult` — A `CompareResult`: `original` plus tracked changes producing `revised`.
+- `diagnose(path) -> PackageDiagnosis` — Why the file at `path` can or cannot be opened, as a `PackageDiagnosis`.
+- `diff_package(path_a, path_b) -> PackageDiff` — Part-by-part diff of the OPC packages at `path_a` and `path_b`.
+- `patch_save(original_path, document, out_path) -> PatchSaveResult` — Save `document` to `out_path`, restoring original bytes wherever possible.
+- `pending_changes(path) -> TextDiff` — What the document's pending revisions would change if all were accepted.
+- `text_diff(path_a, path_b, *, view='current') -> TextDiff` — What changed, textually, between the documents at `path_a` and `path_b`.
+- `xml_equivalent(a, b) -> bool` — True when `a` and `b` are structurally identical XML documents.
+
+## `docx.parts.comments`
+
+Contains comments added to the document.
+
+Full contract: [parts.comments.md](api-003.md#source-d07f59ec6b6091ab)
+
+- `CommentsPart` — Container part for comments added to the document.
+
+## `docx.parts.document`
+
+`DocumentPart` and closely related objects.
+
+Full contract: [parts.document.md](api-003.md#source-feecabc5676a282a)
+
+- `DocumentPart` — Main document part of a WordprocessingML (WML) package, aka a .docx file.
+
+## `docx.parts.endnotes`
+
+`EndnotesPart`, the story part containing a document's endnotes.
+
+Full contract: [parts.endnotes.md](api-003.md#source-9fd9de78cb108dd6)
+
+- `EndnotesPart` — Proxy for the endnotes part (`word/endnotes.xml`) of a document.
+
+## `docx.parts.footnotes`
+
+`FootnotesPart`, the story part containing a document's footnotes.
+
+Full contract: [parts.footnotes.md](api-003.md#source-449e9230d2b2ea6f)
+
+- `FootnotesPart` — Proxy for the footnotes part (`word/footnotes.xml`) of a document.
+
+## `docx.parts.hdrftr`
+
+Header and footer part objects.
+
+Full contract: [parts.hdrftr.md](api-003.md#source-52daf888ea897871)
+
+- `FooterPart` — Definition of a section footer.
+- `HeaderPart` — Definition of a section header.
+
+## `docx.parts.image`
+
+The proxy class for an image part, and related objects.
+
+Full contract: [parts.image.md](api-003.md#source-a83c3679f718c78a)
+
+- `ImagePart` — An image part.
+
+## `docx.parts.numbering`
+
+`NumberingPart` and closely related objects.
+
+Full contract: [parts.numbering.md](api-003.md#source-dd7e507740c186b6)
+
+- `NumberingPart` — Proxy for the numbering.xml part containing numbering definitions for a document
+
+## `docx.parts.settings`
+
+`SettingsPart` and closely related objects.
+
+Full contract: [parts.settings.md](api-003.md#source-56e5dd859ff03e89)
+
+- `SettingsPart` — Document-level settings part of a WordprocessingML (WML) package.
+
+## `docx.parts.story`
+
+`StoryPart` and related objects.
+
+Full contract: [parts.story.md](api-003.md#source-926a44a16e867f59)
+
+- `StoryPart` — Base class for story parts.
+
+## `docx.parts.styles`
+
+Provides StylesPart and related objects.
+
+Full contract: [parts.styles.md](api-003.md#source-bae14dee2b7024de)
+
+- `StylesPart` — Proxy for the styles.xml part containing style definitions for a document or
+
+## `docx.protection`
+
+Document-protection awareness (paper-docx).
+
+Full contract: [protection.md](api-003.md#source-dc198d86f07b14e6)
+
+- `OPERATION_CLASSES = (OP_COMMENT, OP_FORM_FIELD, OP_BODY)`
+- `OP_BODY = 'body-content'`
+- `OP_COMMENT = 'comment'`
+- `OP_FORM_FIELD = 'form-field-value'`
+- `ProtectionStatus` — What `w:documentProtection` declares, read-only.
+- `acknowledge_protection(document) -> ProtectionStatus` — Explicitly override protection for this open package (in-memory only).
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `protection_status(document) -> ProtectionStatus` — The document's `w:documentProtection` state (report-only).
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+- `set_protection(document, *, edit) -> ProtectionStatus` — Turn Restrict Editing on for delivery (`w:documentProtection`).
+
+## `docx.revision`
+
+Revision enumeration and resolution (paper-docx, `Document.revisions`).
+
+Full contract: [revision.md](api-003.md#source-3d87bbe7684c1331)
+
+- `RESOLVABLE_TYPES = frozenset({'insertion', 'deletion', 'format_change', 'row_insertion', 'row_deletion', 'move_from', 'move_to'})`
+- `Revision` — One tracked change, addressable — and resolvable when supported.
+- `Revisions` — All tracked changes in a document, across every story part.
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+
+## `docx.search`
+
+Exact and normalized text search over visibility-complete traversal.
+
+Full contract: [search.md](api-003.md#source-678e9875a3fa1ca8)
+
+- `ReplaceAllResult` — Outcome of a `replace_all` call: per-match results, never silent.
+- `ReplaceResult` — Outcome of a `Span.replace` call.
+- `Span` — A visible-text interval mapped back to its concrete text atoms.
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `find_one(document, needle, *, nth=None, story=None, view='current', match='exact') -> Span` — The single span matching `needle`, or a typed refusal.
+- `find_text(document, needle, *, nth=None, near=None, story=None, view='current', match='exact') -> 'List[Span]'` — Every span of `needle` in `document` under the selected match policy.
+- `normalize_text(value) -> str` — `value` normalized for matching: folded punctuation, collapsed
+- `replace_all(document, needle, new_text, *, story=None, view='current', match='exact', tracked=False, author=None, date=None, preserve_revision=False) -> ReplaceAllResult` — Replace every match of `needle` in one pass, and return a `ReplaceAllResult`.
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+
+## `docx.section`
+
+The `Section` object and related proxy classes.
+
+Full contract: [section.md](api-003.md#source-eee4067844e2f8df)
+
+- `Section` — Document section, providing access to section and page setup settings.
+- `Sections` — Sequence of `Section` objects corresponding to the sections in the document.
+
+## `docx.settings`
+
+Settings object, providing access to document-level settings.
+
+Full contract: [settings.md](api-003.md#source-532a135b0b75ed2c)
+
+- `Settings` — Provides access to document-level settings for a document.
+
+## `docx.shape`
+
+Objects related to shapes.
+
+Full contract: [shape.md](api-003.md#source-1de2aab13071562e)
+
+- `InlineShape` — Proxy for an ```` element, representing the container for an inline
+- `InlineShapes` — Sequence of `InlineShape` instances, supporting len(), iteration, and indexed access.
+
+## `docx.shared`
+
+Objects shared by docx modules.
+
+Full contract: [shared.md](api-003.md#source-09c5113e562f432e)
+
+- `Cm` — Convenience constructor for length in centimeters, e.g. ``height = Cm(12)``.
+- `ElementProxy` — Base class for lxml element proxy classes.
+- `Emu` — Convenience constructor for length in English Metric Units, e.g. ``width =
+- `Inches` — Convenience constructor for length in inches, e.g. ``width = Inches(0.5)``.
+- `Length` — Base class for length constructor classes Inches, Cm, Mm, Px, and Emu.
+- `Mm` — Convenience constructor for length in millimeters, e.g. ``width = Mm(240.5)``.
+- `Parented` — Provides common services for document elements that occur below a part but may
+- `Pt` — Convenience value class for specifying a length in points.
+- `RGBColor` — Immutable value object defining a particular RGB color.
+- `StoryChild` — A document element within a story part.
+- `T = TypeVar('T')`
+- `TextAccumulator` — Accepts `str` fragments and joins them together, in order, on `.pop().
+- `Twips` — Convenience constructor for length in twips, e.g. ``width = Twips(42)``.
+- `lazyproperty` — Decorator like @property, but evaluated only on first access.
+- `write_only_property(f)` — @write_only_property decorator.
+
+## `docx.story`
+
+Visibility-complete story traversal and inspection (paper-docx, opt-in).
+
+Full contract: [story.md](api-003.md#source-6248ea8bd2e0c910)
+
+- `Anchor` — Legacy, inert location evidence: story part + index + content hash.
+- `BLIND_REGION_KEYS = ('tracked_insertions', 'tracked_deletions', 'moves', 'format_changes', 'content_controls', 'text_boxes', 'fields', 'math', 'embedded_objects', 'alt_chunks', 'hidden_text')`
+- `Block` — One live, owner-bound paragraph or table observed during traversal.
+- `Outline` — Inspection snapshot of a document: every block in every story part.
+- `TableShape`
+- `VIEWS = ('current', 'original', 'all')`
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `content_hash(text) -> str` — First 8 hex chars of SHA-256 over the block's normalized text.
+- `iter_blocks(document, *, view='current') -> Iterator[Block]` — Every block in every story part of `document`, in document order.
+- `normalize_text(value) -> str` — `value` normalized for matching: folded punctuation, collapsed
+- `outline(document, *, view='current') -> Outline` — Inspection snapshot: story parts, all blocks, blind-region counts.
+- `story_parts(document) -> Tuple[str, ...]` — Every story part present in `document`, in traversal order.
+
+## `docx.styles`
+
+Sub-package module for docx.styles sub-package.
+
+Full contract: [styles.md](api-003.md#source-9047785bdc7a3919)
+
+- `BabelFish` — Translates special-case style names from UI name (e.g. Heading 1) to
+
+## `docx.styles.latent`
+
+Latent style-related objects.
+
+Full contract: [styles.latent.md](api-003.md#source-d3ea04d7bb4f510e)
+
+- `LatentStyles` — Provides access to the default behaviors for latent styles in this document and
+
+## `docx.styles.style`
+
+Style object hierarchy.
+
+Full contract: [styles.style.md](api-003.md#source-382c966f01959966)
+
+- `BaseStyle` — Base class for the various types of style object, paragraph, character, table,
+- `CharacterStyle` — A character style.
+- `ParagraphStyle` — A paragraph style.
+- `StyleFactory(style_elm) -> BaseStyle` — Return `Style` object of appropriate `BaseStyle` subclass for `style_elm`.
+
+## `docx.styles.styles`
+
+Styles object, container for all objects in the styles part.
+
+Full contract: [styles.styles.md](api-003.md#source-28eb6ea5b5023bcb)
+
+- `Styles` — Provides access to the styles defined in a document.
+
+## `docx.table`
+
+The `Table` object and related proxy classes.
+
+Full contract: [table.md](api-003.md#source-ce74a9bf2d749312)
+
+- `Table` — Proxy class for a WordprocessingML ```` element.
+- `TableParent = 'Table | _Columns | _Rows'`
+
+## `docx.tableops`
+
+Narrow, guarded table operations (paper-docx).
+
+Full contract: [tableops.md](api-004.md#source-32cd0a2c56006650)
+
+- `check_install() -> None` — Refuse when paper-docx and python-docx are both installed.
+- `delete_row(table, row) -> None` — Delete row `row` (0-based).
+- `find_table(document, *, near_text, match='exact') -> 'Table'` — The table with one physical cell containing `near_text`.
+- `insert_row_after(table, row, values, *, copy_format_from=None) -> None` — Insert a row after `row` (0-based), copying formatting from `copy_format_from` and
+- `update_cell(table, row, column, new_text, *, tracked=False, author=None, date=None) -> ReplaceResult` — Replace one cell's visible text and return a `ReplaceResult` (0-based `row`,
+
+## `docx.text.font`
+
+Font-related proxy objects.
+
+Full contract: [text.font.md](api-004.md#source-c00c94b81e29f2ef)
+
+- `Font` — Proxy object for parent of a `` element and providing access to
+
+## `docx.text.hyperlink`
+
+Hyperlink-related proxy objects for python-docx, Hyperlink in particular.
+
+Full contract: [text.hyperlink.md](api-004.md#source-4214660cb391bec9)
+
+- `Hyperlink` — Proxy object wrapping a `` element.
+- `rollback_on_error(document, *participants) -> Generator[None, None, None]` — Restore the live package and named mutable proxies after an error.
+
+## `docx.text.pagebreak`
+
+Proxy objects related to rendered page-breaks.
+
+Full contract: [text.pagebreak.md](api-004.md#source-44dfc592f980e410)
+
+- `RenderedPageBreak` — A page-break inserted by Word during page-layout for print or display purposes.
+
+## `docx.text.paragraph`
+
+Paragraph-related proxy types.
+
+Full contract: [text.paragraph.md](api-004.md#source-2c1d902c346c5cdd)
+
+- `Paragraph` — Proxy object wrapping a `` element.
+
+## `docx.text.parfmt`
+
+Paragraph-related proxy types.
+
+Full contract: [text.parfmt.md](api-004.md#source-79ff58c0fb93748a)
+
+- `ParagraphFormat` — Provides access to paragraph formatting such as justification, indentation, line
+
+## `docx.text.run`
+
+Run-related proxy objects for python-docx, Run in particular.
+
+Full contract: [text.run.md](api-004.md#source-1b9a14c58e608abf)
+
+- `Run` — Proxy object wrapping `` element.
+- `rollback_xml_on_error(root) -> Generator[None, None, None]` — Restore one live XML tree after an error in a local compound edit.
+
+## `docx.text.tabstops`
+
+Tabstop-related proxy types.
+
+Full contract: [text.tabstops.md](api-004.md#source-eeaa259c323fdf65)
+
+- `TabStop` — An individual tab stop applying to a paragraph or style.
+- `TabStops` — A sequence of `TabStop` objects providing access to the tab stops of a paragraph
+
+## `docx.types`
+
+Abstract types used by `python-docx`.
+
+Full contract: [types.md](api-004.md#source-b2a7210fa4b39232)
+
+- `ProvidesStoryPart` — An object that provides access to the StoryPart.
+- `ProvidesXmlPart` — An object that provides access to its XmlPart.
+
+
+
+
+
+# `docx.links`
+
+Create and retarget hyperlinks on existing text.
+
+## `add_hyperlink`
+
+```python
+add_hyperlink(document: 'Document', span: 'Span', address: str) -> Hyperlink
+```
+
+Wrap `span`'s runs in a hyperlink pointing at `address`.
+
+Visible text stays; Word shows it in the Hyperlink character style, which this defines
+when the document lacks it. Refuses a protected document, a stale or foreign span, a span
+crossing paragraphs, a field result, an existing hyperlink, and a data-bound, locked or
+plain-text control surface.
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `require_span_owner`
+
+```python
+require_span_owner(document: 'Document', span: 'Span', *, argument: str = 'span') -> None
+```
+
+Refuse a live span captured from a different document package.
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+
+
+
+
+# `docx.notes`
+
+Create footnotes and endnotes, including the note body and the mark.
+
+## `add_endnote`
+
+```python
+add_endnote(document: 'Document', span: 'Span', text: str) -> int
+```
+
+Attach an endnote to `span` and return its note id.
+
+Creates the endnotes part on first use. Same refusals as `add_footnote`: protection, a
+stale or foreign span, a span outside the main body, and one inside a text box, a field
+result, or a data-bound, locked or plain-text control.
+
+## `add_footnote`
+
+```python
+add_footnote(document: 'Document', span: 'Span', text: str) -> int
+```
+
+Attach a footnote to `span` and return its note id.
+
+Creates the footnotes part on first use. Refuses a protected document, a stale or foreign
+span, a span outside the main body, and one inside a text box, a field result, or a
+data-bound, locked or plain-text control.
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `require_span_owner`
+
+```python
+require_span_owner(document: 'Document', span: 'Span', *, argument: str = 'span') -> None
+```
+
+Refuse a live span captured from a different document package.
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+
+
+
+
+# `docx.numbering`
+
+Numbering enumeration, application, and minimal authoring (paper-docx).
+
+## `NumberedParagraph`
+
+```python
+NumberedParagraph(story: str, index: int, num_id: int, level: int, text: str, table_cell: 'Optional[Tuple[int, int, int]]' = None) -> None
+```
+
+### `index`
+
+```python
+index: int
+```
+
+### `level`
+
+```python
+level: int
+```
+
+### `num_id`
+
+```python
+num_id: int
+```
+
+### `story`
+
+```python
+story: str
+```
+
+### `table_cell`
+
+```python
+table_cell: 'Optional[Tuple[int, int, int]]' = None
+```
+
+### `text`
+
+```python
+text: str
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `NumberingDefinition`
+
+```python
+NumberingDefinition(num_id: int, abstract_num_id: int, levels: Tuple[NumberingLevel, ...]) -> None
+```
+
+### `abstract_num_id`
+
+```python
+abstract_num_id: int
+```
+
+### `levels`
+
+```python
+levels: Tuple[NumberingLevel, ...]
+```
+
+### `num_id`
+
+```python
+num_id: int
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `NumberingLevel`
+
+```python
+NumberingLevel(level: int, num_fmt: Optional[str], lvl_text: Optional[str]) -> None
+```
+
+### `level`
+
+```python
+level: int
+```
+
+### `lvl_text`
+
+```python
+lvl_text: Optional[str]
+```
+
+### `num_fmt`
+
+```python
+num_fmt: Optional[str]
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `NumberingReport`
+
+```python
+NumberingReport(definitions: Tuple[NumberingDefinition, ...], numbered_paragraphs: Tuple[NumberedParagraph, ...]) -> None
+```
+
+### `definitions`
+
+```python
+definitions: Tuple[NumberingDefinition, ...]
+```
+
+### `numbered_paragraphs`
+
+```python
+numbered_paragraphs: Tuple[NumberedParagraph, ...]
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `apply_list_style`
+
+```python
+apply_list_style(paragraph: 'Paragraph', style_name: str) -> None
+```
+
+Apply the existing paragraph style `style_name` to `paragraph`.
+
+Refuses a protected document, a style the document does not define, and a style whose
+numbering binding does not resolve.
+
+## `apply_numbering`
+
+```python
+apply_numbering(paragraph: 'Paragraph', *, num_id: int, level: int = 0) -> None
+```
+
+Give `paragraph` the existing numbering definition `num_id` at `level`.
+
+Writes `w:numPr` into the paragraph's `w:pPr`. This never fabricates a definition; create
+one deliberately with `ensure_bullet_definition` or `ensure_decimal_definition`. Refuses a
+protected document, and a numId or level the document does not define.
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `ensure_bullet_definition`
+
+```python
+ensure_bullet_definition(document: 'Document') -> int
+```
+
+The numId of a canonical bullet-list definition, creating it when absent.
+
+Creates `/word/numbering.xml` and its relationship on first use. Reuse requires an exactly
+canonical definition, so a hand-edited one of the same name is left alone and a new
+definition is appended. Refuses a protected document.
+
+## `ensure_decimal_definition`
+
+```python
+ensure_decimal_definition(document: 'Document') -> int
+```
+
+The numId of a canonical decimal-list definition, creating it when absent.
+
+Same creation and exact-shape reuse rules as `ensure_bullet_definition`. Refuses a
+protected document.
+
+## `list_numbering`
+
+```python
+list_numbering(document: 'Document') -> NumberingReport
+```
+
+Every numbering definition and every numbered paragraph in `document`.
+
+Walks all story parts and reports text in the "current" view. Refuses when a paragraph
+resolves to a definition the document does not define, or to a level that definition
+omits.
+
+## `restart_numbering`
+
+```python
+restart_numbering(document: 'Document', *, num_id: int) -> int
+```
+
+A NEW numId continuing `num_id`'s formatting but restarting the count at 1.
+
+Paragraphs are not re-pointed; re-point them yourself with `apply_numbering`. Refuses a
+protected document, an unknown numId, a malformed `w:numId`, and a definition carrying
+`w:lvlOverride`.
+
+
+
+
+
+# `docx.opc.constants`
+
+Constant values related to the Open Packaging Convention.
+
+## `CONTENT_TYPE`
+
+Content type URIs (like MIME-types) that specify a part's format.
+
+### `BMP`
+
+```python
+BMP = 'image/bmp'
+```
+
+### `DML_CHART`
+
+```python
+DML_CHART = 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'
+```
+
+### `DML_CHARTSHAPES`
+
+```python
+DML_CHARTSHAPES = 'application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml'
+```
+
+### `DML_DIAGRAM_COLORS`
+
+```python
+DML_DIAGRAM_COLORS = 'application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml'
+```
+
+### `DML_DIAGRAM_DATA`
+
+```python
+DML_DIAGRAM_DATA = 'application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml'
+```
+
+### `DML_DIAGRAM_LAYOUT`
+
+```python
+DML_DIAGRAM_LAYOUT = 'application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml'
+```
+
+### `DML_DIAGRAM_STYLE`
+
+```python
+DML_DIAGRAM_STYLE = 'application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml'
+```
+
+### `GIF`
+
+```python
+GIF = 'image/gif'
+```
+
+### `JPEG`
+
+```python
+JPEG = 'image/jpeg'
+```
+
+### `MS_PHOTO`
+
+```python
+MS_PHOTO = 'image/vnd.ms-photo'
+```
+
+### `OFC_CUSTOM_PROPERTIES`
+
+```python
+OFC_CUSTOM_PROPERTIES = 'application/vnd.openxmlformats-officedocument.custom-properties+xml'
+```
+
+### `OFC_CUSTOM_XML_PROPERTIES`
+
+```python
+OFC_CUSTOM_XML_PROPERTIES = 'application/vnd.openxmlformats-officedocument.customXmlProperties+xml'
+```
+
+### `OFC_DRAWING`
+
+```python
+OFC_DRAWING = 'application/vnd.openxmlformats-officedocument.drawing+xml'
+```
+
+### `OFC_EXTENDED_PROPERTIES`
+
+```python
+OFC_EXTENDED_PROPERTIES = 'application/vnd.openxmlformats-officedocument.extended-properties+xml'
+```
+
+### `OFC_OLE_OBJECT`
+
+```python
+OFC_OLE_OBJECT = 'application/vnd.openxmlformats-officedocument.oleObject'
+```
+
+### `OFC_PACKAGE`
+
+```python
+OFC_PACKAGE = 'application/vnd.openxmlformats-officedocument.package'
+```
+
+### `OFC_THEME`
+
+```python
+OFC_THEME = 'application/vnd.openxmlformats-officedocument.theme+xml'
+```
+
+### `OFC_THEME_OVERRIDE`
+
+```python
+OFC_THEME_OVERRIDE = 'application/vnd.openxmlformats-officedocument.themeOverride+xml'
+```
+
+### `OFC_VML_DRAWING`
+
+```python
+OFC_VML_DRAWING = 'application/vnd.openxmlformats-officedocument.vmlDrawing'
+```
+
+### `OPC_CORE_PROPERTIES`
+
+```python
+OPC_CORE_PROPERTIES = 'application/vnd.openxmlformats-package.core-properties+xml'
+```
+
+### `OPC_DIGITAL_SIGNATURE_CERTIFICATE`
+
+```python
+OPC_DIGITAL_SIGNATURE_CERTIFICATE = 'application/vnd.openxmlformats-package.digital-signature-certificate'
+```
+
+### `OPC_DIGITAL_SIGNATURE_ORIGIN`
+
+```python
+OPC_DIGITAL_SIGNATURE_ORIGIN = 'application/vnd.openxmlformats-package.digital-signature-origin'
+```
+
+### `OPC_DIGITAL_SIGNATURE_XMLSIGNATURE`
+
+```python
+OPC_DIGITAL_SIGNATURE_XMLSIGNATURE = 'application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml'
+```
+
+### `OPC_RELATIONSHIPS`
+
+```python
+OPC_RELATIONSHIPS = 'application/vnd.openxmlformats-package.relationships+xml'
+```
+
+### `PML_COMMENTS`
+
+```python
+PML_COMMENTS = 'application/vnd.openxmlformats-officedocument.presentationml.comments+xml'
+```
+
+### `PML_COMMENT_AUTHORS`
+
+```python
+PML_COMMENT_AUTHORS = 'application/vnd.openxmlformats-officedocument.presentationml.commentAuthors+xml'
+```
+
+### `PML_HANDOUT_MASTER`
+
+```python
+PML_HANDOUT_MASTER = 'application/vnd.openxmlformats-officedocument.presentationml.handoutMaster+xml'
+```
+
+### `PML_NOTES_MASTER`
+
+```python
+PML_NOTES_MASTER = 'application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml'
+```
+
+### `PML_NOTES_SLIDE`
+
+```python
+PML_NOTES_SLIDE = 'application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml'
+```
+
+### `PML_PRESENTATION_MAIN`
+
+```python
+PML_PRESENTATION_MAIN = 'application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml'
+```
+
+### `PML_PRES_PROPS`
+
+```python
+PML_PRES_PROPS = 'application/vnd.openxmlformats-officedocument.presentationml.presProps+xml'
+```
+
+### `PML_PRINTER_SETTINGS`
+
+```python
+PML_PRINTER_SETTINGS = 'application/vnd.openxmlformats-officedocument.presentationml.printerSettings'
+```
+
+### `PML_SLIDE`
+
+```python
+PML_SLIDE = 'application/vnd.openxmlformats-officedocument.presentationml.slide+xml'
+```
+
+### `PML_SLIDESHOW_MAIN`
+
+```python
+PML_SLIDESHOW_MAIN = 'application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml'
+```
+
+### `PML_SLIDE_LAYOUT`
+
+```python
+PML_SLIDE_LAYOUT = 'application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml'
+```
+
+### `PML_SLIDE_MASTER`
+
+```python
+PML_SLIDE_MASTER = 'application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml'
+```
+
+### `PML_SLIDE_UPDATE_INFO`
+
+```python
+PML_SLIDE_UPDATE_INFO = 'application/vnd.openxmlformats-officedocument.presentationml.slideUpdateInfo+xml'
+```
+
+### `PML_TABLE_STYLES`
+
+```python
+PML_TABLE_STYLES = 'application/vnd.openxmlformats-officedocument.presentationml.tableStyles+xml'
+```
+
+### `PML_TAGS`
+
+```python
+PML_TAGS = 'application/vnd.openxmlformats-officedocument.presentationml.tags+xml'
+```
+
+### `PML_TEMPLATE_MAIN`
+
+```python
+PML_TEMPLATE_MAIN = 'application/vnd.openxmlformats-officedocument.presentationml.template.main+xml'
+```
+
+### `PML_VIEW_PROPS`
+
+```python
+PML_VIEW_PROPS = 'application/vnd.openxmlformats-officedocument.presentationml.viewProps+xml'
+```
+
+### `PNG`
+
+```python
+PNG = 'image/png'
+```
+
+### `SML_CALC_CHAIN`
+
+```python
+SML_CALC_CHAIN = 'application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml'
+```
+
+### `SML_CHARTSHEET`
+
+```python
+SML_CHARTSHEET = 'application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml'
+```
+
+### `SML_COMMENTS`
+
+```python
+SML_COMMENTS = 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml'
+```
+
+### `SML_CONNECTIONS`
+
+```python
+SML_CONNECTIONS = 'application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml'
+```
+
+### `SML_CUSTOM_PROPERTY`
+
+```python
+SML_CUSTOM_PROPERTY = 'application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty'
+```
+
+### `SML_DIALOGSHEET`
+
+```python
+SML_DIALOGSHEET = 'application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml'
+```
+
+### `SML_EXTERNAL_LINK`
+
+```python
+SML_EXTERNAL_LINK = 'application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml'
+```
+
+### `SML_PIVOT_CACHE_DEFINITION`
+
+```python
+SML_PIVOT_CACHE_DEFINITION = 'application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml'
+```
+
+### `SML_PIVOT_CACHE_RECORDS`
+
+```python
+SML_PIVOT_CACHE_RECORDS = 'application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml'
+```
+
+### `SML_PIVOT_TABLE`
+
+```python
+SML_PIVOT_TABLE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml'
+```
+
+### `SML_PRINTER_SETTINGS`
+
+```python
+SML_PRINTER_SETTINGS = 'application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings'
+```
+
+### `SML_QUERY_TABLE`
+
+```python
+SML_QUERY_TABLE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml'
+```
+
+### `SML_REVISION_HEADERS`
+
+```python
+SML_REVISION_HEADERS = 'application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml'
+```
+
+### `SML_REVISION_LOG`
+
+```python
+SML_REVISION_LOG = 'application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml'
+```
+
+### `SML_SHARED_STRINGS`
+
+```python
+SML_SHARED_STRINGS = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml'
+```
+
+### `SML_SHEET`
+
+```python
+SML_SHEET = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
+```
+
+### `SML_SHEET_MAIN`
+
+```python
+SML_SHEET_MAIN = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml'
+```
+
+### `SML_SHEET_METADATA`
+
+```python
+SML_SHEET_METADATA = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml'
+```
+
+### `SML_STYLES`
+
+```python
+SML_STYLES = 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml'
+```
+
+### `SML_TABLE`
+
+```python
+SML_TABLE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml'
+```
+
+### `SML_TABLE_SINGLE_CELLS`
+
+```python
+SML_TABLE_SINGLE_CELLS = 'application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml'
+```
+
+### `SML_TEMPLATE_MAIN`
+
+```python
+SML_TEMPLATE_MAIN = 'application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml'
+```
+
+### `SML_USER_NAMES`
+
+```python
+SML_USER_NAMES = 'application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml'
+```
+
+### `SML_VOLATILE_DEPENDENCIES`
+
+```python
+SML_VOLATILE_DEPENDENCIES = 'application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml'
+```
+
+### `SML_WORKSHEET`
+
+```python
+SML_WORKSHEET = 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml'
+```
+
+### `TIFF`
+
+```python
+TIFF = 'image/tiff'
+```
+
+### `WML_COMMENTS`
+
+```python
+WML_COMMENTS = 'application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml'
+```
+
+### `WML_DOCUMENT`
+
+```python
+WML_DOCUMENT = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
+```
+
+### `WML_DOCUMENT_GLOSSARY`
+
+```python
+WML_DOCUMENT_GLOSSARY = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml'
+```
+
+### `WML_DOCUMENT_MAIN`
+
+```python
+WML_DOCUMENT_MAIN = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml'
+```
+
+### `WML_ENDNOTES`
+
+```python
+WML_ENDNOTES = 'application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml'
+```
+
+### `WML_FONT_TABLE`
+
+```python
+WML_FONT_TABLE = 'application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml'
+```
+
+### `WML_FOOTER`
+
+```python
+WML_FOOTER = 'application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml'
+```
+
+### `WML_FOOTNOTES`
+
+```python
+WML_FOOTNOTES = 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml'
+```
+
+### `WML_HEADER`
+
+```python
+WML_HEADER = 'application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml'
+```
+
+### `WML_NUMBERING`
+
+```python
+WML_NUMBERING = 'application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml'
+```
+
+### `WML_PRINTER_SETTINGS`
+
+```python
+WML_PRINTER_SETTINGS = 'application/vnd.openxmlformats-officedocument.wordprocessingml.printerSettings'
+```
+
+### `WML_SETTINGS`
+
+```python
+WML_SETTINGS = 'application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml'
+```
+
+### `WML_STYLES`
+
+```python
+WML_STYLES = 'application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml'
+```
+
+### `WML_WEB_SETTINGS`
+
+```python
+WML_WEB_SETTINGS = 'application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml'
+```
+
+### `XML`
+
+```python
+XML = 'application/xml'
+```
+
+### `X_EMF`
+
+```python
+X_EMF = 'image/x-emf'
+```
+
+### `X_FONTDATA`
+
+```python
+X_FONTDATA = 'application/x-fontdata'
+```
+
+### `X_FONT_TTF`
+
+```python
+X_FONT_TTF = 'application/x-font-ttf'
+```
+
+### `X_WMF`
+
+```python
+X_WMF = 'image/x-wmf'
+```
+
+## `NAMESPACE`
+
+Constant values for OPC XML namespaces.
+
+### `DML_WORDPROCESSING_DRAWING`
+
+```python
+DML_WORDPROCESSING_DRAWING = 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing'
+```
+
+### `OFC_RELATIONSHIPS`
+
+```python
+OFC_RELATIONSHIPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'
+```
+
+### `OPC_CONTENT_TYPES`
+
+```python
+OPC_CONTENT_TYPES = 'http://schemas.openxmlformats.org/package/2006/content-types'
+```
+
+### `OPC_RELATIONSHIPS`
+
+```python
+OPC_RELATIONSHIPS = 'http://schemas.openxmlformats.org/package/2006/relationships'
+```
+
+### `WML_MAIN`
+
+```python
+WML_MAIN = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'
+```
+
+## `RELATIONSHIP_TARGET_MODE`
+
+Open XML relationship target modes.
+
+### `EXTERNAL`
+
+```python
+EXTERNAL = 'External'
+```
+
+### `INTERNAL`
+
+```python
+INTERNAL = 'Internal'
+```
+
+## `RELATIONSHIP_TYPE`
+
+### `AUDIO`
+
+```python
+AUDIO = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio'
+```
+
+### `A_F_CHUNK`
+
+```python
+A_F_CHUNK = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/aFChunk'
+```
+
+### `CALC_CHAIN`
+
+```python
+CALC_CHAIN = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain'
+```
+
+### `CERTIFICATE`
+
+```python
+CERTIFICATE = 'http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/certificate'
+```
+
+### `CHART`
+
+```python
+CHART = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart'
+```
+
+### `CHARTSHEET`
+
+```python
+CHARTSHEET = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet'
+```
+
+### `CHART_USER_SHAPES`
+
+```python
+CHART_USER_SHAPES = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartUserShapes'
+```
+
+### `COMMENTS`
+
+```python
+COMMENTS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments'
+```
+
+### `COMMENT_AUTHORS`
+
+```python
+COMMENT_AUTHORS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/commentAuthors'
+```
+
+### `CONNECTIONS`
+
+```python
+CONNECTIONS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections'
+```
+
+### `CONTROL`
+
+```python
+CONTROL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/control'
+```
+
+### `CORE_PROPERTIES`
+
+```python
+CORE_PROPERTIES = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties'
+```
+
+### `CUSTOM_PROPERTIES`
+
+```python
+CUSTOM_PROPERTIES = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties'
+```
+
+### `CUSTOM_PROPERTY`
+
+```python
+CUSTOM_PROPERTY = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/customProperty'
+```
+
+### `CUSTOM_XML`
+
+```python
+CUSTOM_XML = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml'
+```
+
+### `CUSTOM_XML_PROPS`
+
+```python
+CUSTOM_XML_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps'
+```
+
+### `DIAGRAM_COLORS`
+
+```python
+DIAGRAM_COLORS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramColors'
+```
+
+### `DIAGRAM_DATA`
+
+```python
+DIAGRAM_DATA = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramData'
+```
+
+### `DIAGRAM_LAYOUT`
+
+```python
+DIAGRAM_LAYOUT = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramLayout'
+```
+
+### `DIAGRAM_QUICK_STYLE`
+
+```python
+DIAGRAM_QUICK_STYLE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramQuickStyle'
+```
+
+### `DIALOGSHEET`
+
+```python
+DIALOGSHEET = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet'
+```
+
+### `DRAWING`
+
+```python
+DRAWING = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing'
+```
+
+### `ENDNOTES`
+
+```python
+ENDNOTES = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes'
+```
+
+### `EXTENDED_PROPERTIES`
+
+```python
+EXTENDED_PROPERTIES = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties'
+```
+
+### `EXTERNAL_LINK`
+
+```python
+EXTERNAL_LINK = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink'
+```
+
+### `FONT`
+
+```python
+FONT = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/font'
+```
+
+### `FONT_TABLE`
+
+```python
+FONT_TABLE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable'
+```
+
+### `FOOTER`
+
+```python
+FOOTER = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer'
+```
+
+### `FOOTNOTES`
+
+```python
+FOOTNOTES = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes'
+```
+
+### `GLOSSARY_DOCUMENT`
+
+```python
+GLOSSARY_DOCUMENT = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/glossaryDocument'
+```
+
+### `HANDOUT_MASTER`
+
+```python
+HANDOUT_MASTER = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/handoutMaster'
+```
+
+### `HEADER`
+
+```python
+HEADER = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/header'
+```
+
+### `HYPERLINK`
+
+```python
+HYPERLINK = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink'
+```
+
+### `IMAGE`
+
+```python
+IMAGE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image'
+```
+
+### `NOTES_MASTER`
+
+```python
+NOTES_MASTER = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster'
+```
+
+### `NOTES_SLIDE`
+
+```python
+NOTES_SLIDE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide'
+```
+
+### `NUMBERING`
+
+```python
+NUMBERING = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering'
+```
+
+### `OFFICE_DOCUMENT`
+
+```python
+OFFICE_DOCUMENT = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument'
+```
+
+### `OLE_OBJECT`
+
+```python
+OLE_OBJECT = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject'
+```
+
+### `ORIGIN`
+
+```python
+ORIGIN = 'http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/origin'
+```
+
+### `PACKAGE`
+
+```python
+PACKAGE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/package'
+```
+
+### `PIVOT_CACHE_DEFINITION`
+
+```python
+PIVOT_CACHE_DEFINITION = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition'
+```
+
+### `PIVOT_CACHE_RECORDS`
+
+```python
+PIVOT_CACHE_RECORDS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/spreadsheetml/pivotCacheRecords'
+```
+
+### `PIVOT_TABLE`
+
+```python
+PIVOT_TABLE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotTable'
+```
+
+### `PRES_PROPS`
+
+```python
+PRES_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/presProps'
+```
+
+### `PRINTER_SETTINGS`
+
+```python
+PRINTER_SETTINGS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings'
+```
+
+### `QUERY_TABLE`
+
+```python
+QUERY_TABLE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/queryTable'
+```
+
+### `REVISION_HEADERS`
+
+```python
+REVISION_HEADERS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/revisionHeaders'
+```
+
+### `REVISION_LOG`
+
+```python
+REVISION_LOG = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/revisionLog'
+```
+
+### `SETTINGS`
+
+```python
+SETTINGS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings'
+```
+
+### `SHARED_STRINGS`
+
+```python
+SHARED_STRINGS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings'
+```
+
+### `SHEET_METADATA`
+
+```python
+SHEET_METADATA = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata'
+```
+
+### `SIGNATURE`
+
+```python
+SIGNATURE = 'http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/signature'
+```
+
+### `SLIDE`
+
+```python
+SLIDE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide'
+```
+
+### `SLIDE_LAYOUT`
+
+```python
+SLIDE_LAYOUT = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout'
+```
+
+### `SLIDE_MASTER`
+
+```python
+SLIDE_MASTER = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster'
+```
+
+### `SLIDE_UPDATE_INFO`
+
+```python
+SLIDE_UPDATE_INFO = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideUpdateInfo'
+```
+
+### `STYLES`
+
+```python
+STYLES = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles'
+```
+
+### `TABLE`
+
+```python
+TABLE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table'
+```
+
+### `TABLE_SINGLE_CELLS`
+
+```python
+TABLE_SINGLE_CELLS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/tableSingleCells'
+```
+
+### `TABLE_STYLES`
+
+```python
+TABLE_STYLES = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/tableStyles'
+```
+
+### `TAGS`
+
+```python
+TAGS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/tags'
+```
+
+### `THEME`
+
+```python
+THEME = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme'
+```
+
+### `THEME_OVERRIDE`
+
+```python
+THEME_OVERRIDE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/themeOverride'
+```
+
+### `THUMBNAIL`
+
+```python
+THUMBNAIL = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail'
+```
+
+### `USERNAMES`
+
+```python
+USERNAMES = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/usernames'
+```
+
+### `VIDEO`
+
+```python
+VIDEO = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/video'
+```
+
+### `VIEW_PROPS`
+
+```python
+VIEW_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/viewProps'
+```
+
+### `VML_DRAWING`
+
+```python
+VML_DRAWING = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing'
+```
+
+### `VOLATILE_DEPENDENCIES`
+
+```python
+VOLATILE_DEPENDENCIES = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/volatileDependencies'
+```
+
+### `WEB_SETTINGS`
+
+```python
+WEB_SETTINGS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings'
+```
+
+### `WORKSHEET_SOURCE`
+
+```python
+WORKSHEET_SOURCE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheetSource'
+```
+
+### `XML_MAPS`
+
+```python
+XML_MAPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/xmlMaps'
+```
+
+
+
+
+
+# `docx.opc.coreprops`
+
+Provides CoreProperties, Dublin-Core attributes of the document.
+
+## `CoreProperties`
+
+```python
+CoreProperties(element: CT_CoreProperties)
+```
+
+Corresponds to part named ``/docProps/core.xml``, containing the core document
+properties for this document package.
+
+### `author`
+
+```python
+author
+```
+
+### `category`
+
+```python
+category
+```
+
+### `comments`
+
+```python
+comments
+```
+
+### `content_status`
+
+```python
+content_status
+```
+
+### `created`
+
+```python
+created
+```
+
+### `identifier`
+
+```python
+identifier
+```
+
+### `keywords`
+
+```python
+keywords
+```
+
+### `language`
+
+```python
+language
+```
+
+### `last_modified_by`
+
+```python
+last_modified_by
+```
+
+### `last_printed`
+
+```python
+last_printed
+```
+
+### `modified`
+
+```python
+modified
+```
+
+### `revision`
+
+```python
+revision
+```
+
+### `subject`
+
+```python
+subject
+```
+
+### `title`
+
+```python
+title
+```
+
+### `version`
+
+```python
+version
+```
+
+
+
+
+
+# `docx.opc.exceptions`
+
+Exceptions specific to python-opc.
+
+## `OpcError`
+
+Bases: `Exception`
+
+Base error class for python-opc.
+
+## `PackageNotFoundError`
+
+Bases: `OpcError`
+
+Raised when a package cannot be found at the specified path.
+
+
+
+
+
+# `docx.opc.oxml`
+
+Temporary stand-in for main oxml module.
+
+## `BaseOxmlElement`
+
+Bases: `ElementBase`
+
+Base class for all custom element classes, to add standardized behavior to all
+classes in one place.
+
+### `xml`
+
+```python
+xml: str
+```
+
+Return XML string for this element, suitable for testing purposes.
+
+Pretty printed for readability and without an XML declaration at the top.
+
+## `CT_Default`
+
+Bases: `BaseOxmlElement`
+
+`` element that appears in `[Content_Types].xml` part.
+
+Used to specify a default content type to be applied to any part with the specified extension.
+
+### `content_type`
+
+```python
+content_type
+```
+
+String held in the ``ContentType`` attribute of this ````
+element.
+
+### `extension`
+
+```python
+extension
+```
+
+String held in the ``Extension`` attribute of this ```` element.
+
+### `new`
+
+```python
+new(ext: str, content_type: str)
+```
+
+Return a new ```` element with attributes set to parameter values.
+
+## `CT_Override`
+
+Bases: `BaseOxmlElement`
+
+```` element, specifying the content type to be applied for a part with
+the specified partname.
+
+### `content_type`
+
+```python
+content_type
+```
+
+String held in the ``ContentType`` attribute of this ````
+element.
+
+### `new`
+
+```python
+new(partname, content_type)
+```
+
+Return a new ```` element with attributes set to parameter values.
+
+### `partname`
+
+```python
+partname
+```
+
+String held in the ``PartName`` attribute of this ```` element.
+
+## `CT_Relationship`
+
+Bases: `BaseOxmlElement`
+
+`` element, representing a single relationship from source to target part.
+
+### `new`
+
+```python
+new(rId: str, reltype: str, target: str, target_mode: str = RTM.INTERNAL)
+```
+
+Return a new ```` element.
+
+### `rId`
+
+```python
+rId
+```
+
+String held in the ``Id`` attribute of this ```` element.
+
+### `reltype`
+
+```python
+reltype
+```
+
+String held in the ``Type`` attribute of this ```` element.
+
+### `target_mode`
+
+```python
+target_mode
+```
+
+String held in the ``TargetMode`` attribute of this ````
+element, either ``Internal`` or ``External``.
+
+Defaults to ``Internal``.
+
+### `target_ref`
+
+```python
+target_ref
+```
+
+String held in the ``Target`` attribute of this ````
+element.
+
+## `CT_Relationships`
+
+Bases: `BaseOxmlElement`
+
+```` element, the root element in a .rels file.
+
+### `Relationship_lst`
+
+```python
+Relationship_lst
+```
+
+Return a list containing all the ```` child elements.
+
+### `add_rel`
+
+```python
+add_rel(rId: str, reltype: str, target: str, is_external: bool = False)
+```
+
+Add a child ```` element with attributes set according to
+parameter values.
+
+### `new`
+
+```python
+new() -> CT_Relationships
+```
+
+Return a new ```` element.
+
+### `xml`
+
+```python
+xml
+```
+
+Return XML string for this element, suitable for saving in a .rels stream,
+not pretty printed and with an XML declaration at the top.
+
+## `CT_Types`
+
+Bases: `BaseOxmlElement`
+
+```` element, the container element for Default and Override elements in
+[Content_Types].xml.
+
+### `add_default`
+
+```python
+add_default(ext, content_type)
+```
+
+Add a child ```` element with attributes set to parameter values.
+
+### `add_override`
+
+```python
+add_override(partname, content_type)
+```
+
+Add a child ```` element with attributes set to parameter
+values.
+
+### `defaults`
+
+```python
+defaults
+```
+
+### `new`
+
+```python
+new()
+```
+
+Return a new ```` element.
+
+### `overrides`
+
+```python
+overrides
+```
+
+## `ct_namespace`
+
+```python
+ct_namespace = element_class_lookup.get_namespace(nsmap['ct'])
+```
+
+## `element_class_lookup`
+
+```python
+element_class_lookup = etree.ElementNamespaceClassLookup()
+```
+
+## `nsmap`
+
+```python
+nsmap = {'ct': NS.OPC_CONTENT_TYPES, 'pr': NS.OPC_RELATIONSHIPS, 'r': NS.OFC_RELATIONSHIPS}
+```
+
+## `oxml_parser`
+
+```python
+oxml_parser = etree.XMLParser(remove_blank_text=True, resolve_entities=False)
+```
+
+## `parse_xml`
+
+```python
+parse_xml(text: str) -> etree._Element
+```
+
+`etree.fromstring()` replacement that uses oxml parser.
+
+## `pr_namespace`
+
+```python
+pr_namespace = element_class_lookup.get_namespace(nsmap['pr'])
+```
+
+## `qn`
+
+```python
+qn(tag: str) -> str
+```
+
+Stands for "qualified name", a utility function to turn a namespace prefixed tag
+name into a Clark-notation qualified tag name for lxml.
+
+For
+example, ``qn('p:cSld')`` returns ``'{http://schemas.../main}cSld'``.
+
+## `serialize_for_reading`
+
+```python
+serialize_for_reading(element: etree._Element) -> str
+```
+
+Serialize `element` to human-readable XML suitable for tests.
+
+No XML declaration.
+
+## `serialize_part_xml`
+
+```python
+serialize_part_xml(part_elm: etree._Element) -> bytes
+```
+
+Serialize `part_elm` etree element to XML suitable for storage as an XML part.
+
+That is to say, no insignificant whitespace added for readability, and an
+appropriate XML declaration added with UTF-8 encoding specified.
+
+
+
+
+
+# `docx.opc.package`
+
+Objects that implement reading and writing OPC packages.
+
+## `OpcPackage`
+
+Main API class for `python-opc`.
+
+A new instance is constructed by calling the `open` class method with a path
+to a package file or file-like object containing one.
+
+### `after_unmarshal`
+
+```python
+after_unmarshal()
+```
+
+Entry point for any post-unmarshaling processing.
+
+May be overridden by subclasses without forwarding call to super.
+
+### `core_properties`
+
+```python
+core_properties: CoreProperties
+```
+
+`CoreProperties` object providing read/write access to the Dublin Core
+properties for this document.
+
+### `iter_parts`
+
+```python
+iter_parts() -> Iterator[Part]
+```
+
+Generate exactly one reference to each of the parts in the package by
+performing a depth-first traversal of the rels graph.
+
+### `iter_rels`
+
+```python
+iter_rels() -> Iterator[_Relationship]
+```
+
+Generate exactly one reference to each relationship in the package by
+performing a depth-first traversal of the rels graph.
+
+### `load_rel`
+
+```python
+load_rel(reltype: str, target: Part | str, rId: str, is_external: bool = False)
+```
+
+Return newly added `_Relationship` instance of `reltype` between this part
+and `target` with key `rId`.
+
+Target mode is set to ``RTM.EXTERNAL`` if `is_external` is `True`. Intended for
+use during load from a serialized package, where the rId is well known. Other
+methods exist for adding a new relationship to the package during processing.
+
+### `main_document_part`
+
+```python
+main_document_part
+```
+
+Return a reference to the main document part for this package.
+
+Examples include a document part for a WordprocessingML package, a presentation
+part for a PresentationML package, or a workbook part for a SpreadsheetML
+package.
+
+### `next_partname`
+
+```python
+next_partname(template: str) -> PackURI
+```
+
+Return a `PackURI` instance representing partname matching `template`.
+
+The returned part-name has the next available numeric suffix to distinguish it
+from other parts of its type. `template` is a printf (%)-style template string
+containing a single replacement item, a '%d' to be used to insert the integer
+portion of the partname. Example: "/word/header%d.xml"
+
+### `open`
+
+```python
+open(pkg_file: str | IO[bytes]) -> Self
+```
+
+Return an `OpcPackage` instance loaded with the contents of `pkg_file`.
+
+### `part_related_by`
+
+```python
+part_related_by(reltype: str) -> Part
+```
+
+Return part to which this package has a relationship of `reltype`.
+
+Raises `KeyError` if no such relationship is found and `ValueError` if more than
+one such relationship is found.
+
+### `parts`
+
+```python
+parts: list[Part]
+```
+
+Return a list containing a reference to each of the parts in this package.
+
+### `relate_to`
+
+```python
+relate_to(part: Part, reltype: str)
+```
+
+Return rId key of new or existing relationship to `part`.
+
+If a relationship of `reltype` to `part` already exists, its rId is returned. Otherwise a
+new relationship is created and that rId is returned.
+
+### `rels`
+
+```python
+rels()
+```
+
+Return a reference to the `Relationships` instance holding the collection of
+relationships for this package.
+
+### `save`
+
+```python
+save(pkg_file: str | IO[bytes])
+```
+
+Save this package to `pkg_file`, a path or a stream positioned at byte zero.
+
+Serializes to a sibling temp file, reparses it to confirm it opens, then replaces the
+destination. A failed save leaves the original untouched and never leaves behind a
+package Word cannot open. An existing destination keeps its permission bits. A symlink
+destination is followed and its target replaced.
+
+Raises `MalformedPackageError` when the serialized output will not reparse, and
+`OSError` for a stream in append mode, a stream positioned past byte zero, or a
+destination symlink that moves mid-save.
+
+## `Unmarshaller`
+
+Hosts static methods for unmarshalling a package from a `PackageReader`.
+
+### `unmarshal`
+
+```python
+unmarshal(pkg_reader, package, part_factory)
+```
+
+Construct graph of parts and realized relationships based on the contents of
+`pkg_reader`, delegating construction of each part to `part_factory`.
+
+Package relationships are added to `pkg`.
+
+
+
+
+
+# `docx.opc.packuri`
+
+Provides the PackURI value type.
+
+## `CONTENT_TYPES_URI`
+
+```python
+CONTENT_TYPES_URI = PackURI('/[Content_Types].xml')
+```
+
+## `PACKAGE_URI`
+
+```python
+PACKAGE_URI = PackURI('/')
+```
+
+## `PackURI`
+
+Bases: `str`
+
+Provides access to pack URI components such as the baseURI and the filename slice.
+
+Behaves as `str` otherwise.
+
+### `baseURI`
+
+```python
+baseURI: str
+```
+
+The base URI of this pack URI, the directory portion, roughly speaking.
+
+E.g. ``'/ppt/slides'`` for ``'/ppt/slides/slide1.xml'``. For the package pseudo-
+partname '/', baseURI is '/'.
+
+### `ext`
+
+```python
+ext: str
+```
+
+The extension portion of this pack URI, e.g. ``'xml'`` for ``'/word/document.xml'``.
+
+Note the period is not included.
+
+### `filename`
+
+```python
+filename
+```
+
+The "filename" portion of this pack URI, e.g. ``'slide1.xml'`` for
+``'/ppt/slides/slide1.xml'``.
+
+For the package pseudo-partname '/', filename is ''.
+
+### `from_rel_ref`
+
+```python
+from_rel_ref(baseURI: str, relative_ref: str) -> PackURI
+```
+
+The absolute PackURI formed by translating `relative_ref` onto `baseURI`.
+
+### `idx`
+
+```python
+idx
+```
+
+Return partname index as integer for tuple partname or None for singleton
+partname, e.g. ``21`` for ``'/ppt/slides/slide21.xml'`` and `None` for
+``'/ppt/presentation.xml'``.
+
+### `membername`
+
+```python
+membername
+```
+
+The pack URI with the leading slash stripped off, the form used as the Zip
+file membername for the package item.
+
+Returns '' for the package pseudo-partname '/'.
+
+### `relative_ref`
+
+```python
+relative_ref(baseURI: str)
+```
+
+Return string containing relative reference to package item from `baseURI`.
+
+E.g. PackURI('/ppt/slideLayouts/slideLayout1.xml') would return
+'../slideLayouts/slideLayout1.xml' for baseURI '/ppt/slides'.
+
+### `rels_uri`
+
+```python
+rels_uri
+```
+
+The pack URI of the .rels part corresponding to the current pack URI.
+
+Only produces sensible output if the pack URI is a partname or the package
+pseudo-partname '/'.
+
+
+
+
+
+# `docx.opc.part`
+
+Open Packaging Convention (OPC) objects related to package parts.
+
+## `Part`
+
+```python
+Part(partname: PackURI, content_type: str, blob: bytes | None = None, package: Package | None = None)
+```
+
+Base class for package parts.
+
+Provides common properties and methods, but intended to be subclassed in client code
+to implement specific part behaviors.
+
+### `after_unmarshal`
+
+```python
+after_unmarshal()
+```
+
+Entry point for post-unmarshaling processing, for example to parse the part
+XML.
+
+May be overridden by subclasses without forwarding call to super.
+
+### `before_marshal`
+
+```python
+before_marshal()
+```
+
+Entry point for pre-serialization processing, for example to finalize part
+naming if necessary.
+
+May be overridden by subclasses without forwarding call to super.
+
+### `blob`
+
+```python
+blob: bytes
+```
+
+Contents of this package part as a sequence of bytes.
+
+May be text or binary. Intended to be overridden by subclasses. Default behavior
+is to return load blob.
+
+### `content_type`
+
+```python
+content_type
+```
+
+Content type of this part.
+
+### `drop_rel`
+
+```python
+drop_rel(rId: str)
+```
+
+Remove the relationship identified by `rId` if its reference count is less
+than 2.
+
+Relationships with a reference count of 0 are implicit relationships.
+
+### `load`
+
+```python
+load(partname: PackURI, content_type: str, blob: bytes, package: Package)
+```
+
+### `load_rel`
+
+```python
+load_rel(reltype: str, target: Part | str, rId: str, is_external: bool = False)
+```
+
+Return newly added `_Relationship` instance of `reltype`.
+
+The new relationship relates the `target` part to this part with key `rId`.
+
+Target mode is set to ``RTM.EXTERNAL`` if `is_external` is `True`. Intended for
+use during load from a serialized package, where the rId is well-known. Other
+methods exist for adding a new relationship to a part when manipulating a part.
+
+### `package`
+
+```python
+package
+```
+
+`OpcPackage` instance this part belongs to.
+
+### `part_related_by`
+
+```python
+part_related_by(reltype: str) -> Part
+```
+
+Return part to which this part has a relationship of `reltype`.
+
+Raises `KeyError` if no such relationship is found and `ValueError` if more than
+one such relationship is found. Provides ability to resolve implicitly related
+part, such as Slide -> SlideLayout.
+
+### `partname`
+
+```python
+partname
+```
+
+`PackURI` instance holding partname of this part, e.g.
+'/ppt/slides/slide1.xml'.
+
+### `relate_to`
+
+```python
+relate_to(target: Part | str, reltype: str, is_external: bool = False) -> str
+```
+
+Return rId key of relationship of `reltype` to `target`.
+
+The returned `rId` is from an existing relationship if there is one, otherwise a
+new relationship is created.
+
+### `related_parts`
+
+```python
+related_parts
+```
+
+Dictionary mapping related parts by rId, so child objects can resolve
+explicit relationships present in the part XML, e.g. sldIdLst to a specific
+`Slide` instance.
+
+### `rels`
+
+```python
+rels()
+```
+
+`Relationships` instance holding the relationships for this part.
+
+### `target_ref`
+
+```python
+target_ref(rId: str) -> str
+```
+
+Return URL contained in target ref of relationship identified by `rId`.
+
+## `PartFactory`
+
+Provides a way for client code to specify a subclass of `Part` to be constructed
+by `Unmarshaller` based on its content type and/or a custom callable.
+
+Setting ``PartFactory.part_class_selector`` to a callable object will cause that
+object to be called with the parameters ``content_type, reltype``, once for each
+part in the package. If the callable returns an object, it is used as the class for
+that part. If it returns `None`, part class selection falls back to the content type
+map defined in ``PartFactory.part_type_for``. If no class is returned from either of
+these, the class contained in ``PartFactory.default_part_type`` is used to construct
+the part, which is by default ``opc.package.Part``.
+
+### `default_part_type`
+
+```python
+default_part_type = Part
+```
+
+### `part_class_selector`
+
+```python
+part_class_selector: Callable[[str, str], Type[Part] | None] | None
+```
+
+### `part_type_for`
+
+```python
+part_type_for: dict[str, Type[Part]] = {}
+```
+
+## `XmlPart`
+
+```python
+XmlPart(partname: PackURI, content_type: str, element: BaseOxmlElement, package: Package)
+```
+
+Bases: `Part`
+
+Base class for package parts containing an XML payload, which is most of them.
+
+Provides additional methods to the `Part` base class that take care of parsing and
+reserializing the XML payload and managing relationships to other parts.
+
+### `blob`
+
+```python
+blob
+```
+
+### `element`
+
+```python
+element
+```
+
+The root XML element of this XML part.
+
+### `load`
+
+```python
+load(partname: PackURI, content_type: str, blob: bytes, package: Package)
+```
+
+### `part`
+
+```python
+part
+```
+
+Part of the parent protocol, "children" of the document will not know the
+part that contains them so must ask their parent object.
+
+That chain of delegation ends here for child objects.
+
+
+
+
+
+# `docx.opc.parts.coreprops`
+
+Core properties part, corresponds to ``/docProps/core.xml`` part in package.
+
+## `CorePropertiesPart`
+
+Bases: `XmlPart`
+
+Corresponds to part named ``/docProps/core.xml``.
+
+The "core" is short for "Dublin Core" and contains document metadata relatively common across
+documents of all types, not just DOCX.
+
+### `core_properties`
+
+```python
+core_properties
+```
+
+A `CoreProperties` object providing read/write access to the core properties
+contained in this core properties part.
+
+### `default`
+
+```python
+default(package: OpcPackage)
+```
+
+Return a new `CorePropertiesPart` object initialized with default values for
+its base properties.
+
+
+
+
+
+# `docx.opc.phys_pkg`
+
+Provides a general interface to a `physical` OPC package, such as a zip file.
+
+## `GuardedZipReader`
+
+```python
+GuardedZipReader(zip_file: ZipFile)
+```
+
+Validate and stream every member of an already-open ``ZipFile``.
+
+Construction fully validates the archive and caches member bytes.
+This makes ordinary ``Document()`` opens and package-kernel reads share the
+same validation, including for members not reachable from OPC relationships.
+
+### `order`
+
+```python
+order: Tuple[str, ...]
+```
+
+Member names in central-directory order.
+
+### `read`
+
+```python
+read(name: str) -> bytes
+```
+
+Return validated bytes for member `name`.
+
+### `read_all`
+
+```python
+read_all() -> Tuple[Dict[str, bytes], List[str]]
+```
+
+Return a copy of validated parts and their archive order.
+
+## `PhysPkgReader`
+
+Factory for physical package reader objects.
+
+## `PhysPkgWriter`
+
+Factory for physical package writer objects.
+
+## `preflight_zip`
+
+```python
+preflight_zip(source: object) -> None
+```
+
+Validate central-directory metadata before ``ZipFile`` opens.
+
+This preflight reads only fixed-size records and skips variable fields
+without retaining them.
+
+
+
+
+
+# `docx.opc.pkgreader`
+
+Low-level, read-only API to a serialized Open Packaging Convention (OPC) package.
+
+## `PackageReader`
+
+```python
+PackageReader(content_types, pkg_srels, sparts)
+```
+
+Provides access to the contents of a zip-format OPC package via its
+`serialized_parts` and `pkg_srels` attributes.
+
+### `from_file`
+
+```python
+from_file(pkg_file)
+```
+
+A `PackageReader` loaded from `pkg_file`, with the package graph already validated.
+
+This is the read path behind `Document()`, so a malformed file is caught here rather
+than carried into the object model. Raises `MalformedPackageError` for a corrupt or
+ambiguous archive, a relationship targeting a missing part, a part with no declared
+content type, or a content type that contradicts its relationship.
+
+### `iter_sparts`
+
+```python
+iter_sparts()
+```
+
+Generate a 4-tuple `(partname, content_type, reltype, blob)` for each of the
+serialized parts in the package.
+
+### `iter_srels`
+
+```python
+iter_srels()
+```
+
+Generate a 2-tuple `(source_uri, srel)` for each of the relationships in the
+package.
+
+## `content_type_matches`
+
+```python
+content_type_matches(actual: str, expected: str) -> bool
+```
+
+## `is_relationship_type`
+
+```python
+is_relationship_type(actual: str, expected: str) -> bool
+```
+
+## `is_xml_id`
+
+```python
+is_xml_id(value: object) -> bool
+```
+
+Whether ``value`` has the XML Schema ID/NCName lexical form.
+
+
+
+
+
+# `docx.opc.pkgwriter`
+
+Provides low-level, write-only API to serialized (OPC) package.
+
+## `PackageWriter`
+
+Writes a zip-format OPC package to `pkg_file`, where `pkg_file` can be either a
+path to a zip file (a string) or a file-like object.
+
+Its single API method, `write`, is static, so this class is not intended to be
+instantiated.
+
+### `write`
+
+```python
+write(pkg_file, pkg_rels, parts)
+```
+
+Write `parts` and `pkg_rels` to `pkg_file` as a .docx package, with a content-types
+stream derived from the parts.
+
+
+
+
+
+# `docx.opc.rel`
+
+Relationship-related objects.
+
+## `Relationships`
+
+```python
+Relationships(baseURI: str)
+```
+
+Bases: `Dict[str, '_Relationship']`
+
+Collection object for `_Relationship` instances, having list semantics.
+
+### `add_relationship`
+
+```python
+add_relationship(reltype: str, target: Part | str, rId: str, is_external: bool = False) -> '_Relationship'
+```
+
+Return a newly added `_Relationship` instance.
+
+### `get_or_add`
+
+```python
+get_or_add(reltype: str, target_part: Part) -> _Relationship
+```
+
+Return relationship of `reltype` to `target_part`, newly added if not already
+present in collection.
+
+### `get_or_add_ext_rel`
+
+```python
+get_or_add_ext_rel(reltype: str, target_ref: str) -> str
+```
+
+Return rId of external relationship of `reltype` to `target_ref`, newly added
+if not already present in collection.
+
+### `part_with_reltype`
+
+```python
+part_with_reltype(reltype: str) -> Part
+```
+
+Return target part of rel with matching `reltype`, raising `KeyError` if not
+found and `ValueError` if more than one matching relationship is found.
+
+### `related_parts`
+
+```python
+related_parts
+```
+
+Dict mapping rIds to target parts for all the internal relationships in the
+collection.
+
+### `xml`
+
+```python
+xml: str
+```
+
+Serialize this relationship collection into XML suitable for storage as a
+.rels file in an OPC package.
+
+
+
+
+
+# `docx.opc.shared`
+
+Objects shared by opc modules.
+
+## `CaseInsensitiveDict`
+
+Bases: `Dict[str, Any]`
+
+Mapping type that behaves like dict except that it matches without respect to the
+case of the key.
+
+E.g. cid['A'] == cid['a']. Note this is not general-purpose, just complete enough to
+satisfy opc package needs. It assumes str keys, and that it is created empty; keys
+passed in constructor are not accounted for
+
+## `cls_method_fn`
+
+```python
+cls_method_fn(cls: type, method_name: str)
+```
+
+Return method of `cls` having `method_name`.
+
+
+
+
+
+# `docx.opc.spec`
+
+Provides mappings that embody aspects of the Open XML spec ISO/IEC 29500.
+
+## `default_content_types`
+
+```python
+default_content_types = (('bin', CT.PML_PRINTER_SETTINGS), ('bin', CT.SML_PRINTER_SETTINGS), ('bin', CT.WML_PRINTER_SETTINGS), ('bmp', CT.BMP), ('emf', CT.X_EMF), ('fntdata', CT.X_FONTDATA), ('gif', CT.GIF), ('jpe', CT.JPEG), ('jpeg', CT.JPEG), ('jpg', CT.JPEG), ('png', CT.PNG), ('rels', CT.OPC_RELATIONSHIPS), ('tif', CT.TIFF), ('tiff', CT.TIFF), ('wdp', CT.MS_PHOTO), ('wmf', CT.X_WMF), ('xlsx', CT.SML_SHEET), ('xml', CT.XML))
+```
+
+
+
+
+
+# `docx.oxml.comments`
+
+Custom element classes related to document comments.
+
+## `CT_Comment`
+
+Bases: `BaseOxmlElement`
+
+`w:comment` element, representing a single comment.
+
+A comment is a so-called "story" and can contain paragraphs and tables much like a table-cell.
+While probably most often used for a single sentence or phrase, a comment can contain rich
+content, including multiple rich-text paragraphs, hyperlinks, images, and tables.
+
+### `add_p`
+
+```python
+add_p: Callable[[], CT_P]
+```
+
+### `author`
+
+```python
+author: str = RequiredAttribute('w:author', ST_String)
+```
+
+### `date`
+
+```python
+date: dt.datetime | None = OptionalAttribute('w:date', ST_DateTime)
+```
+
+### `id`
+
+```python
+id: int = RequiredAttribute('w:id', ST_DecimalNumber)
+```
+
+### `initials`
+
+```python
+initials: str | None = OptionalAttribute('w:initials', ST_String)
+```
+
+### `inner_content_elements`
+
+```python
+inner_content_elements: list[CT_P | CT_Tbl]
+```
+
+Generate all `w:p` and `w:tbl` elements in this comment.
+
+### `p`
+
+```python
+p = ZeroOrMore('w:p', successors=())
+```
+
+### `p_lst`
+
+```python
+p_lst: list[CT_P]
+```
+
+### `tbl`
+
+```python
+tbl = ZeroOrMore('w:tbl', successors=())
+```
+
+### `tbl_lst`
+
+```python
+tbl_lst: list[CT_Tbl]
+```
+
+## `CT_Comments`
+
+Bases: `BaseOxmlElement`
+
+`w:comments` element, the root element for the comments part.
+
+Simply contains a collection of `w:comment` elements, each representing a single comment. Each
+contained comment is identified by a unique `w:id` attribute, used to reference the comment
+from the document text. The offset of the comment in this collection is arbitrary; it is
+essentially a _set_ implemented as a list.
+
+### `add_comment`
+
+```python
+add_comment() -> CT_Comment
+```
+
+Return newly added `w:comment` child of this `w:comments`.
+
+The returned `w:comment` element is the minimum valid value, having a `w:id` value unique
+within the existing comments and the required `w:author` attribute present but set to the
+empty string. It's content is limited to a single run containing the necessary annotation
+reference but no text. Content is added by adding runs to this first paragraph and by
+adding additional paragraphs as needed.
+
+### `comment`
+
+```python
+comment = ZeroOrMore('w:comment')
+```
+
+### `comment_lst`
+
+```python
+comment_lst: list[CT_Comment]
+```
+
+### `get_comment_by_id`
+
+```python
+get_comment_by_id(comment_id: int) -> CT_Comment | None
+```
+
+Return the `w:comment` element identified by `comment_id`, or `None` if not found.
+
+
+
+
+
+# `docx.oxml.coreprops`
+
+Custom element classes for core properties-related XML elements.
+
+## `CT_CoreProperties`
+
+Bases: `BaseOxmlElement`
+
+`` element, the root element of the Core Properties part.
+
+Stored as `/docProps/core.xml`. Implements many of the Dublin Core document metadata
+elements. String elements resolve to an empty string ("") if the element is not
+present in the XML. String elements are limited in length to 255 unicode characters.
+
+### `author_text`
+
+```python
+author_text: str
+```
+
+The text in the `dc:creator` child element.
+
+### `category`
+
+```python
+category = ZeroOrOne('cp:category', successors=())
+```
+
+### `category_text`
+
+```python
+category_text: str
+```
+
+### `comments_text`
+
+```python
+comments_text: str
+```
+
+### `contentStatus`
+
+```python
+contentStatus = ZeroOrOne('cp:contentStatus', successors=())
+```
+
+### `contentStatus_text`
+
+```python
+contentStatus_text: str
+```
+
+### `created`
+
+```python
+created = ZeroOrOne('dcterms:created', successors=())
+```
+
+### `created_datetime`
+
+```python
+created_datetime: dt.datetime | None
+```
+
+### `creator`
+
+```python
+creator = ZeroOrOne('dc:creator', successors=())
+```
+
+### `description`
+
+```python
+description = ZeroOrOne('dc:description', successors=())
+```
+
+### `get_or_add_revision`
+
+```python
+get_or_add_revision: Callable[[], etree_Element]
+```
+
+### `identifier`
+
+```python
+identifier = ZeroOrOne('dc:identifier', successors=())
+```
+
+### `identifier_text`
+
+```python
+identifier_text: str
+```
+
+### `keywords`
+
+```python
+keywords = ZeroOrOne('cp:keywords', successors=())
+```
+
+### `keywords_text`
+
+```python
+keywords_text: str
+```
+
+### `language`
+
+```python
+language = ZeroOrOne('dc:language', successors=())
+```
+
+### `language_text`
+
+```python
+language_text: str
+```
+
+### `lastModifiedBy`
+
+```python
+lastModifiedBy = ZeroOrOne('cp:lastModifiedBy', successors=())
+```
+
+### `lastModifiedBy_text`
+
+```python
+lastModifiedBy_text: str
+```
+
+### `lastPrinted`
+
+```python
+lastPrinted = ZeroOrOne('cp:lastPrinted', successors=())
+```
+
+### `lastPrinted_datetime`
+
+```python
+lastPrinted_datetime: dt.datetime | None
+```
+
+### `modified`
+
+```python
+modified = ZeroOrOne('dcterms:modified', successors=())
+```
+
+### `modified_datetime`
+
+```python
+modified_datetime: dt.datetime | None
+```
+
+### `new`
+
+```python
+new() -> CT_CoreProperties
+```
+
+Return a new `` element.
+
+### `revision`
+
+```python
+revision: etree_Element | None = ZeroOrOne('cp:revision', successors=())
+```
+
+### `revision_number`
+
+```python
+revision_number: int
+```
+
+Integer value of revision property.
+
+### `subject`
+
+```python
+subject = ZeroOrOne('dc:subject', successors=())
+```
+
+### `subject_text`
+
+```python
+subject_text: str
+```
+
+### `title`
+
+```python
+title = ZeroOrOne('dc:title', successors=())
+```
+
+### `title_text`
+
+```python
+title_text: str
+```
+
+### `version`
+
+```python
+version = ZeroOrOne('cp:version', successors=())
+```
+
+### `version_text`
+
+```python
+version_text: str
+```
+
+
+
+
+
+# `docx.oxml.document`
+
+Custom element classes that correspond to the document part, e.g. .
+
+## `CT_Body`
+
+Bases: `BaseOxmlElement`
+
+`w:body`, the container element for the main document story in `document.xml`.
+
+### `add_p`
+
+```python
+add_p: Callable[[], CT_P]
+```
+
+### `add_section_break`
+
+```python
+add_section_break() -> CT_SectPr
+```
+
+Return `w:sectPr` element for new section added at end of document.
+
+The last `w:sectPr` becomes the second-to-last, with the new `w:sectPr` being an
+exact clone of the previous one, except that all header and footer references
+are removed (and are therefore now "inherited" from the prior section).
+
+A copy of the previously-last `w:sectPr` will now appear in a new `w:p` at the
+end of the document. The returned `w:sectPr` is the sentinel `w:sectPr` for the
+document (and as implemented, `is` the prior sentinel `w:sectPr` with headers
+and footers removed).
+
+### `clear_content`
+
+```python
+clear_content()
+```
+
+Remove all content child elements from this element.
+
+Leave the element if it is present.
+
+### `get_or_add_sectPr`
+
+```python
+get_or_add_sectPr: Callable[[], CT_SectPr]
+```
+
+### `inner_content_elements`
+
+```python
+inner_content_elements: List[CT_P | CT_Tbl]
+```
+
+Generate all `w:p` and `w:tbl` elements in this document-body.
+
+Elements appear in document order. Elements shaded by nesting in a `w:ins` or
+other "wrapper" element will not be included.
+
+### `p`
+
+```python
+p = ZeroOrMore('w:p', successors=('w:sectPr',))
+```
+
+### `p_lst`
+
+```python
+p_lst: List[CT_P]
+```
+
+### `sectPr`
+
+```python
+sectPr: CT_SectPr | None = ZeroOrOne('w:sectPr', successors=())
+```
+
+### `tbl`
+
+```python
+tbl = ZeroOrMore('w:tbl', successors=('w:sectPr',))
+```
+
+### `tbl_lst`
+
+```python
+tbl_lst: List[CT_Tbl]
+```
+
+## `CT_Document`
+
+Bases: `BaseOxmlElement`
+
+```` element, the root element of a document.xml file.
+
+### `body`
+
+```python
+body: CT_Body = ZeroOrOne('w:body')
+```
+
+### `sectPr_lst`
+
+```python
+sectPr_lst: List[CT_SectPr]
+```
+
+All `w:sectPr` elements directly accessible from document element.
+
+Note this does not include a `sectPr` child in a paragraphs wrapped in
+revision marks or other intervening layer, perhaps `w:sdt` or customXml
+elements.
+
+`w:sectPr` elements appear in document order. The last one is always
+`w:body/w:sectPr`, all preceding are `w:p/w:pPr/w:sectPr`.
+
+
+
+
+
+# `docx.oxml.drawing`
+
+Custom element-classes for DrawingML-related elements like ``.
+
+## `CT_Drawing`
+
+Bases: `BaseOxmlElement`
+
+`` element, containing a DrawingML object like a picture or chart.
+
+
+
+
+
+# `docx.oxml.exceptions`
+
+Exceptions for oxml sub-package.
+
+## `InvalidXmlError`
+
+Bases: `XmlchemyError`
+
+Raised when invalid XML is encountered, such as on attempt to access a missing
+required child element.
+
+## `XmlchemyError`
+
+Bases: `Exception`
+
+Generic error class.
+
+
+
+
+
+# `docx.oxml.ns`
+
+Namespace-related objects.
+
+## `NamespacePrefixedTag`
+
+```python
+NamespacePrefixedTag(nstag: str)
+```
+
+Bases: `str`
+
+Value object that knows the semantics of an XML tag having a namespace prefix.
+
+### `clark_name`
+
+```python
+clark_name: str
+```
+
+### `from_clark_name`
+
+```python
+from_clark_name(clark_name: str) -> NamespacePrefixedTag
+```
+
+### `local_part`
+
+```python
+local_part: str
+```
+
+The local part of this tag.
+
+E.g. "foobar" is returned for tag "f:foobar".
+
+### `nsmap`
+
+```python
+nsmap: Dict[str, str]
+```
+
+Single-member dict mapping prefix of this tag to it's namespace name.
+
+Example: `{"f": "http://foo/bar"}`. This is handy for passing to xpath calls
+and other uses.
+
+### `nspfx`
+
+```python
+nspfx: str
+```
+
+The namespace-prefix for this tag.
+
+For example, "f" is returned for tag "f:foobar".
+
+### `nsuri`
+
+```python
+nsuri: str
+```
+
+The namespace URI for this tag.
+
+For example, "http://foo/bar" would be returned for tag "f:foobar" if the "f"
+prefix maps to "http://foo/bar" in nsmap.
+
+## `nsdecls`
+
+```python
+nsdecls(*prefixes: str) -> str
+```
+
+Namespace declaration including each namespace-prefix in `prefixes`.
+
+Handy for adding required namespace declarations to a tree root element.
+
+## `nsmap`
+
+```python
+nsmap = {'a': 'http://schemas.openxmlformats.org/drawingml/2006/main', 'c': 'http://schemas.openxmlformats.org/drawingml/2006/chart', 'cp': 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties', 'dc': 'http://purl.org/dc/elements/1.1/', 'dcmitype': 'http://purl.org/dc/dcmitype/', 'dcterms': 'http://purl.org/dc/terms/', 'dgm': 'http://schemas.openxmlformats.org/drawingml/2006/diagram', 'm': 'http://schemas.openxmlformats.org/officeDocument/2006/math', 'pic': 'http://schemas.openxmlformats.org/drawingml/2006/picture', 'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', 'sl': 'http://schemas.openxmlformats.org/schemaLibrary/2006/main', 'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main', 'w14': 'http://schemas.microsoft.com/office/word/2010/wordml', 'wp': 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing', 'xml': 'http://www.w3.org/XML/1998/namespace', 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'}
+```
+
+## `nspfxmap`
+
+```python
+nspfxmap(*nspfxs: str) -> Dict[str, str]
+```
+
+Subset namespace-prefix mappings specified by *nspfxs*.
+
+Any number of namespace prefixes can be supplied, e.g. namespaces("a", "r", "p").
+
+## `pfxmap`
+
+```python
+pfxmap = {value: key for key, value in nsmap.items()}
+```
+
+## `qn`
+
+```python
+qn(tag: str) -> str
+```
+
+Stands for "qualified name".
+
+This utility function converts a familiar namespace-prefixed tag name like "w:p"
+into a Clark-notation qualified tag name for lxml. For example, `qn("w:p")` returns
+"{http://schemas.openxmlformats.org/wordprocessingml/2006/main}p".
+
+
+
+
+
+# `docx.oxml.numbering`
+
+Custom element classes related to the numbering part.
+
+## `CT_Num`
+
+Bases: `BaseOxmlElement`
+
+```` element, which represents a concrete list definition instance, having
+a required child that references an abstract numbering definition
+that defines most of the formatting details.
+
+### `abstractNumId`
+
+```python
+abstractNumId = OneAndOnlyOne('w:abstractNumId')
+```
+
+### `add_lvlOverride`
+
+```python
+add_lvlOverride(ilvl)
+```
+
+Return a newly added CT_NumLvl () element having its ``ilvl``
+attribute set to `ilvl`.
+
+### `lvlOverride`
+
+```python
+lvlOverride = ZeroOrMore('w:lvlOverride')
+```
+
+### `new`
+
+```python
+new(num_id, abstractNum_id)
+```
+
+Return a new ```` element having numId of `num_id` and having a
+```` child with val attribute set to `abstractNum_id`.
+
+### `numId`
+
+```python
+numId = RequiredAttribute('w:numId', ST_DecimalNumber)
+```
+
+## `CT_NumLvl`
+
+Bases: `BaseOxmlElement`
+
+```` element, which identifies a level in a list definition to
+override with settings it contains.
+
+### `add_startOverride`
+
+```python
+add_startOverride(val)
+```
+
+Return a newly added CT_DecimalNumber element having tagname
+``w:startOverride`` and ``val`` attribute set to `val`.
+
+### `ilvl`
+
+```python
+ilvl = RequiredAttribute('w:ilvl', ST_DecimalNumber)
+```
+
+### `startOverride`
+
+```python
+startOverride = ZeroOrOne('w:startOverride', successors=('w:lvl',))
+```
+
+## `CT_NumPr`
+
+Bases: `BaseOxmlElement`
+
+A ```` element, a container for numbering properties applied to a
+paragraph.
+
+### `ilvl`
+
+```python
+ilvl = ZeroOrOne('w:ilvl', successors=('w:numId', 'w:numberingChange', 'w:ins'))
+```
+
+### `numId`
+
+```python
+numId = ZeroOrOne('w:numId', successors=('w:numberingChange', 'w:ins'))
+```
+
+## `CT_Numbering`
+
+Bases: `BaseOxmlElement`
+
+```` element, the root element of a numbering part, i.e.
+numbering.xml.
+
+### `add_num`
+
+```python
+add_num(abstractNum_id)
+```
+
+Return a newly added CT_Num () element referencing the abstract
+numbering definition identified by `abstractNum_id`.
+
+### `num`
+
+```python
+num = ZeroOrMore('w:num', successors=('w:numIdMacAtCleanup',))
+```
+
+### `num_having_numId`
+
+```python
+num_having_numId(numId)
+```
+
+Return the ```` child element having ``numId`` attribute matching
+`numId`.
+
+
+
+
+
+# `docx.oxml.parser`
+
+XML parser for python-docx.
+
+## `OxmlElement`
+
+```python
+OxmlElement(nsptag_str: str, attrs: Dict[str, str] | None = None, nsdecls: Dict[str, str] | None = None) -> BaseOxmlElement | etree._Element
+```
+
+Return a 'loose' lxml element having the tag specified by `nsptag_str`.
+
+The tag in `nsptag_str` must contain the standard namespace prefix, e.g. `a:tbl`.
+The resulting element is an instance of the custom element class for this tag name
+if one is defined. A dictionary of attribute values may be provided as `attrs`; they
+are set if present. All namespaces defined in the dict `nsdecls` are declared in the
+element using the key as the prefix and the value as the namespace name. If
+`nsdecls` is not provided, a single namespace declaration is added based on the
+prefix on `nsptag_str`.
+
+## `element_class_lookup`
+
+```python
+element_class_lookup = etree.ElementNamespaceClassLookup()
+```
+
+## `oxml_parser`
+
+```python
+oxml_parser = etree.XMLParser(remove_blank_text=True, resolve_entities=False)
+```
+
+## `parse_xml`
+
+```python
+parse_xml(xml: str | bytes) -> 'BaseOxmlElement'
+```
+
+Root lxml element obtained by parsing XML character string `xml`.
+
+The custom parser is used, so custom element classes are produced for elements in
+`xml` that have them.
+
+## `register_element_cls`
+
+```python
+register_element_cls(tag: str, cls: Type['BaseOxmlElement'])
+```
+
+Register an lxml custom element-class to use for `tag`.
+
+A instance of `cls` to be constructed when the oxml parser encounters an element
+with matching `tag`. `tag` is a string of the form `nspfx:tagroot`, e.g.
+`'w:document'`.
+
+
+
+
+
+# `docx.oxml.revision`
+
+Custom element classes for the tracked-change (revision) vocabulary.
+
+## `CT_RunTrackChange`
+
+Bases: `BaseOxmlElement`
+
+`w:ins` and `w:del` elements: a tracked run-level change.
+
+Both tags share this shape (ECMA-376 CT_RunTrackChange): required unique
+`w:id`, required `w:author`, optional `w:date`, containing the changed
+runs. `w:del` also appears childless inside `w:pPr/w:rPr` to mark a
+paragraph mark as deleted; ``ZeroOrMore`` runs covers that use too.
+
+### `add_tracked_run`
+
+```python
+add_tracked_run(text: str, rpr: 'Optional[_Element]', *, deleted: bool) -> 'CT_R'
+```
+
+Append a run holding `text`, with `rpr` cloned in when given.
+
+Deleted text goes into `w:delText` (never live `w:t` inside `w:del`);
+inserted text into `w:t`. Edge whitespace gets `xml:space="preserve"`.
+
+### `author`
+
+```python
+author = RequiredAttribute('w:author', ST_String)
+```
+
+### `date`
+
+```python
+date = OptionalAttribute('w:date', ST_DateTime)
+```
+
+### `id`
+
+```python
+id = RequiredAttribute('w:id', ST_DecimalNumber)
+```
+
+### `new`
+
+```python
+new(tag: str, revision_id: int, author: str, date: Optional[dt.datetime]) -> 'CT_RunTrackChange'
+```
+
+A new `w:ins` or `w:del` element with its identity attributes set.
+
+### `r`
+
+```python
+r = ZeroOrMore('w:r')
+```
+
+
+
+
+
+# `docx.oxml.section`
+
+Section-related custom element classes.
+
+## `BlockElement`
+
+```python
+BlockElement: TypeAlias = 'CT_P | CT_Tbl'
+```
+
+## `CT_HdrFtr`
+
+Bases: `BaseOxmlElement`
+
+`w:hdr` and `w:ftr`, the root element for header and footer part respectively.
+
+### `add_p`
+
+```python
+add_p: Callable[[], CT_P]
+```
+
+### `inner_content_elements`
+
+```python
+inner_content_elements: List[CT_P | CT_Tbl]
+```
+
+Generate all `w:p` and `w:tbl` elements in this header or footer.
+
+Elements appear in document order. Elements shaded by nesting in a `w:ins` or
+other "wrapper" element will not be included.
+
+### `p`
+
+```python
+p = ZeroOrMore('w:p', successors=())
+```
+
+### `p_lst`
+
+```python
+p_lst: List[CT_P]
+```
+
+### `tbl`
+
+```python
+tbl = ZeroOrMore('w:tbl', successors=())
+```
+
+### `tbl_lst`
+
+```python
+tbl_lst: List[CT_Tbl]
+```
+
+## `CT_HdrFtrRef`
+
+Bases: `BaseOxmlElement`
+
+`w:headerReference` and `w:footerReference` elements.
+
+### `rId`
+
+```python
+rId: str = RequiredAttribute('r:id', XsdString)
+```
+
+### `type_`
+
+```python
+type_: WD_HEADER_FOOTER = RequiredAttribute('w:type', WD_HEADER_FOOTER)
+```
+
+## `CT_PageMar`
+
+Bases: `BaseOxmlElement`
+
+```` element, defining page margins.
+
+### `bottom`
+
+```python
+bottom: Length | None = OptionalAttribute('w:bottom', ST_SignedTwipsMeasure)
+```
+
+### `footer`
+
+```python
+footer: Length | None = OptionalAttribute('w:footer', ST_TwipsMeasure)
+```
+
+### `gutter`
+
+```python
+gutter: Length | None = OptionalAttribute('w:gutter', ST_TwipsMeasure)
+```
+
+### `header`
+
+```python
+header: Length | None = OptionalAttribute('w:header', ST_TwipsMeasure)
+```
+
+### `left`
+
+```python
+left: Length | None = OptionalAttribute('w:left', ST_TwipsMeasure)
+```
+
+### `right`
+
+```python
+right: Length | None = OptionalAttribute('w:right', ST_TwipsMeasure)
+```
+
+### `top`
+
+```python
+top: Length | None = OptionalAttribute('w:top', ST_SignedTwipsMeasure)
+```
+
+## `CT_PageSz`
+
+Bases: `BaseOxmlElement`
+
+```` element, defining page dimensions and orientation.
+
+### `h`
+
+```python
+h: Length | None = OptionalAttribute('w:h', ST_TwipsMeasure)
+```
+
+### `orient`
+
+```python
+orient: WD_ORIENTATION = OptionalAttribute('w:orient', WD_ORIENTATION, default=WD_ORIENTATION.PORTRAIT)
+```
+
+### `w`
+
+```python
+w: Length | None = OptionalAttribute('w:w', ST_TwipsMeasure)
+```
+
+## `CT_SectPr`
+
+Bases: `BaseOxmlElement`
+
+`w:sectPr` element, the container element for section properties.
+
+### `add_footerReference`
+
+```python
+add_footerReference(type_: WD_HEADER_FOOTER, rId: str) -> CT_HdrFtrRef
+```
+
+Return newly added CT_HdrFtrRef element of `type_` with `rId`.
+
+The element tag is `w:footerReference`.
+
+### `add_headerReference`
+
+```python
+add_headerReference(type_: WD_HEADER_FOOTER, rId: str) -> CT_HdrFtrRef
+```
+
+Return newly added CT_HdrFtrRef element of `type_` with `rId`.
+
+The element tag is `w:headerReference`.
+
+### `bottom_margin`
+
+```python
+bottom_margin: Length | None
+```
+
+Value of the `w:bottom` attr of `` child element, as `Length`.
+
+`None` when either the element or the attribute is not present.
+
+### `clone`
+
+```python
+clone() -> CT_SectPr
+```
+
+Return an exact duplicate of this ```` element tree suitable for
+use in adding a section break.
+
+All rsid* attributes are removed from the root ```` element.
+
+### `footer`
+
+```python
+footer: Length | None
+```
+
+Distance from bottom edge of page to bottom edge of the footer.
+
+This is the value of the `w:footer` attribute in the `w:pgMar` child element,
+as a `Length` object, or `None` if either the element or the attribute is not
+present.
+
+### `footerReference`
+
+```python
+footerReference = ZeroOrMore('w:footerReference', successors=_tag_seq)
+```
+
+### `get_footerReference`
+
+```python
+get_footerReference(type_: WD_HEADER_FOOTER) -> CT_HdrFtrRef | None
+```
+
+Return footerReference element of `type_` or None if not present.
+
+### `get_headerReference`
+
+```python
+get_headerReference(type_: WD_HEADER_FOOTER) -> CT_HdrFtrRef | None
+```
+
+Return headerReference element of `type_` or None if not present.
+
+### `get_or_add_pgMar`
+
+```python
+get_or_add_pgMar: Callable[[], CT_PageMar]
+```
+
+### `get_or_add_pgSz`
+
+```python
+get_or_add_pgSz: Callable[[], CT_PageSz]
+```
+
+### `get_or_add_titlePg`
+
+```python
+get_or_add_titlePg: Callable[[], CT_OnOff]
+```
+
+### `get_or_add_type`
+
+```python
+get_or_add_type: Callable[[], CT_SectType]
+```
+
+### `gutter`
+
+```python
+gutter: Length | None
+```
+
+The value of the ``w:gutter`` attribute in the ```` child element,
+as a `Length` object, or `None` if either the element or the attribute is not
+present.
+
+### `header`
+
+```python
+header: Length | None
+```
+
+Distance from top edge of page to top edge of header.
+
+This value comes from the `w:header` attribute on the `w:pgMar` child element.
+`None` if either the element or the attribute is not present.
+
+### `headerReference`
+
+```python
+headerReference = ZeroOrMore('w:headerReference', successors=_tag_seq)
+```
+
+### `iter_inner_content`
+
+```python
+iter_inner_content() -> Iterator[CT_P | CT_Tbl]
+```
+
+Generate all `w:p` and `w:tbl` elements in this section.
+
+Elements appear in document order. Elements shaded by nesting in a `w:ins` or
+other "wrapper" element will not be included.
+
+### `left_margin`
+
+```python
+left_margin: Length | None
+```
+
+The value of the ``w:left`` attribute in the ```` child element, as
+a `Length` object, or `None` if either the element or the attribute is not
+present.
+
+### `orientation`
+
+```python
+orientation: WD_ORIENTATION
+```
+
+`WD_ORIENTATION` member indicating page-orientation for this section.
+
+This is the value of the `orient` attribute on the `w:pgSz` child, or
+`WD_ORIENTATION.PORTRAIT` if not present.
+
+### `page_height`
+
+```python
+page_height: Length | None
+```
+
+Value in EMU of the `h` attribute of the `w:pgSz` child element.
+
+`None` if not present.
+
+### `page_width`
+
+```python
+page_width: Length | None
+```
+
+Value in EMU of the ``w`` attribute of the ```` child element.
+
+`None` if not present.
+
+### `pgMar`
+
+```python
+pgMar: CT_PageMar | None = ZeroOrOne('w:pgMar', successors=_tag_seq[5:])
+```
+
+### `pgSz`
+
+```python
+pgSz: CT_PageSz | None = ZeroOrOne('w:pgSz', successors=_tag_seq[4:])
+```
+
+### `preceding_sectPr`
+
+```python
+preceding_sectPr: CT_SectPr | None
+```
+
+SectPr immediately preceding this one or None if this is the first.
+
+### `remove_footerReference`
+
+```python
+remove_footerReference(type_: WD_HEADER_FOOTER) -> str
+```
+
+Return rId of w:footerReference child of `type_` after removing it.
+
+### `remove_headerReference`
+
+```python
+remove_headerReference(type_: WD_HEADER_FOOTER)
+```
+
+Return rId of w:headerReference child of `type_` after removing it.
+
+### `right_margin`
+
+```python
+right_margin: Length | None
+```
+
+The value of the ``w:right`` attribute in the ```` child element, as
+a `Length` object, or `None` if either the element or the attribute is not
+present.
+
+### `start_type`
+
+```python
+start_type: WD_SECTION_START
+```
+
+The member of the ``WD_SECTION_START`` enumeration corresponding to the value
+of the ``val`` attribute of the ```` child element, or
+``WD_SECTION_START.NEW_PAGE`` if not present.
+
+### `titlePg`
+
+```python
+titlePg: CT_OnOff | None = ZeroOrOne('w:titlePg', successors=_tag_seq[14:])
+```
+
+### `titlePg_val`
+
+```python
+titlePg_val: bool
+```
+
+Value of `w:titlePg/@val` or `False` if `./w:titlePg` is not present.
+
+### `top_margin`
+
+```python
+top_margin: Length | None
+```
+
+The value of the ``w:top`` attribute in the ```` child element, as a
+`Length` object, or `None` if either the element or the attribute is not
+present.
+
+### `type`
+
+```python
+type: CT_SectType | None = ZeroOrOne('w:type', successors=_tag_seq[3:])
+```
+
+## `CT_SectType`
+
+Bases: `BaseOxmlElement`
+
+```` element, defining the section start type.
+
+### `val`
+
+```python
+val: WD_SECTION_START | None = OptionalAttribute('w:val', WD_SECTION_START)
+```
+
+
+
+
+
+# `docx.oxml.settings`
+
+Custom element classes related to document settings.
+
+## `CT_Settings`
+
+Bases: `BaseOxmlElement`
+
+`w:settings` element, root element for the settings part.
+
+### `evenAndOddHeaders`
+
+```python
+evenAndOddHeaders: CT_OnOff | None = ZeroOrOne('w:evenAndOddHeaders', successors=_tag_seq[48:])
+```
+
+### `evenAndOddHeaders_val`
+
+```python
+evenAndOddHeaders_val: bool
+```
+
+Value of `w:evenAndOddHeaders/@w:val` or `None` if not present.
+
+### `get_or_add_evenAndOddHeaders`
+
+```python
+get_or_add_evenAndOddHeaders: Callable[[], CT_OnOff]
+```
diff --git a/addons/sandbox/skills/docx/references/api-003.md b/addons/sandbox/skills/docx/references/api-003.md
new file mode 100644
index 000000000..bea7d8d4c
--- /dev/null
+++ b/addons/sandbox/skills/docx/references/api-003.md
@@ -0,0 +1,6449 @@
+
+
+
+
+# `docx.oxml.shape`
+
+Custom element classes for shape-related elements like ``.
+
+## `CT_Anchor`
+
+Bases: `BaseOxmlElement`
+
+`` element, container for a "floating" shape.
+
+## `CT_Blip`
+
+Bases: `BaseOxmlElement`
+
+```` element, specifies image source and adjustments such as alpha and
+tint.
+
+### `embed`
+
+```python
+embed: str | None = OptionalAttribute('r:embed', ST_RelationshipId)
+```
+
+### `link`
+
+```python
+link: str | None = OptionalAttribute('r:link', ST_RelationshipId)
+```
+
+## `CT_BlipFillProperties`
+
+Bases: `BaseOxmlElement`
+
+```` element, specifies picture properties.
+
+### `blip`
+
+```python
+blip: CT_Blip = ZeroOrOne('a:blip', successors=('a:srcRect', 'a:tile', 'a:stretch'))
+```
+
+## `CT_GraphicalObject`
+
+Bases: `BaseOxmlElement`
+
+```` element, container for a DrawingML object.
+
+### `graphicData`
+
+```python
+graphicData: CT_GraphicalObjectData = OneAndOnlyOne('a:graphicData')
+```
+
+## `CT_GraphicalObjectData`
+
+Bases: `BaseOxmlElement`
+
+```` element, container for the XML of a DrawingML object.
+
+### `pic`
+
+```python
+pic: CT_Picture = ZeroOrOne('pic:pic')
+```
+
+### `uri`
+
+```python
+uri: str = RequiredAttribute('uri', XsdToken)
+```
+
+## `CT_Inline`
+
+Bases: `BaseOxmlElement`
+
+`` element, container for an inline shape.
+
+### `docPr`
+
+```python
+docPr: CT_NonVisualDrawingProps = OneAndOnlyOne('wp:docPr')
+```
+
+### `extent`
+
+```python
+extent: CT_PositiveSize2D = OneAndOnlyOne('wp:extent')
+```
+
+### `graphic`
+
+```python
+graphic: CT_GraphicalObject = OneAndOnlyOne('a:graphic')
+```
+
+### `new`
+
+```python
+new(cx: Length, cy: Length, shape_id: int, pic: CT_Picture) -> CT_Inline
+```
+
+Return a new ```` element populated with the values passed as
+parameters.
+
+### `new_pic_inline`
+
+```python
+new_pic_inline(shape_id: int, rId: str, filename: str, cx: Length, cy: Length) -> CT_Inline
+```
+
+Create `wp:inline` element containing a `pic:pic` element.
+
+The contents of the `pic:pic` element is taken from the argument values.
+
+## `CT_NonVisualDrawingProps`
+
+Bases: `BaseOxmlElement`
+
+Used for ```` element, and perhaps others.
+
+Specifies the id and name of a DrawingML drawing.
+
+### `id`
+
+```python
+id = RequiredAttribute('id', ST_DrawingElementId)
+```
+
+### `name`
+
+```python
+name = RequiredAttribute('name', XsdString)
+```
+
+## `CT_NonVisualPictureProperties`
+
+Bases: `BaseOxmlElement`
+
+```` element, specifies picture locking and resize behaviors.
+
+## `CT_Picture`
+
+Bases: `BaseOxmlElement`
+
+```` element, a DrawingML picture.
+
+### `blipFill`
+
+```python
+blipFill: CT_BlipFillProperties = OneAndOnlyOne('pic:blipFill')
+```
+
+### `new`
+
+```python
+new(pic_id: int, filename: str, rId: str, cx: Length, cy: Length) -> CT_Picture
+```
+
+A new minimum viable `` (picture) element.
+
+### `nvPicPr`
+
+```python
+nvPicPr: CT_PictureNonVisual = OneAndOnlyOne('pic:nvPicPr')
+```
+
+### `spPr`
+
+```python
+spPr: CT_ShapeProperties = OneAndOnlyOne('pic:spPr')
+```
+
+## `CT_PictureNonVisual`
+
+Bases: `BaseOxmlElement`
+
+```` element, non-visual picture properties.
+
+### `cNvPr`
+
+```python
+cNvPr = OneAndOnlyOne('pic:cNvPr')
+```
+
+## `CT_Point2D`
+
+Bases: `BaseOxmlElement`
+
+Used for ```` element, and perhaps others.
+
+Specifies an x, y coordinate (point).
+
+### `x`
+
+```python
+x = RequiredAttribute('x', ST_Coordinate)
+```
+
+### `y`
+
+```python
+y = RequiredAttribute('y', ST_Coordinate)
+```
+
+## `CT_PositiveSize2D`
+
+Bases: `BaseOxmlElement`
+
+Used for ```` element, and perhaps others later.
+
+Specifies the size of a DrawingML drawing.
+
+### `cx`
+
+```python
+cx: Length = RequiredAttribute('cx', ST_PositiveCoordinate)
+```
+
+### `cy`
+
+```python
+cy: Length = RequiredAttribute('cy', ST_PositiveCoordinate)
+```
+
+## `CT_PresetGeometry2D`
+
+Bases: `BaseOxmlElement`
+
+```` element, specifies an preset autoshape geometry, such as
+``rect``.
+
+## `CT_RelativeRect`
+
+Bases: `BaseOxmlElement`
+
+```` element, specifying picture should fill containing rectangle
+shape.
+
+## `CT_ShapeProperties`
+
+Bases: `BaseOxmlElement`
+
+```` element, specifies size and shape of picture container.
+
+### `cx`
+
+```python
+cx
+```
+
+Shape width as an instance of Emu, or None if not present.
+
+### `cy`
+
+```python
+cy
+```
+
+Shape height as an instance of Emu, or None if not present.
+
+### `xfrm`
+
+```python
+xfrm = ZeroOrOne('a:xfrm', successors=('a:custGeom', 'a:prstGeom', 'a:ln', 'a:effectLst', 'a:effectDag', 'a:scene3d', 'a:sp3d', 'a:extLst'))
+```
+
+## `CT_StretchInfoProperties`
+
+Bases: `BaseOxmlElement`
+
+```` element, specifies how picture should fill its containing
+shape.
+
+## `CT_Transform2D`
+
+Bases: `BaseOxmlElement`
+
+```` element, specifies size and shape of picture container.
+
+### `cx`
+
+```python
+cx
+```
+
+### `cy`
+
+```python
+cy
+```
+
+### `ext`
+
+```python
+ext = ZeroOrOne('a:ext', successors=())
+```
+
+### `off`
+
+```python
+off = ZeroOrOne('a:off', successors=('a:ext',))
+```
+
+
+
+
+
+# `docx.oxml.shared`
+
+Objects shared by modules in the docx.oxml subpackage.
+
+## `CT_DecimalNumber`
+
+Bases: `BaseOxmlElement`
+
+Used for ````, ````, ```` and several others,
+containing a text representation of a decimal number (e.g. 42) in its ``val``
+attribute.
+
+### `new`
+
+```python
+new(nsptagname: str, val: int)
+```
+
+Return a new ``CT_DecimalNumber`` element having tagname `nsptagname` and
+``val`` attribute set to `val`.
+
+### `val`
+
+```python
+val: int = RequiredAttribute('w:val', ST_DecimalNumber)
+```
+
+## `CT_OnOff`
+
+Bases: `BaseOxmlElement`
+
+Used for `w:b`, `w:i` elements and others.
+
+Contains a bool-ish string in its `val` attribute, xsd:boolean plus "on" and
+"off". Defaults to `True`, so `` for example means "bold is turned on".
+
+### `val`
+
+```python
+val: bool = OptionalAttribute('w:val', ST_OnOff, default=True)
+```
+
+## `CT_String`
+
+Bases: `BaseOxmlElement`
+
+Used for `w:pStyle` and `w:tblStyle` elements and others.
+
+In those cases, it containing a style name in its `val` attribute.
+
+### `new`
+
+```python
+new(nsptagname: str, val: str)
+```
+
+A new `CT_String`` element with tagname `nsptagname` and `val` attribute set to `val`.
+
+### `val`
+
+```python
+val: str = RequiredAttribute('w:val', ST_String)
+```
+
+
+
+
+
+# `docx.oxml.simpletypes`
+
+Simple-type classes, corresponding to ST_* schema items.
+
+## `BaseIntType`
+
+Bases: `BaseSimpleType`
+
+### `convert_from_xml`
+
+```python
+convert_from_xml(str_value: str) -> int
+```
+
+### `convert_to_xml`
+
+```python
+convert_to_xml(value: int) -> str
+```
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+## `BaseSimpleType`
+
+Base class for simple-types.
+
+### `convert_from_xml`
+
+```python
+convert_from_xml(str_value: str) -> Any
+```
+
+### `convert_to_xml`
+
+```python
+convert_to_xml(value: Any) -> str
+```
+
+### `from_xml`
+
+```python
+from_xml(xml_value: str) -> Any
+```
+
+### `to_xml`
+
+```python
+to_xml(value: Any) -> str
+```
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+### `validate_int`
+
+```python
+validate_int(value: object)
+```
+
+### `validate_int_in_range`
+
+```python
+validate_int_in_range(value: int, min_inclusive: int, max_inclusive: int) -> None
+```
+
+### `validate_string`
+
+```python
+validate_string(value: Any) -> str
+```
+
+## `BaseStringEnumerationType`
+
+Bases: `BaseStringType`
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+## `BaseStringType`
+
+Bases: `BaseSimpleType`
+
+### `convert_from_xml`
+
+```python
+convert_from_xml(str_value: str) -> str
+```
+
+### `convert_to_xml`
+
+```python
+convert_to_xml(value: str) -> str
+```
+
+### `validate`
+
+```python
+validate(value: str)
+```
+
+## `ST_BrClear`
+
+Bases: `XsdString`
+
+### `validate`
+
+```python
+validate(value: str) -> None
+```
+
+## `ST_BrType`
+
+Bases: `XsdString`
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+## `ST_Coordinate`
+
+Bases: `BaseIntType`
+
+### `convert_from_xml`
+
+```python
+convert_from_xml(str_value: str) -> Length
+```
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+## `ST_CoordinateUnqualified`
+
+Bases: `XsdLong`
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+## `ST_DateTime`
+
+Bases: `BaseSimpleType`
+
+### `convert_from_xml`
+
+```python
+convert_from_xml(str_value: str) -> dt.datetime
+```
+
+Convert an xsd:dateTime string to a datetime object.
+
+### `convert_to_xml`
+
+```python
+convert_to_xml(value: dt.datetime) -> str
+```
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+## `ST_DecimalNumber`
+
+Bases: `XsdInt`
+
+## `ST_DrawingElementId`
+
+Bases: `XsdUnsignedInt`
+
+## `ST_HexColor`
+
+Bases: `BaseStringType`
+
+### `convert_from_xml`
+
+```python
+convert_from_xml(str_value: str) -> RGBColor | str
+```
+
+### `convert_to_xml`
+
+```python
+convert_to_xml(value: RGBColor) -> str
+```
+
+Keep alpha hex numerals all uppercase just for consistency.
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+## `ST_HexColorAuto`
+
+Bases: `XsdStringEnumeration`
+
+Value for `w:color/[@val="auto"] attribute setting.
+
+### `AUTO`
+
+```python
+AUTO = 'auto'
+```
+
+## `ST_HpsMeasure`
+
+Bases: `XsdUnsignedLong`
+
+Half-point measure, e.g. 24.0 represents 12.0 points.
+
+### `convert_from_xml`
+
+```python
+convert_from_xml(str_value: str) -> Length
+```
+
+### `convert_to_xml`
+
+```python
+convert_to_xml(value: int | Length) -> str
+```
+
+## `ST_Merge`
+
+Bases: `XsdStringEnumeration`
+
+Valid values for attribute.
+
+### `CONTINUE`
+
+```python
+CONTINUE = 'continue'
+```
+
+### `RESTART`
+
+```python
+RESTART = 'restart'
+```
+
+## `ST_OnOff`
+
+Bases: `XsdBoolean`
+
+### `convert_from_xml`
+
+```python
+convert_from_xml(str_value: str) -> bool
+```
+
+## `ST_PositiveCoordinate`
+
+Bases: `XsdLong`
+
+### `convert_from_xml`
+
+```python
+convert_from_xml(str_value: str) -> Length
+```
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+## `ST_RelationshipId`
+
+Bases: `XsdString`
+
+## `ST_SignedTwipsMeasure`
+
+Bases: `XsdInt`
+
+### `convert_from_xml`
+
+```python
+convert_from_xml(str_value: str) -> Length
+```
+
+### `convert_to_xml`
+
+```python
+convert_to_xml(value: int | Length) -> str
+```
+
+## `ST_String`
+
+Bases: `XsdString`
+
+## `ST_TblLayoutType`
+
+Bases: `XsdString`
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+## `ST_TblWidth`
+
+Bases: `XsdString`
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+## `ST_TwipsMeasure`
+
+Bases: `XsdUnsignedLong`
+
+### `convert_from_xml`
+
+```python
+convert_from_xml(str_value: str) -> Length
+```
+
+### `convert_to_xml`
+
+```python
+convert_to_xml(value: int | Length) -> str
+```
+
+## `ST_UniversalMeasure`
+
+Bases: `BaseSimpleType`
+
+### `convert_from_xml`
+
+```python
+convert_from_xml(str_value: str) -> Emu
+```
+
+## `ST_VerticalAlignRun`
+
+Bases: `XsdStringEnumeration`
+
+Valid values for `w:vertAlign/@val`.
+
+### `BASELINE`
+
+```python
+BASELINE = 'baseline'
+```
+
+### `SUBSCRIPT`
+
+```python
+SUBSCRIPT = 'subscript'
+```
+
+### `SUPERSCRIPT`
+
+```python
+SUPERSCRIPT = 'superscript'
+```
+
+## `XsdAnyUri`
+
+Bases: `BaseStringType`
+
+There's a regex in the spec this is supposed to meet...
+
+but current assessment is that spending cycles on validating wouldn't be worth it
+for the number of programming errors it would catch.
+
+## `XsdBoolean`
+
+Bases: `BaseSimpleType`
+
+### `convert_from_xml`
+
+```python
+convert_from_xml(str_value: str) -> bool
+```
+
+### `convert_to_xml`
+
+```python
+convert_to_xml(value: bool) -> str
+```
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+## `XsdId`
+
+Bases: `BaseStringType`
+
+String that must begin with a letter or underscore and cannot contain any colons.
+
+Not fully validated because not used in external API.
+
+## `XsdInt`
+
+Bases: `BaseIntType`
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+## `XsdLong`
+
+Bases: `BaseIntType`
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+## `XsdString`
+
+Bases: `BaseStringType`
+
+## `XsdStringEnumeration`
+
+Bases: `BaseStringEnumerationType`
+
+Set of enumerated xsd:string values.
+
+## `XsdToken`
+
+Bases: `BaseStringType`
+
+Xsd:string with whitespace collapsing, e.g. multiple spaces reduced to one,
+leading and trailing space stripped.
+
+## `XsdUnsignedInt`
+
+Bases: `BaseIntType`
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+## `XsdUnsignedLong`
+
+Bases: `BaseIntType`
+
+### `validate`
+
+```python
+validate(value: Any) -> None
+```
+
+
+
+
+
+# `docx.oxml.styles`
+
+Custom element classes related to the styles part.
+
+## `CT_LatentStyles`
+
+Bases: `BaseOxmlElement`
+
+`w:latentStyles` element, defining behavior defaults for latent styles and
+containing `w:lsdException` child elements that each override those defaults for a
+named latent style.
+
+### `bool_prop`
+
+```python
+bool_prop(attr_name)
+```
+
+Return the boolean value of the attribute having `attr_name`, or `False` if
+not present.
+
+### `count`
+
+```python
+count = OptionalAttribute('w:count', ST_DecimalNumber)
+```
+
+### `defLockedState`
+
+```python
+defLockedState = OptionalAttribute('w:defLockedState', ST_OnOff)
+```
+
+### `defQFormat`
+
+```python
+defQFormat = OptionalAttribute('w:defQFormat', ST_OnOff)
+```
+
+### `defSemiHidden`
+
+```python
+defSemiHidden = OptionalAttribute('w:defSemiHidden', ST_OnOff)
+```
+
+### `defUIPriority`
+
+```python
+defUIPriority = OptionalAttribute('w:defUIPriority', ST_DecimalNumber)
+```
+
+### `defUnhideWhenUsed`
+
+```python
+defUnhideWhenUsed = OptionalAttribute('w:defUnhideWhenUsed', ST_OnOff)
+```
+
+### `get_by_name`
+
+```python
+get_by_name(name)
+```
+
+Return the `w:lsdException` child having `name`, or `None` if not found.
+
+### `lsdException`
+
+```python
+lsdException = ZeroOrMore('w:lsdException', successors=())
+```
+
+### `set_bool_prop`
+
+```python
+set_bool_prop(attr_name, value)
+```
+
+Set the on/off attribute having `attr_name` to `value`.
+
+## `CT_LsdException`
+
+Bases: `BaseOxmlElement`
+
+```` element, defining override visibility behaviors for a named
+latent style.
+
+### `delete`
+
+```python
+delete()
+```
+
+Remove this `w:lsdException` element from the XML document.
+
+### `locked`
+
+```python
+locked = OptionalAttribute('w:locked', ST_OnOff)
+```
+
+### `name`
+
+```python
+name = RequiredAttribute('w:name', ST_String)
+```
+
+### `on_off_prop`
+
+```python
+on_off_prop(attr_name)
+```
+
+Return the boolean value of the attribute having `attr_name`, or `None` if
+not present.
+
+### `qFormat`
+
+```python
+qFormat = OptionalAttribute('w:qFormat', ST_OnOff)
+```
+
+### `semiHidden`
+
+```python
+semiHidden = OptionalAttribute('w:semiHidden', ST_OnOff)
+```
+
+### `set_on_off_prop`
+
+```python
+set_on_off_prop(attr_name, value)
+```
+
+Set the on/off attribute having `attr_name` to `value`.
+
+### `uiPriority`
+
+```python
+uiPriority = OptionalAttribute('w:uiPriority', ST_DecimalNumber)
+```
+
+### `unhideWhenUsed`
+
+```python
+unhideWhenUsed = OptionalAttribute('w:unhideWhenUsed', ST_OnOff)
+```
+
+## `CT_Style`
+
+Bases: `BaseOxmlElement`
+
+A ```` element, representing a style definition.
+
+### `base_style`
+
+```python
+base_style
+```
+
+Sibling CT_Style element this style is based on or `None` if no base style or
+base style not found.
+
+### `basedOn`
+
+```python
+basedOn = ZeroOrOne('w:basedOn', successors=_tag_seq[3:])
+```
+
+### `basedOn_val`
+
+```python
+basedOn_val
+```
+
+Value of `w:basedOn/@w:val` or `None` if not present.
+
+### `customStyle`
+
+```python
+customStyle = OptionalAttribute('w:customStyle', ST_OnOff)
+```
+
+### `default`
+
+```python
+default = OptionalAttribute('w:default', ST_OnOff)
+```
+
+### `delete`
+
+```python
+delete()
+```
+
+Remove this `w:style` element from its parent `w:styles` element.
+
+### `locked`
+
+```python
+locked = ZeroOrOne('w:locked', successors=_tag_seq[12:])
+```
+
+### `locked_val`
+
+```python
+locked_val
+```
+
+Value of `w:locked/@w:val` or `False` if not present.
+
+### `name`
+
+```python
+name = ZeroOrOne('w:name', successors=_tag_seq[1:])
+```
+
+### `name_val`
+
+```python
+name_val
+```
+
+Value of ```` child or `None` if not present.
+
+### `next`
+
+```python
+next = ZeroOrOne('w:next', successors=_tag_seq[4:])
+```
+
+### `next_style`
+
+```python
+next_style
+```
+
+Sibling CT_Style element identified by the value of `w:name/@w:val` or `None`
+if no value is present or no style with that style id is found.
+
+### `pPr`
+
+```python
+pPr = ZeroOrOne('w:pPr', successors=_tag_seq[17:])
+```
+
+### `qFormat`
+
+```python
+qFormat = ZeroOrOne('w:qFormat', successors=_tag_seq[11:])
+```
+
+### `qFormat_val`
+
+```python
+qFormat_val
+```
+
+Value of `w:qFormat/@w:val` or `False` if not present.
+
+### `rPr`
+
+```python
+rPr = ZeroOrOne('w:rPr', successors=_tag_seq[18:])
+```
+
+### `semiHidden`
+
+```python
+semiHidden = ZeroOrOne('w:semiHidden', successors=_tag_seq[9:])
+```
+
+### `semiHidden_val`
+
+```python
+semiHidden_val
+```
+
+Value of ```` child or `False` if not present.
+
+### `styleId`
+
+```python
+styleId: str | None = OptionalAttribute('w:styleId', ST_String)
+```
+
+### `type`
+
+```python
+type: WD_STYLE_TYPE | None = OptionalAttribute('w:type', WD_STYLE_TYPE)
+```
+
+### `uiPriority`
+
+```python
+uiPriority = ZeroOrOne('w:uiPriority', successors=_tag_seq[8:])
+```
+
+### `uiPriority_val`
+
+```python
+uiPriority_val
+```
+
+Value of ```` child or `None` if not present.
+
+### `unhideWhenUsed`
+
+```python
+unhideWhenUsed = ZeroOrOne('w:unhideWhenUsed', successors=_tag_seq[10:])
+```
+
+### `unhideWhenUsed_val`
+
+```python
+unhideWhenUsed_val
+```
+
+Value of `w:unhideWhenUsed/@w:val` or `False` if not present.
+
+## `CT_Styles`
+
+Bases: `BaseOxmlElement`
+
+```` element, the root element of a styles part, i.e. styles.xml.
+
+### `add_style_of_type`
+
+```python
+add_style_of_type(name, style_type, builtin)
+```
+
+Return a newly added `w:style` element having `name` and `style_type`.
+
+`w:style/@customStyle` is set based on the value of `builtin`.
+
+### `default_for`
+
+```python
+default_for(style_type)
+```
+
+Return `w:style[@w:type="*{style_type}*][-1]` or `None` if not found.
+
+### `get_by_id`
+
+```python
+get_by_id(styleId: str) -> CT_Style | None
+```
+
+`w:style` child where @styleId = `styleId`.
+
+`None` if not found.
+
+### `get_by_name`
+
+```python
+get_by_name(name: str) -> CT_Style | None
+```
+
+`w:style` child with `w:name` grandchild having value `name`.
+
+`None` if not found.
+
+### `latentStyles`
+
+```python
+latentStyles = ZeroOrOne('w:latentStyles', successors=_tag_seq[2:])
+```
+
+### `style`
+
+```python
+style = ZeroOrMore('w:style', successors=())
+```
+
+## `styleId_from_name`
+
+```python
+styleId_from_name(name)
+```
+
+Return the style id corresponding to `name`, taking into account special-case
+names such as 'Heading 1'.
+
+
+
+
+
+# `docx.oxml.table`
+
+Custom element classes for tables.
+
+## `CT_Height`
+
+Bases: `BaseOxmlElement`
+
+Used for `w:trHeight` to specify a row height and row height rule.
+
+### `hRule`
+
+```python
+hRule: WD_ROW_HEIGHT_RULE | None = OptionalAttribute('w:hRule', WD_ROW_HEIGHT_RULE)
+```
+
+### `val`
+
+```python
+val: Length | None = OptionalAttribute('w:val', ST_TwipsMeasure)
+```
+
+## `CT_Row`
+
+Bases: `BaseOxmlElement`
+
+```` element.
+
+### `add_tc`
+
+```python
+add_tc: Callable[[], CT_Tc]
+```
+
+### `get_or_add_trPr`
+
+```python
+get_or_add_trPr: Callable[[], CT_TrPr]
+```
+
+### `grid_after`
+
+```python
+grid_after: int
+```
+
+The number of unpopulated layout-grid cells at the end of this row.
+
+### `grid_before`
+
+```python
+grid_before: int
+```
+
+The number of unpopulated layout-grid cells at the start of this row.
+
+### `tblPrEx`
+
+```python
+tblPrEx: CT_TblPrEx | None = ZeroOrOne('w:tblPrEx')
+```
+
+### `tc`
+
+```python
+tc = ZeroOrMore('w:tc')
+```
+
+### `tc_at_grid_offset`
+
+```python
+tc_at_grid_offset(grid_offset: int) -> CT_Tc
+```
+
+The `tc` element in this tr at exact `grid offset`.
+
+Raises ValueError when this `w:tr` contains no `w:tc` with exact starting `grid_offset`.
+
+### `tc_lst`
+
+```python
+tc_lst: list[CT_Tc]
+```
+
+### `trHeight_hRule`
+
+```python
+trHeight_hRule: WD_ROW_HEIGHT_RULE | None
+```
+
+The value of `./w:trPr/w:trHeight/@w:hRule`, or `None` if not present.
+
+### `trHeight_val`
+
+```python
+trHeight_val
+```
+
+Return the value of `w:trPr/w:trHeight@w:val`, or `None` if not present.
+
+### `trPr`
+
+```python
+trPr: CT_TrPr | None = ZeroOrOne('w:trPr')
+```
+
+### `tr_idx`
+
+```python
+tr_idx: int
+```
+
+Index of this `w:tr` element within its parent `w:tbl` element.
+
+## `CT_Tbl`
+
+Bases: `BaseOxmlElement`
+
+```` element.
+
+### `add_tr`
+
+```python
+add_tr: Callable[[], CT_Row]
+```
+
+### `bidiVisual_val`
+
+```python
+bidiVisual_val: bool | None
+```
+
+Value of `./w:tblPr/w:bidiVisual/@w:val` or `None` if not present.
+
+Controls whether table cells are displayed right-to-left or left-to-right.
+
+### `col_count`
+
+```python
+col_count
+```
+
+The number of grid columns in this table.
+
+### `iter_tcs`
+
+```python
+iter_tcs()
+```
+
+Generate each of the `w:tc` elements in this table, left to right and top to
+bottom.
+
+Each cell in the first row is generated, followed by each cell in the second
+row, etc.
+
+### `new_tbl`
+
+```python
+new_tbl(rows: int, cols: int, width: Length) -> CT_Tbl
+```
+
+Return a new `w:tbl` element having `rows` rows and `cols` columns.
+
+`width` is distributed evenly between the columns.
+
+### `tblGrid`
+
+```python
+tblGrid: CT_TblGrid = OneAndOnlyOne('w:tblGrid')
+```
+
+### `tblPr`
+
+```python
+tblPr: CT_TblPr = OneAndOnlyOne('w:tblPr')
+```
+
+### `tblStyle_val`
+
+```python
+tblStyle_val: str | None
+```
+
+`w:tblPr/w:tblStyle/@w:val` (a table style id) or `None` if not present.
+
+### `tr`
+
+```python
+tr = ZeroOrMore('w:tr')
+```
+
+### `tr_lst`
+
+```python
+tr_lst: list[CT_Row]
+```
+
+## `CT_TblGrid`
+
+Bases: `BaseOxmlElement`
+
+`w:tblGrid` element.
+
+Child of `w:tbl`, holds `w:gridCol> elements that define column count, width, etc.
+
+### `add_gridCol`
+
+```python
+add_gridCol: Callable[[], CT_TblGridCol]
+```
+
+### `gridCol`
+
+```python
+gridCol = ZeroOrMore('w:gridCol', successors=('w:tblGridChange',))
+```
+
+### `gridCol_lst`
+
+```python
+gridCol_lst: list[CT_TblGridCol]
+```
+
+## `CT_TblGridCol`
+
+Bases: `BaseOxmlElement`
+
+`w:gridCol` element, child of `w:tblGrid`, defines a table column.
+
+### `gridCol_idx`
+
+```python
+gridCol_idx: int
+```
+
+Index of this `w:gridCol` element within its parent `w:tblGrid` element.
+
+### `w`
+
+```python
+w: Length | None = OptionalAttribute('w:w', ST_TwipsMeasure)
+```
+
+## `CT_TblLayoutType`
+
+Bases: `BaseOxmlElement`
+
+`w:tblLayout` element.
+
+Specifies whether column widths are fixed or can be automatically adjusted based on
+content.
+
+### `type`
+
+```python
+type: str | None = OptionalAttribute('w:type', ST_TblLayoutType)
+```
+
+## `CT_TblPr`
+
+Bases: `BaseOxmlElement`
+
+```` element, child of ````, holds child elements that define
+table properties such as style and borders.
+
+### `alignment`
+
+```python
+alignment: WD_TABLE_ALIGNMENT | None
+```
+
+Horizontal alignment of table, `None` if `./w:jc` is not present.
+
+### `autofit`
+
+```python
+autofit: bool
+```
+
+`False` when there is a `w:tblLayout` child with `@w:type="fixed"`.
+
+Otherwise `True`.
+
+### `bidiVisual`
+
+```python
+bidiVisual: CT_OnOff | None = ZeroOrOne('w:bidiVisual', successors=_tag_seq[4:])
+```
+
+### `get_or_add_bidiVisual`
+
+```python
+get_or_add_bidiVisual: Callable[[], CT_OnOff]
+```
+
+### `get_or_add_jc`
+
+```python
+get_or_add_jc: Callable[[], CT_Jc]
+```
+
+### `get_or_add_tblLayout`
+
+```python
+get_or_add_tblLayout: Callable[[], CT_TblLayoutType]
+```
+
+### `jc`
+
+```python
+jc: CT_Jc | None = ZeroOrOne('w:jc', successors=_tag_seq[8:])
+```
+
+### `style`
+
+```python
+style
+```
+
+Return the value of the ``val`` attribute of the ```` child or
+`None` if not present.
+
+### `tblLayout`
+
+```python
+tblLayout: CT_TblLayoutType | None = ZeroOrOne('w:tblLayout', successors=_tag_seq[13:])
+```
+
+### `tblStyle`
+
+```python
+tblStyle: CT_String | None = ZeroOrOne('w:tblStyle', successors=_tag_seq[1:])
+```
+
+## `CT_TblPrEx`
+
+Bases: `BaseOxmlElement`
+
+`w:tblPrEx` element, exceptions to table-properties.
+
+Applied at a lower level, like a `w:tr` to modify the appearance. Possibly used when
+two tables are merged. For more see:
+http://officeopenxml.com/WPtablePropertyExceptions.php
+
+## `CT_TblWidth`
+
+Bases: `BaseOxmlElement`
+
+Used for `w:tblW` and `w:tcW` and others, specifies a table-related width.
+
+### `type`
+
+```python
+type = RequiredAttribute('w:type', ST_TblWidth)
+```
+
+### `w`
+
+```python
+w: int = RequiredAttribute('w:w', XsdInt)
+```
+
+### `width`
+
+```python
+width: Length | None
+```
+
+EMU length indicated by the combined `w:w` and `w:type` attrs.
+
+## `CT_Tc`
+
+Bases: `BaseOxmlElement`
+
+`w:tc` table cell element.
+
+### `add_p`
+
+```python
+add_p: Callable[[], CT_P]
+```
+
+### `bottom`
+
+```python
+bottom: int
+```
+
+The row index that marks the bottom extent of the vertical span of this cell.
+
+This is one greater than the index of the bottom-most row of the span, similar
+to how a slice of the cell's rows would be specified.
+
+### `clear_content`
+
+```python
+clear_content()
+```
+
+Remove all content elements, preserving `w:tcPr` element if present.
+
+Note that this leaves the `w:tc` element in an invalid state because it doesn't
+contain at least one block-level element. It's up to the caller to add a
+`w:p`child element as the last content element.
+
+### `get_or_add_tcPr`
+
+```python
+get_or_add_tcPr: Callable[[], CT_TcPr]
+```
+
+### `grid_offset`
+
+```python
+grid_offset: int
+```
+
+Starting offset of `tc` in the layout-grid columns of its table.
+
+A cell in the leftmost grid-column has offset 0.
+
+### `grid_span`
+
+```python
+grid_span: int
+```
+
+The integer number of columns this cell spans.
+
+Determined by ./w:tcPr/w:gridSpan/@val, it defaults to 1.
+
+### `inner_content_elements`
+
+```python
+inner_content_elements: list[CT_P | CT_Tbl]
+```
+
+Generate all `w:p` and `w:tbl` elements in this document-body.
+
+Elements appear in document order. Elements shaded by nesting in a `w:ins` or
+other "wrapper" element will not be included.
+
+### `iter_block_items`
+
+```python
+iter_block_items()
+```
+
+Generate a reference to each of the block-level content elements in this
+cell, in the order they appear.
+
+### `left`
+
+```python
+left: int
+```
+
+The grid column index at which this ```` element appears.
+
+### `merge`
+
+```python
+merge(other_tc: CT_Tc) -> CT_Tc
+```
+
+Return top-left `w:tc` element of a new span.
+
+Span is formed by merging the rectangular region defined by using this tc
+element and `other_tc` as diagonal corners.
+
+### `new`
+
+```python
+new() -> CT_Tc
+```
+
+A new `w:tc` element, containing an empty paragraph as the required EG_BlockLevelElt.
+
+### `p`
+
+```python
+p = OneOrMore('w:p')
+```
+
+### `p_lst`
+
+```python
+p_lst: list[CT_P]
+```
+
+### `right`
+
+```python
+right: int
+```
+
+The grid column index that marks the right-side extent of the horizontal span
+of this cell.
+
+This is one greater than the index of the right-most column of the span, similar
+to how a slice of the cell's columns would be specified.
+
+### `tbl`
+
+```python
+tbl = OneOrMore('w:tbl')
+```
+
+### `tbl_lst`
+
+```python
+tbl_lst: list[CT_Tbl]
+```
+
+### `tcPr`
+
+```python
+tcPr: CT_TcPr | None = ZeroOrOne('w:tcPr')
+```
+
+### `top`
+
+```python
+top: int
+```
+
+The top-most row index in the vertical span of this cell.
+
+### `vMerge`
+
+```python
+vMerge: str | None
+```
+
+Value of ./w:tcPr/w:vMerge/@val, `None` if w:vMerge is not present.
+
+### `width`
+
+```python
+width: Length | None
+```
+
+EMU length represented in `./w:tcPr/w:tcW` or `None` if not present.
+
+## `CT_TcPr`
+
+Bases: `BaseOxmlElement`
+
+```` element, defining table cell properties.
+
+### `get_or_add_gridSpan`
+
+```python
+get_or_add_gridSpan: Callable[[], CT_DecimalNumber]
+```
+
+### `get_or_add_tcW`
+
+```python
+get_or_add_tcW: Callable[[], CT_TblWidth]
+```
+
+### `get_or_add_vAlign`
+
+```python
+get_or_add_vAlign: Callable[[], CT_VerticalJc]
+```
+
+### `gridSpan`
+
+```python
+gridSpan: CT_DecimalNumber | None = ZeroOrOne('w:gridSpan', successors=_tag_seq[3:])
+```
+
+### `grid_span`
+
+```python
+grid_span: int
+```
+
+The integer number of columns this cell spans.
+
+Determined by ./w:gridSpan/@val, it defaults to 1.
+
+### `tcW`
+
+```python
+tcW: CT_TblWidth | None = ZeroOrOne('w:tcW', successors=_tag_seq[2:])
+```
+
+### `vAlign`
+
+```python
+vAlign: CT_VerticalJc | None = ZeroOrOne('w:vAlign', successors=_tag_seq[12:])
+```
+
+### `vAlign_val`
+
+```python
+vAlign_val
+```
+
+Value of `w:val` attribute on `w:vAlign` child.
+
+Value is `None` if `w:vAlign` child is not present. The `w:val` attribute on
+`w:vAlign` is required.
+
+### `vMerge`
+
+```python
+vMerge: CT_VMerge | None = ZeroOrOne('w:vMerge', successors=_tag_seq[5:])
+```
+
+### `vMerge_val`
+
+```python
+vMerge_val
+```
+
+The value of the ./w:vMerge/@val attribute, or `None` if the w:vMerge element
+is not present.
+
+### `width`
+
+```python
+width: Length | None
+```
+
+EMU length in `./w:tcW` or `None` if not present or its type is not 'dxa'.
+
+## `CT_TrPr`
+
+Bases: `BaseOxmlElement`
+
+```` element, defining table row properties.
+
+### `get_or_add_trHeight`
+
+```python
+get_or_add_trHeight: Callable[[], CT_Height]
+```
+
+### `gridAfter`
+
+```python
+gridAfter: CT_DecimalNumber | None = ZeroOrOne('w:gridAfter', successors=_tag_seq[4:])
+```
+
+### `gridBefore`
+
+```python
+gridBefore: CT_DecimalNumber | None = ZeroOrOne('w:gridBefore', successors=_tag_seq[3:])
+```
+
+### `grid_after`
+
+```python
+grid_after: int
+```
+
+The number of unpopulated layout-grid cells at the end of this row.
+
+### `grid_before`
+
+```python
+grid_before: int
+```
+
+The number of unpopulated layout-grid cells at the start of this row.
+
+### `trHeight`
+
+```python
+trHeight: CT_Height | None = ZeroOrOne('w:trHeight', successors=_tag_seq[8:])
+```
+
+### `trHeight_hRule`
+
+```python
+trHeight_hRule: WD_ROW_HEIGHT_RULE | None
+```
+
+Return the value of `w:trHeight@w:hRule`, or `None` if not present.
+
+### `trHeight_val`
+
+```python
+trHeight_val
+```
+
+Return the value of `w:trHeight@w:val`, or `None` if not present.
+
+## `CT_VMerge`
+
+Bases: `BaseOxmlElement`
+
+```` element, specifying vertical merging behavior of a cell.
+
+### `val`
+
+```python
+val: str | None = OptionalAttribute('w:val', ST_Merge, default=ST_Merge.CONTINUE)
+```
+
+## `CT_VerticalJc`
+
+Bases: `BaseOxmlElement`
+
+`w:vAlign` element, specifying vertical alignment of cell.
+
+### `val`
+
+```python
+val: WD_CELL_VERTICAL_ALIGNMENT = RequiredAttribute('w:val', WD_CELL_VERTICAL_ALIGNMENT)
+```
+
+
+
+
+
+# `docx.oxml.text.font`
+
+Custom element classes related to run properties (font).
+
+## `CT_Color`
+
+Bases: `BaseOxmlElement`
+
+`w:color` element, specifying the color of a font and perhaps other objects.
+
+### `themeColor`
+
+```python
+themeColor: MSO_THEME_COLOR | None = OptionalAttribute('w:themeColor', MSO_THEME_COLOR)
+```
+
+### `val`
+
+```python
+val: RGBColor | str = RequiredAttribute('w:val', ST_HexColor)
+```
+
+## `CT_Fonts`
+
+Bases: `BaseOxmlElement`
+
+`` element.
+
+Specifies typeface name for the various language types.
+
+### `ascii`
+
+```python
+ascii: str | None = OptionalAttribute('w:ascii', ST_String)
+```
+
+### `hAnsi`
+
+```python
+hAnsi: str | None = OptionalAttribute('w:hAnsi', ST_String)
+```
+
+## `CT_Highlight`
+
+Bases: `BaseOxmlElement`
+
+`w:highlight` element, specifying font highlighting/background color.
+
+### `val`
+
+```python
+val: WD_COLOR_INDEX = RequiredAttribute('w:val', WD_COLOR_INDEX)
+```
+
+## `CT_HpsMeasure`
+
+Bases: `BaseOxmlElement`
+
+Used for `` element and others, specifying font size in half-points.
+
+### `val`
+
+```python
+val: Length = RequiredAttribute('w:val', ST_HpsMeasure)
+```
+
+## `CT_RPr`
+
+Bases: `BaseOxmlElement`
+
+`` element, containing the properties for a run.
+
+### `b`
+
+```python
+b: CT_OnOff | None = ZeroOrOne('w:b', successors=_tag_seq[3:])
+```
+
+### `bCs`
+
+```python
+bCs = ZeroOrOne('w:bCs', successors=_tag_seq[4:])
+```
+
+### `caps`
+
+```python
+caps = ZeroOrOne('w:caps', successors=_tag_seq[7:])
+```
+
+### `color`
+
+```python
+color: CT_Color | None = ZeroOrOne('w:color', successors=_tag_seq[19:])
+```
+
+### `cs`
+
+```python
+cs = ZeroOrOne('w:cs', successors=_tag_seq[34:])
+```
+
+### `dstrike`
+
+```python
+dstrike = ZeroOrOne('w:dstrike', successors=_tag_seq[10:])
+```
+
+### `emboss`
+
+```python
+emboss = ZeroOrOne('w:emboss', successors=_tag_seq[13:])
+```
+
+### `get_or_add_color`
+
+```python
+get_or_add_color: Callable[[], CT_Color]
+```
+
+### `get_or_add_highlight`
+
+```python
+get_or_add_highlight: Callable[[], CT_Highlight]
+```
+
+### `get_or_add_rFonts`
+
+```python
+get_or_add_rFonts: Callable[[], CT_Fonts]
+```
+
+### `get_or_add_sz`
+
+```python
+get_or_add_sz: Callable[[], CT_HpsMeasure]
+```
+
+### `get_or_add_vertAlign`
+
+```python
+get_or_add_vertAlign: Callable[[], CT_VerticalAlignRun]
+```
+
+### `highlight`
+
+```python
+highlight: CT_Highlight | None = ZeroOrOne('w:highlight', successors=_tag_seq[26:])
+```
+
+### `highlight_val`
+
+```python
+highlight_val: WD_COLOR_INDEX | None
+```
+
+Value of `./w:highlight/@val`.
+
+Specifies font's highlight color, or `None` if the text is not highlighted.
+
+### `i`
+
+```python
+i = ZeroOrOne('w:i', successors=_tag_seq[5:])
+```
+
+### `iCs`
+
+```python
+iCs = ZeroOrOne('w:iCs', successors=_tag_seq[6:])
+```
+
+### `imprint`
+
+```python
+imprint = ZeroOrOne('w:imprint', successors=_tag_seq[14:])
+```
+
+### `noProof`
+
+```python
+noProof = ZeroOrOne('w:noProof', successors=_tag_seq[15:])
+```
+
+### `oMath`
+
+```python
+oMath = ZeroOrOne('w:oMath', successors=_tag_seq[39:])
+```
+
+### `outline`
+
+```python
+outline = ZeroOrOne('w:outline', successors=_tag_seq[11:])
+```
+
+### `rFonts`
+
+```python
+rFonts: CT_Fonts | None = ZeroOrOne('w:rFonts', successors=_tag_seq[2:])
+```
+
+### `rFonts_ascii`
+
+```python
+rFonts_ascii: str | None
+```
+
+The value of `w:rFonts/@w:ascii` or `None` if not present.
+
+Represents the assigned typeface name. The rFonts element also specifies other
+special-case typeface names; this method handles the case where just the common
+name is required.
+
+### `rFonts_hAnsi`
+
+```python
+rFonts_hAnsi: str | None
+```
+
+The value of `w:rFonts/@w:hAnsi` or `None` if not present.
+
+### `rStyle`
+
+```python
+rStyle: CT_String | None = ZeroOrOne('w:rStyle', successors=_tag_seq[1:])
+```
+
+### `rtl`
+
+```python
+rtl = ZeroOrOne('w:rtl', successors=_tag_seq[33:])
+```
+
+### `shadow`
+
+```python
+shadow = ZeroOrOne('w:shadow', successors=_tag_seq[12:])
+```
+
+### `smallCaps`
+
+```python
+smallCaps = ZeroOrOne('w:smallCaps', successors=_tag_seq[8:])
+```
+
+### `snapToGrid`
+
+```python
+snapToGrid = ZeroOrOne('w:snapToGrid', successors=_tag_seq[16:])
+```
+
+### `specVanish`
+
+```python
+specVanish = ZeroOrOne('w:specVanish', successors=_tag_seq[38:])
+```
+
+### `strike`
+
+```python
+strike = ZeroOrOne('w:strike', successors=_tag_seq[9:])
+```
+
+### `style`
+
+```python
+style: str | None
+```
+
+String in `./w:rStyle/@val`, or None if `w:rStyle` is not present.
+
+### `subscript`
+
+```python
+subscript: bool | None
+```
+
+`True` if `./w:vertAlign/@w:val` is "subscript".
+
+`False` if `w:vertAlign/@w:val` contains any other value. `None` if
+`w:vertAlign` is not present.
+
+### `superscript`
+
+```python
+superscript: bool | None
+```
+
+`True` if `w:vertAlign/@w:val` is 'superscript'.
+
+`False` if `w:vertAlign/@w:val` contains any other value. `None` if
+`w:vertAlign` is not present.
+
+### `sz`
+
+```python
+sz: CT_HpsMeasure | None = ZeroOrOne('w:sz', successors=_tag_seq[24:])
+```
+
+### `sz_val`
+
+```python
+sz_val: Length | None
+```
+
+The value of `w:sz/@w:val` or `None` if not present.
+
+### `u`
+
+```python
+u: CT_Underline | None = ZeroOrOne('w:u', successors=_tag_seq[27:])
+```
+
+### `u_val`
+
+```python
+u_val: WD_UNDERLINE | None
+```
+
+Value of `w:u/@val`, or None if not present.
+
+Values `WD_UNDERLINE.SINGLE` and `WD_UNDERLINE.NONE` are mapped to `True` and
+`False` respectively.
+
+### `vanish`
+
+```python
+vanish = ZeroOrOne('w:vanish', successors=_tag_seq[17:])
+```
+
+### `vertAlign`
+
+```python
+vertAlign: CT_VerticalAlignRun | None = ZeroOrOne('w:vertAlign', successors=_tag_seq[32:])
+```
+
+### `webHidden`
+
+```python
+webHidden = ZeroOrOne('w:webHidden', successors=_tag_seq[18:])
+```
+
+## `CT_Underline`
+
+Bases: `BaseOxmlElement`
+
+`` element, specifying the underlining style for a run.
+
+### `val`
+
+```python
+val: WD_UNDERLINE | None = OptionalAttribute('w:val', WD_UNDERLINE)
+```
+
+## `CT_VerticalAlignRun`
+
+Bases: `BaseOxmlElement`
+
+`` element, specifying subscript or superscript.
+
+### `val`
+
+```python
+val: str = RequiredAttribute('w:val', ST_VerticalAlignRun)
+```
+
+
+
+
+
+# `docx.oxml.text.hyperlink`
+
+Custom element classes related to hyperlinks (CT_Hyperlink).
+
+## `CT_Hyperlink`
+
+Bases: `BaseOxmlElement`
+
+`` element, containing the text and address for a hyperlink.
+
+### `anchor`
+
+```python
+anchor: str | None = OptionalAttribute('w:anchor', ST_String)
+```
+
+### `history`
+
+```python
+history: bool = OptionalAttribute('w:history', ST_OnOff, default=True)
+```
+
+### `lastRenderedPageBreaks`
+
+```python
+lastRenderedPageBreaks: List[CT_LastRenderedPageBreak]
+```
+
+All `w:lastRenderedPageBreak` descendants of this hyperlink.
+
+### `r`
+
+```python
+r = ZeroOrMore('w:r')
+```
+
+### `rId`
+
+```python
+rId: str | None = OptionalAttribute('r:id', XsdString)
+```
+
+### `r_lst`
+
+```python
+r_lst: List[CT_R]
+```
+
+### `text`
+
+```python
+text: str
+```
+
+The textual content of this hyperlink.
+
+`CT_Hyperlink` stores the hyperlink-text as one or more `w:r` children.
+
+
+
+
+
+# `docx.oxml.text.pagebreak`
+
+Custom element class for rendered page-break (CT_LastRenderedPageBreak).
+
+## `CT_LastRenderedPageBreak`
+
+Bases: `BaseOxmlElement`
+
+`` element, indicating page break inserted by renderer.
+
+A rendered page-break is one inserted by the renderer when it runs out of room on a
+page. It is an empty element (no attrs or children) and is a child of CT_R, peer to
+CT_Text.
+
+NOTE: this complex-type name does not exist in the schema, where
+`w:lastRenderedPageBreak` maps to `CT_Empty`. This name was added to give it
+distinguished behavior. CT_Empty is used for many elements.
+
+### `following_fragment_p`
+
+```python
+following_fragment_p: CT_P
+```
+
+A "loose" `CT_P` containing only the paragraph content before this break.
+
+Raises `ValueError` if this `w:lastRenderedPageBreak` is not the first rendered
+page-break in its paragraph.
+
+The returned `CT_P` is a "clone" (deepcopy) of the `w:p` ancestor of this
+page-break with this `w:lastRenderedPageBreak` element and all content preceding
+it removed.
+
+NOTE: this `w:p` can itself contain one or more `w:renderedPageBreak` elements
+(when the paragraph contained more than one). While this is rare, the caller
+should treat this paragraph the same as other paragraphs and split it if
+necessary in a folloing step or recursion.
+
+### `follows_all_content`
+
+```python
+follows_all_content: bool
+```
+
+True when this page-break element is the last "content" in the paragraph.
+
+This is very uncommon case and may only occur in contrived or cases where the
+XML is edited by hand, but it is not precluded by the spec.
+
+### `precedes_all_content`
+
+```python
+precedes_all_content: bool
+```
+
+True when a `w:lastRenderedPageBreak` precedes all paragraph content.
+
+This is a common case; it occurs whenever the page breaks on an even paragraph
+boundary.
+
+### `preceding_fragment_p`
+
+```python
+preceding_fragment_p: CT_P
+```
+
+A "loose" `CT_P` containing only the paragraph content before this break.
+
+Raises `ValueError` if this `w:lastRenderedPageBreak` is not the first rendered
+paragraph in its paragraph.
+
+The returned `CT_P` is a "clone" (deepcopy) of the `w:p` ancestor of this
+page-break with this `w:lastRenderedPageBreak` element and all its following
+siblings removed.
+
+
+
+
+
+# `docx.oxml.text.paragraph`
+
+Custom element classes related to paragraphs (CT_P).
+
+## `CT_P`
+
+Bases: `BaseOxmlElement`
+
+`` element, containing the properties and text for a paragraph.
+
+### `add_p_before`
+
+```python
+add_p_before() -> CT_P
+```
+
+Return a new `` element inserted directly prior to this one.
+
+### `add_r`
+
+```python
+add_r: Callable[[], CT_R]
+```
+
+### `alignment`
+
+```python
+alignment: WD_PARAGRAPH_ALIGNMENT | None
+```
+
+The value of the `` grandchild element or `None` if not present.
+
+### `clear_content`
+
+```python
+clear_content()
+```
+
+Remove all child elements, except the `` element if present.
+
+### `get_or_add_pPr`
+
+```python
+get_or_add_pPr: Callable[[], CT_PPr]
+```
+
+### `hyperlink`
+
+```python
+hyperlink = ZeroOrMore('w:hyperlink')
+```
+
+### `hyperlink_lst`
+
+```python
+hyperlink_lst: List[CT_Hyperlink]
+```
+
+### `inner_content_elements`
+
+```python
+inner_content_elements: List[CT_R | CT_Hyperlink]
+```
+
+Run and hyperlink children of the `w:p` element, in document order.
+
+### `lastRenderedPageBreaks`
+
+```python
+lastRenderedPageBreaks: List[CT_LastRenderedPageBreak]
+```
+
+All `w:lastRenderedPageBreak` descendants of this paragraph.
+
+Rendered page-breaks commonly occur in a run but can also occur in a run inside
+a hyperlink. This returns both.
+
+### `pPr`
+
+```python
+pPr: CT_PPr | None = ZeroOrOne('w:pPr')
+```
+
+### `r`
+
+```python
+r = ZeroOrMore('w:r')
+```
+
+### `r_lst`
+
+```python
+r_lst: List[CT_R]
+```
+
+### `set_sectPr`
+
+```python
+set_sectPr(sectPr: CT_SectPr)
+```
+
+Unconditionally replace or add `sectPr` as grandchild in correct sequence.
+
+### `style`
+
+```python
+style: str | None
+```
+
+String contained in `w:val` attribute of `./w:pPr/w:pStyle` grandchild.
+
+`None` if not present.
+
+### `text`
+
+```python
+text
+```
+
+The textual content of this paragraph.
+
+Inner-content child elements like `w:r` and `w:hyperlink` are translated to
+their text equivalent.
+
+
+
+
+
+# `docx.oxml.text.parfmt`
+
+Custom element classes related to paragraph properties (CT_PPr).
+
+## `CT_Ind`
+
+Bases: `BaseOxmlElement`
+
+```` element, specifying paragraph indentation.
+
+### `firstLine`
+
+```python
+firstLine: Length | None = OptionalAttribute('w:firstLine', ST_TwipsMeasure)
+```
+
+### `hanging`
+
+```python
+hanging: Length | None = OptionalAttribute('w:hanging', ST_TwipsMeasure)
+```
+
+### `left`
+
+```python
+left: Length | None = OptionalAttribute('w:left', ST_SignedTwipsMeasure)
+```
+
+### `right`
+
+```python
+right: Length | None = OptionalAttribute('w:right', ST_SignedTwipsMeasure)
+```
+
+## `CT_Jc`
+
+Bases: `BaseOxmlElement`
+
+```` element, specifying paragraph justification.
+
+### `val`
+
+```python
+val: WD_ALIGN_PARAGRAPH = RequiredAttribute('w:val', WD_ALIGN_PARAGRAPH)
+```
+
+## `CT_PPr`
+
+Bases: `BaseOxmlElement`
+
+```` element, containing the properties for a paragraph.
+
+### `first_line_indent`
+
+```python
+first_line_indent: Length | None
+```
+
+A `Length` value calculated from the values of `w:ind/@w:firstLine` and
+`w:ind/@w:hanging`.
+
+Returns `None` if the `w:ind` child is not present.
+
+### `get_or_add_ind`
+
+```python
+get_or_add_ind: Callable[[], CT_Ind]
+```
+
+### `get_or_add_pStyle`
+
+```python
+get_or_add_pStyle: Callable[[], CT_String]
+```
+
+### `get_or_add_sectPr`
+
+```python
+get_or_add_sectPr: Callable[[], CT_SectPr]
+```
+
+### `ind`
+
+```python
+ind: CT_Ind | None = ZeroOrOne('w:ind', successors=_tag_seq[23:])
+```
+
+### `ind_left`
+
+```python
+ind_left: Length | None
+```
+
+The value of `w:ind/@w:left` or `None` if not present.
+
+### `ind_right`
+
+```python
+ind_right: Length | None
+```
+
+The value of `w:ind/@w:right` or `None` if not present.
+
+### `jc`
+
+```python
+jc = ZeroOrOne('w:jc', successors=_tag_seq[27:])
+```
+
+### `jc_val`
+
+```python
+jc_val: WD_ALIGN_PARAGRAPH | None
+```
+
+Value of the `` child element or `None` if not present.
+
+### `keepLines`
+
+```python
+keepLines = ZeroOrOne('w:keepLines', successors=_tag_seq[3:])
+```
+
+### `keepLines_val`
+
+```python
+keepLines_val
+```
+
+The value of `keepLines/@val` or `None` if not present.
+
+### `keepNext`
+
+```python
+keepNext = ZeroOrOne('w:keepNext', successors=_tag_seq[2:])
+```
+
+### `keepNext_val`
+
+```python
+keepNext_val
+```
+
+The value of `keepNext/@val` or `None` if not present.
+
+### `numPr`
+
+```python
+numPr = ZeroOrOne('w:numPr', successors=_tag_seq[7:])
+```
+
+### `outlineLvl`
+
+```python
+outlineLvl: CT_DecimalNumber = ZeroOrOne('w:outlineLvl', successors=_tag_seq[31:])
+```
+
+### `pStyle`
+
+```python
+pStyle: CT_String | None = ZeroOrOne('w:pStyle', successors=_tag_seq[1:])
+```
+
+### `pageBreakBefore`
+
+```python
+pageBreakBefore = ZeroOrOne('w:pageBreakBefore', successors=_tag_seq[4:])
+```
+
+### `pageBreakBefore_val`
+
+```python
+pageBreakBefore_val
+```
+
+The value of `pageBreakBefore/@val` or `None` if not present.
+
+### `sectPr`
+
+```python
+sectPr = ZeroOrOne('w:sectPr', successors=_tag_seq[35:])
+```
+
+### `spacing`
+
+```python
+spacing = ZeroOrOne('w:spacing', successors=_tag_seq[22:])
+```
+
+### `spacing_after`
+
+```python
+spacing_after
+```
+
+The value of `w:spacing/@w:after` or `None` if not present.
+
+### `spacing_before`
+
+```python
+spacing_before
+```
+
+The value of `w:spacing/@w:before` or `None` if not present.
+
+### `spacing_line`
+
+```python
+spacing_line
+```
+
+The value of `w:spacing/@w:line` or `None` if not present.
+
+### `spacing_lineRule`
+
+```python
+spacing_lineRule
+```
+
+The value of `w:spacing/@w:lineRule` as a member of the `WdLineSpacing`
+enumeration.
+
+Only the `MULTIPLE`, `EXACTLY`, and `AT_LEAST` members are used. It is the
+responsibility of the client to calculate the use of `SINGLE`, `DOUBLE`, and
+`MULTIPLE` based on the value of `w:spacing/@w:line` if that behavior is
+desired.
+
+### `style`
+
+```python
+style: str | None
+```
+
+String contained in `./w:pStyle/@val`, or None if child is not present.
+
+### `tabs`
+
+```python
+tabs = ZeroOrOne('w:tabs', successors=_tag_seq[11:])
+```
+
+### `widowControl`
+
+```python
+widowControl = ZeroOrOne('w:widowControl', successors=_tag_seq[6:])
+```
+
+### `widowControl_val`
+
+```python
+widowControl_val
+```
+
+The value of `widowControl/@val` or `None` if not present.
+
+## `CT_Spacing`
+
+Bases: `BaseOxmlElement`
+
+```` element, specifying paragraph spacing attributes such as space
+before and line spacing.
+
+### `after`
+
+```python
+after = OptionalAttribute('w:after', ST_TwipsMeasure)
+```
+
+### `before`
+
+```python
+before = OptionalAttribute('w:before', ST_TwipsMeasure)
+```
+
+### `line`
+
+```python
+line = OptionalAttribute('w:line', ST_SignedTwipsMeasure)
+```
+
+### `lineRule`
+
+```python
+lineRule = OptionalAttribute('w:lineRule', WD_LINE_SPACING)
+```
+
+## `CT_TabStop`
+
+Bases: `BaseOxmlElement`
+
+`` element, representing an individual tab stop.
+
+Overloaded to use for a tab-character in a run, which also uses the w:tab tag but
+only needs a __str__ method.
+
+### `leader`
+
+```python
+leader: WD_TAB_LEADER | None = OptionalAttribute('w:leader', WD_TAB_LEADER, default=WD_TAB_LEADER.SPACES)
+```
+
+### `pos`
+
+```python
+pos: Length = RequiredAttribute('w:pos', ST_SignedTwipsMeasure)
+```
+
+### `val`
+
+```python
+val: WD_TAB_ALIGNMENT = RequiredAttribute('w:val', WD_TAB_ALIGNMENT)
+```
+
+## `CT_TabStops`
+
+Bases: `BaseOxmlElement`
+
+```` element, container for a sorted sequence of tab stops.
+
+### `insert_tab_in_order`
+
+```python
+insert_tab_in_order(pos, align, leader)
+```
+
+Insert a newly created `w:tab` child element in `pos` order.
+
+### `tab`
+
+```python
+tab = OneOrMore('w:tab', successors=())
+```
+
+
+
+
+
+# `docx.oxml.text.run`
+
+Custom element classes related to text runs (CT_R).
+
+## `CT_Br`
+
+Bases: `BaseOxmlElement`
+
+`` element, indicating a line, page, or column break in a run.
+
+### `clear`
+
+```python
+clear: str | None = OptionalAttribute('w:clear', ST_BrClear)
+```
+
+### `type`
+
+```python
+type: str | None = OptionalAttribute('w:type', ST_BrType, default='textWrapping')
+```
+
+## `CT_Cr`
+
+Bases: `BaseOxmlElement`
+
+`` element, representing a carriage-return (0x0D) character within a run.
+
+ In Word, this represents a "soft carriage-return" in the sense that it does not end
+ the paragraph the way pressing Enter (aka. Return) on the keyboard does. Here the
+ text equivalent is considered to be newline ("
+") since in plain-text that's the
+ closest Python equivalent.
+
+ NOTE: this complex-type name does not exist in the schema, where `w:tab` maps to
+ `CT_Empty`. This name was added to give it distinguished behavior. CT_Empty is used
+ for many elements.
+
+## `CT_NoBreakHyphen`
+
+Bases: `BaseOxmlElement`
+
+`` element, a hyphen ineligible for a line-wrap position.
+
+This maps to a plain-text dash ("-").
+
+NOTE: this complex-type name does not exist in the schema, where `w:noBreakHyphen`
+maps to `CT_Empty`. This name was added to give it behavior distinguished from the
+many other elements represented in the schema by CT_Empty.
+
+## `CT_PTab`
+
+Bases: `BaseOxmlElement`
+
+`` element, representing an absolute-position tab character within a run.
+
+This character advances the rendering position to the specified position regardless
+of any tab-stops, perhaps for layout of a table-of-contents (TOC) or similar.
+
+## `CT_R`
+
+Bases: `BaseOxmlElement`
+
+`` element, containing the properties and text for a run.
+
+### `add_br`
+
+```python
+add_br: Callable[[], CT_Br]
+```
+
+### `add_drawing`
+
+```python
+add_drawing(inline_or_anchor: CT_Inline | CT_Anchor) -> CT_Drawing
+```
+
+Return newly appended `CT_Drawing` (`w:drawing`) child element.
+
+The `w:drawing` element has `inline_or_anchor` as its child.
+
+### `add_t`
+
+```python
+add_t(text: str) -> CT_Text
+```
+
+Return a newly added `` element containing `text`.
+
+### `add_tab`
+
+```python
+add_tab: Callable[[], CT_TabStop]
+```
+
+### `br`
+
+```python
+br = ZeroOrMore('w:br')
+```
+
+### `clear_content`
+
+```python
+clear_content() -> None
+```
+
+Remove all child elements except a `w:rPr` element if present.
+
+### `cr`
+
+```python
+cr = ZeroOrMore('w:cr')
+```
+
+### `drawing`
+
+```python
+drawing = ZeroOrMore('w:drawing')
+```
+
+### `get_or_add_rPr`
+
+```python
+get_or_add_rPr: Callable[[], CT_RPr]
+```
+
+### `inner_content_items`
+
+```python
+inner_content_items: List[str | CT_Drawing | CT_LastRenderedPageBreak]
+```
+
+Text of run, possibly punctuated by `w:lastRenderedPageBreak` elements.
+
+### `insert_comment_range_end_and_reference_below`
+
+```python
+insert_comment_range_end_and_reference_below(comment_id: int) -> None
+```
+
+Insert a `w:commentRangeEnd` and `w:commentReference` element after this run.
+
+The `w:commentRangeEnd` element is the immediate sibling of this `w:r` and is followed by
+a `w:r` containing the `w:commentReference` element.
+
+### `insert_comment_range_start_above`
+
+```python
+insert_comment_range_start_above(comment_id: int) -> None
+```
+
+Insert a `w:commentRangeStart` element with `comment_id` before this run.
+
+### `lastRenderedPageBreaks`
+
+```python
+lastRenderedPageBreaks: List[CT_LastRenderedPageBreak]
+```
+
+All `w:lastRenderedPageBreaks` descendants of this run.
+
+### `rPr`
+
+```python
+rPr: CT_RPr | None = ZeroOrOne('w:rPr')
+```
+
+### `style`
+
+```python
+style: str | None
+```
+
+String contained in `w:val` attribute of `w:rStyle` grandchild.
+
+`None` if that element is not present.
+
+### `t`
+
+```python
+t = ZeroOrMore('w:t')
+```
+
+### `tab`
+
+```python
+tab = ZeroOrMore('w:tab')
+```
+
+### `text`
+
+```python
+text: str
+```
+
+The textual content of this run.
+
+Inner-content child elements like `w:tab` are translated to their text
+equivalent.
+
+## `CT_Text`
+
+Bases: `BaseOxmlElement`
+
+`` element, containing a sequence of characters within a run.
+
+
+
+
+
+# `docx.oxml.xmlchemy`
+
+Enabling declarative definition of lxml custom element classes.
+
+## `BaseAttribute`
+
+```python
+BaseAttribute(attr_name: str, simple_type: Type[BaseXmlEnum] | Type[BaseSimpleType])
+```
+
+Base class for OptionalAttribute and RequiredAttribute.
+
+Provides common methods.
+
+### `populate_class_members`
+
+```python
+populate_class_members(element_cls: MetaOxmlElement, prop_name: str) -> None
+```
+
+Add the appropriate methods to `element_cls`.
+
+## `BaseOxmlElement`
+
+Bases: `ElementBase`
+
+Effective base class for all custom element classes.
+
+Adds standardized behavior to all classes in one place.
+
+### `first_child_found_in`
+
+```python
+first_child_found_in(*tagnames: str) -> _Element | None
+```
+
+First child with tag in `tagnames`, or None if not found.
+
+### `insert_element_before`
+
+```python
+insert_element_before(elm: ElementBase, *tagnames: str)
+```
+
+### `remove_all`
+
+```python
+remove_all(*tagnames: str) -> None
+```
+
+Remove child elements with tagname (e.g. "a:p") in `tagnames`.
+
+### `xml`
+
+```python
+xml: str
+```
+
+XML string for this element, suitable for testing purposes.
+
+Pretty printed for readability and without an XML declaration at the top.
+
+### `xpath`
+
+```python
+xpath(xpath_str: str) -> Any
+```
+
+Override of `lxml` _Element.xpath() method.
+
+Provides standard Open XML namespace mapping (`nsmap`) in centralized location.
+
+## `Choice`
+
+Bases: `_BaseChildElement`
+
+Defines a child element belonging to a group, only one of which may appear as a child.
+
+### `nsptagname`
+
+```python
+nsptagname
+```
+
+### `populate_class_members`
+
+```python
+populate_class_members(element_cls: MetaOxmlElement, group_prop_name: str, successors: tuple[str, ...]) -> None
+```
+
+Add the appropriate methods to `element_cls`.
+
+## `MetaOxmlElement`
+
+```python
+MetaOxmlElement(clsname: str, bases: tuple[type, ...], namespace: dict[str, Any])
+```
+
+Bases: `type`
+
+Metaclass for BaseOxmlElement.
+
+## `OneAndOnlyOne`
+
+```python
+OneAndOnlyOne(nsptagname: str)
+```
+
+Bases: `_BaseChildElement`
+
+Defines a required child element for MetaOxmlElement.
+
+### `populate_class_members`
+
+```python
+populate_class_members(element_cls: MetaOxmlElement, prop_name: str) -> None
+```
+
+Add the appropriate methods to `element_cls`.
+
+## `OneOrMore`
+
+Bases: `_BaseChildElement`
+
+Defines a repeating child element for MetaOxmlElement that must appear at least
+once.
+
+### `populate_class_members`
+
+```python
+populate_class_members(element_cls: MetaOxmlElement, prop_name: str) -> None
+```
+
+Add the appropriate methods to `element_cls`.
+
+## `OptionalAttribute`
+
+```python
+OptionalAttribute(attr_name: str, simple_type: Type[BaseXmlEnum] | Type[BaseSimpleType], default: BaseXmlEnum | BaseSimpleType | str | bool | None = None)
+```
+
+Bases: `BaseAttribute`
+
+Defines an optional attribute on a custom element class.
+
+An optional attribute returns a default value when not present for reading. When
+assigned `None`, the attribute is removed, but still returns the default value when
+one is specified.
+
+## `RequiredAttribute`
+
+Bases: `BaseAttribute`
+
+Defines a required attribute on a custom element class.
+
+A required attribute is assumed to be present for reading, so does not have a
+default value; its actual value is always used. If missing on read, an
+`InvalidXmlError` is raised. It also does not remove the attribute if `None` is
+assigned. Assigning `None` raises `TypeError` or `ValueError`, depending on the
+simple type of the attribute.
+
+## `XmlString`
+
+Bases: `str`
+
+Provides string comparison override suitable for serialized XML that is useful
+for tests.
+
+## `ZeroOrMore`
+
+Bases: `_BaseChildElement`
+
+Defines an optional repeating child element for MetaOxmlElement.
+
+### `populate_class_members`
+
+```python
+populate_class_members(element_cls: MetaOxmlElement, prop_name: str) -> None
+```
+
+Add the appropriate methods to `element_cls`.
+
+## `ZeroOrOne`
+
+Bases: `_BaseChildElement`
+
+Defines an optional child element for MetaOxmlElement.
+
+### `populate_class_members`
+
+```python
+populate_class_members(element_cls: MetaOxmlElement, prop_name: str) -> None
+```
+
+Add the appropriate methods to `element_cls`.
+
+## `ZeroOrOneChoice`
+
+```python
+ZeroOrOneChoice(choices: Sequence[Choice], successors: tuple[str, ...] = ())
+```
+
+Bases: `_BaseChildElement`
+
+Correspondes to an ``EG_*`` element group where at most one of its members may
+appear as a child.
+
+### `populate_class_members`
+
+```python
+populate_class_members(element_cls: MetaOxmlElement, prop_name: str) -> None
+```
+
+Add the appropriate methods to `element_cls`.
+
+## `serialize_for_reading`
+
+```python
+serialize_for_reading(element: ElementBase)
+```
+
+Serialize `element` to human-readable XML suitable for tests.
+
+No XML declaration.
+
+
+
+
+
+# `docx.package`
+
+WordprocessingML Package class and related objects.
+
+## `CompareFinding`
+
+```python
+CompareFinding(kind: str, story: str, detail: str) -> None
+```
+
+One difference compare REPORTS instead of redlining (declared limit).
+
+### `detail`
+
+```python
+detail: str
+```
+
+### `kind`
+
+```python
+kind: str
+```
+
+### `story`
+
+```python
+story: str
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `CompareResult`
+
+```python
+CompareResult(document: 'Document', findings: List[CompareFinding], revision_count: int, stories: Tuple[str, ...]) -> None
+```
+
+The redlined document plus everything compare could not redline.
+
+### `document`
+
+```python
+document: 'Document'
+```
+
+### `findings`
+
+```python
+findings: List[CompareFinding]
+```
+
+### `revision_count`
+
+```python
+revision_count: int
+```
+
+### `stories`
+
+```python
+stories: Tuple[str, ...]
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `ImageParts`
+
+```python
+ImageParts()
+```
+
+Collection of `ImagePart` objects corresponding to images in the package.
+
+### `append`
+
+```python
+append(item: ImagePart)
+```
+
+### `get_or_add_image_part`
+
+```python
+get_or_add_image_part(image_descriptor: str | IO[bytes]) -> ImagePart
+```
+
+Return `ImagePart` object containing image identified by `image_descriptor`.
+
+The image-part is newly created if a matching one is not present in the
+collection.
+
+## `Package`
+
+Bases: `OpcPackage`
+
+Customizations specific to a WordprocessingML package.
+
+### `after_unmarshal`
+
+```python
+after_unmarshal()
+```
+
+Called by loading code after all parts and relationships have been loaded.
+
+This method affords the opportunity for any required post-processing.
+
+### `get_or_add_image_part`
+
+```python
+get_or_add_image_part(image_descriptor: str | IO[bytes]) -> ImagePart
+```
+
+Return `ImagePart` containing image specified by `image_descriptor`.
+
+The image-part is newly created if a matching one is not already present in the
+collection.
+
+### `image_parts`
+
+```python
+image_parts() -> ImageParts
+```
+
+`ImageParts` collection object for this package.
+
+## `PackageDiagnosis`
+
+```python
+PackageDiagnosis(path: str, readable: bool, kind: str, problems: Tuple[str, ...]) -> None
+```
+
+Typed triage for a file `docx.Document()` may refuse or crash on.
+
+`readable` means "this package can open it as a WordprocessingML
+document"; `kind` names what the file actually is; `problems` say why it
+is not readable (empty when it is).
+
+### `kind`
+
+```python
+kind: str
+```
+
+### `path`
+
+```python
+path: str
+```
+
+### `problems`
+
+```python
+problems: Tuple[str, ...]
+```
+
+### `readable`
+
+```python
+readable: bool
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `PackageDiff`
+
+```python
+PackageDiff(added: Tuple[str, ...], removed: Tuple[str, ...], changed: Tuple[PartDiff, ...], byte_identical_count: int) -> None
+```
+
+Part-by-part comparison of two OPC packages.
+
+### `added`
+
+```python
+added: Tuple[str, ...]
+```
+
+### `byte_identical_count`
+
+```python
+byte_identical_count: int
+```
+
+### `changed`
+
+```python
+changed: Tuple[PartDiff, ...]
+```
+
+### `is_semantically_empty`
+
+```python
+is_semantically_empty: bool
+```
+
+True when the packages hold the same parts with the same meaning.
+
+### `removed`
+
+```python
+removed: Tuple[str, ...]
+```
+
+### `semantic_changed_parts`
+
+```python
+semantic_changed_parts() -> Tuple[str, ...]
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `PartDiff`
+
+```python
+PartDiff(part: str, kind: str, before_sha256: str, after_sha256: str, semantic_change: bool) -> None
+```
+
+One byte-changed part in a package comparison.
+
+### `after_sha256`
+
+```python
+after_sha256: str
+```
+
+### `before_sha256`
+
+```python
+before_sha256: str
+```
+
+### `kind`
+
+```python
+kind: str
+```
+
+### `part`
+
+```python
+part: str
+```
+
+### `semantic_change`
+
+```python
+semantic_change: bool
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `PatchSaveResult`
+
+```python
+PatchSaveResult(restored_parts: Tuple[str, ...], changed_parts: Tuple[str, ...], added_parts: Tuple[str, ...], removed_parts: Tuple[str, ...], verbatim_copy: bool) -> None
+```
+
+Outcome of a `patch_save` call.
+
+### `added_parts`
+
+```python
+added_parts: Tuple[str, ...]
+```
+
+### `changed_parts`
+
+```python
+changed_parts: Tuple[str, ...]
+```
+
+### `removed_parts`
+
+```python
+removed_parts: Tuple[str, ...]
+```
+
+### `restored_parts`
+
+```python
+restored_parts: Tuple[str, ...]
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+### `verbatim_copy`
+
+```python
+verbatim_copy: bool
+```
+
+## `StoryTextDiff`
+
+```python
+StoryTextDiff(story: str, diff_lines: Tuple[str, ...]) -> None
+```
+
+### `diff_lines`
+
+```python
+diff_lines: Tuple[str, ...]
+```
+
+### `story`
+
+```python
+story: str
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `TextDiff`
+
+```python
+TextDiff(stories: Tuple[StoryTextDiff, ...]) -> None
+```
+
+Per-story unified diffs of visible block text.
+
+### `changed_line_count`
+
+```python
+changed_line_count: int
+```
+
+### `is_empty`
+
+```python
+is_empty: bool
+```
+
+### `stories`
+
+```python
+stories: Tuple[StoryTextDiff, ...]
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `compare`
+
+```python
+compare(original, revised, *, author: str, date: 'Optional[dt.datetime]' = None, granularity: str = 'word', materialize: Optional[str] = None) -> CompareResult
+```
+
+A `CompareResult`: `original` plus tracked changes producing `revised`.
+
+Takes paths or bytes. `granularity` is "word" or "block". Inputs carrying pending
+revisions refuse unless `materialize` ("accept" | "reject") resolves them on in-memory
+copies, leaving the files on disk untouched. Refuses any edit it cannot express as a
+clean redline.
+
+## `diagnose`
+
+```python
+diagnose(path: _PathLike) -> PackageDiagnosis
+```
+
+Why the file at `path` can or cannot be opened, as a `PackageDiagnosis`.
+
+Returns instead of raising, so you can triage untrusted input before opening it.
+`Document()` refuses corrupt and encrypted packages with `MalformedPackageError` but
+still raises a bare `ValueError` for macro-enabled and template files.
+
+## `diff_package`
+
+```python
+diff_package(path_a: _PathLike, path_b: _PathLike) -> PackageDiff
+```
+
+Part-by-part diff of the OPC packages at `path_a` and `path_b`.
+
+XML parts (`*.xml`, `*.rels`) compare semantically, binary parts by bytes. A
+byte-changed XML part that fails to parse counts as semantically changed, never
+silently equal. Raises `MalformedPackageError` when either package will not open.
+
+## `patch_save`
+
+```python
+patch_save(original_path: _PathLike, document: 'Document', out_path: _PathLike) -> PatchSaveResult
+```
+
+Save `document` to `out_path`, restoring original bytes wherever possible.
+
+The document is serialized normally, then every XML part semantically identical to its
+counterpart in `original_path` gets that counterpart's exact original bytes back, a
+narrow save that keeps unrelated parts byte-stable through the open/edit/save cycle.
+When nothing changed, `out_path` becomes a verbatim copy of the original.
+
+`original_path == out_path` is permitted; the original bytes are read up front and the
+write is atomic (temp file + rename), so the original survives a mid-write failure. An
+existing destination keeps its permission bits; a new one inherits `original_path`'s.
+Creates the destination's parent directory when it is missing.
+
+Returns a `PatchSaveResult` naming what it restored and what it rewrote. Raises
+`MalformedPackageError` when `original_path`, the serialized document, or the finished
+output fails to reparse, and `OSError` when a destination symlink moves mid-save.
+
+## `pending_changes`
+
+```python
+pending_changes(path: _PathLike) -> TextDiff
+```
+
+What the document's pending revisions would change if all were accepted.
+
+Diffs the "original" view against the "current" view, so an empty `TextDiff` means no
+visible TEXT change rather than a clean document: formatting-only, table-structure and
+same-place move revisions produce no diff lines. Ask `Document.revisions` whether markup
+remains.
+
+## `text_diff`
+
+```python
+text_diff(path_a: _PathLike, path_b: _PathLike, *, view: str = 'current') -> TextDiff
+```
+
+What changed, textually, between the documents at `path_a` and `path_b`.
+
+## `xml_equivalent`
+
+```python
+xml_equivalent(a: bytes, b: bytes) -> bool
+```
+
+True when `a` and `b` are structurally identical XML documents.
+
+Tags and attribute names compare in Clark notation, so namespace *prefix*
+choices never matter while namespace URIs always do. Attribute order is
+insignificant (XML defines attributes as unordered); child order is
+significant; text and tail content compare verbatim, whitespace included
+(a canonicalizer that trims a meaningful trailing space would corrupt
+documents through `patch_save`). Prolog/epilog comments and
+processing instructions are compared too.
+
+Raises `lxml.etree.XMLSyntaxError` on malformed input and
+``UnsupportedXmlError`` on DTD-bearing input — this function never guesses.
+
+Known limit: attribute VALUES holding
+QNames compare textually, so a prefix rebound to a different URI while
+the QName text stays identical is not detected. OOXML producers keep the
+standard prefixes, and the error direction in `diff_package` remains
+conservative for everything else.
+
+
+
+
+
+# `docx.parts.comments`
+
+Contains comments added to the document.
+
+## `CommentsPart`
+
+```python
+CommentsPart(partname: PackURI, content_type: str, element: CT_Comments, package: Package)
+```
+
+Bases: `StoryPart`
+
+Container part for comments added to the document.
+
+### `comments`
+
+```python
+comments: Comments
+```
+
+A `Comments` proxy object for the `w:comments` root element of this part.
+
+### `default`
+
+```python
+default(package: Package) -> Self
+```
+
+A newly created comments part, containing a default empty `w:comments` element.
+
+
+
+
+
+# `docx.parts.document`
+
+`DocumentPart` and closely related objects.
+
+## `DocumentPart`
+
+Bases: `StoryPart`
+
+Main document part of a WordprocessingML (WML) package, aka a .docx file.
+
+Acts as broker to other parts such as image, core properties, and style parts. It
+also acts as a convenient delegate when a mid-document object needs a service
+involving a remote ancestor. The `Parented.part` property inherited by many content
+objects provides access to this part object for that purpose.
+
+### `add_footer_part`
+
+```python
+add_footer_part()
+```
+
+Return (footer_part, rId) pair for newly-created footer part.
+
+### `add_header_part`
+
+```python
+add_header_part()
+```
+
+Return (header_part, rId) pair for newly-created header part.
+
+### `comments`
+
+```python
+comments: Comments
+```
+
+`Comments` object providing access to the comments added to this document.
+
+### `core_properties`
+
+```python
+core_properties: CoreProperties
+```
+
+A `CoreProperties` object providing read/write access to the core properties
+of this document.
+
+### `document`
+
+```python
+document
+```
+
+A `Document` object providing access to the content of this document.
+
+### `drop_header_part`
+
+```python
+drop_header_part(rId: str) -> None
+```
+
+Remove related header part identified by `rId`.
+
+### `footer_part`
+
+```python
+footer_part(rId: str)
+```
+
+Return `FooterPart` related by `rId`.
+
+### `get_style`
+
+```python
+get_style(style_id: str | None, style_type: WD_STYLE_TYPE) -> BaseStyle
+```
+
+Return the style in this document matching `style_id`.
+
+Returns the default style for `style_type` if `style_id` is `None` or does not
+match a defined style of `style_type`.
+
+### `get_style_id`
+
+```python
+get_style_id(style_or_name, style_type)
+```
+
+Return the style_id (`str`) of the style of `style_type` matching
+`style_or_name`.
+
+Returns `None` if the style resolves to the default style for `style_type` or if
+`style_or_name` is itself `None`. Raises if `style_or_name` is a style of the
+wrong type or names a style not present in the document.
+
+### `header_part`
+
+```python
+header_part(rId: str)
+```
+
+Return `HeaderPart` related by `rId`.
+
+### `inline_shapes`
+
+```python
+inline_shapes()
+```
+
+The `InlineShapes` instance containing the inline shapes in the document.
+
+### `numbering_part`
+
+```python
+numbering_part() -> NumberingPart
+```
+
+A `NumberingPart` object providing access to the numbering definitions for this document.
+
+Creates an empty numbering part if one is not present.
+
+### `save`
+
+```python
+save(path_or_stream: str | IO[bytes])
+```
+
+Save this document to `path_or_stream`, which can be either a path to a
+filesystem location (a string) or a file-like object.
+
+### `settings`
+
+```python
+settings: Settings
+```
+
+A `Settings` object providing access to the settings in the settings part of
+this document.
+
+### `styles`
+
+```python
+styles
+```
+
+A `Styles` object providing access to the styles in the styles part of this
+document.
+
+
+
+
+
+# `docx.parts.endnotes`
+
+`EndnotesPart`, the story part containing a document's endnotes.
+
+## `EndnotesPart`
+
+Bases: `StoryPart`
+
+Proxy for the endnotes part (`word/endnotes.xml`) of a document.
+
+Registered for its content type so endnote content loads as a live XML
+part (visible to `docx.story` traversal) instead of an opaque blob.
+paper-docx v0 reads endnotes; it does not create the part.
+
+
+
+
+
+# `docx.parts.footnotes`
+
+`FootnotesPart`, the story part containing a document's footnotes.
+
+## `FootnotesPart`
+
+Bases: `StoryPart`
+
+Proxy for the footnotes part (`word/footnotes.xml`) of a document.
+
+Registered for its content type so footnote content loads as a live XML
+part (visible to `docx.story` traversal) instead of an opaque blob.
+paper-docx v0 reads footnotes; it does not create the part.
+
+
+
+
+
+# `docx.parts.hdrftr`
+
+Header and footer part objects.
+
+## `FooterPart`
+
+Bases: `StoryPart`
+
+Definition of a section footer.
+
+### `new`
+
+```python
+new(package: Package)
+```
+
+Return newly created footer part.
+
+## `HeaderPart`
+
+Bases: `StoryPart`
+
+Definition of a section header.
+
+### `new`
+
+```python
+new(package: Package)
+```
+
+Return newly created header part.
+
+
+
+
+
+# `docx.parts.image`
+
+The proxy class for an image part, and related objects.
+
+## `ImagePart`
+
+```python
+ImagePart(partname: PackURI, content_type: str, blob: bytes, image: Image | None = None)
+```
+
+Bases: `Part`
+
+An image part.
+
+Corresponds to the target part of a relationship with type RELATIONSHIP_TYPE.IMAGE.
+
+### `default_cx`
+
+```python
+default_cx
+```
+
+Native width of this image, calculated from its width in pixels and
+horizontal dots per inch (dpi).
+
+### `default_cy`
+
+```python
+default_cy
+```
+
+Native height of this image, calculated from its height in pixels and
+vertical dots per inch (dpi).
+
+### `filename`
+
+```python
+filename
+```
+
+Filename from which this image part was originally created.
+
+A generic name, e.g. 'image.png', is substituted if no name is available, for
+example when the image was loaded from an unnamed stream. In that case a default
+extension is applied based on the detected MIME type of the image.
+
+### `from_image`
+
+```python
+from_image(image: Image, partname: PackURI)
+```
+
+Return an `ImagePart` instance newly created from `image` and assigned
+`partname`.
+
+### `image`
+
+```python
+image: Image
+```
+
+### `load`
+
+```python
+load(partname: PackURI, content_type: str, blob: bytes, package: OpcPackage)
+```
+
+Called by ``docx.opc.package.PartFactory`` to load an image part from a
+package being opened by ``Document(...)`` call.
+
+### `sha1`
+
+```python
+sha1
+```
+
+SHA1 hash digest of the blob of this image part.
+
+
+
+
+
+# `docx.parts.numbering`
+
+`NumberingPart` and closely related objects.
+
+## `NumberingPart`
+
+Bases: `XmlPart`
+
+Proxy for the numbering.xml part containing numbering definitions for a document
+or glossary.
+
+### `new`
+
+```python
+new() -> NumberingPart
+```
+
+Newly created numbering part, containing only the root ```` element.
+
+### `numbering_definitions`
+
+```python
+numbering_definitions()
+```
+
+The `_NumberingDefinitions` instance containing the numbering definitions
+( element proxies) for this numbering part.
+
+
+
+
+
+# `docx.parts.settings`
+
+`SettingsPart` and closely related objects.
+
+## `SettingsPart`
+
+```python
+SettingsPart(partname: PackURI, content_type: str, element: CT_Settings, package: Package)
+```
+
+Bases: `XmlPart`
+
+Document-level settings part of a WordprocessingML (WML) package.
+
+### `default`
+
+```python
+default(package: Package)
+```
+
+Return a newly created settings part, containing a default `w:settings` element tree.
+
+### `settings`
+
+```python
+settings: Settings
+```
+
+A `Settings` proxy object for the `w:settings` element in this part.
+
+Contains the document-level settings for this document.
+
+
+
+
+
+# `docx.parts.story`
+
+`StoryPart` and related objects.
+
+## `StoryPart`
+
+Bases: `XmlPart`
+
+Base class for story parts.
+
+A story part is one that can contain textual content, such as the document-part and
+header or footer parts. These all share content behaviors like `.paragraphs`,
+`.add_paragraph()`, `.add_table()` etc.
+
+### `get_or_add_image`
+
+```python
+get_or_add_image(image_descriptor: str | IO[bytes]) -> Tuple[str, Image]
+```
+
+Return (rId, image) pair for image identified by `image_descriptor`.
+
+`rId` is the str key (often like "rId7") for the relationship between this story
+part and the image part, reused if already present, newly created if not.
+`image` is an `Image` instance providing access to the properties of the image,
+such as dimensions and image type.
+
+### `get_style`
+
+```python
+get_style(style_id: str | None, style_type: WD_STYLE_TYPE) -> BaseStyle
+```
+
+Return the style in this document matching `style_id`.
+
+Returns the default style for `style_type` if `style_id` is `None` or does not
+match a defined style of `style_type`.
+
+### `get_style_id`
+
+```python
+get_style_id(style_or_name: BaseStyle | str | None, style_type: WD_STYLE_TYPE) -> str | None
+```
+
+Return str style_id for `style_or_name` of `style_type`.
+
+Returns `None` if the style resolves to the default style for `style_type` or if
+`style_or_name` is itself `None`. Raises if `style_or_name` is a style of the
+wrong type or names a style not present in the document.
+
+### `new_pic_inline`
+
+```python
+new_pic_inline(image_descriptor: str | IO[bytes], width: int | Length | None = None, height: int | Length | None = None) -> CT_Inline
+```
+
+Return a newly-created `w:inline` element.
+
+The element contains the image specified by `image_descriptor` and is scaled
+based on the values of `width` and `height`.
+
+### `next_id`
+
+```python
+next_id: int
+```
+
+Next available positive integer id value in this story XML document.
+
+The value is determined by incrementing the maximum existing id value. Gaps in
+the existing id sequence are not filled. The id attribute value is unique in the
+document, without regard to the element type it appears on.
+
+
+
+
+
+# `docx.parts.styles`
+
+Provides StylesPart and related objects.
+
+## `StylesPart`
+
+Bases: `XmlPart`
+
+Proxy for the styles.xml part containing style definitions for a document or
+glossary.
+
+### `default`
+
+```python
+default(package: OpcPackage) -> StylesPart
+```
+
+Return a newly created styles part, containing a default set of elements.
+
+### `styles`
+
+```python
+styles
+```
+
+The `_Styles` instance containing the styles ( element proxies) for
+this styles part.
+
+
+
+
+
+# `docx.protection`
+
+Document-protection awareness (paper-docx).
+
+## `OPERATION_CLASSES`
+
+```python
+OPERATION_CLASSES = (OP_COMMENT, OP_FORM_FIELD, OP_BODY)
+```
+
+## `OP_BODY`
+
+```python
+OP_BODY = 'body-content'
+```
+
+## `OP_COMMENT`
+
+```python
+OP_COMMENT = 'comment'
+```
+
+## `OP_FORM_FIELD`
+
+```python
+OP_FORM_FIELD = 'form-field-value'
+```
+
+## `ProtectionStatus`
+
+```python
+ProtectionStatus(edit: Optional[str], enforced: bool, acknowledged: bool, formatting: bool = False) -> None
+```
+
+What `w:documentProtection` declares, read-only.
+
+`edit` is the raw `w:edit` token ("readOnly", "forms", "comments",
+"trackedChanges", or unrestricted "none") or None when no edit restriction is declared;
+`formatting` reflects the independent format restriction. `enforced`
+reports active enforcement of either kind; `acknowledged` is this
+package's in-memory override flag (never persisted).
+
+### `acknowledged`
+
+```python
+acknowledged: bool
+```
+
+### `blocks_paper_edits`
+
+```python
+blocks_paper_edits: bool
+```
+
+True when protection is enforced and has not been acknowledged.
+
+Not a prediction of whether a call will refuse: it ignores the operation class, so it
+reports True under trackedChanges or formatting-only protection where the gate still
+permits body edits and comments. Call `acknowledge_protection` to proceed deliberately.
+
+### `edit`
+
+```python
+edit: Optional[str]
+```
+
+### `enforced`
+
+```python
+enforced: bool
+```
+
+### `formatting`
+
+```python
+formatting: bool = False
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `acknowledge_protection`
+
+```python
+acknowledge_protection(document: 'Document') -> ProtectionStatus
+```
+
+Explicitly override protection for this open package (in-memory only).
+
+The single sanctioned override affordance: after this call, paper-docx
+mutating APIs proceed on this document despite `w:documentProtection`.
+Nothing is written to the file — the protection setting itself is never
+touched. Returns the status being overridden so callers can log it.
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `protection_status`
+
+```python
+protection_status(document: 'Document') -> ProtectionStatus
+```
+
+The document's `w:documentProtection` state (report-only).
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+## `set_protection`
+
+```python
+set_protection(document: 'Document', *, edit: str) -> ProtectionStatus
+```
+
+Turn Restrict Editing on for delivery (`w:documentProtection`).
+
+`edit` is a Word token: `readOnly`, `comments`, `forms`, or
+`trackedChanges`. This writes the setting; it does not strip one.
+Paper mutators then refuse until `acknowledge_protection`.
+
+
+
+
+
+# `docx.revision`
+
+Revision enumeration and resolution (paper-docx, `Document.revisions`).
+
+## `RESOLVABLE_TYPES`
+
+```python
+RESOLVABLE_TYPES = frozenset({'insertion', 'deletion', 'format_change', 'row_insertion', 'row_deletion', 'move_from', 'move_to'})
+```
+
+## `Revision`
+
+```python
+Revision(revision_type: str, author: str, date: Optional[dt.datetime], text: str, story: str, anchor: Anchor, is_paragraph_mark: bool, _element: '_Element', _document: 'Optional[Document]' = None, _snapshot_signature: 'Tuple[_Element, ...]' = ()) -> None
+```
+
+One tracked change, addressable — and resolvable when supported.
+
+Resolvable `revision_type`s: "insertion", "deletion", "format_change"
+(`w:rPrChange`/`w:pPrChange`, run or paragraph mark), "row_insertion",
+"row_deletion" (`w:trPr` row markers), and — as paired units —
+"move_from"/"move_to". The exotic remainder ("table_property_change",
+"cell_revision", "section_property_change", "numbering_change",
+"custom_xml_revision") is enumerated and counted but resolution is
+refused by name — claiming to resolve them would report false state.
+
+### `accept`
+
+```python
+accept() -> None
+```
+
+Apply this change to the document.
+
+Tracked moves resolve as a PAIR: accepting either site accepts both. Resolution can
+remove paragraphs, rows, tables, comments and note bodies along with the markup.
+Refuses a protected document, and revision types this package cannot resolve, leaving
+the document untouched.
+
+### `anchor`
+
+```python
+anchor: Anchor
+```
+
+### `author`
+
+```python
+author: str
+```
+
+### `date`
+
+```python
+date: Optional[dt.datetime]
+```
+
+### `is_paragraph_mark`
+
+```python
+is_paragraph_mark: bool
+```
+
+### `is_resolvable`
+
+```python
+is_resolvable: bool
+```
+
+### `reject`
+
+```python
+reject() -> None
+```
+
+Undo this change, restoring the pre-change content.
+
+Tracked moves resolve as a PAIR: rejecting either site rejects both. Restores `w:delText`
+back to `w:t`. Refuses a protected document, and revision types this package cannot
+resolve, leaving the document untouched.
+
+### `revision_type`
+
+```python
+revision_type: str
+```
+
+### `story`
+
+```python
+story: str
+```
+
+### `text`
+
+```python
+text: str
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `Revisions`
+
+```python
+Revisions(document: 'Document') -> None
+```
+
+Bases: `Sequence[Revision]`
+
+All tracked changes in a document, across every story part.
+
+A fresh snapshot is enumerated on each `Document.revisions` access;
+mutation through another snapshot invalidates this snapshot and its
+previously-held `Revision` objects. Stale resolution attempts refuse.
+
+### `accept_all`
+
+```python
+accept_all(*, author: Optional[str] = None) -> int
+```
+
+Apply every selected revision (optionally only `author`'s) and return the count.
+
+Validates the whole selected set first, so a set holding types this package cannot
+resolve refuses atomically instead of half-resolving and reporting success while Word
+still shows changes. Refuses a protected document and a stale snapshot. Check
+`remaining_unsupported()` before concluding the document is clean.
+
+### `reject_all`
+
+```python
+reject_all(*, author: Optional[str] = None) -> int
+```
+
+Undo every selected revision (optionally only `author`'s) and return the count.
+
+Same whole-set validation, refusals and census semantics as `accept_all`.
+
+### `remaining_unsupported`
+
+```python
+remaining_unsupported() -> dict
+```
+
+{revision_type: count} for enumerated-but-unresolvable revisions.
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+
+
+
+
+# `docx.search`
+
+Exact and normalized text search over visibility-complete traversal.
+
+## `ReplaceAllResult`
+
+```python
+ReplaceAllResult(replaced_count: int, results: Tuple[ReplaceResult, ...], refused: Tuple[dict, ...]) -> None
+```
+
+Outcome of a `replace_all` call: per-match results, never silent.
+
+### `refused`
+
+```python
+refused: Tuple[dict, ...]
+```
+
+### `replaced_count`
+
+```python
+replaced_count: int
+```
+
+### `results`
+
+```python
+results: Tuple[ReplaceResult, ...]
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+## `ReplaceResult`
+
+```python
+ReplaceResult(story: str, deleted_text: str, inserted_text: str, tracked: bool, revision_ids: Tuple[int, ...], preserved_revision_ids: Tuple[int, ...] = (), preserved_formatting_regions: bool = False) -> None
+```
+
+Outcome of a `Span.replace` call.
+
+`deleted_text` and `inserted_text` cover the whole span for an untracked replace but only
+the affix-trimmed middle for a tracked one, so comparing them against `Span.text` is
+wrong for tracked edits. `preserved_formatting_regions` reports whether an ordinary
+replacement kept every changed formatting region rather than intentionally inheriting the
+changed interval's starting run properties; for a no-op, it records that no formatting
+changed. It is independent of revision evidence.
+
+### `deleted_text`
+
+```python
+deleted_text: str
+```
+
+### `inserted_text`
+
+```python
+inserted_text: str
+```
+
+### `preserved_formatting_regions`
+
+```python
+preserved_formatting_regions: bool = False
+```
+
+### `preserved_revision_ids`
+
+```python
+preserved_revision_ids: Tuple[int, ...] = ()
+```
+
+### `revision_ids`
+
+```python
+revision_ids: Tuple[int, ...]
+```
+
+### `story`
+
+```python
+story: str
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+### `tracked`
+
+```python
+tracked: bool
+```
+
+## `Span`
+
+```python
+Span(text: str, story: str, anchor: Anchor, in_insert: bool, in_delete: bool, in_content_control: bool, in_text_box: bool, in_field: bool, crosses_paragraphs: bool, _document: 'Document', _atoms: 'List[_Atom]', _start_offset: int, _end_offset: int, _raw_start: int, _match_start: int, _consumed: bool = False) -> None
+```
+
+A visible-text interval mapped back to its concrete text atoms.
+
+Spans hold live references into the document tree and go stale when the
+underlying text changes; every operation revalidates first and raises
+`TargetNotFoundError` on staleness. ``match_policy`` records the policy
+that selected a search-produced span, or is ``None`` for a span constructed
+from already-known live offsets.
+
+### `anchor`
+
+```python
+anchor: Anchor
+```
+
+### `comment`
+
+```python
+comment(text: str, *, author: str, initials: Optional[str] = None, date: Optional[dt.datetime] = None) -> 'object'
+```
+
+Anchor a new comment to exactly this span's text, and return the upstream `Comment`.
+
+Reach for this over `Document.add_comment` when the anchor must match exact text rather
+than whole runs. Splits boundary runs, and creates `/word/comments.xml` on first use.
+Only the main document story carries comments. Refuses a protected document, a stale
+span, and a locked or data-bound control surface.
+
+### `crosses_paragraphs`
+
+```python
+crosses_paragraphs: bool
+```
+
+### `in_content_control`
+
+```python
+in_content_control: bool
+```
+
+### `in_delete`
+
+```python
+in_delete: bool
+```
+
+### `in_field`
+
+```python
+in_field: bool
+```
+
+### `in_insert`
+
+```python
+in_insert: bool
+```
+
+### `in_text_box`
+
+```python
+in_text_box: bool
+```
+
+### `match_policy`
+
+```python
+match_policy: 'Optional[str]' = field(default=None, init=False)
+```
+
+### `replace`
+
+```python
+replace(new_text: str, *, tracked: bool = False, author: Optional[str] = None, date: Optional[dt.datetime] = None, preserve_revision: bool = False) -> ReplaceResult
+```
+
+Replace this span's text and return machine-readable change evidence.
+
+The default is an untracked edit over one proved structural-owner region.
+When maximal exact prefix/suffix alignment identifies one changed interval, unchanged
+affix text stays in its existing atoms. A nonempty replacement inherits the complete
+direct run properties of the changed interval's starting text run; consumed later runs
+may therefore collapse intentionally. Distinct inline wrapper owners, semantic-scope
+crossings, positional-marker crossings, and ambiguous affix or pure-insertion boundaries
+refuse. `tracked=True` uses the same unique localization and formatting inheritance;
+tracked deletion pieces retain each source run's properties.
+A successful tracked change consumes the span; a direct tracked no-op is refused.
+
+`preserve_revision=True` explicitly permits a current-view span wholly owned by one
+existing `w:ins` to be corrected without changing that insertion's id, author, date,
+or accept/reject meaning; outside revision markup it behaves like an ordinary untracked
+edit. The corrected text remains attributed to the existing insertion's author and date.
+`preserved_formatting_regions` and `preserved_revision_ids` report independent
+guarantees; `revision_ids` remains reserved for newly authored tracked revisions. Every
+successful text-changing replacement consumes
+the supplied span; use the returned result and re-find the text before another operation.
+A no-op, refusal, or rolled-back mutation leaves the span reusable. Refuses a protected
+document, a stale or foreign span, and unsafe field,
+control, revision, bookmark, whitespace, or paragraph-boundary structures before
+mutation.
+
+### `story`
+
+```python
+story: str
+```
+
+### `text`
+
+```python
+text: str
+```
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `find_one`
+
+```python
+find_one(document: 'Document', needle: str, *, nth: Optional[int] = None, story: Optional[str] = None, view: str = 'current', match: str = 'exact') -> Span
+```
+
+The single span matching `needle`, or a typed refusal.
+
+Exact matching is the default; pass ``match="normalized"`` to opt into
+folded targeting. Zero matches raise `TargetNotFoundError`. Two or more
+raise `AmbiguousTargetError`. `nth` and `story` explicitly narrow the set.
+
+## `find_text`
+
+```python
+find_text(document: 'Document', needle: str, *, nth: Optional[int] = None, near: Optional[str] = None, story: Optional[str] = None, view: str = 'current', match: str = 'exact') -> 'List[Span]'
+```
+
+Every span of `needle` in `document` under the selected match policy.
+
+`story` limits the search to one story part (e.g. "word/document.xml");
+`near` ranks every match by distance to the nearest occurrence of `near`'s
+text under the same policy in the same story. Ranking remains complete
+when context is missing or tied. `nth` (1-based) instead selects a match
+by document position and cannot be combined with `near`. Exact matching is
+the default. Normalized matching folds case, typography, and whitespace.
+Both assemble across fragmented runs; exact matching represents each
+paragraph boundary as one literal ``\n``.
+
+## `normalize_text`
+
+```python
+normalize_text(value: str) -> str
+```
+
+`value` normalized for matching: folded punctuation, collapsed
+whitespace, casefolded. Never applied to document content on write.
+
+ANY Unicode whitespace collapses to a single ASCII space (`\s+`, not just
+the spaces in the table) so needles and document text normalize
+identically no matter which exotic space either side carries.
+
+## `replace_all`
+
+```python
+replace_all(document: 'Document', needle: str, new_text: str, *, story: Optional[str] = None, view: str = 'current', match: str = 'exact', tracked: bool = False, author: Optional[str] = None, date: Optional[dt.datetime] = None, preserve_revision: bool = False) -> ReplaceAllResult
+```
+
+Replace every match of `needle` in one pass, and return a `ReplaceAllResult`.
+
+``match`` defaults to literal exact matching; ``"normalized"`` explicitly
+enables folded matching. One scan finds all matches, then replacements
+apply in reverse raw document order within each story, so no pending match
+shifts. A refusal on one match is recorded in `refused` and the rest
+proceed; a stale span aborts the batch instead, rolling back every
+replacement already applied. Matches already equal to `new_text` are
+skipped. `preserve_revision` has the same contract as `Span` ``.replace``
+and is forwarded to every match without adding a transaction per match.
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+
+
+
+
+# `docx.section`
+
+The `Section` object and related proxy classes.
+
+## `Section`
+
+```python
+Section(sectPr: CT_SectPr, document_part: DocumentPart)
+```
+
+Document section, providing access to section and page setup settings.
+
+Also provides access to headers and footers.
+
+### `bottom_margin`
+
+```python
+bottom_margin: Length | None
+```
+
+Read/write. Bottom margin for pages in this section, in EMU.
+
+`None` when no bottom margin has been specified. Assigning `None` removes any
+bottom-margin setting.
+
+### `different_first_page_header_footer`
+
+```python
+different_first_page_header_footer: bool
+```
+
+True if this section displays a distinct first-page header and footer.
+
+Read/write. The definition of the first-page header and footer are accessed
+using `.first_page_header` and `.first_page_footer` respectively.
+
+### `even_page_footer`
+
+```python
+even_page_footer: _Footer
+```
+
+`_Footer` object defining footer content for even pages.
+
+The content of this footer definition is ignored unless the document setting
+`odd_and_even_pages_header_footer` is set True.
+
+### `even_page_header`
+
+```python
+even_page_header: _Header
+```
+
+`_Header` object defining header content for even pages.
+
+The content of this header definition is ignored unless the document setting
+`odd_and_even_pages_header_footer` is set True.
+
+### `first_page_footer`
+
+```python
+first_page_footer: _Footer
+```
+
+`_Footer` object defining footer content for the first page of this section.
+
+The content of this footer definition is ignored unless the property
+`.different_first_page_header_footer` is set True.
+
+### `first_page_header`
+
+```python
+first_page_header: _Header
+```
+
+`_Header` object defining header content for the first page of this section.
+
+The content of this header definition is ignored unless the property
+`.different_first_page_header_footer` is set True.
+
+### `footer`
+
+```python
+footer() -> _Footer
+```
+
+`_Footer` object representing default page footer for this section.
+
+The default footer is used for odd-numbered pages when separate odd/even footers
+are enabled. It is used for both odd and even-numbered pages otherwise.
+
+### `footer_distance`
+
+```python
+footer_distance: Length | None
+```
+
+Distance from bottom edge of page to bottom edge of the footer.
+
+Read/write. `None` if no setting is present in the XML.
+
+### `gutter`
+
+```python
+gutter: Length | None
+```
+
+`Length` object representing page gutter size in English Metric Units.
+
+Read/write. The page gutter is extra spacing added to the `inner` margin to
+ensure even margins after page binding. Generally only used in book-bound
+documents with double-sided and facing pages.
+
+This setting applies to all pages in this section.
+
+### `header`
+
+```python
+header() -> _Header
+```
+
+`_Header` object representing default page header for this section.
+
+The default header is used for odd-numbered pages when separate odd/even headers
+are enabled. It is used for both odd and even-numbered pages otherwise.
+
+### `header_distance`
+
+```python
+header_distance: Length | None
+```
+
+Distance from top edge of page to top edge of header.
+
+Read/write. `None` if no setting is present in the XML. Assigning `None` causes
+default value to be used.
+
+### `iter_inner_content`
+
+```python
+iter_inner_content() -> Iterator[Paragraph | Table]
+```
+
+Generate each Paragraph or Table object in this `section`.
+
+Items appear in document order.
+
+### `left_margin`
+
+```python
+left_margin: Length | None
+```
+
+`Length` object representing the left margin for all pages in this section in
+English Metric Units.
+
+### `orientation`
+
+```python
+orientation: WD_ORIENTATION
+```
+
+`WdOrientation` member specifying page orientation for this section.
+
+One of ``WD_ORIENT.PORTRAIT`` or ``WD_ORIENT.LANDSCAPE``.
+
+### `page_height`
+
+```python
+page_height: Length | None
+```
+
+Total page height used for this section.
+
+This value is inclusive of all edge spacing values such as margins.
+
+Page orientation is taken into account, so for example, its expected value
+would be ``Inches(8.5)`` for letter-sized paper when orientation is landscape.
+
+### `page_width`
+
+```python
+page_width: Length | None
+```
+
+Total page width used for this section.
+
+This value is like "paper size" and includes all edge spacing values such as
+margins.
+
+Page orientation is taken into account, so for example, its expected value
+would be ``Inches(11)`` for letter-sized paper when orientation is landscape.
+
+### `part`
+
+```python
+part: StoryPart
+```
+
+### `right_margin`
+
+```python
+right_margin: Length | None
+```
+
+`Length` object representing the right margin for all pages in this section
+in English Metric Units.
+
+### `start_type`
+
+```python
+start_type: WD_SECTION_START
+```
+
+Type of page-break (if any) inserted at the start of this section.
+
+For exmple, ``WD_SECTION_START.ODD_PAGE`` if the section should begin on the
+next odd page, possibly inserting two page-breaks instead of one.
+
+### `top_margin`
+
+```python
+top_margin: Length | None
+```
+
+`Length` object representing the top margin for all pages in this section in
+English Metric Units.
+
+## `Sections`
+
+```python
+Sections(document_elm: CT_Document, document_part: DocumentPart)
+```
+
+Bases: `Sequence[Section]`
+
+Sequence of `Section` objects corresponding to the sections in the document.
+
+Supports ``len()``, iteration, and indexed access.
+
+
+
+
+
+# `docx.settings`
+
+Settings object, providing access to document-level settings.
+
+## `Settings`
+
+```python
+Settings(element: BaseOxmlElement, parent: t.ProvidesXmlPart | None = None)
+```
+
+Bases: `ElementProxy`
+
+Provides access to document-level settings for a document.
+
+Accessed using the `.Document.settings` property.
+
+### `odd_and_even_pages_header_footer`
+
+```python
+odd_and_even_pages_header_footer: bool
+```
+
+True if this document has distinct odd and even page headers and footers.
+
+Read/write.
+
+
+
+
+
+# `docx.shape`
+
+Objects related to shapes.
+
+## `InlineShape`
+
+```python
+InlineShape(inline: CT_Inline)
+```
+
+Proxy for an ```` element, representing the container for an inline
+graphical object.
+
+### `height`
+
+```python
+height: Length
+```
+
+Read/write.
+
+The display height of this inline shape as an `Emu` instance.
+
+### `type`
+
+```python
+type
+```
+
+The type of this inline shape as a member of
+``docx.enum.shape.WD_INLINE_SHAPE``, e.g. ``LINKED_PICTURE``.
+
+Read-only.
+
+### `width`
+
+```python
+width
+```
+
+Read/write.
+
+The display width of this inline shape as an `Emu` instance.
+
+## `InlineShapes`
+
+```python
+InlineShapes(body_elm: CT_Body, parent: StoryPart)
+```
+
+Bases: `Parented`
+
+Sequence of `InlineShape` instances, supporting len(), iteration, and indexed access.
+
+
+
+
+
+# `docx.shared`
+
+Objects shared by docx modules.
+
+## `Cm`
+
+Bases: `Length`
+
+Convenience constructor for length in centimeters, e.g. ``height = Cm(12)``.
+
+## `ElementProxy`
+
+```python
+ElementProxy(element: BaseOxmlElement, parent: t.ProvidesXmlPart | None = None)
+```
+
+Base class for lxml element proxy classes.
+
+An element proxy class is one whose primary responsibilities are fulfilled by
+manipulating the attributes and child elements of an XML element. They are the most
+common type of class in python-docx other than custom element (oxml) classes.
+
+### `element`
+
+```python
+element
+```
+
+The lxml element proxied by this object.
+
+### `part`
+
+```python
+part: XmlPart
+```
+
+The package part containing this object.
+
+## `Emu`
+
+Bases: `Length`
+
+Convenience constructor for length in English Metric Units, e.g. ``width =
+Emu(457200)``.
+
+## `Inches`
+
+Bases: `Length`
+
+Convenience constructor for length in inches, e.g. ``width = Inches(0.5)``.
+
+## `Length`
+
+Bases: `int`
+
+Base class for length constructor classes Inches, Cm, Mm, Px, and Emu.
+
+Behaves as an int count of English Metric Units, 914,400 to the inch, 36,000 to the
+mm. Provides convenience unit conversion methods in the form of read-only
+properties. Immutable.
+
+### `cm`
+
+```python
+cm
+```
+
+The equivalent length expressed in centimeters (float).
+
+### `emu`
+
+```python
+emu
+```
+
+The equivalent length expressed in English Metric Units (int).
+
+### `inches`
+
+```python
+inches
+```
+
+The equivalent length expressed in inches (float).
+
+### `mm`
+
+```python
+mm
+```
+
+The equivalent length expressed in millimeters (float).
+
+### `pt`
+
+```python
+pt
+```
+
+Floating point length in points.
+
+### `twips`
+
+```python
+twips
+```
+
+The equivalent length expressed in twips (int).
+
+## `Mm`
+
+Bases: `Length`
+
+Convenience constructor for length in millimeters, e.g. ``width = Mm(240.5)``.
+
+## `Parented`
+
+```python
+Parented(parent: t.ProvidesXmlPart)
+```
+
+Provides common services for document elements that occur below a part but may
+occasionally require an ancestor object to provide a service, such as add or drop a
+relationship.
+
+Provides ``self._parent`` attribute to subclasses.
+
+### `part`
+
+```python
+part: XmlPart
+```
+
+The package part containing this object.
+
+## `Pt`
+
+Bases: `Length`
+
+Convenience value class for specifying a length in points.
+
+## `RGBColor`
+
+Bases: `Tuple[int, int, int]`
+
+Immutable value object defining a particular RGB color.
+
+### `from_string`
+
+```python
+from_string(rgb_hex_str: str) -> RGBColor
+```
+
+Return a new instance from an RGB color hex string like ``'3C2F80'``.
+
+## `StoryChild`
+
+```python
+StoryChild(parent: t.ProvidesStoryPart)
+```
+
+A document element within a story part.
+
+Story parts include DocumentPart and Header/FooterPart and can contain block items
+(paragraphs and tables). Items from the block-item subtree occasionally require an
+ancestor object to provide access to part-level or package-level items like styles
+or images or to add or drop a relationship.
+
+Provides `self._parent` attribute to subclasses.
+
+### `part`
+
+```python
+part: StoryPart
+```
+
+The package part containing this object.
+
+## `T`
+
+```python
+T = TypeVar('T')
+```
+
+## `TextAccumulator`
+
+```python
+TextAccumulator(separator: str = '')
+```
+
+Accepts `str` fragments and joins them together, in order, on `.pop().
+
+Handy when text in a stream is broken up arbitrarily and you want to join it back
+together within certain bounds. The optional `separator` argument determines how
+the text fragments are punctuated, defaulting to the empty string.
+
+### `pop`
+
+```python
+pop() -> Iterator[str]
+```
+
+Generate sero-or-one str from those accumulated.
+
+Using `yield from accum.pop()` in a generator setting avoids producing an empty
+string when no text is in the accumulator.
+
+### `push`
+
+```python
+push(text: str) -> None
+```
+
+Add a text fragment to the accumulator.
+
+## `Twips`
+
+Bases: `Length`
+
+Convenience constructor for length in twips, e.g. ``width = Twips(42)``.
+
+A twip is a twentieth of a point, 635 EMU.
+
+## `lazyproperty`
+
+```python
+lazyproperty(fget: Callable[..., T]) -> None
+```
+
+Bases: `Generic[T]`
+
+Decorator like @property, but evaluated only on first access.
+
+Like @property, this can only be used to decorate methods having only a `self`
+parameter, and is accessed like an attribute on an instance, i.e. trailing
+parentheses are not used. Unlike @property, the decorated method is only evaluated
+on first access; the resulting value is cached and that same value returned on
+second and later access without re-evaluation of the method.
+
+Like @property, this class produces a *data descriptor* object, which is stored in
+the __dict__ of the *class* under the name of the decorated method ('fget'
+nominally). The cached value is stored in the __dict__ of the *instance* under that
+same name.
+
+Because it is a data descriptor (as opposed to a *non-data descriptor*), its
+`__get__()` method is executed on each access of the decorated attribute; the
+__dict__ item of the same name is "shadowed" by the descriptor.
+
+While this may represent a performance improvement over a property, its greater
+benefit may be its other characteristics. One common use is to construct
+collaborator objects, removing that "real work" from the constructor, while still
+only executing once. It also de-couples client code from any sequencing
+considerations; if it's accessed from more than one location, it's assured it will
+be ready whenever needed.
+
+Loosely based on: https://stackoverflow.com/a/6849299/1902513.
+
+A lazyproperty is read-only. There is no counterpart to the optional "setter" (or
+deleter) behavior of an @property. This is critically important to maintaining its
+immutability and idempotence guarantees. Attempting to assign to a lazyproperty
+raises AttributeError unconditionally.
+
+The parameter names in the methods below correspond to this usage example::
+
+ class Obj(object)
+
+ @lazyproperty
+ def fget(self):
+ return 'some result'
+
+ obj = Obj()
+
+Not suitable for wrapping a function (as opposed to a method) because it is not
+callable.
+
+*fget* is the decorated method (a "getter" function).
+
+A lazyproperty is read-only, so there is only an *fget* function (a regular
+@property can also have an fset and fdel function). This name was chosen for
+consistency with Python's `property` class which uses this name for the
+corresponding parameter.
+
+## `write_only_property`
+
+```python
+write_only_property(f: Callable[[Any, Any], None])
+```
+
+@write_only_property decorator.
+
+Creates a property (descriptor attribute) that accepts assignment, but not getattr
+(use in an expression).
+
+
+
+
+
+# `docx.story`
+
+Visibility-complete story traversal and inspection (paper-docx, opt-in).
+
+## `Anchor`
+
+```python
+Anchor(story: str, index: int, content_hash: str) -> None
+```
+
+Legacy, inert location evidence: story part + index + content hash.
+
+``Anchor`` remains serializable for historical search and revision result
+data. It is not a mutation-capable block target; reacquire a live `Block`
+or `Span` instead.
+
+### `content_hash`
+
+```python
+content_hash: str
+```
+
+### `index`
+
+```python
+index: int
+```
+
+### `story`
+
+```python
+story: str
+```
+
+### `to_dict`
+
+```python
+to_dict() -> 'Dict[str, object]'
+```
+
+## `BLIND_REGION_KEYS`
+
+```python
+BLIND_REGION_KEYS = ('tracked_insertions', 'tracked_deletions', 'moves', 'format_changes', 'content_controls', 'text_boxes', 'fields', 'math', 'embedded_objects', 'alt_chunks', 'hidden_text')
+```
+
+## `Block`
+
+```python
+Block(story: str, kind: str, index: int, anchor: Anchor, text: str, style_id: Optional[str], in_insert: bool, in_delete: bool, in_content_control: bool, in_text_box: bool, has_field: bool, table: Optional[TableShape], _document: 'Optional[Document]' = None, _element: 'Optional[_Element]' = None, _story_root: 'Optional[_Element]' = None, _parent: 'Optional[_Element]' = None, _container_elements: 'Tuple[_Element, ...]' = (), _view: str = 'current') -> None
+```
+
+One live, owner-bound paragraph or table observed during traversal.
+
+### `anchor`
+
+```python
+anchor: Anchor
+```
+
+### `has_field`
+
+```python
+has_field: bool
+```
+
+### `in_content_control`
+
+```python
+in_content_control: bool
+```
+
+### `in_delete`
+
+```python
+in_delete: bool
+```
+
+### `in_insert`
+
+```python
+in_insert: bool
+```
+
+### `in_text_box`
+
+```python
+in_text_box: bool
+```
+
+### `index`
+
+```python
+index: int
+```
+
+### `kind`
+
+```python
+kind: str
+```
+
+### `story`
+
+```python
+story: str
+```
+
+### `style_id`
+
+```python
+style_id: Optional[str]
+```
+
+### `table`
+
+```python
+table: Optional[TableShape]
+```
+
+### `text`
+
+```python
+text: str
+```
+
+### `to_dict`
+
+```python
+to_dict() -> 'Dict[str, object]'
+```
+
+## `Outline`
+
+```python
+Outline(story_parts: Tuple[str, ...], blocks: Tuple[Block, ...], blind_region_counts: Dict[str, int]) -> None
+```
+
+Inspection snapshot of a document: every block in every story part.
+
+### `blind_region_counts`
+
+```python
+blind_region_counts: Dict[str, int]
+```
+
+### `blocks`
+
+```python
+blocks: Tuple[Block, ...]
+```
+
+### `story_parts`
+
+```python
+story_parts: Tuple[str, ...]
+```
+
+### `to_dict`
+
+```python
+to_dict() -> 'Dict[str, object]'
+```
+
+## `TableShape`
+
+```python
+TableShape(rows: int, columns: int, has_merges: bool, has_nested_table: bool) -> None
+```
+
+### `columns`
+
+```python
+columns: int
+```
+
+### `has_merges`
+
+```python
+has_merges: bool
+```
+
+### `has_nested_table`
+
+```python
+has_nested_table: bool
+```
+
+### `rows`
+
+```python
+rows: int
+```
+
+### `to_dict`
+
+```python
+to_dict() -> 'Dict[str, object]'
+```
+
+## `VIEWS`
+
+```python
+VIEWS = ('current', 'original', 'all')
+```
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `content_hash`
+
+```python
+content_hash(text: str) -> str
+```
+
+First 8 hex chars of SHA-256 over the block's normalized text.
+
+## `iter_blocks`
+
+```python
+iter_blocks(document: 'Document', *, view: str = 'current') -> Iterator[Block]
+```
+
+Every block in every story part of `document`, in document order.
+
+`view` selects the text layer: "current" (insertions in, deletions out —
+the document if all changes were accepted), "original" (deletions in,
+insertions out), or "all" (everything).
+
+## `normalize_text`
+
+```python
+normalize_text(value: str) -> str
+```
+
+`value` normalized for matching: folded punctuation, collapsed
+whitespace, casefolded. Never applied to document content on write.
+
+ANY Unicode whitespace collapses to a single ASCII space (`\s+`, not just
+the spaces in the table) so needles and document text normalize
+identically no matter which exotic space either side carries.
+
+## `outline`
+
+```python
+outline(document: 'Document', *, view: str = 'current') -> Outline
+```
+
+Inspection snapshot: story parts, all blocks, blind-region counts.
+
+Deterministic: the same document yields byte-identical `to_dict()` output
+on every call (inspection determinism).
+
+## `story_parts`
+
+```python
+story_parts(document: 'Document') -> Tuple[str, ...]
+```
+
+Every story part present in `document`, in traversal order.
+
+
+
+
+
+# `docx.styles.latent`
+
+Latent style-related objects.
+
+## `LatentStyles`
+
+Bases: `ElementProxy`
+
+Provides access to the default behaviors for latent styles in this document and
+to the collection of `_LatentStyle` objects that define overrides of those defaults
+for a particular named latent style.
+
+### `add_latent_style`
+
+```python
+add_latent_style(name)
+```
+
+Return a newly added `_LatentStyle` object to override the inherited defaults
+defined in this latent styles object for the built-in style having `name`.
+
+### `default_priority`
+
+```python
+default_priority
+```
+
+Integer between 0 and 99 inclusive specifying the default sort order for
+latent styles in style lists and the style gallery.
+
+`None` if no value is assigned, which causes Word to use the default value 99.
+
+### `default_to_hidden`
+
+```python
+default_to_hidden
+```
+
+Boolean specifying whether the default behavior for latent styles is to be
+hidden.
+
+A hidden style does not appear in the recommended list or in the style gallery.
+
+### `default_to_locked`
+
+```python
+default_to_locked
+```
+
+Boolean specifying whether the default behavior for latent styles is to be
+locked.
+
+A locked style does not appear in the styles panel or the style gallery and
+cannot be applied to document content. This behavior is only active when
+formatting protection is turned on for the document (via the Developer menu).
+
+### `default_to_quick_style`
+
+```python
+default_to_quick_style
+```
+
+Boolean specifying whether the default behavior for latent styles is to
+appear in the style gallery when not hidden.
+
+### `default_to_unhide_when_used`
+
+```python
+default_to_unhide_when_used
+```
+
+Boolean specifying whether the default behavior for latent styles is to be
+unhidden when first applied to content.
+
+### `load_count`
+
+```python
+load_count
+```
+
+Integer specifying the number of built-in styles to initialize to the
+defaults specified in this `LatentStyles` object.
+
+`None` if there is no setting in the XML (very uncommon). The default Word 2011
+template sets this value to 276, accounting for the built-in styles in Word
+2010.
+
+
+
+
+
+# `docx.styles`
+
+Sub-package module for docx.styles sub-package.
+
+## `BabelFish`
+
+Translates special-case style names from UI name (e.g. Heading 1) to
+internal/styles.xml name (e.g. heading 1) and back.
+
+### `internal2ui`
+
+```python
+internal2ui(internal_style_name: str) -> str
+```
+
+Return the user interface style name corresponding to `internal_style_name`,
+such as 'Heading 1' for 'heading 1'.
+
+### `internal_style_names`
+
+```python
+internal_style_names: Dict[str, str] = dict(style_aliases)
+```
+
+### `style_aliases`
+
+```python
+style_aliases = (('Caption', 'caption'), ('Footer', 'footer'), ('Header', 'header'), ('Heading 1', 'heading 1'), ('Heading 2', 'heading 2'), ('Heading 3', 'heading 3'), ('Heading 4', 'heading 4'), ('Heading 5', 'heading 5'), ('Heading 6', 'heading 6'), ('Heading 7', 'heading 7'), ('Heading 8', 'heading 8'), ('Heading 9', 'heading 9'))
+```
+
+### `ui2internal`
+
+```python
+ui2internal(ui_style_name: str) -> str
+```
+
+Return the internal style name corresponding to `ui_style_name`, such as
+'heading 1' for 'Heading 1'.
+
+### `ui_style_names`
+
+```python
+ui_style_names = {item[1]: item[0] for item in style_aliases}
+```
+
+
+
+
+
+# `docx.styles.style`
+
+Style object hierarchy.
+
+## `BaseStyle`
+
+```python
+BaseStyle(style_elm: CT_Style)
+```
+
+Bases: `ElementProxy`
+
+Base class for the various types of style object, paragraph, character, table,
+and numbering.
+
+These properties and methods are inherited by all style objects.
+
+### `builtin`
+
+```python
+builtin
+```
+
+Read-only.
+
+`True` if this style is a built-in style. `False` indicates it is a custom
+(user-defined) style. Note this value is based on the presence of a
+`customStyle` attribute in the XML, not on specific knowledge of which styles
+are built into Word.
+
+### `delete`
+
+```python
+delete()
+```
+
+Remove this style definition from the document.
+
+Note that calling this method does not remove or change the style applied to any
+document content. Content items having the deleted style will be rendered using
+the default style, as is any content with a style not defined in the document.
+
+### `hidden`
+
+```python
+hidden
+```
+
+`True` if display of this style in the style gallery and list of recommended
+styles is suppressed.
+
+`False` otherwise. In order to be shown in the style gallery, this value must be
+`False` and `.quick_style` must be `True`.
+
+### `locked`
+
+```python
+locked
+```
+
+Read/write Boolean.
+
+`True` if this style is locked. A locked style does not appear in the styles
+panel or the style gallery and cannot be applied to document content. This
+behavior is only active when formatting protection is turned on for the document
+(via the Developer menu).
+
+### `name`
+
+```python
+name
+```
+
+The UI name of this style.
+
+### `priority`
+
+```python
+priority
+```
+
+The integer sort key governing display sequence of this style in the Word UI.
+
+`None` indicates no setting is defined, causing Word to use the default value of
+0. Style name is used as a secondary sort key to resolve ordering of styles
+having the same priority value.
+
+### `quick_style`
+
+```python
+quick_style
+```
+
+`True` if this style should be displayed in the style gallery when
+`.hidden` is `False`.
+
+Read/write Boolean.
+
+### `style_id`
+
+```python
+style_id: str
+```
+
+The unique key name (string) for this style.
+
+This value is subject to rewriting by Word and should generally not be changed
+unless you are familiar with the internals involved.
+
+### `type`
+
+```python
+type
+```
+
+Member of `WdStyleType` corresponding to the type of this style, e.g.
+``WD_STYLE_TYPE.PARAGRAPH``.
+
+### `unhide_when_used`
+
+```python
+unhide_when_used
+```
+
+`True` if an application should make this style visible the next time it is
+applied to content.
+
+False otherwise. Note that `docx` does not automatically unhide a style having
+`True` for this attribute when it is applied to content.
+
+## `CharacterStyle`
+
+Bases: `BaseStyle`
+
+A character style.
+
+A character style is applied to a `Run` object and primarily provides character-
+level formatting via the `Font` object in its `.font` property.
+
+### `base_style`
+
+```python
+base_style
+```
+
+Style object this style inherits from or `None` if this style is not based on
+another style.
+
+### `font`
+
+```python
+font
+```
+
+The `Font` object providing access to the character formatting properties for
+this style, such as font name and size.
+
+## `ParagraphStyle`
+
+Bases: `CharacterStyle`
+
+A paragraph style.
+
+A paragraph style provides both character formatting and paragraph formatting such
+as indentation and line-spacing.
+
+### `next_paragraph_style`
+
+```python
+next_paragraph_style
+```
+
+`_ParagraphStyle` object representing the style to be applied automatically
+to a new paragraph inserted after a paragraph of this style.
+
+Returns self if no next paragraph style is defined. Assigning `None` or `self`
+removes the setting such that new paragraphs are created using this same style.
+
+### `paragraph_format`
+
+```python
+paragraph_format
+```
+
+The `ParagraphFormat` object providing access to the paragraph formatting
+properties for this style such as indentation.
+
+## `StyleFactory`
+
+```python
+StyleFactory(style_elm: CT_Style) -> BaseStyle
+```
+
+Return `Style` object of appropriate `BaseStyle` subclass for `style_elm`.
+
+
+
+
+
+# `docx.styles.styles`
+
+Styles object, container for all objects in the styles part.
+
+## `Styles`
+
+```python
+Styles(styles: CT_Styles)
+```
+
+Bases: `ElementProxy`
+
+Provides access to the styles defined in a document.
+
+Accessed using the `.Document.styles` property. Supports ``len()``, iteration,
+and dictionary-style access by style name.
+
+### `add_style`
+
+```python
+add_style(name, style_type, builtin = False)
+```
+
+Return a newly added style object of `style_type` and identified by `name`.
+
+A builtin style can be defined by passing True for the optional `builtin`
+argument.
+
+### `default`
+
+```python
+default(style_type: WD_STYLE_TYPE)
+```
+
+Return the default style for `style_type` or `None` if no default is defined
+for that type (not common).
+
+### `get_by_id`
+
+```python
+get_by_id(style_id: str | None, style_type: WD_STYLE_TYPE)
+```
+
+Return the style of `style_type` matching `style_id`.
+
+Returns the default for `style_type` if `style_id` is not found or is `None`, or
+if the style having `style_id` is not of `style_type`.
+
+### `get_style_id`
+
+```python
+get_style_id(style_or_name, style_type)
+```
+
+Return the id of the style corresponding to `style_or_name`, or `None` if
+`style_or_name` is `None`.
+
+If `style_or_name` is not a style object, the style is looked up using
+`style_or_name` as a style name, raising `ValueError` if no style with that name
+is defined. Raises `ValueError` if the target style is not of `style_type`.
+
+### `latent_styles`
+
+```python
+latent_styles
+```
+
+A `LatentStyles` object providing access to the default behaviors for latent
+styles and the collection of `_LatentStyle` objects that define overrides of
+those defaults for a particular named latent style.
+
+
+
+
+
+# `docx.table`
+
+The `Table` object and related proxy classes.
+
+## `Table`
+
+```python
+Table(tbl: CT_Tbl, parent: t.ProvidesStoryPart)
+```
+
+Bases: `StoryChild`
+
+Proxy class for a WordprocessingML ```` element.
+
+### `add_column`
+
+```python
+add_column(width: Length)
+```
+
+Return a `_Column` object of `width`, newly added rightmost to the table.
+
+### `add_row`
+
+```python
+add_row()
+```
+
+Return a `_Row` instance, newly added bottom-most to the table.
+
+### `alignment`
+
+```python
+alignment: WD_TABLE_ALIGNMENT | None
+```
+
+Read/write.
+
+A member of `WdRowAlignment` or None, specifying the positioning of this
+table between the page margins. `None` if no setting is specified, causing the
+effective value to be inherited from the style hierarchy.
+
+### `autofit`
+
+```python
+autofit: bool
+```
+
+`True` if column widths can be automatically adjusted to improve the fit of
+cell contents.
+
+`False` if table layout is fixed. Column widths are adjusted in either case if
+total column width exceeds page width. Read/write boolean.
+
+### `cell`
+
+```python
+cell(row_idx: int, col_idx: int) -> _Cell
+```
+
+`_Cell` at `row_idx`, `col_idx` intersection.
+
+(0, 0) is the top, left-most cell.
+
+### `column_cells`
+
+```python
+column_cells(column_idx: int) -> list[_Cell]
+```
+
+Sequence of cells in the column at `column_idx` in this table.
+
+### `columns`
+
+```python
+columns()
+```
+
+`_Columns` instance representing the sequence of columns in this table.
+
+### `row_cells`
+
+```python
+row_cells(row_idx: int) -> list[_Cell]
+```
+
+DEPRECATED: Use `table.rows[row_idx].cells` instead.
+
+Sequence of cells in the row at `row_idx` in this table.
+
+### `rows`
+
+```python
+rows() -> _Rows
+```
+
+`_Rows` instance containing the sequence of rows in this table.
+
+### `style`
+
+```python
+style: _TableStyle | None
+```
+
+`_TableStyle` object representing the style applied to this table.
+
+Read/write. The default table style for the document (often `Normal Table`) is
+returned if the table has no directly-applied style. Assigning `None` to this
+property removes any directly-applied table style causing it to inherit the
+default table style of the document.
+
+Note that the style name of a table style differs slightly from that displayed
+in the user interface; a hyphen, if it appears, must be removed. For example,
+`Light Shading - Accent 1` becomes `Light Shading Accent 1`.
+
+### `table`
+
+```python
+table
+```
+
+Provide child objects with reference to the `Table` object they belong to,
+without them having to know their direct parent is a `Table` object.
+
+This is the terminus of a series of `parent._table` calls from an arbitrary
+child through its ancestors.
+
+### `table_direction`
+
+```python
+table_direction: WD_TABLE_DIRECTION | None
+```
+
+Member of `WdTableDirection` indicating cell-ordering direction.
+
+For example: `WD_TABLE_DIRECTION.LTR`. `None` indicates the value is inherited
+from the style hierarchy.
+
+## `TableParent`
+
+```python
+TableParent: TypeAlias = 'Table | _Columns | _Rows'
+```
diff --git a/addons/sandbox/skills/docx/references/api-004.md b/addons/sandbox/skills/docx/references/api-004.md
new file mode 100644
index 000000000..59f81e5d8
--- /dev/null
+++ b/addons/sandbox/skills/docx/references/api-004.md
@@ -0,0 +1,1312 @@
+
+
+
+
+# `docx.tableops`
+
+Narrow, guarded table operations (paper-docx).
+
+## `check_install`
+
+```python
+check_install() -> None
+```
+
+Refuse when paper-docx and python-docx are both installed.
+
+## `delete_row`
+
+```python
+delete_row(table: 'Table', row: int) -> None
+```
+
+Delete row `row` (0-based).
+
+Refuses the last remaining row, since a rowless table is not valid WordprocessingML.
+Refuses a protected document, an out-of-range index, and a merged or nested target.
+
+## `find_table`
+
+```python
+find_table(document: 'Document', *, near_text: str, match: str = 'exact') -> 'Table'
+```
+
+The table with one physical cell containing `near_text`.
+
+Matching is literal and exact by default; ``match="normalized"`` folds case,
+typography, and whitespace. Paragraph boundaries within one cell are represented
+by literal newlines, but a match never crosses from one cell into another. Only
+top-level tables in the main document body are searched.
+
+Zero matching tables raise `TargetNotFoundError`; more than one matching table
+raises `AmbiguousTargetError` — make `near_text` more specific.
+
+## `insert_row_after`
+
+```python
+insert_row_after(table: 'Table', row: int, values: Sequence[str], *, copy_format_from: Optional[int] = None) -> None
+```
+
+Insert a row after `row` (0-based), copying formatting from `copy_format_from` and
+filling `values`.
+
+The copied template must have one direct paragraph per physical cell, containing
+only plain text runs with identical complete direct run properties. Cell and
+paragraph properties are preserved. Complex or conflicting templates refuse
+before population with guidance to use a simpler uniform template; they are never
+repaired or flattened.
+
+Refuses a protected document, an out-of-range index, and a target row that is merged
+or holds a nested table.
+
+## `update_cell`
+
+```python
+update_cell(table: 'Table', row: int, column: int, new_text: str, *, tracked: bool = False, author: Optional[str] = None, date: Optional[dt.datetime] = None) -> ReplaceResult
+```
+
+Replace one cell's visible text and return a `ReplaceResult` (0-based `row`,
+layout-grid `column`).
+
+Runs through `Span.replace`, so a non-empty replacement inherits the target cell text's
+starting run properties and reports whether later formatting regions were consumed. Guards
+are cell-wise: a merged header elsewhere in the table does not block a plain target cell.
+Refuses a protected document, an out-of-range address, and a marker-divided,
+wrapper-divided, merged, multi-paragraph, or nested target.
+
+
+
+
+
+# `docx.text.font`
+
+Font-related proxy objects.
+
+## `Font`
+
+```python
+Font(r: CT_R, parent: Any | None = None)
+```
+
+Bases: `ElementProxy`
+
+Proxy object for parent of a `` element and providing access to
+character properties such as font name, font size, bold, and subscript.
+
+### `all_caps`
+
+```python
+all_caps: bool | None
+```
+
+Read/write.
+
+Causes text in this font to appear in capital letters.
+
+### `bold`
+
+```python
+bold: bool | None
+```
+
+Read/write.
+
+Causes text in this font to appear in bold.
+
+### `color`
+
+```python
+color
+```
+
+A `ColorFormat` object providing a way to get and set the text color for this
+font.
+
+### `complex_script`
+
+```python
+complex_script: bool | None
+```
+
+Read/write tri-state value.
+
+When `True`, causes the characters in the run to be treated as complex script
+regardless of their Unicode values.
+
+### `cs_bold`
+
+```python
+cs_bold: bool | None
+```
+
+Read/write tri-state value.
+
+When `True`, causes the complex script characters in the run to be displayed in
+bold typeface.
+
+### `cs_italic`
+
+```python
+cs_italic: bool | None
+```
+
+Read/write tri-state value.
+
+When `True`, causes the complex script characters in the run to be displayed in
+italic typeface.
+
+### `double_strike`
+
+```python
+double_strike: bool | None
+```
+
+Read/write tri-state value.
+
+When `True`, causes the text in the run to appear with double strikethrough.
+
+### `emboss`
+
+```python
+emboss: bool | None
+```
+
+Read/write tri-state value.
+
+When `True`, causes the text in the run to appear as if raised off the page in
+relief.
+
+### `hidden`
+
+```python
+hidden: bool | None
+```
+
+Read/write tri-state value.
+
+When `True`, causes the text in the run to be hidden from display, unless
+applications settings force hidden text to be shown.
+
+### `highlight_color`
+
+```python
+highlight_color: WD_COLOR_INDEX | None
+```
+
+Color of highlighing applied or `None` if not highlighted.
+
+### `imprint`
+
+```python
+imprint: bool | None
+```
+
+Read/write tri-state value.
+
+When `True`, causes the text in the run to appear as if pressed into the page.
+
+### `italic`
+
+```python
+italic: bool | None
+```
+
+Read/write tri-state value.
+
+When `True`, causes the text of the run to appear in italics. `None` indicates
+the effective value is inherited from the style hierarchy.
+
+### `math`
+
+```python
+math: bool | None
+```
+
+Read/write tri-state value.
+
+When `True`, specifies this run contains WML that should be handled as though it
+was Office Open XML Math.
+
+### `name`
+
+```python
+name: str | None
+```
+
+The typeface name for this `Font`.
+
+Causes the text it controls to appear in the named font, if a matching font is
+found. `None` indicates the typeface is inherited from the style hierarchy.
+
+### `no_proof`
+
+```python
+no_proof: bool | None
+```
+
+Read/write tri-state value.
+
+When `True`, specifies that the contents of this run should not report any
+errors when the document is scanned for spelling and grammar.
+
+### `outline`
+
+```python
+outline: bool | None
+```
+
+Read/write tri-state value.
+
+When `True` causes the characters in the run to appear as if they have an
+outline, by drawing a one pixel wide border around the inside and outside
+borders of each character glyph.
+
+### `rtl`
+
+```python
+rtl: bool | None
+```
+
+Read/write tri-state value.
+
+When `True` causes the text in the run to have right-to-left characteristics.
+
+### `shadow`
+
+```python
+shadow: bool | None
+```
+
+Read/write tri-state value.
+
+When `True` causes the text in the run to appear as if each character has a
+shadow.
+
+### `size`
+
+```python
+size: Length | None
+```
+
+Font height in English Metric Units (EMU).
+
+`None` indicates the font size should be inherited from the style hierarchy.
+`Length` is a subclass of `int` having properties for convenient conversion into
+points or other length units. The `docx.shared.Pt` class allows
+convenient specification of point values::
+
+ >>> font.size = Pt(24)
+ >>> font.size
+ 304800
+ >>> font.size.pt
+ 24.0
+
+### `small_caps`
+
+```python
+small_caps: bool | None
+```
+
+Read/write tri-state value.
+
+When `True` causes the lowercase characters in the run to appear as capital
+letters two points smaller than the font size specified for the run.
+
+### `snap_to_grid`
+
+```python
+snap_to_grid: bool | None
+```
+
+Read/write tri-state value.
+
+When `True` causes the run to use the document grid characters per line settings
+defined in the docGrid element when laying out the characters in this run.
+
+### `spec_vanish`
+
+```python
+spec_vanish: bool | None
+```
+
+Read/write tri-state value.
+
+When `True`, specifies that the given run shall always behave as if it is
+hidden, even when hidden text is being displayed in the current document. The
+property has a very narrow, specialized use related to the table of contents.
+Consult the spec (§17.3.2.36) for more details.
+
+### `strike`
+
+```python
+strike: bool | None
+```
+
+Read/write tri-state value.
+
+When `True` causes the text in the run to appear with a single horizontal line
+through the center of the line.
+
+### `subscript`
+
+```python
+subscript: bool | None
+```
+
+Boolean indicating whether the characters in this `Font` appear as subscript.
+
+`None` indicates the subscript/subscript value is inherited from the style
+hierarchy.
+
+### `superscript`
+
+```python
+superscript: bool | None
+```
+
+Boolean indicating whether the characters in this `Font` appear as
+superscript.
+
+`None` indicates the subscript/superscript value is inherited from the style
+hierarchy.
+
+### `underline`
+
+```python
+underline: bool | WD_UNDERLINE | None
+```
+
+The underline style for this `Font`.
+
+The value is one of `None`, `True`, `False`, or a member of `WdUnderline`.
+
+`None` indicates the font inherits its underline value from the style hierarchy.
+`False` indicates no underline. `True` indicates single underline. The values
+from `WdUnderline` are used to specify other outline styles such as double,
+wavy, and dotted.
+
+### `web_hidden`
+
+```python
+web_hidden: bool | None
+```
+
+Read/write tri-state value.
+
+When `True`, specifies that the contents of this run shall be hidden when the
+document is displayed in web page view.
+
+
+
+
+
+# `docx.text.hyperlink`
+
+Hyperlink-related proxy objects for python-docx, Hyperlink in particular.
+
+## `Hyperlink`
+
+```python
+Hyperlink(hyperlink: CT_Hyperlink, parent: t.ProvidesStoryPart)
+```
+
+Bases: `Parented`
+
+Proxy object wrapping a `` element.
+
+A hyperlink occurs as a child of a paragraph, at the same level as a Run. A
+hyperlink itself contains runs, which is where the visible text of the hyperlink is
+stored.
+
+### `address`
+
+```python
+address: str
+```
+
+The "URL" of the hyperlink (but not necessarily a web link).
+
+While commonly a web link like "https://google.com" the hyperlink address can
+take a variety of forms including "internal links" to bookmarked locations
+within the document. When this hyperlink is an internal "jump" to for example a
+heading from the table-of-contents (TOC), the address is blank. The bookmark
+reference (like "_Toc147925734") is stored in the `.fragment` property.
+
+### `contains_page_break`
+
+```python
+contains_page_break: bool
+```
+
+True when the text of this hyperlink is broken across page boundaries.
+
+This is not uncommon and can happen for example when the hyperlink text is
+multiple words and occurs in the last line of a page. Theoretically, a hyperlink
+can contain more than one page break but that would be extremely uncommon in
+practice. Still, this value should be understood to mean that "one-or-more"
+rendered page breaks are present.
+
+### `fragment`
+
+```python
+fragment: str
+```
+
+Reference like `#glossary` at end of URL that refers to a sub-resource.
+
+Note that this value does not include the fragment-separator character ("#").
+
+This value is known as a "named anchor" in an HTML context and "anchor" in the
+MS API, but an "anchor" element (``) represents a full hyperlink in HTML so
+we avoid confusion by using the more precise RFC 3986 naming "URI fragment".
+
+These are also used to refer to bookmarks within the same document, in which
+case the `.address` value with be blank ("") and this property will hold a
+value like "_Toc147925734".
+
+To reliably get an entire web URL you will need to concatenate this with the
+`.address` value, separated by "#" when both are present. Consider using the
+`.url` property for that purpose.
+
+Word sometimes stores a fragment in this property (an XML attribute) and
+sometimes with the address, depending on how the URL is inserted, so don't
+depend on this field being empty to indicate no fragment is present.
+
+### `runs`
+
+```python
+runs: list[Run]
+```
+
+List of `Run` instances in this hyperlink.
+
+Together these define the visible text of the hyperlink. The text of a hyperlink
+is typically contained in a single run will be broken into multiple runs if for
+example part of the hyperlink is bold or the text was changed after the document
+was saved.
+
+### `text`
+
+```python
+text: str
+```
+
+String formed by concatenating the text of each run in the hyperlink.
+
+Tabs and line breaks in the XML are mapped to ``\t`` and ``\n`` characters
+respectively. Note that rendered page-breaks can occur within a hyperlink but
+they are not reflected in this text.
+
+### `url`
+
+```python
+url: str
+```
+
+Convenience property to get web URLs from hyperlinks that contain them.
+
+This value is the empty string ("") when there is no address portion, so its
+boolean value can also be used to distinguish external URIs from internal "jump"
+hyperlinks like those found in a table-of-contents.
+
+Note that this value may also be a link to a file, so if you only want web-urls
+you'll need to check for a protocol prefix like `https://`.
+
+When both an address and fragment are present, the return value joins the two
+separated by the fragment-separator hash ("#"). Otherwise this value is the same
+as that of the `.address` property.
+
+## `rollback_on_error`
+
+```python
+rollback_on_error(document: 'Document', *participants: Any) -> Generator[None, None, None]
+```
+
+Restore the live package and named mutable proxies after an error.
+
+
+
+
+
+# `docx.text.pagebreak`
+
+Proxy objects related to rendered page-breaks.
+
+## `RenderedPageBreak`
+
+```python
+RenderedPageBreak(lastRenderedPageBreak: CT_LastRenderedPageBreak, parent: t.ProvidesStoryPart)
+```
+
+Bases: `Parented`
+
+A page-break inserted by Word during page-layout for print or display purposes.
+
+This usually does not correspond to a "hard" page-break inserted by the document
+author, rather just that Word ran out of room on one page and needed to start
+another. The position of these can change depending on the printer and page-size, as
+well as margins, etc. They also will change in response to edits, but not until Word
+loads and saves the document.
+
+Note these are never inserted by `python-docx` because it has no rendering function.
+These are generally only useful for text-extraction of existing documents when
+`python-docx` is being used solely as a document "reader".
+
+NOTE: a rendered page-break can occur within a hyperlink; consider a multi-word
+hyperlink like "excellent Wikipedia article on LLMs" that happens to fall close to
+the end of the last line on a page such that the page breaks between "Wikipedia" and
+"article". In such a "page-breaks-in-hyperlink" case, THESE METHODS WILL "MOVE" THE
+PAGE-BREAK to occur after the hyperlink, such that the entire hyperlink appears in
+the paragraph returned by `.preceding_paragraph_fragment`. While this places the
+"tail" text of the hyperlink on the "wrong" page, it avoids having two hyperlinks
+each with a fragment of the actual text and pointing to the same address.
+
+### `following_paragraph_fragment`
+
+```python
+following_paragraph_fragment: Paragraph | None
+```
+
+A "loose" paragraph containing the content following this page-break.
+
+HAS POTENTIALLY SURPRISING BEHAVIORS so read carefully to be sure this is what
+you want. This is primarily targeted toward text-extraction use-cases for which
+precisely associating text with the page it occurs on is important.
+
+Compare `.preceding_paragraph_fragment` as these two are intended to be used
+together.
+
+This value is `None` when no content follows this page-break. This case is
+unlikely to occur in practice because Word places even-paragraph-boundary
+page-breaks on the paragraph *following* the page-break. Still, it is possible
+and must be checked for. Returning `None` for this case avoids "inserting" an
+extra, non-existent paragraph into the content stream. Note that content can
+include DrawingML items like images or charts, not just text.
+
+The returned paragraph *is divorced from the document body*. Any changes made to
+it will not be reflected in the document. It is intended to provide a container
+(`Paragraph`) with familiar properties and methods that can be used to
+characterize the paragraph content following a mid-paragraph page-break.
+
+Contains no portion of the hyperlink when this break occurs within a hyperlink.
+
+### `preceding_paragraph_fragment`
+
+```python
+preceding_paragraph_fragment: Paragraph | None
+```
+
+A "loose" paragraph containing the content preceding this page-break.
+
+Compare `.following_paragraph_fragment` as these two are intended to be used
+together.
+
+This value is `None` when no content precedes this page-break. This case is
+common and occurs whenever a page breaks on an even paragraph boundary.
+Returning `None` for this case avoids "inserting" a non-existent paragraph into
+the content stream. Note that content can include DrawingML items like images or
+charts.
+
+Note the returned paragraph *is divorced from the document body*. Any changes
+made to it will not be reflected in the document. It is intended to provide a
+familiar container (`Paragraph`) to interrogate for the content preceding this
+page-break in the paragraph in which it occured.
+
+Contains the entire hyperlink when this break occurs within a hyperlink.
+
+
+
+
+
+# `docx.text.paragraph`
+
+Paragraph-related proxy types.
+
+## `Paragraph`
+
+```python
+Paragraph(p: CT_P, parent: t.ProvidesStoryPart)
+```
+
+Bases: `StoryChild`
+
+Proxy object wrapping a `` element.
+
+### `add_run`
+
+```python
+add_run(text: str | None = None, style: str | CharacterStyle | None = None) -> Run
+```
+
+Append run containing `text` and having character-style `style`.
+
+`text` can contain tab (``\t``) characters, which are converted to the
+appropriate XML form for a tab. `text` can also include newline (``\n``) or
+carriage return (``\r``) characters, each of which is converted to a line
+break. When `text` is `None`, the new run is empty.
+
+### `alignment`
+
+```python
+alignment: WD_PARAGRAPH_ALIGNMENT | None
+```
+
+A member of the `WdParagraphAlignment` enumeration specifying the
+justification setting for this paragraph.
+
+A value of `None` indicates the paragraph has no directly-applied alignment
+value and will inherit its alignment value from its style hierarchy. Assigning
+`None` to this property removes any directly-applied alignment value.
+
+### `clear`
+
+```python
+clear()
+```
+
+Return this same paragraph after removing all its content.
+
+Paragraph-level formatting, such as style, is preserved.
+
+### `contains_page_break`
+
+```python
+contains_page_break: bool
+```
+
+`True` when one or more rendered page-breaks occur in this paragraph.
+
+### `hyperlinks`
+
+```python
+hyperlinks: List[Hyperlink]
+```
+
+A `Hyperlink` instance for each hyperlink in this paragraph.
+
+### `insert_paragraph_before`
+
+```python
+insert_paragraph_before(text: str | None = None, style: str | ParagraphStyle | None = None) -> Paragraph
+```
+
+Return a newly created paragraph, inserted directly before this paragraph.
+
+If `text` is supplied, the new paragraph contains that text in a single run. If
+`style` is provided, that style is assigned to the new paragraph.
+
+### `iter_inner_content`
+
+```python
+iter_inner_content() -> Iterator[Run | Hyperlink]
+```
+
+Generate the runs and hyperlinks in this paragraph, in the order they appear.
+
+The content in a paragraph consists of both runs and hyperlinks. This method
+allows accessing each of those separately, in document order, for when the
+precise position of the hyperlink within the paragraph text is important. Note
+that a hyperlink itself contains runs.
+
+### `paragraph_format`
+
+```python
+paragraph_format
+```
+
+The `ParagraphFormat` object providing access to the formatting properties
+for this paragraph, such as line spacing and indentation.
+
+### `rendered_page_breaks`
+
+```python
+rendered_page_breaks: List[RenderedPageBreak]
+```
+
+All rendered page-breaks in this paragraph.
+
+Most often an empty list, sometimes contains one page-break, but can contain
+more than one is rare or contrived cases.
+
+### `runs`
+
+```python
+runs: List[Run]
+```
+
+Sequence of `Run` instances corresponding to the elements in this
+paragraph.
+
+### `style`
+
+```python
+style: ParagraphStyle | None
+```
+
+Read/Write.
+
+`_ParagraphStyle` object representing the style assigned to this paragraph. If
+no explicit style is assigned to this paragraph, its value is the default
+paragraph style for the document. A paragraph style name can be assigned in lieu
+of a paragraph style object. Assigning `None` removes any applied style, making
+its effective value the default paragraph style for the document.
+
+### `text`
+
+```python
+text: str
+```
+
+The textual content of this paragraph.
+
+The text includes the visible-text portion of any hyperlinks in the paragraph.
+Tabs and line breaks in the XML are mapped to ``\t`` and ``\n`` characters
+respectively.
+
+Assigning text to this property causes all existing paragraph content to be
+replaced with a single run containing the assigned text. A ``\t`` character in
+the text is mapped to a ```` element and each ``\n`` or ``\r``
+character is mapped to a line break. Paragraph-level formatting, such as style,
+is preserved. All run-level formatting, such as bold or italic, is removed.
+
+
+
+
+
+# `docx.text.parfmt`
+
+Paragraph-related proxy types.
+
+## `ParagraphFormat`
+
+Bases: `ElementProxy`
+
+Provides access to paragraph formatting such as justification, indentation, line
+spacing, space before and after, and widow/orphan control.
+
+### `alignment`
+
+```python
+alignment
+```
+
+A member of the `WdParagraphAlignment` enumeration specifying the
+justification setting for this paragraph.
+
+A value of `None` indicates paragraph alignment is inherited from the style
+hierarchy.
+
+### `first_line_indent`
+
+```python
+first_line_indent
+```
+
+`Length` value specifying the relative difference in indentation for the
+first line of the paragraph.
+
+A positive value causes the first line to be indented. A negative value produces
+a hanging indent. `None` indicates first line indentation is inherited from the
+style hierarchy.
+
+### `keep_together`
+
+```python
+keep_together
+```
+
+`True` if the paragraph should be kept "in one piece" and not broken across a
+page boundary when the document is rendered.
+
+`None` indicates its effective value is inherited from the style hierarchy.
+
+### `keep_with_next`
+
+```python
+keep_with_next
+```
+
+`True` if the paragraph should be kept on the same page as the subsequent
+paragraph when the document is rendered.
+
+For example, this property could be used to keep a section heading on the same
+page as its first paragraph. `None` indicates its effective value is inherited
+from the style hierarchy.
+
+### `left_indent`
+
+```python
+left_indent
+```
+
+`Length` value specifying the space between the left margin and the left side
+of the paragraph.
+
+`None` indicates the left indent value is inherited from the style hierarchy.
+Use an `Inches` value object as a convenient way to apply indentation in units
+of inches.
+
+### `line_spacing`
+
+```python
+line_spacing
+```
+
+`float` or `Length` value specifying the space between baselines in
+successive lines of the paragraph.
+
+A value of `None` indicates line spacing is inherited from the style hierarchy.
+A float value, e.g. ``2.0`` or ``1.75``, indicates spacing is applied in
+multiples of line heights. A `Length` value such as ``Pt(12)`` indicates spacing
+is a fixed height. The `Pt` value class is a convenient way to apply line
+spacing in units of points. Assigning `None` resets line spacing to inherit from
+the style hierarchy.
+
+### `line_spacing_rule`
+
+```python
+line_spacing_rule
+```
+
+A member of the `WdLineSpacing` enumeration indicating how the value of
+`line_spacing` should be interpreted.
+
+Assigning any of the `WdLineSpacing` members `SINGLE`,
+`DOUBLE`, or `ONE_POINT_FIVE` will cause the value of
+`line_spacing` to be updated to produce the corresponding line spacing.
+
+### `page_break_before`
+
+```python
+page_break_before
+```
+
+`True` if the paragraph should appear at the top of the page following the
+prior paragraph.
+
+`None` indicates its effective value is inherited from the style hierarchy.
+
+### `right_indent`
+
+```python
+right_indent
+```
+
+`Length` value specifying the space between the right margin and the right
+side of the paragraph.
+
+`None` indicates the right indent value is inherited from the style hierarchy.
+Use a `Cm` value object as a convenient way to apply indentation in units of
+centimeters.
+
+### `space_after`
+
+```python
+space_after
+```
+
+`Length` value specifying the spacing to appear between this paragraph and
+the subsequent paragraph.
+
+`None` indicates this value is inherited from the style hierarchy. `Length`
+objects provide convenience properties, such as `pt` and
+`inches`, that allow easy conversion to various length units.
+
+### `space_before`
+
+```python
+space_before
+```
+
+`Length` value specifying the spacing to appear between this paragraph and
+the prior paragraph.
+
+`None` indicates this value is inherited from the style hierarchy. `Length`
+objects provide convenience properties, such as `pt` and
+`cm`, that allow easy conversion to various length units.
+
+### `tab_stops`
+
+```python
+tab_stops()
+```
+
+`TabStops` object providing access to the tab stops defined for this
+paragraph format.
+
+### `widow_control`
+
+```python
+widow_control
+```
+
+`True` if the first and last lines in the paragraph remain on the same page
+as the rest of the paragraph when Word repaginates the document.
+
+`None` indicates its effective value is inherited from the style hierarchy.
+
+
+
+
+
+# `docx.text.run`
+
+Run-related proxy objects for python-docx, Run in particular.
+
+## `Run`
+
+```python
+Run(r: CT_R, parent: t.ProvidesStoryPart)
+```
+
+Bases: `StoryChild`
+
+Proxy object wrapping `` element.
+
+Several of the properties on Run take a tri-state value, `True`, `False`, or `None`.
+`True` and `False` correspond to on and off respectively. `None` indicates the
+property is not specified directly on the run and its effective value is taken from
+the style hierarchy.
+
+### `add_break`
+
+```python
+add_break(break_type: WD_BREAK = WD_BREAK.LINE)
+```
+
+Add a break element of `break_type` to this run.
+
+`break_type` can take the values `WD_BREAK.LINE`, `WD_BREAK.PAGE`, and
+`WD_BREAK.COLUMN` where `WD_BREAK` is imported from `docx.enum.text`.
+`break_type` defaults to `WD_BREAK.LINE`.
+
+### `add_picture`
+
+```python
+add_picture(image_path_or_stream: str | IO[bytes], width: int | Length | None = None, height: int | Length | None = None) -> InlineShape
+```
+
+Return `InlineShape` containing image identified by `image_path_or_stream`.
+
+The picture is added to the end of this run.
+
+`image_path_or_stream` can be a path (a string) or a file-like object containing
+a binary image.
+
+If neither width nor height is specified, the picture appears at
+its native size. If only one is specified, it is used to compute a scaling
+factor that is then applied to the unspecified dimension, preserving the aspect
+ratio of the image. The native size of the picture is calculated using the dots-
+per-inch (dpi) value specified in the image file, defaulting to 72 dpi if no
+value is specified, as is often the case.
+
+### `add_tab`
+
+```python
+add_tab() -> None
+```
+
+Add a ```` element at the end of the run, which Word interprets as a
+tab character.
+
+### `add_text`
+
+```python
+add_text(text: str)
+```
+
+Returns a newly appended `_Text` object (corresponding to a new ````
+child element) to the run, containing `text`.
+
+Compare with the possibly more friendly approach of assigning text to the
+`Run.text` property.
+
+### `bold`
+
+```python
+bold: bool | None
+```
+
+Read/write tri-state value.
+
+When `True`, causes the text of the run to appear in bold face. When `False`,
+the text unconditionally appears non-bold. When `None` the bold setting for this
+run is inherited from the style hierarchy.
+
+### `clear`
+
+```python
+clear()
+```
+
+Return reference to this run after removing all its content.
+
+All run formatting is preserved.
+
+### `contains_page_break`
+
+```python
+contains_page_break: bool
+```
+
+`True` when one or more rendered page-breaks occur in this run.
+
+Note that "hard" page-breaks inserted by the author are not included. A hard
+page-break gives rise to a rendered page-break in the right position so if those
+were included that page-break would be "double-counted".
+
+It would be very rare for multiple rendered page-breaks to occur in a single
+run, but it is possible.
+
+### `element`
+
+```python
+element = r
+```
+
+### `font`
+
+```python
+font: Font
+```
+
+The `Font` object providing access to the character formatting properties for
+this run, such as font name and size.
+
+### `italic`
+
+```python
+italic: bool | None
+```
+
+Read/write tri-state value.
+
+When `True`, causes the text of the run to appear in italics. When `False`, the
+text unconditionally appears non-italic. When `None` the italic setting for this
+run is inherited from the style hierarchy.
+
+### `iter_inner_content`
+
+```python
+iter_inner_content() -> Iterator[str | Drawing | RenderedPageBreak]
+```
+
+Generate the content-items in this run in the order they appear.
+
+NOTE: only content-types currently supported by `python-docx` are generated. In
+this version, that is text and rendered page-breaks. Drawing is included but
+currently only provides access to its XML element (CT_Drawing) on its
+`._drawing` attribute. `Drawing` attributes and methods may be expanded in
+future releases.
+
+There are a number of element-types that can appear inside a run, but most of
+those (w:br, w:cr, w:noBreakHyphen, w:t, w:tab) have a clear plain-text
+equivalent. Any contiguous range of such elements is generated as a single
+`str`. Rendered page-break and drawing elements are generated individually. Any
+other elements are ignored.
+
+### `mark_comment_range`
+
+```python
+mark_comment_range(last_run: Run, comment_id: int) -> None
+```
+
+Mark the runs from this one to `last_run` as a comment range for `comment_id`.
+
+Called by the comment-anchoring machinery; prefer `Document.add_comment` or
+`Span.comment`. Refuses when the two runs belong to different documents, leaving the
+XML unchanged.
+
+### `style`
+
+```python
+style: CharacterStyle
+```
+
+Read/write.
+
+A `CharacterStyle` object representing the character style applied to this run.
+The default character style for the document (often `Default Character Font`) is
+returned if the run has no directly-applied character style. Setting this
+property to `None` removes any directly-applied character style.
+
+### `text`
+
+```python
+text: str
+```
+
+String formed by concatenating the text equivalent of each run.
+
+Each `` element adds the text characters it contains. A `` element
+adds a `\t` character. A `` or `` element each add a `\n`
+character. Note that a `` element can indicate a page break or column
+break as well as a line break. Only line-break `` elements translate to
+a `\n` character. Others are ignored. All other content child elements, such as
+``, are ignored.
+
+Assigning text to this property has the reverse effect, translating each `\t`
+character to a `` element and each `\n` or `\r` character to a
+`` element. Any existing run content is replaced. Run formatting is
+preserved.
+
+### `underline`
+
+```python
+underline: bool | WD_UNDERLINE | None
+```
+
+The underline style for this `Run`.
+
+Value is one of `None`, `True`, `False`, or a member of `WdUnderline`.
+
+A value of `None` indicates the run has no directly-applied underline value and
+so will inherit the underline value of its containing paragraph. Assigning
+`None` to this property removes any directly-applied underline value.
+
+A value of `False` indicates a directly-applied setting of no underline,
+overriding any inherited value.
+
+A value of `True` indicates single underline.
+
+The values from `WdUnderline` are used to specify other outline styles such
+as double, wavy, and dotted.
+
+## `rollback_xml_on_error`
+
+```python
+rollback_xml_on_error(root: '_Element') -> Generator[None, None, None]
+```
+
+Restore one live XML tree after an error in a local compound edit.
+
+
+
+
+
+# `docx.text.tabstops`
+
+Tabstop-related proxy types.
+
+## `TabStop`
+
+```python
+TabStop(element)
+```
+
+Bases: `ElementProxy`
+
+An individual tab stop applying to a paragraph or style.
+
+Accessed using list semantics on its containing `TabStops` object.
+
+### `alignment`
+
+```python
+alignment
+```
+
+A member of `WdTabAlignment` specifying the alignment setting for this
+tab stop.
+
+Read/write.
+
+### `leader`
+
+```python
+leader
+```
+
+A member of `WdTabLeader` specifying a repeating character used as a
+"leader", filling in the space spanned by this tab.
+
+Assigning `None` produces the same result as assigning `WD_TAB_LEADER.SPACES`.
+Read/write.
+
+### `position`
+
+```python
+position
+```
+
+A `Length` object representing the distance of this tab stop from the inside
+edge of the paragraph.
+
+May be positive or negative. Read/write.
+
+## `TabStops`
+
+```python
+TabStops(element)
+```
+
+Bases: `ElementProxy`
+
+A sequence of `TabStop` objects providing access to the tab stops of a paragraph
+or paragraph style.
+
+Supports iteration, indexed access, del, and len(). It is accesed using the
+`tab_stops` property of ParagraphFormat; it is not intended
+to be constructed directly.
+
+### `add_tab_stop`
+
+```python
+add_tab_stop(position, alignment = WD_TAB_ALIGNMENT.LEFT, leader = WD_TAB_LEADER.SPACES)
+```
+
+Add a new tab stop at `position`, a `Length` object specifying the location
+of the tab stop relative to the paragraph edge.
+
+A negative `position` value is valid and appears in hanging indentation. Tab
+alignment defaults to left, but may be specified by passing a member of the
+`WdTabAlignment` enumeration as `alignment`. An optional leader character
+can be specified by passing a member of the `WdTabLeader` enumeration as
+`leader`.
+
+### `clear_all`
+
+```python
+clear_all()
+```
+
+Remove all custom tab stops.
+
+
+
+
+
+# `docx.types`
+
+Abstract types used by `python-docx`.
+
+## `ProvidesStoryPart`
+
+Bases: `Protocol`
+
+An object that provides access to the StoryPart.
+
+This type is for objects that have a story part like document or header as their
+root part.
+
+### `part`
+
+```python
+part: StoryPart
+```
+
+## `ProvidesXmlPart`
+
+Bases: `Protocol`
+
+An object that provides access to its XmlPart.
+
+This type is for objects that need access to their part but it either isn't a
+StoryPart or they don't care, possibly because they just need access to the package
+or related parts.
+
+### `part`
+
+```python
+part: XmlPart
+```
diff --git a/core/services/studio/builtinskills/tree/docx/references/paper-api.md b/addons/sandbox/skills/docx/references/paper-api.md
similarity index 99%
rename from core/services/studio/builtinskills/tree/docx/references/paper-api.md
rename to addons/sandbox/skills/docx/references/paper-api.md
index 2c2c4080d..bc2951d07 100644
--- a/core/services/studio/builtinskills/tree/docx/references/paper-api.md
+++ b/addons/sandbox/skills/docx/references/paper-api.md
@@ -1,3 +1,5 @@
+
+
# Paper DOCX API Companion
This companion covers capabilities beyond familiar `python-docx`. The installed distribution is `paper-docx`, but the import remains `docx`; ordinary `Document`, paragraph, run, style, table, section, picture, header, and footer APIs remain available.
diff --git a/core/services/studio/builtinskills/tree/pdf/SKILL.md b/addons/sandbox/skills/pdf/SKILL.md
similarity index 88%
rename from core/services/studio/builtinskills/tree/pdf/SKILL.md
rename to addons/sandbox/skills/pdf/SKILL.md
index 29c522bef..0d4c7f828 100644
--- a/core/services/studio/builtinskills/tree/pdf/SKILL.md
+++ b/addons/sandbox/skills/pdf/SKILL.md
@@ -29,11 +29,11 @@ content; overlays and annotations do not.
## References and helpers
-- [Deterministic PDF quality](references/deterministic-pdf-quality.md) describes the mechanical
+- [Deterministic PDF quality](references/deterministic-pdf-quality.md#source-1924639cbd4f358c) describes the mechanical
verifier and the limits of extracted-geometry heuristics.
-- [Content QA](references/content-qa.md) describes final-PDF text extraction.
+- [Content QA](references/content-qa.md#source-7cbccb7ea6593740) describes final-PDF text extraction.
-The `scripts/` directory contains mechanical checks for openability, page boxes, text layers,
+The guest directory `/usr/local/lib/localai/document-skills/pdf/` contains mechanical checks for openability, page boxes, text layers,
extracted content, and selected geometry. The verifier's `--strict-layout` mode is designed for known
generated layouts with predictable geometry, not arbitrary PDFs, scans, assembled pages, forms,
redactions, logos, watermarks, or background artwork.
diff --git a/addons/sandbox/skills/pdf/notice.txt b/addons/sandbox/skills/pdf/notice.txt
new file mode 100644
index 000000000..e2afba80e
--- /dev/null
+++ b/addons/sandbox/skills/pdf/notice.txt
@@ -0,0 +1,107 @@
+Sandbox document skills
+=============================
+
+The skills "docx", "xlsx", "pptx" and "pdf" are adapted from the skills of the
+Feather project.
+
+ Source: https://github.com/paper-instruments/feather-train
+ (folder feather-harness/src/feather_harness/skills)
+ Commit: b7463092af862ebbdf4c5920c4bc9ab38ab17ad9
+ Licence: MIT, Copyright (c) 2026 Paper Instruments, Inc.
+
+What was changed: the text about LibreOffice was replaced by a note that
+LibreOffice is not installed, the text about OCR was shortened in the same way,
+and the generated page of the LibreOffice-backed module "openpyxl.oracle" got
+the same note. Each of the four got one line that says to write
+helper scripts in the chat's work folder. The remaining built-in skills are not part of this package.
+
+The MIT licence of the Feather project
+--------------------------------------
+
+MIT License
+
+Copyright (c) 2026 Paper Instruments, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+The generated API pages
+-----------------------
+
+The pages under docx/references/api, xlsx/references/api and
+pptx/references/api are generated from the docstrings of the Paper libraries
+and of the libraries that they extend. The licences of those projects apply to
+that text. All three are MIT licences.
+
+paper-docx extends python-docx, and paper-pptx extends python-pptx. Steve Canny
+wrote both upstream libraries, so the two licence files of the Paper packages
+have the same text. Each applies to its own package.
+
+ paper-docx https://pypi.org/project/paper-docx/ (python-docx)
+ paper-pptx https://pypi.org/project/paper-pptx/ (python-pptx)
+
+The MIT License (MIT)
+Copyright (c) 2013 Steve Canny, https://github.com/scanny
+Portions Copyright (c) 2026 Paper Instruments, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+paper-xlsx extends openpyxl.
+
+ paper-xlsx https://pypi.org/project/paper-xlsx/ (openpyxl)
+
+This software is under the MIT Licence
+======================================
+
+Copyright (c) 2010 openpyxl
+Portions Copyright (c) 2026 Paper Instruments, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/core/services/studio/builtinskills/tree/pdf/references/content-qa.md b/addons/sandbox/skills/pdf/references/content-qa.md
similarity index 57%
rename from core/services/studio/builtinskills/tree/pdf/references/content-qa.md
rename to addons/sandbox/skills/pdf/references/content-qa.md
index c6cae81c6..7087c062d 100644
--- a/core/services/studio/builtinskills/tree/pdf/references/content-qa.md
+++ b/addons/sandbox/skills/pdf/references/content-qa.md
@@ -1,3 +1,5 @@
+
+
# Content QA
Content QA extracts text from a PDF and reports:
@@ -7,7 +9,7 @@ Content QA extracts text from a PDF and reports:
Command:
```bash
-python scripts/content_qa.py artifact.pdf --json
+python3 /usr/local/lib/localai/document-skills/pdf/content_qa.py artifact.pdf --json
```
The script does not determine semantic completeness, correctness, or whether omissions are
diff --git a/core/services/studio/builtinskills/tree/pdf/references/deterministic-pdf-quality.md b/addons/sandbox/skills/pdf/references/deterministic-pdf-quality.md
similarity index 83%
rename from core/services/studio/builtinskills/tree/pdf/references/deterministic-pdf-quality.md
rename to addons/sandbox/skills/pdf/references/deterministic-pdf-quality.md
index e99ca4472..a3082d63d 100644
--- a/core/services/studio/builtinskills/tree/pdf/references/deterministic-pdf-quality.md
+++ b/addons/sandbox/skills/pdf/references/deterministic-pdf-quality.md
@@ -1,3 +1,5 @@
+
+
# Deterministic PDF Quality
The final PDF verifier is a mechanical guard for the rendered PDF package. It intentionally avoids
@@ -14,7 +16,7 @@ Default `verify_pdf.py` checks:
Command:
```bash
-python scripts/verify_pdf.py artifact.pdf --json
+python3 /usr/local/lib/localai/document-skills/pdf/verify_pdf.py artifact.pdf --json
```
The default verifier checks mechanical PDF properties; it does not judge semantic completeness or
diff --git a/core/services/studio/builtinskills/tree/pptx/SKILL.md b/addons/sandbox/skills/pptx/SKILL.md
similarity index 90%
rename from core/services/studio/builtinskills/tree/pptx/SKILL.md
rename to addons/sandbox/skills/pptx/SKILL.md
index c0745b2a6..7f12cc990 100644
--- a/core/services/studio/builtinskills/tree/pptx/SKILL.md
+++ b/addons/sandbox/skills/pptx/SKILL.md
@@ -22,7 +22,7 @@ Use your existing knowledge of `python-pptx` for normal slides, shapes, text, ta
`paper-pptx` is installed under the `pptx` import.
-The [Paper API companion](references/paper-api.md) maps Paper-specific capabilities to their public symbols. The [generated API reference](references/api/index.md) covers the complete public API, including the surface inherited from `python-pptx`, with one page per module. It is large; search by symbol and read only the relevant section.
+The [Paper API companion](references/paper-api.md#source-bd380984355417c8) maps Paper-specific capabilities to their public symbols. The [generated API reference](references/api-002.md#source-21810f9156652e60) covers the complete public API, including the surface inherited from `python-pptx`, with one page per module. It is large; search by symbol and read only the relevant section.
## Package behavior
diff --git a/addons/sandbox/skills/pptx/notice.txt b/addons/sandbox/skills/pptx/notice.txt
new file mode 100644
index 000000000..e2afba80e
--- /dev/null
+++ b/addons/sandbox/skills/pptx/notice.txt
@@ -0,0 +1,107 @@
+Sandbox document skills
+=============================
+
+The skills "docx", "xlsx", "pptx" and "pdf" are adapted from the skills of the
+Feather project.
+
+ Source: https://github.com/paper-instruments/feather-train
+ (folder feather-harness/src/feather_harness/skills)
+ Commit: b7463092af862ebbdf4c5920c4bc9ab38ab17ad9
+ Licence: MIT, Copyright (c) 2026 Paper Instruments, Inc.
+
+What was changed: the text about LibreOffice was replaced by a note that
+LibreOffice is not installed, the text about OCR was shortened in the same way,
+and the generated page of the LibreOffice-backed module "openpyxl.oracle" got
+the same note. Each of the four got one line that says to write
+helper scripts in the chat's work folder. The remaining built-in skills are not part of this package.
+
+The MIT licence of the Feather project
+--------------------------------------
+
+MIT License
+
+Copyright (c) 2026 Paper Instruments, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+The generated API pages
+-----------------------
+
+The pages under docx/references/api, xlsx/references/api and
+pptx/references/api are generated from the docstrings of the Paper libraries
+and of the libraries that they extend. The licences of those projects apply to
+that text. All three are MIT licences.
+
+paper-docx extends python-docx, and paper-pptx extends python-pptx. Steve Canny
+wrote both upstream libraries, so the two licence files of the Paper packages
+have the same text. Each applies to its own package.
+
+ paper-docx https://pypi.org/project/paper-docx/ (python-docx)
+ paper-pptx https://pypi.org/project/paper-pptx/ (python-pptx)
+
+The MIT License (MIT)
+Copyright (c) 2013 Steve Canny, https://github.com/scanny
+Portions Copyright (c) 2026 Paper Instruments, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+paper-xlsx extends openpyxl.
+
+ paper-xlsx https://pypi.org/project/paper-xlsx/ (openpyxl)
+
+This software is under the MIT Licence
+======================================
+
+Copyright (c) 2010 openpyxl
+Portions Copyright (c) 2026 Paper Instruments, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/addons/sandbox/skills/pptx/references/api-001.md b/addons/sandbox/skills/pptx/references/api-001.md
new file mode 100644
index 000000000..e42a5beab
--- /dev/null
+++ b/addons/sandbox/skills/pptx/references/api-001.md
@@ -0,0 +1,6960 @@
+
+
+
+
+# `pptx.action`
+
+Objects related to mouse click and hover actions on a shape or text.
+
+## `ActionSetting`
+
+```python
+ActionSetting(xPr: CT_NonVisualDrawingProps | CT_TextCharacterProperties, parent: BaseShape, hover: bool = False)
+```
+
+Bases: `Subshape`
+
+Properties specifying how a shape or run reacts to mouse actions.
+
+### `action`
+
+```python
+action
+```
+
+Member of `PpActionType` enumeration, such as `PP_ACTION.HYPERLINK`.
+
+The returned member indicates the type of action that will result when the
+specified shape or text is clicked or the mouse pointer is positioned over the
+shape during a slide show.
+
+If there is no click-action or the click-action value is not recognized (is not
+one of the official `MsoPpAction` values) then `PP_ACTION.NONE` is returned.
+
+### `hyperlink`
+
+```python
+hyperlink() -> Hyperlink
+```
+
+A `Hyperlink` object representing the hyperlink action defined on
+this click or hover mouse event. A `Hyperlink` object is always
+returned, even if no hyperlink or other click action is defined.
+
+### `target_slide`
+
+```python
+target_slide: Slide | None
+```
+
+A reference to the slide in this presentation that is the target of
+the slide jump action in this shape. Slide jump actions include
+`PP_ACTION.FIRST_SLIDE`, `LAST_SLIDE`, `NEXT_SLIDE`,
+`PREVIOUS_SLIDE`, and `NAMED_SLIDE`. Returns `None` for all other
+actions. In particular, the `LAST_SLIDE_VIEWED` action and the `PLAY`
+(start other presentation) actions are not supported.
+
+A slide object may be assigned to this property, which makes the
+shape an "internal hyperlink" to the assigened slide::
+
+ slide, target_slide = prs.slides[0], prs.slides[1]
+ shape = slide.shapes[0]
+ shape.target_slide = target_slide
+
+Assigning `None` removes any slide jump action. Note that this is
+accomplished by removing any action present (such as a hyperlink),
+without first checking that it is a slide jump action.
+
+## `Hyperlink`
+
+```python
+Hyperlink(xPr: CT_NonVisualDrawingProps | CT_TextCharacterProperties, parent: BaseShape, hover: bool = False)
+```
+
+Bases: `Subshape`
+
+Represents a hyperlink action on a shape or text run.
+
+### `address`
+
+```python
+address: str | None
+```
+
+Read/write. The URL of the hyperlink.
+
+URL can be on http, https, mailto, or file scheme; others may work. Returns `None` if no
+hyperlink is defined, including when another action such as `RUN_MACRO` is defined on the
+object. Assigning `None` removes any action defined on the object, whether it is a hyperlink
+action or not.
+
+
+
+
+
+# `pptx.api`
+
+Directly exposed API classes, Presentation for now.
+
+## `Presentation`
+
+```python
+Presentation(pptx: str | IO[bytes] | None = None) -> presentation.Presentation
+```
+
+Return a `Presentation` object loaded from *pptx*, where *pptx* can be
+either a path to a ``.pptx`` file (a string) or a file-like object. If
+*pptx* is missing or ``None``, the built-in default presentation
+"template" is loaded.
+
+
+
+
+
+# `pptx.chart.axis`
+
+Axis-related chart objects.
+
+## `AxisTitle`
+
+```python
+AxisTitle(title)
+```
+
+Bases: `ElementProxy`
+
+Provides properties for manipulating axis title.
+
+### `format`
+
+```python
+format()
+```
+
+`ChartFormat` object providing access to shape formatting.
+
+Return the `ChartFormat` object providing shape formatting properties
+for this axis title, such as its line color and fill.
+
+### `has_text_frame`
+
+```python
+has_text_frame
+```
+
+Read/write Boolean specifying presence of a text frame.
+
+Return `True` if this axis title has a text frame, and `False`
+otherwise. Assigning `True` causes a text frame to be added if not
+already present. Assigning `False` causes any existing text frame to
+be removed along with any text contained in the text frame.
+
+### `text_frame`
+
+```python
+text_frame
+```
+
+`TextFrame` instance for this axis title.
+
+Return a `TextFrame` instance allowing read/write access to the text
+of this axis title and its text formatting properties. Accessing this
+property is destructive as it adds a new text frame if not already
+present.
+
+## `CategoryAxis`
+
+Bases: `_BaseAxis`
+
+A category axis of a chart.
+
+### `category_type`
+
+```python
+category_type
+```
+
+A member of `XlCategoryType` specifying the scale type of this
+axis. Unconditionally ``CATEGORY_SCALE`` for a `CategoryAxis` object.
+
+## `DateAxis`
+
+Bases: `_BaseAxis`
+
+A category axis with dates as its category labels.
+
+This axis-type has some special display behaviors such as making length of equal
+periods equal and normalizing month start dates despite unequal month lengths.
+
+### `category_type`
+
+```python
+category_type
+```
+
+A member of `XlCategoryType` specifying the scale type of this
+axis. Unconditionally ``TIME_SCALE`` for a `DateAxis` object.
+
+## `MajorGridlines`
+
+```python
+MajorGridlines(xAx)
+```
+
+Bases: `ElementProxy`
+
+Provides access to the properties of the major gridlines appearing on an axis.
+
+### `format`
+
+```python
+format()
+```
+
+The `ChartFormat` object providing access to the shape formatting
+properties of this data point, such as line and fill.
+
+## `TickLabels`
+
+```python
+TickLabels(xAx_elm)
+```
+
+Bases: `object`
+
+A service class providing access to formatting of axis tick mark labels.
+
+### `font`
+
+```python
+font()
+```
+
+The `Font` object that provides access to the text properties for
+these tick labels, such as bold, italic, etc.
+
+### `number_format`
+
+```python
+number_format
+```
+
+Read/write string (e.g. "$#,##0.00") specifying the format for the
+numbers on this axis. The syntax for these strings is the same as it
+appears in the PowerPoint or Excel UI. Returns 'General' if no number
+format has been set. Note that this format string has no effect on
+rendered tick labels when `number_format_is_linked` is `True`.
+Assigning a format string to this property automatically sets
+`number_format_is_linked` to `False`.
+
+### `number_format_is_linked`
+
+```python
+number_format_is_linked
+```
+
+Read/write boolean specifying whether number formatting should be
+taken from the source spreadsheet rather than the value of
+`number_format`.
+
+### `offset`
+
+```python
+offset
+```
+
+Read/write int value in range 0-1000 specifying the spacing between
+the tick mark labels and the axis as a percentange of the default
+value. 100 if no label offset setting is present.
+
+## `ValueAxis`
+
+Bases: `_BaseAxis`
+
+An axis having continuous (as opposed to discrete) values.
+
+The vertical axis is generally a value axis, however both axes of an XY-type chart
+are value axes.
+
+### `crosses`
+
+```python
+crosses
+```
+
+Member of `XlAxisCrosses` enumeration specifying the point on
+this axis where the other axis crosses, such as auto/zero, minimum,
+or maximum. Returns `XL_AXIS_CROSSES.CUSTOM` when a specific numeric
+crossing point (e.g. 1.5) is defined.
+
+### `crosses_at`
+
+```python
+crosses_at
+```
+
+Numeric value on this axis at which the perpendicular axis crosses.
+Returns `None` if no crossing value is set.
+
+### `major_unit`
+
+```python
+major_unit
+```
+
+The float number of units between major tick marks on this value
+axis. `None` corresponds to the 'Auto' setting in the UI, and
+specifies the value should be calculated by PowerPoint based on the
+underlying chart data.
+
+### `minor_unit`
+
+```python
+minor_unit
+```
+
+The float number of units between minor tick marks on this value
+axis. `None` corresponds to the 'Auto' setting in the UI, and
+specifies the value should be calculated by PowerPoint based on the
+underlying chart data.
+
+
+
+
+
+# `pptx.chart.category`
+
+Category-related objects.
+
+## `Categories`
+
+```python
+Categories(xChart)
+```
+
+Bases: `Sequence`
+
+A sequence of `category.Category` objects, each representing a category
+label on the chart. Provides properties for dealing with hierarchical
+categories.
+
+### `depth`
+
+```python
+depth
+```
+
+Return an integer representing the number of hierarchical levels in
+this category collection. Returns 1 for non-hierarchical categories
+and 0 if no categories are present (generally meaning no series are
+present).
+
+### `flattened_labels`
+
+```python
+flattened_labels
+```
+
+Return a sequence of tuples, each containing the flattened hierarchy
+of category labels for a leaf category. Each tuple is in parent ->
+child order, e.g. ``('US', 'CA', 'San Francisco')``, with the leaf
+category appearing last. If this categories collection is
+non-hierarchical, each tuple will contain only a leaf category label.
+If the plot has no series (and therefore no categories), an empty
+tuple is returned.
+
+### `levels`
+
+```python
+levels
+```
+
+Return a sequence of `CategoryLevel` objects representing the
+hierarchy of this category collection. The sequence is empty when the
+category collection is not hierarchical, that is, contains only
+leaf-level categories. The levels are ordered from the leaf level to
+the root level; so the first level will contain the same categories
+as this category collection.
+
+## `Category`
+
+```python
+Category(pt, idx = None)
+```
+
+Bases: `str`
+
+An extension of `str` that provides the category label as its string
+value, and additional attributes representing other aspects of the
+category.
+
+*idx* is a required attribute of a c:pt element, but must be
+specified when pt is None, as when a "placeholder" category is
+created to represent a missing c:pt element.
+
+### `idx`
+
+```python
+idx
+```
+
+Return an integer representing the index reference of this category.
+For a leaf node, the index identifies the category. For a parent (or
+other ancestor) category, the index specifies the first leaf category
+that ancestor encloses.
+
+### `label`
+
+```python
+label
+```
+
+Return the label of this category as a string.
+
+## `CategoryLevel`
+
+```python
+CategoryLevel(lvl)
+```
+
+Bases: `Sequence`
+
+A sequence of `category.Category` objects representing a single level in
+a hierarchical category collection. This object is only used when the
+categories are hierarchical, meaning they have more than one level and
+higher level categories group those at lower levels.
+
+
+
+
+
+# `pptx.chart.chart`
+
+Chart-related objects such as Chart and ChartTitle.
+
+## `Chart`
+
+```python
+Chart(chartSpace, chart_part)
+```
+
+Bases: `PartElementProxy`
+
+A chart object.
+
+### `category_axis`
+
+```python
+category_axis
+```
+
+The category axis of this chart. In the case of an XY or Bubble
+chart, this is the X axis. Raises `ValueError` if no category
+axis is defined (as is the case for a pie chart, for example).
+
+### `chart_style`
+
+```python
+chart_style
+```
+
+Read/write integer index of chart style used to format this chart.
+Range is from 1 to 48. Value is `None` if no explicit style has been
+assigned, in which case the default chart style is used. Assigning
+`None` causes any explicit setting to be removed. The integer index
+corresponds to the style's position in the chart style gallery in the
+PowerPoint UI.
+
+### `chart_title`
+
+```python
+chart_title
+```
+
+A `ChartTitle` object providing access to title properties.
+
+Calling this property is destructive in the sense it adds a chart
+title element (`c:title`) to the chart XML if one is not already
+present. Use `has_title` to test for presence of a chart title
+non-destructively.
+
+### `chart_type`
+
+```python
+chart_type
+```
+
+Member of `XlChartType` enumeration specifying type of this chart.
+
+If the chart has two plots, for example, a line plot overlayed on a bar plot,
+the type reported is for the first (back-most) plot. Read-only.
+
+### `font`
+
+```python
+font()
+```
+
+Font object controlling text format defaults for this chart.
+
+### `has_legend`
+
+```python
+has_legend
+```
+
+Read/write boolean, `True` if the chart has a legend. Assigning
+`True` causes a legend to be added to the chart if it doesn't already
+have one. Assigning False removes any existing legend definition
+along with any existing legend settings.
+
+### `has_title`
+
+```python
+has_title
+```
+
+Read/write boolean, specifying whether this chart has a title.
+
+Assigning `True` causes a title to be added if not already present.
+Assigning `False` removes any existing title along with its text and
+settings.
+
+### `legend`
+
+```python
+legend
+```
+
+A `Legend` object providing access to the properties of the legend
+for this chart.
+
+### `plots`
+
+```python
+plots()
+```
+
+The sequence of plots in this chart. A plot, called a *chart group*
+in the Microsoft API, is a distinct sequence of one or more series
+depicted in a particular charting type. For example, a chart having
+a series plotted as a line overlaid on three series plotted as
+columns would have two plots; the first corresponding to the three
+column series and the second to the line series. Plots are sequenced
+in the order drawn, i.e. back-most to front-most. Supports *len()*,
+membership (e.g. ``p in plots``), iteration, slicing, and indexed
+access (e.g. ``plot = plots[i]``).
+
+### `replace_data`
+
+```python
+replace_data(chart_data)
+```
+
+Use the categories and series values in the `ChartData` object
+*chart_data* to replace those in the XML and Excel worksheet for this
+chart.
+
+### `replace_data_safe`
+
+```python
+replace_data_safe(categories, series, *, number_format = None)
+```
+
+Validate `categories`/`series` fully, then route to `replace_data`.
+
+paper-pptx addition: the safety-and-addressing wrapper over the existing replacement
+mechanism. `categories` is a sequence of str; `series` is a sequence of
+`(name, values)` pairs where each `values` is a sequence of numbers (or None for a
+missing point) exactly as long as `categories`.
+
+Data-shape problems raise `ValueError` (programmer error). Structural refusals
+(`UnsupportedStructureError`, document untouched): a chart type outside the
+supported category-chart families (XY/bubble/stock/surface/radar and 3-D variants
+are not supported) or a multi-plot (combo) chart. Charts without an embedded
+workbook (e.g. LibreOffice/Google-authored) are supported: their chart
+XML is rewritten and the (absent) workbook update is skipped.
+
+### `series`
+
+```python
+series()
+```
+
+A `SeriesCollection` object containing all the series in this
+chart. When the chart has multiple plots, all the series for the
+first plot appear before all those for the second, and so on. Series
+within a plot have an explicit ordering and appear in that sequence.
+
+### `value_axis`
+
+```python
+value_axis
+```
+
+The `ValueAxis` object providing access to properties of the value
+axis of this chart. Raises `ValueError` if the chart has no value
+axis.
+
+## `ChartTitle`
+
+```python
+ChartTitle(title)
+```
+
+Bases: `ElementProxy`
+
+Provides properties for manipulating a chart title.
+
+### `format`
+
+```python
+format()
+```
+
+`ChartFormat` object providing access to line and fill formatting.
+
+Return the `ChartFormat` object providing shape formatting properties
+for this chart title, such as its line color and fill.
+
+### `has_text_frame`
+
+```python
+has_text_frame
+```
+
+Read/write Boolean specifying whether this title has a text frame.
+
+Return `True` if this chart title has a text frame, and `False`
+otherwise. Assigning `True` causes a text frame to be added if not
+already present. Assigning `False` causes any existing text frame to
+be removed along with its text and formatting.
+
+### `text_frame`
+
+```python
+text_frame
+```
+
+`TextFrame` instance for this chart title.
+
+Return a `TextFrame` instance allowing read/write access to the text
+of this chart title and its text formatting properties. Accessing this
+property is destructive in the sense it adds a text frame if one is
+not present. Use `has_text_frame` to test for the presence of
+a text frame non-destructively.
+
+
+
+
+
+# `pptx.chart.data`
+
+ChartData and related objects.
+
+## `BubbleChartData`
+
+Bases: `XyChartData`
+
+A specialized ChartData object suitable for use with a bubble chart.
+A bubble chart is essentially an XY chart where the markers are scaled to
+provide a third quantitative dimension to the exhibit.
+
+### `add_series`
+
+```python
+add_series(name, number_format = None)
+```
+
+Return a `BubbleSeriesData` object newly created and added at the end
+of this sequence, and having series named *name* and values formatted
+with *number_format*.
+
+### `bubble_sizes_ref`
+
+```python
+bubble_sizes_ref(series)
+```
+
+The Excel worksheet reference for the range containing the bubble
+sizes for *series*.
+
+## `BubbleDataPoint`
+
+```python
+BubbleDataPoint(series_data, x, y, size, number_format)
+```
+
+Bases: `XyDataPoint`
+
+A data point in a bubble chart series. Provides access to the x, y, and
+size values of the datapoint.
+
+### `bubble_size`
+
+```python
+bubble_size
+```
+
+The value representing the size of the bubble for this data point.
+
+## `BubbleSeriesData`
+
+Bases: `XySeriesData`
+
+The data specific to a particular Bubble chart series. It provides access
+to the series label, the series data points, and an optional number
+format to be applied to each data point not having a specified number
+format.
+
+The sequence of data points in a bubble chart series is maintained
+throughout the chart building process because a data point has no unique
+identifier and can only be retrieved by index.
+
+### `add_data_point`
+
+```python
+add_data_point(x, y, size, number_format = None)
+```
+
+Append a new BubbleDataPoint object having the values *x*, *y*, and
+*size*. The optional *number_format* is used to format the Y value.
+If not provided, the number format is inherited from the series data.
+
+### `bubble_sizes`
+
+```python
+bubble_sizes
+```
+
+A sequence containing the bubble size for each datapoint in this
+series, in data point order.
+
+### `bubble_sizes_ref`
+
+```python
+bubble_sizes_ref
+```
+
+The Excel worksheet reference for the range containing the bubble
+sizes for this series.
+
+## `Categories`
+
+```python
+Categories()
+```
+
+Bases: `Sequence`
+
+A sequence of `data.Category` objects, also having certain hierarchical
+graph behaviors for support of multi-level (nested) categories.
+
+### `add_category`
+
+```python
+add_category(label)
+```
+
+Return a newly created `data.Category` object having *label* and
+appended to the end of this category sequence. *label* can be
+a string, a number, a datetime.date, or datetime.datetime object. All
+category labels in a chart must be the same type. All category labels
+in a chart having multi-level categories must be strings.
+
+Creating a chart from chart data having date categories will cause
+the chart to have a `DateAxis` for its category axis.
+
+### `are_dates`
+
+```python
+are_dates
+```
+
+Return `True` if the first category in this collection has a date
+label (as opposed to str or numeric). A date label is one of type
+datetime.date or datetime.datetime. Returns `False` otherwise,
+including when this category collection is empty. It also returns
+False when this category collection is hierarchical, because
+hierarchical categories can only be written as string labels.
+
+### `are_numeric`
+
+```python
+are_numeric
+```
+
+Return `True` if the first category in this collection has a numeric
+label (as opposed to a string label), including if that value is
+a datetime.date or datetime.datetime object (as those are converted
+to integers for storage in Excel). Returns `False` otherwise,
+including when this category collection is empty. It also returns
+False when this category collection is hierarchical, because
+hierarchical categories can only be written as string labels.
+
+### `depth`
+
+```python
+depth
+```
+
+The number of hierarchy levels in this category graph. Returns 0 if
+it contains no categories.
+
+### `index`
+
+```python
+index(category)
+```
+
+The offset of *category* in the overall sequence of leaf categories.
+A non-leaf category gets the index of its first sub-category.
+
+### `leaf_count`
+
+```python
+leaf_count
+```
+
+The number of leaf-level categories in this hierarchy. The return
+value is the same as that of `len()` only when the hierarchy is
+single level.
+
+### `levels`
+
+```python
+levels
+```
+
+A generator of (idx, label) sequences representing the category
+hierarchy from the bottom up. The first level contains all leaf
+categories, and each subsequent is the next level up.
+
+### `number_format`
+
+```python
+number_format
+```
+
+Read/write. Return a string representing the number format used in
+Excel to format these category values, e.g. '0.0' or 'mm/dd/yyyy'.
+This string is only relevant when the categories are numeric or date
+type, although it returns 'General' without error when the categories
+are string labels. Assigning `None` causes the default number format
+to be used, based on the type of the category labels.
+
+## `Category`
+
+```python
+Category(label, parent)
+```
+
+Bases: `object`
+
+A chart category, primarily having a label to be displayed on the
+category axis, but also able to be configured in a hierarchy for support
+of multi-level category charts.
+
+### `add_sub_category`
+
+```python
+add_sub_category(label)
+```
+
+Return a newly created `data.Category` object having *label* and
+appended to the end of the sub-category sequence for this category.
+
+### `depth`
+
+```python
+depth
+```
+
+The number of hierarchy levels rooted at this category node. Returns
+1 if this category has no sub-categories.
+
+### `idx`
+
+```python
+idx
+```
+
+The offset of this category in the overall sequence of leaf
+categories. A non-leaf category gets the index of its first
+sub-category.
+
+### `index`
+
+```python
+index(sub_category)
+```
+
+The offset of *sub_category* in the overall sequence of leaf
+categories.
+
+### `label`
+
+```python
+label
+```
+
+The value that appears on the axis for this category. The label can
+be a string, a number, or a datetime.date or datetime.datetime
+object.
+
+### `leaf_count`
+
+```python
+leaf_count
+```
+
+The number of leaf category nodes under this category. Returns
+1 if this category has no sub-categories.
+
+### `numeric_str_val`
+
+```python
+numeric_str_val(date_1904 = False)
+```
+
+The string representation of the numeric (or date) label of this
+category, suitable for use in the XML `c:pt` element for this
+category. The optional *date_1904* parameter specifies the epoch used
+for calculating Excel date numbers.
+
+### `sub_categories`
+
+```python
+sub_categories
+```
+
+The sequence of child categories for this category.
+
+## `CategoryChartData`
+
+Bases: `_BaseChartData`
+
+Accumulates data specifying the categories and series values for a chart
+and acts as a proxy for the chart data table that will be written to an
+Excel worksheet. Used as a parameter in `shapes.add_chart` and
+`Chart.replace_data`.
+
+This object is suitable for use with category charts, i.e. all those
+having a discrete set of label values (categories) as the range of their
+independent variable (X-axis) values. Unlike the ChartData types for
+charts supporting a continuous range of independent variable values (such
+as XyChartData), CategoryChartData has a single collection of category
+(X) values and each data point in its series specifies only the Y value.
+The corresponding X value is inferred by its position in the sequence.
+
+### `add_category`
+
+```python
+add_category(label)
+```
+
+Return a newly created `data.Category` object having *label* and
+appended to the end of the category collection for this chart.
+*label* can be a string, a number, a datetime.date, or
+datetime.datetime object. All category labels in a chart must be the
+same type. All category labels in a chart having multi-level
+categories must be strings.
+
+### `add_series`
+
+```python
+add_series(name, values = (), number_format = None)
+```
+
+Add a series to this data set entitled *name* and having the data
+points specified by *values*, an iterable of numeric values.
+*number_format* specifies how the series values will be displayed,
+and may be a string, e.g. '#,##0' corresponding to an Excel number
+format.
+
+### `categories`
+
+```python
+categories
+```
+
+`data.Categories` object providing access to category-object hierarchy.
+
+Assigning an iterable of category labels (strings, numbers, or dates) replaces
+the `data.Categories` object with a new one containing a category for each label
+in the sequence.
+
+Creating a chart from chart data having date categories will cause the chart to
+have a `DateAxis` for its category axis.
+
+### `categories_ref`
+
+```python
+categories_ref
+```
+
+The Excel worksheet reference to the categories for this chart (not
+including the column heading).
+
+### `values_ref`
+
+```python
+values_ref(series)
+```
+
+The Excel worksheet reference to the values for *series* (not
+including the column heading).
+
+## `CategoryDataPoint`
+
+```python
+CategoryDataPoint(series_data, value, number_format)
+```
+
+Bases: `_BaseDataPoint`
+
+A data point in a category chart series. Provides access to the value of
+the datapoint and the number format with which it should appear in the
+Excel file.
+
+### `value`
+
+```python
+value
+```
+
+The (Y) value for this category data point.
+
+## `CategorySeriesData`
+
+Bases: `_BaseSeriesData`
+
+The data specific to a particular category chart series. It provides
+access to the series label, the series data points, and an optional
+number format to be applied to each data point not having a specified
+number format.
+
+### `add_data_point`
+
+```python
+add_data_point(value, number_format = None)
+```
+
+Return a CategoryDataPoint object newly created with value *value*,
+an optional *number_format*, and appended to this sequence.
+
+### `categories`
+
+```python
+categories
+```
+
+The `data.Categories` object that provides access to the category
+objects for this series.
+
+### `categories_ref`
+
+```python
+categories_ref
+```
+
+The Excel worksheet reference to the categories for this chart (not
+including the column heading).
+
+### `values`
+
+```python
+values
+```
+
+A sequence containing the (Y) value of each datapoint in this series,
+in data point order.
+
+### `values_ref`
+
+```python
+values_ref
+```
+
+The Excel worksheet reference to the (Y) values for this series (not
+including the column heading).
+
+## `ChartData`
+
+Bases: `CategoryChartData`
+
+`ChartData` is simply an alias for `CategoryChartData` and may be removed
+in a future release. All new development should use `CategoryChartData`
+for creating or replacing the data in chart types other than XY and
+Bubble.
+
+## `XyChartData`
+
+Bases: `_BaseChartData`
+
+A specialized ChartData object suitable for use with an XY (aka. scatter)
+chart. Unlike ChartData, it has no category sequence. Rather, each data
+point of each series specifies both an X and a Y value.
+
+### `add_series`
+
+```python
+add_series(name, number_format = None)
+```
+
+Return an `XySeriesData` object newly created and added at the end of
+this sequence, identified by *name* and values formatted with
+*number_format*.
+
+## `XyDataPoint`
+
+```python
+XyDataPoint(series_data, x, y, number_format)
+```
+
+Bases: `_BaseDataPoint`
+
+A data point in an XY chart series. Provides access to the x and y values
+of the datapoint.
+
+### `x`
+
+```python
+x
+```
+
+The X value for this XY data point.
+
+### `y`
+
+```python
+y
+```
+
+The Y value for this XY data point.
+
+## `XySeriesData`
+
+Bases: `_BaseSeriesData`
+
+The data specific to a particular XY chart series. It provides access to
+the series label, the series data points, and an optional number format
+to be applied to each data point not having a specified number format.
+
+The sequence of data points in an XY series is significant; lines are
+plotted following the sequence of points, even if that causes a line
+segment to "travel backward" (implying a multi-valued function). The data
+points are not automatically sorted into increasing order by X value.
+
+### `add_data_point`
+
+```python
+add_data_point(x, y, number_format = None)
+```
+
+Return an XyDataPoint object newly created with values *x* and *y*,
+and appended to this sequence.
+
+
+
+
+
+# `pptx.chart.datalabel`
+
+Data label-related objects.
+
+## `DataLabel`
+
+```python
+DataLabel(ser, idx)
+```
+
+Bases: `object`
+
+The data label associated with an individual data point.
+
+### `font`
+
+```python
+font()
+```
+
+The `Font` object providing text formatting for this data label.
+
+This font object is used to customize the appearance of automatically
+inserted text, such as the data point value. The font applies to the
+entire data label. More granular control of the appearance of custom
+data label text is controlled by a font object on runs in the text
+frame.
+
+### `has_text_frame`
+
+```python
+has_text_frame
+```
+
+Return `True` if this data label has a text frame (implying it has
+custom data label text), and `False` otherwise. Assigning `True`
+causes a text frame to be added if not already present. Assigning
+`False` causes any existing text frame to be removed along with any
+text contained in the text frame.
+
+### `position`
+
+```python
+position
+```
+
+Read/write `XlDataLabelPosition` member specifying the position
+of this data label with respect to its data point, or `None` if no
+position is specified. Assigning `None` causes PowerPoint to choose
+the default position, which varies by chart type.
+
+### `text_frame`
+
+```python
+text_frame
+```
+
+`TextFrame` instance for this data label, containing the text of the
+data label and providing access to its text formatting properties.
+
+## `DataLabels`
+
+```python
+DataLabels(dLbls)
+```
+
+Bases: `object`
+
+Provides access to properties of data labels for a plot or a series.
+
+This is not a collection and does not provide access to individual data
+labels. Access to individual labels is via the `Point` object. The
+properties this object provides control formatting of *all* the data
+labels in its scope.
+
+### `font`
+
+```python
+font()
+```
+
+The `Font` object that provides access to the text properties for
+these data labels, such as bold, italic, etc.
+
+### `number_format`
+
+```python
+number_format
+```
+
+Read/write string specifying the format for the numbers on this set
+of data labels. Returns 'General' if no number format has been set.
+Note that this format string has no effect on rendered data labels
+when `number_format_is_linked` is `True`. Assigning a format
+string to this property automatically sets
+`number_format_is_linked` to `False`.
+
+### `number_format_is_linked`
+
+```python
+number_format_is_linked
+```
+
+Read/write boolean specifying whether number formatting should be
+taken from the source spreadsheet rather than the value of
+`number_format`.
+
+### `position`
+
+```python
+position
+```
+
+Read/write `XlDataLabelPosition` enumeration value specifying
+the position of the data labels with respect to their data point, or
+`None` if no position is specified. Assigning `None` causes
+PowerPoint to choose the default position, which varies by chart
+type.
+
+### `show_category_name`
+
+```python
+show_category_name
+```
+
+Read/write. True when name of category should appear in label.
+
+### `show_legend_key`
+
+```python
+show_legend_key
+```
+
+Read/write. True when data label displays legend-color swatch.
+
+### `show_percentage`
+
+```python
+show_percentage
+```
+
+Read/write. True when data label displays percentage.
+
+This option is not operative on all chart types. Percentage appears
+on polar charts such as pie and donut.
+
+### `show_series_name`
+
+```python
+show_series_name
+```
+
+Read/write. True when data label displays series name.
+
+### `show_value`
+
+```python
+show_value
+```
+
+Read/write. True when label displays numeric value of datapoint.
+
+
+
+
+
+# `pptx.chart.legend`
+
+Legend of a chart.
+
+## `Legend`
+
+```python
+Legend(legend_elm)
+```
+
+Bases: `object`
+
+Represents the legend in a chart. A chart can have at most one legend.
+
+### `font`
+
+```python
+font()
+```
+
+The `Font` object that provides access to the text properties for
+this legend, such as bold, italic, etc.
+
+### `horz_offset`
+
+```python
+horz_offset
+```
+
+Adjustment of the x position of the legend from its default.
+Expressed as a float between -1.0 and 1.0 representing a fraction of
+the chart width. Negative values move the legend left, positive
+values move it to the right. `None` if no setting is specified.
+
+### `include_in_layout`
+
+```python
+include_in_layout
+```
+
+`True` if legend should be located inside plot area.
+
+Read/write boolean specifying whether legend should be placed inside
+the plot area. In many cases this will cause it to be superimposed on
+the chart itself. Assigning `None` to this property causes any
+`c:overlay` element to be removed, which is interpreted the same as
+`True`. This use case should rarely be required and assigning
+a boolean value is recommended.
+
+### `position`
+
+```python
+position
+```
+
+Read/write `XlLegendPosition` enumeration value specifying the
+general region of the chart in which to place the legend.
+
+
+
+
+
+# `pptx.chart.marker`
+
+Marker-related objects.
+
+## `Marker`
+
+Bases: `ElementProxy`
+
+Represents a data point marker, such as a diamond or circle, on
+a line-type chart.
+
+### `format`
+
+```python
+format()
+```
+
+The `ChartFormat` instance for this marker, providing access to shape
+properties such as fill and line.
+
+### `size`
+
+```python
+size
+```
+
+An integer between 2 and 72 inclusive indicating the size of this
+marker in points. A value of `None` indicates no explicit value is
+set and the size is inherited from a higher-level setting or the
+PowerPoint default (which may be 9). Assigning `None` removes any
+explicitly assigned size, causing this value to be inherited.
+
+### `style`
+
+```python
+style
+```
+
+A member of the `XlMarkerStyle` enumeration indicating the shape
+of this marker. Returns `None` if no explicit style has been set,
+which corresponds to the "Automatic" option in the PowerPoint UI.
+
+
+
+
+
+# `pptx.chart.plot`
+
+Plot-related objects.
+
+## `Area3DPlot`
+
+Bases: `_BasePlot`
+
+A 3-dimensional area plot.
+
+## `AreaPlot`
+
+Bases: `_BasePlot`
+
+An area plot.
+
+## `BarPlot`
+
+Bases: `_BasePlot`
+
+A bar chart-style plot.
+
+### `gap_width`
+
+```python
+gap_width
+```
+
+Width of gap between bar(s) of each category, as an integer
+percentage of the bar width. The default value for a new bar chart is
+150, representing 150% or 1.5 times the width of a single bar.
+
+### `overlap`
+
+```python
+overlap
+```
+
+Read/write int value in range -100..100 specifying a percentage of
+the bar width by which to overlap adjacent bars in a multi-series bar
+chart. Default is 0. A setting of -100 creates a gap of a full bar
+width and a setting of 100 causes all the bars in a category to be
+superimposed. A stacked bar plot has overlap of 100 by default.
+
+## `BubblePlot`
+
+Bases: `_BasePlot`
+
+A bubble chart plot.
+
+### `bubble_scale`
+
+```python
+bubble_scale
+```
+
+An integer between 0 and 300 inclusive indicating the percentage of
+the default size at which bubbles should be displayed. Assigning
+`None` produces the same behavior as assigning `100`.
+
+## `DoughnutPlot`
+
+Bases: `_BasePlot`
+
+An doughnut plot.
+
+## `LinePlot`
+
+Bases: `_BasePlot`
+
+A line chart-style plot.
+
+## `PiePlot`
+
+Bases: `_BasePlot`
+
+A pie chart-style plot.
+
+## `PlotFactory`
+
+```python
+PlotFactory(xChart, chart)
+```
+
+Return an instance of the appropriate subclass of _BasePlot based on the
+tagname of *xChart*.
+
+## `PlotTypeInspector`
+
+Bases: `object`
+
+"One-shot" service object that knows how to identify the type of a plot
+as a member of the XL_CHART_TYPE enumeration.
+
+### `chart_type`
+
+```python
+chart_type(plot)
+```
+
+Return the member of `XlChartType` that corresponds to the chart
+type of *plot*.
+
+## `RadarPlot`
+
+Bases: `_BasePlot`
+
+A radar-style plot.
+
+## `XyPlot`
+
+Bases: `_BasePlot`
+
+An XY (scatter) plot.
+
+
+
+
+
+# `pptx.chart.point`
+
+Data point-related objects.
+
+## `BubblePoints`
+
+Bases: `_BasePoints`
+
+Sequence providing access to the individual data points in
+a `BubbleSeries` object.
+
+## `CategoryPoints`
+
+Bases: `_BasePoints`
+
+Sequence providing access to individual `Point` objects, each
+representing the visual properties of a data point in the specified
+category series.
+
+## `Point`
+
+```python
+Point(ser, idx)
+```
+
+Bases: `object`
+
+Provides access to the properties of an individual data point in
+a series, such as the visual properties of its marker and the text and
+font of its data label.
+
+### `data_label`
+
+```python
+data_label()
+```
+
+The `DataLabel` object representing the label on this data point.
+
+### `format`
+
+```python
+format()
+```
+
+The `ChartFormat` object providing access to the shape formatting
+properties of this data point, such as line and fill.
+
+### `marker`
+
+```python
+marker()
+```
+
+The `Marker` instance for this point, providing access to the visual
+properties of the data point marker, such as fill and line. Setting
+these properties overrides any value set at the series level.
+
+## `XyPoints`
+
+Bases: `_BasePoints`
+
+Sequence providing access to the individual data points in an `XySeries`
+object.
+
+
+
+
+
+# `pptx.chart.series`
+
+Series-related objects.
+
+## `AreaSeries`
+
+Bases: `_BaseCategorySeries`
+
+A data point series belonging to an area plot.
+
+## `BarSeries`
+
+Bases: `_BaseCategorySeries`
+
+A data point series belonging to a bar plot.
+
+### `invert_if_negative`
+
+```python
+invert_if_negative
+```
+
+`True` if a point having a value less than zero should appear with a
+fill different than those with a positive value. `False` if the fill
+should be the same regardless of the bar's value. When `True`, a bar
+with a solid fill appears with white fill; in a bar with gradient
+fill, the direction of the gradient is reversed, e.g. dark -> light
+instead of light -> dark. The term "invert" here should be understood
+to mean "invert the *direction* of the *fill gradient*".
+
+## `BubbleSeries`
+
+Bases: `XySeries`
+
+A data point series belonging to a bubble plot.
+
+### `points`
+
+```python
+points()
+```
+
+The `BubblePoints` object providing access to individual data point
+objects used to discover and adjust the formatting and data labels of
+a data point.
+
+## `LineSeries`
+
+Bases: `_BaseCategorySeries`, `_MarkerMixin`
+
+A data point series belonging to a line plot.
+
+### `smooth`
+
+```python
+smooth
+```
+
+Read/write boolean specifying whether to use curve smoothing to
+form the line connecting the data points in this series into
+a continuous curve. If `False`, a series of straight line segments
+are used to connect the points.
+
+## `PieSeries`
+
+Bases: `_BaseCategorySeries`
+
+A data point series belonging to a pie plot.
+
+## `RadarSeries`
+
+Bases: `_BaseCategorySeries`, `_MarkerMixin`
+
+A data point series belonging to a radar plot.
+
+## `SeriesCollection`
+
+```python
+SeriesCollection(parent_elm)
+```
+
+Bases: `Sequence`
+
+A sequence of `Series` objects.
+
+## `XySeries`
+
+Bases: `_BaseSeries`, `_MarkerMixin`
+
+A data point series belonging to an XY (scatter) plot.
+
+### `iter_values`
+
+```python
+iter_values()
+```
+
+Generate each float Y value in this series, in the order they appear
+on the chart. A value of `None` represents a missing Y value
+(corresponding to a blank Excel cell).
+
+### `points`
+
+```python
+points()
+```
+
+The `XyPoints` object providing access to individual data points in
+this series.
+
+### `values`
+
+```python
+values
+```
+
+Read-only. A sequence containing the float values for this series, in
+the order they appear on the chart.
+
+
+
+
+
+# `pptx.chart.xlsx`
+
+Chart builder and related objects.
+
+## `BubbleWorkbookWriter`
+
+Bases: `XyWorkbookWriter`
+
+Service object that knows how to write an Excel workbook from bubble
+chart data.
+
+### `bubble_sizes_ref`
+
+```python
+bubble_sizes_ref(series)
+```
+
+The Excel worksheet reference to the range containing the bubble
+sizes for *series* (not including the column heading cell).
+
+## `CategoryWorkbookWriter`
+
+Bases: `_BaseWorkbookWriter`
+
+Determines Excel worksheet layout and can write an Excel workbook from
+a CategoryChartData object. Serves as the authority for Excel worksheet
+ranges.
+
+### `categories_ref`
+
+```python
+categories_ref
+```
+
+The Excel worksheet reference to the categories for this chart (not
+including the column heading).
+
+### `series_name_ref`
+
+```python
+series_name_ref(series)
+```
+
+Return the Excel worksheet reference to the cell containing the name
+for *series*. This also serves as the column heading for the series
+values.
+
+### `values_ref`
+
+```python
+values_ref(series)
+```
+
+The Excel worksheet reference to the values for this series (not
+including the column heading).
+
+## `XyWorkbookWriter`
+
+Bases: `_BaseWorkbookWriter`
+
+Determines Excel worksheet layout and can write an Excel workbook from XY
+chart data. Serves as the authority for Excel worksheet ranges.
+
+### `series_name_ref`
+
+```python
+series_name_ref(series)
+```
+
+Return the Excel worksheet reference to the cell containing the name
+for *series*. This also serves as the column heading for the series
+Y values.
+
+### `series_table_row_offset`
+
+```python
+series_table_row_offset(series)
+```
+
+Return the number of rows preceding the data table for *series* in
+the Excel worksheet.
+
+### `x_values_ref`
+
+```python
+x_values_ref(series)
+```
+
+The Excel worksheet reference to the X values for this chart (not
+including the column label).
+
+### `y_values_ref`
+
+```python
+y_values_ref(series)
+```
+
+The Excel worksheet reference to the Y values for this chart (not
+including the column label).
+
+
+
+
+
+# `pptx.chart.xmlwriter`
+
+Composers for default chart XML for various chart types.
+
+## `ChartXmlWriter`
+
+```python
+ChartXmlWriter(chart_type, chart_data)
+```
+
+Factory function returning appropriate XML writer object for
+*chart_type*, loaded with *chart_type* and *chart_data*.
+
+## `SeriesXmlRewriterFactory`
+
+```python
+SeriesXmlRewriterFactory(chart_type, chart_data)
+```
+
+Return a `_BaseSeriesXmlRewriter` subclass appropriate to *chart_type*.
+
+
+
+
+
+# `pptx.compose`
+
+Cross-presentation slide import and deck merge (paper-pptx addition).
+
+## `ImportReport`
+
+```python
+ImportReport(mode: str, source_slide: str, dest_slide: str, dest_slide_id: int, position: int, layout_binding: str, layout_binding_method: str, placeholder_map_used: Tuple[Tuple[int, Optional[int]], ...], parts_added: Tuple[str, ...], parts_reused: Tuple[str, ...], notes_copied: bool, comments_dropped: int, section: Optional[str], section_id: Optional[str], baked_shapes: Tuple[str, ...], dropped_placeholders: Tuple[str, ...], run_shifts: tuple) -> None
+```
+
+What one import did. Deterministic; `.to_dict()` is goldenable.
+
+Fields:
+
+* ``mode`` -- the reconciliation mode used ("adopt_theme", "keep_appearance", "bake").
+* ``source_slide`` -- partname of the imported slide in the source presentation.
+* ``dest_slide`` / ``dest_slide_id`` -- partname and permanent slide id of the new
+ slide in the destination.
+* ``position`` -- 0-based index the new slide was inserted at.
+* ``layout_binding`` -- partname of the destination layout the slide is bound to.
+* ``layout_binding_method`` -- how that layout was chosen ("name-match",
+ "type-match", "explicit", "transplant", or "blank-fallback"). Automatic
+ methods always identify a unique candidate at their matching tier.
+* ``placeholder_map_used`` -- the complete resolved ``(source_idx, target_idx)``
+ mapping for adopt-theme reconciliation; ``target_idx`` is ``None`` for an
+ orphan. Empty for keep-appearance and bake.
+* ``parts_added`` -- partnames added to the destination package by this import.
+* ``parts_reused`` -- partnames of existing destination parts reused via
+ content-hash deduplication (keep_appearance).
+* ``notes_copied`` -- whether the source slide's speaker-notes part was imported.
+* ``comments_dropped`` -- count of comment parts dropped (comments never travel).
+* ``section`` / ``section_id`` -- name and exact GUID of the destination section the
+ slide was enrolled in, or None when it was not enrolled in a section.
+* ``baked_shapes`` -- names of placeholders converted to free baked shapes.
+* ``dropped_placeholders`` -- names of furniture placeholders (dt/ftr/sldNum)
+ removed under "bake".
+* ``run_shifts`` -- `pptx.rebind.RunShift` entries for every run whose
+ resolved appearance changed (populated for "adopt_theme"; empty for
+ keep_appearance).
+
+### `baked_shapes`
+
+```python
+baked_shapes: Tuple[str, ...]
+```
+
+### `comments_dropped`
+
+```python
+comments_dropped: int
+```
+
+### `dest_slide`
+
+```python
+dest_slide: str
+```
+
+### `dest_slide_id`
+
+```python
+dest_slide_id: int
+```
+
+### `dropped_placeholders`
+
+```python
+dropped_placeholders: Tuple[str, ...]
+```
+
+### `layout_binding`
+
+```python
+layout_binding: str
+```
+
+### `layout_binding_method`
+
+```python
+layout_binding_method: str
+```
+
+### `mode`
+
+```python
+mode: str
+```
+
+### `notes_copied`
+
+```python
+notes_copied: bool
+```
+
+### `parts_added`
+
+```python
+parts_added: Tuple[str, ...]
+```
+
+### `parts_reused`
+
+```python
+parts_reused: Tuple[str, ...]
+```
+
+### `placeholder_map_used`
+
+```python
+placeholder_map_used: Tuple[Tuple[int, Optional[int]], ...]
+```
+
+### `position`
+
+```python
+position: int
+```
+
+### `run_shifts`
+
+```python
+run_shifts: tuple
+```
+
+### `section`
+
+```python
+section: Optional[str]
+```
+
+### `section_id`
+
+```python
+section_id: Optional[str]
+```
+
+### `source_slide`
+
+```python
+source_slide: str
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+Return the import report as a JSON-ready dict stamped with its schema and version.
+
+## `PackageTransaction`
+
+```python
+PackageTransaction(package: 'OpcPackage', *roots: object)
+```
+
+Restore a package's original live graph if the guarded operation raises.
+
+Prepare a rollback boundary over `package`, tracking the proxies passed as `roots`.
+
+Validates the relationship graph immediately, so a malformed relationship or a signature
+part refuses here rather than on entry. Nothing is snapshotted until `__enter__`, so the
+instance can be built well before the mutation site.
+
+## `SCHEMA_NAME`
+
+```python
+SCHEMA_NAME = 'paper-import-report'
+```
+
+## `SCHEMA_VERSION`
+
+```python
+SCHEMA_VERSION = 3
+```
+
+## `append_deck`
+
+```python
+append_deck(dest_prs: 'Presentation', source_prs: 'Presentation', *, mode: str, notes: bool = True) -> 'Tuple[ImportReport, ...]'
+```
+
+Import every `source_prs` slide, in order, at the end of `dest_prs`.
+
+The COMPLETE source deck validates before the first destination write: a refusal on
+any source slide leaves the destination untouched.
+
+## `import_slide`
+
+```python
+import_slide(dest_prs: 'Presentation', source_prs: 'Presentation', slide: 'Presentation', *, mode: str, position: 'Optional[int]' = None, notes: bool = True, section: 'Optional[str]' = None, section_id: 'Optional[str]' = None, target_layout: 'Optional[SlideLayout]' = None, placeholder_map: 'Optional[SlideLayout]' = 'auto') -> ImportReport
+```
+
+Import one slide from `source_prs` into `dest_prs`; return the `ImportReport`.
+
+
+
+
+
+# `pptx.diff`
+
+Deck diff - the verification mirror (paper-pptx addition).
+
+## `BulletShift`
+
+```python
+BulletShift(part: str, shape: ShapeRef, before_location: dict, after_location: dict, text: str, before: dict, after: dict) -> None
+```
+
+One paragraph whose resolved bullet changed between the two decks.
+
+Bullets live only in formatting, so a list losing its bullets changes no text and no
+field marker: `text_changes` stays empty while the slide visibly loses every glyph.
+This is the facet that reports it.
+
+Paragraphs qualify only when their exact text-and-field value is unique on both sides
+and lies in the canonical unchanged prefix or suffix. Repeated or changed-region
+paragraphs are skipped rather than paired by position.
+
+Fields:
+
+* ``part`` -- partname of the slide the paragraph lives on.
+* ``shape`` -- stable shape identity plus current display name.
+* ``before_location`` / ``after_location`` -- container-local paragraph locations.
+* ``text`` -- the unchanged paragraph's literal text.
+* ``before`` / ``after`` -- the resolved ``bullet``, ``bullet_font`` and ``bullet_size``
+ payloads from `pptx.inspect.effective_paragraph_format` on each side.
+
+### `after`
+
+```python
+after: dict
+```
+
+### `after_location`
+
+```python
+after_location: dict
+```
+
+### `before`
+
+```python
+before: dict
+```
+
+### `before_location`
+
+```python
+before_location: dict
+```
+
+### `part`
+
+```python
+part: str
+```
+
+### `shape`
+
+```python
+shape: ShapeRef
+```
+
+### `text`
+
+```python
+text: str
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+Return this bullet change as a JSON-ready dict, before and after values included.
+
+## `DeckDiff`
+
+```python
+DeckDiff(detail: str, slides_added: Tuple[SlideRef, ...] = (), slides_removed: Tuple[SlideRef, ...] = (), slides_moved: Tuple[MovedSlide, ...] = (), slide_changes: Tuple[SlideChange, ...] = tuple(), package_changes: tuple = tuple()) -> None
+```
+
+The whole comparison. `.to_dict()` is deterministic and goldenable.
+
+### `detail`
+
+```python
+detail: str
+```
+
+### `is_empty`
+
+```python
+is_empty: bool
+```
+
+True when the two decks match. Check it to skip reporting a no-op edit.
+
+### `package_changes`
+
+```python
+package_changes: tuple = field(default_factory=tuple)
+```
+
+### `slide_changes`
+
+```python
+slide_changes: Tuple[SlideChange, ...] = field(default_factory=tuple)
+```
+
+### `slides_added`
+
+```python
+slides_added: Tuple[SlideRef, ...] = ()
+```
+
+### `slides_moved`
+
+```python
+slides_moved: Tuple[MovedSlide, ...] = ()
+```
+
+### `slides_removed`
+
+```python
+slides_removed: Tuple[SlideRef, ...] = ()
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+Return the whole diff as a JSON-ready dict stamped with its schema and version.
+
+## `EffectiveShift`
+
+```python
+EffectiveShift(part: str, shape: ShapeRef, before_location: dict, after_location: dict, before_run_index: int, after_run_index: int, text: str, before: dict, after: dict) -> None
+```
+
+One uniquely matched run in a unique unchanged paragraph whose resolved font changed.
+
+### `after`
+
+```python
+after: dict
+```
+
+### `after_location`
+
+```python
+after_location: dict
+```
+
+### `after_run_index`
+
+```python
+after_run_index: int
+```
+
+### `before`
+
+```python
+before: dict
+```
+
+### `before_location`
+
+```python
+before_location: dict
+```
+
+### `before_run_index`
+
+```python
+before_run_index: int
+```
+
+### `part`
+
+```python
+part: str
+```
+
+### `shape`
+
+```python
+shape: ShapeRef
+```
+
+### `text`
+
+```python
+text: str
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+Return this location-aware shift as a JSON-ready dictionary.
+
+## `MovedSlide`
+
+```python
+MovedSlide(slide_id: int, from_position: int, to_position: int) -> None
+```
+
+A slide that kept its identity and changed position.
+
+### `from_position`
+
+```python
+from_position: int
+```
+
+### `slide_id`
+
+```python
+slide_id: int
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+Return this move as a JSON-ready dict.
+
+### `to_position`
+
+```python
+to_position: int
+```
+
+## `SCHEMA_NAME`
+
+```python
+SCHEMA_NAME = 'paper-deck-diff'
+```
+
+## `SCHEMA_VERSION`
+
+```python
+SCHEMA_VERSION = 5
+```
+
+## `ShapeRef`
+
+```python
+ShapeRef(shape_id: int, name: str) -> None
+```
+
+Identifies a slide-scoped shape by stable id and display name.
+
+### `name`
+
+```python
+name: str
+```
+
+### `shape_id`
+
+```python
+shape_id: int
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+Return this shape reference as a JSON-ready dict.
+
+## `SlideChange`
+
+```python
+SlideChange(slide_id: int, shapes_added: Tuple[ShapeRef, ...] = (), shapes_removed: Tuple[ShapeRef, ...] = (), geometry_changes: Tuple[dict, ...] = (), images_replaced: Tuple[ShapeRef, ...] = (), chart_data_changes: Tuple[dict, ...] = (), table_structure_changes: Tuple[dict, ...] = (), text_changes: Tuple[dict, ...] = (), notes_change: Optional[dict] = None, effective_shifts: tuple = (), bullet_shifts: tuple = ()) -> None
+```
+
+Within-slide deltas for one id-matched slide pair. Empty facets are omitted
+from the payload, so an all-empty change never appears in `slide_changes`.
+
+### `bullet_shifts`
+
+```python
+bullet_shifts: tuple = ()
+```
+
+### `chart_data_changes`
+
+```python
+chart_data_changes: Tuple[dict, ...] = ()
+```
+
+### `effective_shifts`
+
+```python
+effective_shifts: tuple = ()
+```
+
+### `geometry_changes`
+
+```python
+geometry_changes: Tuple[dict, ...] = ()
+```
+
+### `images_replaced`
+
+```python
+images_replaced: Tuple[ShapeRef, ...] = ()
+```
+
+### `is_empty`
+
+```python
+is_empty: bool
+```
+
+True when nothing on this slide changed. Check it before adding the slide to a report.
+
+### `notes_change`
+
+```python
+notes_change: Optional[dict] = None
+```
+
+### `shapes_added`
+
+```python
+shapes_added: Tuple[ShapeRef, ...] = ()
+```
+
+### `shapes_removed`
+
+```python
+shapes_removed: Tuple[ShapeRef, ...] = ()
+```
+
+### `slide_id`
+
+```python
+slide_id: int
+```
+
+### `table_structure_changes`
+
+```python
+table_structure_changes: Tuple[dict, ...] = ()
+```
+
+### `text_changes`
+
+```python
+text_changes: Tuple[dict, ...] = ()
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+Return this slide's changes as a JSON-ready dict, omitting the categories that are empty.
+
+## `SlideRef`
+
+```python
+SlideRef(slide_id: int, position: int, title: Optional[str]) -> None
+```
+
+Identifies a slide by id, position, and title.
+
+### `position`
+
+```python
+position: int
+```
+
+### `slide_id`
+
+```python
+slide_id: int
+```
+
+### `title`
+
+```python
+title: Optional[str]
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+Return this slide reference as a JSON-ready dict.
+
+## `diff_decks`
+
+```python
+diff_decks(path_a, path_b, *, detail: str = 'structure') -> DeckDiff
+```
+
+Compare two decks; return the typed `DeckDiff`.
+
+`path_a`/`path_b` accept a file path, a file-like object, or an already-open
+`Presentation`. `detail`: "structure" (slide add/remove/move, shape add/remove,
+geometry, image replacement, table-grid deltas), "text" (+ exact paragraph deltas,
+chart data per series/category, notes), "full" (+ per-run effective-value shifts via
+the resolver - expensive on large decks, deliberately opt-in).
+
+When either side is an open `Presentation`, both sides are normalized by serializing
+before the package-level comparison, because a live presentation has no on-disk package
+to read; when both sides are a path or a file-like object, the packages are compared
+exactly.
+
+Matching is by permanent slide id and, within matched slides, top-level shapes match by
+slide-wide shape id and compatible structural kind. Display names are labels only. Moving a
+shape across a group boundary remains a top-level removal or addition. Independently built
+decks can reuse ids and are outside this contract. A deleted shape id reused by a new
+same-kind shape is likewise indistinguishable without a persistent identifier not present in
+general PPTX files. Slide ids allocate as max+1, so deleting the highest-id slide and then
+adding a new one RECYCLES the id, and this diff will read that delete-plus-add as one edited
+slide - order add-before-delete when producing lineage decks you intend to diff.
+
+Within each stable leaf-shape or table-frame container, paragraphs are ordered snapshot values
+consisting of raw literal text plus positioned field markers. The longest exact prefix is
+consumed first, followed by the longest non-overlapping exact suffix. The remaining middle is
+one ``insertion``, ``deletion``, one-paragraph ``replacement``, or ``changed_region`` event.
+Each event contains zero-based half-open ``before_range``/``after_range`` values and array-
+valued ``before``/``after`` block evidence; every block carries its structured location, raw
+text, and positioned fields. Duplicate values follow the prefix-first rule, which is a
+deterministic endpoint representation rather than the historical edit location. Paragraph
+moves and ambiguous identity are not inferred.
+
+An unmatched text-bearing container produces one whole-container insertion or deletion event
+and is never paired with another unmatched container.
+
+Table dimensions are structural changes without inferred row/column insertion history.
+At ``detail="full"``, effective-font and bullet shifts are limited to container-unique,
+unchanged prefix/suffix paragraphs and exact unique run identities. Speaker notes remain one
+flat comparison, while table-cell effective formatting and bullets remain outside the
+supported resolver domain. ``package_changes`` remains the authoritative fallback for every
+semantic package change not represented by a specialized facet.
+
+
+
+
+
+# `pptx.dml.chtfmt`
+
+`ChartFormat` and related objects.
+
+## `ChartFormat`
+
+Bases: `ElementProxy`
+
+The `ChartFormat` object provides access to visual shape properties for
+chart elements like `Axis`, `Series`, and `MajorGridlines`. It has two
+properties, `fill` and `line`, which return a `FillFormat`
+and `LineFormat` object respectively. The `ChartFormat` object is
+provided by the `format` property on the target axis, series, etc.
+
+### `fill`
+
+```python
+fill()
+```
+
+`FillFormat` instance for this object, providing access to fill
+properties such as fill color.
+
+### `line`
+
+```python
+line()
+```
+
+The `LineFormat` object providing access to the visual properties of
+this object, such as line color and line style.
+
+
+
+
+
+# `pptx.dml.color`
+
+DrawingML objects related to color, ColorFormat being the most prominent.
+
+## `ColorFormat`
+
+```python
+ColorFormat(eg_colorChoice_parent, color)
+```
+
+Bases: `object`
+
+Provides access to color settings such as RGB color, theme color, and
+luminance adjustments.
+
+### `brightness`
+
+```python
+brightness
+```
+
+Read/write float value between -1.0 and 1.0 indicating the brightness
+adjustment for this color, e.g. -0.25 is 25% darker and 0.4 is 40%
+lighter. 0 means no brightness adjustment.
+
+### `from_colorchoice_parent`
+
+```python
+from_colorchoice_parent(eg_colorChoice_parent)
+```
+
+### `rgb`
+
+```python
+rgb
+```
+
+`RGBColor` value of this color, or None if no RGB color is explicitly
+defined for this font. Setting this value to an `RGBColor` instance
+causes its type to change to MSO_COLOR_TYPE.RGB. If the color was a
+theme color with a brightness adjustment, the brightness adjustment
+is removed when changing it to an RGB color.
+
+### `theme_color`
+
+```python
+theme_color
+```
+
+Theme color value of this color.
+
+Value is a member of `MsoThemeColorIndex`, e.g.
+``MSO_THEME_COLOR.ACCENT_1``. Raises AttributeError on access if the
+color is not type ``MSO_COLOR_TYPE.SCHEME``. Assigning a member of
+`MsoThemeColorIndex` causes the color's type to change to
+``MSO_COLOR_TYPE.SCHEME``.
+
+### `type`
+
+```python
+type
+```
+
+Read-only. A value from `MsoColorType`, either RGB or SCHEME,
+corresponding to the way this color is defined, or None if no color
+is defined at the level of this font.
+
+## `RGBColor`
+
+Bases: `tuple`
+
+Immutable value object defining a particular RGB color.
+
+### `from_string`
+
+```python
+from_string(rgb_hex_str)
+```
+
+Return a new instance from an RGB color hex string like ``'3C2F80'``.
+
+
+
+
+
+# `pptx.dml.effect`
+
+Visual effects on a shape such as shadow, glow, and reflection.
+
+## `ShadowFormat`
+
+```python
+ShadowFormat(spPr)
+```
+
+Bases: `object`
+
+Provides access to shadow effect on a shape.
+
+### `inherit`
+
+```python
+inherit
+```
+
+True if shape inherits shadow settings.
+
+Read/write. An explicitly-defined shadow setting on a shape causes
+this property to return `False`. A shape with no explicitly-defined
+shadow setting inherits its shadow settings from the style hierarchy
+(and so returns `True`).
+
+Assigning `True` causes any explicitly-defined shadow setting to be
+removed and inheritance is restored. Note this has the side-effect of
+removing **all** explicitly-defined effects, such as glow and
+reflection, and restoring inheritance for all effects on the shape.
+Assigning `False` causes the inheritance link to be broken and **no**
+effects to appear on the shape.
+
+
+
+
+
+# `pptx.dml.fill`
+
+DrawingML objects related to fill.
+
+## `FillFormat`
+
+```python
+FillFormat(eg_fill_properties_parent: BaseOxmlElement, fill_obj: _Fill)
+```
+
+Bases: `object`
+
+Provides access to the current fill properties.
+
+Also provides methods to change the fill type.
+
+### `back_color`
+
+```python
+back_color
+```
+
+Return a `ColorFormat` object representing background color.
+
+This property is only applicable to pattern fills and lines.
+
+### `background`
+
+```python
+background()
+```
+
+Sets the fill type to noFill, i.e. transparent.
+
+### `fore_color`
+
+```python
+fore_color
+```
+
+Return a `ColorFormat` instance representing the foreground color of
+this fill.
+
+### `from_fill_parent`
+
+```python
+from_fill_parent(eg_fillProperties_parent: BaseOxmlElement) -> FillFormat
+```
+
+Return a `FillFormat` instance initialized to the settings contained
+in *eg_fillProperties_parent*, which must be an element having
+EG_FillProperties in its child element sequence in the XML schema.
+
+### `gradient`
+
+```python
+gradient()
+```
+
+Sets the fill type to gradient.
+
+If the fill is not already a gradient, a default gradient is added.
+The default gradient corresponds to the default in the built-in
+PowerPoint "White" template. This gradient is linear at angle
+90-degrees (upward), with two stops. The first stop is Accent-1 with
+tint 100%, shade 100%, and satMod 130%. The second stop is Accent-1
+with tint 50%, shade 100%, and satMod 350%.
+
+### `gradient_angle`
+
+```python
+gradient_angle
+```
+
+Angle in float degrees of line of a linear gradient.
+
+Read/Write. May be `None`, indicating the angle should be inherited
+from the style hierarchy. An angle of 0.0 corresponds to
+a left-to-right gradient. Increasing angles represent
+counter-clockwise rotation of the line, for example 90.0 represents
+a bottom-to-top gradient. Raises `TypeError` when the fill type is
+not MSO_FILL_TYPE.GRADIENT. Raises `ValueError` for a non-linear
+gradient (e.g. a radial gradient).
+
+### `gradient_stops`
+
+```python
+gradient_stops
+```
+
+`GradientStops` object providing access to stops of this gradient.
+
+Raises `TypeError` when fill is not gradient (call `fill.gradient()`
+first). Each stop represents a color between which the gradient
+smoothly transitions.
+
+### `pattern`
+
+```python
+pattern
+```
+
+Return member of `MsoPatternType` indicating fill pattern.
+
+Raises `TypeError` when fill is not patterned (call
+`fill.patterned()` first). Returns `None` if no pattern has been set;
+PowerPoint may display the default `PERCENT_5` pattern in this case.
+Assigning `None` will remove any explicit pattern setting, although
+relying on the default behavior is discouraged and may produce
+rendering differences across client applications.
+
+### `patterned`
+
+```python
+patterned()
+```
+
+Selects the pattern fill type.
+
+Note that calling this method does not by itself set a foreground or
+background color of the pattern. Rather it enables subsequent
+assignments to properties like fore_color to set the pattern and
+colors.
+
+### `solid`
+
+```python
+solid()
+```
+
+Sets the fill type to solid, i.e. a solid color. Note that calling
+this method does not set a color or by itself cause the shape to
+appear with a solid color fill; rather it enables subsequent
+assignments to properties like fore_color to set the color.
+
+### `type`
+
+```python
+type: MSO_FILL_TYPE
+```
+
+The type of this fill, e.g. `MSO_FILL_TYPE.SOLID`.
+
+
+
+
+
+# `pptx.dml.line`
+
+DrawingML objects related to line formatting.
+
+## `LineFormat`
+
+```python
+LineFormat(parent)
+```
+
+Bases: `object`
+
+Provides access to line properties such as color, style, and width.
+
+A LineFormat object is typically accessed via the ``.line`` property of
+a shape such as `Shape` or `Picture`.
+
+### `color`
+
+```python
+color()
+```
+
+The `ColorFormat` instance that provides access to the color settings
+for this line. Essentially a shortcut for ``line.fill.fore_color``.
+As a side-effect, accessing this property causes the line fill type
+to be set to ``MSO_FILL.SOLID``. If this sounds risky for your use
+case, use ``line.fill.type`` to non-destructively discover the
+existing fill type.
+
+### `dash_style`
+
+```python
+dash_style
+```
+
+Return value indicating line style.
+
+Returns a member of `MsoLineDashStyle` indicating line style, or
+`None` if no explicit value has been set. When no explicit value has
+been set, the line dash style is inherited from the style hierarchy.
+
+Assigning `None` removes any existing explicitly-defined dash style.
+
+### `fill`
+
+```python
+fill()
+```
+
+`FillFormat` instance for this line, providing access to fill
+properties such as foreground color.
+
+### `width`
+
+```python
+width
+```
+
+The width of the line expressed as an integer number of `English
+Metric Units`. The returned value is an instance of `Length`,
+a value class having properties such as `.inches`, `.cm`, and `.pt`
+for converting the value into convenient units.
+
+
+
+
+
+# `pptx.edit`
+
+Structural-anchor write APIs: formatting-preserving text replacement (paper-pptx addition).
+
+## `RESULT_SCHEMA_NAME`
+
+```python
+RESULT_SCHEMA_NAME = 'paper-replace-result'
+```
+
+## `RESULT_SCHEMA_VERSION`
+
+```python
+RESULT_SCHEMA_VERSION = 2
+```
+
+## `ReplaceResult`
+
+```python
+ReplaceResult(replacements: int, blocks: Tuple[BlockAnchor, ...] = tuple()) -> None
+```
+
+Outcome of a text replacement.
+
+Fields:
+
+* ``replacements`` -- total number of occurrences replaced across the deck.
+* ``blocks`` -- POST-edit `pptx.inspect.BlockAnchor` for each block that was
+ touched (their content hashes reflect the new text).
+
+### `blocks`
+
+```python
+blocks: Tuple[BlockAnchor, ...] = field(default_factory=tuple)
+```
+
+### `replacements`
+
+```python
+replacements: int
+```
+
+### `to_dict`
+
+```python
+to_dict() -> dict
+```
+
+Return the replace result as a JSON-ready dict stamped with its schema and version.
+
+## `refind`
+
+```python
+refind(prs: 'Presentation', anchor: BlockAnchor) -> BlockAnchor
+```
+
+Return a fresh current anchor for an exact unique fingerprint match.
+
+Current anchors search only their structurally identified shape or table cell. Legacy
+three-field anchors search the whole named part by their pinned short text hash. Neither path
+uses ordinal preference, shape names, geometry, or approximate text.
+
+## `replace_text`
+
+```python
+replace_text(prs: 'Presentation', find: str, replace: str, *, include_notes: bool = False) -> ReplaceResult
+```
+
+Replace literal `find` with `replace` across `prs`; return a `ReplaceResult`.
+
+Matching is case-sensitive, left-to-right, and non-overlapping. A match may span consecutive
+text runs in one paragraph, but never a paragraph boundary or an intervening non-run element
+such as a line break or field. `find` must be a non-empty string; `replace` may be empty. Tabs
+are accepted, while line breaks, XML control characters, and non-encodable text are refused.
+
+Boundary fragments retain their original run properties, and replacement text receives the
+run properties of the run where its match starts. Untouched runs remain byte-identical. Any
+run left with no text after replacement is removed, so formatting found only on that run is
+not retained.
+
+Traversal covers slide shapes, grouped shapes, and table cells, plus existing notes slides
+when `include_notes=True`. An unsupported blind region refuses the whole operation before any
+write. Zero matches is a successful result with ``replacements == 0`` and no block anchors.
+Each returned block anchor describes the post-edit text of a block that changed.
+
+## `replace_text_at`
+
+```python
+replace_text_at(prs: 'Presentation', anchor: BlockAnchor, find: str, replace: str) -> ReplaceResult
+```
+
+Replace literal `find` in the block at `anchor`; return a `ReplaceResult`.
+
+Matching, validation, run-boundary formatting, and non-run boundaries are the same as
+`replace_text`. Current anchors resolve the exact shape or table cell first, then require
+a unique matching full fingerprint in that container. Changed content raises
+`StaleAnchorError`; missing or ambiguous structure refuses without mutation. Legacy
+three-field anchors search only for an exact unique short hash in their named part. `find`
+absent from the resolved block, or present only across a boundary a match cannot cross, raises
+`TargetNotFoundError` rather than returning a zero count.
+
+On success the result contains the number of occurrences replaced in that block and its one
+post-edit anchor.
+
+
+
+
+
+# `pptx.enum.action`
+
+Enumerations that describe click-action settings.
+
+## `PP_ACTION`
+
+```python
+PP_ACTION = PP_ACTION_TYPE
+```
+
+## `PP_ACTION_TYPE`
+
+Bases: `BaseEnum`
+
+Specifies the type of a mouse action (click or hover action).
+
+Alias: ``PP_ACTION``
+
+Example::
+
+ from pptx.enum.action import PP_ACTION
+
+ assert shape.click_action.action == PP_ACTION.HYPERLINK
+
+MS API name: `PpActionType`
+
+https://msdn.microsoft.com/EN-US/library/office/ff744895.aspx
+
+### `END_SHOW`
+
+```python
+END_SHOW = (6, 'Slide show ends.')
+```
+
+Slide show ends.
+
+### `FIRST_SLIDE`
+
+```python
+FIRST_SLIDE = (3, 'Returns to the first slide.')
+```
+
+Returns to the first slide.
+
+### `HYPERLINK`
+
+```python
+HYPERLINK = (7, 'Hyperlink.')
+```
+
+Hyperlink.
+
+### `LAST_SLIDE`
+
+```python
+LAST_SLIDE = (4, 'Moves to the last slide.')
+```
+
+Moves to the last slide.
+
+### `LAST_SLIDE_VIEWED`
+
+```python
+LAST_SLIDE_VIEWED = (5, 'Moves to the last slide viewed.')
+```
+
+Moves to the last slide viewed.
+
+### `NAMED_SLIDE`
+
+```python
+NAMED_SLIDE = (101, 'Moves to slide specified by slide number.')
+```
+
+Moves to slide specified by slide number.
+
+### `NAMED_SLIDE_SHOW`
+
+```python
+NAMED_SLIDE_SHOW = (10, 'Runs the slideshow.')
+```
+
+Runs the slideshow.
+
+### `NEXT_SLIDE`
+
+```python
+NEXT_SLIDE = (1, 'Moves to the next slide.')
+```
+
+Moves to the next slide.
+
+### `NONE`
+
+```python
+NONE = (0, 'No action is performed.')
+```
+
+No action is performed.
+
+### `OLE_VERB`
+
+```python
+OLE_VERB = (11, 'OLE Verb.')
+```
+
+OLE Verb.
+
+### `OPEN_FILE`
+
+```python
+OPEN_FILE = (102, 'Opens the specified file.')
+```
+
+Opens the specified file.
+
+### `PLAY`
+
+```python
+PLAY = (12, 'Begins the slideshow.')
+```
+
+Begins the slideshow.
+
+### `PREVIOUS_SLIDE`
+
+```python
+PREVIOUS_SLIDE = (2, 'Moves to the previous slide.')
+```
+
+Moves to the previous slide.
+
+### `RUN_MACRO`
+
+```python
+RUN_MACRO = (8, 'Runs a macro.')
+```
+
+Runs a macro.
+
+### `RUN_PROGRAM`
+
+```python
+RUN_PROGRAM = (9, 'Runs a program.')
+```
+
+Runs a program.
+
+
+
+
+
+# `pptx.enum.base`
+
+Base classes and other objects used by enumerations.
+
+## `BaseEnum`
+
+Bases: `int`, `Enum`
+
+Base class for Enums that do not map XML attr values.
+
+The enum's value will be an integer, corresponding to the integer assigned the
+corresponding member in the MS API enum of the same name.
+
+## `BaseXmlEnum`
+
+Bases: `int`, `Enum`
+
+Base class for Enums that also map XML attr values.
+
+The enum's value will be an integer, corresponding to the integer assigned the
+corresponding member in the MS API enum of the same name.
+
+### `from_xml`
+
+```python
+from_xml(xml_value: str) -> Self
+```
+
+Enumeration member corresponding to XML attribute value `xml_value`.
+
+Raises `ValueError` if `xml_value` is the empty string ("") or is not an XML attribute
+value registered on the enumeration. Note that enum members that do not correspond to one
+of the defined values for an XML attribute have `xml_value == ""`. These
+"return-value only" members cannot be automatically mapped from an XML attribute value and
+must be selected explicitly by code, based on the appropriate conditions.
+
+Example::
+
+ >>> WD_PARAGRAPH_ALIGNMENT.from_xml("center")
+ WD_PARAGRAPH_ALIGNMENT.CENTER
+
+### `to_xml`
+
+```python
+to_xml(value: int | _T) -> str
+```
+
+XML value of this enum member, generally an XML attribute value.
+
+### `validate`
+
+```python
+validate(value: _T)
+```
+
+Raise `ValueError` if `value` is not an assignable value.
+
+### `xml_value`
+
+```python
+xml_value: str | None
+```
+
+## `DocsPageFormatter`
+
+```python
+DocsPageFormatter(clsname: str, clsdict: dict[str, Any])
+```
+
+Bases: `object`
+
+Formats a reStructuredText documention page (string) for an enumeration.
+
+### `page_str`
+
+```python
+page_str
+```
+
+The RestructuredText documentation page for the enumeration. This is
+the only API member for the class.
+
+
+
+
+
+# `pptx.enum.chart`
+
+Enumerations used by charts and related objects.
+
+## `XL_AXIS_CROSSES`
+
+Bases: `BaseXmlEnum`
+
+Specifies the point on an axis where the other axis crosses.
+
+Example::
+
+ from pptx.enum.chart import XL_AXIS_CROSSES
+
+ value_axis.crosses = XL_AXIS_CROSSES.MAXIMUM
+
+MS API Name: `XlAxisCrosses`
+
+https://msdn.microsoft.com/en-us/library/office/ff745402.aspx
+
+### `AUTOMATIC`
+
+```python
+AUTOMATIC = (-4105, 'autoZero', 'The axis crossing point is set automatically, often at zero.')
+```
+
+The axis crossing point is set automatically, often at zero.
+
+### `CUSTOM`
+
+```python
+CUSTOM = (-4114, '', 'The .crosses_at property specifies the axis crossing point.')
+```
+
+The .crosses_at property specifies the axis crossing point.
+
+### `MAXIMUM`
+
+```python
+MAXIMUM = (2, 'max', 'The axis crosses at the maximum value.')
+```
+
+The axis crosses at the maximum value.
+
+### `MINIMUM`
+
+```python
+MINIMUM = (4, 'min', 'The axis crosses at the minimum value.')
+```
+
+The axis crosses at the minimum value.
+
+## `XL_CATEGORY_TYPE`
+
+Bases: `BaseEnum`
+
+Specifies the type of the category axis.
+
+Example::
+
+ from pptx.enum.chart import XL_CATEGORY_TYPE
+
+ date_axis = chart.category_axis
+ assert date_axis.category_type == XL_CATEGORY_TYPE.TIME_SCALE
+
+MS API Name: `XlCategoryType`
+
+https://msdn.microsoft.com/EN-US/library/office/ff746136.aspx
+
+### `AUTOMATIC_SCALE`
+
+```python
+AUTOMATIC_SCALE = (-4105, 'The application controls the axis type.')
+```
+
+The application controls the axis type.
+
+### `CATEGORY_SCALE`
+
+```python
+CATEGORY_SCALE = (2, 'Axis groups data by an arbitrary set of categories')
+```
+
+Axis groups data by an arbitrary set of categories
+
+### `TIME_SCALE`
+
+```python
+TIME_SCALE = (3, 'Axis groups data on a time scale of days, months, or years.')
+```
+
+Axis groups data on a time scale of days, months, or years.
+
+## `XL_CHART_TYPE`
+
+Bases: `BaseEnum`
+
+Specifies the type of a chart.
+
+Example::
+
+ from pptx.enum.chart import XL_CHART_TYPE
+
+ assert chart.chart_type == XL_CHART_TYPE.BAR_STACKED
+
+MS API Name: `XlChartType`
+
+http://msdn.microsoft.com/en-us/library/office/ff838409.aspx
+
+### `AREA`
+
+```python
+AREA = (1, 'Area')
+```
+
+Area
+
+### `AREA_STACKED`
+
+```python
+AREA_STACKED = (76, 'Stacked Area.')
+```
+
+Stacked Area.
+
+### `AREA_STACKED_100`
+
+```python
+AREA_STACKED_100 = (77, '100% Stacked Area.')
+```
+
+100% Stacked Area.
+
+### `BAR_CLUSTERED`
+
+```python
+BAR_CLUSTERED = (57, 'Clustered Bar.')
+```
+
+Clustered Bar.
+
+### `BAR_OF_PIE`
+
+```python
+BAR_OF_PIE = (71, 'Bar of Pie.')
+```
+
+Bar of Pie.
+
+### `BAR_STACKED`
+
+```python
+BAR_STACKED = (58, 'Stacked Bar.')
+```
+
+Stacked Bar.
+
+### `BAR_STACKED_100`
+
+```python
+BAR_STACKED_100 = (59, '100% Stacked Bar.')
+```
+
+100% Stacked Bar.
+
+### `BUBBLE`
+
+```python
+BUBBLE = (15, 'Bubble.')
+```
+
+Bubble.
+
+### `BUBBLE_THREE_D_EFFECT`
+
+```python
+BUBBLE_THREE_D_EFFECT = (87, 'Bubble with 3D effects.')
+```
+
+Bubble with 3D effects.
+
+### `COLUMN_CLUSTERED`
+
+```python
+COLUMN_CLUSTERED = (51, 'Clustered Column.')
+```
+
+Clustered Column.
+
+### `COLUMN_STACKED`
+
+```python
+COLUMN_STACKED = (52, 'Stacked Column.')
+```
+
+Stacked Column.
+
+### `COLUMN_STACKED_100`
+
+```python
+COLUMN_STACKED_100 = (53, '100% Stacked Column.')
+```
+
+100% Stacked Column.
+
+### `CONE_BAR_CLUSTERED`
+
+```python
+CONE_BAR_CLUSTERED = (102, 'Clustered Cone Bar.')
+```
+
+Clustered Cone Bar.
+
+### `CONE_BAR_STACKED`
+
+```python
+CONE_BAR_STACKED = (103, 'Stacked Cone Bar.')
+```
+
+Stacked Cone Bar.
+
+### `CONE_BAR_STACKED_100`
+
+```python
+CONE_BAR_STACKED_100 = (104, '100% Stacked Cone Bar.')
+```
+
+100% Stacked Cone Bar.
+
+### `CONE_COL`
+
+```python
+CONE_COL = (105, '3D Cone Column.')
+```
+
+3D Cone Column.
+
+### `CONE_COL_CLUSTERED`
+
+```python
+CONE_COL_CLUSTERED = (99, 'Clustered Cone Column.')
+```
+
+Clustered Cone Column.
+
+### `CONE_COL_STACKED`
+
+```python
+CONE_COL_STACKED = (100, 'Stacked Cone Column.')
+```
+
+Stacked Cone Column.
+
+### `CONE_COL_STACKED_100`
+
+```python
+CONE_COL_STACKED_100 = (101, '100% Stacked Cone Column.')
+```
+
+100% Stacked Cone Column.
+
+### `CYLINDER_BAR_CLUSTERED`
+
+```python
+CYLINDER_BAR_CLUSTERED = (95, 'Clustered Cylinder Bar.')
+```
+
+Clustered Cylinder Bar.
+
+### `CYLINDER_BAR_STACKED`
+
+```python
+CYLINDER_BAR_STACKED = (96, 'Stacked Cylinder Bar.')
+```
+
+Stacked Cylinder Bar.
+
+### `CYLINDER_BAR_STACKED_100`
+
+```python
+CYLINDER_BAR_STACKED_100 = (97, '100% Stacked Cylinder Bar.')
+```
+
+100% Stacked Cylinder Bar.
+
+### `CYLINDER_COL`
+
+```python
+CYLINDER_COL = (98, '3D Cylinder Column.')
+```
+
+3D Cylinder Column.
+
+### `CYLINDER_COL_CLUSTERED`
+
+```python
+CYLINDER_COL_CLUSTERED = (92, 'Clustered Cone Column.')
+```
+
+Clustered Cone Column.
+
+### `CYLINDER_COL_STACKED`
+
+```python
+CYLINDER_COL_STACKED = (93, 'Stacked Cone Column.')
+```
+
+Stacked Cone Column.
+
+### `CYLINDER_COL_STACKED_100`
+
+```python
+CYLINDER_COL_STACKED_100 = (94, '100% Stacked Cylinder Column.')
+```
+
+100% Stacked Cylinder Column.
+
+### `DOUGHNUT`
+
+```python
+DOUGHNUT = (-4120, 'Doughnut.')
+```
+
+Doughnut.
+
+### `DOUGHNUT_EXPLODED`
+
+```python
+DOUGHNUT_EXPLODED = (80, 'Exploded Doughnut.')
+```
+
+Exploded Doughnut.
+
+### `LINE`
+
+```python
+LINE = (4, 'Line.')
+```
+
+Line.
+
+### `LINE_MARKERS`
+
+```python
+LINE_MARKERS = (65, 'Line with Markers.')
+```
+
+Line with Markers.
+
+### `LINE_MARKERS_STACKED`
+
+```python
+LINE_MARKERS_STACKED = (66, 'Stacked Line with Markers.')
+```
+
+Stacked Line with Markers.
+
+### `LINE_MARKERS_STACKED_100`
+
+```python
+LINE_MARKERS_STACKED_100 = (67, '100% Stacked Line with Markers.')
+```
+
+100% Stacked Line with Markers.
+
+### `LINE_STACKED`
+
+```python
+LINE_STACKED = (63, 'Stacked Line.')
+```
+
+Stacked Line.
+
+### `LINE_STACKED_100`
+
+```python
+LINE_STACKED_100 = (64, '100% Stacked Line.')
+```
+
+100% Stacked Line.
+
+### `PIE`
+
+```python
+PIE = (5, 'Pie.')
+```
+
+Pie.
+
+### `PIE_EXPLODED`
+
+```python
+PIE_EXPLODED = (69, 'Exploded Pie.')
+```
+
+Exploded Pie.
+
+### `PIE_OF_PIE`
+
+```python
+PIE_OF_PIE = (68, 'Pie of Pie.')
+```
+
+Pie of Pie.
+
+### `PYRAMID_BAR_CLUSTERED`
+
+```python
+PYRAMID_BAR_CLUSTERED = (109, 'Clustered Pyramid Bar.')
+```
+
+Clustered Pyramid Bar.
+
+### `PYRAMID_BAR_STACKED`
+
+```python
+PYRAMID_BAR_STACKED = (110, 'Stacked Pyramid Bar.')
+```
+
+Stacked Pyramid Bar.
+
+### `PYRAMID_BAR_STACKED_100`
+
+```python
+PYRAMID_BAR_STACKED_100 = (111, '100% Stacked Pyramid Bar.')
+```
+
+100% Stacked Pyramid Bar.
+
+### `PYRAMID_COL`
+
+```python
+PYRAMID_COL = (112, '3D Pyramid Column.')
+```
+
+3D Pyramid Column.
+
+### `PYRAMID_COL_CLUSTERED`
+
+```python
+PYRAMID_COL_CLUSTERED = (106, 'Clustered Pyramid Column.')
+```
+
+Clustered Pyramid Column.
+
+### `PYRAMID_COL_STACKED`
+
+```python
+PYRAMID_COL_STACKED = (107, 'Stacked Pyramid Column.')
+```
+
+Stacked Pyramid Column.
+
+### `PYRAMID_COL_STACKED_100`
+
+```python
+PYRAMID_COL_STACKED_100 = (108, '100% Stacked Pyramid Column.')
+```
+
+100% Stacked Pyramid Column.
+
+### `RADAR`
+
+```python
+RADAR = (-4151, 'Radar.')
+```
+
+Radar.
+
+### `RADAR_FILLED`
+
+```python
+RADAR_FILLED = (82, 'Filled Radar.')
+```
+
+Filled Radar.
+
+### `RADAR_MARKERS`
+
+```python
+RADAR_MARKERS = (81, 'Radar with Data Markers.')
+```
+
+Radar with Data Markers.
+
+### `STOCK_HLC`
+
+```python
+STOCK_HLC = (88, 'High-Low-Close.')
+```
+
+High-Low-Close.
+
+### `STOCK_OHLC`
+
+```python
+STOCK_OHLC = (89, 'Open-High-Low-Close.')
+```
+
+Open-High-Low-Close.
+
+### `STOCK_VHLC`
+
+```python
+STOCK_VHLC = (90, 'Volume-High-Low-Close.')
+```
+
+Volume-High-Low-Close.
+
+### `STOCK_VOHLC`
+
+```python
+STOCK_VOHLC = (91, 'Volume-Open-High-Low-Close.')
+```
+
+Volume-Open-High-Low-Close.
+
+### `SURFACE`
+
+```python
+SURFACE = (83, '3D Surface.')
+```
+
+3D Surface.
+
+### `SURFACE_TOP_VIEW`
+
+```python
+SURFACE_TOP_VIEW = (85, 'Surface (Top View).')
+```
+
+Surface (Top View).
+
+### `SURFACE_TOP_VIEW_WIREFRAME`
+
+```python
+SURFACE_TOP_VIEW_WIREFRAME = (86, 'Surface (Top View wireframe).')
+```
+
+Surface (Top View wireframe).
+
+### `SURFACE_WIREFRAME`
+
+```python
+SURFACE_WIREFRAME = (84, '3D Surface (wireframe).')
+```
+
+3D Surface (wireframe).
+
+### `THREE_D_AREA`
+
+```python
+THREE_D_AREA = (-4098, '3D Area.')
+```
+
+3D Area.
+
+### `THREE_D_AREA_STACKED`
+
+```python
+THREE_D_AREA_STACKED = (78, '3D Stacked Area.')
+```
+
+3D Stacked Area.
+
+### `THREE_D_AREA_STACKED_100`
+
+```python
+THREE_D_AREA_STACKED_100 = (79, '100% Stacked Area.')
+```
+
+100% Stacked Area.
+
+### `THREE_D_BAR_CLUSTERED`
+
+```python
+THREE_D_BAR_CLUSTERED = (60, '3D Clustered Bar.')
+```
+
+3D Clustered Bar.
+
+### `THREE_D_BAR_STACKED`
+
+```python
+THREE_D_BAR_STACKED = (61, '3D Stacked Bar.')
+```
+
+3D Stacked Bar.
+
+### `THREE_D_BAR_STACKED_100`
+
+```python
+THREE_D_BAR_STACKED_100 = (62, '3D 100% Stacked Bar.')
+```
+
+3D 100% Stacked Bar.
+
+### `THREE_D_COLUMN`
+
+```python
+THREE_D_COLUMN = (-4100, '3D Column.')
+```
+
+3D Column.
+
+### `THREE_D_COLUMN_CLUSTERED`
+
+```python
+THREE_D_COLUMN_CLUSTERED = (54, '3D Clustered Column.')
+```
+
+3D Clustered Column.
+
+### `THREE_D_COLUMN_STACKED`
+
+```python
+THREE_D_COLUMN_STACKED = (55, '3D Stacked Column.')
+```
+
+3D Stacked Column.
+
+### `THREE_D_COLUMN_STACKED_100`
+
+```python
+THREE_D_COLUMN_STACKED_100 = (56, '3D 100% Stacked Column.')
+```
+
+3D 100% Stacked Column.
+
+### `THREE_D_LINE`
+
+```python
+THREE_D_LINE = (-4101, '3D Line.')
+```
+
+3D Line.
+
+### `THREE_D_PIE`
+
+```python
+THREE_D_PIE = (-4102, '3D Pie.')
+```
+
+3D Pie.
+
+### `THREE_D_PIE_EXPLODED`
+
+```python
+THREE_D_PIE_EXPLODED = (70, 'Exploded 3D Pie.')
+```
+
+Exploded 3D Pie.
+
+### `XY_SCATTER`
+
+```python
+XY_SCATTER = (-4169, 'Scatter.')
+```
+
+Scatter.
+
+### `XY_SCATTER_LINES`
+
+```python
+XY_SCATTER_LINES = (74, 'Scatter with Lines.')
+```
+
+Scatter with Lines.
+
+### `XY_SCATTER_LINES_NO_MARKERS`
+
+```python
+XY_SCATTER_LINES_NO_MARKERS = (75, 'Scatter with Lines and No Data Markers.')
+```
+
+Scatter with Lines and No Data Markers.
+
+### `XY_SCATTER_SMOOTH`
+
+```python
+XY_SCATTER_SMOOTH = (72, 'Scatter with Smoothed Lines.')
+```
+
+Scatter with Smoothed Lines.
+
+### `XY_SCATTER_SMOOTH_NO_MARKERS`
+
+```python
+XY_SCATTER_SMOOTH_NO_MARKERS = (73, 'Scatter with Smoothed Lines and No Data Markers.')
+```
+
+Scatter with Smoothed Lines and No Data Markers.
+
+## `XL_DATA_LABEL_POSITION`
+
+Bases: `BaseXmlEnum`
+
+Specifies where the data label is positioned.
+
+Example::
+
+ from pptx.enum.chart import XL_LABEL_POSITION
+
+ data_labels = chart.plots[0].data_labels
+ data_labels.position = XL_LABEL_POSITION.OUTSIDE_END
+
+MS API Name: `XlDataLabelPosition`
+
+http://msdn.microsoft.com/en-us/library/office/ff745082.aspx
+
+### `ABOVE`
+
+```python
+ABOVE = (0, 't', 'The data label is positioned above the data point.')
+```
+
+The data label is positioned above the data point.
+
+### `BELOW`
+
+```python
+BELOW = (1, 'b', 'The data label is positioned below the data point.')
+```
+
+The data label is positioned below the data point.
+
+### `BEST_FIT`
+
+```python
+BEST_FIT = (5, 'bestFit', 'Word sets the position of the data label.')
+```
+
+Word sets the position of the data label.
+
+### `CENTER`
+
+```python
+CENTER = (-4108, 'ctr', 'The data label is centered on the data point or inside a bar or a pie slice.')
+```
+
+The data label is centered on the data point or inside a bar or a pie slice.
+
+### `INSIDE_BASE`
+
+```python
+INSIDE_BASE = (4, 'inBase', 'The data label is positioned inside the data point at the bottom edge.')
+```
+
+The data label is positioned inside the data point at the bottom edge.
+
+### `INSIDE_END`
+
+```python
+INSIDE_END = (3, 'inEnd', 'The data label is positioned inside the data point at the top edge.')
+```
+
+The data label is positioned inside the data point at the top edge.
+
+### `LEFT`
+
+```python
+LEFT = (-4131, 'l', 'The data label is positioned to the left of the data point.')
+```
+
+The data label is positioned to the left of the data point.
+
+### `MIXED`
+
+```python
+MIXED = (6, '', 'Data labels are in multiple positions (read-only).')
+```
+
+Data labels are in multiple positions (read-only).
+
+### `OUTSIDE_END`
+
+```python
+OUTSIDE_END = (2, 'outEnd', 'The data label is positioned outside the data point at the top edge.')
+```
+
+The data label is positioned outside the data point at the top edge.
+
+### `RIGHT`
+
+```python
+RIGHT = (-4152, 'r', 'The data label is positioned to the right of the data point.')
+```
+
+The data label is positioned to the right of the data point.
+
+## `XL_LABEL_POSITION`
+
+```python
+XL_LABEL_POSITION = XL_DATA_LABEL_POSITION
+```
+
+## `XL_LEGEND_POSITION`
+
+Bases: `BaseXmlEnum`
+
+Specifies the position of the legend on a chart.
+
+Example::
+
+ from pptx.enum.chart import XL_LEGEND_POSITION
+
+ chart.has_legend = True
+ chart.legend.position = XL_LEGEND_POSITION.BOTTOM
+
+MS API Name: `XlLegendPosition`
+
+http://msdn.microsoft.com/en-us/library/office/ff745840.aspx
+
+### `BOTTOM`
+
+```python
+BOTTOM = (-4107, 'b', 'Below the chart.')
+```
+
+Below the chart.
+
+### `CORNER`
+
+```python
+CORNER = (2, 'tr', 'In the upper-right corner of the chart border.')
+```
+
+In the upper-right corner of the chart border.
+
+### `CUSTOM`
+
+```python
+CUSTOM = (-4161, '', 'A custom position (read-only).')
+```
+
+A custom position (read-only).
+
+### `LEFT`
+
+```python
+LEFT = (-4131, 'l', 'Left of the chart.')
+```
+
+Left of the chart.
+
+### `RIGHT`
+
+```python
+RIGHT = (-4152, 'r', 'Right of the chart.')
+```
+
+Right of the chart.
+
+### `TOP`
+
+```python
+TOP = (-4160, 't', 'Above the chart.')
+```
+
+Above the chart.
+
+## `XL_MARKER_STYLE`
+
+Bases: `BaseXmlEnum`
+
+Specifies the marker style for a point or series in a line, scatter, or radar chart.
+
+Example::
+
+ from pptx.enum.chart import XL_MARKER_STYLE
+
+ series.marker.style = XL_MARKER_STYLE.CIRCLE
+
+MS API Name: `XlMarkerStyle`
+
+http://msdn.microsoft.com/en-us/library/office/ff197219.aspx
+
+### `AUTOMATIC`
+
+```python
+AUTOMATIC = (-4105, 'auto', 'Automatic markers')
+```
+
+Automatic markers
+
+### `CIRCLE`
+
+```python
+CIRCLE = (8, 'circle', 'Circular markers')
+```
+
+Circular markers
+
+### `DASH`
+
+```python
+DASH = (-4115, 'dash', 'Long bar markers')
+```
+
+Long bar markers
+
+### `DIAMOND`
+
+```python
+DIAMOND = (2, 'diamond', 'Diamond-shaped markers')
+```
+
+Diamond-shaped markers
+
+### `DOT`
+
+```python
+DOT = (-4118, 'dot', 'Short bar markers')
+```
+
+Short bar markers
+
+### `NONE`
+
+```python
+NONE = (-4142, 'none', 'No markers')
+```
+
+No markers
+
+### `PICTURE`
+
+```python
+PICTURE = (-4147, 'picture', 'Picture markers')
+```
+
+Picture markers
+
+### `PLUS`
+
+```python
+PLUS = (9, 'plus', 'Square markers with a plus sign')
+```
+
+Square markers with a plus sign
+
+### `SQUARE`
+
+```python
+SQUARE = (1, 'square', 'Square markers')
+```
+
+Square markers
+
+### `STAR`
+
+```python
+STAR = (5, 'star', 'Square markers with an asterisk')
+```
+
+Square markers with an asterisk
+
+### `TRIANGLE`
+
+```python
+TRIANGLE = (3, 'triangle', 'Triangular markers')
+```
+
+Triangular markers
+
+### `X`
+
+```python
+X = (-4168, 'x', 'Square markers with an X')
+```
+
+Square markers with an X
+
+## `XL_TICK_LABEL_POSITION`
+
+Bases: `BaseXmlEnum`
+
+Specifies the position of tick-mark labels on a chart axis.
+
+Example::
+
+ from pptx.enum.chart import XL_TICK_LABEL_POSITION
+
+ category_axis = chart.category_axis
+ category_axis.tick_label_position = XL_TICK_LABEL_POSITION.LOW
+
+MS API Name: `XlTickLabelPosition`
+
+http://msdn.microsoft.com/en-us/library/office/ff822561.aspx
+
+### `HIGH`
+
+```python
+HIGH = (-4127, 'high', 'Top or right side of the chart.')
+```
+
+Top or right side of the chart.
+
+### `LOW`
+
+```python
+LOW = (-4134, 'low', 'Bottom or left side of the chart.')
+```
+
+Bottom or left side of the chart.
+
+### `NEXT_TO_AXIS`
+
+```python
+NEXT_TO_AXIS = (4, 'nextTo', 'Next to axis (where axis is not at either side of the chart).')
+```
+
+Next to axis (where axis is not at either side of the chart).
+
+### `NONE`
+
+```python
+NONE = (-4142, 'none', 'No tick labels.')
+```
+
+No tick labels.
+
+## `XL_TICK_MARK`
+
+Bases: `BaseXmlEnum`
+
+Specifies a type of axis tick for a chart.
+
+Example::
+
+ from pptx.enum.chart import XL_TICK_MARK
+
+ chart.value_axis.minor_tick_mark = XL_TICK_MARK.INSIDE
+
+MS API Name: `XlTickMark`
+
+http://msdn.microsoft.com/en-us/library/office/ff193878.aspx
+
+### `CROSS`
+
+```python
+CROSS = (4, 'cross', 'Tick mark crosses the axis')
+```
+
+Tick mark crosses the axis
+
+### `INSIDE`
+
+```python
+INSIDE = (2, 'in', 'Tick mark appears inside the axis')
+```
+
+Tick mark appears inside the axis
+
+### `NONE`
+
+```python
+NONE = (-4142, 'none', 'No tick mark')
+```
+
+No tick mark
+
+### `OUTSIDE`
+
+```python
+OUTSIDE = (3, 'out', 'Tick mark appears outside the axis')
+```
+
+Tick mark appears outside the axis
+
+
+
+
+
+# `pptx.enum.dml`
+
+Enumerations used by DrawingML objects.
+
+## `MSO_COLOR_TYPE`
+
+Bases: `BaseEnum`
+
+Specifies the color specification scheme
+
+Example::
+
+ from pptx.enum.dml import MSO_COLOR_TYPE
+
+ assert shape.fill.fore_color.type == MSO_COLOR_TYPE.SCHEME
+
+MS API Name: "MsoColorType"
+
+http://msdn.microsoft.com/en-us/library/office/ff864912(v=office.15).aspx
+
+### `HSL`
+
+```python
+HSL = (101, 'Color is specified using Hue, Saturation, and Luminosity values')
+```
+
+Color is specified using Hue, Saturation, and Luminosity values
+
+### `PRESET`
+
+```python
+PRESET = (102, 'Color is specified using a named built-in color')
+```
+
+Color is specified using a named built-in color
+
+### `RGB`
+
+```python
+RGB = (1, 'Color is specified by an `RGBColor` value.')
+```
+
+Color is specified by an `RGBColor` value.
+
+### `SCHEME`
+
+```python
+SCHEME = (2, 'Color is one of the preset theme colors')
+```
+
+Color is one of the preset theme colors
+
+### `SCRGB`
+
+```python
+SCRGB = (103, 'Color is an scRGB color, a wide color gamut RGB color space')
+```
+
+Color is an scRGB color, a wide color gamut RGB color space
+
+### `SYSTEM`
+
+```python
+SYSTEM = (104, 'Color is one specified by the operating system, such as the window background color.')
+```
+
+Color is one specified by the operating system, such as the window background color.
+
+## `MSO_FILL`
+
+```python
+MSO_FILL = MSO_FILL_TYPE
+```
+
+## `MSO_FILL_TYPE`
+
+Bases: `BaseEnum`
+
+Specifies the type of bitmap used for the fill of a shape.
+
+Alias: ``MSO_FILL``
+
+Example::
+
+ from pptx.enum.dml import MSO_FILL
+
+ assert shape.fill.type == MSO_FILL.SOLID
+
+MS API Name: `MsoFillType`
+
+http://msdn.microsoft.com/EN-US/library/office/ff861408.aspx
+
+### `BACKGROUND`
+
+```python
+BACKGROUND = (5, 'The shape is transparent, such that whatever is behind the shape shows through. Often this is the slide background, but if a visible shape is behind, that will show through.')
+```
+
+The shape is transparent, such that whatever is behind the shape shows through.
+
+Often this is the slide background, but if a visible shape is behind, that will show through.
+
+### `GRADIENT`
+
+```python
+GRADIENT = (3, 'Shape is filled with a gradient')
+```
+
+Shape is filled with a gradient
+
+### `GROUP`
+
+```python
+GROUP = (101, 'Shape is part of a group and should inherit the fill properties of the group.')
+```
+
+Shape is part of a group and should inherit the fill properties of the group.
+
+### `PATTERNED`
+
+```python
+PATTERNED = (2, 'Shape is filled with a pattern')
+```
+
+Shape is filled with a pattern
+
+### `PICTURE`
+
+```python
+PICTURE = (6, 'Shape is filled with a bitmapped image')
+```
+
+Shape is filled with a bitmapped image
+
+### `SOLID`
+
+```python
+SOLID = (1, 'Shape is filled with a solid color')
+```
+
+Shape is filled with a solid color
+
+### `TEXTURED`
+
+```python
+TEXTURED = (4, 'Shape is filled with a texture')
+```
+
+Shape is filled with a texture
+
+## `MSO_LINE`
+
+```python
+MSO_LINE = MSO_LINE_DASH_STYLE
+```
+
+## `MSO_LINE_DASH_STYLE`
+
+Bases: `BaseXmlEnum`
+
+Specifies the dash style for a line.
+
+Alias: ``MSO_LINE``
+
+Example::
+
+ from pptx.enum.dml import MSO_LINE
+
+ shape.line.dash_style = MSO_LINE.DASH_DOT_DOT
+
+MS API name: `MsoLineDashStyle`
+
+https://learn.microsoft.com/en-us/office/vba/api/Office.MsoLineDashStyle
+
+### `DASH`
+
+```python
+DASH = (4, 'dash', 'Line consists of dashes only.')
+```
+
+Line consists of dashes only.
+
+### `DASH_DOT`
+
+```python
+DASH_DOT = (5, 'dashDot', 'Line is a dash-dot pattern.')
+```
+
+Line is a dash-dot pattern.
+
+### `DASH_DOT_DOT`
+
+```python
+DASH_DOT_DOT = (6, 'lgDashDotDot', 'Line is a dash-dot-dot pattern.')
+```
+
+Line is a dash-dot-dot pattern.
+
+### `DASH_STYLE_MIXED`
+
+```python
+DASH_STYLE_MIXED = (-2, '', 'Not supported.')
+```
+
+Return value only, indicating more than one dash style applies.
+
+### `LONG_DASH`
+
+```python
+LONG_DASH = (7, 'lgDash', 'Line consists of long dashes.')
+```
+
+Line consists of long dashes.
+
+### `LONG_DASH_DOT`
+
+```python
+LONG_DASH_DOT = (8, 'lgDashDot', 'Line is a long dash-dot pattern.')
+```
+
+Line is a long dash-dot pattern.
+
+### `ROUND_DOT`
+
+```python
+ROUND_DOT = (3, 'sysDot', 'Line is made up of round dots.')
+```
+
+Line is made up of round dots.
+
+### `SOLID`
+
+```python
+SOLID = (1, 'solid', 'Line is solid.')
+```
+
+Line is solid.
+
+### `SQUARE_DOT`
+
+```python
+SQUARE_DOT = (2, 'sysDash', 'Line is made up of square dots.')
+```
+
+Line is made up of square dots.
+
+## `MSO_PATTERN`
+
+```python
+MSO_PATTERN = MSO_PATTERN_TYPE
+```
+
+## `MSO_PATTERN_TYPE`
+
+Bases: `BaseXmlEnum`
+
+Specifies the fill pattern used in a shape.
+
+Alias: ``MSO_PATTERN``
+
+Example::
+
+ from pptx.enum.dml import MSO_PATTERN
+
+ fill = shape.fill
+ fill.patterned()
+ fill.pattern = MSO_PATTERN.WAVE
+
+MS API Name: `MsoPatternType`
+
+https://learn.microsoft.com/en-us/office/vba/api/Office.MsoPatternType
+
+### `CROSS`
+
+```python
+CROSS = (51, 'cross', 'Cross')
+```
+
+Cross
+
+### `DARK_DOWNWARD_DIAGONAL`
+
+```python
+DARK_DOWNWARD_DIAGONAL = (15, 'dkDnDiag', 'Dark Downward Diagonal')
+```
+
+Dark Downward Diagonal
+
+### `DARK_HORIZONTAL`
+
+```python
+DARK_HORIZONTAL = (13, 'dkHorz', 'Dark Horizontal')
+```
+
+Dark Horizontal
+
+### `DARK_UPWARD_DIAGONAL`
+
+```python
+DARK_UPWARD_DIAGONAL = (16, 'dkUpDiag', 'Dark Upward Diagonal')
+```
+
+Dark Upward Diagonal
+
+### `DARK_VERTICAL`
+
+```python
+DARK_VERTICAL = (14, 'dkVert', 'Dark Vertical')
+```
+
+Dark Vertical
+
+### `DASHED_DOWNWARD_DIAGONAL`
+
+```python
+DASHED_DOWNWARD_DIAGONAL = (28, 'dashDnDiag', 'Dashed Downward Diagonal')
+```
+
+Dashed Downward Diagonal
+
+### `DASHED_HORIZONTAL`
+
+```python
+DASHED_HORIZONTAL = (32, 'dashHorz', 'Dashed Horizontal')
+```
+
+Dashed Horizontal
+
+### `DASHED_UPWARD_DIAGONAL`
+
+```python
+DASHED_UPWARD_DIAGONAL = (27, 'dashUpDiag', 'Dashed Upward Diagonal')
+```
+
+Dashed Upward Diagonal
+
+### `DASHED_VERTICAL`
+
+```python
+DASHED_VERTICAL = (31, 'dashVert', 'Dashed Vertical')
+```
+
+Dashed Vertical
+
+### `DIAGONAL_BRICK`
+
+```python
+DIAGONAL_BRICK = (40, 'diagBrick', 'Diagonal Brick')
+```
+
+Diagonal Brick
+
+### `DIAGONAL_CROSS`
+
+```python
+DIAGONAL_CROSS = (54, 'diagCross', 'Diagonal Cross')
+```
+
+Diagonal Cross
+
+### `DIVOT`
+
+```python
+DIVOT = (46, 'divot', 'Pattern Divot')
+```
+
+Pattern Divot
+
+### `DOTTED_DIAMOND`
+
+```python
+DOTTED_DIAMOND = (24, 'dotDmnd', 'Dotted Diamond')
+```
+
+Dotted Diamond
+
+### `DOTTED_GRID`
+
+```python
+DOTTED_GRID = (45, 'dotGrid', 'Dotted Grid')
+```
+
+Dotted Grid
+
+### `DOWNWARD_DIAGONAL`
+
+```python
+DOWNWARD_DIAGONAL = (52, 'dnDiag', 'Downward Diagonal')
+```
+
+Downward Diagonal
+
+### `ERCENT_40`
+
+```python
+ERCENT_40 = (6, 'pct40', '40% of the foreground color.')
+```
+
+40% of the foreground color.
+
+### `HORIZONTAL`
+
+```python
+HORIZONTAL = (49, 'horz', 'Horizontal')
+```
+
+Horizontal
+
+### `HORIZONTAL_BRICK`
+
+```python
+HORIZONTAL_BRICK = (35, 'horzBrick', 'Horizontal Brick')
+```
+
+Horizontal Brick
+
+### `LARGE_CHECKER_BOARD`
+
+```python
+LARGE_CHECKER_BOARD = (36, 'lgCheck', 'Large Checker Board')
+```
+
+Large Checker Board
+
+### `LARGE_CONFETTI`
+
+```python
+LARGE_CONFETTI = (33, 'lgConfetti', 'Large Confetti')
+```
+
+Large Confetti
+
+### `LARGE_GRID`
+
+```python
+LARGE_GRID = (34, 'lgGrid', 'Large Grid')
+```
+
+Large Grid
+
+### `LIGHT_DOWNWARD_DIAGONAL`
+
+```python
+LIGHT_DOWNWARD_DIAGONAL = (21, 'ltDnDiag', 'Light Downward Diagonal')
+```
+
+Light Downward Diagonal
+
+### `LIGHT_HORIZONTAL`
+
+```python
+LIGHT_HORIZONTAL = (19, 'ltHorz', 'Light Horizontal')
+```
+
+Light Horizontal
+
+### `LIGHT_UPWARD_DIAGONAL`
+
+```python
+LIGHT_UPWARD_DIAGONAL = (22, 'ltUpDiag', 'Light Upward Diagonal')
+```
+
+Light Upward Diagonal
+
+### `LIGHT_VERTICAL`
+
+```python
+LIGHT_VERTICAL = (20, 'ltVert', 'Light Vertical')
+```
+
+Light Vertical
+
+### `MIXED`
+
+```python
+MIXED = (-2, '', 'Mixed pattern (read-only).')
+```
+
+Mixed pattern (read-only).
+
+### `NARROW_HORIZONTAL`
+
+```python
+NARROW_HORIZONTAL = (30, 'narHorz', 'Narrow Horizontal')
+```
+
+Narrow Horizontal
+
+### `NARROW_VERTICAL`
+
+```python
+NARROW_VERTICAL = (29, 'narVert', 'Narrow Vertical')
+```
+
+Narrow Vertical
+
+### `OUTLINED_DIAMOND`
+
+```python
+OUTLINED_DIAMOND = (41, 'openDmnd', 'Outlined Diamond')
+```
+
+Outlined Diamond
+
+### `PERCENT_10`
+
+```python
+PERCENT_10 = (2, 'pct10', '10% of the foreground color.')
+```
+
+10% of the foreground color.
+
+### `PERCENT_20`
+
+```python
+PERCENT_20 = (3, 'pct20', '20% of the foreground color.')
+```
+
+20% of the foreground color.
+
+### `PERCENT_25`
+
+```python
+PERCENT_25 = (4, 'pct25', '25% of the foreground color.')
+```
+
+25% of the foreground color.
+
+### `PERCENT_30`
+
+```python
+PERCENT_30 = (5, 'pct30', '30% of the foreground color.')
+```
+
+30% of the foreground color.
+
+### `PERCENT_5`
+
+```python
+PERCENT_5 = (1, 'pct5', '5% of the foreground color.')
+```
+
+5% of the foreground color.
+
+### `PERCENT_50`
+
+```python
+PERCENT_50 = (7, 'pct50', '50% of the foreground color.')
+```
+
+50% of the foreground color.
+
+### `PERCENT_60`
+
+```python
+PERCENT_60 = (8, 'pct60', '60% of the foreground color.')
+```
+
+60% of the foreground color.
+
+### `PERCENT_70`
+
+```python
+PERCENT_70 = (9, 'pct70', '70% of the foreground color.')
+```
+
+70% of the foreground color.
+
+### `PERCENT_75`
+
+```python
+PERCENT_75 = (10, 'pct75', '75% of the foreground color.')
+```
+
+75% of the foreground color.
+
+### `PERCENT_80`
+
+```python
+PERCENT_80 = (11, 'pct80', '80% of the foreground color.')
+```
+
+80% of the foreground color.
+
+### `PERCENT_90`
+
+```python
+PERCENT_90 = (12, 'pct90', '90% of the foreground color.')
+```
+
+90% of the foreground color.
+
+### `PLAID`
+
+```python
+PLAID = (42, 'plaid', 'Plaid')
+```
+
+Plaid
+
+### `SHINGLE`
+
+```python
+SHINGLE = (47, 'shingle', 'Shingle')
+```
+
+Shingle
+
+### `SMALL_CHECKER_BOARD`
+
+```python
+SMALL_CHECKER_BOARD = (17, 'smCheck', 'Small Checker Board')
+```
+
+Small Checker Board
+
+### `SMALL_CONFETTI`
+
+```python
+SMALL_CONFETTI = (37, 'smConfetti', 'Small Confetti')
+```
+
+Small Confetti
+
+### `SMALL_GRID`
+
+```python
+SMALL_GRID = (23, 'smGrid', 'Small Grid')
+```
+
+Small Grid
+
+### `SOLID_DIAMOND`
+
+```python
+SOLID_DIAMOND = (39, 'solidDmnd', 'Solid Diamond')
+```
+
+Solid Diamond
+
+### `SPHERE`
+
+```python
+SPHERE = (43, 'sphere', 'Sphere')
+```
+
+Sphere
+
+### `TRELLIS`
+
+```python
+TRELLIS = (18, 'trellis', 'Trellis')
+```
+
+Trellis
+
+### `UPWARD_DIAGONAL`
+
+```python
+UPWARD_DIAGONAL = (53, 'upDiag', 'Upward Diagonal')
+```
+
+Upward Diagonal
+
+### `VERTICAL`
+
+```python
+VERTICAL = (50, 'vert', 'Vertical')
+```
+
+Vertical
+
+### `WAVE`
+
+```python
+WAVE = (48, 'wave', 'Wave')
+```
+
+Wave
+
+### `WEAVE`
+
+```python
+WEAVE = (44, 'weave', 'Weave')
+```
+
+Weave
+
+### `WIDE_DOWNWARD_DIAGONAL`
+
+```python
+WIDE_DOWNWARD_DIAGONAL = (25, 'wdDnDiag', 'Wide Downward Diagonal')
+```
+
+Wide Downward Diagonal
+
+### `WIDE_UPWARD_DIAGONAL`
+
+```python
+WIDE_UPWARD_DIAGONAL = (26, 'wdUpDiag', 'Wide Upward Diagonal')
+```
+
+Wide Upward Diagonal
+
+### `ZIG_ZAG`
+
+```python
+ZIG_ZAG = (38, 'zigZag', 'Zig Zag')
+```
+
+Zig Zag
+
+## `MSO_THEME_COLOR`
+
+```python
+MSO_THEME_COLOR = MSO_THEME_COLOR_INDEX
+```
+
+## `MSO_THEME_COLOR_INDEX`
+
+Bases: `BaseXmlEnum`
+
+An Office theme color, one of those shown in the color gallery on the formatting ribbon.
+
+Alias: ``MSO_THEME_COLOR``
+
+Example::
+
+ from pptx.enum.dml import MSO_THEME_COLOR
+
+ shape.fill.solid()
+ shape.fill.fore_color.theme_color = MSO_THEME_COLOR.ACCENT_1
+
+MS API Name: `MsoThemeColorIndex`
+
+http://msdn.microsoft.com/en-us/library/office/ff860782(v=office.15).aspx
+
+### `ACCENT_1`
+
+```python
+ACCENT_1 = (5, 'accent1', 'Specifies the Accent 1 theme color.')
+```
+
+Specifies the Accent 1 theme color.
+
+### `ACCENT_2`
+
+```python
+ACCENT_2 = (6, 'accent2', 'Specifies the Accent 2 theme color.')
+```
+
+Specifies the Accent 2 theme color.
+
+### `ACCENT_3`
+
+```python
+ACCENT_3 = (7, 'accent3', 'Specifies the Accent 3 theme color.')
+```
+
+Specifies the Accent 3 theme color.
+
+### `ACCENT_4`
+
+```python
+ACCENT_4 = (8, 'accent4', 'Specifies the Accent 4 theme color.')
+```
+
+Specifies the Accent 4 theme color.
+
+### `ACCENT_5`
+
+```python
+ACCENT_5 = (9, 'accent5', 'Specifies the Accent 5 theme color.')
+```
+
+Specifies the Accent 5 theme color.
+
+### `ACCENT_6`
+
+```python
+ACCENT_6 = (10, 'accent6', 'Specifies the Accent 6 theme color.')
+```
+
+Specifies the Accent 6 theme color.
+
+### `BACKGROUND_1`
+
+```python
+BACKGROUND_1 = (14, 'bg1', 'Specifies the Background 1 theme color.')
+```
+
+Specifies the Background 1 theme color.
+
+### `BACKGROUND_2`
+
+```python
+BACKGROUND_2 = (16, 'bg2', 'Specifies the Background 2 theme color.')
+```
+
+Specifies the Background 2 theme color.
+
+### `DARK_1`
+
+```python
+DARK_1 = (1, 'dk1', 'Specifies the Dark 1 theme color.')
+```
+
+Specifies the Dark 1 theme color.
+
+### `DARK_2`
+
+```python
+DARK_2 = (3, 'dk2', 'Specifies the Dark 2 theme color.')
+```
+
+Specifies the Dark 2 theme color.
+
+### `FOLLOWED_HYPERLINK`
+
+```python
+FOLLOWED_HYPERLINK = (12, 'folHlink', 'Specifies the theme color for a clicked hyperlink.')
+```
+
+Specifies the theme color for a clicked hyperlink.
+
+### `HYPERLINK`
+
+```python
+HYPERLINK = (11, 'hlink', 'Specifies the theme color for a hyperlink.')
+```
+
+Specifies the theme color for a hyperlink.
+
+### `LIGHT_1`
+
+```python
+LIGHT_1 = (2, 'lt1', 'Specifies the Light 1 theme color.')
+```
+
+Specifies the Light 1 theme color.
+
+### `LIGHT_2`
+
+```python
+LIGHT_2 = (4, 'lt2', 'Specifies the Light 2 theme color.')
+```
+
+Specifies the Light 2 theme color.
+
+### `MIXED`
+
+```python
+MIXED = (-2, '', 'Indicates multiple theme colors are used, such as in a group shape (read-only).')
+```
+
+Indicates multiple theme colors are used, such as in a group shape (read-only).
+
+### `NOT_THEME_COLOR`
+
+```python
+NOT_THEME_COLOR = (0, '', 'Indicates the color is not a theme color.')
+```
+
+Indicates the color is not a theme color.
+
+### `TEXT_1`
+
+```python
+TEXT_1 = (13, 'tx1', 'Specifies the Text 1 theme color.')
+```
+
+Specifies the Text 1 theme color.
+
+### `TEXT_2`
+
+```python
+TEXT_2 = (15, 'tx2', 'Specifies the Text 2 theme color.')
+```
+
+Specifies the Text 2 theme color.
+
+
+
+
+
+# `pptx.enum.lang`
+
+Enumerations used for specifying language.
+
+## `MSO_LANGUAGE_ID`
+
+Bases: `BaseXmlEnum`
+
+Specifies the language identifier.
+
+Example::
+
+ from pptx.enum.lang import MSO_LANGUAGE_ID
+
+ font.language_id = MSO_LANGUAGE_ID.POLISH
+
+MS API Name: `MsoLanguageId`
+
+https://msdn.microsoft.com/en-us/library/office/ff862134.aspx
+
+### `AFRIKAANS`
+
+```python
+AFRIKAANS = (1078, 'af-ZA', 'The Afrikaans language.')
+```
+
+The Afrikaans language.
+
+### `ALBANIAN`
+
+```python
+ALBANIAN = (1052, 'sq-AL', 'The Albanian language.')
+```
+
+The Albanian language.
+
+### `AMHARIC`
+
+```python
+AMHARIC = (1118, 'am-ET', 'The Amharic language.')
+```
+
+The Amharic language.
+
+### `ARABIC`
+
+```python
+ARABIC = (1025, 'ar-SA', 'The Arabic language.')
+```
+
+The Arabic language.
+
+### `ARABIC_ALGERIA`
+
+```python
+ARABIC_ALGERIA = (5121, 'ar-DZ', 'The Arabic Algeria language.')
+```
+
+The Arabic Algeria language.
+
+### `ARABIC_BAHRAIN`
+
+```python
+ARABIC_BAHRAIN = (15361, 'ar-BH', 'The Arabic Bahrain language.')
+```
+
+The Arabic Bahrain language.
+
+### `ARABIC_EGYPT`
+
+```python
+ARABIC_EGYPT = (3073, 'ar-EG', 'The Arabic Egypt language.')
+```
+
+The Arabic Egypt language.
+
+### `ARABIC_IRAQ`
+
+```python
+ARABIC_IRAQ = (2049, 'ar-IQ', 'The Arabic Iraq language.')
+```
+
+The Arabic Iraq language.
+
+### `ARABIC_JORDAN`
+
+```python
+ARABIC_JORDAN = (11265, 'ar-JO', 'The Arabic Jordan language.')
+```
+
+The Arabic Jordan language.
+
+### `ARABIC_KUWAIT`
+
+```python
+ARABIC_KUWAIT = (13313, 'ar-KW', 'The Arabic Kuwait language.')
+```
+
+The Arabic Kuwait language.
+
+### `ARABIC_LEBANON`
+
+```python
+ARABIC_LEBANON = (12289, 'ar-LB', 'The Arabic Lebanon language.')
+```
+
+The Arabic Lebanon language.
+
+### `ARABIC_LIBYA`
+
+```python
+ARABIC_LIBYA = (4097, 'ar-LY', 'The Arabic Libya language.')
+```
+
+The Arabic Libya language.
+
+### `ARABIC_MOROCCO`
+
+```python
+ARABIC_MOROCCO = (6145, 'ar-MA', 'The Arabic Morocco language.')
+```
+
+The Arabic Morocco language.
+
+### `ARABIC_OMAN`
+
+```python
+ARABIC_OMAN = (8193, 'ar-OM', 'The Arabic Oman language.')
+```
+
+The Arabic Oman language.
+
+### `ARABIC_QATAR`
+
+```python
+ARABIC_QATAR = (16385, 'ar-QA', 'The Arabic Qatar language.')
+```
+
+The Arabic Qatar language.
+
+### `ARABIC_SYRIA`
+
+```python
+ARABIC_SYRIA = (10241, 'ar-SY', 'The Arabic Syria language.')
+```
+
+The Arabic Syria language.
+
+### `ARABIC_TUNISIA`
+
+```python
+ARABIC_TUNISIA = (7169, 'ar-TN', 'The Arabic Tunisia language.')
+```
+
+The Arabic Tunisia language.
+
+### `ARABIC_UAE`
+
+```python
+ARABIC_UAE = (14337, 'ar-AE', 'The Arabic UAE language.')
+```
+
+The Arabic UAE language.
+
+### `ARABIC_YEMEN`
+
+```python
+ARABIC_YEMEN = (9217, 'ar-YE', 'The Arabic Yemen language.')
+```
+
+The Arabic Yemen language.
+
+### `ARMENIAN`
+
+```python
+ARMENIAN = (1067, 'hy-AM', 'The Armenian language.')
+```
+
+The Armenian language.
+
+### `ASSAMESE`
+
+```python
+ASSAMESE = (1101, 'as-IN', 'The Assamese language.')
+```
+
+The Assamese language.
+
+### `AZERI_CYRILLIC`
+
+```python
+AZERI_CYRILLIC = (2092, 'az-AZ', 'The Azeri Cyrillic language.')
+```
+
+The Azeri Cyrillic language.
+
+### `AZERI_LATIN`
+
+```python
+AZERI_LATIN = (1068, 'az-Latn-AZ', 'The Azeri Latin language.')
+```
+
+The Azeri Latin language.
+
+### `BASQUE`
+
+```python
+BASQUE = (1069, 'eu-ES', 'The Basque language.')
+```
+
+The Basque language.
+
+### `BELGIAN_DUTCH`
+
+```python
+BELGIAN_DUTCH = (2067, 'nl-BE', 'The Belgian Dutch language.')
+```
+
+The Belgian Dutch language.
+
+### `BELGIAN_FRENCH`
+
+```python
+BELGIAN_FRENCH = (2060, 'fr-BE', 'The Belgian French language.')
+```
+
+The Belgian French language.
+
+### `BENGALI`
+
+```python
+BENGALI = (1093, 'bn-IN', 'The Bengali language.')
+```
+
+The Bengali language.
+
+### `BOSNIAN`
+
+```python
+BOSNIAN = (4122, 'hr-BA', 'The Bosnian language.')
+```
+
+The Bosnian language.
+
+### `BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC`
+
+```python
+BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC = (8218, 'bs-BA', 'The Bosnian Bosnia Herzegovina Cyrillic language.')
+```
+
+The Bosnian Bosnia Herzegovina Cyrillic language.
+
+### `BOSNIAN_BOSNIA_HERZEGOVINA_LATIN`
+
+```python
+BOSNIAN_BOSNIA_HERZEGOVINA_LATIN = (5146, 'bs-Latn-BA', 'The Bosnian Bosnia Herzegovina Latin language.')
+```
+
+The Bosnian Bosnia Herzegovina Latin language.
+
+### `BRAZILIAN_PORTUGUESE`
+
+```python
+BRAZILIAN_PORTUGUESE = (1046, 'pt-BR', 'The Brazilian Portuguese language.')
+```
+
+The Brazilian Portuguese language.
+
+### `BULGARIAN`
+
+```python
+BULGARIAN = (1026, 'bg-BG', 'The Bulgarian language.')
+```
+
+The Bulgarian language.
+
+### `BURMESE`
+
+```python
+BURMESE = (1109, 'my-MM', 'The Burmese language.')
+```
+
+The Burmese language.
+
+### `BYELORUSSIAN`
+
+```python
+BYELORUSSIAN = (1059, 'be-BY', 'The Byelorussian language.')
+```
+
+The Byelorussian language.
+
+### `CATALAN`
+
+```python
+CATALAN = (1027, 'ca-ES', 'The Catalan language.')
+```
+
+The Catalan language.
+
+### `CHEROKEE`
+
+```python
+CHEROKEE = (1116, 'chr-US', 'The Cherokee language.')
+```
+
+The Cherokee language.
+
+### `CHINESE_HONG_KONG_SAR`
+
+```python
+CHINESE_HONG_KONG_SAR = (3076, 'zh-HK', 'The Chinese Hong Kong SAR language.')
+```
+
+The Chinese Hong Kong SAR language.
+
+### `CHINESE_MACAO_SAR`
+
+```python
+CHINESE_MACAO_SAR = (5124, 'zh-MO', 'The Chinese Macao SAR language.')
+```
+
+The Chinese Macao SAR language.
+
+### `CHINESE_SINGAPORE`
+
+```python
+CHINESE_SINGAPORE = (4100, 'zh-SG', 'The Chinese Singapore language.')
+```
+
+The Chinese Singapore language.
+
+### `CROATIAN`
+
+```python
+CROATIAN = (1050, 'hr-HR', 'The Croatian language.')
+```
+
+The Croatian language.
+
+### `CZECH`
+
+```python
+CZECH = (1029, 'cs-CZ', 'The Czech language.')
+```
+
+The Czech language.
+
+### `DANISH`
+
+```python
+DANISH = (1030, 'da-DK', 'The Danish language.')
+```
+
+The Danish language.
+
+### `DIVEHI`
+
+```python
+DIVEHI = (1125, 'div-MV', 'The Divehi language.')
+```
+
+The Divehi language.
+
+### `DUTCH`
+
+```python
+DUTCH = (1043, 'nl-NL', 'The Dutch language.')
+```
+
+The Dutch language.
+
+### `EDO`
+
+```python
+EDO = (1126, 'bin-NG', 'The Edo language.')
+```
+
+The Edo language.
+
+### `ENGLISH_AUS`
+
+```python
+ENGLISH_AUS = (3081, 'en-AU', 'The English AUS language.')
+```
+
+The English AUS language.
+
+### `ENGLISH_BELIZE`
+
+```python
+ENGLISH_BELIZE = (10249, 'en-BZ', 'The English Belize language.')
+```
+
+The English Belize language.
+
+### `ENGLISH_CANADIAN`
+
+```python
+ENGLISH_CANADIAN = (4105, 'en-CA', 'The English Canadian language.')
+```
+
+The English Canadian language.
+
+### `ENGLISH_CARIBBEAN`
+
+```python
+ENGLISH_CARIBBEAN = (9225, 'en-CB', 'The English Caribbean language.')
+```
+
+The English Caribbean language.
+
+### `ENGLISH_INDONESIA`
+
+```python
+ENGLISH_INDONESIA = (14345, 'en-ID', 'The English Indonesia language.')
+```
+
+The English Indonesia language.
+
+### `ENGLISH_IRELAND`
+
+```python
+ENGLISH_IRELAND = (6153, 'en-IE', 'The English Ireland language.')
+```
+
+The English Ireland language.
+
+### `ENGLISH_JAMAICA`
+
+```python
+ENGLISH_JAMAICA = (8201, 'en-JA', 'The English Jamaica language.')
+```
+
+The English Jamaica language.
+
+### `ENGLISH_NEW_ZEALAND`
+
+```python
+ENGLISH_NEW_ZEALAND = (5129, 'en-NZ', 'The English NewZealand language.')
+```
+
+The English NewZealand language.
+
+### `ENGLISH_PHILIPPINES`
+
+```python
+ENGLISH_PHILIPPINES = (13321, 'en-PH', 'The English Philippines language.')
+```
+
+The English Philippines language.
+
+### `ENGLISH_SOUTH_AFRICA`
+
+```python
+ENGLISH_SOUTH_AFRICA = (7177, 'en-ZA', 'The English South Africa language.')
+```
+
+The English South Africa language.
+
+### `ENGLISH_TRINIDAD_TOBAGO`
+
+```python
+ENGLISH_TRINIDAD_TOBAGO = (11273, 'en-TT', 'The English Trinidad Tobago language.')
+```
+
+The English Trinidad Tobago language.
+
+### `ENGLISH_UK`
+
+```python
+ENGLISH_UK = (2057, 'en-GB', 'The English UK language.')
+```
+
+The English UK language.
+
+### `ENGLISH_US`
+
+```python
+ENGLISH_US = (1033, 'en-US', 'The English US language.')
+```
+
+The English US language.
+
+### `ENGLISH_ZIMBABWE`
+
+```python
+ENGLISH_ZIMBABWE = (12297, 'en-ZW', 'The English Zimbabwe language.')
+```
+
+The English Zimbabwe language.
+
+### `ESTONIAN`
+
+```python
+ESTONIAN = (1061, 'et-EE', 'The Estonian language.')
+```
+
+The Estonian language.
+
+### `FAEROESE`
+
+```python
+FAEROESE = (1080, 'fo-FO', 'The Faeroese language.')
+```
+
+The Faeroese language.
+
+### `FARSI`
+
+```python
+FARSI = (1065, 'fa-IR', 'The Farsi language.')
+```
+
+The Farsi language.
+
+### `FILIPINO`
+
+```python
+FILIPINO = (1124, 'fil-PH', 'The Filipino language.')
+```
+
+The Filipino language.
+
+### `FINNISH`
+
+```python
+FINNISH = (1035, 'fi-FI', 'The Finnish language.')
+```
+
+The Finnish language.
+
+### `FRANCH_CONGO_DRC`
+
+```python
+FRANCH_CONGO_DRC = (9228, 'fr-CD', 'The French Congo DRC language.')
+```
+
+The French Congo DRC language.
+
+### `FRENCH`
+
+```python
+FRENCH = (1036, 'fr-FR', 'The French language.')
+```
+
+The French language.
+
+### `FRENCH_CAMEROON`
+
+```python
+FRENCH_CAMEROON = (11276, 'fr-CM', 'The French Cameroon language.')
+```
+
+The French Cameroon language.
+
+### `FRENCH_CANADIAN`
+
+```python
+FRENCH_CANADIAN = (3084, 'fr-CA', 'The French Canadian language.')
+```
+
+The French Canadian language.
+
+### `FRENCH_COTED_IVOIRE`
+
+```python
+FRENCH_COTED_IVOIRE = (12300, 'fr-CI', 'The French Coted Ivoire language.')
+```
+
+The French Coted Ivoire language.
+
+### `FRENCH_HAITI`
+
+```python
+FRENCH_HAITI = (15372, 'fr-HT', 'The French Haiti language.')
+```
+
+The French Haiti language.
+
+### `FRENCH_LUXEMBOURG`
+
+```python
+FRENCH_LUXEMBOURG = (5132, 'fr-LU', 'The French Luxembourg language.')
+```
+
+The French Luxembourg language.
+
+### `FRENCH_MALI`
+
+```python
+FRENCH_MALI = (13324, 'fr-ML', 'The French Mali language.')
+```
+
+The French Mali language.
+
+### `FRENCH_MONACO`
+
+```python
+FRENCH_MONACO = (6156, 'fr-MC', 'The French Monaco language.')
+```
+
+The French Monaco language.
+
+### `FRENCH_MOROCCO`
+
+```python
+FRENCH_MOROCCO = (14348, 'fr-MA', 'The French Morocco language.')
+```
+
+The French Morocco language.
+
+### `FRENCH_REUNION`
+
+```python
+FRENCH_REUNION = (8204, 'fr-RE', 'The French Reunion language.')
+```
+
+The French Reunion language.
+
+### `FRENCH_SENEGAL`
+
+```python
+FRENCH_SENEGAL = (10252, 'fr-SN', 'The French Senegal language.')
+```
+
+The French Senegal language.
+
+### `FRENCH_WEST_INDIES`
+
+```python
+FRENCH_WEST_INDIES = (7180, 'fr-WINDIES', 'The French West Indies language.')
+```
+
+The French West Indies language.
+
+### `FRISIAN_NETHERLANDS`
+
+```python
+FRISIAN_NETHERLANDS = (1122, 'fy-NL', 'The Frisian Netherlands language.')
+```
+
+The Frisian Netherlands language.
+
+### `FULFULDE`
+
+```python
+FULFULDE = (1127, 'ff-NG', 'The Fulfulde language.')
+```
+
+The Fulfulde language.
+
+### `GAELIC_IRELAND`
+
+```python
+GAELIC_IRELAND = (2108, 'ga-IE', 'The Gaelic Ireland language.')
+```
+
+The Gaelic Ireland language.
+
+### `GAELIC_SCOTLAND`
+
+```python
+GAELIC_SCOTLAND = (1084, 'en-US', 'The Gaelic Scotland language.')
+```
+
+The Gaelic Scotland language.
+
+### `GALICIAN`
+
+```python
+GALICIAN = (1110, 'gl-ES', 'The Galician language.')
+```
+
+The Galician language.
+
+### `GEORGIAN`
+
+```python
+GEORGIAN = (1079, 'ka-GE', 'The Georgian language.')
+```
+
+The Georgian language.
+
+### `GERMAN`
+
+```python
+GERMAN = (1031, 'de-DE', 'The German language.')
+```
+
+The German language.
+
+### `GERMAN_AUSTRIA`
+
+```python
+GERMAN_AUSTRIA = (3079, 'de-AT', 'The German Austria language.')
+```
+
+The German Austria language.
+
+### `GERMAN_LIECHTENSTEIN`
+
+```python
+GERMAN_LIECHTENSTEIN = (5127, 'de-LI', 'The German Liechtenstein language.')
+```
+
+The German Liechtenstein language.
+
+### `GERMAN_LUXEMBOURG`
+
+```python
+GERMAN_LUXEMBOURG = (4103, 'de-LU', 'The German Luxembourg language.')
+```
+
+The German Luxembourg language.
+
+### `GREEK`
+
+```python
+GREEK = (1032, 'el-GR', 'The Greek language.')
+```
+
+The Greek language.
+
+### `GUARANI`
+
+```python
+GUARANI = (1140, 'gn-PY', 'The Guarani language.')
+```
+
+The Guarani language.
+
+### `GUJARATI`
+
+```python
+GUJARATI = (1095, 'gu-IN', 'The Gujarati language.')
+```
+
+The Gujarati language.
+
+### `HAUSA`
+
+```python
+HAUSA = (1128, 'ha-NG', 'The Hausa language.')
+```
+
+The Hausa language.
+
+### `HAWAIIAN`
+
+```python
+HAWAIIAN = (1141, 'haw-US', 'The Hawaiian language.')
+```
+
+The Hawaiian language.
+
+### `HEBREW`
+
+```python
+HEBREW = (1037, 'he-IL', 'The Hebrew language.')
+```
+
+The Hebrew language.
+
+### `HINDI`
+
+```python
+HINDI = (1081, 'hi-IN', 'The Hindi language.')
+```
+
+The Hindi language.
+
+### `HUNGARIAN`
+
+```python
+HUNGARIAN = (1038, 'hu-HU', 'The Hungarian language.')
+```
+
+The Hungarian language.
+
+### `IBIBIO`
+
+```python
+IBIBIO = (1129, 'ibb-NG', 'The Ibibio language.')
+```
+
+The Ibibio language.
+
+### `ICELANDIC`
+
+```python
+ICELANDIC = (1039, 'is-IS', 'The Icelandic language.')
+```
+
+The Icelandic language.
+
+### `IGBO`
+
+```python
+IGBO = (1136, 'ig-NG', 'The Igbo language.')
+```
+
+The Igbo language.
+
+### `INDONESIAN`
+
+```python
+INDONESIAN = (1057, 'id-ID', 'The Indonesian language.')
+```
+
+The Indonesian language.
+
+### `INUKTITUT`
+
+```python
+INUKTITUT = (1117, 'iu-Cans-CA', 'The Inuktitut language.')
+```
+
+The Inuktitut language.
+
+### `ITALIAN`
+
+```python
+ITALIAN = (1040, 'it-IT', 'The Italian language.')
+```
+
+The Italian language.
+
+### `JAPANESE`
+
+```python
+JAPANESE = (1041, 'ja-JP', 'The Japanese language.')
+```
+
+The Japanese language.
+
+### `KANNADA`
+
+```python
+KANNADA = (1099, 'kn-IN', 'The Kannada language.')
+```
+
+The Kannada language.
+
+### `KANURI`
+
+```python
+KANURI = (1137, 'kr-NG', 'The Kanuri language.')
+```
+
+The Kanuri language.
+
+### `KASHMIRI`
+
+```python
+KASHMIRI = (1120, 'ks-Arab', 'The Kashmiri language.')
+```
+
+The Kashmiri language.
+
+### `KASHMIRI_DEVANAGARI`
+
+```python
+KASHMIRI_DEVANAGARI = (2144, 'ks-Deva', 'The Kashmiri Devanagari language.')
+```
+
+The Kashmiri Devanagari language.
+
+### `KAZAKH`
+
+```python
+KAZAKH = (1087, 'kk-KZ', 'The Kazakh language.')
+```
+
+The Kazakh language.
+
+### `KHMER`
+
+```python
+KHMER = (1107, 'kh-KH', 'The Khmer language.')
+```
+
+The Khmer language.
+
+### `KIRGHIZ`
+
+```python
+KIRGHIZ = (1088, 'ky-KG', 'The Kirghiz language.')
+```
+
+The Kirghiz language.
+
+### `KONKANI`
+
+```python
+KONKANI = (1111, 'kok-IN', 'The Konkani language.')
+```
+
+The Konkani language.
+
+### `KOREAN`
+
+```python
+KOREAN = (1042, 'ko-KR', 'The Korean language.')
+```
+
+The Korean language.
+
+### `KYRGYZ`
+
+```python
+KYRGYZ = (1088, 'ky-KG', 'The Kyrgyz language.')
+```
+
+The Kyrgyz language.
+
+### `LAO`
+
+```python
+LAO = (1108, 'lo-LA', 'The Lao language.')
+```
+
+The Lao language.
+
+### `LATIN`
+
+```python
+LATIN = (1142, 'la-Latn', 'The Latin language.')
+```
+
+The Latin language.
+
+### `LATVIAN`
+
+```python
+LATVIAN = (1062, 'lv-LV', 'The Latvian language.')
+```
+
+The Latvian language.
+
+### `LITHUANIAN`
+
+```python
+LITHUANIAN = (1063, 'lt-LT', 'The Lithuanian language.')
+```
+
+The Lithuanian language.
+
+### `MACEDONINAN_FYROM`
+
+```python
+MACEDONINAN_FYROM = (1071, 'mk-MK', 'The Macedonian FYROM language.')
+```
+
+The Macedonian FYROM language.
+
+### `MALAYALAM`
+
+```python
+MALAYALAM = (1100, 'ml-IN', 'The Malayalam language.')
+```
+
+The Malayalam language.
+
+### `MALAYSIAN`
+
+```python
+MALAYSIAN = (1086, 'ms-MY', 'The Malaysian language.')
+```
+
+The Malaysian language.
+
+### `MALAY_BRUNEI_DARUSSALAM`
+
+```python
+MALAY_BRUNEI_DARUSSALAM = (2110, 'ms-BN', 'The Malay Brunei Darussalam language.')
+```
+
+The Malay Brunei Darussalam language.
+
+### `MALTESE`
+
+```python
+MALTESE = (1082, 'mt-MT', 'The Maltese language.')
+```
+
+The Maltese language.
+
+### `MANIPURI`
+
+```python
+MANIPURI = (1112, 'mni-IN', 'The Manipuri language.')
+```
+
+The Manipuri language.
+
+### `MAORI`
+
+```python
+MAORI = (1153, 'mi-NZ', 'The Maori language.')
+```
+
+The Maori language.
+
+### `MARATHI`
+
+```python
+MARATHI = (1102, 'mr-IN', 'The Marathi language.')
+```
+
+The Marathi language.
+
+### `MEXICAN_SPANISH`
+
+```python
+MEXICAN_SPANISH = (2058, 'es-MX', 'The Mexican Spanish language.')
+```
+
+The Mexican Spanish language.
+
+### `MIXED`
+
+```python
+MIXED = (-2, '', 'More than one language in specified range (read-only).')
+```
+
+More than one language in specified range (read-only).
+
+### `MONGOLIAN`
+
+```python
+MONGOLIAN = (1104, 'mn-MN', 'The Mongolian language.')
+```
+
+The Mongolian language.
+
+### `NEPALI`
+
+```python
+NEPALI = (1121, 'ne-NP', 'The Nepali language.')
+```
+
+The Nepali language.
+
+### `NONE`
+
+```python
+NONE = (0, '', 'No language specified.')
+```
+
+No language specified.
+
+### `NORWEGIAN_BOKMOL`
+
+```python
+NORWEGIAN_BOKMOL = (1044, 'nb-NO', 'The Norwegian Bokmol language.')
+```
+
+The Norwegian Bokmol language.
+
+### `NORWEGIAN_NYNORSK`
+
+```python
+NORWEGIAN_NYNORSK = (2068, 'nn-NO', 'The Norwegian Nynorsk language.')
+```
+
+The Norwegian Nynorsk language.
+
+### `NO_PROOFING`
+
+```python
+NO_PROOFING = (1024, 'en-US', 'No proofing.')
+```
+
+No proofing.
+
+### `ORIYA`
+
+```python
+ORIYA = (1096, 'or-IN', 'The Oriya language.')
+```
+
+The Oriya language.
+
+### `OROMO`
+
+```python
+OROMO = (1138, 'om-Ethi-ET', 'The Oromo language.')
+```
+
+The Oromo language.
+
+### `PASHTO`
+
+```python
+PASHTO = (1123, 'ps-AF', 'The Pashto language.')
+```
+
+The Pashto language.
+
+### `POLISH`
+
+```python
+POLISH = (1045, 'pl-PL', 'The Polish language.')
+```
+
+The Polish language.
+
+### `PORTUGUESE`
+
+```python
+PORTUGUESE = (2070, 'pt-PT', 'The Portuguese language.')
+```
+
+The Portuguese language.
+
+### `PUNJABI`
+
+```python
+PUNJABI = (1094, 'pa-IN', 'The Punjabi language.')
+```
+
+The Punjabi language.
+
+### `QUECHUA_BOLIVIA`
+
+```python
+QUECHUA_BOLIVIA = (1131, 'quz-BO', 'The Quechua Bolivia language.')
+```
+
+The Quechua Bolivia language.
+
+### `QUECHUA_ECUADOR`
+
+```python
+QUECHUA_ECUADOR = (2155, 'quz-EC', 'The Quechua Ecuador language.')
+```
+
+The Quechua Ecuador language.
+
+### `QUECHUA_PERU`
+
+```python
+QUECHUA_PERU = (3179, 'quz-PE', 'The Quechua Peru language.')
+```
+
+The Quechua Peru language.
+
+### `RHAETO_ROMANIC`
+
+```python
+RHAETO_ROMANIC = (1047, 'rm-CH', 'The Rhaeto Romanic language.')
+```
+
+The Rhaeto Romanic language.
+
+### `ROMANIAN`
+
+```python
+ROMANIAN = (1048, 'ro-RO', 'The Romanian language.')
+```
+
+The Romanian language.
+
+### `ROMANIAN_MOLDOVA`
+
+```python
+ROMANIAN_MOLDOVA = (2072, 'ro-MO', 'The Romanian Moldova language.')
+```
+
+The Romanian Moldova language.
+
+### `RUSSIAN`
+
+```python
+RUSSIAN = (1049, 'ru-RU', 'The Russian language.')
+```
+
+The Russian language.
+
+### `RUSSIAN_MOLDOVA`
+
+```python
+RUSSIAN_MOLDOVA = (2073, 'ru-MO', 'The Russian Moldova language.')
+```
+
+The Russian Moldova language.
+
+### `SAMI_LAPPISH`
+
+```python
+SAMI_LAPPISH = (1083, 'se-NO', 'The Sami Lappish language.')
+```
+
+The Sami Lappish language.
+
+### `SANSKRIT`
+
+```python
+SANSKRIT = (1103, 'sa-IN', 'The Sanskrit language.')
+```
+
+The Sanskrit language.
+
+### `SEPEDI`
+
+```python
+SEPEDI = (1132, 'ns-ZA', 'The Sepedi language.')
+```
+
+The Sepedi language.
+
+### `SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC`
+
+```python
+SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC = (7194, 'sr-BA', 'The Serbian Bosnia Herzegovina Cyrillic language.')
+```
+
+The Serbian Bosnia Herzegovina Cyrillic language.
+
+### `SERBIAN_BOSNIA_HERZEGOVINA_LATIN`
+
+```python
+SERBIAN_BOSNIA_HERZEGOVINA_LATIN = (6170, 'sr-Latn-BA', 'The Serbian Bosnia Herzegovina Latin language.')
+```
+
+The Serbian Bosnia Herzegovina Latin language.
+
+### `SERBIAN_CYRILLIC`
+
+```python
+SERBIAN_CYRILLIC = (3098, 'sr-SP', 'The Serbian Cyrillic language.')
+```
+
+The Serbian Cyrillic language.
+
+### `SERBIAN_LATIN`
+
+```python
+SERBIAN_LATIN = (2074, 'sr-Latn-CS', 'The Serbian Latin language.')
+```
+
+The Serbian Latin language.
+
+### `SESOTHO`
+
+```python
+SESOTHO = (1072, 'st-ZA', 'The Sesotho language.')
+```
+
+The Sesotho language.
+
+### `SIMPLIFIED_CHINESE`
+
+```python
+SIMPLIFIED_CHINESE = (2052, 'zh-CN', 'The Simplified Chinese language.')
+```
+
+The Simplified Chinese language.
+
+### `SINDHI`
+
+```python
+SINDHI = (1113, 'sd-Deva-IN', 'The Sindhi language.')
+```
+
+The Sindhi language.
+
+### `SINDHI_PAKISTAN`
+
+```python
+SINDHI_PAKISTAN = (2137, 'sd-Arab-PK', 'The Sindhi Pakistan language.')
+```
+
+The Sindhi Pakistan language.
+
+### `SINHALESE`
+
+```python
+SINHALESE = (1115, 'si-LK', 'The Sinhalese language.')
+```
+
+The Sinhalese language.
+
+### `SLOVAK`
+
+```python
+SLOVAK = (1051, 'sk-SK', 'The Slovak language.')
+```
+
+The Slovak language.
+
+### `SLOVENIAN`
+
+```python
+SLOVENIAN = (1060, 'sl-SI', 'The Slovenian language.')
+```
+
+The Slovenian language.
+
+### `SOMALI`
+
+```python
+SOMALI = (1143, 'so-SO', 'The Somali language.')
+```
+
+The Somali language.
+
+### `SORBIAN`
+
+```python
+SORBIAN = (1070, 'wen-DE', 'The Sorbian language.')
+```
+
+The Sorbian language.
+
+### `SPANISH`
+
+```python
+SPANISH = (1034, 'es-ES_tradnl', 'The Spanish language.')
+```
+
+The Spanish language.
+
+### `SPANISH_ARGENTINA`
+
+```python
+SPANISH_ARGENTINA = (11274, 'es-AR', 'The Spanish Argentina language.')
+```
+
+The Spanish Argentina language.
+
+### `SPANISH_BOLIVIA`
+
+```python
+SPANISH_BOLIVIA = (16394, 'es-BO', 'The Spanish Bolivia language.')
+```
+
+The Spanish Bolivia language.
+
+### `SPANISH_CHILE`
+
+```python
+SPANISH_CHILE = (13322, 'es-CL', 'The Spanish Chile language.')
+```
+
+The Spanish Chile language.
+
+### `SPANISH_COLOMBIA`
+
+```python
+SPANISH_COLOMBIA = (9226, 'es-CO', 'The Spanish Colombia language.')
+```
+
+The Spanish Colombia language.
+
+### `SPANISH_COSTA_RICA`
+
+```python
+SPANISH_COSTA_RICA = (5130, 'es-CR', 'The Spanish Costa Rica language.')
+```
+
+The Spanish Costa Rica language.
+
+### `SPANISH_DOMINICAN_REPUBLIC`
+
+```python
+SPANISH_DOMINICAN_REPUBLIC = (7178, 'es-DO', 'The Spanish Dominican Republic language.')
+```
+
+The Spanish Dominican Republic language.
+
+### `SPANISH_ECUADOR`
+
+```python
+SPANISH_ECUADOR = (12298, 'es-EC', 'The Spanish Ecuador language.')
+```
+
+The Spanish Ecuador language.
+
+### `SPANISH_EL_SALVADOR`
+
+```python
+SPANISH_EL_SALVADOR = (17418, 'es-SV', 'The Spanish El Salvador language.')
+```
+
+The Spanish El Salvador language.
+
+### `SPANISH_GUATEMALA`
+
+```python
+SPANISH_GUATEMALA = (4106, 'es-GT', 'The Spanish Guatemala language.')
+```
+
+The Spanish Guatemala language.
+
+### `SPANISH_HONDURAS`
+
+```python
+SPANISH_HONDURAS = (18442, 'es-HN', 'The Spanish Honduras language.')
+```
+
+The Spanish Honduras language.
+
+### `SPANISH_MODERN_SORT`
+
+```python
+SPANISH_MODERN_SORT = (3082, 'es-ES', 'The Spanish Modern Sort language.')
+```
+
+The Spanish Modern Sort language.
+
+### `SPANISH_NICARAGUA`
+
+```python
+SPANISH_NICARAGUA = (19466, 'es-NI', 'The Spanish Nicaragua language.')
+```
+
+The Spanish Nicaragua language.
+
+### `SPANISH_PANAMA`
+
+```python
+SPANISH_PANAMA = (6154, 'es-PA', 'The Spanish Panama language.')
+```
+
+The Spanish Panama language.
+
+### `SPANISH_PARAGUAY`
+
+```python
+SPANISH_PARAGUAY = (15370, 'es-PY', 'The Spanish Paraguay language.')
+```
+
+The Spanish Paraguay language.
+
+### `SPANISH_PERU`
+
+```python
+SPANISH_PERU = (10250, 'es-PE', 'The Spanish Peru language.')
+```
+
+The Spanish Peru language.
+
+### `SPANISH_PUERTO_RICO`
+
+```python
+SPANISH_PUERTO_RICO = (20490, 'es-PR', 'The Spanish Puerto Rico language.')
+```
+
+The Spanish Puerto Rico language.
+
+### `SPANISH_URUGUAY`
+
+```python
+SPANISH_URUGUAY = (14346, 'es-UR', 'The Spanish Uruguay language.')
+```
+
+The Spanish Uruguay language.
+
+### `SPANISH_VENEZUELA`
+
+```python
+SPANISH_VENEZUELA = (8202, 'es-VE', 'The Spanish Venezuela language.')
+```
+
+The Spanish Venezuela language.
+
+### `SUTU`
+
+```python
+SUTU = (1072, 'st-ZA', 'The Sutu language.')
+```
+
+The Sutu language.
+
+### `SWAHILI`
+
+```python
+SWAHILI = (1089, 'sw-KE', 'The Swahili language.')
+```
+
+The Swahili language.
+
+### `SWEDISH`
+
+```python
+SWEDISH = (1053, 'sv-SE', 'The Swedish language.')
+```
+
+The Swedish language.
+
+### `SWEDISH_FINLAND`
+
+```python
+SWEDISH_FINLAND = (2077, 'sv-FI', 'The Swedish Finland language.')
+```
+
+The Swedish Finland language.
+
+### `SWISS_FRENCH`
+
+```python
+SWISS_FRENCH = (4108, 'fr-CH', 'The Swiss French language.')
+```
+
+The Swiss French language.
+
+### `SWISS_GERMAN`
+
+```python
+SWISS_GERMAN = (2055, 'de-CH', 'The Swiss German language.')
+```
+
+The Swiss German language.
+
+### `SWISS_ITALIAN`
+
+```python
+SWISS_ITALIAN = (2064, 'it-CH', 'The Swiss Italian language.')
+```
+
+The Swiss Italian language.
+
+### `SYRIAC`
+
+```python
+SYRIAC = (1114, 'syr-SY', 'The Syriac language.')
+```
+
+The Syriac language.
+
+### `TAJIK`
+
+```python
+TAJIK = (1064, 'tg-TJ', 'The Tajik language.')
+```
+
+The Tajik language.
+
+### `TAMAZIGHT`
+
+```python
+TAMAZIGHT = (1119, 'tzm-Arab-MA', 'The Tamazight language.')
+```
+
+The Tamazight language.
+
+### `TAMAZIGHT_LATIN`
+
+```python
+TAMAZIGHT_LATIN = (2143, 'tmz-DZ', 'The Tamazight Latin language.')
+```
+
+The Tamazight Latin language.
+
+### `TAMIL`
+
+```python
+TAMIL = (1097, 'ta-IN', 'The Tamil language.')
+```
+
+The Tamil language.
+
+### `TATAR`
+
+```python
+TATAR = (1092, 'tt-RU', 'The Tatar language.')
+```
+
+The Tatar language.
+
+### `TELUGU`
+
+```python
+TELUGU = (1098, 'te-IN', 'The Telugu language.')
+```
+
+The Telugu language.
+
+### `THAI`
+
+```python
+THAI = (1054, 'th-TH', 'The Thai language.')
+```
+
+The Thai language.
+
+### `TIBETAN`
+
+```python
+TIBETAN = (1105, 'bo-CN', 'The Tibetan language.')
+```
+
+The Tibetan language.
+
+### `TIGRIGNA_ERITREA`
+
+```python
+TIGRIGNA_ERITREA = (2163, 'ti-ER', 'The Tigrigna Eritrea language.')
+```
+
+The Tigrigna Eritrea language.
+
+### `TIGRIGNA_ETHIOPIC`
+
+```python
+TIGRIGNA_ETHIOPIC = (1139, 'ti-ET', 'The Tigrigna Ethiopic language.')
+```
+
+The Tigrigna Ethiopic language.
+
+### `TRADITIONAL_CHINESE`
+
+```python
+TRADITIONAL_CHINESE = (1028, 'zh-TW', 'The Traditional Chinese language.')
+```
+
+The Traditional Chinese language.
+
+### `TSONGA`
+
+```python
+TSONGA = (1073, 'ts-ZA', 'The Tsonga language.')
+```
+
+The Tsonga language.
+
+### `TSWANA`
+
+```python
+TSWANA = (1074, 'tn-ZA', 'The Tswana language.')
+```
+
+The Tswana language.
+
+### `TURKISH`
+
+```python
+TURKISH = (1055, 'tr-TR', 'The Turkish language.')
+```
+
+The Turkish language.
+
+### `TURKMEN`
+
+```python
+TURKMEN = (1090, 'tk-TM', 'The Turkmen language.')
+```
+
+The Turkmen language.
+
+### `UKRAINIAN`
+
+```python
+UKRAINIAN = (1058, 'uk-UA', 'The Ukrainian language.')
+```
+
+The Ukrainian language.
+
+### `URDU`
+
+```python
+URDU = (1056, 'ur-PK', 'The Urdu language.')
+```
+
+The Urdu language.
+
+### `UZBEK_CYRILLIC`
+
+```python
+UZBEK_CYRILLIC = (2115, 'uz-UZ', 'The Uzbek Cyrillic language.')
+```
+
+The Uzbek Cyrillic language.
+
+### `UZBEK_LATIN`
+
+```python
+UZBEK_LATIN = (1091, 'uz-Latn-UZ', 'The Uzbek Latin language.')
+```
+
+The Uzbek Latin language.
+
+### `VENDA`
+
+```python
+VENDA = (1075, 've-ZA', 'The Venda language.')
+```
+
+The Venda language.
+
+### `VIETNAMESE`
+
+```python
+VIETNAMESE = (1066, 'vi-VN', 'The Vietnamese language.')
+```
+
+The Vietnamese language.
+
+### `WELSH`
+
+```python
+WELSH = (1106, 'cy-GB', 'The Welsh language.')
+```
+
+The Welsh language.
+
+### `XHOSA`
+
+```python
+XHOSA = (1076, 'xh-ZA', 'The Xhosa language.')
+```
+
+The Xhosa language.
+
+### `YI`
+
+```python
+YI = (1144, 'ii-CN', 'The Yi language.')
+```
+
+The Yi language.
+
+### `YIDDISH`
+
+```python
+YIDDISH = (1085, 'yi-Hebr', 'The Yiddish language.')
+```
+
+The Yiddish language.
+
+### `YORUBA`
+
+```python
+YORUBA = (1130, 'yo-NG', 'The Yoruba language.')
+```
+
+The Yoruba language.
+
+### `ZULU`
+
+```python
+ZULU = (1077, 'zu-ZA', 'The Zulu language.')
+```
+
+The Zulu language.
diff --git a/addons/sandbox/skills/pptx/references/api-002.md b/addons/sandbox/skills/pptx/references/api-002.md
new file mode 100644
index 000000000..084706ccb
--- /dev/null
+++ b/addons/sandbox/skills/pptx/references/api-002.md
@@ -0,0 +1,6140 @@
+
+
+
+
+# `pptx.enum.shapes`
+
+Enumerations used by shapes and related objects.
+
+## `MSO`
+
+```python
+MSO = MSO_SHAPE_TYPE
+```
+
+## `MSO_AUTO_SHAPE_TYPE`
+
+Bases: `BaseXmlEnum`
+
+Specifies a type of AutoShape, e.g. DOWN_ARROW.
+
+Alias: ``MSO_SHAPE``
+
+Example::
+
+ from pptx.enum.shapes import MSO_SHAPE
+ from pptx.util import Inches
+
+ left = top = width = height = Inches(1.0)
+ slide.shapes.add_shape(
+ MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height
+ )
+
+MS API Name: `MsoAutoShapeType`
+
+https://learn.microsoft.com/en-us/office/vba/api/Office.MsoAutoShapeType
+
+### `ACTION_BUTTON_BACK_OR_PREVIOUS`
+
+```python
+ACTION_BUTTON_BACK_OR_PREVIOUS = (129, 'actionButtonBackPrevious', 'Back or Previous button. Supports mouse-click and mouse-over actions')
+```
+
+Back or Previous button. Supports mouse-click and mouse-over actions
+
+### `ACTION_BUTTON_BEGINNING`
+
+```python
+ACTION_BUTTON_BEGINNING = (131, 'actionButtonBeginning', 'Beginning button. Supports mouse-click and mouse-over actions')
+```
+
+Beginning button. Supports mouse-click and mouse-over actions
+
+### `ACTION_BUTTON_CUSTOM`
+
+```python
+ACTION_BUTTON_CUSTOM = (125, 'actionButtonBlank', 'Button with no default picture or text. Supports mouse-click and mouse-over actions')
+```
+
+Button with no default picture or text. Supports mouse-click and mouse-over actions
+
+### `ACTION_BUTTON_DOCUMENT`
+
+```python
+ACTION_BUTTON_DOCUMENT = (134, 'actionButtonDocument', 'Document button. Supports mouse-click and mouse-over actions')
+```
+
+Document button. Supports mouse-click and mouse-over actions
+
+### `ACTION_BUTTON_END`
+
+```python
+ACTION_BUTTON_END = (132, 'actionButtonEnd', 'End button. Supports mouse-click and mouse-over actions')
+```
+
+End button. Supports mouse-click and mouse-over actions
+
+### `ACTION_BUTTON_FORWARD_OR_NEXT`
+
+```python
+ACTION_BUTTON_FORWARD_OR_NEXT = (130, 'actionButtonForwardNext', 'Forward or Next button. Supports mouse-click and mouse-over actions')
+```
+
+Forward or Next button. Supports mouse-click and mouse-over actions
+
+### `ACTION_BUTTON_HELP`
+
+```python
+ACTION_BUTTON_HELP = (127, 'actionButtonHelp', 'Help button. Supports mouse-click and mouse-over actions')
+```
+
+Help button. Supports mouse-click and mouse-over actions
+
+### `ACTION_BUTTON_HOME`
+
+```python
+ACTION_BUTTON_HOME = (126, 'actionButtonHome', 'Home button. Supports mouse-click and mouse-over actions')
+```
+
+Home button. Supports mouse-click and mouse-over actions
+
+### `ACTION_BUTTON_INFORMATION`
+
+```python
+ACTION_BUTTON_INFORMATION = (128, 'actionButtonInformation', 'Information button. Supports mouse-click and mouse-over actions')
+```
+
+Information button. Supports mouse-click and mouse-over actions
+
+### `ACTION_BUTTON_MOVIE`
+
+```python
+ACTION_BUTTON_MOVIE = (136, 'actionButtonMovie', 'Movie button. Supports mouse-click and mouse-over actions')
+```
+
+Movie button. Supports mouse-click and mouse-over actions
+
+### `ACTION_BUTTON_RETURN`
+
+```python
+ACTION_BUTTON_RETURN = (133, 'actionButtonReturn', 'Return button. Supports mouse-click and mouse-over actions')
+```
+
+Return button. Supports mouse-click and mouse-over actions
+
+### `ACTION_BUTTON_SOUND`
+
+```python
+ACTION_BUTTON_SOUND = (135, 'actionButtonSound', 'Sound button. Supports mouse-click and mouse-over actions')
+```
+
+Sound button. Supports mouse-click and mouse-over actions
+
+### `ARC`
+
+```python
+ARC = (25, 'arc', 'Arc')
+```
+
+Arc
+
+### `BALLOON`
+
+```python
+BALLOON = (137, 'wedgeRoundRectCallout', 'Rounded Rectangular Callout')
+```
+
+Rounded Rectangular Callout
+
+### `BENT_ARROW`
+
+```python
+BENT_ARROW = (41, 'bentArrow', 'Block arrow that follows a curved 90-degree angle')
+```
+
+Block arrow that follows a curved 90-degree angle
+
+### `BENT_UP_ARROW`
+
+```python
+BENT_UP_ARROW = (44, 'bentUpArrow', 'Block arrow that follows a sharp 90-degree angle. Points up by default')
+```
+
+Block arrow that follows a sharp 90-degree angle. Points up by default
+
+### `BEVEL`
+
+```python
+BEVEL = (15, 'bevel', 'Bevel')
+```
+
+Bevel
+
+### `BLOCK_ARC`
+
+```python
+BLOCK_ARC = (20, 'blockArc', 'Block arc')
+```
+
+Block arc
+
+### `CAN`
+
+```python
+CAN = (13, 'can', 'Can')
+```
+
+Can
+
+### `CHART_PLUS`
+
+```python
+CHART_PLUS = (182, 'chartPlus', 'Chart Plus')
+```
+
+Chart Plus
+
+### `CHART_STAR`
+
+```python
+CHART_STAR = (181, 'chartStar', 'Chart Star')
+```
+
+Chart Star
+
+### `CHART_X`
+
+```python
+CHART_X = (180, 'chartX', 'Chart X')
+```
+
+Chart X
+
+### `CHEVRON`
+
+```python
+CHEVRON = (52, 'chevron', 'Chevron')
+```
+
+Chevron
+
+### `CHORD`
+
+```python
+CHORD = (161, 'chord', 'Geometric chord shape')
+```
+
+Geometric chord shape
+
+### `CIRCULAR_ARROW`
+
+```python
+CIRCULAR_ARROW = (60, 'circularArrow', 'Block arrow that follows a curved 180-degree angle')
+```
+
+Block arrow that follows a curved 180-degree angle
+
+### `CLOUD`
+
+```python
+CLOUD = (179, 'cloud', 'Cloud')
+```
+
+Cloud
+
+### `CLOUD_CALLOUT`
+
+```python
+CLOUD_CALLOUT = (108, 'cloudCallout', 'Cloud callout')
+```
+
+Cloud callout
+
+### `CORNER`
+
+```python
+CORNER = (162, 'corner', 'Corner')
+```
+
+Corner
+
+### `CORNER_TABS`
+
+```python
+CORNER_TABS = (169, 'cornerTabs', 'Corner Tabs')
+```
+
+Corner Tabs
+
+### `CROSS`
+
+```python
+CROSS = (11, 'plus', 'Cross')
+```
+
+Cross
+
+### `CUBE`
+
+```python
+CUBE = (14, 'cube', 'Cube')
+```
+
+Cube
+
+### `CURVED_DOWN_ARROW`
+
+```python
+CURVED_DOWN_ARROW = (48, 'curvedDownArrow', 'Block arrow that curves down')
+```
+
+Block arrow that curves down
+
+### `CURVED_DOWN_RIBBON`
+
+```python
+CURVED_DOWN_RIBBON = (100, 'ellipseRibbon', 'Ribbon banner that curves down')
+```
+
+Ribbon banner that curves down
+
+### `CURVED_LEFT_ARROW`
+
+```python
+CURVED_LEFT_ARROW = (46, 'curvedLeftArrow', 'Block arrow that curves left')
+```
+
+Block arrow that curves left
+
+### `CURVED_RIGHT_ARROW`
+
+```python
+CURVED_RIGHT_ARROW = (45, 'curvedRightArrow', 'Block arrow that curves right')
+```
+
+Block arrow that curves right
+
+### `CURVED_UP_ARROW`
+
+```python
+CURVED_UP_ARROW = (47, 'curvedUpArrow', 'Block arrow that curves up')
+```
+
+Block arrow that curves up
+
+### `CURVED_UP_RIBBON`
+
+```python
+CURVED_UP_RIBBON = (99, 'ellipseRibbon2', 'Ribbon banner that curves up')
+```
+
+Ribbon banner that curves up
+
+### `DECAGON`
+
+```python
+DECAGON = (144, 'decagon', 'Decagon')
+```
+
+Decagon
+
+### `DIAGONAL_STRIPE`
+
+```python
+DIAGONAL_STRIPE = (141, 'diagStripe', 'Diagonal Stripe')
+```
+
+Diagonal Stripe
+
+### `DIAMOND`
+
+```python
+DIAMOND = (4, 'diamond', 'Diamond')
+```
+
+Diamond
+
+### `DODECAGON`
+
+```python
+DODECAGON = (146, 'dodecagon', 'Dodecagon')
+```
+
+Dodecagon
+
+### `DONUT`
+
+```python
+DONUT = (18, 'donut', 'Donut')
+```
+
+Donut
+
+### `DOUBLE_BRACE`
+
+```python
+DOUBLE_BRACE = (27, 'bracePair', 'Double brace')
+```
+
+Double brace
+
+### `DOUBLE_BRACKET`
+
+```python
+DOUBLE_BRACKET = (26, 'bracketPair', 'Double bracket')
+```
+
+Double bracket
+
+### `DOUBLE_WAVE`
+
+```python
+DOUBLE_WAVE = (104, 'doubleWave', 'Double wave')
+```
+
+Double wave
+
+### `DOWN_ARROW`
+
+```python
+DOWN_ARROW = (36, 'downArrow', 'Block arrow that points down')
+```
+
+Block arrow that points down
+
+### `DOWN_ARROW_CALLOUT`
+
+```python
+DOWN_ARROW_CALLOUT = (56, 'downArrowCallout', 'Callout with arrow that points down')
+```
+
+Callout with arrow that points down
+
+### `DOWN_RIBBON`
+
+```python
+DOWN_RIBBON = (98, 'ribbon', 'Ribbon banner with center area below ribbon ends')
+```
+
+Ribbon banner with center area below ribbon ends
+
+### `EXPLOSION1`
+
+```python
+EXPLOSION1 = (89, 'irregularSeal1', 'Explosion')
+```
+
+Explosion
+
+### `EXPLOSION2`
+
+```python
+EXPLOSION2 = (90, 'irregularSeal2', 'Explosion')
+```
+
+Explosion
+
+### `FLOWCHART_ALTERNATE_PROCESS`
+
+```python
+FLOWCHART_ALTERNATE_PROCESS = (62, 'flowChartAlternateProcess', 'Alternate process flowchart symbol')
+```
+
+Alternate process flowchart symbol
+
+### `FLOWCHART_CARD`
+
+```python
+FLOWCHART_CARD = (75, 'flowChartPunchedCard', 'Card flowchart symbol')
+```
+
+Card flowchart symbol
+
+### `FLOWCHART_COLLATE`
+
+```python
+FLOWCHART_COLLATE = (79, 'flowChartCollate', 'Collate flowchart symbol')
+```
+
+Collate flowchart symbol
+
+### `FLOWCHART_CONNECTOR`
+
+```python
+FLOWCHART_CONNECTOR = (73, 'flowChartConnector', 'Connector flowchart symbol')
+```
+
+Connector flowchart symbol
+
+### `FLOWCHART_DATA`
+
+```python
+FLOWCHART_DATA = (64, 'flowChartInputOutput', 'Data flowchart symbol')
+```
+
+Data flowchart symbol
+
+### `FLOWCHART_DECISION`
+
+```python
+FLOWCHART_DECISION = (63, 'flowChartDecision', 'Decision flowchart symbol')
+```
+
+Decision flowchart symbol
+
+### `FLOWCHART_DELAY`
+
+```python
+FLOWCHART_DELAY = (84, 'flowChartDelay', 'Delay flowchart symbol')
+```
+
+Delay flowchart symbol
+
+### `FLOWCHART_DIRECT_ACCESS_STORAGE`
+
+```python
+FLOWCHART_DIRECT_ACCESS_STORAGE = (87, 'flowChartMagneticDrum', 'Direct access storage flowchart symbol')
+```
+
+Direct access storage flowchart symbol
+
+### `FLOWCHART_DISPLAY`
+
+```python
+FLOWCHART_DISPLAY = (88, 'flowChartDisplay', 'Display flowchart symbol')
+```
+
+Display flowchart symbol
+
+### `FLOWCHART_DOCUMENT`
+
+```python
+FLOWCHART_DOCUMENT = (67, 'flowChartDocument', 'Document flowchart symbol')
+```
+
+Document flowchart symbol
+
+### `FLOWCHART_EXTRACT`
+
+```python
+FLOWCHART_EXTRACT = (81, 'flowChartExtract', 'Extract flowchart symbol')
+```
+
+Extract flowchart symbol
+
+### `FLOWCHART_INTERNAL_STORAGE`
+
+```python
+FLOWCHART_INTERNAL_STORAGE = (66, 'flowChartInternalStorage', 'Internal storage flowchart symbol')
+```
+
+Internal storage flowchart symbol
+
+### `FLOWCHART_MAGNETIC_DISK`
+
+```python
+FLOWCHART_MAGNETIC_DISK = (86, 'flowChartMagneticDisk', 'Magnetic disk flowchart symbol')
+```
+
+Magnetic disk flowchart symbol
+
+### `FLOWCHART_MANUAL_INPUT`
+
+```python
+FLOWCHART_MANUAL_INPUT = (71, 'flowChartManualInput', 'Manual input flowchart symbol')
+```
+
+Manual input flowchart symbol
+
+### `FLOWCHART_MANUAL_OPERATION`
+
+```python
+FLOWCHART_MANUAL_OPERATION = (72, 'flowChartManualOperation', 'Manual operation flowchart symbol')
+```
+
+Manual operation flowchart symbol
+
+### `FLOWCHART_MERGE`
+
+```python
+FLOWCHART_MERGE = (82, 'flowChartMerge', 'Merge flowchart symbol')
+```
+
+Merge flowchart symbol
+
+### `FLOWCHART_MULTIDOCUMENT`
+
+```python
+FLOWCHART_MULTIDOCUMENT = (68, 'flowChartMultidocument', 'Multi-document flowchart symbol')
+```
+
+Multi-document flowchart symbol
+
+### `FLOWCHART_OFFLINE_STORAGE`
+
+```python
+FLOWCHART_OFFLINE_STORAGE = (139, 'flowChartOfflineStorage', 'Offline Storage')
+```
+
+Offline Storage
+
+### `FLOWCHART_OFFPAGE_CONNECTOR`
+
+```python
+FLOWCHART_OFFPAGE_CONNECTOR = (74, 'flowChartOffpageConnector', 'Off-page connector flowchart symbol')
+```
+
+Off-page connector flowchart symbol
+
+### `FLOWCHART_OR`
+
+```python
+FLOWCHART_OR = (78, 'flowChartOr', '"Or" flowchart symbol')
+```
+
+"Or" flowchart symbol
+
+### `FLOWCHART_PREDEFINED_PROCESS`
+
+```python
+FLOWCHART_PREDEFINED_PROCESS = (65, 'flowChartPredefinedProcess', 'Predefined process flowchart symbol')
+```
+
+Predefined process flowchart symbol
+
+### `FLOWCHART_PREPARATION`
+
+```python
+FLOWCHART_PREPARATION = (70, 'flowChartPreparation', 'Preparation flowchart symbol')
+```
+
+Preparation flowchart symbol
+
+### `FLOWCHART_PROCESS`
+
+```python
+FLOWCHART_PROCESS = (61, 'flowChartProcess', 'Process flowchart symbol')
+```
+
+Process flowchart symbol
+
+### `FLOWCHART_PUNCHED_TAPE`
+
+```python
+FLOWCHART_PUNCHED_TAPE = (76, 'flowChartPunchedTape', 'Punched tape flowchart symbol')
+```
+
+Punched tape flowchart symbol
+
+### `FLOWCHART_SEQUENTIAL_ACCESS_STORAGE`
+
+```python
+FLOWCHART_SEQUENTIAL_ACCESS_STORAGE = (85, 'flowChartMagneticTape', 'Sequential access storage flowchart symbol')
+```
+
+Sequential access storage flowchart symbol
+
+### `FLOWCHART_SORT`
+
+```python
+FLOWCHART_SORT = (80, 'flowChartSort', 'Sort flowchart symbol')
+```
+
+Sort flowchart symbol
+
+### `FLOWCHART_STORED_DATA`
+
+```python
+FLOWCHART_STORED_DATA = (83, 'flowChartOnlineStorage', 'Stored data flowchart symbol')
+```
+
+Stored data flowchart symbol
+
+### `FLOWCHART_SUMMING_JUNCTION`
+
+```python
+FLOWCHART_SUMMING_JUNCTION = (77, 'flowChartSummingJunction', 'Summing junction flowchart symbol')
+```
+
+Summing junction flowchart symbol
+
+### `FLOWCHART_TERMINATOR`
+
+```python
+FLOWCHART_TERMINATOR = (69, 'flowChartTerminator', 'Terminator flowchart symbol')
+```
+
+Terminator flowchart symbol
+
+### `FOLDED_CORNER`
+
+```python
+FOLDED_CORNER = (16, 'foldedCorner', 'Folded corner')
+```
+
+Folded corner
+
+### `FRAME`
+
+```python
+FRAME = (158, 'frame', 'Frame')
+```
+
+Frame
+
+### `FUNNEL`
+
+```python
+FUNNEL = (174, 'funnel', 'Funnel')
+```
+
+Funnel
+
+### `GEAR_6`
+
+```python
+GEAR_6 = (172, 'gear6', 'Gear 6')
+```
+
+Gear 6
+
+### `GEAR_9`
+
+```python
+GEAR_9 = (173, 'gear9', 'Gear 9')
+```
+
+Gear 9
+
+### `HALF_FRAME`
+
+```python
+HALF_FRAME = (159, 'halfFrame', 'Half Frame')
+```
+
+Half Frame
+
+### `HEART`
+
+```python
+HEART = (21, 'heart', 'Heart')
+```
+
+Heart
+
+### `HEPTAGON`
+
+```python
+HEPTAGON = (145, 'heptagon', 'Heptagon')
+```
+
+Heptagon
+
+### `HEXAGON`
+
+```python
+HEXAGON = (10, 'hexagon', 'Hexagon')
+```
+
+Hexagon
+
+### `HORIZONTAL_SCROLL`
+
+```python
+HORIZONTAL_SCROLL = (102, 'horizontalScroll', 'Horizontal scroll')
+```
+
+Horizontal scroll
+
+### `ISOSCELES_TRIANGLE`
+
+```python
+ISOSCELES_TRIANGLE = (7, 'triangle', 'Isosceles triangle')
+```
+
+Isosceles triangle
+
+### `LEFT_ARROW`
+
+```python
+LEFT_ARROW = (34, 'leftArrow', 'Block arrow that points left')
+```
+
+Block arrow that points left
+
+### `LEFT_ARROW_CALLOUT`
+
+```python
+LEFT_ARROW_CALLOUT = (54, 'leftArrowCallout', 'Callout with arrow that points left')
+```
+
+Callout with arrow that points left
+
+### `LEFT_BRACE`
+
+```python
+LEFT_BRACE = (31, 'leftBrace', 'Left brace')
+```
+
+Left brace
+
+### `LEFT_BRACKET`
+
+```python
+LEFT_BRACKET = (29, 'leftBracket', 'Left bracket')
+```
+
+Left bracket
+
+### `LEFT_CIRCULAR_ARROW`
+
+```python
+LEFT_CIRCULAR_ARROW = (176, 'leftCircularArrow', 'Left Circular Arrow')
+```
+
+Left Circular Arrow
+
+### `LEFT_RIGHT_ARROW`
+
+```python
+LEFT_RIGHT_ARROW = (37, 'leftRightArrow', 'Block arrow with arrowheads that point both left and right')
+```
+
+Block arrow with arrowheads that point both left and right
+
+### `LEFT_RIGHT_ARROW_CALLOUT`
+
+```python
+LEFT_RIGHT_ARROW_CALLOUT = (57, 'leftRightArrowCallout', 'Callout with arrowheads that point both left and right')
+```
+
+Callout with arrowheads that point both left and right
+
+### `LEFT_RIGHT_CIRCULAR_ARROW`
+
+```python
+LEFT_RIGHT_CIRCULAR_ARROW = (177, 'leftRightCircularArrow', 'Left Right Circular Arrow')
+```
+
+Left Right Circular Arrow
+
+### `LEFT_RIGHT_RIBBON`
+
+```python
+LEFT_RIGHT_RIBBON = (140, 'leftRightRibbon', 'Left Right Ribbon')
+```
+
+Left Right Ribbon
+
+### `LEFT_RIGHT_UP_ARROW`
+
+```python
+LEFT_RIGHT_UP_ARROW = (40, 'leftRightUpArrow', 'Block arrow with arrowheads that point left, right, and up')
+```
+
+Block arrow with arrowheads that point left, right, and up
+
+### `LEFT_UP_ARROW`
+
+```python
+LEFT_UP_ARROW = (43, 'leftUpArrow', 'Block arrow with arrowheads that point left and up')
+```
+
+Block arrow with arrowheads that point left and up
+
+### `LIGHTNING_BOLT`
+
+```python
+LIGHTNING_BOLT = (22, 'lightningBolt', 'Lightning bolt')
+```
+
+Lightning bolt
+
+### `LINE_CALLOUT_1`
+
+```python
+LINE_CALLOUT_1 = (109, 'borderCallout1', 'Callout with border and horizontal callout line')
+```
+
+Callout with border and horizontal callout line
+
+### `LINE_CALLOUT_1_ACCENT_BAR`
+
+```python
+LINE_CALLOUT_1_ACCENT_BAR = (113, 'accentCallout1', 'Callout with vertical accent bar')
+```
+
+Callout with vertical accent bar
+
+### `LINE_CALLOUT_1_BORDER_AND_ACCENT_BAR`
+
+```python
+LINE_CALLOUT_1_BORDER_AND_ACCENT_BAR = (121, 'accentBorderCallout1', 'Callout with border and vertical accent bar')
+```
+
+Callout with border and vertical accent bar
+
+### `LINE_CALLOUT_1_NO_BORDER`
+
+```python
+LINE_CALLOUT_1_NO_BORDER = (117, 'callout1', 'Callout with horizontal line')
+```
+
+Callout with horizontal line
+
+### `LINE_CALLOUT_2`
+
+```python
+LINE_CALLOUT_2 = (110, 'borderCallout2', 'Callout with diagonal straight line')
+```
+
+Callout with diagonal straight line
+
+### `LINE_CALLOUT_2_ACCENT_BAR`
+
+```python
+LINE_CALLOUT_2_ACCENT_BAR = (114, 'accentCallout2', 'Callout with diagonal callout line and accent bar')
+```
+
+Callout with diagonal callout line and accent bar
+
+### `LINE_CALLOUT_2_BORDER_AND_ACCENT_BAR`
+
+```python
+LINE_CALLOUT_2_BORDER_AND_ACCENT_BAR = (122, 'accentBorderCallout2', 'Callout with border, diagonal straight line, and accent bar')
+```
+
+Callout with border, diagonal straight line, and accent bar
+
+### `LINE_CALLOUT_2_NO_BORDER`
+
+```python
+LINE_CALLOUT_2_NO_BORDER = (118, 'callout2', 'Callout with no border and diagonal callout line')
+```
+
+Callout with no border and diagonal callout line
+
+### `LINE_CALLOUT_3`
+
+```python
+LINE_CALLOUT_3 = (111, 'borderCallout3', 'Callout with angled line')
+```
+
+Callout with angled line
+
+### `LINE_CALLOUT_3_ACCENT_BAR`
+
+```python
+LINE_CALLOUT_3_ACCENT_BAR = (115, 'accentCallout3', 'Callout with angled callout line and accent bar')
+```
+
+Callout with angled callout line and accent bar
+
+### `LINE_CALLOUT_3_BORDER_AND_ACCENT_BAR`
+
+```python
+LINE_CALLOUT_3_BORDER_AND_ACCENT_BAR = (123, 'accentBorderCallout3', 'Callout with border, angled callout line, and accent bar')
+```
+
+Callout with border, angled callout line, and accent bar
+
+### `LINE_CALLOUT_3_NO_BORDER`
+
+```python
+LINE_CALLOUT_3_NO_BORDER = (119, 'callout3', 'Callout with no border and angled callout line')
+```
+
+Callout with no border and angled callout line
+
+### `LINE_CALLOUT_4`
+
+```python
+LINE_CALLOUT_4 = (112, 'borderCallout3', 'Callout with callout line segments forming a U-shape.')
+```
+
+Callout with callout line segments forming a U-shape.
+
+### `LINE_CALLOUT_4_ACCENT_BAR`
+
+```python
+LINE_CALLOUT_4_ACCENT_BAR = (116, 'accentCallout3', 'Callout with accent bar and callout line segments forming a U-shape.')
+```
+
+Callout with accent bar and callout line segments forming a U-shape.
+
+### `LINE_CALLOUT_4_BORDER_AND_ACCENT_BAR`
+
+```python
+LINE_CALLOUT_4_BORDER_AND_ACCENT_BAR = (124, 'accentBorderCallout3', 'Callout with border, accent bar, and callout line segments forming a U-shape.')
+```
+
+Callout with border, accent bar, and callout line segments forming a U-shape.
+
+### `LINE_CALLOUT_4_NO_BORDER`
+
+```python
+LINE_CALLOUT_4_NO_BORDER = (120, 'callout3', 'Callout with no border and callout line segments forming a U-shape.')
+```
+
+Callout with no border and callout line segments forming a U-shape.
+
+### `LINE_INVERSE`
+
+```python
+LINE_INVERSE = (183, 'lineInv', 'Straight Connector')
+```
+
+Straight Connector
+
+### `MATH_DIVIDE`
+
+```python
+MATH_DIVIDE = (166, 'mathDivide', 'Division')
+```
+
+Division
+
+### `MATH_EQUAL`
+
+```python
+MATH_EQUAL = (167, 'mathEqual', 'Equal')
+```
+
+Equal
+
+### `MATH_MINUS`
+
+```python
+MATH_MINUS = (164, 'mathMinus', 'Minus')
+```
+
+Minus
+
+### `MATH_MULTIPLY`
+
+```python
+MATH_MULTIPLY = (165, 'mathMultiply', 'Multiply')
+```
+
+Multiply
+
+### `MATH_NOT_EQUAL`
+
+```python
+MATH_NOT_EQUAL = (168, 'mathNotEqual', 'Not Equal')
+```
+
+Not Equal
+
+### `MATH_PLUS`
+
+```python
+MATH_PLUS = (163, 'mathPlus', 'Plus')
+```
+
+Plus
+
+### `MOON`
+
+```python
+MOON = (24, 'moon', 'Moon')
+```
+
+Moon
+
+### `NON_ISOSCELES_TRAPEZOID`
+
+```python
+NON_ISOSCELES_TRAPEZOID = (143, 'nonIsoscelesTrapezoid', 'Non-isosceles Trapezoid')
+```
+
+Non-isosceles Trapezoid
+
+### `NOTCHED_RIGHT_ARROW`
+
+```python
+NOTCHED_RIGHT_ARROW = (50, 'notchedRightArrow', 'Notched block arrow that points right')
+```
+
+Notched block arrow that points right
+
+### `NO_SYMBOL`
+
+```python
+NO_SYMBOL = (19, 'noSmoking', "'No' Symbol")
+```
+
+'No' Symbol
+
+### `OCTAGON`
+
+```python
+OCTAGON = (6, 'octagon', 'Octagon')
+```
+
+Octagon
+
+### `OVAL`
+
+```python
+OVAL = (9, 'ellipse', 'Oval')
+```
+
+Oval
+
+### `OVAL_CALLOUT`
+
+```python
+OVAL_CALLOUT = (107, 'wedgeEllipseCallout', 'Oval-shaped callout')
+```
+
+Oval-shaped callout
+
+### `PARALLELOGRAM`
+
+```python
+PARALLELOGRAM = (2, 'parallelogram', 'Parallelogram')
+```
+
+Parallelogram
+
+### `PENTAGON`
+
+```python
+PENTAGON = (51, 'homePlate', 'Pentagon')
+```
+
+Pentagon
+
+### `PIE`
+
+```python
+PIE = (142, 'pie', 'Pie')
+```
+
+Pie
+
+### `PIE_WEDGE`
+
+```python
+PIE_WEDGE = (175, 'pieWedge', 'Pie')
+```
+
+Pie
+
+### `PLAQUE`
+
+```python
+PLAQUE = (28, 'plaque', 'Plaque')
+```
+
+Plaque
+
+### `PLAQUE_TABS`
+
+```python
+PLAQUE_TABS = (171, 'plaqueTabs', 'Plaque Tabs')
+```
+
+Plaque Tabs
+
+### `QUAD_ARROW`
+
+```python
+QUAD_ARROW = (39, 'quadArrow', 'Block arrows that point up, down, left, and right')
+```
+
+Block arrows that point up, down, left, and right
+
+### `QUAD_ARROW_CALLOUT`
+
+```python
+QUAD_ARROW_CALLOUT = (59, 'quadArrowCallout', 'Callout with arrows that point up, down, left, and right')
+```
+
+Callout with arrows that point up, down, left, and right
+
+### `RECTANGLE`
+
+```python
+RECTANGLE = (1, 'rect', 'Rectangle')
+```
+
+Rectangle
+
+### `RECTANGULAR_CALLOUT`
+
+```python
+RECTANGULAR_CALLOUT = (105, 'wedgeRectCallout', 'Rectangular callout')
+```
+
+Rectangular callout
+
+### `REGULAR_PENTAGON`
+
+```python
+REGULAR_PENTAGON = (12, 'pentagon', 'Pentagon')
+```
+
+Pentagon
+
+### `RIGHT_ARROW`
+
+```python
+RIGHT_ARROW = (33, 'rightArrow', 'Block arrow that points right')
+```
+
+Block arrow that points right
+
+### `RIGHT_ARROW_CALLOUT`
+
+```python
+RIGHT_ARROW_CALLOUT = (53, 'rightArrowCallout', 'Callout with arrow that points right')
+```
+
+Callout with arrow that points right
+
+### `RIGHT_BRACE`
+
+```python
+RIGHT_BRACE = (32, 'rightBrace', 'Right brace')
+```
+
+Right brace
+
+### `RIGHT_BRACKET`
+
+```python
+RIGHT_BRACKET = (30, 'rightBracket', 'Right bracket')
+```
+
+Right bracket
+
+### `RIGHT_TRIANGLE`
+
+```python
+RIGHT_TRIANGLE = (8, 'rtTriangle', 'Right triangle')
+```
+
+Right triangle
+
+### `ROUNDED_RECTANGLE`
+
+```python
+ROUNDED_RECTANGLE = (5, 'roundRect', 'Rounded rectangle')
+```
+
+Rounded rectangle
+
+### `ROUNDED_RECTANGULAR_CALLOUT`
+
+```python
+ROUNDED_RECTANGULAR_CALLOUT = (106, 'wedgeRoundRectCallout', 'Rounded rectangle-shaped callout')
+```
+
+Rounded rectangle-shaped callout
+
+### `ROUND_1_RECTANGLE`
+
+```python
+ROUND_1_RECTANGLE = (151, 'round1Rect', 'Round Single Corner Rectangle')
+```
+
+Round Single Corner Rectangle
+
+### `ROUND_2_DIAG_RECTANGLE`
+
+```python
+ROUND_2_DIAG_RECTANGLE = (153, 'round2DiagRect', 'Round Diagonal Corner Rectangle')
+```
+
+Round Diagonal Corner Rectangle
+
+### `ROUND_2_SAME_RECTANGLE`
+
+```python
+ROUND_2_SAME_RECTANGLE = (152, 'round2SameRect', 'Round Same Side Corner Rectangle')
+```
+
+Round Same Side Corner Rectangle
+
+### `SMILEY_FACE`
+
+```python
+SMILEY_FACE = (17, 'smileyFace', 'Smiley face')
+```
+
+Smiley face
+
+### `SNIP_1_RECTANGLE`
+
+```python
+SNIP_1_RECTANGLE = (155, 'snip1Rect', 'Snip Single Corner Rectangle')
+```
+
+Snip Single Corner Rectangle
+
+### `SNIP_2_DIAG_RECTANGLE`
+
+```python
+SNIP_2_DIAG_RECTANGLE = (157, 'snip2DiagRect', 'Snip Diagonal Corner Rectangle')
+```
+
+Snip Diagonal Corner Rectangle
+
+### `SNIP_2_SAME_RECTANGLE`
+
+```python
+SNIP_2_SAME_RECTANGLE = (156, 'snip2SameRect', 'Snip Same Side Corner Rectangle')
+```
+
+Snip Same Side Corner Rectangle
+
+### `SNIP_ROUND_RECTANGLE`
+
+```python
+SNIP_ROUND_RECTANGLE = (154, 'snipRoundRect', 'Snip and Round Single Corner Rectangle')
+```
+
+Snip and Round Single Corner Rectangle
+
+### `SQUARE_TABS`
+
+```python
+SQUARE_TABS = (170, 'squareTabs', 'Square Tabs')
+```
+
+Square Tabs
+
+### `STAR_10_POINT`
+
+```python
+STAR_10_POINT = (149, 'star10', '10-Point Star')
+```
+
+10-Point Star
+
+### `STAR_12_POINT`
+
+```python
+STAR_12_POINT = (150, 'star12', '12-Point Star')
+```
+
+12-Point Star
+
+### `STAR_16_POINT`
+
+```python
+STAR_16_POINT = (94, 'star16', '16-point star')
+```
+
+16-point star
+
+### `STAR_24_POINT`
+
+```python
+STAR_24_POINT = (95, 'star24', '24-point star')
+```
+
+24-point star
+
+### `STAR_32_POINT`
+
+```python
+STAR_32_POINT = (96, 'star32', '32-point star')
+```
+
+32-point star
+
+### `STAR_4_POINT`
+
+```python
+STAR_4_POINT = (91, 'star4', '4-point star')
+```
+
+4-point star
+
+### `STAR_5_POINT`
+
+```python
+STAR_5_POINT = (92, 'star5', '5-point star')
+```
+
+5-point star
+
+### `STAR_6_POINT`
+
+```python
+STAR_6_POINT = (147, 'star6', '6-Point Star')
+```
+
+6-Point Star
+
+### `STAR_7_POINT`
+
+```python
+STAR_7_POINT = (148, 'star7', '7-Point Star')
+```
+
+7-Point Star
+
+### `STAR_8_POINT`
+
+```python
+STAR_8_POINT = (93, 'star8', '8-point star')
+```
+
+8-point star
+
+### `STRIPED_RIGHT_ARROW`
+
+```python
+STRIPED_RIGHT_ARROW = (49, 'stripedRightArrow', 'Block arrow that points right with stripes at the tail')
+```
+
+Block arrow that points right with stripes at the tail
+
+### `SUN`
+
+```python
+SUN = (23, 'sun', 'Sun')
+```
+
+Sun
+
+### `SWOOSH_ARROW`
+
+```python
+SWOOSH_ARROW = (178, 'swooshArrow', 'Swoosh Arrow')
+```
+
+Swoosh Arrow
+
+### `TEAR`
+
+```python
+TEAR = (160, 'teardrop', 'Teardrop')
+```
+
+Teardrop
+
+### `TRAPEZOID`
+
+```python
+TRAPEZOID = (3, 'trapezoid', 'Trapezoid')
+```
+
+Trapezoid
+
+### `UP_ARROW`
+
+```python
+UP_ARROW = (35, 'upArrow', 'Block arrow that points up')
+```
+
+Block arrow that points up
+
+### `UP_ARROW_CALLOUT`
+
+```python
+UP_ARROW_CALLOUT = (55, 'upArrowCallout', 'Callout with arrow that points up')
+```
+
+Callout with arrow that points up
+
+### `UP_DOWN_ARROW`
+
+```python
+UP_DOWN_ARROW = (38, 'upDownArrow', 'Block arrow that points up and down')
+```
+
+Block arrow that points up and down
+
+### `UP_DOWN_ARROW_CALLOUT`
+
+```python
+UP_DOWN_ARROW_CALLOUT = (58, 'upDownArrowCallout', 'Callout with arrows that point up and down')
+```
+
+Callout with arrows that point up and down
+
+### `UP_RIBBON`
+
+```python
+UP_RIBBON = (97, 'ribbon2', 'Ribbon banner with center area above ribbon ends')
+```
+
+Ribbon banner with center area above ribbon ends
+
+### `U_TURN_ARROW`
+
+```python
+U_TURN_ARROW = (42, 'uturnArrow', 'Block arrow forming a U shape')
+```
+
+Block arrow forming a U shape
+
+### `VERTICAL_SCROLL`
+
+```python
+VERTICAL_SCROLL = (101, 'verticalScroll', 'Vertical scroll')
+```
+
+Vertical scroll
+
+### `WAVE`
+
+```python
+WAVE = (103, 'wave', 'Wave')
+```
+
+Wave
+
+## `MSO_CONNECTOR`
+
+```python
+MSO_CONNECTOR = MSO_CONNECTOR_TYPE
+```
+
+## `MSO_CONNECTOR_TYPE`
+
+Bases: `BaseXmlEnum`
+
+Specifies a type of connector.
+
+Alias: ``MSO_CONNECTOR``
+
+Example::
+
+ from pptx.enum.shapes import MSO_CONNECTOR
+ from pptx.util import Cm
+
+ shapes = prs.slides[0].shapes
+ connector = shapes.add_connector(
+ MSO_CONNECTOR.STRAIGHT, Cm(2), Cm(2), Cm(10), Cm(10)
+ )
+ assert connector.left.cm == 2
+
+MS API Name: `MsoConnectorType`
+
+http://msdn.microsoft.com/en-us/library/office/ff860918.aspx
+
+### `CURVE`
+
+```python
+CURVE = (3, 'curvedConnector3', 'Curved connector.')
+```
+
+Curved connector.
+
+### `ELBOW`
+
+```python
+ELBOW = (2, 'bentConnector3', 'Elbow connector.')
+```
+
+Elbow connector.
+
+### `MIXED`
+
+```python
+MIXED = (-2, '', 'Return value only; indicates a combination of other states.')
+```
+
+Return value only; indicates a combination of other states.
+
+### `STRAIGHT`
+
+```python
+STRAIGHT = (1, 'line', 'Straight line connector.')
+```
+
+Straight line connector.
+
+## `MSO_SHAPE`
+
+```python
+MSO_SHAPE = MSO_AUTO_SHAPE_TYPE
+```
+
+## `MSO_SHAPE_TYPE`
+
+Bases: `BaseEnum`
+
+Specifies the type of a shape, more specifically than the five base types.
+
+Alias: ``MSO``
+
+Example::
+
+ from pptx.enum.shapes import MSO_SHAPE_TYPE
+
+ assert shape.type == MSO_SHAPE_TYPE.PICTURE
+
+MS API Name: `MsoShapeType`
+
+http://msdn.microsoft.com/en-us/library/office/ff860759(v=office.15).aspx
+
+### `AUTO_SHAPE`
+
+```python
+AUTO_SHAPE = (1, 'AutoShape')
+```
+
+AutoShape
+
+### `CALLOUT`
+
+```python
+CALLOUT = (2, 'Callout shape')
+```
+
+Callout shape
+
+### `CANVAS`
+
+```python
+CANVAS = (20, 'Drawing canvas')
+```
+
+Drawing canvas
+
+### `CHART`
+
+```python
+CHART = (3, 'Chart, e.g. pie chart, bar chart')
+```
+
+Chart, e.g. pie chart, bar chart
+
+### `COMMENT`
+
+```python
+COMMENT = (4, 'Comment')
+```
+
+Comment
+
+### `DIAGRAM`
+
+```python
+DIAGRAM = (21, 'Diagram')
+```
+
+Diagram
+
+### `EMBEDDED_OLE_OBJECT`
+
+```python
+EMBEDDED_OLE_OBJECT = (7, 'Embedded OLE object')
+```
+
+Embedded OLE object
+
+### `FORM_CONTROL`
+
+```python
+FORM_CONTROL = (8, 'Form control')
+```
+
+Form control
+
+### `FREEFORM`
+
+```python
+FREEFORM = (5, 'Freeform')
+```
+
+Freeform
+
+### `GROUP`
+
+```python
+GROUP = (6, 'Group shape')
+```
+
+Group shape
+
+### `IGX_GRAPHIC`
+
+```python
+IGX_GRAPHIC = (24, 'SmartArt graphic')
+```
+
+SmartArt graphic
+
+### `INK`
+
+```python
+INK = (22, 'Ink')
+```
+
+Ink
+
+### `INK_COMMENT`
+
+```python
+INK_COMMENT = (23, 'Ink Comment')
+```
+
+Ink Comment
+
+### `LINE`
+
+```python
+LINE = (9, 'Line')
+```
+
+Line
+
+### `LINKED_OLE_OBJECT`
+
+```python
+LINKED_OLE_OBJECT = (10, 'Linked OLE object')
+```
+
+Linked OLE object
+
+### `LINKED_PICTURE`
+
+```python
+LINKED_PICTURE = (11, 'Linked picture')
+```
+
+Linked picture
+
+### `MEDIA`
+
+```python
+MEDIA = (16, 'Media')
+```
+
+Media
+
+### `MIXED`
+
+```python
+MIXED = (-2, 'Multiple shape types (read-only).')
+```
+
+Multiple shape types (read-only).
+
+### `OLE_CONTROL_OBJECT`
+
+```python
+OLE_CONTROL_OBJECT = (12, 'OLE control object')
+```
+
+OLE control object
+
+### `PICTURE`
+
+```python
+PICTURE = (13, 'Picture')
+```
+
+Picture
+
+### `PLACEHOLDER`
+
+```python
+PLACEHOLDER = (14, 'Placeholder')
+```
+
+Placeholder
+
+### `SCRIPT_ANCHOR`
+
+```python
+SCRIPT_ANCHOR = (18, 'Script anchor')
+```
+
+Script anchor
+
+### `TABLE`
+
+```python
+TABLE = (19, 'Table')
+```
+
+Table
+
+### `TEXT_BOX`
+
+```python
+TEXT_BOX = (17, 'Text box')
+```
+
+Text box
+
+### `TEXT_EFFECT`
+
+```python
+TEXT_EFFECT = (15, 'Text effect')
+```
+
+Text effect
+
+### `WEB_VIDEO`
+
+```python
+WEB_VIDEO = (26, 'Web video')
+```
+
+Web video
+
+## `PP_MEDIA_TYPE`
+
+Bases: `BaseEnum`
+
+Indicates the OLE media type.
+
+Example::
+
+ from pptx.enum.shapes import PP_MEDIA_TYPE
+
+ movie = slide.shapes[0]
+ assert movie.media_type == PP_MEDIA_TYPE.MOVIE
+
+MS API Name: `PpMediaType`
+
+https://msdn.microsoft.com/en-us/library/office/ff746008.aspx
+
+### `MIXED`
+
+```python
+MIXED = (-2, 'Return value only; indicates multiple media types, typically for a collection of shapes. May not be applicable in python-pptx.')
+```
+
+Return value only; indicates multiple media types.
+
+Typically for a collection of shapes. May not be applicable in python-pptx.
+
+### `MOVIE`
+
+```python
+MOVIE = (3, 'Video media such as MP4.')
+```
+
+Video media such as MP4.
+
+### `OTHER`
+
+```python
+OTHER = (1, 'Other media types')
+```
+
+Other media types
+
+### `SOUND`
+
+```python
+SOUND = (1, 'Audio media such as MP3.')
+```
+
+Audio media such as MP3.
+
+## `PP_PLACEHOLDER`
+
+```python
+PP_PLACEHOLDER = PP_PLACEHOLDER_TYPE
+```
+
+## `PP_PLACEHOLDER_TYPE`
+
+Bases: `BaseXmlEnum`
+
+Specifies one of the 18 distinct types of placeholder.
+
+Alias: ``PP_PLACEHOLDER``
+
+Example::
+
+ from pptx.enum.shapes import PP_PLACEHOLDER
+
+ placeholder = slide.placeholders[0]
+ assert placeholder.type == PP_PLACEHOLDER.TITLE
+
+MS API name: `PpPlaceholderType`
+
+http://msdn.microsoft.com/en-us/library/office/ff860759(v=office.15 ").aspx"
+
+### `BITMAP`
+
+```python
+BITMAP = (9, 'clipArt', 'Clip art placeholder')
+```
+
+Clip art placeholder
+
+### `BODY`
+
+```python
+BODY = (2, 'body', 'Body')
+```
+
+Body
+
+### `CENTER_TITLE`
+
+```python
+CENTER_TITLE = (3, 'ctrTitle', 'Center Title')
+```
+
+Center Title
+
+### `CHART`
+
+```python
+CHART = (8, 'chart', 'Chart')
+```
+
+Chart
+
+### `DATE`
+
+```python
+DATE = (16, 'dt', 'Date')
+```
+
+Date
+
+### `FOOTER`
+
+```python
+FOOTER = (15, 'ftr', 'Footer')
+```
+
+Footer
+
+### `HEADER`
+
+```python
+HEADER = (14, 'hdr', 'Header')
+```
+
+Header
+
+### `MEDIA_CLIP`
+
+```python
+MEDIA_CLIP = (10, 'media', 'Media Clip')
+```
+
+Media Clip
+
+### `MIXED`
+
+```python
+MIXED = (-2, '', 'Return value only; multiple placeholders of differing types.')
+```
+
+Return value only; multiple placeholders of differing types.
+
+### `OBJECT`
+
+```python
+OBJECT = (7, 'obj', 'Object')
+```
+
+Object
+
+### `ORG_CHART`
+
+```python
+ORG_CHART = (11, 'dgm', 'SmartArt placeholder. Organization chart is a legacy name.')
+```
+
+SmartArt placeholder. Organization chart is a legacy name.
+
+### `PICTURE`
+
+```python
+PICTURE = (18, 'pic', 'Picture')
+```
+
+Picture
+
+### `SLIDE_IMAGE`
+
+```python
+SLIDE_IMAGE = (101, 'sldImg', 'Slide Image')
+```
+
+Slide Image
+
+### `SLIDE_NUMBER`
+
+```python
+SLIDE_NUMBER = (13, 'sldNum', 'Slide Number')
+```
+
+Slide Number
+
+### `SUBTITLE`
+
+```python
+SUBTITLE = (4, 'subTitle', 'Subtitle')
+```
+
+Subtitle
+
+### `TABLE`
+
+```python
+TABLE = (12, 'tbl', 'Table')
+```
+
+Table
+
+### `TITLE`
+
+```python
+TITLE = (1, 'title', 'Title')
+```
+
+Title
+
+### `VERTICAL_BODY`
+
+```python
+VERTICAL_BODY = (6, '', 'Vertical Body (read-only).')
+```
+
+Vertical Body (read-only).
+
+### `VERTICAL_OBJECT`
+
+```python
+VERTICAL_OBJECT = (17, '', 'Vertical Object (read-only).')
+```
+
+Vertical Object (read-only).
+
+### `VERTICAL_TITLE`
+
+```python
+VERTICAL_TITLE = (5, '', 'Vertical Title (read-only).')
+```
+
+Vertical Title (read-only).
+
+## `PROG_ID`
+
+Bases: `Enum`
+
+One-off Enum-like object for progId values.
+
+Indicates the type of an OLE object in terms of the program used to open it.
+
+A member of this enumeration can be used in a `SlideShapes.add_ole_object()` call to
+specify a Microsoft Office file-type (Excel, PowerPoint, or Word), which will
+then not require several of the arguments required to embed other object types.
+
+Example::
+
+ from pptx.enum.shapes import PROG_ID
+ from pptx.util import Inches
+
+ embedded_xlsx_shape = slide.shapes.add_ole_object(
+ "workbook.xlsx", PROG_ID.XLSX, left=Inches(1), top=Inches(1)
+ )
+ assert embedded_xlsx_shape.ole_format.prog_id == "Excel.Sheet.12"
+
+### `DOCX`
+
+```python
+DOCX = ('DOCX', 'Word.Document.12', 'docx-icon.emf', 965200, 609600)
+```
+
+`progId` for an embedded Word 2007+ (.docx) document.
+
+### `PPTX`
+
+```python
+PPTX = ('PPTX', 'PowerPoint.Show.12', 'pptx-icon.emf', 965200, 609600)
+```
+
+`progId` for an embedded PowerPoint 2007+ (.pptx) document.
+
+### `XLSX`
+
+```python
+XLSX = ('XLSX', 'Excel.Sheet.12', 'xlsx-icon.emf', 965200, 609600)
+```
+
+`progId` for an embedded Excel 2007+ (.xlsx) document.
+
+### `height`
+
+```python
+height
+```
+
+### `icon_filename`
+
+```python
+icon_filename
+```
+
+### `progId`
+
+```python
+progId
+```
+
+### `width`
+
+```python
+width
+```
+
+
+
+
+
+# `pptx.enum.text`
+
+Enumerations used by text and related objects.
+
+## `MSO_ANCHOR`
+
+```python
+MSO_ANCHOR = MSO_VERTICAL_ANCHOR
+```
+
+## `MSO_AUTO_SIZE`
+
+Bases: `BaseEnum`
+
+Determines the type of automatic sizing allowed.
+
+The following names can be used to specify the automatic sizing behavior used to fit a shape's
+text within the shape bounding box, for example::
+
+ from pptx.enum.text import MSO_AUTO_SIZE
+
+ shape.text_frame.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE
+
+The word-wrap setting of the text frame interacts with the auto-size setting to determine the
+specific auto-sizing behavior.
+
+Note that `TextFrame.auto_size` can also be set to `None`, which removes the auto size setting
+altogether. This causes the setting to be inherited, either from the layout placeholder, in the
+case of a placeholder shape, or from the theme.
+
+MS API Name: `MsoAutoSize`
+
+http://msdn.microsoft.com/en-us/library/office/ff865367(v=office.15).aspx
+
+### `MIXED`
+
+```python
+MIXED = (-2, 'Return value only; indicates a combination of automatic sizing schemes are used.')
+```
+
+Return value only; indicates a combination of automatic sizing schemes are used.
+
+### `NONE`
+
+```python
+NONE = (0, 'No automatic sizing of the shape or text will be done.\n\nText can freely extend beyond the horizontal and vertical edges of the shape bounding box.')
+```
+
+No automatic sizing of the shape or text will be done.
+
+Text can freely extend beyond the horizontal and vertical edges of the shape bounding box.
+
+### `SHAPE_TO_FIT_TEXT`
+
+```python
+SHAPE_TO_FIT_TEXT = (1, 'The shape height and possibly width are adjusted to fit the text.\n\nNote this setting interacts with the TextFrame.word_wrap property setting. If word wrap is turned on, only the height of the shape will be adjusted; soft line breaks will be used to fit the text horizontally.')
+```
+
+The shape height and possibly width are adjusted to fit the text.
+
+Note this setting interacts with the TextFrame.word_wrap property setting. If word wrap is
+turned on, only the height of the shape will be adjusted; soft line breaks will be used to fit
+the text horizontally.
+
+### `TEXT_TO_FIT_SHAPE`
+
+```python
+TEXT_TO_FIT_SHAPE = (2, 'The font size is reduced as necessary to fit the text within the shape.')
+```
+
+The font size is reduced as necessary to fit the text within the shape.
+
+## `MSO_TEXT_UNDERLINE_TYPE`
+
+Bases: `BaseXmlEnum`
+
+Indicates the type of underline for text. Used with
+`.Font.underline` to specify the style of text underlining.
+
+Alias: ``MSO_UNDERLINE``
+
+Example::
+
+ from pptx.enum.text import MSO_UNDERLINE
+
+ run.font.underline = MSO_UNDERLINE.DOUBLE_LINE
+
+MS API Name: `MsoTextUnderlineType`
+
+http://msdn.microsoft.com/en-us/library/aa432699.aspx
+
+### `DASH_HEAVY_LINE`
+
+```python
+DASH_HEAVY_LINE = (8, 'dashHeavy', 'Specifies a dash underline.')
+```
+
+Specifies a dash underline.
+
+### `DASH_LINE`
+
+```python
+DASH_LINE = (7, 'dash', 'Specifies a dash line underline.')
+```
+
+Specifies a dash line underline.
+
+### `DASH_LONG_HEAVY_LINE`
+
+```python
+DASH_LONG_HEAVY_LINE = (10, 'dashLongHeavy', 'Specifies a long heavy line underline.')
+```
+
+Specifies a long heavy line underline.
+
+### `DASH_LONG_LINE`
+
+```python
+DASH_LONG_LINE = (9, 'dashLong', 'Specifies a dashed long line underline.')
+```
+
+Specifies a dashed long line underline.
+
+### `DOTTED_HEAVY_LINE`
+
+```python
+DOTTED_HEAVY_LINE = (6, 'dottedHeavy', 'Specifies a dotted heavy line underline.')
+```
+
+Specifies a dotted heavy line underline.
+
+### `DOTTED_LINE`
+
+```python
+DOTTED_LINE = (5, 'dotted', 'Specifies a dotted line underline.')
+```
+
+Specifies a dotted line underline.
+
+### `DOT_DASH_HEAVY_LINE`
+
+```python
+DOT_DASH_HEAVY_LINE = (12, 'dotDashHeavy', 'Specifies a dot dash heavy line underline.')
+```
+
+Specifies a dot dash heavy line underline.
+
+### `DOT_DASH_LINE`
+
+```python
+DOT_DASH_LINE = (11, 'dotDash', 'Specifies a dot dash line underline.')
+```
+
+Specifies a dot dash line underline.
+
+### `DOT_DOT_DASH_HEAVY_LINE`
+
+```python
+DOT_DOT_DASH_HEAVY_LINE = (14, 'dotDotDashHeavy', 'Specifies a dot dot dash heavy line underline.')
+```
+
+Specifies a dot dot dash heavy line underline.
+
+### `DOT_DOT_DASH_LINE`
+
+```python
+DOT_DOT_DASH_LINE = (13, 'dotDotDash', 'Specifies a dot dot dash line underline.')
+```
+
+Specifies a dot dot dash line underline.
+
+### `DOUBLE_LINE`
+
+```python
+DOUBLE_LINE = (3, 'dbl', 'Specifies a double line underline.')
+```
+
+Specifies a double line underline.
+
+### `HEAVY_LINE`
+
+```python
+HEAVY_LINE = (4, 'heavy', 'Specifies a heavy line underline.')
+```
+
+Specifies a heavy line underline.
+
+### `MIXED`
+
+```python
+MIXED = (-2, '', 'Specifies a mix of underline types (read-only).')
+```
+
+Specifies a mix of underline types (read-only).
+
+### `NONE`
+
+```python
+NONE = (0, 'none', 'Specifies no underline.')
+```
+
+Specifies no underline.
+
+### `SINGLE_LINE`
+
+```python
+SINGLE_LINE = (2, 'sng', 'Specifies a single line underline.')
+```
+
+Specifies a single line underline.
+
+### `WAVY_DOUBLE_LINE`
+
+```python
+WAVY_DOUBLE_LINE = (17, 'wavyDbl', 'Specifies a wavy double line underline.')
+```
+
+Specifies a wavy double line underline.
+
+### `WAVY_HEAVY_LINE`
+
+```python
+WAVY_HEAVY_LINE = (16, 'wavyHeavy', 'Specifies a wavy heavy line underline.')
+```
+
+Specifies a wavy heavy line underline.
+
+### `WAVY_LINE`
+
+```python
+WAVY_LINE = (15, 'wavy', 'Specifies a wavy line underline.')
+```
+
+Specifies a wavy line underline.
+
+### `WORDS`
+
+```python
+WORDS = (1, 'words', 'Specifies underlining words.')
+```
+
+Specifies underlining words.
+
+## `MSO_UNDERLINE`
+
+```python
+MSO_UNDERLINE = MSO_TEXT_UNDERLINE_TYPE
+```
+
+## `MSO_VERTICAL_ANCHOR`
+
+Bases: `BaseXmlEnum`
+
+Specifies the vertical alignment of text in a text frame.
+
+Used with the `.vertical_anchor` property of the `TextFrame` object. Note that the
+`vertical_anchor` property can also have the value None, indicating there is no directly
+specified vertical anchor setting and its effective value is inherited from its placeholder if
+it has one or from the theme. `None` may also be assigned to remove an explicitly specified
+vertical anchor setting.
+
+MS API Name: `MsoVerticalAnchor`
+
+http://msdn.microsoft.com/en-us/library/office/ff865255.aspx
+
+### `BOTTOM`
+
+```python
+BOTTOM = (4, 'b', 'Aligns text to bottom of text frame')
+```
+
+Aligns text to bottom of text frame
+
+### `MIDDLE`
+
+```python
+MIDDLE = (3, 'ctr', 'Centers text vertically')
+```
+
+Centers text vertically
+
+### `MIXED`
+
+```python
+MIXED = (-2, '', 'Return value only; indicates a combination of the other states.')
+```
+
+Return value only; indicates a combination of the other states.
+
+### `TOP`
+
+```python
+TOP = (1, 't', 'Aligns text to top of text frame')
+```
+
+Aligns text to top of text frame
+
+## `PP_ALIGN`
+
+```python
+PP_ALIGN = PP_PARAGRAPH_ALIGNMENT
+```
+
+## `PP_BULLET_TYPE`
+
+Bases: `BaseEnum`
+
+Kind of bullet explicitly set on a paragraph's own properties (paper-pptx addition).
+
+Reported by `paragraph.bullet.type`. Reflects local `a:pPr` state only: a paragraph whose
+bullet rendering is inherited from the placeholder/list-style chain reports `None`, not a
+member of this enumeration.
+
+Example::
+
+ from pptx.enum.text import PP_BULLET_TYPE
+
+ paragraph.bullet.set_character()
+ assert paragraph.bullet.type == PP_BULLET_TYPE.CHARACTER
+
+### `CHARACTER`
+
+```python
+CHARACTER = (1, "Character bullet (`a:buChar`), e.g. the classic '•'.")
+```
+
+Character bullet (`a:buChar`), e.g. the classic '•'.
+
+### `NONE`
+
+```python
+NONE = (0, "Explicit 'no bullet' (`a:buNone`), overriding any inherited bullet.")
+```
+
+Explicit 'no bullet' (`a:buNone`), overriding any inherited bullet.
+
+### `NUMBERED`
+
+```python
+NUMBERED = (2, 'Automatic numbering (`a:buAutoNum`).')
+```
+
+Automatic numbering (`a:buAutoNum`).
+
+### `PICTURE`
+
+```python
+PICTURE = (3, 'Picture bullet (`a:buBlip`). Recognized on read; not writable in v0.')
+```
+
+Picture bullet (`a:buBlip`). Recognized on read; not writable in v0.
+
+## `PP_PARAGRAPH_ALIGNMENT`
+
+Bases: `BaseXmlEnum`
+
+Specifies the horizontal alignment for one or more paragraphs.
+
+Alias: `PP_ALIGN`
+
+Example::
+
+ from pptx.enum.text import PP_ALIGN
+
+ shape.paragraphs[0].alignment = PP_ALIGN.CENTER
+
+MS API Name: `PpParagraphAlignment`
+
+http://msdn.microsoft.com/en-us/library/office/ff745375(v=office.15).aspx
+
+### `CENTER`
+
+```python
+CENTER = (2, 'ctr', 'Center align')
+```
+
+Center align
+
+### `DISTRIBUTE`
+
+```python
+DISTRIBUTE = (5, 'dist', 'Evenly distributes e.g. Japanese characters from left to right within a line')
+```
+
+Evenly distributes e.g. Japanese characters from left to right within a line
+
+### `JUSTIFY`
+
+```python
+JUSTIFY = (4, 'just', 'Justified, i.e. each line both begins and ends at the margin.\n\nSpacing between words is adjusted such that the line exactly fills the width of the paragraph.')
+```
+
+Justified, i.e. each line both begins and ends at the margin.
+
+Spacing between words is adjusted such that the line exactly fills the width of the paragraph.
+
+### `JUSTIFY_LOW`
+
+```python
+JUSTIFY_LOW = (7, 'justLow', 'Justify using a small amount of space between words.')
+```
+
+Justify using a small amount of space between words.
+
+### `LEFT`
+
+```python
+LEFT = (1, 'l', 'Left aligned')
+```
+
+Left aligned
+
+### `MIXED`
+
+```python
+MIXED = (-2, '', 'Multiple alignments are present in a set of paragraphs (read-only).')
+```
+
+Multiple alignments are present in a set of paragraphs (read-only).
+
+### `RIGHT`
+
+```python
+RIGHT = (3, 'r', 'Right aligned')
+```
+
+Right aligned
+
+### `THAI_DISTRIBUTE`
+
+```python
+THAI_DISTRIBUTE = (6, 'thaiDist', 'Thai distributed')
+```
+
+Thai distributed
+
+
+
+
+
+# `pptx.errors`
+
+Typed safe-refusal exceptions for paper-pptx APIs.
+
+## `AmbiguousTargetError`
+
+Bases: `PaperRefusal`
+
+The addressing given matches more than one target; refusing to pick one.
+
+## `BoundaryViolationError`
+
+Bases: `PaperRefusal`
+
+An operation ran outside the scope where it is safe.
+
+Today that means one thing: saving while a `batch()` block is open on the package. Those edits
+are not validated yet and may still roll back, so save after the block closes.
+
+## `PackageLimitError`
+
+Bases: `PaperRefusal`
+
+The package archive has no single unambiguous reading, or is unsafe to expand.
+
+Raised reading a package (ambiguous ZIP end records, duplicate or overlapping members,
+encryption, malformed `[Content_Types].xml`) and writing one (parts that would collide on a
+single ZIP member name).
+
+## `PaperRefusal`
+
+Bases: `Exception`
+
+Base class for all safe refusals raised by paper-pptx APIs.
+
+## `RelationshipPolicyError`
+
+Bases: `PaperRefusal`
+
+The relationship graph cannot be carried across as asked.
+
+Either the source carries relationship types this operation's ledger does not support, or the
+graph itself is unusable: a malformed relationship collection, an invalid target mode, or an
+internal relationship pointing outside its own package.
+
+## `StaleAnchorError`
+
+Bases: `TargetNotFoundError`
+
+The block at an anchor's position no longer matches the anchor's content hash.
+
+The document changed since the anchor was produced. Refusing beats guessing: use
+`pptx.edit.refind()` to recover a fresh anchor explicitly. (Subclass of
+`TargetNotFoundError` so existing handlers keep working.)
+
+## `TargetNotFoundError`
+
+Bases: `PaperRefusal`
+
+The target could not be resolved in this document.
+
+Either the addressing given (name, index, id, section) matches nothing, or a proxy handed in has
+gone stale because the shape, part, or content it wrapped is no longer reachable. See
+`StaleAnchorError` for the content-hash case.
+
+## `UnsupportedStructureError`
+
+Bases: `PaperRefusal`
+
+This API cannot operate safely on the document as it stands.
+
+Covers input it will not touch (unsupported structure, an unreadable package, a signed deck a
+rewrite would invalidate) and, at commit or `batch()` exit, edits whose result would not reopen
+as a presentation. In that second case the edits roll back.
+
+## `materialize_slides`
+
+```python
+materialize_slides(prs, operation: str)
+```
+
+Return `list(prs.slides)`, refusing typed when the relationship graph is broken.
+
+paper-pptx internal helper. Paper organs traverse the whole deck up front;
+corrupt input (a `p:sldId` referencing a missing relationship) must speak from those
+APIs as a typed, specific refusal - never a raw traceback. Upstream loader and
+traversal behavior on such files is unchanged (the additive contract): only the
+paper entry points route through this guard.
+
+
+
+
+
+# `pptx.exc`
+
+Exceptions used with python-pptx.
+
+## `InvalidXmlError`
+
+Bases: `PythonPptxError`
+
+Raised when a value is encountered in the XML that is not valid according
+to the schema.
+
+## `PackageNotFoundError`
+
+Bases: `PythonPptxError`
+
+Raised when a package cannot be found at the specified path.
+
+## `PythonPptxError`
+
+Bases: `Exception`
+
+Generic error class.
+
+
+
+
+
+# `pptx.hf`
+
+Footer, date, and slide-number application machinery (paper-pptx addition).
+
+## `DATETIME_FIELD_FORMATS`
+
+```python
+DATETIME_FIELD_FORMATS: 'Dict[str, str]' = {'datetime': '%m/%d/%Y', 'datetime1': '%m/%d/%Y', 'datetime2': '%A, %B %d, %Y', 'datetime3': '%d %B %Y', 'datetime4': '%B %d, %Y', 'datetime5': '%d-%b-%y', 'datetime6': '%B %y', 'datetime7': '%b-%y', 'datetime8': '%m/%d/%Y %I:%M %p', 'datetime9': '%m/%d/%Y %I:%M:%S %p', 'datetime10': '%H:%M', 'datetime11': '%H:%M:%S', 'datetime12': '%I:%M %p', 'datetime13': '%I:%M:%S %p'}
+```
+
+## `apply_presentation_footers`
+
+```python
+apply_presentation_footers(prs: 'Presentation', *, footer: 'Optional[str]' = None, slide_number: bool = False, date_format: 'Optional[str]' = None, fixed_date: 'Optional[str]' = None, skip_title_slides: bool = False, now: 'Optional[datetime]' = None) -> None
+```
+
+Apply the complete footer state to every slide (the dialog's "Apply to All").
+
+## `apply_slide_footers`
+
+```python
+apply_slide_footers(slide: 'Slide', *, footer: 'Optional[str]' = None, slide_number: bool = False, date_format: 'Optional[str]' = None, fixed_date: 'Optional[str]' = None, now: 'Optional[datetime]' = None) -> None
+```
+
+Apply the complete footer state to one slide (the dialog's per-slide "Apply").
+
+
+
+
+
+# paper-pptx API reference
+
+The complete public API of `pptx` 0.2.0, generated from docstrings. The distribution is `paper-pptx`, a fork of python-pptx; the import name is `pptx`. Both what the fork adds and the API it inherits from python-pptx are documented here.
+
+This index names every symbol documented here. Open the one page you need rather than reading them all.
+
+## Modules
+
+| Page | Surface |
+| --- | --- |
+| [`pptx.action`](api-001.md#source-2ff08e8ad4252e35) | 2 members |
+| [`pptx.api`](api-001.md#source-54221fb89f7eb2be) | 1 member |
+| [`pptx.chart.axis`](api-001.md#source-9118ae13cf8314b0) | 6 members |
+| [`pptx.chart.category`](api-001.md#source-8dee24aaee01b88c) | 3 members |
+| [`pptx.chart.chart`](api-001.md#source-89e7d711ed15a370) | 2 members |
+| [`pptx.chart.data`](api-001.md#source-d76816c4762d3876) | 12 members |
+| [`pptx.chart.datalabel`](api-001.md#source-9e89dcc0459d9b73) | 2 members |
+| [`pptx.chart.legend`](api-001.md#source-ecb5a51f2ecc4bf7) | 1 member |
+| [`pptx.chart.marker`](api-001.md#source-6cab2c6b1a4a1250) | 1 member |
+| [`pptx.chart.plot`](api-001.md#source-11e5906e988644eb) | 11 members |
+| [`pptx.chart.point`](api-001.md#source-2377de03498f7784) | 4 members |
+| [`pptx.chart.series`](api-001.md#source-5a3d6f3e2c43691a) | 8 members |
+| [`pptx.chart.xlsx`](api-001.md#source-21ab6bfedcdec9c3) | 3 members |
+| [`pptx.chart.xmlwriter`](api-001.md#source-a5280ef39ca5756d) | 2 members |
+| [`pptx.compose`](api-001.md#source-dc72e6b5a4c9aeb7) | 6 members |
+| [`pptx.diff`](api-001.md#source-d7afcdbc99d99466) | 10 members |
+| [`pptx.dml.chtfmt`](api-001.md#source-b2539aba320810e9) | 1 member |
+| [`pptx.dml.color`](api-001.md#source-83f28c18da7fa00a) | 2 members |
+| [`pptx.dml.effect`](api-001.md#source-fd3a24128e2451fd) | 1 member |
+| [`pptx.dml.fill`](api-001.md#source-d3ad8803bc50edd0) | 1 member |
+| [`pptx.dml.line`](api-001.md#source-37ef7e94dbf5293c) | 1 member |
+| [`pptx.edit`](api-001.md#source-49bf2030e825c719) | 6 members |
+| [`pptx.enum.action`](api-001.md#source-c56e51ee96add455) | 2 members |
+| [`pptx.enum.base`](api-001.md#source-e3cf2347788123d0) | 3 members |
+| [`pptx.enum.chart`](api-001.md#source-69df9adb5a6361da) | 9 members |
+| [`pptx.enum.dml`](api-001.md#source-d1db4231c014498d) | 9 members |
+| [`pptx.enum.lang`](api-001.md#source-1262a37dc68e18a0) | 1 member |
+| [`pptx.enum.shapes`](api-002.md#source-89575e3e5103a25b) | 10 members |
+| [`pptx.enum.text`](api-002.md#source-291b3937811b1f64) | 8 members |
+| [`pptx.errors`](api-002.md#source-122db168dc0ce49e) | 9 members |
+| [`pptx.exc`](api-002.md#source-ed8153008804ef1f) | 3 members |
+| [`pptx.hf`](api-002.md#source-511bb93703e9b2ac) | 3 members |
+| [`pptx.inspect`](api-002.md#source-3bfd250d7ff4fdfd) | 25 members |
+| [`pptx.media`](api-002.md#source-f7fd4e165e028bd9) | 2 members |
+| [`pptx.opc.constants`](api-002.md#source-b464d01ec597ecae) | 4 members |
+| [`pptx.opc.oxml`](api-003.md#source-86b4861df7b1f077) | 9 members |
+| [`pptx.opc.package`](api-003.md#source-5a9871cc4e6c3d66) | 4 members |
+| [`pptx.opc.packuri`](api-003.md#source-63e80df0d91d462c) | 3 members |
+| [`pptx.opc.serialized`](api-003.md#source-35792d9504efae5d) | 4 members |
+| [`pptx.opc.shared`](api-003.md#source-12d7471663bc8a39) | 1 member |
+| [`pptx.opc.spec`](api-003.md#source-9316cc7ef21393f0) | 2 members |
+| [`pptx.oxml`](api-003.md#source-bae1743dc9ddb82f) | 5 members |
+| [`pptx.oxml.action`](api-003.md#source-c804902fbb787f54) | 1 member |
+| [`pptx.oxml.chart.axis`](api-003.md#source-566f3b63c7e768e3) | 12 members |
+| [`pptx.oxml.chart.chart`](api-003.md#source-20c707c7c6bfd9bf) | 5 members |
+| [`pptx.oxml.chart.datalabel`](api-003.md#source-9b9fa7848c5b8421) | 3 members |
+| [`pptx.oxml.chart.legend`](api-003.md#source-7a24123fbbd345ca) | 2 members |
+| [`pptx.oxml.chart.marker`](api-003.md#source-10d46fe6d4d2326e) | 3 members |
+| [`pptx.oxml.chart.plot`](api-003.md#source-a49f289a1ad3ea52) | 15 members |
+| [`pptx.oxml.chart.series`](api-003.md#source-247322b154f45010) | 6 members |
+| [`pptx.oxml.chart.shared`](api-003.md#source-5a0df2b41da4068f) | 10 members |
+| [`pptx.oxml.coreprops`](api-003.md#source-5aa806ae9ec22ad6) | 1 member |
+| [`pptx.oxml.dml.color`](api-003.md#source-38ea91b08c444f69) | 8 members |
+| [`pptx.oxml.dml.fill`](api-003.md#source-573913bc7bca648f) | 11 members |
+| [`pptx.oxml.dml.line`](api-003.md#source-953e640c9323192f) | 1 member |
+| [`pptx.oxml.ns`](api-003.md#source-dbcf11c38dbcbca9) | 7 members |
+| [`pptx.oxml.presentation`](api-003.md#source-8352fd2c2ce5d006) | 8 members |
+| [`pptx.oxml.shapes`](api-003.md#source-3318e1ceb735b25b) | 1 member |
+| [`pptx.oxml.shapes.autoshape`](api-003.md#source-5bf238d976cbd6be) | 13 members |
+| [`pptx.oxml.shapes.connector`](api-003.md#source-8b80e8e0e82d5ca2) | 4 members |
+| [`pptx.oxml.shapes.graphfrm`](api-003.md#source-e3e5c89083e07e1f) | 5 members |
+| [`pptx.oxml.shapes.groupshape`](api-003.md#source-b3eab28136715bb4) | 3 members |
+| [`pptx.oxml.shapes.picture`](api-003.md#source-0a4c2f502c254a31) | 2 members |
+| [`pptx.oxml.shapes.shared`](api-003.md#source-d45d2ccf7e798734) | 9 members |
+| [`pptx.oxml.simpletypes`](api-003.md#source-96bc334681dede4f) | 63 members |
+| [`pptx.oxml.slide`](api-003.md#source-98bbdca02b344ee5) | 15 members |
+| [`pptx.oxml.table`](api-003.md#source-5bd2facac75a3388) | 8 members |
+| [`pptx.oxml.text`](api-004.md#source-e5428ffda937292b) | 17 members |
+| [`pptx.oxml.theme`](api-004.md#source-b3a1aa7e82da1084) | 1 member |
+| [`pptx.oxml.xmlchemy`](api-004.md#source-4c6faebd72b104d8) | 15 members |
+| [`pptx.package`](api-004.md#source-22b32522760a4aff) | 6 members |
+| [`pptx.parts.chart`](api-004.md#source-250e95b19f45835f) | 2 members |
+| [`pptx.parts.coreprops`](api-004.md#source-96363677f68ee31b) | 1 member |
+| [`pptx.parts.embeddedpackage`](api-004.md#source-af8e4490ae9517c3) | 4 members |
+| [`pptx.parts.image`](api-004.md#source-29abb0ee84ed146a) | 2 members |
+| [`pptx.parts.media`](api-004.md#source-741ea168e196c168) | 1 member |
+| [`pptx.parts.presentation`](api-004.md#source-dbd76b439e857b96) | 1 member |
+| [`pptx.parts.slide`](api-004.md#source-5c62c890b70bb9fc) | 6 members |
+| [`pptx.presentation`](api-004.md#source-811af5046b26a15e) | 1 member |
+| [`pptx.rebind`](api-004.md#source-e73fd44ae5d51784) | 5 members |
+| [`pptx.shapes`](api-004.md#source-340d6c3c7ab9df91) | 1 member |
+| [`pptx.shapes.autoshape`](api-004.md#source-8c0292548da51159) | 4 members |
+| [`pptx.shapes.base`](api-004.md#source-dcdd2ab735f49200) | 1 member |
+| [`pptx.shapes.connector`](api-004.md#source-32573f9d12411719) | 1 member |
+| [`pptx.shapes.freeform`](api-004.md#source-7a00ad9c2fe27b44) | 3 members |
+| [`pptx.shapes.graphfrm`](api-004.md#source-b094fa81b443b0fe) | 1 member |
+| [`pptx.shapes.group`](api-004.md#source-b20070cf5f17e348) | 1 member |
+| [`pptx.shapes.picture`](api-004.md#source-d1feeccb517dfb14) | 2 members |
+| [`pptx.shapes.placeholder`](api-004.md#source-4ca2a6ba8179a22c) | 10 members |
+| [`pptx.shapes.shapetree`](api-004.md#source-76804c333460b9bb) | 12 members |
+| [`pptx.shared`](api-004.md#source-645aca58a83de6fe) | 3 members |
+| [`pptx.slide`](api-004.md#source-c071261f71595b98) | 10 members |
+| [`pptx.slideops`](api-004.md#source-d4db30d15a010249) | 3 members |
+| [`pptx.spec`](api-004.md#source-cf430719ccbe46f5) | 6 members |
+| [`pptx.table`](api-004.md#source-eeaf22cc77d18fa9) | 1 member |
+| [`pptx.text.bullet`](api-005.md#source-7265f22343afe4ee) | 3 members |
+| [`pptx.text.fonts`](api-005.md#source-c6ff4d26749bee76) | 1 member |
+| [`pptx.text.layout`](api-005.md#source-720ef7cbb39d9baa) | 1 member |
+| [`pptx.text.text`](api-005.md#source-641574f4f1a6c03b) | 2 members |
+| [`pptx.types`](api-005.md#source-8c8b08f561ed110c) | 2 members |
+| [`pptx.util`](api-005.md#source-c6f3b84c67d06ef5) | 8 members |
+
+## `pptx.action`
+
+Objects related to mouse click and hover actions on a shape or text.
+
+Full contract: [action.md](api-001.md#source-2ff08e8ad4252e35)
+
+- `ActionSetting` — Properties specifying how a shape or run reacts to mouse actions.
+- `Hyperlink` — Represents a hyperlink action on a shape or text run.
+
+## `pptx.api`
+
+Directly exposed API classes, Presentation for now.
+
+Full contract: [api.md](api-001.md#source-54221fb89f7eb2be)
+
+- `Presentation(pptx=None) -> presentation.Presentation` — Return a `Presentation` object loaded from *pptx*, where *pptx* can be
+
+## `pptx.chart.axis`
+
+Axis-related chart objects.
+
+Full contract: [chart.axis.md](api-001.md#source-9118ae13cf8314b0)
+
+- `AxisTitle` — Provides properties for manipulating axis title.
+- `CategoryAxis` — A category axis of a chart.
+- `DateAxis` — A category axis with dates as its category labels.
+- `MajorGridlines` — Provides access to the properties of the major gridlines appearing on an axis.
+- `TickLabels` — A service class providing access to formatting of axis tick mark labels.
+- `ValueAxis` — An axis having continuous (as opposed to discrete) values.
+
+## `pptx.chart.category`
+
+Category-related objects.
+
+Full contract: [chart.category.md](api-001.md#source-8dee24aaee01b88c)
+
+- `Categories` — A sequence of `category.Category` objects, each representing a category
+- `Category` — An extension of `str` that provides the category label as its string
+- `CategoryLevel` — A sequence of `category.Category` objects representing a single level in
+
+## `pptx.chart.chart`
+
+Chart-related objects such as Chart and ChartTitle.
+
+Full contract: [chart.chart.md](api-001.md#source-89e7d711ed15a370)
+
+- `Chart` — A chart object.
+- `ChartTitle` — Provides properties for manipulating a chart title.
+
+## `pptx.chart.data`
+
+ChartData and related objects.
+
+Full contract: [chart.data.md](api-001.md#source-d76816c4762d3876)
+
+- `BubbleChartData` — A specialized ChartData object suitable for use with a bubble chart.
+- `BubbleDataPoint` — A data point in a bubble chart series. Provides access to the x, y, and
+- `BubbleSeriesData` — The data specific to a particular Bubble chart series. It provides access
+- `Categories` — A sequence of `data.Category` objects, also having certain hierarchical
+- `Category` — A chart category, primarily having a label to be displayed on the
+- `CategoryChartData` — Accumulates data specifying the categories and series values for a chart
+- `CategoryDataPoint` — A data point in a category chart series. Provides access to the value of
+- `CategorySeriesData` — The data specific to a particular category chart series. It provides
+- `ChartData` — `ChartData` is simply an alias for `CategoryChartData` and may be removed
+- `XyChartData` — A specialized ChartData object suitable for use with an XY (aka. scatter)
+- `XyDataPoint` — A data point in an XY chart series. Provides access to the x and y values
+- `XySeriesData` — The data specific to a particular XY chart series. It provides access to
+
+## `pptx.chart.datalabel`
+
+Data label-related objects.
+
+Full contract: [chart.datalabel.md](api-001.md#source-9e89dcc0459d9b73)
+
+- `DataLabel` — The data label associated with an individual data point.
+- `DataLabels` — Provides access to properties of data labels for a plot or a series.
+
+## `pptx.chart.legend`
+
+Legend of a chart.
+
+Full contract: [chart.legend.md](api-001.md#source-ecb5a51f2ecc4bf7)
+
+- `Legend` — Represents the legend in a chart. A chart can have at most one legend.
+
+## `pptx.chart.marker`
+
+Marker-related objects.
+
+Full contract: [chart.marker.md](api-001.md#source-6cab2c6b1a4a1250)
+
+- `Marker` — Represents a data point marker, such as a diamond or circle, on
+
+## `pptx.chart.plot`
+
+Plot-related objects.
+
+Full contract: [chart.plot.md](api-001.md#source-11e5906e988644eb)
+
+- `Area3DPlot` — A 3-dimensional area plot.
+- `AreaPlot` — An area plot.
+- `BarPlot` — A bar chart-style plot.
+- `BubblePlot` — A bubble chart plot.
+- `DoughnutPlot` — An doughnut plot.
+- `LinePlot` — A line chart-style plot.
+- `PiePlot` — A pie chart-style plot.
+- `PlotFactory(xChart, chart)` — Return an instance of the appropriate subclass of _BasePlot based on the
+- `PlotTypeInspector` — "One-shot" service object that knows how to identify the type of a plot
+- `RadarPlot` — A radar-style plot.
+- `XyPlot` — An XY (scatter) plot.
+
+## `pptx.chart.point`
+
+Data point-related objects.
+
+Full contract: [chart.point.md](api-001.md#source-2377de03498f7784)
+
+- `BubblePoints` — Sequence providing access to the individual data points in
+- `CategoryPoints` — Sequence providing access to individual `Point` objects, each
+- `Point` — Provides access to the properties of an individual data point in
+- `XyPoints` — Sequence providing access to the individual data points in an `XySeries`
+
+## `pptx.chart.series`
+
+Series-related objects.
+
+Full contract: [chart.series.md](api-001.md#source-5a3d6f3e2c43691a)
+
+- `AreaSeries` — A data point series belonging to an area plot.
+- `BarSeries` — A data point series belonging to a bar plot.
+- `BubbleSeries` — A data point series belonging to a bubble plot.
+- `LineSeries` — A data point series belonging to a line plot.
+- `PieSeries` — A data point series belonging to a pie plot.
+- `RadarSeries` — A data point series belonging to a radar plot.
+- `SeriesCollection` — A sequence of `Series` objects.
+- `XySeries` — A data point series belonging to an XY (scatter) plot.
+
+## `pptx.chart.xlsx`
+
+Chart builder and related objects.
+
+Full contract: [chart.xlsx.md](api-001.md#source-21ab6bfedcdec9c3)
+
+- `BubbleWorkbookWriter` — Service object that knows how to write an Excel workbook from bubble
+- `CategoryWorkbookWriter` — Determines Excel worksheet layout and can write an Excel workbook from
+- `XyWorkbookWriter` — Determines Excel worksheet layout and can write an Excel workbook from XY
+
+## `pptx.chart.xmlwriter`
+
+Composers for default chart XML for various chart types.
+
+Full contract: [chart.xmlwriter.md](api-001.md#source-a5280ef39ca5756d)
+
+- `ChartXmlWriter(chart_type, chart_data)` — Factory function returning appropriate XML writer object for
+- `SeriesXmlRewriterFactory(chart_type, chart_data)` — Return a `_BaseSeriesXmlRewriter` subclass appropriate to *chart_type*.
+
+## `pptx.compose`
+
+Cross-presentation slide import and deck merge (paper-pptx addition).
+
+Full contract: [compose.md](api-001.md#source-dc72e6b5a4c9aeb7)
+
+- `ImportReport` — What one import did. Deterministic; `.to_dict()` is goldenable.
+- `PackageTransaction` — Restore a package's original live graph if the guarded operation raises.
+- `SCHEMA_NAME = 'paper-import-report'`
+- `SCHEMA_VERSION = 3`
+- `append_deck(dest_prs, source_prs, *, mode, notes=True) -> 'Tuple[ImportReport, ...]'` — Import every `source_prs` slide, in order, at the end of `dest_prs`.
+- `import_slide(dest_prs, source_prs, slide, *, mode, position=None, notes=True, section=None, section_id=None, target_layout=None, placeholder_map='auto') -> ImportReport` — Import one slide from `source_prs` into `dest_prs`; return the `ImportReport`.
+
+## `pptx.diff`
+
+Deck diff - the verification mirror (paper-pptx addition).
+
+Full contract: [diff.md](api-001.md#source-d7afcdbc99d99466)
+
+- `BulletShift` — One paragraph whose resolved bullet changed between the two decks.
+- `DeckDiff` — The whole comparison. `.to_dict()` is deterministic and goldenable.
+- `EffectiveShift` — One uniquely matched run in a unique unchanged paragraph whose resolved font changed.
+- `MovedSlide` — A slide that kept its identity and changed position.
+- `SCHEMA_NAME = 'paper-deck-diff'`
+- `SCHEMA_VERSION = 5`
+- `ShapeRef` — Identifies a slide-scoped shape by stable id and display name.
+- `SlideChange` — Within-slide deltas for one id-matched slide pair. Empty facets are omitted
+- `SlideRef` — Identifies a slide by id, position, and title.
+- `diff_decks(path_a, path_b, *, detail='structure') -> DeckDiff` — Compare two decks; return the typed `DeckDiff`.
+
+## `pptx.dml.chtfmt`
+
+`ChartFormat` and related objects.
+
+Full contract: [dml.chtfmt.md](api-001.md#source-b2539aba320810e9)
+
+- `ChartFormat` — The `ChartFormat` object provides access to visual shape properties for
+
+## `pptx.dml.color`
+
+DrawingML objects related to color, ColorFormat being the most prominent.
+
+Full contract: [dml.color.md](api-001.md#source-83f28c18da7fa00a)
+
+- `ColorFormat` — Provides access to color settings such as RGB color, theme color, and
+- `RGBColor` — Immutable value object defining a particular RGB color.
+
+## `pptx.dml.effect`
+
+Visual effects on a shape such as shadow, glow, and reflection.
+
+Full contract: [dml.effect.md](api-001.md#source-fd3a24128e2451fd)
+
+- `ShadowFormat` — Provides access to shadow effect on a shape.
+
+## `pptx.dml.fill`
+
+DrawingML objects related to fill.
+
+Full contract: [dml.fill.md](api-001.md#source-d3ad8803bc50edd0)
+
+- `FillFormat` — Provides access to the current fill properties.
+
+## `pptx.dml.line`
+
+DrawingML objects related to line formatting.
+
+Full contract: [dml.line.md](api-001.md#source-37ef7e94dbf5293c)
+
+- `LineFormat` — Provides access to line properties such as color, style, and width.
+
+## `pptx.edit`
+
+Structural-anchor write APIs: formatting-preserving text replacement (paper-pptx addition).
+
+Full contract: [edit.md](api-001.md#source-49bf2030e825c719)
+
+- `RESULT_SCHEMA_NAME = 'paper-replace-result'`
+- `RESULT_SCHEMA_VERSION = 2`
+- `ReplaceResult` — Outcome of a text replacement.
+- `refind(prs, anchor) -> BlockAnchor` — Return a fresh current anchor for an exact unique fingerprint match.
+- `replace_text(prs, find, replace, *, include_notes=False) -> ReplaceResult` — Replace literal `find` with `replace` across `prs`; return a `ReplaceResult`.
+- `replace_text_at(prs, anchor, find, replace) -> ReplaceResult` — Replace literal `find` in the block at `anchor`; return a `ReplaceResult`.
+
+## `pptx.enum.action`
+
+Enumerations that describe click-action settings.
+
+Full contract: [enum.action.md](api-001.md#source-c56e51ee96add455)
+
+- `PP_ACTION = PP_ACTION_TYPE`
+- `PP_ACTION_TYPE` — Specifies the type of a mouse action (click or hover action).
+
+## `pptx.enum.base`
+
+Base classes and other objects used by enumerations.
+
+Full contract: [enum.base.md](api-001.md#source-e3cf2347788123d0)
+
+- `BaseEnum` — Base class for Enums that do not map XML attr values.
+- `BaseXmlEnum` — Base class for Enums that also map XML attr values.
+- `DocsPageFormatter` — Formats a reStructuredText documention page (string) for an enumeration.
+
+## `pptx.enum.chart`
+
+Enumerations used by charts and related objects.
+
+Full contract: [enum.chart.md](api-001.md#source-69df9adb5a6361da)
+
+- `XL_AXIS_CROSSES` — Specifies the point on an axis where the other axis crosses.
+- `XL_CATEGORY_TYPE` — Specifies the type of the category axis.
+- `XL_CHART_TYPE` — Specifies the type of a chart.
+- `XL_DATA_LABEL_POSITION` — Specifies where the data label is positioned.
+- `XL_LABEL_POSITION = XL_DATA_LABEL_POSITION`
+- `XL_LEGEND_POSITION` — Specifies the position of the legend on a chart.
+- `XL_MARKER_STYLE` — Specifies the marker style for a point or series in a line, scatter, or radar chart.
+- `XL_TICK_LABEL_POSITION` — Specifies the position of tick-mark labels on a chart axis.
+- `XL_TICK_MARK` — Specifies a type of axis tick for a chart.
+
+## `pptx.enum.dml`
+
+Enumerations used by DrawingML objects.
+
+Full contract: [enum.dml.md](api-001.md#source-d1db4231c014498d)
+
+- `MSO_COLOR_TYPE` — Specifies the color specification scheme
+- `MSO_FILL = MSO_FILL_TYPE`
+- `MSO_FILL_TYPE` — Specifies the type of bitmap used for the fill of a shape.
+- `MSO_LINE = MSO_LINE_DASH_STYLE`
+- `MSO_LINE_DASH_STYLE` — Specifies the dash style for a line.
+- `MSO_PATTERN = MSO_PATTERN_TYPE`
+- `MSO_PATTERN_TYPE` — Specifies the fill pattern used in a shape.
+- `MSO_THEME_COLOR = MSO_THEME_COLOR_INDEX`
+- `MSO_THEME_COLOR_INDEX` — An Office theme color, one of those shown in the color gallery on the formatting ribbon.
+
+## `pptx.enum.lang`
+
+Enumerations used for specifying language.
+
+Full contract: [enum.lang.md](api-001.md#source-1262a37dc68e18a0)
+
+- `MSO_LANGUAGE_ID` — Specifies the language identifier.
+
+## `pptx.enum.shapes`
+
+Enumerations used by shapes and related objects.
+
+Full contract: [enum.shapes.md](api-002.md#source-89575e3e5103a25b)
+
+- `MSO = MSO_SHAPE_TYPE`
+- `MSO_AUTO_SHAPE_TYPE` — Specifies a type of AutoShape, e.g. DOWN_ARROW.
+- `MSO_CONNECTOR = MSO_CONNECTOR_TYPE`
+- `MSO_CONNECTOR_TYPE` — Specifies a type of connector.
+- `MSO_SHAPE = MSO_AUTO_SHAPE_TYPE`
+- `MSO_SHAPE_TYPE` — Specifies the type of a shape, more specifically than the five base types.
+- `PP_MEDIA_TYPE` — Indicates the OLE media type.
+- `PP_PLACEHOLDER = PP_PLACEHOLDER_TYPE`
+- `PP_PLACEHOLDER_TYPE` — Specifies one of the 18 distinct types of placeholder.
+- `PROG_ID` — One-off Enum-like object for progId values.
+
+## `pptx.enum.text`
+
+Enumerations used by text and related objects.
+
+Full contract: [enum.text.md](api-002.md#source-291b3937811b1f64)
+
+- `MSO_ANCHOR = MSO_VERTICAL_ANCHOR`
+- `MSO_AUTO_SIZE` — Determines the type of automatic sizing allowed.
+- `MSO_TEXT_UNDERLINE_TYPE` — Indicates the type of underline for text. Used with
+- `MSO_UNDERLINE = MSO_TEXT_UNDERLINE_TYPE`
+- `MSO_VERTICAL_ANCHOR` — Specifies the vertical alignment of text in a text frame.
+- `PP_ALIGN = PP_PARAGRAPH_ALIGNMENT`
+- `PP_BULLET_TYPE` — Kind of bullet explicitly set on a paragraph's own properties (paper-pptx addition).
+- `PP_PARAGRAPH_ALIGNMENT` — Specifies the horizontal alignment for one or more paragraphs.
+
+## `pptx.errors`
+
+Typed safe-refusal exceptions for paper-pptx APIs.
+
+Full contract: [errors.md](api-002.md#source-122db168dc0ce49e)
+
+- `AmbiguousTargetError` — The addressing given matches more than one target; refusing to pick one.
+- `BoundaryViolationError` — An operation ran outside the scope where it is safe.
+- `PackageLimitError` — The package archive has no single unambiguous reading, or is unsafe to expand.
+- `PaperRefusal` — Base class for all safe refusals raised by paper-pptx APIs.
+- `RelationshipPolicyError` — The relationship graph cannot be carried across as asked.
+- `StaleAnchorError` — The block at an anchor's position no longer matches the anchor's content hash.
+- `TargetNotFoundError` — The target could not be resolved in this document.
+- `UnsupportedStructureError` — This API cannot operate safely on the document as it stands.
+- `materialize_slides(prs, operation)` — Return `list(prs.slides)`, refusing typed when the relationship graph is broken.
+
+## `pptx.exc`
+
+Exceptions used with python-pptx.
+
+Full contract: [exc.md](api-002.md#source-ed8153008804ef1f)
+
+- `InvalidXmlError` — Raised when a value is encountered in the XML that is not valid according
+- `PackageNotFoundError` — Raised when a package cannot be found at the specified path.
+- `PythonPptxError` — Generic error class.
+
+## `pptx.hf`
+
+Footer, date, and slide-number application machinery (paper-pptx addition).
+
+Full contract: [hf.md](api-002.md#source-511bb93703e9b2ac)
+
+- `DATETIME_FIELD_FORMATS = {'datetime': '%m/%d/%Y', 'datetime1': '%m/%d/%Y', 'datetime2': '%A, %B %d, %Y', 'datetime3': '%d %B %Y', 'datetime4': '%B %d, %Y', 'datetime5': '%d-%b-%y', 'datetime6': '%B %y', 'datetime7': '%b-%y', 'datetime8': '%m/%d/%Y %I:%M %p', 'datetime9': '%m/%d/%Y %I:%M:%S %p', 'datetime10': '%H:%M', 'datetime11': '%H:%M:%S', 'datetime12': '%I:%M %p', 'datetime13': '%I:%M:%S %p'}`
+- `apply_presentation_footers(prs, *, footer=None, slide_number=False, date_format=None, fixed_date=None, skip_title_slides=False, now=None) -> None` — Apply the complete footer state to every slide (the dialog's "Apply to All").
+- `apply_slide_footers(slide, *, footer=None, slide_number=False, date_format=None, fixed_date=None, now=None) -> None` — Apply the complete footer state to one slide (the dialog's per-slide "Apply").
+
+## `pptx.inspect`
+
+Effective-style inspection: resolved font values with provenance (paper-pptx).
+
+Full contract: [inspect.md](api-002.md#source-3bfd250d7ff4fdfd)
+
+- `BULLET_FOLLOWS_TEXT = 'follow text'`
+- `BlockAnchor` — A structural current anchor or conservative three-field legacy anchor.
+- `DECK_MANIFEST_SCHEMA = 'paper-deck-manifest'`
+- `DECK_MANIFEST_VERSION = 1`
+- `DeckManifest` — Structural survey of a whole deck. `.to_dict()` is deterministic (golden-tested).
+- `EffectiveBullet` — The bullet that actually renders on one paragraph, with its provenance chain.
+- `EffectiveFont` — Effective size, name, color, and emphasis of one run.
+- `EffectiveParagraphFormat` — Effective alignment, line spacing, and bullet of one paragraph (paper-pptx addition).
+- `EffectiveShapeFormat` — Effective solid fill and line color of one shape (paper-pptx addition).
+- `EffectiveValue` — A resolved (or honestly-unresolved) effective value with its provenance chain.
+- `InspectedRun` — One run of text paired with the font that renders it.
+- `ProvenanceStep` — One consulted level of an inheritance walk.
+- `SCHEMA_NAME = 'paper-text-inspection'`
+- `SCHEMA_VERSION = 3`
+- `ShapeManifest` — Structural facts of one shape (paper-pptx addition). Group children nest.
+- `SlideManifest` — Structural facts of one slide.
+- `TextBlock` — One paragraph of one text body, with anchor and per-run effective fonts.
+- `TextInspection` — Inspection payload for one slide. `.to_dict()` is deterministic (golden-tested).
+- `content_hash(text) -> str` — First 8 hex chars of SHA-256 over the NFC-normalized text (the pinned anchor hash).
+- `effective_font(run) -> EffectiveFont` — Return the `EffectiveFont` for `run`, a `_Run` on a slide shape.
+- `effective_paragraph_format(paragraph) -> EffectiveParagraphFormat` — Return effective alignment, line spacing, and bullet for `paragraph`, with provenance.
+- `effective_shape_format(shape) -> EffectiveShapeFormat` — Return the effective solid fill and line color of `shape`, with provenance.
+- `inspect_deck(prs) -> DeckManifest` — Return a structural `DeckManifest` of `prs` (paper-pptx addition).
+- `inspect_text(slide) -> TextInspection` — Return a `TextInspection` of every text block on `slide`, visibility-complete.
+- `iter_text_bodies(spTree)` — Yield `(kind, owner_elm, txBody, group_path, cell_coordinates)` in document order.
+
+## `pptx.media`
+
+Objects related to images, audio, and video.
+
+Full contract: [media.md](api-002.md#source-f7fd4e165e028bd9)
+
+- `SPEAKER_IMAGE_BYTES = base64.b64decode('iVBORw0KGgoAAAANSUhEUgAAAHgAAAA3CAYAAADHao5rAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAACJ5JREFUeNrsm19oW9cdx7/n/tO9uleS9ceWZMdO68Su0jiEmNCGLVsDg+J16xhkYx0UM1ayvS19SQZ7WfK6PWR7Gax0S9n24JGFlbGNPIRgEkKWZC1u6rizHMXxv1iWJdnWvbqS7p9z9uDokqzs1bWd84GDQEigez465/x+v3MOYYyBs3shXDAXzOGCOVwwhwvmcMEcLpjDBXPBHC6YwwVzuOAt4dGjRy/MzMwMmqZpSJLkZbPZYn9//8NkMlnmgncwt27d+tKlS5e+W6lUEolEYjQUCoExBsuy4Lru+319fXMjIyNXjh49+m8ueAfRarXUCxcuvHvv3r3DR44ceavRaMCyLDDGIAgCFEVBOBwGIQSFQuH9PXv2PD516tRvu7u7H3PB2xzXdZXz58//vFKp/Gzfvn1YXFyEYRgwDAOSJEEQBDDG4LouPM+DpmnwPA/5fP73o6Ojf3zttdfGueBtzAcffPCD8fHxi0NDQ1hZWUE6nYYoiiCEQBCEZ14JIfA8D77vAwAmJib+cPLkyctvvvnm33ZLf0i7Se7s7Gz/tWvXvpbL5bC+vo5sNgtFUTb/yU/EthshBAAgyzIAoNls4tChQ6OXL1+GKIreG2+88U8ueJsxPj5+QlXVt0OhEGRZhqIoEEXxGbFPC6aUBuJVVYVlWThw4MDo2NiYkMlkisPDwx/v9D4Rdotc0zSj9+7dO5RMJgEA4XAYkiRBkqRA9tNNluVArKIokCQJ8Xgc8Xgc+/fvf/u999778fr6egcXvE0ol8spx3HeNQwDoihClmXIsgxRFCFJ0ucEE0KgqipCodAz0pPJJFKpFGKx2I8uXrz4Qy54m1CpVBK+70MUxUDW0yO1Lbz9XnuUPz2625/JZDLo7OzExMTE4cnJySG+Bm8DarVa1Pd9EEIgy3IwPYuiCFEANFWEIGw2x6PQNA2qqqKdRTDGwBgDpTSQXKvVRj/88MOZoaGhSS74C8a27XA75ZEk6YloBYoswHQNfPy4Fx4JoTdmYjBRhSozsP+ZwCil8DwPlFIkk0kkEglMTEwM5PP5wcHBwTwX/AXhOI5i23bY930wxqAoymbVijA0/DD+mj8C048iqjMUHYbFRg0n+uaQ0FzQJ5IdxwGlNFi/AaCzsxPpdHr0+vXrN3aq4F2xBs/Pz/eFQqE/t0egIAjQdR2SQDFVzmKlHoEme1BEH3uyDJFsHFdnX4SLECRRhOM4EAQBhmFA1/UgvUomk4jH4/j0008PeZ4nccFbTKPRCH/00UdHi8Viph1gNZtNUEqhKAp0XUfRNMAYQCng+0DNAhp1H4s1A3fmkwhrMmKxGGKxGFRVDdZvWZYRiUQQjUZRq9V+Mjc39wIXvIWsra0lxsfHTzx48OAuY+yGKIpQVRX1eh2O4wQBFmMUjsvQ8oCWC5RWGWZmKVyX4e58DLarIBzWnomy23mxoiiIRqPQdR2FQqGfr8FbhOu6SrFYzJim+Y9mswnHcSCKImKxGFZWVmBZFgRBgCQTpPU6LNOCquhgjMERAUIAnzJUWgrmqzJeTclouRSUUrQj8XbQZRgGwuEwFhYW+vgI3iJarZbS2dl5v1Qqwfd9uK4LAEgmk2g0GlhfX99cV0UFL2dNCLSGmtlEvUFg2oBpA5YNmHWCikmgKNLncuH2VN2udFWr1QQXvEV4nicxxlCv19FsNoOtv0QiAUVRsLq6ikqlAtel2JvycOxFCyulFZh1CqtBNuXaBPV6EyHRhyAIaLVaQST99MZEWzQPsrZ2BKu2bYMQgmq1Cs/z4DgOwuEwMpkMSqUSlpeXwQBoegTfe9XEgayDhaUHWNuoo1YHKus1hEgVuR4GLRxFPB6HrusQRRGU0uBwQLsAslO3VXdskNVsNtHR0YHl5WU0Gg24rgvGGLLZLCilWFpawuLiIggR0d1l4KffMPH6yz5a5iNUVqcR8ot4+9UKcv0pCOLmlBwKhaBpGjRNC1Kl9p9H07QmD7K2CFVVm2tra0in07AsCysrK0ilUnBdF5FIBD09PVhYWMDDhw+RyWTQ07MH/X0qznyripNFhnKNYU8SeOVwL6Idm9+jdFNm+yBAO9CybRumaeLw4cOPueAtIhKJ1Hzf/4phGDe6urowOTmJY8eOBbXk9jRdKBQQiUTQ0dGBeDyOSCyB4z0aZEmErKhoNDfX7v83BXueh2q1ilKpBF7J2sofLQi0p6dn0bZtDAwMYGNjA1NTU/B9H61WC4qioK+vDxsbG5iZmcHdu3dh2zZEUUTL8QFBAYgIQSAolUrBsR1KadCe5NpYXl6Gqqp/yuVy/+GCt5C9e/fOy7L8dVmWkcvlMD09jc8++yxYM3VdR29vL+bn53H//n3cunULtm0HGwqu6wY169XVVTiOE4hmjKHRaGB2dhaFQgHHjx+/EQ6H7Z3YT+K5c+d2pGBCCOvu7n48NTX1gFL6bcMwUCgUUCqVgkpUu/Q4NzeHZrOJVquFSCQCwzCCIzuSJMH3fViWBUII2ulXoVDAnTt3UC6X/3L27NlfaJrW4IK3GFmW3ZdeeilvWda/HMe5u2/fvhFFUWCa5m/279///vDw8K8ymczfCSH56enpr5bL5UC0IAhPSpksCKparRbK5TJmZmZw+/ZtfPLJJ1fPnDnzy506PQO76NhstVpNFIvFDGNMSKfTxVQqVX66tHnp0qXvjI2NfZ8Q8s3e3l709/ejq6sL0WgUoVAIruuiVqthaWkJ09PTWFpaunL69Olfj4yMXNnJ/fJcXT7L5/ODY2Njb928efPLoii+3t5IkGUZnufBNE2sra1dHR4e/vidd9753cDAQH6nP/Nzebtwdna2//bt269MTk4eKpVKXZ7nSbquW7lcbvrEiRPjBw8enNwtz/rcXx9ljAlPypJ0Nz4fvx+8y+GCuWAOF8zhgjlcMIcL5nDBHC6YC+ZwwRwumLMN+O8AX65uqCMleo4AAAAASUVORK5CYII=')`
+- `Video` — Immutable value object representing a video such as MP4.
+
+## `pptx.opc.constants`
+
+Constant values related to the Open Packaging Convention.
+
+Full contract: [opc.constants.md](api-002.md#source-b464d01ec597ecae)
+
+- `CONTENT_TYPE` — Content type URIs (like MIME-types) that specify a part's format.
+- `NAMESPACE` — Constant values for OPC XML namespaces
+- `RELATIONSHIP_TARGET_MODE` — Open XML relationship target modes
+- `RELATIONSHIP_TYPE`
+
+## `pptx.opc.oxml`
+
+OPC-local oxml module to handle OPC-local concerns like relationship parsing.
+
+Full contract: [opc.oxml.md](api-003.md#source-86b4861df7b1f077)
+
+- `CT_Default` — `` element.
+- `CT_Override` — `` element.
+- `CT_Relationship` — `` element.
+- `CT_Relationships` — `` element, the root element in a .rels file.
+- `CT_Types` — `` element.
+- `nsmap = {'ct': NS.OPC_CONTENT_TYPES, 'pr': NS.OPC_RELATIONSHIPS, 'r': NS.OFC_RELATIONSHIPS}`
+- `oxml_to_encoded_bytes(element, encoding='utf-8', pretty_print=False, standalone=None) -> bytes`
+- `oxml_tostring(elm, encoding=None, pretty_print=False, standalone=None)`
+- `serialize_part_xml(part_elm) -> bytes` — Produce XML-file bytes for `part_elm`, suitable for writing directly to a `.xml` file.
+
+## `pptx.opc.package`
+
+Fundamental Open Packaging Convention (OPC) objects.
+
+Full contract: [opc.package.md](api-003.md#source-5a9871cc4e6c3d66)
+
+- `OpcPackage` — Main API class for `python-opc`.
+- `Part` — Base class for package parts.
+- `PartFactory` — Constructs a registered subtype of `Part`.
+- `XmlPart` — Base class for package parts containing an XML payload, which is most of them.
+
+## `pptx.opc.packuri`
+
+Provides the PackURI value type and known pack-URI strings such as PACKAGE_URI.
+
+Full contract: [opc.packuri.md](api-003.md#source-63e80df0d91d462c)
+
+- `CONTENT_TYPES_URI = PackURI('/[Content_Types].xml')`
+- `PACKAGE_URI = PackURI('/')`
+- `PackURI` — Proxy for a pack URI (partname).
+
+## `pptx.opc.serialized`
+
+API for reading/writing serialized Open Packaging Convention (OPC) package.
+
+Full contract: [opc.serialized.md](api-003.md#source-35792d9504efae5d)
+
+- `GuardedZipReader` — Validate and stream every member of an already-open ``ZipFile``.
+- `PackageReader` — Provides access to package-parts of an OPC package with dict semantics.
+- `PackageWriter` — Writes a zip-format OPC package to `pkg_file`.
+- `preflight_zip(source) -> None` — Validate central-directory metadata before ``ZipFile`` parses it.
+
+## `pptx.opc.shared`
+
+Objects shared by modules in the pptx.opc sub-package.
+
+Full contract: [opc.shared.md](api-003.md#source-12d7471663bc8a39)
+
+- `CaseInsensitiveDict` — Mapping type like dict except it matches key without respect to case.
+
+## `pptx.opc.spec`
+
+Provides mappings that embody aspects of the Open XML spec ISO/IEC 29500.
+
+Full contract: [opc.spec.md](api-003.md#source-9316cc7ef21393f0)
+
+- `default_content_types = (('bin', CT.PML_PRINTER_SETTINGS), ('bin', CT.SML_PRINTER_SETTINGS), ('bin', CT.WML_PRINTER_SETTINGS), ('bmp', CT.BMP), ('emf', CT.X_EMF), ('fntdata', CT.X_FONTDATA), ('gif', CT.GIF), ('jpe', CT.JPEG), ('jpeg', CT.JPEG), ('jpg', CT.JPEG), ('mov', CT.MOV), ('mp4', CT.MP4), ('mpg', CT.MPG), ('png', CT.PNG), ('rels', CT.OPC_RELATIONSHIPS), ('tif', CT.TIFF), ('tiff', CT.TIFF), ('vid', CT.VIDEO), ('wdp', CT.MS_PHOTO), ('wmf', CT.X_WMF), ('wmv', CT.WMV), ('xlsx', CT.SML_SHEET), ('xml', CT.XML))`
+- `image_content_types = {'bmp': CT.BMP, 'emf': CT.X_EMF, 'gif': CT.GIF, 'jpe': CT.JPEG, 'jpeg': CT.JPEG, 'jpg': CT.JPEG, 'png': CT.PNG, 'tif': CT.TIFF, 'tiff': CT.TIFF, 'wdp': CT.MS_PHOTO, 'wmf': CT.X_WMF}`
+
+## `pptx.oxml`
+
+Initializes lxml parser, particularly the custom element classes.
+
+Full contract: [oxml.md](api-003.md#source-bae1743dc9ddb82f)
+
+- `element_class_lookup = etree.ElementNamespaceClassLookup()`
+- `oxml_parser = etree.XMLParser(remove_blank_text=True, resolve_entities=False)`
+- `parse_from_template(template_file_name)` — Return an element loaded from the XML in the template file identified by `template_name`.
+- `parse_xml(xml)` — Return root lxml element obtained by parsing XML character string in `xml`.
+- `register_element_cls(nsptagname)` — Register `cls` to be constructed when oxml parser encounters element having `nsptag_name`.
+
+## `pptx.oxml.action`
+
+lxml custom element classes for text-related XML elements.
+
+Full contract: [oxml.action.md](api-003.md#source-c804902fbb787f54)
+
+- `CT_Hyperlink` — Custom element class for elements.
+
+## `pptx.oxml.chart.axis`
+
+Axis-related oxml objects.
+
+Full contract: [oxml.chart.axis.md](api-003.md#source-566f3b63c7e768e3)
+
+- `BaseAxisElement` — Base class for catAx, dateAx, valAx, and perhaps other axis elements.
+- `CT_AxisUnit` — Used for `c:majorUnit` and `c:minorUnit` elements, and others.
+- `CT_CatAx` — `c:catAx` element, defining a category axis.
+- `CT_ChartLines` — Used for `c:majorGridlines` and `c:minorGridlines`.
+- `CT_Crosses` — `c:crosses` element, specifying where the other axis crosses this one.
+- `CT_DateAx` — `c:dateAx` element, defining a date (category) axis.
+- `CT_LblOffset` — `c:lblOffset` custom element class.
+- `CT_Orientation` — `c:xAx/c:scaling/c:orientation` element, defining category order.
+- `CT_Scaling` — `c:scaling` element.
+- `CT_TickLblPos` — `c:tickLblPos` element.
+- `CT_TickMark` — Used for `c:minorTickMark` and `c:majorTickMark`.
+- `CT_ValAx` — `c:valAx` element, defining a value axis.
+
+## `pptx.oxml.chart.chart`
+
+Custom element classes for top-level chart-related XML elements.
+
+Full contract: [oxml.chart.chart.md](api-003.md#source-20c707c7c6bfd9bf)
+
+- `CT_Chart` — `c:chart` custom element class.
+- `CT_ChartSpace` — `c:chartSpace` root element of a chart part.
+- `CT_ExternalData` — `` element, defining link to embedded Excel package part
+- `CT_PlotArea` — ```` element.
+- `CT_Style` — ```` element; defines the chart style.
+
+## `pptx.oxml.chart.datalabel`
+
+Chart data-label related oxml objects.
+
+Full contract: [oxml.chart.datalabel.md](api-003.md#source-9b9fa7848c5b8421)
+
+- `CT_DLbl` — ```` element specifying the properties of the data label for an
+- `CT_DLblPos` — ```` element specifying the positioning of a data label with
+- `CT_DLbls` — `c:dLbls` element specifying properties for a set of data labels.
+
+## `pptx.oxml.chart.legend`
+
+lxml custom element classes for legend-related XML elements.
+
+Full contract: [oxml.chart.legend.md](api-003.md#source-7a24123fbbd345ca)
+
+- `CT_Legend` — ```` custom element class
+- `CT_LegendPos` — ```` element specifying position of legend with respect to
+
+## `pptx.oxml.chart.marker`
+
+Series-related oxml objects.
+
+Full contract: [oxml.chart.marker.md](api-003.md#source-10d46fe6d4d2326e)
+
+- `CT_Marker` — `c:marker` custom element class, containing visual properties for a data
+- `CT_MarkerSize` — `c:size` custom element class, specifying the size (in points) of a data
+- `CT_MarkerStyle` — `c:symbol` custom element class, specifying the shape of a data point
+
+## `pptx.oxml.chart.plot`
+
+Plot-related oxml objects.
+
+Full contract: [oxml.chart.plot.md](api-003.md#source-a49f289a1ad3ea52)
+
+- `BaseChartElement` — Base class for barChart, lineChart, and other plot elements.
+- `CT_Area3DChart` — ```` element.
+- `CT_AreaChart` — ```` element.
+- `CT_BarChart` — ```` element.
+- `CT_BarDir` — ```` child of a barChart element, specifying the orientation of
+- `CT_BubbleChart` — ```` custom element class
+- `CT_BubbleScale` — ```` custom element class
+- `CT_DoughnutChart` — ```` element.
+- `CT_GapAmount` — ```` child of ```` element, also used for other
+- `CT_Grouping` — ```` child of an xChart element, specifying a value like
+- `CT_LineChart` — ```` custom element class
+- `CT_Overlap` — ```` element specifying bar overlap as an integer percentage
+- `CT_PieChart` — ```` custom element class
+- `CT_RadarChart` — ```` custom element class
+- `CT_ScatterChart` — ```` custom element class
+
+## `pptx.oxml.chart.series`
+
+Series-related oxml objects.
+
+Full contract: [oxml.chart.series.md](api-003.md#source-247322b154f45010)
+
+- `CT_AxDataSource` — ```` custom element class used in category charts to specify
+- `CT_DPt` — ```` custom element class, containing visual properties for a data
+- `CT_Lvl` — ```` custom element class used in multi-level categories to
+- `CT_NumDataSource` — ```` custom element class used in XY and bubble charts, and
+- `CT_SeriesComposite` — ```` custom element class. Note there are several different series
+- `CT_StrVal_NumVal_Composite` — ```` element, can be either CT_StrVal or CT_NumVal complex type.
+
+## `pptx.oxml.chart.shared`
+
+Shared oxml objects for charts.
+
+Full contract: [oxml.chart.shared.md](api-003.md#source-5a0df2b41da4068f)
+
+- `CT_Boolean` — Common complex type used for elements having a True/False value.
+- `CT_Boolean_Explicit` — Always spells out the `val` attribute, e.g. `val=1`.
+- `CT_Double` — Used for floating point values.
+- `CT_Layout` — ```` custom element class
+- `CT_LayoutMode` — Used for ````, ````, ````, and ````
+- `CT_ManualLayout` — ```` custom element class
+- `CT_NumFmt` — ``