Teach me like neonatologist/paeditrcian in depth topic -Tuner syndrome
"Turner syndrome" management
| Parameter | Data |
|---|---|
| Incidence in live-born females | ~1 in 2,000-3,000 |
| Spontaneous abortions | 45,X is the most common cytogenetic abnormality in miscarried fetuses - accounts for ~18% of all chromosomally caused abortions |
| Survival of 45,X conceptuses | Only ~1% of monosomy X embryos survive to term |
| Paternal origin of error | In ~75-80% of cases, it is the paternal sex chromosome that is missing |
The fact that only ~1% survive highlights how lethal the complete 45,X karyotype is in utero. Most die before 28 weeks.
| Karyotype | Description |
|---|---|
| 46,X,i(X)(q10) - isochromosome Xq | Most common structural variant. Duplication of long arm (Xq), loss of short arm (Xp). Associated with higher rates of autoimmune thyroid disease. |
| 46,X,r(X) - ring chromosome | Deletions of both short and long arms form a ring. Variable phenotype; sometimes associated with more severe features. |
| 46,X,del(Xp) or del(Xq) | Partial deletions of short or long arms |
| Mosaic Karyotype | Clinical significance |
|---|---|
| 45,X/46,XX | Most common mosaic (10-15%). May be nearly normal in appearance; may present only with primary amenorrhea. Some can conceive. |
| 45,X/46,XY | 2-5%. Critical - risk of gonadoblastoma 12-20%. |
| 45,X/47,XXX | Triple X mosaicism |
| 45,X/46,X,i(X)(q10) | Combined structural + mosaic |
Clinician note: With conventional cytogenetics, mosaicism is detected in ~30% of TS patients. With more sensitive molecular techniques (FISH, PCR), this rises to 75%. The proportion of 45,X cells determines phenotypic severity.

| Feature | Detail |
|---|---|
| Lymphedema of dorsum of hands and feet | Most common neonatal finding. Due to lymph stasis from distended lymphatic channels. |
| Cystic hygroma / nuchal edema | Distended lymphatics at the nape of neck → in survivors → resolves to webbing of neck + loose neck skin |
| Webbing of neck (pterygium colli) | Persistent skin fold from residual lymphedema |
| Low posterior hairline | |
| Broad / shield chest | |
| Widely spaced nipples | |
| Cubitus valgus | Increased carrying angle at elbow |
| Short 4th metacarpal | Brachymetacarpia |
| Hypoplastic nails | |
| Multiple pigmented nevi | |
| High-arched palate | |
| Ptosis, hypertelorism, retrognathia, ear malformations | Facial features |
| Peripheral edema at birth | May be first presenting sign |
| Lesion | Prevalence |
|---|---|
| Bicuspid aortic valve (BAV) | Most common structural CHD in TS |
| Coarctation of the aorta | Classic association; ~5% of girls presenting with coarctation have Turner syndrome |
| Aortic root dilation | Present in 30% |
| Aortic dissection risk | 100-fold higher than the general population |
| Partial anomalous pulmonary venous drainage | Less common |
Cardiovascular abnormalities are the most common cause of death in childhood and the most important cause of increased mortality overall in Turner syndrome.
| Renal Anomaly | Frequency |
|---|---|
| Horseshoe kidney | ~10% |
| Duplication of collecting system or renal agenesis | ~20% |
| Malrotation | ~15% |
| Multiple renal arteries | ~90% (noted on cardiovascular evaluation) |
Important counseling point (ascertainment bias): If a 45,X/46,XX or 45,X/46,XY karyotype is incidentally found prenatally, approximately 90% of fetuses will have a NORMAL phenotype at birth (due to selection bias - most severely affected 45,X fetuses abort). This has profound implications for prenatal counseling. However, a purely 45,X fetus found prenatally has a prognosis similar to postnatal diagnosis.
| Investigation | Why |
|---|---|
| Karyotype (minimum 30 cells) | Confirm diagnosis, detect mosaicism |
| FISH for Y-chromosome material or PCR | Detect occult Y material (in all TS patients) |
| Echocardiogram | Bicuspid aortic valve, coarctation, aortic root |
| Renal ultrasound | Structural renal anomalies |
| TSH, thyroid antibodies | Autoimmune thyroiditis |
| FSH, LH, Estradiol | Confirm hypergonadotropic hypogonadism |
| Blood pressure (both arms) | Coarctation surveillance |
| Audiogram | Sensorineural hearing loss |
| Bone age | Growth assessment |
| Fasting glucose, lipids | Metabolic screening |
| Liver function tests | NAFLD |
| System | Surveillance |
|---|---|
| Cardiac | Echocardiogram/MRI every 3-5 years; more frequent if BAV/aortic dilation |
| Blood pressure | Annually |
| Thyroid | TSH annually |
| Hearing | Audiogram every 3-5 years |
| Glucose/lipids | Every 2-3 years |
| Liver function | Annually |
| Bone density | DEXA in adulthood |
| Ophthalmology | Strabismus, amblyopia screening |
| Psychosocial | Learning support, neurodevelopmental assessment |
| System | Complication | Key Point |
|---|---|---|
| Cardiovascular | Coarctation, BAV, aortic dissection | #1 cause of death |
| Gonadal | Streak ovaries, primary amenorrhea | Hypergonadotropic hypogonadism |
| Oncologic | Gonadoblastoma | Only if Y material present |
| Thyroid | Autoimmune hypothyroidism | Up to 50% lifetime risk |
| Metabolic | Insulin resistance, metabolic syndrome | GH therapy worsens IR |
| Renal | Horseshoe kidney, duplication | 33-60% affected |
| Neurocognitive | Visuospatial deficits, non-verbal LD | Normal verbal IQ |
| Auditory | SNHL, recurrent otitis media | Progressive with age |
| Skeletal | Short stature, osteoporosis, scoliosis | SHOX haploinsufficiency |
Above all contents word by word in pdf
mkdir -p /tmp/workspace/turner-syndrome && ls /tmp/workspace/turner-syndrome/
~/turner-syndrome/generate_pdf.py
#!/usr/bin/env python3
"""Generate Turner Syndrome comprehensive PDF using ReportLab."""
import urllib.request
import os
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib.colors import HexColor, black, white
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, Image, PageBreak
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus.flowables import Flowable
# ── Output path ──────────────────────────────────────────────────────────────
OUT = "/tmp/workspace/turner-syndrome/Turner_Syndrome_Neonatologist_Guide.pdf"
# ── Colour palette ────────────────────────────────────────────────────────────
NAVY = HexColor("#1A3A5C")
TEAL = HexColor("#1A7A8A")
LIGHT_BLUE= HexColor("#D6EAF8")
PALE_TEAL = HexColor("#E8F6F3")
PALE_ORANGE = HexColor("#FEF9E7")
HEADER_BG = HexColor("#1A3A5C")
ROW_ALT = HexColor("#EBF5FB")
TABLE_HDR = HexColor("#1A7A8A")
ORANGE = HexColor("#E67E22")
RED = HexColor("#C0392B")
GREEN = HexColor("#1E8449")
GRAY_LIGHT= HexColor("#F2F3F4")
GRAY_MID = HexColor("#AAB7B8")
# ── Download the Turner syndrome diagram image ────────────────────────────────
IMG_URL = "https://cdn.orris.care/cdss_images/edcafa4b45a5638f8ec22d2efd3573f71180bd82ce6de8fe6d0e9b572edc1876.png"
IMG_PATH = "/tmp/workspace/turner-syndrome/turner_diagram.png"
if not os.path.exists(IMG_PATH):
urllib.request.urlretrieve(IMG_URL, IMG_PATH)
# ── Document setup ─────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUT,
pagesize=A4,
leftMargin=1.8*cm, rightMargin=1.8*cm,
topMargin=2.2*cm, bottomMargin=2.2*cm,
title="Turner Syndrome – In-Depth Guide for Neonatologists & Paediatricians",
author="Orris Medical Education",
subject="Turner Syndrome Comprehensive Reference"
)
W, H = A4
CONTENT_W = W - 3.6*cm
# ── Styles ────────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def style(name, parent="Normal", **kwargs):
s = ParagraphStyle(name, parent=styles[parent], **kwargs)
return s
# Register styles
S = {
"cover_title": style("cover_title", fontSize=28, textColor=white,
alignment=TA_CENTER, leading=34, fontName="Helvetica-Bold"),
"cover_sub": style("cover_sub", fontSize=15, textColor=HexColor("#AED6F1"),
alignment=TA_CENTER, leading=20, fontName="Helvetica"),
"cover_tag": style("cover_tag", fontSize=11, textColor=HexColor("#AED6F1"),
alignment=TA_CENTER, leading=15, fontName="Helvetica-Oblique"),
"h1": style("h1", fontSize=14, textColor=white,
fontName="Helvetica-Bold", alignment=TA_LEFT, leading=18,
leftIndent=0, spaceBefore=14, spaceAfter=4),
"h2": style("h2", fontSize=11.5, textColor=NAVY,
fontName="Helvetica-Bold", leading=15, spaceBefore=10, spaceAfter=3),
"h3": style("h3", fontSize=10.5, textColor=TEAL,
fontName="Helvetica-Bold", leading=14, spaceBefore=7, spaceAfter=2),
"body": style("body", fontSize=9.5, textColor=HexColor("#2C3E50"),
leading=14, spaceAfter=4, alignment=TA_JUSTIFY,
fontName="Helvetica"),
"body_bold": style("body_bold", fontSize=9.5, textColor=HexColor("#2C3E50"),
leading=14, fontName="Helvetica-Bold"),
"bullet": style("bullet", fontSize=9.5, textColor=HexColor("#2C3E50"),
leading=14, leftIndent=14, firstLineIndent=-10,
spaceAfter=3, fontName="Helvetica"),
"bullet2": style("bullet2", fontSize=9.2, textColor=HexColor("#2C3E50"),
leading=13, leftIndent=28, firstLineIndent=-10,
spaceAfter=2, fontName="Helvetica"),
"th": style("th", fontSize=9, textColor=white,
fontName="Helvetica-Bold", alignment=TA_CENTER, leading=12),
"td": style("td", fontSize=8.8, textColor=HexColor("#2C3E50"),
fontName="Helvetica", alignment=TA_LEFT, leading=12),
"td_c":style("td_c",fontSize=8.8, textColor=HexColor("#2C3E50"),
fontName="Helvetica", alignment=TA_CENTER, leading=12),
"td_b":style("td_b",fontSize=8.8, textColor=HexColor("#2C3E50"),
fontName="Helvetica-Bold", alignment=TA_LEFT, leading=12),
"pearl": style("pearl", fontSize=9.3, textColor=HexColor("#7D6608"),
fontName="Helvetica-Bold", leading=13, leftIndent=10),
"note": style("note", fontSize=8.8, textColor=HexColor("#154360"),
fontName="Helvetica-Oblique", leading=12, leftIndent=10),
"warning": style("warning", fontSize=9.3, textColor=HexColor("#78281F"),
fontName="Helvetica-Bold", leading=13, leftIndent=10),
"caption": style("caption", fontSize=8, textColor=HexColor("#5D6D7E"),
fontName="Helvetica-Oblique", alignment=TA_CENTER, leading=11),
"source": style("source", fontSize=7.5, textColor=GRAY_MID,
fontName="Helvetica-Oblique", alignment=TA_CENTER, leading=10),
"footer": style("footer", fontSize=7.5, textColor=GRAY_MID,
fontName="Helvetica", alignment=TA_CENTER, leading=10),
}
# ── Helper flowables ──────────────────────────────────────────────────────────
class ColorBox(Flowable):
"""Solid colour rectangle as a background banner."""
def __init__(self, width, height, color, radius=4):
super().__init__()
self.width = width
self.height = height
self.color = color
self.radius = radius
def draw(self):
self.canv.setFillColor(self.color)
self.canv.roundRect(0, 0, self.width, self.height, self.radius, fill=1, stroke=0)
def section_header(number, title, color=NAVY):
"""Returns a section header as a coloured banner with white text."""
data = [[Paragraph(f" {number} {title}", S["h1"])]]
t = Table(data, colWidths=[CONTENT_W])
t.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), color),
("ROWBACKGROUNDS", (0, 0), (-1, -1), [color]),
("TOPPADDING", (0, 0), (-1, -1), 7),
("BOTTOMPADDING", (0, 0), (-1, -1), 7),
("LEFTPADDING", (0, 0), (-1, -1), 8),
("RIGHTPADDING", (0, 0), (-1, -1), 8),
("ROUNDEDCORNERS", [4]),
]))
return t
def two_col_table(headers, rows, col_widths=None, alt=True):
"""Styled table with teal header row."""
if col_widths is None:
col_widths = [CONTENT_W * 0.35, CONTENT_W * 0.65]
data = [[Paragraph(h, S["th"]) for h in headers]]
for i, row in enumerate(rows):
data.append([Paragraph(str(c), S["td_b"] if i % 2 == 0 and alt else S["td"]) for c in row])
t = Table(data, colWidths=col_widths, repeatRows=1)
tbl_style = [
("BACKGROUND", (0, 0), (-1, 0), TABLE_HDR),
("TEXTCOLOR", (0, 0), (-1, 0), white),
("GRID", (0, 0), (-1, -1), 0.4, HexColor("#BFC9CA")),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING", (0, 0), (-1, -1), 5),
("LEFTPADDING", (0, 0), (-1, -1), 6),
("RIGHTPADDING", (0, 0), (-1, -1), 6),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("FONTNAME", (0, 1), (-1, -1), "Helvetica"),
("FONTSIZE", (0, 1), (-1, -1), 8.8),
]
if alt:
for i in range(1, len(data)):
if i % 2 == 0:
tbl_style.append(("BACKGROUND", (0, i), (-1, i), ROW_ALT))
t.setStyle(TableStyle(tbl_style))
return t
def highlight_box(text, bg=PALE_TEAL, border_color=TEAL, style_key="note"):
"""Coloured callout box."""
data = [[Paragraph(text, S[style_key])]]
t = Table(data, colWidths=[CONTENT_W])
t.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), bg),
("LINEAFTER", (0, 0), (0, -1), 2, border_color),
("LINEBEFORE", (0, 0), (0, -1), 4, border_color),
("TOPPADDING", (0, 0), (-1, -1), 7),
("BOTTOMPADDING", (0, 0), (-1, -1), 7),
("LEFTPADDING", (0, 0), (-1, -1), 12),
("RIGHTPADDING", (0, 0), (-1, -1), 10),
("ROUNDEDCORNERS", [3]),
]))
return t
def pearl_box(text):
return highlight_box(f"🔑 {text}", bg=PALE_ORANGE,
border_color=ORANGE, style_key="pearl")
def warning_box(text):
return highlight_box(f"⚠ {text}", bg=HexColor("#FADBD8"),
border_color=RED, style_key="warning")
def p(text, sty="body"):
return Paragraph(text, S[sty])
def b(text):
return Paragraph(f"• {text}", S["bullet"])
def b2(text):
return Paragraph(f"◦ {text}", S["bullet2"])
def sp(n=6):
return Spacer(1, n)
def hr():
return HRFlowable(width="100%", thickness=0.5, color=GRAY_MID, spaceAfter=4, spaceBefore=4)
# ── Page template with header/footer ─────────────────────────────────────────
def on_page(canvas, doc):
canvas.saveState()
# Top rule
canvas.setStrokeColor(TEAL)
canvas.setLineWidth(1.5)
canvas.line(1.8*cm, H - 1.6*cm, W - 1.8*cm, H - 1.6*cm)
# Header text
canvas.setFont("Helvetica-Bold", 7.5)
canvas.setFillColor(NAVY)
canvas.drawString(1.8*cm, H - 1.4*cm, "TURNER SYNDROME")
canvas.setFont("Helvetica", 7.5)
canvas.setFillColor(GRAY_MID)
canvas.drawRightString(W - 1.8*cm, H - 1.4*cm, "Neonatologist / Paediatrician Reference")
# Bottom rule
canvas.setStrokeColor(TEAL)
canvas.line(1.8*cm, 1.5*cm, W - 1.8*cm, 1.5*cm)
# Page number
canvas.setFont("Helvetica", 7.5)
canvas.setFillColor(GRAY_MID)
canvas.drawCentredString(W / 2, 1.0*cm, f"Page {doc.page}")
canvas.restoreState()
def on_first_page(canvas, doc):
pass # cover page – no header/footer
# ── Build story ───────────────────────────────────────────────────────────────
story = []
# ══════════════════════════════════════════════════════════════════════════════
# COVER PAGE
# ══════════════════════════════════════════════════════════════════════════════
# Full-page navy background
class FullPageCover(Flowable):
def __init__(self, w, h):
super().__init__()
self.width = w
self.height = h
def draw(self):
c = self.canv
c.setFillColor(NAVY)
c.rect(0, 0, self.width, self.height, fill=1, stroke=0)
c.setFillColor(TEAL)
c.rect(0, self.height * 0.30, self.width, 6, fill=1, stroke=0)
c.rect(0, self.height * 0.70, self.width, 6, fill=1, stroke=0)
story.append(FullPageCover(W, H))
story.append(Spacer(1, 5.5*cm))
story.append(p("TURNER SYNDROME", "cover_title"))
story.append(sp(12))
story.append(p("In-Depth Clinical Reference for Neonatologists & Paediatricians", "cover_sub"))
story.append(sp(20))
story.append(p("Genetics · Pathogenesis · Clinical Features · Neonatal Presentation", "cover_tag"))
story.append(sp(6))
story.append(p("Diagnosis · Management · Surveillance · Pearls", "cover_tag"))
story.append(sp(60))
story.append(p("Sources: Robbins Pathology · Campbell-Walsh Urology · The Developing Human", "cover_tag"))
story.append(sp(4))
story.append(p("PubMed Systematic Reviews 2025 | Orris Medical Education | July 2026", "cover_tag"))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 1 – DEFINITION & HISTORY
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("1.", "Definition and Historical Background", NAVY))
story.append(sp(6))
story.append(p(
"Turner syndrome (TS) is a chromosomal disorder resulting from <b>complete or partial "
"monosomy of the X chromosome</b>, characterised by <b>hypogonadism in phenotypic females</b>. "
"It is the most common sex chromosome abnormality in females."
))
story.append(sp(4))
story.append(b("<b>1938</b> – Henry Turner first described the triad of sexual infantilism, webbed neck, and cubitus valgus as a distinct clinical entity."))
story.append(b("<b>1930</b> – Otto Ullrich had described similar features; hence the European term 'Ullrich–Turner syndrome'."))
story.append(b("<b>1959</b> – Ford et al. identified the chromosomal basis: the 45,X karyotype."))
story.append(b("Gonadal dysgenesis was subsequently recognised as a core component of the syndrome."))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 2 – EPIDEMIOLOGY
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("2.", "Epidemiology", NAVY))
story.append(sp(6))
epi_rows = [
["Incidence in live-born females", "~1 in 2,000–3,000"],
["Survival of 45,X conceptuses", "Only ~1% of monosomy X embryos survive to term"],
["In utero lethality", "45,X is the most common cytogenetic abnormality in miscarried fetuses"],
["% of chromosomal abortions", "~18% of all chromosomally caused spontaneous abortions"],
["Origin of the error", "~75–80% cases: missing chromosome is PATERNAL (sperm defect)"],
]
story.append(two_col_table(["Parameter", "Data"], epi_rows))
story.append(sp(5))
story.append(highlight_box(
"The fact that only ~1% of 45,X conceptions survive to term highlights how lethal complete "
"monosomy X is in utero. The live-born infant with Turner syndrome represents the 'milder end' "
"of a profoundly severe prenatal spectrum.",
bg=LIGHT_BLUE, border_color=NAVY, style_key="note"
))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 3 – GENETICS
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("3.", "Genetics and Karyotypes", TEAL))
story.append(sp(6))
story.append(p("3a. Classic Karyotype", "h2"))
story.append(p(
"<b>45,X (monosomy X)</b> – present in approximately <b>57%</b> of cases. "
"A single maternal X chromosome, with the paternal sex chromosome absent."
))
story.append(sp(5))
story.append(p("3b. Structural Abnormalities of the X (~14%)", "h2"))
story.append(p("In order of frequency:"))
story.append(sp(3))
struct_rows = [
["46,X,i(X)(q10)\nIsochromosome Xq",
"Most common structural variant. Duplication of long arm (Xq), loss of short arm (Xp). "
"Highest association with autoimmune thyroid disease."],
["46,X,r(X)\nRing chromosome",
"Deletions of both Xp and Xq arms form a ring. Variable — sometimes more severe phenotype."],
["46,X,del(Xp) or del(Xq)\nPartial deletions",
"Partial loss of short or long arm. Phenotype depends on region deleted."],
]
story.append(two_col_table(["Karyotype", "Description"], struct_rows, col_widths=[CONTENT_W*0.28, CONTENT_W*0.72]))
story.append(sp(7))
story.append(p("3c. Mosaicism (~29%)", "h2"))
story.append(p("Two or more chromosomally distinct cell lines co-existing:"))
story.append(sp(3))
mos_rows = [
["45,X / 46,XX", "Most common mosaic (10–15%). May appear nearly normal; some can conceive."],
["45,X / 46,XY", "2–5%. CRITICAL — 12–20% risk of gonadoblastoma. Prophylactic gonadectomy required."],
["45,X / 47,XXX", "Triple X mosaicism"],
["45,X / 46,X,i(X)(q10)", "Combined structural + mosaic"],
]
story.append(two_col_table(["Mosaic Karyotype", "Clinical Significance"], mos_rows))
story.append(sp(5))
story.append(highlight_box(
"Clinician note: Conventional cytogenetics detects mosaicism in ~30% of TS patients. "
"With FISH and PCR, this rises to 75%. The proportion of 45,X cells determines phenotypic severity — "
"higher 45,X proportion = more severe features.",
bg=LIGHT_BLUE, border_color=TEAL, style_key="note"
))
story.append(sp(7))
story.append(p("3d. Y Chromosome Material — Most Critical Finding", "h2"))
story.append(b("Present in <b>5–10%</b> of Turner syndrome patients (complete Y or translocated Y fragments)."))
story.append(b("Risk of <b>gonadoblastoma: 12–20%</b>."))
story.append(b("Gonadoblastoma progresses to dysgerminoma or other malignant GCT in <b>18–35%</b> of cases."))
story.append(b("Reported as early as <b>5 months of age</b> — early detection and prophylactic gonadectomy is essential."))
story.append(b("Detection: use <b>FISH or PCR</b> in ALL TS patients — conventional karyotype may miss occult Y material."))
story.append(sp(5))
story.append(warning_box(
"Detection of Y-chromosome material mandates prompt prophylactic laparoscopic gonadectomy — "
"regardless of patient age — due to gonadoblastoma risk as early as 5 months."
))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 4 – PATHOGENESIS
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("4.", "Pathogenesis — Molecular Mechanisms", NAVY))
story.append(sp(6))
story.append(p("4a. SHOX Gene Haploinsufficiency", "h2"))
shox_rows = [
["Gene location", "SHOX at Xp22.33 — pseudoautosomal region 1 (PAR1)"],
["X-inactivation status", "Escapes X-inactivation → normally 2 copies in both males and females"],
["Effect in Turner syndrome", "Only 1 copy (haploinsufficiency) → short stature, Madelung deformity, skeletal anomalies"],
["Expression sites", "Growth plates of radius, ulna, tibia, fibula during fetal life"],
["Mirror image", "Klinefelter syndrome (extra X/SHOX) → tall stature — elegant confirmation of SHOX role"],
["In normal population", "SHOX deletions found in 2–5% of otherwise normal short children"],
]
story.append(two_col_table(["Feature", "Detail"], shox_rows))
story.append(sp(7))
story.append(p("4b. Ovarian Failure Mechanism", "h2"))
story.append(p(
"Normal fetal ovaries contain up to <b>7 million oocytes</b> at peak. This reduces to ~400,000 at menarche "
"and fewer than 10,000 at menopause. In Turner syndrome:"
))
story.append(b("Fetal ovaries develop <b>normally</b> through the first <b>18 weeks of gestation</b>."))
story.append(b("Absence of the second X chromosome → <b>accelerated apoptosis of oocytes</b>."))
story.append(b("By <b>age 2 years</b>, virtually no oocytes remain → streak ovaries."))
story.append(b("Both X chromosomes are active during oogenesis and are essential for ovarian maintenance."))
story.append(b("Follicular cells that normally protect oocytes are inadequate, accelerating oocyte loss."))
story.append(sp(5))
story.append(pearl_box(
'"Menopause occurs before menarche" — the defining pathophysiological statement of Turner syndrome ovarian failure.'
))
story.append(sp(5))
story.append(p("4c. Streak Ovaries — Pathology", "h2"))
story.append(p(
"Streak ovaries are white, fibrous structures <b>2–3 cm long × 0.5 cm wide</b>, located in the broad ligament. "
"Histologically: interlacing waves of dense fibrous stroma, devoid of oocytes and follicles — "
"otherwise indistinguishable from normal ovarian stroma. "
"Result: <b>low estrogen, low androgen, elevated FSH and LH</b> (hypergonadotropic hypogonadism)."
))
story.append(sp(5))
story.append(p("4d. Genotype–Phenotype Correlation", "h2"))
story.append(b("Somatic features (neck webbing, cardiac, lymphatic) → determined primarily by genes on the <b>short arm (Xp)</b>."))
story.append(b("Fertility and menstruation → affected by genes on the <b>long arm (Xq)</b>."))
story.append(b("SHOX haploinsufficiency explains short stature but not cardiac or metabolic features — multiple Xp genes are involved."))
story.append(b("In ~80% of cases the retained X chromosome is <b>maternal in origin</b> → error in paternal gametogenesis."))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 5 – CLINICAL FEATURES
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("5.", "Clinical Features — System by System", TEAL))
story.append(sp(6))
# Diagram
if os.path.exists(IMG_PATH):
img = Image(IMG_PATH, width=9*cm, height=11*cm)
img.hAlign = "CENTER"
story.append(img)
story.append(sp(3))
story.append(p(
"Fig. 1 — Clinical features and karyotypes of Turner syndrome.\n"
"(Source: Robbins & Kumar Basic Pathology, Fig. 4.20 / Robbins, Cotran & Kumar Pathologic Basis of Disease, Fig. 5.26)",
"caption"
))
story.append(sp(8))
story.append(p("5a. Neonatal Presentation — What the Neonatologist Sees First", "h2"))
neo_rows = [
["Lymphedema of hands/feet", "Most common neonatal finding. Dorsal pitting oedema from lymph stasis."],
["Cystic hygroma / nuchal oedema", "Markedly distended lymphatics at nape of neck in utero → resolves → webbing."],
["Webbing of neck (pterygium colli)", "Persistent skin fold; bilateral; low posterior hairline."],
["Broad / shield chest", "Widely spaced nipples on a broad thorax."],
["Cubitus valgus", "Increased carrying angle at elbow."],
["Short 4th metacarpal", "Brachymetacarpia — positive metacarpal sign."],
["Hypoplastic nails", "Dysplastic nails at birth."],
["Multiple pigmented nevi", "May increase with age."],
["High-arched palate", "Common orofacial feature."],
["Ptosis, hypertelorism, retrognathia", "Characteristic facial features."],
["Ear malformations", "Associated with hearing problems."],
["Peripheral lymphedema at birth", "Feet and hands; key clue to diagnosis in the delivery room."],
]
story.append(two_col_table(["Neonatal Feature", "Details"], neo_rows, col_widths=[CONTENT_W*0.35, CONTENT_W*0.65]))
story.append(sp(5))
story.append(pearl_box(
"The neonate with bilateral dorsal foot oedema and/or cystic hygroma in a female infant "
"must be karyotyped for Turner syndrome — this is the delivery room trigger."
))
story.append(sp(8))
story.append(p("5b. Cardiovascular — Most Common Cause of Mortality", "h2"))
story.append(p(
"Congenital heart disease affects <b>25–50%</b> of patients with Turner syndrome. "
"Predominantly <b>left-sided cardiovascular abnormalities</b>."
))
story.append(sp(3))
cardio_rows = [
["Bicuspid aortic valve (BAV)", "Most common structural CHD in TS; may be missed on routine echo."],
["Coarctation of the aorta", "Classic association. ~5% of girls with coarctation have Turner syndrome."],
["Aortic root dilation", "Present in ~30% of TS patients."],
["Aortic dissection", "100-fold higher risk than general population — can occur in young women."],
["Partial anomalous pulmonary venous drainage", "Less common but seen."],
["Hypertension", "Common; multifactorial — renal and cardiovascular."],
]
story.append(two_col_table(["Lesion", "Significance"], cardio_rows))
story.append(sp(5))
story.append(warning_box(
"Cardiovascular abnormalities are the most common cause of death in childhood and the most "
"important cause of increased overall mortality in Turner syndrome. Aortic dissection risk is "
"100-fold elevated — all women with TS require cardiac clearance before attempting pregnancy."
))
story.append(sp(8))
story.append(p("5c. Renal — Frequently Missed", "h2"))
story.append(p(
"<b>33–60%</b> of patients with Turner syndrome have structural or positional renal abnormalities "
"(most common in classic 45,X karyotype)."
))
story.append(sp(3))
renal_rows = [
["Horseshoe kidney", "~10%"],
["Duplication of collecting system or renal agenesis", "~20%"],
["Malrotation", "~15%"],
["Multiple renal arteries", "~90% (noted during cardiovascular evaluation)"],
]
story.append(two_col_table(["Renal Anomaly", "Frequency"], renal_rows, col_widths=[CONTENT_W*0.6, CONTENT_W*0.4]))
story.append(sp(8))
story.append(p("5d. Reproductive / Endocrine", "h2"))
story.append(b("Streak ovaries: fibrous strands devoid of oocytes."))
story.append(b("<b>Primary amenorrhea</b> in ~90% — genitalia remain infantile, minimal breast development, sparse pubic/axillary hair."))
story.append(b("Elevated FSH/LH: <b>hypergonadotropic hypogonadism</b>."))
story.append(b("Spontaneous puberty in up to <b>30%</b> (especially mosaic TS, particularly 45,X/46,XX)."))
story.append(b("Spontaneous conception in a very small number of 45,X/46,XX mosaics (~2–5%)."))
story.append(sp(7))
story.append(p("5e. Thyroid", "h2"))
story.append(b("Autoimmune thyroiditis (Hashimoto's) is significantly more common in TS."))
story.append(b("Most common in women with <b>isochromosome Xq</b> [i(Xq) karyotype]."))
story.append(b("Up to <b>50%</b> develop clinical <b>hypothyroidism</b> over their lifetime."))
story.append(b("Mechanism: autoantibodies against thyroid gland."))
story.append(b("Screen TSH at diagnosis and annually thereafter."))
story.append(sp(7))
story.append(p("5f. Metabolic / Hepatic", "h2"))
story.append(b("Glucose intolerance and <b>insulin resistance</b>."))
story.append(b("<b>Obesity</b> — higher prevalence than age-matched controls."))
story.append(b("<b>Non-alcoholic fatty liver disease (NAFLD)</b>."))
story.append(b("Some develop full <b>metabolic syndrome</b>."))
story.append(b("<b>Important: Growth hormone therapy worsens insulin resistance</b> — monitor glucose carefully during rhGH treatment."))
story.append(sp(7))
story.append(p("5g. Neurodevelopment / Cognitive", "h2"))
story.append(b("General intellect: usually within normal limits — <b>NOT associated with intellectual disability</b> in the classic sense."))
story.append(b("Specific deficit: <b>visual-spatial information processing</b> (non-verbal learning disability)."))
story.append(b("Difficulty with maths, spatial tasks, social perception, executive function."))
story.append(b("Normal verbal IQ; affected performance IQ."))
story.append(b("Higher rates of ADHD, anxiety, social difficulties."))
story.append(sp(7))
story.append(p("5h. Auditory / ENT", "h2"))
story.append(b("Sensorineural hearing loss (SNHL) — progressive, more prominent in adults."))
story.append(b("Recurrent otitis media in children (Eustachian tube dysfunction)."))
story.append(b("Routine audiological surveillance from childhood is recommended."))
story.append(sp(7))
story.append(p("5i. Musculoskeletal / Orthopaedic", "h2"))
story.append(b("<b>Cubitus valgus</b> — increased carrying angle."))
story.append(b("<b>Short 4th metacarpal</b> — positive metacarpal sign (Archibald sign)."))
story.append(b("<b>Scoliosis</b> in up to 10%."))
story.append(b("Osteoporosis in adulthood from estrogen deficiency."))
story.append(b("Short stature: average adult height <b>143–144 cm</b> without treatment (most populations)."))
story.append(b("<b>Madelung deformity</b> of the wrist (from SHOX haploinsufficiency)."))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 6 – PRENATAL DIAGNOSIS
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("6.", "Prenatal Diagnosis", NAVY))
story.append(sp(6))
story.append(p("Ultrasonographic features raising suspicion for Turner syndrome:"))
story.append(b("<b>Increased nuchal translucency</b> (most common and earliest finding)"))
story.append(b("Cystic hygroma / nuchal oedema"))
story.append(b("Lymphoedema"))
story.append(b("Coarctation of the aorta on fetal echo"))
story.append(b("Renal anomalies"))
story.append(b("Hydrops fetalis"))
story.append(sp(5))
story.append(p(
"Karyotyping options: <b>Chorionic villus sampling (CVS)</b> or <b>amniocentesis</b>. "
"Cell-free fetal DNA (cfDNA) screening can detect monosomy X but requires confirmatory karyotyping."
))
story.append(sp(5))
story.append(warning_box(
"CRITICAL COUNSELLING POINT — Ascertainment Bias: If 45,X/46,XX or 45,X/46,XY mosaicism is "
"INCIDENTALLY discovered prenatally (e.g., on NIPT), approximately 90% of these fetuses will have "
"a NORMAL phenotype at birth. This has profound implications — do not counsel as typical TS. "
"However, a purely 45,X karyotype found prenatally carries a prognosis similar to postnatal TS diagnosis."
))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 7 – DIAGNOSIS POST-NATAL
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("7.", "Postnatal Diagnosis", TEAL))
story.append(sp(6))
story.append(p("When to Suspect Turner Syndrome:", "h2"))
suspect_rows = [
["Neonate", "Lymphoedema of hands/feet, cystic hygroma, coarctation, hydrops fetalis in a female infant"],
["Child", "Short stature (below 3rd percentile), unexplained growth failure"],
["Adolescent", "Primary amenorrhea + short stature — the classic presentation"],
["Any age", "Short stature + primary amenorrhea → always karyotype"],
["Incidental", "~5% of girls presenting with coarctation of aorta have Turner syndrome"],
]
story.append(two_col_table(["Age / Setting", "Clinical Trigger"], suspect_rows))
story.append(sp(6))
story.append(p("Investigations at Diagnosis:", "h2"))
invest_rows = [
["Karyotype (≥30 cells)", "Confirm diagnosis; detect mosaicism. Minimum 30 cells to reduce false negative."],
["FISH or PCR for Y material", "ALL Turner syndrome patients — detect occult Y chromosome sequences."],
["Echocardiogram", "BAV, coarctation, aortic root diameter — baseline and periodic."],
["Renal ultrasound", "Structural renal anomalies (33–60% prevalence)."],
["TSH + thyroid antibodies", "Autoimmune thyroiditis screening."],
["FSH, LH, Oestradiol", "Confirm hypergonadotropic hypogonadism."],
["Blood pressure (both arms)", "Coarctation surveillance — compare bilateral BP."],
["Audiogram", "Sensorineural hearing loss baseline."],
["Bone age (X-ray left hand)", "Growth assessment and treatment planning."],
["Fasting glucose, insulin, lipids", "Metabolic syndrome screening."],
["Liver function tests", "NAFLD surveillance."],
["IGF-1", "Before growth hormone therapy."],
]
story.append(two_col_table(["Investigation", "Rationale"], invest_rows))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 8 – MANAGEMENT
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("8.", "Management — Neonatologist / Paediatrician Approach", NAVY))
story.append(sp(6))
story.append(p("8a. Neonatal Period — Immediate Steps", "h2"))
neo_mgmt_rows = [
["1", "Confirm karyotype (≥30 cells)", "Diagnostic certainty; detect mosaicism"],
["2", "FISH or PCR for Y chromosome in ALL cases", "Gonadoblastoma risk stratification — non-negotiable"],
["3", "If Y material confirmed → prophylactic laparoscopic gonadectomy", "Risk 12–20%; reported from 5 months of age"],
["4", "Echocardiogram", "BAV, coarctation — may require surgical intervention"],
["5", "Renal ultrasound", "Structural anomalies affect renal tract management"],
["6", "Monitor and manage lymphoedema", "Usually resolves; gentle compression if needed"],
["7", "Feeding support if needed", "Some neonates have poor suck/feeding difficulties"],
["8", "Refer to paediatric endocrinology", "Long-term GH and hormone planning"],
["9", "Genetic counselling for family", "Recurrence risk (sporadic in most cases) and implications"],
]
story.append(Table(
[[Paragraph(h, S["th"]) for h in ["Step", "Action", "Rationale"]]] +
[[Paragraph(str(r[i]), S["td_b"] if i == 1 else S["td"]) for i in range(3)] for r in neo_mgmt_rows],
colWidths=[CONTENT_W*0.08, CONTENT_W*0.42, CONTENT_W*0.50],
repeatRows=1,
style=TableStyle([
("BACKGROUND", (0, 0), (-1, 0), TABLE_HDR),
("TEXTCOLOR", (0, 0), (-1, 0), white),
("GRID", (0, 0), (-1, -1), 0.4, HexColor("#BFC9CA")),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING", (0, 0), (-1, -1), 5),
("LEFTPADDING", (0, 0), (-1, -1), 5),
("RIGHTPADDING", (0, 0), (-1, -1), 5),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("FONTSIZE", (0, 1), (-1, -1), 8.5),
("BACKGROUND", (0, 2), (-1, 2), ROW_ALT),
("BACKGROUND", (0, 4), (-1, 4), ROW_ALT),
("BACKGROUND", (0, 6), (-1, 6), ROW_ALT),
("BACKGROUND", (0, 8), (-1, 8), ROW_ALT),
])
))
story.append(sp(7))
story.append(p("8b. Growth Hormone Therapy (Children)", "h2"))
story.append(b("Recombinant human growth hormone (rhGH): <b>FDA-approved specifically for Turner syndrome</b> since 1996."))
story.append(b("Start age: typically <b>4–6 years</b> (or earlier if growth falls significantly below TS norms)."))
story.append(b("Dose: <b>0.045–0.050 mg/kg/day</b> — higher than for GH deficiency."))
story.append(b("Expected adult height gain: <b>5–8 cm above predicted untreated height</b>."))
story.append(b("Continue until bone age ~14–15 years or growth velocity becomes insufficient."))
story.append(b("<b>Monitor:</b> IGF-1, fasting glucose/insulin (GH worsens IR), thyroid function, scoliosis."))
story.append(b("Oxandrolone (low-dose anabolic steroid) may be added after age 9 years to augment height gain."))
story.append(sp(7))
story.append(p("8c. Estrogen Replacement Therapy (Puberty Induction)", "h2"))
story.append(b("Initiated at <b>age 12–15 years</b> if spontaneous puberty has not occurred."))
story.append(b("Start with <b>low-dose transdermal 17β-oestradiol</b> — the most physiological route."))
story.append(b("Gradually increase dose over <b>2–3 years</b> to mimic natural puberty."))
story.append(b("Add <b>progestogen</b> after 2 years or first breakthrough bleed → cyclic withdrawal bleeds."))
story.append(b("Goals: breast development, uterine growth, bone mineralisation, cardiovascular protection."))
story.append(b("Long-term HRT continued until natural age of menopause (~50 years)."))
story.append(sp(7))
story.append(p("8d. Fertility Considerations", "h2"))
story.append(b("Majority: infertile due to streak ovaries."))
story.append(b("<b>Donor egg IVF</b> is the main fertility option — uterus must be prepared with oestrogen."))
story.append(b("For mosaic TS with spontaneous menses: <b>oocyte cryopreservation</b> is evolving but still experimental."))
story.append(b("<b>Mandatory cardiac assessment</b> (aortic root MRI) before any pregnancy attempt."))
story.append(b("Pregnancy carries elevated risk of aortic dissection — multidisciplinary planning required."))
story.append(sp(7))
story.append(p("8e. Gonadoblastoma Prophylaxis", "h2"))
story.append(b("If Y-chromosome material detected → <b>laparoscopic prophylactic gonadectomy</b> — timely."))
story.append(b("Streak gonads confirmed in pure <b>45,X</b> patients (no Y material) → do NOT need removal."))
story.append(b("Age of occurrence is variable → do not delay once Y material is confirmed."))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 9 – SURVEILLANCE TABLE
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("9.", "Long-Term Surveillance Schedule", TEAL))
story.append(sp(6))
surv_rows = [
["Cardiac (echo or MRI)", "Every 3–5 years; more frequent if BAV or aortic dilation"],
["Blood pressure", "Annually"],
["Thyroid (TSH)", "Annually"],
["Hearing (audiogram)", "Every 3–5 years; earlier if symptoms"],
["Fasting glucose / lipids", "Every 2–3 years"],
["Liver function tests (LFT)", "Annually"],
["Bone density (DEXA)", "At transition to adulthood and periodically"],
["Ophthalmology", "Strabismus, amblyopia — childhood screening"],
["Renal function and BP", "If structural renal anomalies present"],
["Psychosocial / neurodevelopmental", "Learning support, ADHD/anxiety assessment"],
["Bladder/urethral cancer", "Awareness — increased risk in adult TS (British cohort data)"],
]
story.append(two_col_table(["System / Investigation", "Frequency / Notes"], surv_rows))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 10 – COMPLICATIONS SUMMARY
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("10.", "Complications Summary", NAVY))
story.append(sp(6))
comp_rows = [
["Cardiovascular", "Coarctation, BAV, aortic dissection", "#1 cause of death — 100× dissection risk"],
["Gonadal", "Streak ovaries, primary amenorrhea", "Hypergonadotropic hypogonadism"],
["Oncologic", "Gonadoblastoma", "ONLY if Y material present; from 5 months"],
["Thyroid", "Autoimmune hypothyroidism", "Up to 50% lifetime risk"],
["Metabolic", "Insulin resistance, metabolic syndrome", "GH therapy worsens IR"],
["Renal", "Horseshoe kidney, duplication", "33–60% affected"],
["Neurocognitive", "Visuospatial deficits, non-verbal LD", "Normal verbal IQ preserved"],
["Auditory", "SNHL, otitis media", "Progressive with age"],
["Skeletal", "Short stature, osteoporosis, scoliosis", "SHOX haploinsufficiency"],
["Hepatic", "NAFLD", "Screen LFTs; avoid alcohol counselling"],
]
story.append(Table(
[[Paragraph(h, S["th"]) for h in ["System", "Complication", "Key Point"]]] +
[[Paragraph(str(r[i]), S["td_b"] if i==1 else S["td"]) for i in range(3)] for r in comp_rows],
colWidths=[CONTENT_W*0.22, CONTENT_W*0.38, CONTENT_W*0.40],
repeatRows=1,
style=TableStyle([
("BACKGROUND", (0, 0), (-1, 0), NAVY),
("TEXTCOLOR", (0, 0), (-1, 0), white),
("GRID", (0, 0), (-1, -1), 0.4, HexColor("#BFC9CA")),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING", (0, 0), (-1, -1), 5),
("LEFTPADDING", (0, 0), (-1, -1), 5),
("RIGHTPADDING", (0, 0), (-1, -1), 5),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("FONTSIZE", (0, 1), (-1, -1), 8.5),
("BACKGROUND", (0, 2), (-1, 2), ROW_ALT),
("BACKGROUND", (0, 4), (-1, 4), ROW_ALT),
("BACKGROUND", (0, 6), (-1, 6), ROW_ALT),
("BACKGROUND", (0, 8), (-1, 8), ROW_ALT),
("BACKGROUND", (0, 10),(-1, 10), ROW_ALT),
])
))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 11 – CLINICAL PEARLS
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("11.", "Key Clinical Pearls for Exams and Practice", TEAL))
story.append(sp(6))
pearls = [
"Most 45,X conceptions abort (>99%) — Turner syndrome in live births is the 'milder end' of a profoundly severe prenatal spectrum.",
"The missing X chromosome is usually PATERNAL (~75–80%) — the error is in paternal gametogenesis (sperm).",
"Cystic hygroma in a female fetus on antenatal ultrasound → Turner syndrome until proven otherwise — karyotype.",
"~5% of girls presenting with coarctation of the aorta have Turner syndrome — always karyotype.",
"'Menopause before menarche' — ovarian failure is complete by age 2 years, yet puberty does not fail until adolescence.",
"Y material detection (FISH/PCR) is mandatory in ALL Turner syndrome patients — gonadoblastoma can occur at 5 months.",
"GH therapy worsens insulin resistance — monitor fasting glucose and insulin before and during treatment.",
"Thyroid autoantibodies are most common with isochromosome Xq [i(Xq)] — screen this subgroup most aggressively.",
"Prenatal ascertainment bias: incidentally detected mosaic TS (45,X/46,XX or 45,X/46,XY) prenatally → ~90% will be NORMAL phenotype at birth — counsel accordingly.",
"Aortic dissection risk is 100-fold elevated — ALL women with Turner syndrome require formal cardiac MRI clearance before any pregnancy attempt.",
"Normal intellect is the rule — but specific visuospatial processing deficits (non-verbal learning disability) require educational support.",
"Spontaneous puberty occurs in up to 30% of Turner syndrome patients — do not assume total pubertal failure without follow-up.",
"Short 4th metacarpal (positive Archibald/metacarpal sign) is a simple bedside clue in children.",
"The combination of SHORT STATURE + PRIMARY AMENORRHEA in any adolescent female must prompt karyotyping — this is Turner syndrome until proven otherwise.",
]
for i, pearl in enumerate(pearls, 1):
story.append(pearl_box(f"{i}. {pearl}"))
story.append(sp(4))
story.append(sp(6))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 12 – RECENT EVIDENCE
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("12.", "Recent Evidence — Systematic Reviews 2024–2026", NAVY))
story.append(sp(6))
evid_rows = [
["PMID 41243107\n(2025, Ann Med)",
"Global prevalence of autoimmune diseases in Turner syndrome: systematic review and meta-analysis",
"Confirms significantly elevated global prevalence of autoimmune diseases in TS. Reinforces need for lifelong autoimmune surveillance, especially thyroid."],
["PMID 39743222\n(2025, Congenit Anom Kyoto)",
"Karyotype and phenotype association in Turner syndrome with non-mosaic X chromosome structural rearrangements: systematic review",
"Refines karyotype-specific phenotype counselling for structural X rearrangements — helps predict clinical severity by karyotype subtype."],
["PMID 40557696\n(2025, Am J Med Genet C)",
"The impact of karyotype on congenital heart diseases in Turner syndrome: systematic review and meta-analysis",
"Karyotype significantly impacts type and severity of CHD in TS. Supports karyotype-guided cardiac surveillance — 45,X has highest cardiac burden."],
]
story.append(Table(
[[Paragraph(h, S["th"]) for h in ["Reference", "Title", "Key Finding"]]] +
[[Paragraph(str(r[i]), S["td_b"] if i==0 else S["td"]) for i in range(3)] for r in evid_rows],
colWidths=[CONTENT_W*0.20, CONTENT_W*0.42, CONTENT_W*0.38],
repeatRows=1,
style=TableStyle([
("BACKGROUND", (0, 0), (-1, 0), NAVY),
("TEXTCOLOR", (0, 0), (-1, 0), white),
("GRID", (0, 0), (-1, -1), 0.4, HexColor("#BFC9CA")),
("TOPPADDING", (0, 0), (-1, -1), 6),
("BOTTOMPADDING", (0, 0), (-1, -1), 6),
("LEFTPADDING", (0, 0), (-1, -1), 5),
("RIGHTPADDING", (0, 0), (-1, -1), 5),
("VALIGN", (0, 0), (-1, -1), "TOP"),
("FONTSIZE", (0, 1), (-1, -1), 8.5),
("BACKGROUND", (0, 2), (-1, 2), ROW_ALT),
])
))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# SOURCES
# ══════════════════════════════════════════════════════════════════════════════
story.append(hr())
story.append(sp(4))
story.append(p("Sources", "h2"))
sources = [
"Robbins & Kumar Basic Pathology (Robbins Pathology) — Chapter 4, Fig. 4.20",
"Robbins, Cotran & Kumar Pathologic Basis of Disease — Chapter 5, pp. 168–169",
"Campbell-Walsh-Wein Urology (3-Volume Set) — Chapter 48: Syndromes of Gonadal Dysgenesis",
"The Developing Human: Clinically Oriented Embryology, 9th ed. — p. 1239",
"Thompson & Thompson Genetics and Genomics in Medicine, 9th ed.",
"PubMed PMID 41243107 — Hwang et al. (2025). Autoimmune diseases in Turner syndrome. Ann Med.",
"PubMed PMID 39743222 — Tanoshima et al. (2025). Karyotype-phenotype in Turner syndrome. Congenit Anom Kyoto.",
"PubMed PMID 40557696 — Álvarez-Nava et al. (2025). CHD karyotype in Turner syndrome. Am J Med Genet C.",
]
for src in sources:
story.append(b(src))
story.append(sp(10))
story.append(p("Orris Medical Education | Turner Syndrome Neonatologist/Paediatrician Reference | July 2026", "source"))
# ── Build PDF ─────────────────────────────────────────────────────────────────
doc.build(
story,
onFirstPage=on_first_page,
onLaterPages=on_page
)
print(f"PDF written to: {OUT}")
cd /tmp/workspace/turner-syndrome && python generate_pdf.py 2>&1
~/turner-syndrome/generate_pdf.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/turner-syndrome/generate_pdf.py'
~/turner-syndrome/generate_pdf.py
#!/usr/bin/env python3
"""Generate Turner Syndrome comprehensive PDF using ReportLab."""
import urllib.request, os
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib.colors import HexColor, black, white
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, Image, PageBreak, BaseDocTemplate, PageTemplate, Frame
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus.flowables import Flowable
OUT = "/tmp/workspace/turner-syndrome/Turner_Syndrome_Neonatologist_Guide.pdf"
NAVY = HexColor("#1A3A5C")
TEAL = HexColor("#1A7A8A")
LIGHT_BLUE = HexColor("#D6EAF8")
PALE_TEAL = HexColor("#E8F6F3")
PALE_ORANGE= HexColor("#FEF9E7")
TABLE_HDR = HexColor("#1A7A8A")
ROW_ALT = HexColor("#EBF5FB")
ORANGE = HexColor("#E67E22")
RED = HexColor("#C0392B")
GRAY_MID = HexColor("#AAB7B8")
GRAY_LIGHT = HexColor("#F2F3F4")
# Download diagram
IMG_URL = "https://cdn.orris.care/cdss_images/edcafa4b45a5638f8ec22d2efd3573f71180bd82ce6de8fe6d0e9b572edc1876.png"
IMG_PATH = "/tmp/workspace/turner-syndrome/turner_diagram.png"
if not os.path.exists(IMG_PATH):
urllib.request.urlretrieve(IMG_URL, IMG_PATH)
W, H = A4
LM = RM = 1.8*cm
TM = BM = 2.2*cm
CONTENT_W = W - LM - RM
styles = getSampleStyleSheet()
def style(name, parent="Normal", **kwargs):
return ParagraphStyle(name, parent=styles[parent], **kwargs)
S = {
"cover_title": style("cover_title", fontSize=26, textColor=white,
alignment=TA_CENTER, leading=32, fontName="Helvetica-Bold"),
"cover_sub": style("cover_sub", fontSize=13, textColor=HexColor("#AED6F1"),
alignment=TA_CENTER, leading=18, fontName="Helvetica"),
"cover_tag": style("cover_tag", fontSize=10, textColor=HexColor("#AED6F1"),
alignment=TA_CENTER, leading=14, fontName="Helvetica-Oblique"),
"h1": style("h1", fontSize=13, textColor=white, fontName="Helvetica-Bold",
alignment=TA_LEFT, leading=17, spaceBefore=12, spaceAfter=4),
"h2": style("h2", fontSize=11, textColor=NAVY, fontName="Helvetica-Bold",
leading=14, spaceBefore=9, spaceAfter=3),
"h3": style("h3", fontSize=10, textColor=TEAL, fontName="Helvetica-Bold",
leading=13, spaceBefore=6, spaceAfter=2),
"body": style("body", fontSize=9.5, textColor=HexColor("#2C3E50"),
leading=14, spaceAfter=4, alignment=TA_JUSTIFY),
"bullet": style("bullet", fontSize=9.5, textColor=HexColor("#2C3E50"),
leading=14, leftIndent=14, firstLineIndent=-10, spaceAfter=3),
"bullet2": style("bullet2", fontSize=9.2, textColor=HexColor("#2C3E50"),
leading=13, leftIndent=28, firstLineIndent=-10, spaceAfter=2),
"th": style("th", fontSize=9, textColor=white, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=12),
"td": style("td", fontSize=8.8, textColor=HexColor("#2C3E50"),
fontName="Helvetica", alignment=TA_LEFT, leading=12),
"td_b": style("td_b", fontSize=8.8, textColor=HexColor("#2C3E50"),
fontName="Helvetica-Bold", alignment=TA_LEFT, leading=12),
"td_c": style("td_c", fontSize=8.8, textColor=HexColor("#2C3E50"),
fontName="Helvetica", alignment=TA_CENTER, leading=12),
"pearl": style("pearl", fontSize=9.2, textColor=HexColor("#7D6608"),
fontName="Helvetica-Bold", leading=13, leftIndent=6),
"note": style("note", fontSize=8.8, textColor=HexColor("#154360"),
fontName="Helvetica-Oblique", leading=12, leftIndent=6),
"warning": style("warning", fontSize=9.2, textColor=HexColor("#78281F"),
fontName="Helvetica-Bold", leading=13, leftIndent=6),
"caption": style("caption", fontSize=7.8, textColor=HexColor("#5D6D7E"),
fontName="Helvetica-Oblique", alignment=TA_CENTER, leading=11),
"source": style("source", fontSize=7.5, textColor=GRAY_MID,
fontName="Helvetica-Oblique", alignment=TA_CENTER, leading=10),
}
# ── Helpers ───────────────────────────────────────────────────────────────────
def section_header(number, title, color=NAVY):
data = [[Paragraph(f" {number} {title}", S["h1"])]]
t = Table(data, colWidths=[CONTENT_W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
]))
return t
def make_table(headers, rows, col_widths=None):
if col_widths is None:
n = len(headers)
col_widths = [CONTENT_W / n] * n
data = [[Paragraph(h, S["th"]) for h in headers]]
for i, row in enumerate(rows):
data.append([Paragraph(str(c), S["td"]) for c in row])
ts = [
("BACKGROUND", (0,0), (-1,0), TABLE_HDR),
("TEXTCOLOR", (0,0), (-1,0), white),
("GRID", (0,0), (-1,-1), 0.4, HexColor("#BFC9CA")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 8.8),
]
for i in range(1, len(data)):
if i % 2 == 0:
ts.append(("BACKGROUND", (0,i), (-1,i), ROW_ALT))
t = Table(data, colWidths=col_widths, repeatRows=1)
t.setStyle(TableStyle(ts))
return t
def callout(text, bg, border, sty):
data = [[Paragraph(text, S[sty])]]
t = Table(data, colWidths=[CONTENT_W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("LINEBEFORE", (0,0), (0,-1), 4, border),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 10),
]))
return t
def note_box(text): return callout(text, LIGHT_BLUE, TEAL, "note")
def pearl_box(text): return callout(f"KEY {text}", PALE_ORANGE, ORANGE, "pearl")
def warn_box(text): return callout(f"WARNING {text}", HexColor("#FADBD8"), RED, "warning")
def p(text, sty="body"): return Paragraph(text, S[sty])
def b(text): return Paragraph(f"• {text}", S["bullet"])
def b2(text): return Paragraph(f"◦ {text}", S["bullet2"])
def sp(n=6): return Spacer(1, n)
def hr(): return HRFlowable(width="100%", thickness=0.5, color=GRAY_MID, spaceAfter=4, spaceBefore=4)
# ── Page callbacks ─────────────────────────────────────────────────────────────
def cover_page(canvas, doc):
canvas.saveState()
canvas.setFillColor(NAVY)
canvas.rect(0, 0, W, H, fill=1, stroke=0)
canvas.setFillColor(TEAL)
canvas.rect(0, H*0.28, W, 5, fill=1, stroke=0)
canvas.rect(0, H*0.72, W, 5, fill=1, stroke=0)
canvas.restoreState()
def later_page(canvas, doc):
canvas.saveState()
canvas.setStrokeColor(TEAL)
canvas.setLineWidth(1.2)
canvas.line(LM, H - 1.55*cm, W - RM, H - 1.55*cm)
canvas.setFont("Helvetica-Bold", 7.5)
canvas.setFillColor(NAVY)
canvas.drawString(LM, H - 1.35*cm, "TURNER SYNDROME")
canvas.setFont("Helvetica", 7.5)
canvas.setFillColor(GRAY_MID)
canvas.drawRightString(W - RM, H - 1.35*cm, "Neonatologist / Paediatrician Reference")
canvas.setStrokeColor(TEAL)
canvas.line(LM, 1.5*cm, W - RM, 1.5*cm)
canvas.setFont("Helvetica", 7.5)
canvas.setFillColor(GRAY_MID)
canvas.drawCentredString(W/2, 1.0*cm, f"Page {doc.page}")
canvas.restoreState()
# ── Document with two templates ────────────────────────────────────────────────
doc = BaseDocTemplate(
OUT, pagesize=A4,
leftMargin=LM, rightMargin=RM, topMargin=TM, bottomMargin=BM,
title="Turner Syndrome – Neonatologist/Paediatrician Reference",
author="Orris Medical Education"
)
cover_frame = Frame(0, 0, W, H, leftPadding=LM, rightPadding=RM,
topPadding=2*cm, bottomPadding=2*cm, id="cover")
normal_frame = Frame(LM, BM + 0.5*cm, CONTENT_W, H - TM - BM - 1.2*cm, id="normal")
doc.addPageTemplates([
PageTemplate(id="Cover", frames=[cover_frame], onPage=cover_page),
PageTemplate(id="Normal", frames=[normal_frame], onPage=later_page),
])
from reportlab.platypus import NextPageTemplate
# ── Story ─────────────────────────────────────────────────────────────────────
story = []
# COVER
story.append(NextPageTemplate("Cover"))
story.append(sp(90))
story.append(p("TURNER SYNDROME", "cover_title"))
story.append(sp(14))
story.append(p("In-Depth Clinical Reference for Neonatologists & Paediatricians", "cover_sub"))
story.append(sp(22))
story.append(p("Genetics · Pathogenesis · Clinical Features · Neonatal Presentation", "cover_tag"))
story.append(sp(6))
story.append(p("Diagnosis · Management · Surveillance · Clinical Pearls", "cover_tag"))
story.append(sp(80))
story.append(p("Sources: Robbins Pathology · Campbell-Walsh Urology · The Developing Human", "cover_tag"))
story.append(sp(4))
story.append(p("PubMed Systematic Reviews 2025 | Orris Medical Education | July 2026", "cover_tag"))
story.append(NextPageTemplate("Normal"))
story.append(PageBreak())
# ═══════════════════════════════════════════════════
# 1. DEFINITION & HISTORY
# ═══════════════════════════════════════════════════
story.append(section_header("1.", "Definition and Historical Background", NAVY))
story.append(sp())
story.append(p(
"Turner syndrome (TS) is a chromosomal disorder resulting from <b>complete or partial monosomy "
"of the X chromosome</b>, characterised by <b>hypogonadism in phenotypic females</b>. "
"It is the most common sex chromosome abnormality in females."
))
story.append(sp(4))
story.append(b("<b>1938</b> — Henry Turner described the triad of sexual infantilism, webbed neck, and cubitus valgus as a distinct entity."))
story.append(b("<b>1930</b> — Otto Ullrich had described similar features earlier; hence the European term 'Ullrich–Turner syndrome'."))
story.append(b("<b>1959</b> — Ford et al. identified the chromosomal basis: the 45,X karyotype."))
story.append(b("Gonadal dysgenesis was subsequently recognised as a core component."))
story.append(sp(8))
# ═══════════════════════════════════════════════════
# 2. EPIDEMIOLOGY
# ═══════════════════════════════════════════════════
story.append(section_header("2.", "Epidemiology", NAVY))
story.append(sp())
story.append(make_table(
["Parameter", "Data"],
[
["Incidence in live-born females", "~1 in 2,000–3,000"],
["Survival of 45,X conceptuses", "Only ~1% of monosomy X embryos survive to term"],
["Role in spontaneous abortions", "45,X = most common cytogenetic finding in miscarried fetuses; ~18% of all chromosomal abortions"],
["Origin of the missing chromosome", "~75–80% cases: PATERNAL origin (sperm defect — error in paternal gametogenesis)"],
],
col_widths=[CONTENT_W*0.38, CONTENT_W*0.62]
))
story.append(sp(5))
story.append(note_box(
"The fact that only ~1% of 45,X conceptions survive to term highlights how lethal complete monosomy X is in utero. "
"The live-born infant with Turner syndrome represents the 'milder end' of a profoundly severe prenatal spectrum."
))
story.append(sp(8))
# ═══════════════════════════════════════════════════
# 3. GENETICS
# ═══════════════════════════════════════════════════
story.append(section_header("3.", "Genetics and Karyotypes", TEAL))
story.append(sp())
story.append(p("3a. Classic Karyotype", "h2"))
story.append(p(
"<b>45,X (monosomy X)</b> — present in approximately <b>57%</b> of cases. "
"A single maternal X chromosome, with the paternal sex chromosome absent."
))
story.append(sp(5))
story.append(p("3b. Structural Abnormalities of the X (~14%)", "h2"))
story.append(p("In order of frequency:"))
story.append(sp(3))
story.append(make_table(
["Karyotype", "Description"],
[
["46,X,i(X)(q10) — Isochromosome Xq",
"Most common structural variant. Duplication of long arm (Xq), loss of short arm (Xp). "
"Highest association with autoimmune thyroid disease."],
["46,X,r(X) — Ring chromosome",
"Deletions of both Xp and Xq arms form a ring. May produce more severe/variable phenotype."],
["46,X,del(Xp) or del(Xq) — Partial deletions",
"Phenotype depends on the specific region deleted."],
],
col_widths=[CONTENT_W*0.32, CONTENT_W*0.68]
))
story.append(sp(6))
story.append(p("3c. Mosaicism (~29%)", "h2"))
story.append(p("Two or more chromosomally distinct cell lines co-existing in the same individual:"))
story.append(sp(3))
story.append(make_table(
["Mosaic Karyotype", "Clinical Significance"],
[
["45,X / 46,XX",
"Most common mosaic (10–15%). May appear nearly normal; some can conceive spontaneously."],
["45,X / 46,XY",
"2–5%. CRITICAL — 12–20% risk of gonadoblastoma. Prophylactic gonadectomy required."],
["45,X / 47,XXX", "Triple X mosaicism — variable phenotype."],
["45,X / 46,X,i(X)(q10)", "Combined structural + mosaic karyotype."],
],
col_widths=[CONTENT_W*0.34, CONTENT_W*0.66]
))
story.append(sp(5))
story.append(note_box(
"Conventional cytogenetics detects mosaicism in ~30% of TS patients. With FISH and PCR, detection rises to ~75%. "
"Higher proportion of 45,X cells = more severe phenotype. A very small number of 45,X/46,XX mosaics can conceive."
))
story.append(sp(6))
story.append(p("3d. Y Chromosome Material — Most Clinically Critical Finding", "h2"))
story.append(b("Present in <b>5–10%</b> of Turner syndrome patients (complete Y or translocated Y fragments)."))
story.append(b("Risk of <b>gonadoblastoma: 12–20%</b>."))
story.append(b("Gonadoblastoma progresses to dysgerminoma or other malignant GCT in <b>18–35%</b> of cases — sometimes with virilisation."))
story.append(b("Gonadoblastoma reported as early as <b>5 months of age</b>."))
story.append(b("Detection by <b>FISH or PCR</b> in ALL TS patients — conventional karyotype may miss occult Y material."))
story.append(sp(5))
story.append(warn_box(
"Detection of Y-chromosome material mandates prompt prophylactic laparoscopic gonadectomy — "
"regardless of age — due to gonadoblastoma risk from as early as 5 months of age."
))
story.append(sp(8))
# ═══════════════════════════════════════════════════
# 4. PATHOGENESIS
# ═══════════════════════════════════════════════════
story.append(section_header("4.", "Pathogenesis — Molecular Mechanisms", NAVY))
story.append(sp())
story.append(p("4a. SHOX Gene Haploinsufficiency", "h2"))
story.append(make_table(
["Feature", "Detail"],
[
["Gene location", "SHOX at Xp22.33 — pseudoautosomal region 1 (PAR1)"],
["X-inactivation", "Escapes X-inactivation — normally 2 copies in both males and females"],
["Effect in Turner syndrome", "Haploinsufficiency (1 copy) → short stature, Madelung deformity, skeletal anomalies"],
["Expression sites", "Growth plates of radius, ulna, tibia, fibula during fetal life"],
["Confirmation", "SHOX deletions found in 2–5% of otherwise normal short children"],
["Mirror image", "Klinefelter syndrome (extra X = extra SHOX) → tall stature — elegant confirmation"],
],
col_widths=[CONTENT_W*0.36, CONTENT_W*0.64]
))
story.append(sp(6))
story.append(p("4b. Ovarian Failure Mechanism", "h2"))
story.append(p(
"Normal fetal ovaries contain up to <b>7 million oocytes</b> at peak. This reduces to ~400,000 at menarche. "
"In Turner syndrome:"
))
story.append(b("Fetal ovaries develop <b>normally</b> through the first <b>18 weeks of gestation</b>."))
story.append(b("Absence of the second X chromosome → <b>accelerated apoptosis of oocytes</b>."))
story.append(b("By <b>age 2 years</b>, virtually no oocytes remain → streak ovaries."))
story.append(b("Follicular cells that normally protect oocytes are inadequate, accelerating oocyte attrition."))
story.append(b("Both X chromosomes must be active during oogenesis for normal ovarian maintenance."))
story.append(sp(5))
story.append(pearl_box(
'"Menopause occurs before menarche" — the defining pathophysiological statement of Turner syndrome ovarian failure.'
))
story.append(sp(5))
story.append(p("4c. Streak Ovaries — Gross and Microscopic Pathology", "h2"))
story.append(p(
"Streak ovaries: white, fibrous structures <b>2–3 cm long × 0.5 cm wide</b>, located in the broad ligament. "
"Histology: interlacing waves of dense fibrous stroma, devoid of oocytes and follicles — otherwise "
"indistinguishable from normal ovarian stroma. "
"Hormonal consequence: <b>low oestrogen, low androgen, elevated FSH and LH</b> = hypergonadotropic hypogonadism."
))
story.append(sp(5))
story.append(p("4d. Genotype–Phenotype Correlation", "h2"))
story.append(b("Somatic features (neck webbing, cardiac, lymphatic) → determined by genes on the <b>short arm (Xp)</b>."))
story.append(b("Fertility and menstruation → affected by genes on the <b>long arm (Xq)</b>."))
story.append(b("SHOX explains short stature — but not cardiac or metabolic features (multiple Xp genes involved)."))
story.append(b("In ~80% of TS cases, the retained X chromosome is <b>maternal in origin</b> → error in paternal gametogenesis."))
story.append(sp(8))
# ═══════════════════════════════════════════════════
# 5. CLINICAL FEATURES
# ═══════════════════════════════════════════════════
story.append(section_header("5.", "Clinical Features — System by System", TEAL))
story.append(sp())
# Diagram
if os.path.exists(IMG_PATH):
img = Image(IMG_PATH, width=8.5*cm, height=10.5*cm)
img.hAlign = "CENTER"
story.append(img)
story.append(sp(3))
story.append(p(
"Fig. 1 — Clinical features and karyotypes of Turner syndrome. "
"(Source: Robbins & Kumar Basic Pathology, Fig. 4.20 / Robbins, Cotran & Kumar, Fig. 5.26)",
"caption"
))
story.append(sp(8))
story.append(p("5a. Neonatal Presentation — Delivery Room and Newborn Nursery", "h2"))
story.append(make_table(
["Neonatal Feature", "Details"],
[
["Lymphoedema of dorsum of hands/feet",
"Most common neonatal finding. Pitting oedema from lymph stasis. Key delivery room clue."],
["Cystic hygroma / nuchal oedema",
"Markedly distended lymphatics at nape of neck in utero → resolves → webbing."],
["Webbing of neck (pterygium colli)",
"Persistent bilateral skin fold; low posterior hairline."],
["Broad / shield chest", "Widely spaced nipples on a broad thorax."],
["Cubitus valgus", "Increased carrying angle at elbow."],
["Short 4th metacarpal", "Brachymetacarpia — positive Archibald/metacarpal sign."],
["Hypoplastic nails", "Dysplastic nails at birth."],
["Multiple pigmented nevi", "May increase with age."],
["High-arched palate", "Common orofacial feature."],
["Ptosis, hypertelorism, retrognathia", "Characteristic facial features."],
["Ear malformations", "Associated with Eustachian tube dysfunction and hearing problems."],
],
col_widths=[CONTENT_W*0.38, CONTENT_W*0.62]
))
story.append(sp(5))
story.append(pearl_box(
"The neonate with bilateral dorsal foot/hand oedema and/or cystic hygroma in a female infant "
"must be karyotyped for Turner syndrome — this is the delivery room diagnostic trigger."
))
story.append(sp(8))
story.append(p("5b. Cardiovascular — Most Common Cause of Mortality", "h2"))
story.append(p(
"Congenital heart disease affects <b>25–50%</b> of patients. Predominantly "
"<b>left-sided cardiovascular abnormalities</b>."
))
story.append(sp(3))
story.append(make_table(
["Lesion", "Significance"],
[
["Bicuspid aortic valve (BAV)",
"Most common structural CHD in TS; may be missed on routine echo — dedicated surveillance needed."],
["Coarctation of the aorta",
"Classic association. ~5% of girls presenting with coarctation have Turner syndrome."],
["Aortic root dilation", "Present in ~30% of TS patients — watch for progressive enlargement."],
["Aortic dissection",
"100-fold higher risk than general population — can occur in young women, including during pregnancy."],
["Partial anomalous pulmonary venous drainage (PAPVD)", "Less common but seen in TS."],
["Hypertension", "Common; multifactorial — renal and cardiovascular contributors."],
],
col_widths=[CONTENT_W*0.42, CONTENT_W*0.58]
))
story.append(sp(5))
story.append(warn_box(
"Cardiovascular abnormalities are the most common cause of death in childhood and the most "
"important cause of increased mortality overall. Aortic dissection risk is 100-fold elevated — "
"all women with TS require cardiac MRI clearance before attempting pregnancy."
))
story.append(sp(8))
story.append(p("5c. Renal Anomalies — Frequently Overlooked", "h2"))
story.append(p("<b>33–60%</b> of TS patients have structural/positional renal anomalies (most common in classic 45,X):"))
story.append(sp(3))
story.append(make_table(
["Renal Anomaly", "Frequency"],
[
["Horseshoe kidney", "~10%"],
["Duplication of collecting system or renal agenesis", "~20%"],
["Malrotation", "~15%"],
["Multiple renal arteries", "~90% (detected on cardiovascular evaluation)"],
],
col_widths=[CONTENT_W*0.6, CONTENT_W*0.4]
))
story.append(sp(8))
story.append(p("5d. Reproductive / Endocrine", "h2"))
story.append(b("Streak ovaries: fibrous strands devoid of oocytes — the gonadal end result."))
story.append(b("<b>Primary amenorrhoea</b> in ~90% — genitalia remain infantile, minimal breast development, sparse pubic/axillary hair."))
story.append(b("<b>Hypergonadotropic hypogonadism</b>: elevated FSH and LH, low oestradiol."))
story.append(b("Spontaneous puberty in up to <b>30%</b> (especially mosaic 45,X/46,XX)."))
story.append(b("Spontaneous conception possible in a very small number of 45,X/46,XX mosaics."))
story.append(sp(7))
story.append(p("5e. Thyroid", "h2"))
story.append(b("Autoimmune thyroiditis (Hashimoto's thyroiditis) is significantly more common in TS."))
story.append(b("Most common in women with <b>isochromosome Xq</b> [i(Xq) karyotype]."))
story.append(b("Up to <b>50%</b> develop clinical <b>hypothyroidism</b> over their lifetime."))
story.append(b("Screen TSH at diagnosis and <b>annually</b> thereafter."))
story.append(sp(7))
story.append(p("5f. Metabolic / Hepatic", "h2"))
story.append(b("Glucose intolerance and <b>insulin resistance</b>."))
story.append(b("<b>Obesity</b> — higher prevalence than age-matched controls."))
story.append(b("<b>Non-alcoholic fatty liver disease (NAFLD)</b>."))
story.append(b("Some develop full <b>metabolic syndrome</b>."))
story.append(b("<b>Important:</b> Growth hormone therapy worsens insulin resistance — monitor glucose carefully during rhGH treatment."))
story.append(sp(7))
story.append(p("5g. Neurodevelopment / Cognitive", "h2"))
story.append(b("General intellect: usually within normal limits — <b>NOT associated with intellectual disability</b>."))
story.append(b("Specific deficit: <b>visual-spatial information processing</b> (non-verbal learning disability)."))
story.append(b("Difficulty with maths, spatial tasks, social perception, and executive function."))
story.append(b("Normal verbal IQ; affected performance IQ."))
story.append(b("Higher rates of ADHD, anxiety, and social difficulties."))
story.append(sp(7))
story.append(p("5h. Auditory / ENT", "h2"))
story.append(b("Sensorineural hearing loss (SNHL) — progressive; more prominent with age."))
story.append(b("Recurrent otitis media in children (Eustachian tube dysfunction)."))
story.append(b("Routine audiological surveillance from childhood is recommended."))
story.append(sp(7))
story.append(p("5i. Musculoskeletal / Orthopaedic", "h2"))
story.append(b("<b>Cubitus valgus</b> — increased carrying angle at elbow."))
story.append(b("<b>Short 4th metacarpal</b> — positive Archibald/metacarpal sign (bedside clue)."))
story.append(b("<b>Scoliosis</b> in up to 10%."))
story.append(b("<b>Madelung deformity</b> of the wrist (from SHOX haploinsufficiency)."))
story.append(b("Osteoporosis in adulthood from prolonged oestrogen deficiency."))
story.append(b("Short stature: average adult height <b>143–144 cm</b> without treatment (most populations)."))
story.append(sp(8))
# ═══════════════════════════════════════════════════
# 6. PRENATAL DIAGNOSIS
# ═══════════════════════════════════════════════════
story.append(section_header("6.", "Prenatal Diagnosis", NAVY))
story.append(sp())
story.append(p("Ultrasonographic features raising suspicion for Turner syndrome:"))
story.append(b("<b>Increased nuchal translucency</b> — most common and earliest prenatal finding"))
story.append(b("Cystic hygroma / nuchal oedema"))
story.append(b("Generalised lymphoedema or hydrops fetalis"))
story.append(b("Coarctation of the aorta on fetal echocardiography"))
story.append(b("Renal anomalies"))
story.append(sp(4))
story.append(p(
"Confirmatory karyotyping: <b>Chorionic villus sampling (CVS)</b> or <b>amniocentesis</b>. "
"Cell-free fetal DNA (cfDNA/NIPT) can flag monosomy X but requires confirmatory invasive karyotyping before counselling."
))
story.append(sp(5))
story.append(warn_box(
"CRITICAL COUNSELLING POINT — Ascertainment Bias: If 45,X/46,XX or 45,X/46,XY mosaicism is "
"INCIDENTALLY found on NIPT or amniocentesis, ~90% of these fetuses will have a NORMAL phenotype at birth. "
"Counsel accordingly — do NOT apply full Turner syndrome prognosis to incidentally detected mosaics. "
"However, a purely 45,X karyotype found prenatally carries prognosis similar to postnatal TS diagnosis."
))
story.append(sp(8))
# ═══════════════════════════════════════════════════
# 7. POSTNATAL DIAGNOSIS
# ═══════════════════════════════════════════════════
story.append(section_header("7.", "Postnatal Diagnosis", TEAL))
story.append(sp())
story.append(p("When to Suspect Turner Syndrome:", "h2"))
story.append(make_table(
["Age / Clinical Setting", "Trigger to Karyotype"],
[
["Neonate", "Lymphoedema of hands/feet, cystic hygroma, coarctation, hydrops fetalis in female"],
["Child", "Short stature (<3rd centile), unexplained growth failure"],
["Adolescent", "Primary amenorrhoea + short stature — classic presentation"],
["Any age", "Short stature + primary amenorrhoea — always karyotype"],
["Incidental", "~5% of girls presenting with coarctation of aorta have Turner syndrome — always karyotype"],
],
col_widths=[CONTENT_W*0.30, CONTENT_W*0.70]
))
story.append(sp(6))
story.append(p("Investigations at Diagnosis:", "h2"))
story.append(make_table(
["Investigation", "Rationale"],
[
["Karyotype (minimum 30 cells)", "Confirm diagnosis; detect mosaicism. 30 cells minimises false negatives."],
["FISH or PCR for Y-chromosome material", "Mandatory in ALL TS patients — detect occult Y sequences."],
["Echocardiogram", "Baseline for BAV, coarctation, aortic root diameter."],
["Renal ultrasound", "Structural renal anomalies (33–60% prevalence)."],
["TSH + thyroid antibodies", "Autoimmune thyroiditis screening."],
["FSH, LH, Oestradiol", "Confirm hypergonadotropic hypogonadism."],
["Blood pressure (both arms)", "Coarctation surveillance — bilateral BP comparison."],
["Audiogram", "Sensorineural hearing loss — baseline assessment."],
["Bone age (left hand X-ray)", "Growth assessment and treatment planning."],
["Fasting glucose, insulin, lipids", "Metabolic syndrome and IR screening."],
["Liver function tests (LFTs)", "NAFLD surveillance."],
["IGF-1", "Required baseline before growth hormone therapy."],
],
col_widths=[CONTENT_W*0.40, CONTENT_W*0.60]
))
story.append(sp(8))
# ═══════════════════════════════════════════════════
# 8. MANAGEMENT
# ═══════════════════════════════════════════════════
story.append(section_header("8.", "Management — Neonatologist / Paediatrician Approach", NAVY))
story.append(sp())
story.append(p("8a. Neonatal Period — Immediate Steps", "h2"))
story.append(make_table(
["Step", "Action", "Rationale"],
[
["1", "Confirm karyotype (≥30 cells)", "Diagnostic certainty; detect mosaicism"],
["2", "FISH or PCR for Y chromosome — ALL cases", "Gonadoblastoma risk stratification — non-negotiable"],
["3", "If Y material confirmed → prophylactic laparoscopic gonadectomy",
"Risk 12–20%; gonadoblastoma reported from 5 months of age"],
["4", "Echocardiogram", "BAV, coarctation — may require surgical repair"],
["5", "Renal ultrasound", "Structural anomalies — inform renal tract management"],
["6", "Monitor and manage lymphoedema", "Usually resolves; gentle compression if needed"],
["7", "Feeding support if needed", "Some neonates have poor suck/swallowing"],
["8", "Refer to paediatric endocrinology", "Long-term GH and hormone replacement planning"],
["9", "Genetic counselling for family", "Mostly sporadic — recurrence risk counselling"],
],
col_widths=[CONTENT_W*0.07, CONTENT_W*0.46, CONTENT_W*0.47]
))
story.append(sp(7))
story.append(p("8b. Growth Hormone Therapy (Children)", "h2"))
story.append(b("Recombinant human GH (rhGH): <b>FDA-approved specifically for Turner syndrome</b> since 1996."))
story.append(b("Start age: typically <b>4–6 years</b> (or earlier if growth significantly below TS growth norms)."))
story.append(b("Dose: <b>0.045–0.050 mg/kg/day</b> subcutaneously — higher than for GH deficiency."))
story.append(b("Expected benefit: <b>5–8 cm additional adult height</b> above predicted untreated height."))
story.append(b("Continue until bone age ~14–15 years or growth velocity becomes insufficient."))
story.append(b("<b>Oxandrolone</b> (low-dose anabolic steroid) may be added after age 9 years to augment height gain."))
story.append(b("<b>Monitor:</b> IGF-1, fasting glucose and insulin (GH worsens IR), thyroid function, scoliosis."))
story.append(sp(7))
story.append(p("8c. Oestrogen Replacement Therapy — Puberty Induction", "h2"))
story.append(b("Initiated at <b>age 12–15 years</b> if spontaneous puberty has not occurred."))
story.append(b("Start with <b>low-dose transdermal 17β-oestradiol</b> — the most physiological route."))
story.append(b("Gradually increase dose over <b>2–3 years</b> to mimic natural pubertal progression."))
story.append(b("Add <b>cyclic progestogen</b> after 2 years or at first breakthrough bleed."))
story.append(b("Goals: breast development, uterine growth, bone mineralisation, cardiovascular protection."))
story.append(b("Long-term HRT continued until the natural age of menopause (~50 years)."))
story.append(sp(7))
story.append(p("8d. Fertility Considerations", "h2"))
story.append(b("Majority: infertile due to streak ovaries."))
story.append(b("<b>Donor egg IVF</b> is the primary fertility option — uterus must be primed with oestrogen."))
story.append(b("For mosaic TS with spontaneous menses: <b>oocyte cryopreservation</b> — still evolving, currently experimental."))
story.append(b("<b>Mandatory cardiac assessment</b> (aortic root MRI) before any pregnancy attempt."))
story.append(b("Pregnancy in TS carries elevated risk of aortic dissection — multidisciplinary planning essential."))
story.append(sp(7))
story.append(p("8e. Gonadoblastoma Prophylaxis", "h2"))
story.append(b("Y-chromosome material detected → <b>laparoscopic prophylactic gonadectomy promptly</b>."))
story.append(b("Streak gonads confirmed in pure <b>45,X</b> patients (no Y material) → <b>do NOT need removal</b>."))
story.append(b("Do not delay once Y material is confirmed — age of onset is unpredictable."))
story.append(sp(8))
# ═══════════════════════════════════════════════════
# 9. SURVEILLANCE SCHEDULE
# ═══════════════════════════════════════════════════
story.append(section_header("9.", "Long-Term Surveillance Schedule", TEAL))
story.append(sp())
story.append(make_table(
["System / Investigation", "Frequency / Notes"],
[
["Cardiac (echocardiogram or MRI)", "Every 3–5 years; more frequent if BAV or aortic dilation"],
["Blood pressure", "Annually — both arms if coarctation suspected"],
["Thyroid (TSH + antibodies)", "Annually"],
["Hearing (audiogram)", "Every 3–5 years; earlier if symptomatic"],
["Fasting glucose, insulin, lipids", "Every 2–3 years"],
["Liver function tests (LFTs)", "Annually"],
["Bone density (DEXA)", "At transition to adulthood; periodically thereafter"],
["Ophthalmology", "Strabismus, amblyopia screening in childhood"],
["Renal function and BP", "More frequent if structural renal anomalies present"],
["Psychosocial / neurodevelopmental assessment", "Learning support, ADHD/anxiety assessment"],
["Bladder and urethral cancer surveillance", "Awareness in adulthood — increased risk per British national cohort data"],
],
col_widths=[CONTENT_W*0.44, CONTENT_W*0.56]
))
story.append(sp(8))
# ═══════════════════════════════════════════════════
# 10. COMPLICATIONS SUMMARY
# ═══════════════════════════════════════════════════
story.append(section_header("10.", "Complications Summary", NAVY))
story.append(sp())
story.append(make_table(
["System", "Complication", "Key Point"],
[
["Cardiovascular", "Coarctation, BAV, aortic dissection", "#1 cause of death; 100× dissection risk"],
["Gonadal", "Streak ovaries, primary amenorrhoea", "Hypergonadotropic hypogonadism"],
["Oncologic", "Gonadoblastoma", "ONLY if Y material present; from 5 months"],
["Thyroid", "Autoimmune hypothyroidism", "Up to 50% lifetime risk"],
["Metabolic", "Insulin resistance, metabolic syndrome", "GH therapy worsens insulin resistance"],
["Renal", "Horseshoe kidney, duplication", "33–60% affected"],
["Neurocognitive", "Visuospatial deficits, non-verbal LD", "Normal verbal IQ preserved"],
["Auditory", "SNHL, otitis media", "Progressive sensorineural loss with age"],
["Skeletal", "Short stature, osteoporosis, scoliosis", "SHOX haploinsufficiency"],
["Hepatic", "NAFLD", "Screen LFTs annually"],
],
col_widths=[CONTENT_W*0.20, CONTENT_W*0.38, CONTENT_W*0.42]
))
story.append(sp(8))
# ═══════════════════════════════════════════════════
# 11. CLINICAL PEARLS
# ═══════════════════════════════════════════════════
story.append(section_header("11.", "Key Clinical Pearls for Exams and Practice", TEAL))
story.append(sp())
pearls = [
"Most 45,X conceptions abort (>99%) — Turner syndrome in live births is the 'milder end' of a profoundly severe prenatal spectrum.",
"The missing X chromosome is usually PATERNAL (~75–80%) — the error is in paternal gametogenesis (sperm).",
"Cystic hygroma in a female fetus on antenatal ultrasound → think Turner syndrome until proven otherwise — karyotype.",
"~5% of girls presenting with coarctation of the aorta have Turner syndrome — always karyotype.",
"'Menopause before menarche' — ovarian failure is complete by age 2 years.",
"Y-material detection (FISH/PCR) is mandatory in ALL Turner syndrome patients — gonadoblastoma can occur at 5 months.",
"GH therapy worsens insulin resistance — monitor fasting glucose and insulin before and during treatment.",
"Thyroid autoantibodies are most common with isochromosome Xq [i(Xq)] — screen this subgroup most aggressively.",
"Prenatal ascertainment bias: incidentally detected mosaic TS (45,X/46,XX or 45,X/46,XY) on NIPT/amnio → ~90% will have NORMAL phenotype at birth.",
"Aortic dissection risk is 100-fold elevated — ALL women with Turner syndrome require cardiac MRI clearance before any pregnancy attempt.",
"Normal intellect is the rule — but specific visuospatial processing deficits require educational support.",
"Spontaneous puberty occurs in up to 30% of Turner syndrome patients — do not assume total pubertal failure without follow-up.",
"Short 4th metacarpal (positive Archibald/metacarpal sign) is a simple bedside clue in older children.",
"Short stature + primary amenorrhoea in any adolescent female MUST prompt karyotyping — Turner syndrome until proven otherwise.",
]
for i, pearl in enumerate(pearls, 1):
story.append(pearl_box(f"{i}. {pearl}"))
story.append(sp(4))
story.append(sp(6))
# ═══════════════════════════════════════════════════
# 12. RECENT EVIDENCE
# ═══════════════════════════════════════════════════
story.append(section_header("12.", "Recent Evidence — Systematic Reviews 2024–2026", NAVY))
story.append(sp())
story.append(make_table(
["Reference", "Title", "Key Finding"],
[
["PMID 41243107\n(2025, Ann Med)",
"Global prevalence of autoimmune diseases in Turner syndrome: systematic review and meta-analysis",
"Confirms significantly elevated global prevalence of autoimmune diseases. Reinforces need for lifelong autoimmune surveillance, especially thyroid."],
["PMID 39743222\n(2025, Congenit Anom Kyoto)",
"Karyotype and phenotype association in Turner syndrome with non-mosaic X chromosome structural rearrangements: systematic review",
"Refines karyotype-specific phenotype counselling for structural X rearrangements."],
["PMID 40557696\n(2025, Am J Med Genet C)",
"The impact of karyotype on congenital heart diseases in Turner syndrome: systematic review and meta-analysis",
"Karyotype significantly impacts CHD type and severity. Supports karyotype-guided cardiac surveillance."],
],
col_widths=[CONTENT_W*0.20, CONTENT_W*0.42, CONTENT_W*0.38]
))
story.append(sp(8))
# ═══════════════════════════════════════════════════
# SOURCES
# ═══════════════════════════════════════════════════
story.append(hr())
story.append(sp(4))
story.append(p("Sources and References", "h2"))
for src in [
"Robbins & Kumar Basic Pathology (Robbins Pathology) — Chapter 4, Fig. 4.20",
"Robbins, Cotran & Kumar Pathologic Basis of Disease — Chapter 5, pp. 168–169",
"Campbell-Walsh-Wein Urology (3-Volume Set) — Chapter 48: Syndromes of Gonadal Dysgenesis",
"The Developing Human: Clinically Oriented Embryology, 9th ed. — p. 1239",
"Thompson & Thompson Genetics and Genomics in Medicine, 9th ed.",
"PubMed PMID 41243107 — Hwang et al. (2025). Autoimmune diseases in Turner syndrome. Ann Med.",
"PubMed PMID 39743222 — Tanoshima et al. (2025). Karyotype-phenotype in Turner syndrome. Congenit Anom Kyoto.",
"PubMed PMID 40557696 — Álvarez-Nava et al. (2025). CHD and karyotype in Turner syndrome. Am J Med Genet C.",
]:
story.append(b(src))
story.append(sp(10))
story.append(p("Orris Medical Education | Turner Syndrome — Neonatologist/Paediatrician Reference | July 2026", "source"))
# ── Build ──────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF written to: {OUT}")
rm /tmp/workspace/turner-syndrome/generate_pdf.py