I want complete explanation of topics for 2.2 & 2.3. So my Ma’am told me that she will ask anything from these system and organ and the topics given in syllabus are just the topics which is there in syllabus. So please help me with that very easily


| Recess | Location | Importance |
|---|---|---|
| Costodiaphragmatic recess | Between costal and diaphragmatic pleura, inferiorly | Largest; fluid collects here; site for thoracocentesis |
| Costomediastinal recess | Anteriorly between costal and mediastinal pleura | Largest on left side over heart |
Clinical Note - Pleural effusion: Excess fluid in the pleural space compresses the lung. The costodiaphragmatic recess is the lowest point where fluid first collects and is drained by needle aspiration (thoracocentesis).


| Vessel | Origin/Destination | Function |
|---|---|---|
| Pulmonary arteries | From pulmonary trunk (right ventricle) | Carry deoxygenated blood TO lungs |
| Pulmonary veins (superior + inferior, each side) | TO left atrium | Carry oxygenated blood FROM lungs |

| # | Segment |
|---|---|
| S I | Apical |
| S II | Posterior |
| S III | Anterior |
| # | Segment |
|---|---|
| S IV | Lateral |
| S V | Medial |
| # | Segment |
|---|---|
| S VI | Superior |
| S VII | Medial basal |
| S VIII | Anterior basal |
| S IX | Lateral basal |
| S X | Posterior basal |
| # | Segment |
|---|---|
| S I & II | Apicoposterior (S I + II fuse) |
| S III | Anterior |
| S IV | Superior lingular |
| S V | Inferior lingular |
| # | Segment |
|---|---|
| S VI | Superior |
| S VII | Medial basal (may be absent/rudimentary) |
| S VIII | Anterior basal |
| S IX | Lateral basal |
| S X | Posterior basal |
Easy memory trick for lower lobe: "Sugar Makes A Lot Prettier" = Superior, Medial basal, Anterior basal, Lateral basal, Posterior basal (S VI - S X)
| Part | Origin |
|---|---|
| Sternal part | Posterior surface of the xiphoid process |
| Costal part | Inner surfaces of the lower 6 costal cartilages and their adjacent ribs (ribs 7-12) |
| Vertebral (Lumbar) part | Two muscular crura + arcuate ligaments |


| Level | Opening | Structures passing through |
|---|---|---|
| T8 | Caval opening (Vena caval foramen) | Inferior vena cava (IVC) + right phrenic nerve |
| T10 | Esophageal hiatus | Esophagus + left and right vagus nerves + esophageal branches of left gastric vessels |
| T12 | Aortic hiatus | Aorta + thoracic duct + sometimes azygos vein |
Memory trick for levels: "8, 10, 12" or "I Eat Apple" = IVC (T8), Esophagus (T10), Aorta (T12) Or: "T8 = I ate nothing" (IVC), "T10 = I ate everything" (Esophagus), "T12 = I ate a lot" (Aorta) Or simply: I-8, E-soph-10, A-orta-12
| Feature | Right Lung | Left Lung |
|---|---|---|
| Lobes | 3 (superior, middle, inferior) | 2 (superior, inferior) |
| Fissures | 2 (oblique + horizontal) | 1 (oblique only) |
| Segments | 10 | 8-10 (some fused) |
| Special feature | Eparterial bronchus (bronchus to superior lobe above pulmonary artery) | Cardiac notch + Lingula |
| Relations | SVC, heart (R atrium), azygos, esophagus | Heart (L ventricle), aortic arch, thoracic aorta |
| Feature | Detail |
|---|---|
| Origin | Xiphoid, lower 6 costal cartilages/ribs, crura (L1-L3) |
| Insertion | Central tendon |
| Nerve supply | Phrenic nerve (C3, C4, C5) |
| Action | Flattens on contraction → increases thoracic volume → inspiration |
| Caval opening | T8 - IVC + right phrenic nerve |
| Esophageal hiatus | T10 - Esophagus + both vagus nerves |
| Aortic hiatus | T12 - Aorta + thoracic duct |
Can you make and put all these data in a form of pdf
mkdir -p /tmp/workspace/anatomy-notes && ls /tmp/workspace/anatomy-notes/
~/anatomy-notes/make_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import ListFlowable, ListItem
OUTPUT = "/tmp/workspace/anatomy-notes/Anatomy_2.2_2.3_Notes.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2.2*cm, bottomMargin=2*cm,
title="Anatomy Notes – 2.2 & 2.3",
author="Gray's Anatomy for Students"
)
W = A4[0] - 4*cm # usable width
# ── colour palette ──────────────────────────────────────────────
C_BLUE = colors.HexColor("#1a3a5c") # dark navy – main headings
C_TEAL = colors.HexColor("#007c7c") # teal – subheadings
C_GOLD = colors.HexColor("#b8860b") # gold – topic numbers
C_LIGHT_BG = colors.HexColor("#eaf4fb") # light blue – shaded cells
C_GREEN_BG = colors.HexColor("#e8f5e9") # light green – clinical notes
C_TABLE_HDR = colors.HexColor("#1a3a5c") # table header bg
C_RULE = colors.HexColor("#007c7c")
C_BODY = colors.HexColor("#1c1c1c")
# ── styles ───────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
cover_title = S("CoverTitle",
fontName="Helvetica-Bold", fontSize=26,
textColor=C_BLUE, alignment=TA_CENTER, spaceAfter=8)
cover_sub = S("CoverSub",
fontName="Helvetica", fontSize=13,
textColor=C_TEAL, alignment=TA_CENTER, spaceAfter=4)
cover_src = S("CoverSrc",
fontName="Helvetica-Oblique", fontSize=10,
textColor=colors.grey, alignment=TA_CENTER, spaceAfter=20)
topic_banner = S("TopicBanner",
fontName="Helvetica-Bold", fontSize=16,
textColor=colors.white, backColor=C_BLUE,
borderPad=8, alignment=TA_CENTER,
spaceBefore=14, spaceAfter=10)
h1 = S("H1",
fontName="Helvetica-Bold", fontSize=13,
textColor=colors.white, backColor=C_TEAL,
borderPad=5, spaceBefore=14, spaceAfter=6)
h2 = S("H2",
fontName="Helvetica-Bold", fontSize=11,
textColor=C_BLUE, spaceBefore=10, spaceAfter=4)
h3 = S("H3",
fontName="Helvetica-BoldOblique", fontSize=10,
textColor=C_TEAL, spaceBefore=7, spaceAfter=3)
body = S("Body",
fontName="Helvetica", fontSize=9.5,
textColor=C_BODY, leading=14,
alignment=TA_JUSTIFY, spaceAfter=5)
bullet = S("Bullet",
fontName="Helvetica", fontSize=9.5,
textColor=C_BODY, leading=13,
leftIndent=16, bulletIndent=4, spaceAfter=2)
clinical = S("Clinical",
fontName="Helvetica", fontSize=9,
textColor=colors.HexColor("#1a5c2a"),
backColor=C_GREEN_BG, borderPad=6,
leftIndent=10, rightIndent=10,
leading=13, spaceAfter=6)
memory = S("Memory",
fontName="Helvetica-Oblique", fontSize=9,
textColor=colors.HexColor("#5c1a1a"),
backColor=colors.HexColor("#fff3e0"),
borderPad=6, leftIndent=10, rightIndent=10,
leading=13, spaceAfter=6)
def tbl_style(header_rows=1, alt=True):
base = [
("BACKGROUND", (0,0), (-1, header_rows-1), C_TABLE_HDR),
("TEXTCOLOR", (0,0), (-1, header_rows-1), colors.white),
("FONTNAME", (0,0), (-1, header_rows-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("GRID", (0,0), (-1,-1), 0.5, colors.HexColor("#b0bec5")),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ROWBACKGROUNDS", (0, header_rows), (-1,-1),
[colors.white, C_LIGHT_BG] if alt else [colors.white]),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("WORDWRAP", (0,0), (-1,-1), True),
]
return TableStyle(base)
def P(text, style=None): return Paragraph(text, style or body)
def SP(h=6): return Spacer(1, h)
def HR(): return HRFlowable(width="100%", thickness=1.2, color=C_RULE, spaceAfter=6)
def section_header(text, style=h1):
return P(f" {text}", style)
def bullet_item(text):
return P(f"• {text}", bullet)
# ════════════════════════════════════════════════════════════════
story = []
# ── COVER PAGE ───────────────────────────────────────────────────
story.append(SP(60))
story.append(P("ANATOMY NOTES", cover_title))
story.append(P("Topics 2.2 & 2.3", cover_sub))
story.append(SP(4))
story.append(HRFlowable(width="60%", thickness=2, color=C_TEAL, hAlign="CENTER", spaceAfter=8))
story.append(P("Respiratory System · Pleura · Lungs · Bronchopulmonary Segments · Diaphragm", cover_sub))
story.append(SP(8))
story.append(P("Source: Gray's Anatomy for Students", cover_src))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════
# TOPIC 2.2
# ════════════════════════════════════════════════════════════════
story.append(P("TOPIC 2.2", topic_banner))
story.append(P("RESPIRATORY SYSTEM", topic_banner))
story.append(SP(4))
# ─── OUTLINE OF RESPIRATORY PASSAGES ────────────────────────────
story.append(section_header("1. OUTLINE OF RESPIRATORY PASSAGES"))
story.append(P(
"Air travels from the external environment to the alveoli through the following pathway:", body))
pathway_data = [
["Step", "Structure", "Key Feature"],
["1", "Nose / Mouth", "Entry point; air is warmed, filtered, humidified"],
["2", "Pharynx", "Common passage for air and food"],
["3", "Larynx", "Voice box; contains vocal cords; epiglottis guards airway"],
["4", "Trachea (CVI → TIV/V)", "C-shaped cartilage rings keep it open; carina at bifurcation"],
["5", "Right & Left Main Bronchi", "Right = wider, more vertical → foreign bodies lodge here"],
["6", "Lobar (Secondary) Bronchi", "One per lobe (R: 3, L: 2)"],
["7", "Segmental (Tertiary) Bronchi", "One per bronchopulmonary segment (10 per lung)"],
["8", "Bronchioles → Alveoli", "Gas exchange occurs at alveoli"],
]
t = Table(pathway_data, colWidths=[1.5*cm, 5*cm, None])
t.setStyle(tbl_style())
story.append(t)
story.append(SP(6))
story.append(P(
"<b>Trachea:</b> Extends from vertebral level <b>CVI</b> in the neck to <b>TIV/V</b> in the mediastinum, "
"where it bifurcates into main bronchi. Reinforced by C-shaped cartilage rings (open posteriorly). "
"The <b>carina</b> is the hook-shaped ridge at the bifurcation.", body))
story.append(SP(4))
# ─── PLEURA ──────────────────────────────────────────────────────
story.append(section_header("2. PLEURA"))
story.append(P(
"The pleura is a single layer of <b>mesothelium</b> (flat cells) plus supporting connective tissue "
"lining each pleural cavity. It has two main types:", body))
story.append(P("<b>A. Parietal Pleura</b> – lines the walls of the pleural cavity", h3))
parietal_data = [
["Part", "Location / Note"],
["Costal part", "Lines ribs and intercostal spaces"],
["Diaphragmatic part", "Covers the upper surface of the diaphragm"],
["Mediastinal part", "Covers the mediastinum"],
["Cervical pleura (pleural cupola)", "Dome-shaped; extends above rib I into the root of the neck; reinforced by the suprapleural membrane (attached to medial margin of rib I and TP of CVII)"],
]
t2 = Table(parietal_data, colWidths=[5.5*cm, None])
t2.setStyle(tbl_style())
story.append(t2)
story.append(SP(4))
story.append(P(
"<b>Nerve supply of parietal pleura:</b> Somatic afferents → <i>Costal pleura</i> by intercostal nerves; "
"<i>Diaphragmatic & mediastinal pleura</i> by phrenic nerve (C3–C5). "
"Pain from parietal pleura is sharp and well-localised.", body))
story.append(P("<b>B. Visceral Pleura</b> – covers and adheres to the lung surface", h3))
story.append(P(
"Continuous with parietal pleura at the <b>hilum</b>. Supplied by <i>visceral afferents</i> (no pain sensation). "
"This is why lung pathology itself does not cause sharp pain – only when adjacent parietal pleura is irritated.", body))
story.append(P("<b>Pleural Cavity</b>", h3))
story.append(P(
"The potential space between visceral and parietal pleurae. Normally contains only a thin film of serous "
"fluid allowing friction-free gliding during breathing.", body))
story.append(P("<b>Pleural Recesses</b>", h3))
recess_data = [
["Recess", "Location", "Clinical Importance"],
["Costodiaphragmatic\n(largest)", "Between costal and diaphragmatic pleura, inferiorly", "Largest recess; fluid collects here first in pleural effusion; site for thoracocentesis (needle aspiration)"],
["Costomediastinal", "Anteriorly between costal and mediastinal pleura", "Largest on the LEFT side (over heart)"],
]
t3 = Table(recess_data, colWidths=[3.8*cm, 5.2*cm, None])
t3.setStyle(tbl_style())
story.append(t3)
story.append(SP(4))
story.append(P(
"⚕ <b>Clinical – Pleural Effusion:</b> Excess fluid accumulates in the pleural space, compressing the lung. "
"Fluid first collects in the costodiaphragmatic recess. A needle is inserted to aspirate (thoracocentesis). "
"Causes: infection, malignancy, cardiac failure, hepatic disease, pulmonary embolism.", clinical))
# ─── LUNGS ───────────────────────────────────────────────────────
story.append(section_header("3. LUNGS – POSITION, PARTS AND RELATIONS"))
story.append(P(
"The two lungs lie in the right and left pleural cavities on either side of the mediastinum. "
"The <b>right lung</b> is slightly larger because the heart bulges more to the left. "
"Each lung is <b>half-cone shaped</b> with the following parts:", body))
parts_data = [
["Part", "Description"],
["Base (diaphragmatic surface)", "Rests on the diaphragm; concave"],
["Apex", "Projects above rib I into the root of the neck"],
["Costal surface", "Faces ribs and intercostal spaces; convex"],
["Mediastinal surface", "Faces mediastinum; contains the comma-shaped HILUM"],
["Inferior border", "Sharp; separates base from costal surface"],
["Anterior border", "Sharp; separates costal from mediastinal surface"],
["Posterior border", "Smooth and rounded"],
]
t4 = Table(parts_data, colWidths=[5.5*cm, None])
t4.setStyle(tbl_style())
story.append(t4)
story.append(SP(6))
story.append(P("<b>Right Lung</b>", h3))
story.append(P(
"<b>3 lobes</b> (Superior, Middle, Inferior) and <b>2 fissures:</b>", body))
for item in [
"<b>Oblique fissure</b> – separates inferior lobe from superior + middle lobes; runs from spinous process of TIV, crosses 5th intercostal space laterally, follows rib VI anteriorly.",
"<b>Horizontal fissure</b> – separates superior from middle lobe; follows 4th intercostal space to where it meets oblique fissure at rib V.",
]:
story.append(bullet_item(item))
story.append(P("<b>Mediastinal relations of right lung:</b> SVC, right brachiocephalic vein, heart (right atrium), esophagus, azygos vein, IVC.", body))
story.append(P("<b>Left Lung</b>", h3))
story.append(P(
"<b>2 lobes</b> (Superior, Inferior) and <b>1 fissure</b> (oblique, slightly more oblique than right).", body))
for item in [
"<b>Cardiac notch</b> – concavity on medial surface due to heart projection into left pleural cavity.",
"<b>Lingula</b> – tongue-like extension from the lower superior lobe that projects over the heart.",
]:
story.append(bullet_item(item))
story.append(P("<b>Mediastinal relations of left lung:</b> Heart (left ventricle), aortic arch, thoracic (descending) aorta, esophagus, left subclavian artery/vein.", body))
# ─── BLOOD SUPPLY ────────────────────────────────────────────────
story.append(section_header("4. BLOOD SUPPLY OF LUNGS"))
story.append(P("<b>A. Pulmonary (Functional) Vessels</b>", h3))
blood_data = [
["Vessel", "From / To", "Function"],
["Pulmonary arteries (R + L)", "From pulmonary trunk (right ventricle)", "Carry DEOXYGENATED blood TO lungs"],
["Pulmonary veins (superior + inferior, each side)", "TO left atrium", "Carry OXYGENATED blood FROM lungs"],
]
t5 = Table(blood_data, colWidths=[5.5*cm, 5.5*cm, None])
t5.setStyle(tbl_style())
story.append(t5)
story.append(SP(4))
for item in [
"Pulmonary trunk bifurcates at <b>TIV/V</b>, to the left of midline.",
"<b>Right pulmonary artery</b> – longer; passes horizontally, anterior to tracheal bifurcation and right main bronchus, posterior to ascending aorta and SVC.",
"<b>Left pulmonary artery</b> – shorter; anterior to descending aorta, posterior to superior pulmonary vein.",
]:
story.append(bullet_item(item))
story.append(P("<b>B. Bronchial (Nutritive) Vessels</b>", h3))
story.append(P(
"Supply the walls of bronchi, large vessels, and visceral pleura:", body))
bronch_data = [
["Vessel", "Origin"],
["Right bronchial artery (×1)", "3rd posterior intercostal artery (occasionally from upper left bronchial artery)"],
["Left bronchial arteries (×2)", "Directly from thoracic aorta: superior at TV, inferior below left bronchus"],
["Bronchial veins", "Drain → pulmonary veins / left atrium (right side); azygos / hemiazygos (left side)"],
]
t6 = Table(bronch_data, colWidths=[5.5*cm, None])
t6.setStyle(tbl_style())
story.append(t6)
story.append(SP(4))
# ─── NERVE SUPPLY ────────────────────────────────────────────────
story.append(section_header("5. NERVE SUPPLY OF LUNGS"))
story.append(P(
"Innervation is via the <b>anterior and posterior pulmonary plexuses</b> lying around the tracheal bifurcation and main bronchi. "
"These plexuses receive fibers from:", body))
nerve_data = [
["Source", "Effect on Bronchioles", "Note"],
["Vagus nerve (parasympathetic)", "CONSTRICTS", "Also increases secretions; carried in posterior plexus mainly"],
["Sympathetic trunks", "DILATES", "Reduces secretions; bronchodilator effect"],
]
t7 = Table(nerve_data, colWidths=[5*cm, 3.5*cm, None])
t7.setStyle(tbl_style())
story.append(t7)
story.append(SP(4))
story.append(P(
"Visceral afferents from lung and visceral pleura travel in both vagal and sympathetic pathways. "
"The <b>visceral pleura</b> has no pain fibres (visceral innervation), so lung pathology causes no sharp pain. "
"The <b>parietal pleura</b> (somatic) causes sharp, well-localised pain when irritated.", body))
# ─── BRONCHOPULMONARY SEGMENTS ───────────────────────────────────
story.append(PageBreak())
story.append(section_header("6. BRONCHOPULMONARY SEGMENTS ★ HIGH YIELD ★"))
story.append(P(
"A <b>bronchopulmonary segment</b> is the area of lung supplied by a <b>segmental (tertiary) bronchus</b> "
"and its accompanying <b>pulmonary artery branch</b>.", body))
key_facts = [
"Each segment is shaped like an <b>irregular cone</b> – apex at the segmental bronchus origin, base on the lung surface.",
"Pulmonary veins run <b>intersegmentally</b> (between segments), NOT within them.",
"It is the <b>smallest functionally independent unit</b> of the lung.",
"It is the <b>smallest area of lung that can be surgically removed</b> without affecting adjacent regions.",
"<b>10 bronchopulmonary segments per lung</b>; some segments fuse in the left lung.",
]
for f in key_facts:
story.append(bullet_item(f))
story.append(SP(6))
# Right lung segments table
story.append(P("<b>RIGHT Lung – 10 Segments</b>", h3))
right_seg = [
["Lobe", "Segment No.", "Segment Name"],
["Superior\n(Upper) Lobe", "S I", "Apical"],
["", "S II", "Posterior"],
["", "S III", "Anterior"],
["Middle Lobe", "S IV", "Lateral"],
["", "S V", "Medial"],
["Inferior\n(Lower) Lobe", "S VI", "Superior"],
["", "S VII", "Medial Basal"],
["", "S VIII", "Anterior Basal"],
["", "S IX", "Lateral Basal"],
["", "S X", "Posterior Basal"],
]
t8 = Table(right_seg, colWidths=[3.5*cm, 2.5*cm, None])
t8.setStyle(tbl_style())
# Span lobe cells
t8.setStyle(TableStyle([
("SPAN", (0,1), (0,3)), # Superior lobe
("SPAN", (0,4), (0,5)), # Middle lobe
("SPAN", (0,6), (0,10)), # Inferior lobe
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ALIGN", (0,0), (0,-1), "CENTER"),
]))
t8.setStyle(tbl_style())
story.append(t8)
story.append(SP(8))
# Left lung segments table
story.append(P("<b>LEFT Lung – 10 Segments (some fuse)</b>", h3))
left_seg = [
["Lobe", "Segment No.", "Segment Name"],
["Superior\n(Upper) Lobe", "S I & II", "Apicoposterior (S I + II fuse)"],
["", "S III", "Anterior"],
["", "S IV", "Superior Lingular"],
["", "S V", "Inferior Lingular"],
["Inferior\n(Lower) Lobe", "S VI", "Superior"],
["", "S VII", "Medial Basal (may be absent)"],
["", "S VIII", "Anterior Basal"],
["", "S IX", "Lateral Basal"],
["", "S X", "Posterior Basal"],
]
t9 = Table(left_seg, colWidths=[3.5*cm, 2.5*cm, None])
t9.setStyle(tbl_style())
story.append(t9)
story.append(SP(8))
story.append(P(
"✎ <b>Memory Trick for Lower Lobe Segments (both lungs):</b><br/>"
"\"<b>S</b>ugar <b>M</b>akes <b>A</b> <b>L</b>ot <b>P</b>rettier\" → S VI Superior, S VII Medial basal, "
"S VIII Anterior basal, S IX Lateral basal, S X Posterior basal", memory))
story.append(P(
"⚕ <b>Clinical Importance:</b> Because each bronchopulmonary segment has its own bronchus and artery, "
"a <b>segmentectomy</b> can be performed to remove diseased segments (e.g., tumour, abscess) without "
"removing the entire lobe. Bronchoscopy can identify which segment is affected by inspecting the segmental bronchi.", clinical))
# ════════════════════════════════════════════════════════════════
# TOPIC 2.3
# ════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(P("TOPIC 2.3", topic_banner))
story.append(P("DIAPHRAGM", topic_banner))
story.append(SP(4))
story.append(P(
"The diaphragm is a <b>musculotendinous dome</b> that seals the inferior thoracic aperture, "
"separating the thorax from the abdomen. It is the <b>principal muscle of quiet inspiration</b>.", body))
# ─── ORIGIN ──────────────────────────────────────────────────────
story.append(section_header("1. ORIGIN"))
story.append(P(
"Muscle fibres arise radially from the margins of the <b>inferior thoracic aperture</b> from three parts:", body))
origin_data = [
["Part", "Origin Details"],
["Sternal part", "Posterior surface of the xiphoid process"],
["Costal part", "Inner surfaces of lower 6 costal cartilages and adjacent ribs (ribs 7–12)"],
["Vertebral (Lumbar) part", "Two crura + arcuate ligaments (see below)"],
]
t10 = Table(origin_data, colWidths=[4*cm, None])
t10.setStyle(tbl_style())
story.append(t10)
story.append(SP(6))
story.append(P("<b>The Crura</b>", h3))
story.append(P(
"Muscular extensions that anchor the diaphragm to the vertebral column:", body))
crura_data = [
["Crus", "Attachment (Vertebral Bodies)"],
["Right crus (larger)", "Anterior surfaces of L1, L2, L3"],
["Left crus (smaller)", "Anterior surfaces of L1, L2"],
]
t11 = Table(crura_data, colWidths=[5*cm, None])
t11.setStyle(tbl_style())
story.append(t11)
story.append(SP(4))
story.append(P("<b>Arcuate Ligaments</b>", h3))
lig_data = [
["Ligament", "Structure it arches over", "Attachment"],
["Medial arcuate ligament", "Psoas major muscle", "L1 vertebral body → L1 transverse process"],
["Lateral arcuate ligament", "Quadratus lumborum muscle", "L1 transverse process → Rib 12"],
]
t12 = Table(lig_data, colWidths=[4.5*cm, 4.5*cm, None])
t12.setStyle(tbl_style())
story.append(t12)
story.append(SP(4))
# ─── INSERTION ───────────────────────────────────────────────────
story.append(section_header("2. INSERTION"))
story.append(P(
"All muscle fibres converge centrally into the <b>central tendon</b> – a large, clover-leaf shaped "
"fibrous aponeurosis at the summit of the diaphragm. The inferior surface of the <b>pericardium "
"is fused</b> with the central tendon.", body))
# ─── SHAPE ───────────────────────────────────────────────────────
story.append(section_header("3. SHAPE AND POSITION"))
story.append(P(
"The diaphragm is <b>NOT flat</b> – it balloons superiorly to form two domes:", body))
for item in [
"<b>Right dome</b> is HIGHER (reaches rib V) – because it overlies the large right lobe of the liver.",
"<b>Left dome</b> is slightly lower – because the heart and stomach are on the left.",
"The <b>posterior attachment is inferior</b> to the anterior attachment because of the oblique angle of the inferior thoracic aperture.",
"As the diaphragm <b>contracts</b>, the height of the domes decreases → thoracic volume increases → inspiration.",
]:
story.append(bullet_item(item))
story.append(SP(4))
# ─── NERVE SUPPLY ────────────────────────────────────────────────
story.append(section_header("4. NERVE SUPPLY"))
story.append(P(
"The diaphragm is innervated by the <b>phrenic nerve</b> (one on each side):", body))
nerve2_data = [
["Feature", "Detail"],
["Origin", "Anterior rami of C3, C4, C5 (cervical plexus)"],
["Main contribution", "C4 (the most important level)"],
["Course", "Passes vertically through the neck → superior thoracic aperture → mediastinum (ANTERIOR to root of lung) → diaphragm"],
["Motor supply", "Entire diaphragm, including both crura"],
["Sensory supply", "Central diaphragm (both surfaces) and pericardium"],
]
t13 = Table(nerve2_data, colWidths=[4*cm, None])
t13.setStyle(tbl_style())
story.append(t13)
story.append(SP(4))
story.append(P(
"✎ <b>Memory Trick:</b> \"<b>C3, 4, 5 keeps the diaphragm alive</b>\"", memory))
story.append(P(
"⚕ <b>Referred Pain:</b> Irritation of the inferior surface of the diaphragm (e.g., subphrenic abscess, "
"ruptured spleen) → pain referred to the <b>shoulder tip</b> (C4 dermatome) because the phrenic nerve "
"and the supraclavicular nerves share the same spinal cord level (C4).", clinical))
story.append(P(
"⚕ <b>Phrenic nerve palsy:</b> Most important cause to never miss = <b>malignant infiltration by lung cancer</b>. "
"Results in elevation (paradoxical movement) of the diaphragm on the affected side on CXR. "
"Other causes: postviral neuropathy, trauma, iatrogenic injury during thoracic surgery.", clinical))
# ─── ACTION ──────────────────────────────────────────────────────
story.append(section_header("5. ACTION"))
action_data = [
["Action", "Mechanism", "Result"],
["Quiet INSPIRATION", "Diaphragm contracts → domes flatten downward", "Thoracic volume increases → air drawn into lungs"],
["EXPIRATION", "Diaphragm relaxes → domes rise back up", "Thoracic volume decreases → air expelled"],
["Forced inspiration", "Diaphragm + intercostals + accessory muscles (scalenes, SCM)", "Maximal increase in thoracic volume"],
["Valsalva / Abdominal pressure", "Diaphragm + abdominal muscles contract simultaneously", "Increases intra-abdominal pressure (defecation, parturition, coughing)"],
]
t14 = Table(action_data, colWidths=[3.5*cm, 5.5*cm, None])
t14.setStyle(tbl_style())
story.append(t14)
story.append(SP(4))
# ─── OPENINGS ────────────────────────────────────────────────────
story.append(section_header("6. OPENINGS IN THE DIAPHRAGM ★ HIGH YIELD ★"))
story.append(P(
"Three major openings allow structures to pass between the thorax and abdomen:", body))
open_data = [
["Vertebral Level", "Opening", "Structures Passing Through"],
["T8", "Caval opening\n(Vena caval foramen)\nin CENTRAL TENDON", "• Inferior vena cava (IVC)\n• Right phrenic nerve (sensory branches)"],
["T10", "Esophageal hiatus\nin MUSCULAR part (right crus)", "• Esophagus\n• Left vagus nerve (anterior)\n• Right vagus nerve (posterior)\n• Esophageal branches of left gastric vessels"],
["T12", "Aortic hiatus\nBETWEEN the two crura\n(posterior to diaphragm)", "• Aorta\n• Thoracic duct\n• Azygos vein (sometimes)"],
]
t15 = Table(open_data, colWidths=[2.5*cm, 4.5*cm, None])
t15.setStyle(tbl_style())
# Colour code the rows
t15.setStyle(TableStyle([
("BACKGROUND", (0,1), (-1,1), colors.HexColor("#fce4ec")), # T8 row – pink
("BACKGROUND", (0,2), (-1,2), colors.HexColor("#e3f2fd")), # T10 row – light blue
("BACKGROUND", (0,3), (-1,3), colors.HexColor("#f1f8e9")), # T12 row – light green
]))
story.append(t15)
story.append(SP(8))
story.append(P(
"✎ <b>Memory Trick:</b><br/>"
"\"<b>I Eat Apple</b>\" → <b>I</b>VC at T<b>8</b>, <b>E</b>sophagus at T<b>10</b>, <b>A</b>orta at T<b>12</b><br/>"
"Or: <b>I-8, E-10, A-12</b> (I ate 8, Esophagus 10, Aorta 12)", memory))
story.append(P(
"⚕ <b>Hiatus Hernia:</b> The esophageal hiatus (T10) is the most common site. The stomach herniates upward "
"into the thorax through this opening. Presents with heartburn, regurgitation, and difficulty swallowing.", clinical))
story.append(P(
"Note: The aorta passes through the <b>aortic hiatus</b> which is formed BETWEEN the crura – not through "
"the muscular diaphragm itself. Therefore, diaphragm contraction does NOT compress the aortic lumen.", body))
# ════════════════════════════════════════════════════════════════
# QUICK REFERENCE SUMMARY TABLES
# ════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(P("QUICK REFERENCE SUMMARY", topic_banner))
story.append(SP(6))
story.append(P("<b>Lungs at a Glance</b>", h2))
lung_sum = [
["Feature", "Right Lung", "Left Lung"],
["Lobes", "3 (Superior, Middle, Inferior)", "2 (Superior, Inferior)"],
["Fissures", "2 (Oblique + Horizontal)", "1 (Oblique only)"],
["Segments", "10", "8–10 (some fuse)"],
["Special feature", "Eparterial bronchus\n(to superior lobe ABOVE pulmonary artery)", "Cardiac notch + Lingula"],
["Main relations", "SVC, heart (R atrium),\nazygos, esophagus, IVC", "Heart (L ventricle),\naortic arch, thoracic aorta, esophagus"],
]
t16 = Table(lung_sum, colWidths=[3.5*cm, 6*cm, None])
t16.setStyle(tbl_style())
story.append(t16)
story.append(SP(10))
story.append(P("<b>Diaphragm at a Glance</b>", h2))
dia_sum = [
["Feature", "Detail"],
["Origin", "Xiphoid (sternal) + Lower 6 costal cartilages/ribs (costal) + Crura (L1–L3) + Arcuate ligaments (lumbar)"],
["Insertion", "Central tendon (clover-leaf shaped fibrous aponeurosis)"],
["Nerve supply", "Phrenic nerve (C3, C4, C5) – main from C4"],
["Action", "Contracts → domes flatten → thoracic volume ↑ → INSPIRATION"],
["Right dome", "Higher (up to rib V) – overlies liver"],
["Left dome", "Slightly lower – overlies stomach + heart"],
["T8 opening", "Caval foramen – IVC + right phrenic nerve (in central tendon)"],
["T10 opening", "Esophageal hiatus – Esophagus + both vagus nerves (in right crus)"],
["T12 opening", "Aortic hiatus – Aorta + thoracic duct (between crura)"],
]
t17 = Table(dia_sum, colWidths=[4*cm, None])
t17.setStyle(tbl_style())
story.append(t17)
story.append(SP(12))
story.append(HRFlowable(width="100%", thickness=1, color=colors.grey, spaceAfter=6))
story.append(P(
"Source: Gray's Anatomy for Students (pp. 163–216) | Notes compiled for syllabus topics 2.2 & 2.3",
S("Footer", fontName="Helvetica-Oblique", fontSize=8, textColor=colors.grey, alignment=TA_CENTER)))
# ── BUILD ─────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
cd /tmp/workspace/anatomy-notes && python make_pdf.py 2>&1
ls -lh /tmp/workspace/anatomy-notes/Anatomy_2.2_2.3_Notes.pdf
Anatomy 2.2 2.3 Notes
PDF Document · PDF
Just make a perfect word file instead of pdf. And this time also includes images which you have shown. Make this file with no spelling error or words misplacing.
mkdir -p /tmp/workspace/anatomy-notes/images && cd /tmp/workspace/anatomy-notes/images && \ wget -q -O bronchial_tree.png "https://cdn.orris.care/cdss_images/df870a4ae0410aa77bbc415e138079cdccb608110b737f200843ab796b2984e0.png" && \ wget -q -O bp_segments.png "https://cdn.orris.care/cdss_images/5a8f1f0be887d77b3be37f2f4fc21cb1c5844f13763caa4e68229dab99bd562a.png" && \ wget -q -O lungs_parts.png "https://cdn.orris.care/cdss_images/c80c3cd9f43564c5a9c8708f9df37df48ff82e3d76ca81da70fa186700d3964a.png" && \ wget -q -O right_lung.png "https://cdn.orris.care/cdss_images/be0374b122c3bbfd27635237435366ec2839e8fdeba4f6ff66aaed59f34a80bd.png" && \ wget -q -O pleura.png "https://cdn.orris.care/cdss_images/0333339522593ace32591e1d5c4aa89b21f1566a4856b20eba9bf7145e0ba82e.png" && \ wget -q -O phrenic_nerve.png "https://cdn.orris.care/cdss_images/a5908606292402d2cbf3dadcafd57222c9e719466a2de5f132b2db6e0b0b684d.png" && \ wget -q -O diaphragm_openings.png "https://cdn.orris.care/cdss_images/d4a03cb73491c70c161e6033b09c2a832bab9c45644a24fd5e1fa6414bc635a7.png" && \ ls -lh
mkdir -p /tmp/workspace/anatomy-notes/images && cd /tmp/workspace/anatomy-notes/images && \ python3 -c " import urllib.request imgs = { 'bronchial_tree.png': 'https://cdn.orris.care/cdss_images/df870a4ae0410aa77bbc415e138079cdccb608110b737f200843ab796b2984e0.png', 'bp_segments.png': 'https://cdn.orris.care/cdss_images/5a8f1f0be887d77b3be37f2f4fc21cb1c5844f13763caa4e68229dab99bd562a.png', 'lungs_parts.png': 'https://cdn.orris.care/cdss_images/c80c3cd9f43564c5a9c8708f9df37df48ff82e3d76ca81da70fa186700d3964a.png', 'right_lung.png': 'https://cdn.orris.care/cdss_images/be0374b122c3bbfd27635237435366ec2839e8fdeba4f6ff66aaed59f34a80bd.png', 'pleura.png': 'https://cdn.orris.care/cdss_images/0333339522593ace32591e1d5c4aa89b21f1566a4856b20eba9bf7145e0ba82e.png', 'phrenic_nerve.png': 'https://cdn.orris.care/cdss_images/a5908606292402d2cbf3dadcafd57222c9e719466a2de5f132b2db6e0b0b684d.png', 'diaphragm_openings.png': 'https://cdn.orris.care/cdss_images/d4a03cb73491c70c161e6033b09c2a832bab9c45644a24fd5e1fa6414bc635a7.png', } for fname, url in imgs.items(): urllib.request.urlretrieve(url, fname) print(f'Downloaded: {fname}') " ls -lh /tmp/workspace/anatomy-notes/images/
~/anatomy-notes/make_docx.py
"""
Anatomy Notes – Topics 2.2 & 2.3
Creates a polished Word (.docx) document with all content and embedded images.
"""
from docx import Document
from docx.shared import Pt, Inches, RGBColor, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_ALIGN_VERTICAL, WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
import copy
IMG = "/tmp/workspace/anatomy-notes/images/"
OUT = "/tmp/workspace/anatomy-notes/Anatomy_2.2_2.3_Notes.docx"
# ── colour palette ──────────────────────────────────────────────
NAVY = RGBColor(0x1a, 0x3a, 0x5c)
TEAL = RGBColor(0x00, 0x7c, 0x7c)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
GOLD = RGBColor(0xB8, 0x86, 0x0B)
BLACK = RGBColor(0x1c, 0x1c, 0x1c)
GREEN = RGBColor(0x1a, 0x5c, 0x2a)
RED_D = RGBColor(0x5c, 0x1a, 0x1a)
# hex to RGBColor helper
def hex_rgb(h): r,g,b = int(h[0:2],16),int(h[2:4],16),int(h[4:6],16); return RGBColor(r,g,b)
def hex_str(h): return h.upper() # for table cell shading
# ── helpers ──────────────────────────────────────────────────────
def set_cell_bg(cell, hex_color):
"""Set background colour of a table cell."""
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear')
shd.set(qn('w:color'), 'auto')
shd.set(qn('w:fill'), hex_color)
tcPr.append(shd)
def set_cell_borders(table, color="B0BEC5"):
"""Apply light grid borders to every cell in a table."""
for row in table.rows:
for cell in row.cells:
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
tcBorders = OxmlElement('w:tcBorders')
for side in ('top','left','bottom','right','insideH','insideV'):
border = OxmlElement(f'w:{side}')
border.set(qn('w:val'), 'single')
border.set(qn('w:sz'), '4')
border.set(qn('w:space'), '0')
border.set(qn('w:color'), color)
tcBorders.append(border)
tcPr.append(tcBorders)
def set_row_height(row, twips=300):
tr = row._tr
trPr = tr.get_or_add_trPr()
trHeight = OxmlElement('w:trHeight')
trHeight.set(qn('w:val'), str(twips))
trPr.append(trHeight)
def no_space_para(para):
pPr = para._p.get_or_add_pPr()
spacing = OxmlElement('w:spacing')
spacing.set(qn('w:before'), '0')
spacing.set(qn('w:after'), '0')
pPr.append(spacing)
def para_space(para, before=0, after=60):
pPr = para._p.get_or_add_pPr()
spacing = OxmlElement('w:spacing')
spacing.set(qn('w:before'), str(before))
spacing.set(qn('w:after'), str(after))
pPr.append(spacing)
def add_run(para, text, bold=False, italic=False, color=None, size=None, font_name=None):
run = para.add_run(text)
run.bold = bold
run.italic = italic
if color: run.font.color.rgb = color
if size: run.font.size = Pt(size)
if font_name: run.font.name = font_name
return run
def add_body(doc, text_parts, justify=True, size=10.5, before=0, after=60):
"""Add a paragraph; text_parts = list of (text, bold, italic, color)"""
p = doc.add_paragraph()
if justify:
p.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
para_space(p, before, after)
for text, bold, italic, color in text_parts:
add_run(p, text, bold=bold, italic=italic, color=color, size=size)
return p
def add_bullet(doc, text_parts, size=10.5, indent_cm=0.7):
p = doc.add_paragraph(style='List Bullet')
p.paragraph_format.left_indent = Cm(indent_cm)
p.paragraph_format.space_after = Pt(2)
p.paragraph_format.space_before = Pt(1)
for text, bold, italic, color in text_parts:
add_run(p, text, bold=bold, italic=italic, color=color, size=size)
return p
def add_banner(doc, line1, line2=None, bg=NAVY, fg=WHITE, size1=16, size2=14):
"""Full-width shaded paragraph as a section banner."""
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
para_space(p, before=120, after=80)
pPr = p._p.get_or_add_pPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear')
shd.set(qn('w:color'), 'auto')
shd.set(qn('w:fill'), f'{bg.red:02X}{bg.green:02X}{bg.blue:02X}')
pPr.append(shd)
run = p.add_run(line1)
run.bold = True
run.font.color.rgb = fg
run.font.size = Pt(size1)
if line2:
p.add_run(' ')
run2 = p.add_run(line2)
run2.bold = True
run2.font.color.rgb = fg
run2.font.size = Pt(size2)
return p
def add_section_heading(doc, text, level='h1'):
"""Coloured section heading."""
p = doc.add_paragraph()
para_space(p, before=160, after=60)
if level == 'h1':
pPr = p._p.get_or_add_pPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear')
shd.set(qn('w:color'), 'auto')
shd.set(qn('w:fill'), f'{TEAL.red:02X}{TEAL.green:02X}{TEAL.blue:02X}')
pPr.append(shd)
run = p.add_run(' ' + text)
run.bold = True
run.font.size = Pt(12)
run.font.color.rgb = WHITE
elif level == 'h2':
run = p.add_run(text)
run.bold = True
run.font.size = Pt(11)
run.font.color.rgb = NAVY
elif level == 'h3':
run = p.add_run(text)
run.bold = True
run.italic = True
run.font.size = Pt(10.5)
run.font.color.rgb = TEAL
return p
def add_note(doc, label, text, bg_hex='E8F5E9', text_color=GREEN):
"""Clinical or memory note box."""
p = doc.add_paragraph()
para_space(p, before=40, after=60)
p.paragraph_format.left_indent = Cm(0.5)
p.paragraph_format.right_indent = Cm(0.5)
pPr = p._p.get_or_add_pPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear')
shd.set(qn('w:color'), 'auto')
shd.set(qn('w:fill'), bg_hex)
pPr.append(shd)
r1 = p.add_run(label + ' ')
r1.bold = True
r1.font.size = Pt(9.5)
r1.font.color.rgb = text_color
r2 = p.add_run(text)
r2.font.size = Pt(9.5)
r2.font.color.rgb = text_color
return p
def add_image_with_caption(doc, img_path, caption, width_in=5.8):
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
para_space(p, before=80, after=20)
run = p.add_run()
run.add_picture(img_path, width=Inches(width_in))
cap = doc.add_paragraph(caption)
cap.alignment = WD_ALIGN_PARAGRAPH.CENTER
para_space(cap, before=0, after=80)
r = cap.runs[0] if cap.runs else cap.add_run(caption)
r.italic = True
r.font.size = Pt(9)
r.font.color.rgb = RGBColor(0x55, 0x55, 0x55)
return p
def make_table(doc, data, col_widths_cm, header_bg='1A3A5C', alt_bg='EAF4FB'):
"""data = list of lists of (text, bold, italic, color) tuples OR plain strings."""
table = doc.add_table(rows=len(data), cols=len(data[0]))
table.alignment = WD_TABLE_ALIGNMENT.CENTER
table.style = 'Table Grid'
total_w = sum(col_widths_cm)
for i, row_data in enumerate(data):
row = table.rows[i]
for j, cell_data in enumerate(row_data):
cell = row.cells[j]
cell.width = Cm(col_widths_cm[j])
cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
p = cell.paragraphs[0]
p.clear()
para_space(p, 0, 0)
# Header row
if i == 0:
set_cell_bg(cell, header_bg)
if isinstance(cell_data, str):
r = p.add_run(cell_data)
r.bold = True; r.font.color.rgb = WHITE; r.font.size = Pt(9.5)
else:
for txt, bold, italic, color in cell_data:
r = p.add_run(txt)
r.bold = True; r.italic = italic
r.font.color.rgb = WHITE; r.font.size = Pt(9.5)
else:
bg = alt_bg if i % 2 == 0 else 'FFFFFF'
set_cell_bg(cell, bg)
if isinstance(cell_data, str):
r = p.add_run(cell_data)
r.font.size = Pt(9.5); r.font.color.rgb = BLACK
else:
for txt, bold, italic, color in cell_data:
r = p.add_run(txt)
r.bold = bold; r.italic = italic
r.font.size = Pt(9.5)
r.font.color.rgb = color if color else BLACK
set_cell_borders(table)
p_after = doc.add_paragraph()
para_space(p_after, 0, 80)
return table
def page_break(doc):
doc.add_page_break()
def spacer(doc, pt=6):
p = doc.add_paragraph()
para_space(p, 0, 0)
p.paragraph_format.space_after = Pt(pt)
# ════════════════════════════════════════════════════════════════
# BUILD DOCUMENT
# ════════════════════════════════════════════════════════════════
doc = Document()
# Page margins
from docx.oxml.ns import nsmap
section = doc.sections[0]
section.page_width = Cm(21)
section.page_height = Cm(29.7)
section.left_margin = Cm(2.2)
section.right_margin = Cm(2.2)
section.top_margin = Cm(2)
section.bottom_margin = Cm(2)
# Default font
doc.styles['Normal'].font.name = 'Calibri'
doc.styles['Normal'].font.size = Pt(10.5)
# ── COVER PAGE ───────────────────────────────────────────────────
spacer(doc, 60)
cover1 = doc.add_paragraph()
cover1.alignment = WD_ALIGN_PARAGRAPH.CENTER
para_space(cover1, 0, 20)
r = cover1.add_run('ANATOMY NOTES')
r.bold = True; r.font.size = Pt(28); r.font.color.rgb = NAVY
cover2 = doc.add_paragraph()
cover2.alignment = WD_ALIGN_PARAGRAPH.CENTER
para_space(cover2, 0, 10)
r2 = cover2.add_run('Topics 2.2 & 2.3')
r2.bold = True; r2.font.size = Pt(16); r2.font.color.rgb = TEAL
cover3 = doc.add_paragraph()
cover3.alignment = WD_ALIGN_PARAGRAPH.CENTER
para_space(cover3, 0, 10)
r3 = cover3.add_run('Respiratory System \u00b7 Pleura & Lungs \u00b7 Bronchopulmonary Segments \u00b7 Diaphragm')
r3.font.size = Pt(11); r3.font.color.rgb = TEAL
cover4 = doc.add_paragraph()
cover4.alignment = WD_ALIGN_PARAGRAPH.CENTER
para_space(cover4, 0, 0)
r4 = cover4.add_run('Source: Gray\'s Anatomy for Students')
r4.italic = True; r4.font.size = Pt(10); r4.font.color.rgb = RGBColor(0x77, 0x77, 0x77)
page_break(doc)
# ════════════════════════════════════════════════════════════════
# TOPIC 2.2
# ════════════════════════════════════════════════════════════════
add_banner(doc, 'TOPIC 2.2', '\u2014 RESPIRATORY SYSTEM', bg=NAVY, size1=17, size2=14)
spacer(doc, 4)
# ─── 1. RESPIRATORY PASSAGES ────────────────────────────────────
add_section_heading(doc, '1. OUTLINE OF RESPIRATORY PASSAGES', 'h1')
add_body(doc, [('Air travels from the external environment to the alveoli through the following pathway:', False, False, None)])
pathway = [
['Step', 'Structure', 'Key Feature'],
['1', 'Nose / Mouth', 'Entry point; air is warmed, filtered, and humidified'],
['2', 'Pharynx', 'Common passage for air and food'],
['3', 'Larynx', 'Voice box; vocal cords; epiglottis guards the airway'],
['4', 'Trachea (CVI \u2192 TIV/V)', 'C-shaped cartilage rings keep it open; carina at bifurcation'],
['5', 'Right & Left Main Bronchi', 'Right = wider, more vertical \u2192 foreign bodies lodge here'],
['6', 'Lobar (Secondary) Bronchi', 'One per lobe (Right: 3, Left: 2)'],
['7', 'Segmental (Tertiary) Bronchi', 'One per bronchopulmonary segment (10 per lung)'],
['8', 'Bronchioles \u2192 Alveoli', 'Gas exchange occurs at the alveoli'],
]
make_table(doc, pathway, [1.5, 5, 9.5])
add_body(doc, [
('Trachea: ', True, False, NAVY),
('Extends from vertebral level ', False, False, None),
('CVI', True, False, NAVY),
(' in the neck to ', False, False, None),
('TIV/V', True, False, NAVY),
(' in the mediastinum, where it bifurcates into main bronchi. Held open by C-shaped cartilage rings. '
'The lowest tracheal ring has a hook-shaped projection called the ', False, False, None),
('carina', True, False, NAVY),
(' that sits between the two main bronchi.', False, False, None),
])
# Image: Bronchial tree
add_image_with_caption(doc, IMG+'bronchial_tree.png',
'Fig. 3.48 Bronchial tree (A) and Bronchopulmonary segments (B)\n'
'Trachea \u2192 Carina \u2192 Main bronchi \u2192 Lobar bronchi \u2192 Segmental bronchi', 5.5)
# ─── 2. PLEURA ──────────────────────────────────────────────────
add_section_heading(doc, '2. PLEURA', 'h1')
add_body(doc, [
('The pleura is a single layer of ', False, False, None),
('mesothelium', True, False, NAVY),
(' (flat cells) plus supporting connective tissue lining each pleural cavity. It has two main types:', False, False, None),
])
# Image: Pleura diagram
add_image_with_caption(doc, IMG+'pleura.png',
'Fig. 3.38 / 3.39 Pleural cavities showing parietal and visceral pleura,\n'
'and the four parts of parietal pleura (costal, diaphragmatic, mediastinal, cervical)', 5.5)
add_section_heading(doc, 'A. Parietal Pleura', 'h2')
add_body(doc, [('Lines the walls of the pleural cavity. Named by the region it covers:', False, False, None)])
parietal = [
['Part', 'Location / Details'],
['Costal part', 'Lines the ribs and intercostal spaces'],
['Diaphragmatic part', 'Covers the upper surface of the diaphragm'],
['Mediastinal part', 'Covers the mediastinum'],
['Cervical pleura (pleural cupola)',
'Dome-shaped; extends above rib I into the root of the neck; reinforced by the '
'suprapleural membrane (attached to medial margin of rib I and transverse process of CVII)'],
]
make_table(doc, parietal, [5, 11])
add_body(doc, [
('Nerve supply of parietal pleura: ', True, False, NAVY),
('Somatic afferents. ', False, False, None),
('Costal pleura ', True, False, None),
('\u2192 intercostal nerves; ', False, False, None),
('Diaphragmatic & mediastinal pleura ', True, False, None),
('\u2192 phrenic nerve (C3\u2013C5). Pain is sharp and well-localised.', False, False, None),
])
add_section_heading(doc, 'B. Visceral Pleura', 'h2')
add_body(doc, [
('Covers and adheres tightly to the outer surface of the lung. Continuous with parietal pleura at the ', False, False, None),
('hilum', True, False, NAVY),
('. Supplied by ', False, False, None),
('visceral afferents', True, False, None),
(' (no pain sensation). This is why lung pathology itself does not cause sharp pain; '
'pain only occurs when the adjacent parietal pleura is irritated.', False, False, None),
])
add_section_heading(doc, 'Pleural Cavity', 'h2')
add_body(doc, [
('The potential space between visceral and parietal pleurae. Normally contains only a thin film of '
'serous fluid allowing friction-free gliding during breathing.', False, False, None),
])
add_section_heading(doc, 'Pleural Recesses', 'h2')
recesses = [
['Recess', 'Location', 'Clinical Importance'],
['Costodiaphragmatic\n(largest)',
'Between costal and diaphragmatic pleura, inferiorly',
'Largest recess; fluid collects here first in pleural effusion; site for thoracocentesis'],
['Costomediastinal',
'Anteriorly between costal and mediastinal pleura',
'Largest on the LEFT side (over the heart)'],
]
make_table(doc, recesses, [4, 5.5, 6.5])
add_note(doc,
'\u2695 Clinical \u2013 Pleural Effusion:',
'Excess fluid accumulates in the pleural space, compressing the underlying lung. '
'Fluid first collects in the costodiaphragmatic recess. A needle is inserted to aspirate fluid '
'(thoracocentesis). Causes include infection, malignancy, cardiac failure, hepatic disease, and '
'pulmonary embolism.',
bg_hex='E8F5E9', text_color=GREEN)
# ─── 3. LUNGS ───────────────────────────────────────────────────
add_section_heading(doc, '3. LUNGS \u2013 POSITION, PARTS AND RELATIONS', 'h1')
add_body(doc, [
('The two lungs lie in the right and left pleural cavities, on either side of the mediastinum. '
'The ', False, False, None),
('right lung ', True, False, NAVY),
('is slightly larger because the heart bulges more to the left. Each lung is ', False, False, None),
('half-cone shaped', True, False, NAVY),
(' with the following parts:', False, False, None),
])
# Image: Lungs parts & hilum
add_image_with_caption(doc, IMG+'lungs_parts.png',
'Fig. 3.44 Both lungs: apex, hilum, costal surface, mediastinal surface, inferior border, and base', 5.5)
parts = [
['Part', 'Description'],
['Base (diaphragmatic surface)', 'Rests on the diaphragm; concave'],
['Apex', 'Projects above rib I into the root of the neck'],
['Costal surface', 'Faces the ribs and intercostal spaces; convex'],
['Mediastinal surface', 'Faces the mediastinum; contains the comma-shaped hilum through which structures enter and leave'],
['Inferior border', 'Sharp; separates the base from the costal surface'],
['Anterior border', 'Sharp; separates the costal from the mediastinal surface'],
['Posterior border', 'Smooth and rounded'],
]
make_table(doc, parts, [5.5, 10.5])
add_section_heading(doc, 'Right Lung', 'h2')
add_body(doc, [
('3 lobes', True, False, NAVY),
(' (Superior, Middle, Inferior) and ', False, False, None),
('2 fissures:', True, False, NAVY),
])
for item in [
('Oblique fissure', True, False, NAVY,
' \u2013 separates the inferior lobe from the superior and middle lobes; runs from the spinous process of TIV, '
'crosses the 5th intercostal space laterally, and follows rib VI anteriorly.'),
('Horizontal fissure', True, False, NAVY,
' \u2013 separates the superior from the middle lobe; follows the 4th intercostal space to where it meets the '
'oblique fissure at rib V.'),
]:
p = doc.add_paragraph(style='List Bullet')
p.paragraph_format.left_indent = Cm(0.7)
p.paragraph_format.space_after = Pt(2)
add_run(p, item[0], bold=item[1], italic=item[2], color=item[3])
add_run(p, item[4], size=10.5)
add_body(doc, [
('Mediastinal relations of right lung: ', True, False, NAVY),
('Superior vena cava, right brachiocephalic vein, heart (right atrium), esophagus, azygos vein, IVC.', False, False, None),
])
# Image: Right lung with lobes & relations
add_image_with_caption(doc, IMG+'right_lung.png',
'Fig. 3.46 Right lung \u2013 lobes, fissures, and mediastinal relations\n'
'(SVC, heart/right atrium, esophagus, azygos vein, diaphragm)', 5.5)
add_section_heading(doc, 'Left Lung', 'h2')
add_body(doc, [
('2 lobes', True, False, NAVY),
(' (Superior and Inferior) and ', False, False, None),
('1 fissure', True, False, NAVY),
(' (oblique, slightly more oblique than the right).', False, False, None),
])
for item in [
('Cardiac notch', True, False, NAVY,
' \u2013 concavity on the medial surface due to the heart bulging into the left pleural cavity.'),
('Lingula', True, False, NAVY,
' \u2013 tongue-like extension from the lower part of the superior lobe that projects over the cardiac notch.'),
]:
p = doc.add_paragraph(style='List Bullet')
p.paragraph_format.left_indent = Cm(0.7)
p.paragraph_format.space_after = Pt(2)
add_run(p, item[0], bold=item[1], italic=item[2], color=item[3])
add_run(p, item[4], size=10.5)
add_body(doc, [
('Mediastinal relations of left lung: ', True, False, NAVY),
('Heart (left ventricle), aortic arch, thoracic (descending) aorta, esophagus, left subclavian artery and vein.', False, False, None),
])
# ─── 4. BLOOD SUPPLY ────────────────────────────────────────────
add_section_heading(doc, '4. BLOOD SUPPLY OF LUNGS', 'h1')
add_section_heading(doc, 'A. Pulmonary (Functional) Vessels', 'h2')
blood = [
['Vessel', 'From / To', 'Function'],
['Pulmonary arteries (Right + Left)',
'From pulmonary trunk (right ventricle)',
'Carry DEOXYGENATED blood TO the lungs'],
['Pulmonary veins\n(superior + inferior, each side)',
'TO the left atrium',
'Carry OXYGENATED blood FROM the lungs'],
]
make_table(doc, blood, [5, 5.5, 5.5])
for item in [
[('Pulmonary trunk ', True, False, NAVY),
('bifurcates at TIV/V, to the left of the midline.', False, False, None)],
[('Right pulmonary artery', True, False, NAVY),
(' \u2013 longer; passes horizontally across the mediastinum, anterior to the tracheal bifurcation and right main bronchus, posterior to the ascending aorta and SVC.', False, False, None)],
[('Left pulmonary artery', True, False, NAVY),
(' \u2013 shorter; anterior to descending aorta, posterior to superior pulmonary vein.', False, False, None)],
]:
p = doc.add_paragraph(style='List Bullet')
p.paragraph_format.left_indent = Cm(0.7)
p.paragraph_format.space_after = Pt(2)
for t, b, i, c in item:
add_run(p, t, bold=b, italic=i, color=c, size=10.5)
add_section_heading(doc, 'B. Bronchial (Nutritive) Vessels', 'h2')
add_body(doc, [('Supply the walls of bronchi, large vessels, and visceral pleura:', False, False, None)])
bronch = [
['Vessel', 'Origin'],
['Right bronchial artery (x1)',
'3rd posterior intercostal artery (occasionally from the upper left bronchial artery)'],
['Left bronchial arteries (x2)',
'Directly from thoracic aorta: superior at TV, inferior below the left bronchus'],
['Bronchial veins',
'Drain \u2192 pulmonary veins or left atrium (right side); azygos / hemiazygos veins (left side)'],
]
make_table(doc, bronch, [5, 11])
# ─── 5. NERVE SUPPLY ────────────────────────────────────────────
add_section_heading(doc, '5. NERVE SUPPLY OF LUNGS', 'h1')
add_body(doc, [
('Innervation is via the ', False, False, None),
('anterior and posterior pulmonary plexuses', True, False, NAVY),
(' lying around the tracheal bifurcation and main bronchi. These plexuses receive fibres from:', False, False, None),
])
nerve_tbl = [
['Source', 'Effect on Bronchioles', 'Note'],
['Vagus nerve (parasympathetic)',
'CONSTRICTS bronchioles',
'Also increases mucous secretion; mainly posterior plexus'],
['Sympathetic trunks',
'DILATES bronchioles',
'Reduces secretion; bronchodilator effect'],
]
make_table(doc, nerve_tbl, [5, 4.5, 6.5])
add_body(doc, [
('Visceral pleura', True, False, NAVY),
(' has no pain fibres (visceral innervation only), so lung pathology does not cause sharp pain. The ', False, False, None),
('parietal pleura', True, False, NAVY),
(' (somatic innervation) causes sharp, well-localised pain when irritated.', False, False, None),
])
# ─── 6. BRONCHOPULMONARY SEGMENTS ───────────────────────────────
page_break(doc)
add_section_heading(doc, '6. BRONCHOPULMONARY SEGMENTS \u2605 HIGH YIELD \u2605', 'h1')
add_body(doc, [
('A ', False, False, None),
('bronchopulmonary segment', True, False, NAVY),
(' is the area of lung supplied by a ', False, False, None),
('segmental (tertiary) bronchus', True, False, NAVY),
(' and its accompanying ', False, False, None),
('pulmonary artery branch', True, False, NAVY),
('.', False, False, None),
])
for item in [
[('Shape: ', True, False, NAVY),
('Each segment is an irregular cone \u2013 apex at the segmental bronchus origin, base on the lung surface.', False, False, None)],
[('Veins: ', True, False, NAVY),
('Pulmonary veins run intersegmentally (between segments), NOT within them.', False, False, None)],
[('Function: ', True, False, NAVY),
('Smallest functionally independent unit of the lung.', False, False, None)],
[('Surgery: ', True, False, NAVY),
('Smallest area of lung that can be surgically removed without affecting adjacent segments.', False, False, None)],
[('Number: ', True, False, NAVY),
('10 bronchopulmonary segments per lung; some segments fuse in the left lung.', False, False, None)],
]:
p = doc.add_paragraph(style='List Bullet')
p.paragraph_format.left_indent = Cm(0.7)
p.paragraph_format.space_after = Pt(2)
for t, b, i, c in item:
add_run(p, t, bold=b, italic=i, color=c, size=10.5)
spacer(doc, 6)
# Image: Bronchopulmonary segments
add_image_with_caption(doc, IMG+'bp_segments.png',
'Fig. 3.49 Bronchopulmonary segments of the RIGHT lung (A, top) and LEFT lung (B, bottom)\n'
'Medial view (left) and Lateral view (right)', 5.8)
add_section_heading(doc, 'RIGHT Lung \u2013 10 Segments', 'h2')
right_seg = [
['Lobe', 'Segment No.', 'Segment Name'],
['Superior (Upper) Lobe', 'S I', 'Apical'],
['', 'S II', 'Posterior'],
['', 'S III', 'Anterior'],
['Middle Lobe', 'S IV', 'Lateral'],
['', 'S V', 'Medial'],
['Inferior (Lower) Lobe', 'S VI', 'Superior'],
['', 'S VII', 'Medial Basal'],
['', 'S VIII','Anterior Basal'],
['', 'S IX', 'Lateral Basal'],
['', 'S X', 'Posterior Basal'],
]
make_table(doc, right_seg, [4.5, 2.5, 9])
add_section_heading(doc, 'LEFT Lung \u2013 10 Segments (some fuse)', 'h2')
left_seg = [
['Lobe', 'Segment No.', 'Segment Name'],
['Superior (Upper) Lobe', 'S I & II', 'Apicoposterior (S I + II fuse)'],
['', 'S III', 'Anterior'],
['', 'S IV', 'Superior Lingular'],
['', 'S V', 'Inferior Lingular'],
['Inferior (Lower) Lobe', 'S VI', 'Superior'],
['', 'S VII', 'Medial Basal (may be absent or rudimentary)'],
['', 'S VIII', 'Anterior Basal'],
['', 'S IX', 'Lateral Basal'],
['', 'S X', 'Posterior Basal'],
]
make_table(doc, left_seg, [4.5, 2.5, 9])
add_note(doc,
'\u270e Memory Trick for Lower Lobe Segments:',
'"Sugar Makes A Lot Prettier" \u2192 S VI Superior, S VII Medial basal, '
'S VIII Anterior basal, S IX Lateral basal, S X Posterior basal. '
'Or simply: S6 \u2192 S10 from top downward.',
bg_hex='FFF3E0', text_color=RED_D)
add_note(doc,
'\u2695 Clinical Importance:',
'Because each bronchopulmonary segment has its own bronchus and artery, a segmentectomy can remove '
'diseased segments (e.g., tumour, abscess) without removing the entire lobe. '
'Bronchoscopy identifies the affected segment by inspecting the segmental bronchi.',
bg_hex='E8F5E9', text_color=GREEN)
# ════════════════════════════════════════════════════════════════
# TOPIC 2.3
# ════════════════════════════════════════════════════════════════
page_break(doc)
add_banner(doc, 'TOPIC 2.3', '\u2014 DIAPHRAGM', bg=NAVY, size1=17, size2=14)
spacer(doc, 4)
add_body(doc, [
('The diaphragm is a ', False, False, None),
('musculotendinous dome', True, False, NAVY),
(' that seals the inferior thoracic aperture, separating the thorax from the abdomen. '
'It is the ', False, False, None),
('principal muscle of quiet inspiration', True, False, NAVY),
('.', False, False, None),
])
# ─── 1. ORIGIN ──────────────────────────────────────────────────
add_section_heading(doc, '1. ORIGIN', 'h1')
add_body(doc, [
('Muscle fibres arise radially from the margins of the ', False, False, None),
('inferior thoracic aperture', True, False, NAVY),
(' from three parts:', False, False, None),
])
origin = [
['Part', 'Origin Details'],
['Sternal part', 'Posterior surface of the xiphoid process'],
['Costal part', 'Inner surfaces of the lower 6 costal cartilages and adjacent ribs (ribs 7\u201312)'],
['Vertebral (Lumbar) part', 'Two crura (right and left) + medial and lateral arcuate ligaments (see below)'],
]
make_table(doc, origin, [4.5, 11.5])
add_section_heading(doc, 'The Crura', 'h3')
add_body(doc, [('Muscular extensions that anchor the diaphragm to the vertebral column:', False, False, None)])
crura = [
['Crus', 'Attachment (Vertebral Bodies)'],
['Right crus (larger)', 'Anterior surfaces of vertebral bodies L1, L2, and L3'],
['Left crus (smaller)', 'Anterior surfaces of vertebral bodies L1 and L2'],
]
make_table(doc, crura, [5, 11])
add_section_heading(doc, 'Arcuate Ligaments', 'h3')
lig = [
['Ligament', 'Structure it Arches Over', 'Attachment'],
['Medial arcuate ligament', 'Psoas major muscle', 'L1 vertebral body \u2192 L1 transverse process'],
['Lateral arcuate ligament','Quadratus lumborum muscle','L1 transverse process \u2192 Rib 12'],
]
make_table(doc, lig, [4.5, 5, 6.5])
# ─── 2. INSERTION ───────────────────────────────────────────────
add_section_heading(doc, '2. INSERTION', 'h1')
add_body(doc, [
('All muscle fibres converge centrally into the ', False, False, None),
('central tendon', True, False, NAVY),
(' \u2013 a large, clover-leaf-shaped fibrous aponeurosis at the summit of the diaphragm. '
'The inferior surface of the ', False, False, None),
('pericardium is fused', True, False, NAVY),
(' with the central tendon.', False, False, None),
])
# ─── 3. SHAPE AND POSITION ──────────────────────────────────────
add_section_heading(doc, '3. SHAPE AND POSITION', 'h1')
add_body(doc, [('The diaphragm is NOT flat \u2013 it balloons superiorly to form two domes:', False, False, None)])
for item in [
[('Right dome ', True, False, NAVY),
('is HIGHER (reaches rib V) \u2013 because it overlies the large right lobe of the liver.', False, False, None)],
[('Left dome ', True, False, NAVY),
('is slightly lower \u2013 because of the heart and stomach on the left side.', False, False, None)],
[('Posterior attachment ', True, False, NAVY),
('is inferior to the anterior attachment due to the oblique angle of the inferior thoracic aperture.', False, False, None)],
[('On contraction: ', True, False, NAVY),
('the domes flatten downward \u2192 thoracic volume increases \u2192 air is drawn in (inspiration).', False, False, None)],
]:
p = doc.add_paragraph(style='List Bullet')
p.paragraph_format.left_indent = Cm(0.7)
p.paragraph_format.space_after = Pt(2)
for t, b, i, c in item:
add_run(p, t, bold=b, italic=i, color=c, size=10.5)
# ─── 4. NERVE SUPPLY ────────────────────────────────────────────
add_section_heading(doc, '4. NERVE SUPPLY', 'h1')
add_body(doc, [
('The diaphragm is innervated by the ', False, False, None),
('phrenic nerve', True, False, NAVY),
(' (one on each side):', False, False, None),
])
nerve2 = [
['Feature', 'Detail'],
['Origin', 'Anterior rami of C3, C4, C5 (cervical plexus)'],
['Main contribution', 'C4 (the most important level)'],
['Course', 'Passes vertically through the neck \u2192 superior thoracic aperture \u2192 mediastinum '
'(ANTERIOR to root of lung) \u2192 diaphragm'],
['Motor supply', 'Entire diaphragm, including both crura'],
['Sensory supply', 'Central diaphragm (both surfaces) and pericardium'],
]
make_table(doc, nerve2, [4.5, 11.5])
# Image: Phrenic nerve
add_image_with_caption(doc, IMG+'phrenic_nerve.png',
'Fig. 3.15 Right and left phrenic nerves arising from C3, C4, C5 and descending to the diaphragm', 5.5)
add_note(doc,
'\u270e Memory Trick:',
'"C3, 4, 5 keeps the diaphragm alive"',
bg_hex='FFF3E0', text_color=RED_D)
add_note(doc,
'\u2695 Referred Pain:',
'Irritation of the inferior surface of the diaphragm (e.g., subphrenic abscess, ruptured spleen) '
'causes pain referred to the shoulder tip (C4 dermatome), because the phrenic nerve and the '
'supraclavicular nerves share the same spinal cord level (C4).',
bg_hex='E8F5E9', text_color=GREEN)
add_note(doc,
'\u2695 Phrenic Nerve Palsy:',
'Most important cause to never miss = malignant infiltration by lung cancer. Results in elevation '
'(paradoxical movement) of the diaphragm on the affected side on chest X-ray. Other causes: '
'postviral neuropathy, trauma, and iatrogenic injury during thoracic surgery.',
bg_hex='E8F5E9', text_color=GREEN)
# ─── 5. ACTION ──────────────────────────────────────────────────
add_section_heading(doc, '5. ACTION', 'h1')
action = [
['Action', 'Mechanism', 'Result'],
['Quiet INSPIRATION',
'Diaphragm contracts \u2192 domes flatten downward',
'Thoracic volume increases \u2192 air drawn in'],
['EXPIRATION',
'Diaphragm relaxes \u2192 domes rise back up',
'Thoracic volume decreases \u2192 air expelled'],
['Forced inspiration',
'Diaphragm + intercostals + accessory muscles (scalenes, sternocleidomastoid)',
'Maximal increase in thoracic volume'],
['Increased abdominal pressure',
'Diaphragm + abdominal muscles contract together',
'Used in defecation, childbirth, coughing, and vomiting'],
]
make_table(doc, action, [4, 6, 6])
# ─── 6. OPENINGS ────────────────────────────────────────────────
page_break(doc)
add_section_heading(doc, '6. OPENINGS IN THE DIAPHRAGM \u2605 HIGH YIELD \u2605', 'h1')
add_body(doc, [('Three major openings allow structures to pass between the thorax and abdomen:', False, False, None)])
openings = [
['Vertebral Level', 'Opening', 'Structures Passing Through'],
['T8',
'Caval opening\n(Vena caval foramen)\nIn the CENTRAL TENDON',
'\u2022 Inferior vena cava (IVC)\n\u2022 Right phrenic nerve (sensory branches)'],
['T10',
'Esophageal hiatus\nIn MUSCULAR part\n(right crus)',
'\u2022 Esophagus\n\u2022 Left vagus nerve (anterior trunk)\n\u2022 Right vagus nerve (posterior trunk)\n'
'\u2022 Esophageal branches of left gastric vessels'],
['T12',
'Aortic hiatus\nBETWEEN the two crura\n(posterior to diaphragm)',
'\u2022 Aorta\n\u2022 Thoracic duct\n\u2022 Azygos vein (sometimes)'],
]
t_open = make_table(doc, openings, [2.5, 5, 8.5])
# Image: Diaphragm openings
add_image_with_caption(doc, IMG+'diaphragm_openings.png',
'Fig. 3.8 Inferior view of diaphragm showing the three openings:\n'
'Caval foramen (T8), Esophageal hiatus (T10), and Aortic hiatus (T12),\n'
'with the central tendon and the two crura clearly visible', 5.5)
add_note(doc,
'\u270e Memory Trick:',
'"I Eat Apple" \u2192 IVC at T8, Esophagus at T10, Aorta at T12\n'
'Or simply: I\u20138, E\u201310, A\u201312',
bg_hex='FFF3E0', text_color=RED_D)
add_note(doc,
'\u2695 Hiatus Hernia:',
'The esophageal hiatus (T10) is the most common site for a hiatus hernia. The stomach herniates upward '
'into the thorax through this opening. Presents with heartburn, regurgitation, and difficulty swallowing.',
bg_hex='E8F5E9', text_color=GREEN)
add_body(doc, [
('Important note: ', True, False, NAVY),
('The aorta passes through the aortic hiatus, which is formed ', False, False, None),
('between', True, False, None),
(' the crura, not through the muscular diaphragm itself. Therefore, diaphragm contraction does '
'NOT compress the aortic lumen.', False, False, None),
])
# ════════════════════════════════════════════════════════════════
# QUICK REFERENCE SUMMARY
# ════════════════════════════════════════════════════════════════
page_break(doc)
add_banner(doc, 'QUICK REFERENCE SUMMARY', bg=NAVY, size1=17)
spacer(doc, 6)
add_section_heading(doc, 'Lungs at a Glance', 'h2')
lung_sum = [
['Feature', 'Right Lung', 'Left Lung'],
['Lobes', '3 (Superior, Middle, Inferior)', '2 (Superior, Inferior)'],
['Fissures', '2 (Oblique + Horizontal)', '1 (Oblique only)'],
['Segments', '10', '8\u201310 (some fuse)'],
['Special feature',
'Eparterial bronchus (to superior lobe ABOVE the pulmonary artery)',
'Cardiac notch + Lingula'],
['Main relations',
'SVC, heart (right atrium), azygos vein, esophagus, IVC',
'Heart (left ventricle), aortic arch, thoracic aorta, esophagus'],
]
make_table(doc, lung_sum, [4, 6.5, 5.5])
spacer(doc, 8)
add_section_heading(doc, 'Diaphragm at a Glance', 'h2')
dia_sum = [
['Feature', 'Detail'],
['Origin', 'Xiphoid process (sternal) + lower 6 costal cartilages / ribs (costal) + crura at L1\u2013L3 + arcuate ligaments (lumbar)'],
['Insertion', 'Central tendon (clover-leaf shaped fibrous aponeurosis)'],
['Nerve supply', 'Phrenic nerve (C3, C4, C5) \u2013 main contribution from C4'],
['Action', 'Contraction \u2192 domes flatten \u2192 thoracic volume increases \u2192 INSPIRATION'],
['Right dome', 'Higher (reaches rib V) \u2013 overlies the liver'],
['Left dome', 'Slightly lower \u2013 overlies the stomach and heart'],
['T8 opening', 'Caval foramen \u2013 IVC + right phrenic nerve (in central tendon)'],
['T10 opening', 'Esophageal hiatus \u2013 Esophagus + both vagus nerves (in right crus)'],
['T12 opening', 'Aortic hiatus \u2013 Aorta + thoracic duct (between crura)'],
]
make_table(doc, dia_sum, [4.5, 11.5])
spacer(doc, 10)
footer_p = doc.add_paragraph()
footer_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
para_space(footer_p, 0, 0)
r_f = footer_p.add_run('Source: Gray\'s Anatomy for Students (pp. 163\u2013216) | Notes compiled for syllabus topics 2.2 & 2.3')
r_f.italic = True
r_f.font.size = Pt(8.5)
r_f.font.color.rgb = RGBColor(0x88, 0x88, 0x88)
doc.save(OUT)
print(f"Word document saved to: {OUT}")
cd /tmp/workspace/anatomy-notes && python make_docx.py 2>&1
python3 -c "from docx.shared import RGBColor; c = RGBColor(0x1a,0x3a,0x5c); print(dir(c)); print(type(c)); print(c)"
~/anatomy-notes/make_docx.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/anatomy-notes/make_docx.py'
~/anatomy-notes/make_docx.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/anatomy-notes/make_docx.py'
cd /tmp/workspace/anatomy-notes && python make_docx.py 2>&1
ls -lh /tmp/workspace/anatomy-notes/Anatomy_2.2_2.3_Notes.docx && python3 -c " from docx import Document doc = Document('/tmp/workspace/anatomy-notes/Anatomy_2.2_2.3_Notes.docx') print('Paragraphs:', len(doc.paragraphs)) print('Tables:', len(doc.tables)) # Count inline images from docx.oxml.ns import qn count = sum(1 for p in doc.paragraphs for r in p.runs if r._element.findall('.//' + qn('a:blip'), r._element.nsmap) ) print('Image runs (approx):', count) # Print first few non-empty paragraphs shown = 0 for p in doc.paragraphs: if p.text.strip() and shown < 12: print(f' [{p.style.name}] {p.text[:80]}') shown += 1 "
Anatomy 2.2 2.3 Notes
Word Document · DOCX
| Section | Content |
|---|---|
| Cover page | Title, topic list, source |
| Topic 2.2 | 6 fully formatted sections with colour-coded headings |
| Topic 2.3 | 6 fully formatted sections with colour-coded headings |
| Summary page | Quick-reference tables for both topics |