About female reproductive systems size and structure

| Segment | Description |
|---|---|
| Intramural (uterine) portion | Passes through the uterine wall; narrowest lumen |
| Isthmus | Short, narrow, thick-walled segment |
| Ampulla | Longest, widest segment; where fertilization most commonly occurs |
| Infundibulum | Flared distal end with multiple finger-like fimbriae |
| Layer | Description |
|---|---|
| Endometrium | Inner mucosal layer; glandular epithelium + stroma; undergoes cyclical changes with the menstrual cycle |
| Myometrium | Thickest layer; interlocking bundles of smooth muscle; contracts during labor and menstruation |
| Perimetrium | Outer peritoneal (serosal) covering |
| Structure | Description |
|---|---|
| Mons pubis | Fatty mound over the pubic symphysis; covered with hair after puberty |
| Labia majora | Two large skin folds containing fat and sebaceous glands |
| Labia minora | Two smaller folds inside the labia majora; no fat, rich in sebaceous glands |
| Clitoris | Erectile organ; homologous to the penis; composed of two corpora cavernosa |
| Vestibule | Space between the labia minora; contains the urethral and vaginal openings |
| Hymen | Thin mucosal fold partially covering the vaginal opening |
| Bartholin's glands | Secrete lubricating mucus during sexual arousal |
Create a detailed study guide on female reproductive anatomy for reference
A detailed labeled anatomical diagram of the female reproductive system showing the ovaries, fallopian tubes, uterus, cervix, and vagina in cross-section, with clear labels for all major structures including endometrium, myometrium, perimetrium, fimbriae, ampulla, isthmus, fundus, body, cervical canal, internal os, external os, and vaginal rugae. Clean medical illustration style suitable for nursing education.
mkdir -p /home/daytona/workspace/female-repro-guide && curl -s -o /home/daytona/…
~/female-repro-guide/build_guide.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, Image, PageBreak, KeepTogether
)
from reportlab.platypus.flowables import BalancedColumns
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import os
OUTPUT = "/home/daytona/workspace/female-repro-guide/Female_Reproductive_Anatomy_Study_Guide.pdf"
ANATOMY_IMG = "/home/daytona/workspace/female-repro-guide/anatomy_diagram.png"
TEXTBOOK_IMG = "/home/daytona/workspace/female-repro-guide/textbook_diagram.png"
# ── Color palette ──────────────────────────────────────────────────────────────
PINK_DARK = colors.HexColor("#B5427A")
PINK_MED = colors.HexColor("#D4689A")
PINK_LIGHT = colors.HexColor("#FAE8F1")
PINK_PALE = colors.HexColor("#FDF3F8")
TEAL = colors.HexColor("#2A7F8C")
TEAL_LIGHT = colors.HexColor("#E0F4F6")
GOLD = colors.HexColor("#C8882A")
GOLD_LIGHT = colors.HexColor("#FDF3E3")
DARK_TEXT = colors.HexColor("#1C1C2E")
MID_GREY = colors.HexColor("#5A5A72")
LIGHT_GREY = colors.HexColor("#F4F4F8")
WHITE = colors.white
# ── Document setup ─────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2.2*cm, bottomMargin=2.2*cm,
title="Female Reproductive Anatomy - Nursing Study Guide",
author="Orris Medical Library"
)
W, H = A4
BODY_W = W - 4*cm
# ── Styles ─────────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()
def style(name, **kw):
return ParagraphStyle(name, **kw)
S_TITLE = style("S_TITLE",
fontSize=26, leading=32, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER, spaceAfter=4)
S_SUBTITLE = style("S_SUBTITLE",
fontSize=13, leading=17, textColor=colors.HexColor("#F9D4EA"),
fontName="Helvetica", alignment=TA_CENTER, spaceAfter=2)
S_H1 = style("S_H1",
fontSize=15, leading=20, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_LEFT,
spaceBefore=0, spaceAfter=0)
S_H2 = style("S_H2",
fontSize=12, leading=16, textColor=PINK_DARK,
fontName="Helvetica-Bold", alignment=TA_LEFT,
spaceBefore=10, spaceAfter=3)
S_H3 = style("S_H3",
fontSize=10.5, leading=14, textColor=TEAL,
fontName="Helvetica-Bold", alignment=TA_LEFT,
spaceBefore=7, spaceAfter=2)
S_BODY = style("S_BODY",
fontSize=9.5, leading=14, textColor=DARK_TEXT,
fontName="Helvetica", alignment=TA_JUSTIFY,
spaceBefore=2, spaceAfter=3)
S_BULLET = style("S_BULLET",
fontSize=9.5, leading=14, textColor=DARK_TEXT,
fontName="Helvetica", leftIndent=14, firstLineIndent=-10,
spaceBefore=1, spaceAfter=1)
S_TABLE_HEAD = style("S_TABLE_HEAD",
fontSize=9, leading=12, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER)
S_TABLE_CELL = style("S_TABLE_CELL",
fontSize=9, leading=12, textColor=DARK_TEXT,
fontName="Helvetica", alignment=TA_LEFT)
S_TABLE_CELL_C = style("S_TABLE_CELL_C",
fontSize=9, leading=12, textColor=DARK_TEXT,
fontName="Helvetica", alignment=TA_CENTER)
S_CALLOUT = style("S_CALLOUT",
fontSize=9, leading=13, textColor=DARK_TEXT,
fontName="Helvetica-Oblique", alignment=TA_LEFT,
leftIndent=8, rightIndent=8)
S_CAPTION = style("S_CAPTION",
fontSize=8, leading=11, textColor=MID_GREY,
fontName="Helvetica-Oblique", alignment=TA_CENTER,
spaceBefore=2, spaceAfter=6)
S_FOOTER = style("S_FOOTER",
fontSize=7.5, leading=10, textColor=MID_GREY,
fontName="Helvetica", alignment=TA_CENTER)
S_PAGE_TITLE = style("S_PAGE_TITLE",
fontSize=13, leading=17, textColor=PINK_DARK,
fontName="Helvetica-Bold", alignment=TA_LEFT,
spaceBefore=0, spaceAfter=6)
S_KEY = style("S_KEY",
fontSize=9, leading=12, textColor=DARK_TEXT,
fontName="Helvetica-Bold", alignment=TA_LEFT)
# ── Helper builders ────────────────────────────────────────────────────────────
def section_header(title, subtitle=None):
"""A colored section banner."""
inner = [Paragraph(title, S_H1)]
if subtitle:
inner.append(Paragraph(subtitle, style("sub", fontSize=9, leading=12,
textColor=colors.HexColor("#F9D4EA"), fontName="Helvetica",
alignment=TA_LEFT, spaceBefore=0, spaceAfter=0)))
t = Table([[inner]], colWidths=[BODY_W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), PINK_DARK),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING",(0,0), (-1,-1), 8),
("ROUNDEDCORNERS", [6]),
]))
return t
def info_box(text, bg=TEAL_LIGHT, border=TEAL):
t = Table([[Paragraph(text, S_CALLOUT)]], colWidths=[BODY_W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0), (-1,-1), 6),
("LINECOLOR", (0,0), (-1,-1), border),
("BOX", (0,0), (-1,-1), 1.5, border),
("ROUNDEDCORNERS", [4]),
]))
return t
def two_col_table(rows, col_headers, col_widths=None):
if col_widths is None:
col_widths = [BODY_W * 0.3, BODY_W * 0.7]
data = [[Paragraph(h, S_TABLE_HEAD) for h in col_headers]]
for r in rows:
data.append([Paragraph(str(c), S_TABLE_CELL) for c in r])
t = Table(data, colWidths=col_widths)
style_cmds = [
("BACKGROUND", (0,0), (-1,0), PINK_DARK),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, PINK_PALE]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#E8C4D8")),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]
t.setStyle(TableStyle(style_cmds))
return t
def three_col_table(rows, col_headers, col_widths=None):
if col_widths is None:
col_widths = [BODY_W/3]*3
data = [[Paragraph(h, S_TABLE_HEAD) for h in col_headers]]
for r in rows:
data.append([Paragraph(str(c), S_TABLE_CELL) for c in r])
t = Table(data, colWidths=col_widths)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, TEAL_LIGHT]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#A0D4DC")),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
return t
def gold_table(rows, col_headers, col_widths=None):
if col_widths is None:
col_widths = [BODY_W * 0.3, BODY_W * 0.7]
data = [[Paragraph(h, S_TABLE_HEAD) for h in col_headers]]
for r in rows:
data.append([Paragraph(str(c), S_TABLE_CELL) for c in r])
t = Table(data, colWidths=col_widths)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), GOLD),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GOLD_LIGHT]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#D4A870")),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
return t
def bullet(text, symbol="•"):
return Paragraph(f"<b>{symbol}</b> {text}", S_BULLET)
def sp(h=6):
return Spacer(1, h)
def hr(color=PINK_MED, thickness=0.5):
return HRFlowable(width="100%", thickness=thickness, color=color, spaceAfter=4, spaceBefore=4)
# ── Page background & header/footer ───────────────────────────────────────────
def on_page(canvas, doc):
canvas.saveState()
# Header bar
canvas.setFillColor(PINK_PALE)
canvas.rect(0, H - 1.5*cm, W, 1.5*cm, fill=1, stroke=0)
canvas.setFillColor(PINK_MED)
canvas.rect(0, H - 1.55*cm, W, 0.05*cm, fill=1, stroke=0)
canvas.setFont("Helvetica-Bold", 8)
canvas.setFillColor(PINK_DARK)
canvas.drawString(2*cm, H - 1.1*cm, "Female Reproductive Anatomy")
canvas.setFont("Helvetica", 8)
canvas.setFillColor(MID_GREY)
canvas.drawRightString(W - 2*cm, H - 1.1*cm, "Nursing Study Guide")
# Footer bar
canvas.setFillColor(LIGHT_GREY)
canvas.rect(0, 0, W, 1.3*cm, fill=1, stroke=0)
canvas.setFillColor(PINK_MED)
canvas.rect(0, 1.25*cm, W, 0.05*cm, fill=1, stroke=0)
canvas.setFont("Helvetica", 7.5)
canvas.setFillColor(MID_GREY)
canvas.drawString(2*cm, 0.45*cm, "Sources: Junqueira's Basic Histology 17e | Histology: A Text and Atlas 7e | Medical Physiology (Boron & Boulpaep)")
canvas.drawRightString(W - 2*cm, 0.45*cm, f"Page {doc.page}")
canvas.restoreState()
def on_first_page(canvas, doc):
canvas.saveState()
# Full cover background gradient effect using rectangles
for i in range(40):
frac = i / 40
r = int(0xB5 + frac * (0x6A - 0xB5))
g = int(0x42 + frac * (0x1A - 0x42))
b = int(0x7A + frac * (0x5E - 0x7A))
canvas.setFillColorRGB(r/255, g/255, b/255)
canvas.rect(0, H - (i+1)*(H*0.42/40), W, H*0.42/40 + 1, fill=1, stroke=0)
# Footer
canvas.setFillColor(LIGHT_GREY)
canvas.rect(0, 0, W, 1.3*cm, fill=1, stroke=0)
canvas.setFillColor(PINK_MED)
canvas.rect(0, 1.25*cm, W, 0.05*cm, fill=1, stroke=0)
canvas.setFont("Helvetica", 7.5)
canvas.setFillColor(MID_GREY)
canvas.drawString(2*cm, 0.45*cm, "Sources: Junqueira's Basic Histology 17e | Histology: A Text and Atlas 7e | Medical Physiology (Boron & Boulpaep)")
canvas.drawRightString(W - 2*cm, 0.45*cm, "Page 1")
canvas.restoreState()
# ── Content ────────────────────────────────────────────────────────────────────
story = []
# ═══════════════════════════════════════════════════════════════════
# COVER PAGE
# ═══════════════════════════════════════════════════════════════════
story.append(Spacer(1, 1*cm))
# Cover title block (on top of header gradient)
cover_title = Table([
[Paragraph("Female Reproductive", S_TITLE)],
[Paragraph("Anatomy", style("CT2", fontSize=32, leading=38, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER))],
[Spacer(1, 4)],
[Paragraph("Nursing Study Guide", S_SUBTITLE)],
[Paragraph("Structure · Size · Histology · Menstrual Cycle · Clinical Notes", S_SUBTITLE)],
], colWidths=[BODY_W])
cover_title.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.transparent),
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING", (0,0), (-1,-1), 0),
("TOPPADDING", (0,0), (-1,-1), 2),
("BOTTOMPADDING", (0,0), (-1,-1), 2),
]))
story.append(cover_title)
story.append(sp(14))
# Anatomy image on cover
if os.path.exists(ANATOMY_IMG):
img = Image(ANATOMY_IMG, width=BODY_W * 0.85, height=8*cm, kind="proportional")
img_tbl = Table([[img]], colWidths=[BODY_W])
img_tbl.setStyle(TableStyle([
("ALIGN", (0,0), (-1,-1), "CENTER"),
("BACKGROUND", (0,0), (-1,-1), colors.white),
("LEFTPADDING", (0,0), (-1,-1), 0),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING",(0,0),(-1,-1),8),
]))
story.append(img_tbl)
story.append(sp(12))
# Quick-reference summary box
qr_data = [
["🎯 What you'll learn:", ""],
["", "Anatomy and size of all female reproductive organs"],
["", "Histological layers of the uterus, vagina, and ovary"],
["", "Ovarian follicle development and ovulation"],
["", "3 phases of the menstrual cycle"],
["", "External genitalia and clinical significance"],
["", "Key nursing clinical notes for each structure"],
]
qr_tbl = Table(qr_data, colWidths=[BODY_W*0.32, BODY_W*0.68])
qr_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#1C1C2E")),
("TEXTCOLOR", (0,0), (0,0), colors.HexColor("#F9D4EA")),
("FONTNAME", (0,0), (0,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("TEXTCOLOR", (1,1), (-1,-1), WHITE),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("SPAN", (0,0), (1,0)),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#262640"), colors.HexColor("#1C1C2E")]),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(qr_tbl)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════
# TABLE OF CONTENTS (simple)
# ═══════════════════════════════════════════════════════════════════
story.append(sp(4))
story.append(Paragraph("Contents", style("toc_head", fontSize=18, leading=22,
textColor=PINK_DARK, fontName="Helvetica-Bold", spaceAfter=8)))
story.append(hr(PINK_MED, 1.2))
story.append(sp(4))
toc_items = [
("1", "Overview of the Female Reproductive System", "3"),
("2", "Ovaries — Structure & Size", "3"),
("3", "Uterine (Fallopian) Tubes", "4"),
("4", "Uterus — Layers, Regions & Size", "4"),
("5", "Cervix", "5"),
("6", "Vagina", "5"),
("7", "External Genitalia (Vulva)", "6"),
("8", "Menstrual Cycle — 3 Phases", "6"),
("9", "Ovarian Cycle & Follicle Development", "7"),
("10", "Key Clinical Notes for Nurses", "8"),
("11", "Quick-Reference Size Summary", "8"),
("12", "Review Questions", "9"),
]
toc_data = [[Paragraph(f"<b>{n}.</b> {title}", style("toc_item",
fontSize=9.5, leading=14, textColor=DARK_TEXT, fontName="Helvetica")),
Paragraph(f"<b>{pg}</b>", style("toc_pg",
fontSize=9.5, leading=14, textColor=PINK_DARK, fontName="Helvetica-Bold",
alignment=TA_CENTER))]
for n, title, pg in toc_items]
toc_tbl = Table(toc_data, colWidths=[BODY_W*0.88, BODY_W*0.12])
toc_tbl.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0), (-1,-1), [WHITE, PINK_PALE]),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("LINEBELOW", (0,-1), (-1,-1), 0.5, colors.HexColor("#E8C4D8")),
]))
story.append(toc_tbl)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════
# SECTION 1: OVERVIEW
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("1. Overview of the Female Reproductive System",
"Location, components, and lifecycle summary"))
story.append(sp(8))
story.append(Paragraph(
"The female reproductive system produces haploid gametes (ova), facilitates fertilization, provides a site "
"for embryo implantation, supports fetal development, and nurtures the neonate. All major organs undergo "
"cyclical structural changes from <b>menarche</b> (first menses, mean age 12.4 years) to <b>menopause</b> "
"(cessation of cycles, mean age 51.4 years).", S_BODY))
story.append(sp(6))
overview_rows = [
["Internal Organs", "Ovaries, uterine (fallopian) tubes, uterus, vagina — all within the pelvic cavity"],
["External Genitalia", "Mons pubis, labia majora & minora, clitoris, vestibule, hymen, urethral orifice (collectively the vulva)"],
["Accessory Gland", "Mammary glands — functionally linked via reproductive hormones"],
["Hormonal Control", "Hypothalamic–pituitary–gonadal (HPG) axis: GnRH → LH/FSH → Estrogens & Progesterone"],
["Cycle Length", "Normal menstrual cycle: 21–34 days (average 28 days)"],
]
story.append(two_col_table(overview_rows, ["Component", "Description"],
[BODY_W*0.28, BODY_W*0.72]))
story.append(sp(8))
# Textbook diagram
if os.path.exists(TEXTBOOK_IMG):
img2 = Image(TEXTBOOK_IMG, width=BODY_W*0.9, height=9*cm, kind="proportional")
img2_tbl = Table([[img2]], colWidths=[BODY_W])
img2_tbl.setStyle(TableStyle([
("ALIGN", (0,0), (-1,-1), "CENTER"),
("BACKGROUND", (0,0), (-1,-1), WHITE),
("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#E8C4D8")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1),6),
]))
story.append(img2_tbl)
story.append(Paragraph(
"Figure 1. Posterior view of the female internal sex organs showing uterus, uterine tubes, and ovaries with labeled "
"layers: endometrium, myometrium, perimetrium. (Histology: A Text and Atlas, 7e)", S_CAPTION))
story.append(sp(10))
# ═══════════════════════════════════════════════════════════════════
# SECTION 2: OVARIES
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("2. Ovaries", "Size · Zones · Follicles · Hormones"))
story.append(sp(8))
story.append(Paragraph("<b>Size & Shape:</b>", S_H2))
story.append(info_box(
"Each ovary is almond-shaped: approximately 3 cm long × 1.5 cm wide × 1 cm thick in a sexually mature female. "
"Weight: ~6–8 g. They lie on the lateral walls of the pelvic cavity, suspended by the mesovarium and the "
"suspensory ligament of the ovary.",
bg=PINK_LIGHT, border=PINK_MED))
story.append(sp(6))
story.append(Paragraph("<b>Structural Zones:</b>", S_H2))
ovary_rows = [
["Surface Epithelium", "Simple cuboidal (germinal) epithelium; continuous with peritoneal mesothelium"],
["Tunica Albuginea", "Dense fibrous connective tissue capsule beneath the surface epithelium"],
["Cortex (outer)", "Highly cellular stroma; contains ovarian follicles, corpora lutea, and corpora albicantia at various stages"],
["Medulla (inner)", "Loose connective tissue; large blood vessels, lymphatics, nerves; no follicles"],
]
story.append(two_col_table(ovary_rows, ["Zone / Layer", "Description"]))
story.append(sp(6))
story.append(Paragraph("<b>Follicle Types (Developmental Sequence):</b>", S_H2))
follicle_rows = [
["Primordial follicle", "Oocyte + single layer of flat follicular cells; dormant pool from fetal life"],
["Primary follicle (unilaminar)", "Oocyte + single layer of cuboidal granulosa cells"],
["Primary follicle (multilaminar)", "Oocyte + stratified granulosa layer; zona pellucida forms (5–10 µm thick)"],
["Secondary (antral) follicle", "Fluid-filled antrum appears in granulosa layer; theca interna & externa differentiated"],
["Graafian (mature) follicle", "Large fluid-filled follicle (~2 cm); oocyte reaches 120 µm diameter; ready to ovulate"],
["Corpus luteum", "Post-ovulation endocrine gland; secretes progesterone & estrogen; lasts ~14 days if no pregnancy"],
["Corpus albicans", "White scar tissue remaining after corpus luteum regresses"],
]
story.append(three_col_table(
[(r[0], r[1], "") for r in follicle_rows],
["Follicle Type", "Key Features", ""],
[BODY_W*0.28, BODY_W*0.72, 0.001]))
story.append(sp(6))
story.append(Paragraph("<b>Ovarian Hormones:</b>", S_H2))
story.append(bullet("<b>Estrogens</b> (mainly estradiol): promote growth of sex organs, secondary sexual characteristics, endometrial proliferation, bone density, feedback on HPG axis."))
story.append(bullet("<b>Progesterone</b>: secreted by corpus luteum; prepares endometrium for implantation, maintains pregnancy, reduces uterine contractility."))
story.append(bullet("<b>Inhibin</b>: negative feedback on FSH secretion from anterior pituitary."))
story.append(sp(10))
# ═══════════════════════════════════════════════════════════════════
# SECTION 3: UTERINE TUBES
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("3. Uterine (Fallopian) Tubes",
"Pathway for ovum transport; site of fertilization"))
story.append(sp(8))
story.append(info_box(
"Each uterine tube is approximately 10–12 cm long. There are two tubes, one on each side. "
"Fertilization most commonly occurs in the ampullary segment.",
bg=TEAL_LIGHT, border=TEAL))
story.append(sp(6))
story.append(Paragraph("<b>4 Anatomical Segments (medial → lateral):</b>", S_H2))
tube_rows = [
["Intramural (uterine)", "~1 cm", "Passes through uterine wall; narrowest lumen; opens into uterine cavity"],
["Isthmus", "~2–3 cm", "Short, narrow, thick-walled segment adjacent to the uterus"],
["Ampulla", "~5–8 cm", "Longest, widest, thin-walled; site of fertilization; folded mucosa"],
["Infundibulum", "~1 cm", "Funnel-shaped distal end; opens into peritoneal cavity; bears fimbriae"],
]
tbl = Table(
[[Paragraph(h, S_TABLE_HEAD) for h in ["Segment", "Length", "Description"]]] +
[[Paragraph(c, S_TABLE_CELL) for c in r] for r in tube_rows],
colWidths=[BODY_W*0.25, BODY_W*0.12, BODY_W*0.63])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, TEAL_LIGHT]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#A0D4DC")),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(tbl)
story.append(sp(6))
story.append(Paragraph("<b>Histological Wall Layers:</b>", S_H2))
story.append(bullet("<b>Mucosa</b>: simple columnar epithelium with ciliated cells (beat toward uterus) and peg/secretory cells (nourish ovum and sperm). Folds are most elaborate in the ampulla."))
story.append(bullet("<b>Muscularis</b>: inner circular + outer longitudinal smooth muscle; peristaltic contractions assist ovum transport."))
story.append(bullet("<b>Serosa</b>: visceral peritoneum (part of broad ligament = mesosalpinx)."))
story.append(sp(4))
story.append(info_box(
"Clinical Note: Ectopic pregnancy most often implants in the ampulla of the uterine tube (~70% of ectopics). "
"Ciliary dysfunction (e.g., from PID/chlamydia) impairs ovum transport and raises ectopic risk.",
bg=GOLD_LIGHT, border=GOLD))
story.append(sp(10))
# ═══════════════════════════════════════════════════════════════════
# SECTION 4: UTERUS
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("4. Uterus", "Pear-shaped muscular organ · 3 regions · 3 wall layers"))
story.append(sp(8))
story.append(info_box(
"Size (nulliparous adult): ~7.5 cm long × 5 cm wide × 2.5 cm thick. Weight: 40–80 g. "
"The uterus is a complex, pear-shaped, muscular organ suspended by broad, round, uterosacral, "
"and cardinal (transverse cervical) ligaments.",
bg=PINK_LIGHT, border=PINK_MED))
story.append(sp(6))
story.append(Paragraph("<b>3 Gross Regions:</b>", S_H2))
regions_rows = [
["Fundus", "Dome-shaped superior portion, above the entry of the uterine tubes"],
["Body (corpus)", "Main middle portion; contains the triangular uterine cavity"],
["Cervix", "Narrow inferior portion; connects to vagina via the cervical canal"],
]
story.append(two_col_table(regions_rows, ["Region", "Description"]))
story.append(sp(8))
story.append(Paragraph("<b>3 Wall Layers (outer → inner):</b>", S_H2))
wall_rows = [
["Perimetrium", "Outer", "Visceral peritoneum (serosa); covers most of the uterus"],
["Myometrium", "Middle (thickest)", "Interlocking bundles of smooth muscle. 3 poorly defined sub-layers. Contracts powerfully during labor (driven by oxytocin) and during menstruation. Hypertrophies dramatically during pregnancy."],
["Endometrium", "Inner", "Simple columnar epithelium + lamina propria with uterine glands. Divided into stratum basale (permanent, non-shed) and stratum functionale (cyclically shed at menstruation). Supplied by spiral arteries."],
]
tbl2 = Table(
[[Paragraph(h, S_TABLE_HEAD) for h in ["Layer", "Position", "Details"]]] +
[[Paragraph(c, S_TABLE_CELL) for c in r] for r in wall_rows],
colWidths=[BODY_W*0.22, BODY_W*0.18, BODY_W*0.60])
tbl2.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), PINK_DARK),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, PINK_PALE]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#E8C4D8")),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(tbl2)
story.append(sp(10))
# ═══════════════════════════════════════════════════════════════════
# SECTION 5: CERVIX
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("5. Cervix", "Lower uterine segment · transformation zone · clinical importance"))
story.append(sp(8))
story.append(Paragraph(
"The cervix is the narrow, caudal portion of the uterus, approximately <b>2.5–3 cm long</b>. "
"It is composed of <b>dense fibrous connective tissue</b> with smooth muscle cells, giving it much "
"less distensibility than the uterine body — until labor, when cervical ripening (softening) occurs.", S_BODY))
story.append(sp(6))
cervix_rows = [
["Endocervical canal", "Connects uterine cavity (internal os) to vagina (external os)"],
["Endocervical epithelium", "Simple columnar (mucus-secreting) lining the canal; estrogen and progesterone alter mucus viscosity throughout the cycle"],
["Ectocervix", "Portion visible on speculum exam; lined by stratified squamous epithelium (like vagina)"],
["Transformation Zone (TZ)", "Junction where columnar epithelium meets squamous epithelium; undergoes squamous metaplasia; site of highest cervical cancer risk — targeted by Pap smear"],
["Nabothian cysts", "Mucus-filled retention cysts formed when squamous cells overgrow and block cervical gland openings; normal finding"],
]
story.append(two_col_table(cervix_rows, ["Feature", "Description"]))
story.append(sp(4))
story.append(info_box(
"Clinical Note: The transformation zone is sampled during a Pap (cervical) smear. HPV infection at the TZ "
"is the primary cause of cervical dysplasia and carcinoma. Cervical dilation from 0 → 10 cm occurs during "
"the first stage of labor.",
bg=GOLD_LIGHT, border=GOLD))
story.append(sp(10))
# ═══════════════════════════════════════════════════════════════════
# SECTION 6: VAGINA
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("6. Vagina", "Fibromuscular tube · birth canal · pH acidic"))
story.append(sp(8))
story.append(info_box(
"Size: approximately 10 cm long in an adult woman (the posterior wall is slightly longer than the anterior). "
"The vagina is a single, expandable fibromuscular tube that connects the uterus to the external environment.",
bg=TEAL_LIGHT, border=TEAL))
story.append(sp(6))
vagina_rows = [
["Mucosa", "Stratified squamous non-keratinized epithelium; transverse folds called rugae increase surface area; NO glands — lubrication from cervical mucus and transudate through vaginal wall"],
["Muscularis", "Inner circular + outer longitudinal smooth muscle layers"],
["Adventitia", "Dense fibrous connective tissue anchoring vagina to adjacent structures"],
["pH", "Acidic (pH 3.8–4.5) maintained by lactic acid from Lactobacillus bacteria metabolizing glycogen in epithelial cells; protects against infection"],
["Estrogen effect", "Thickens the vaginal epithelium; increases glycogen content; atrophic vaginitis occurs post-menopause due to estrogen withdrawal"],
["Fornices", "Recesses around the cervix (anterior, posterior, lateral); posterior fornix deepest — clinical importance in pelvic abscess drainage"],
]
story.append(two_col_table(vagina_rows, ["Feature", "Description"]))
story.append(sp(10))
# ═══════════════════════════════════════════════════════════════════
# SECTION 7: EXTERNAL GENITALIA
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("7. External Genitalia (Vulva)",
"Mons pubis · labia · clitoris · vestibule"))
story.append(sp(8))
vulva_rows = [
["Mons pubis", "Fatty prominence over the pubic symphysis; covered with pubic hair after puberty"],
["Labia majora", "Two large folds of skin containing adipose tissue, sebaceous and sweat glands; homologous to the male scrotum"],
["Labia minora", "Two smaller, hairless folds inside the labia majora; rich in sebaceous glands; highly vascular; no adipose tissue"],
["Clitoris", "Erectile organ at the anterior junction of the labia minora; composed of two corpora cavernosa; homologous to the penis; richly innervated"],
["Vestibule", "Space enclosed by the labia minora; contains the urethral orifice (anterior) and the vaginal opening (posterior)"],
["Hymen", "Thin mucous membrane partially covering the vaginal opening; variable anatomy"],
["Bartholin's glands\n(greater vestibular)", "Located at 4 and 8 o'clock positions at vaginal opening; secrete mucus for lubrication during sexual arousal; can form Bartholin's cysts if duct obstructed"],
["Skene's glands\n(lesser vestibular)", "Para-urethral glands; homologous to the male prostate; can occasionally become infected"],
["Perineum", "Diamond-shaped region between thighs; divided by perineal body into anterior urogenital triangle and posterior anal triangle"],
]
story.append(two_col_table(vulva_rows, ["Structure", "Description"]))
story.append(sp(10))
# ═══════════════════════════════════════════════════════════════════
# SECTION 8: MENSTRUAL CYCLE
# ═══════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_header("8. Menstrual Cycle — 3 Phases",
"Controlled by HPG axis · Average 28 days · Days 1–28"))
story.append(sp(8))
story.append(Paragraph(
"The menstrual cycle involves coordinated changes in both the <b>ovary</b> (ovarian cycle) and the "
"<b>endometrium</b> (endometrial/uterine cycle). It is controlled by gonadotropins (FSH and LH) from the "
"anterior pituitary, which are in turn regulated by GnRH from the hypothalamus, and by feedback from "
"ovarian steroids.", S_BODY))
story.append(sp(6))
# Phase table
phase_rows = [
["Menstrual Phase",
"Days 1–5",
"Corpus luteum degenerates → estrogen & progesterone drop → spiral arteries spasm → stratum functionale sheds. Approximately 30–80 mL blood lost.",
"Observe for normal bleeding pattern; assess for dysmenorrhea; check pad/tampon usage"],
["Proliferative (Follicular) Phase",
"Days 6–13",
"Rising estrogen (from growing follicle) stimulates endometrial regrowth. Stratum basale rebuilds stratum functionale from ~1 mm to ~3 mm. Glands are straight with narrow lumina. Ovulation on day 14 (LH surge triggers it).",
"Fertile window approaching; cervical mucus becomes watery & stretchy (spinnbarkeit); mittelschmerz (mid-cycle pain) at ovulation"],
["Secretory (Luteal) Phase",
"Days 15–28",
"Corpus luteum secretes progesterone + estrogen. Endometrium thickens to 5–7 mm; glands become tortuous and glycogen-rich; spiral arteries coil deeply. If no implantation → corpus luteum regresses → cycle restarts.",
"Progesterone dominance; PMS symptoms common; BBT rises 0.2–0.5°C after ovulation; implantation window days 20–24"],
]
phase_tbl = Table(
[[Paragraph(h, S_TABLE_HEAD) for h in ["Phase", "Days", "Endometrial Changes", "Nursing / Clinical Notes"]]] +
[[Paragraph(c, S_TABLE_CELL) for c in r] for r in phase_rows],
colWidths=[BODY_W*0.22, BODY_W*0.1, BODY_W*0.40, BODY_W*0.28])
phase_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), PINK_DARK),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, PINK_PALE]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#E8C4D8")),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
# Color-code rows
("BACKGROUND", (0,1), (-1,1), colors.HexColor("#FFE5E5")), # menstrual
("BACKGROUND", (0,2), (-1,2), colors.HexColor("#E8F8E8")), # proliferative
("BACKGROUND", (0,3), (-1,3), colors.HexColor("#E8E8FF")), # secretory
]))
story.append(phase_tbl)
story.append(sp(6))
# Hormone summary
story.append(Paragraph("<b>Hormone Summary by Phase:</b>", S_H2))
hor_rows = [
["Menstrual", "Low", "Low", "High", "High (FSH starts rising)"],
["Proliferative", "Rising", "Low", "Low", "Moderate (then LH surge)"],
["Secretory", "Moderate", "High (corpus luteum)", "Low", "Low"],
]
hor_tbl = Table(
[[Paragraph(h, S_TABLE_HEAD) for h in ["Phase", "Estrogen", "Progesterone", "FSH", "LH"]]] +
[[Paragraph(c, S_TABLE_CELL_C) for c in r] for r in hor_rows],
colWidths=[BODY_W*0.22, BODY_W*0.17, BODY_W*0.25, BODY_W*0.18, BODY_W*0.18])
hor_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, TEAL_LIGHT]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#A0D4DC")),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ALIGN", (0,0), (-1,-1), "CENTER"),
]))
story.append(hor_tbl)
story.append(sp(10))
# ═══════════════════════════════════════════════════════════════════
# SECTION 9: OVARIAN CYCLE
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("9. Ovarian Cycle & Follicle Development",
"Follicular phase · Ovulation · Luteal phase"))
story.append(sp(8))
story.append(Paragraph(
"The ovarian cycle runs concurrently with the menstrual cycle and has two main phases: "
"the <b>follicular phase</b> (days 1–13) and the <b>luteal phase</b> (days 15–28), "
"separated by <b>ovulation</b> (day ~14).", S_BODY))
story.append(sp(6))
ov_cycle_rows = [
["Follicular Phase\n(Days 1–13)",
"FSH stimulates several primordial follicles to grow. One becomes the dominant (Graafian) follicle (~18–20 mm). "
"Granulosa cells aromatize androgens to estradiol. Rising estradiol causes positive feedback on LH release."],
["Ovulation\n(Day ~14)",
"LH surge (triggered by peak estrogen) causes follicle rupture within ~36–44 hours. Secondary oocyte (arrested in metaphase II) "
"is released with the corona radiata. The oocyte is swept into the fallopian tube by fimbriae."],
["Luteal Phase\n(Days 15–28)",
"Ruptured follicle → corpus luteum (yellow gland) under LH stimulation. Produces progesterone + estrogen for ~14 days. "
"If no hCG (no pregnancy): corpus luteum → corpus albicans. If pregnancy: hCG from trophoblast maintains corpus luteum until placenta takes over (~10 weeks)."],
]
for phase_name, desc in ov_cycle_rows:
story.append(Paragraph(f"<b>{phase_name}</b>", S_H3))
story.append(Paragraph(desc, S_BODY))
story.append(sp(4))
story.append(sp(4))
story.append(info_box(
"Key fact: The oocyte completes meiosis II ONLY upon fertilization by a sperm. Until then it remains "
"arrested at metaphase II. This is clinically relevant for understanding fertilization timing.",
bg=PINK_LIGHT, border=PINK_MED))
story.append(sp(10))
# ═══════════════════════════════════════════════════════════════════
# SECTION 10: CLINICAL NOTES
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("10. Key Clinical Notes for Nurses",
"Assessment · Common conditions · Patient education"))
story.append(sp(8))
clinical_rows = [
["Ovarian cysts", "Functional cysts (follicle or corpus luteum) are most common; usually resolve spontaneously. Rupture can cause acute pelvic pain (mittelsschmerz = physiological; severe = pathological). Assess with ultrasound."],
["Ectopic pregnancy", "Most occur in the ampulla (~70%). Presents with unilateral pelvic pain, vaginal bleeding, and positive beta-hCG. Emergency — risk of tube rupture and hemorrhage."],
["Uterine fibroids\n(leiomyomas)", "Benign smooth muscle tumors of the myometrium. Most common uterine tumor. Can cause heavy menstrual bleeding (menorrhagia), pelvic pressure, and infertility. Size varies from mm to >10 cm."],
["Endometriosis", "Endometrial tissue outside the uterus (ovaries, tubes, peritoneum). Causes cyclic pelvic pain, dysmenorrhea, dyspareunia, and infertility."],
["Cervical cancer", "HPV (types 16, 18) infects the transformation zone → cervical intraepithelial neoplasia (CIN) → invasive carcinoma. Prevention: HPV vaccine + regular Pap smears (start age 21, every 3 years)."],
["Atrophic vaginitis", "Post-menopausal estrogen loss causes thinning, dryness, and inflammation of the vaginal epithelium. Symptoms: dryness, dyspareunia, recurrent UTIs. Managed with topical estrogen."],
["Pelvic inflammatory\ndisease (PID)", "Ascending infection (commonly Chlamydia, Gonorrhoea) from cervix → uterus → tubes → ovaries. Risk of tubal scarring → ectopic pregnancy, infertility, and chronic pelvic pain."],
["Menopause assessment", "Average age 51.4 years. Diagnose clinically after 12 months of amenorrhea. Symptoms: hot flushes, night sweats, mood changes, urogenital atrophy. Assess cardiovascular and bone health."],
]
story.append(two_col_table(clinical_rows, ["Condition", "Key Points for Nursing Practice"]))
story.append(sp(10))
# ═══════════════════════════════════════════════════════════════════
# SECTION 11: SIZE SUMMARY
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("11. Quick-Reference Size Summary",
"All dimensions at a glance"))
story.append(sp(8))
size_rows = [
["Ovaries", "3 cm L × 1.5 cm W × 1 cm thick", "~6–8 g", "Almond-shaped; lateral pelvic walls"],
["Uterine tubes", "10–12 cm each", "—", "Ampulla is longest segment (~5–8 cm)"],
["Uterus", "7.5 cm L × 5 cm W × 2.5 cm thick", "40–80 g", "Pear-shaped; grows dramatically in pregnancy"],
["Cervix", "~2.5–3 cm L", "—", "Dilates to 10 cm during labor"],
["Vagina", "~10 cm L", "—", "Expandable; posterior wall slightly longer"],
["Graafian follicle", "~18–20 mm diameter", "—", "Visible on ultrasound at ovulation"],
["Mature oocyte", "~120 µm diameter", "—", "Largest cell in the human body"],
["Zona pellucida", "5–10 µm thick", "—", "Extracellular matrix around oocyte"],
]
size_tbl = Table(
[[Paragraph(h, S_TABLE_HEAD) for h in ["Structure", "Dimensions", "Weight", "Notes"]]] +
[[Paragraph(c, S_TABLE_CELL) for c in r] for r in size_rows],
colWidths=[BODY_W*0.22, BODY_W*0.25, BODY_W*0.12, BODY_W*0.41])
size_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), GOLD),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GOLD_LIGHT]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#D4A870")),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(size_tbl)
story.append(sp(10))
# ═══════════════════════════════════════════════════════════════════
# SECTION 12: REVIEW QUESTIONS
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("12. Review Questions",
"Test your knowledge"))
story.append(sp(8))
questions = [
("1.", "A 28-year-old woman presents with sudden right-sided pelvic pain and a positive beta-hCG. "
"She is 6 weeks from her last menstrual period. Which structure is most likely involved, "
"and what is the anatomical reason it is the most common site?"),
("2.", "Name the three layers of the uterine wall from inside to outside. Which layer is shed "
"during menstruation, and which is retained?"),
("3.", "At what stage of the menstrual cycle does ovulation occur, and what hormonal event triggers it?"),
("4.", "What is the transformation zone of the cervix, and why is it clinically significant?"),
("5.", "A post-menopausal patient complains of vaginal dryness and recurrent urinary tract infections. "
"Explain the histological changes responsible and the underlying cause."),
("6.", "What are the approximate dimensions of a normal ovary in a sexually mature female?"),
("7.", "During which menstrual phase does endometrial thickness reach approximately 5–7 mm, "
"and which hormone is primarily responsible?"),
("8.", "What is the difference between the stratum basale and stratum functionale of the endometrium?"),
("9.", "A patient asks why her cervical mucus changes consistency throughout her cycle. "
"What hormones are responsible, and what are the changes?"),
("10.", "List four structures found in the vulva (external genitalia)."),
]
for num, q in questions:
qbox = Table([[
Paragraph(num, style("qnum", fontSize=9.5, leading=13, textColor=PINK_DARK,
fontName="Helvetica-Bold")),
Paragraph(q, S_BODY)
]], colWidths=[BODY_W*0.06, BODY_W*0.94])
qbox.setStyle(TableStyle([
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING", (0,0), (-1,-1), 0),
("TOPPADDING", (0,0), (-1,-1), 0),
("BOTTOMPADDING",(0,0), (-1,-1), 0),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
answer_line = Table([[Paragraph("Answer: ___________________________________________"
"________________________________________________", style("ans", fontSize=8.5,
leading=11, textColor=MID_GREY, fontName="Helvetica-Oblique"))]],
colWidths=[BODY_W])
answer_line.setStyle(TableStyle([
("LEFTPADDING", (0,0), (-1,-1), 16),
("TOPPADDING", (0,0), (-1,-1), 0),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
]))
story.append(KeepTogether([qbox, answer_line, sp(4)]))
story.append(sp(8))
story.append(hr(PINK_MED, 1))
story.append(sp(4))
story.append(Paragraph(
"Sources: Junqueira's Basic Histology: Text and Atlas, 17e | "
"Histology: A Text and Atlas with Correlated Cell and Molecular Biology, 7e | "
"Medical Physiology (Boron & Boulpaep) | Junqueira's Basic Histology, 17e",
S_FOOTER))
# ── Build ──────────────────────────────────────────────────────────────────────
doc.build(story, onFirstPage=on_first_page, onLaterPages=on_page)
print("PDF built successfully:", OUTPUT)
cd /home/daytona/workspace/female-repro-guide && python build_guide.py 2>&1
~/female-repro-guide/build_guide.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/female-repro-guide/build_guide.py'
cd /home/daytona/workspace/female-repro-guide && python build_guide.py 2>&1
ls -lh /home/daytona/workspace/female-repro-guide/Female_Reproductive_Anatomy_St…
Female Reproductive Anatomy Study Guide
PDF Document · PDF
| Section | Content |
|---|---|
| Cover page | Title, generated anatomy diagram, learning objectives |
| Table of Contents | 12 sections with page numbers |
| 1. Overview | System components, HPG axis, lifecycle (menarche → menopause), textbook diagram |
| 2. Ovaries | Almond-shape (3×1.5×1 cm), cortex/medulla, all follicle types (primordial → corpus albicans), hormone summary |
| 3. Uterine Tubes | 4 segments (intramural, isthmus, ampulla, infundibulum), wall layers, ectopic pregnancy note |
| 4. Uterus | 3 regions, 3 wall layers (perimetrium/myometrium/endometrium), dimensions |
| 5. Cervix | Transformation zone, internal/external os, clinical notes (Pap smear, HPV) |
| 6. Vagina | ~10 cm, rugae, pH 3.8-4.5, estrogen effects, fornices |
| 7. External Genitalia | All vulval structures with descriptions |
| 8. Menstrual Cycle | Color-coded 3-phase table (menstrual/proliferative/secretory) with endometrial changes, nursing notes, and hormone summary |
| 9. Ovarian Cycle | Follicular phase, ovulation, luteal phase — timed with menstrual cycle |
| 10. Clinical Notes | 8 conditions (fibroids, ectopic, PID, endometriosis, cervical cancer, atrophic vaginitis, etc.) |
| 11. Size Summary | Quick-reference gold table - all structures with dimensions |
| 12. Review Questions | 10 write-in clinical questions for self-testing |
Thank you 🥰