Hey
I am in 1st year MBBS. Give me answers of every questions according to that.
Clinical anatomy of elbow joint
| Articulation | Bones Involved | Movement |
|---|---|---|
| Humeroulnar joint | Trochlea of humerus + trochlear notch of ulna | Flexion / Extension |
| Humeroradial joint | Capitulum of humerus + head of radius | Flexion / Extension |
| Proximal radioulnar joint | Head of radius + radial notch of ulna | Pronation / Supination |
| Ligament | Location | Function |
|---|---|---|
| Medial (ulnar) collateral ligament | Medial side | Stabilizes against valgus stress |
| Lateral (radial) collateral ligament | Lateral side | Stabilizes against varus stress |
| Annular ligament of radius | Encircles radial head | Holds radial head in the radial notch; allows rotation |
| Movement | Range | Muscles |
|---|---|---|
| Flexion | 0Β° to ~145Β° | Biceps brachii, brachialis, brachioradialis |
| Extension | Return to 0Β° | Triceps brachii, anconeus |
| Pronation | ~90Β° | Pronator teres, pronator quadratus |
| Supination | ~90Β° | Biceps brachii, supinator |
Note: Pronation/supination is best examined with the elbow flexed at 90Β° and the arm held at the side, to eliminate shoulder rotation.
| Centre | Age of Appearance |
|---|---|
| C - Capitulum | 1 year |
| R - Radial head | 5 years |
| I - Internal (medial) epicondyle | 5 years |
| T - Trochlea | 11 years |
| O - Olecranon | 12 years |
| E - External (lateral) epicondyle | 13 years |
Create a summary PDF on elbow joint fractures for quick revision
ls /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"
mkdir -p /home/daytona/workspace/elbow-revision
~/elbow-revision/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import PageBreak
OUTPUT = "/home/daytona/workspace/elbow-revision/Elbow_Joint_Fractures_Revision.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=2*cm, bottomMargin=2*cm
)
W, H = A4
# ββ Colour palette βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
NAVY = colors.HexColor("#1A3560")
BLUE = colors.HexColor("#2563EB")
LBLUE = colors.HexColor("#DBEAFE")
ORANGE = colors.HexColor("#EA580C")
LORANGE = colors.HexColor("#FFF7ED")
GREEN = colors.HexColor("#16A34A")
LGREEN = colors.HexColor("#F0FDF4")
RED = colors.HexColor("#DC2626")
LRED = colors.HexColor("#FEF2F2")
YELLOW = colors.HexColor("#CA8A04")
LYELLOW = colors.HexColor("#FEFCE8")
PURPLE = colors.HexColor("#7C3AED")
LPURPLE = colors.HexColor("#F5F3FF")
GREY = colors.HexColor("#F1F5F9")
DGREY = colors.HexColor("#475569")
BLACK = colors.HexColor("#0F172A")
WHITE = colors.white
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
# ββ Custom styles ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
title_style = S("Title",
fontSize=22, fontName="Helvetica-Bold", textColor=WHITE,
alignment=TA_CENTER, spaceAfter=4)
subtitle_style = S("Subtitle",
fontSize=11, fontName="Helvetica", textColor=colors.HexColor("#BFDBFE"),
alignment=TA_CENTER, spaceAfter=2)
tag_style = S("Tag",
fontSize=9, fontName="Helvetica-Oblique", textColor=colors.HexColor("#93C5FD"),
alignment=TA_CENTER)
section_style = S("Section",
fontSize=13, fontName="Helvetica-Bold", textColor=WHITE,
alignment=TA_LEFT, spaceAfter=0, spaceBefore=0,
leftPadding=8)
body_style = S("Body",
fontSize=9.5, fontName="Helvetica", textColor=BLACK,
leading=14, spaceAfter=3, alignment=TA_JUSTIFY)
bold_body = S("BoldBody",
fontSize=9.5, fontName="Helvetica-Bold", textColor=BLACK,
leading=14, spaceAfter=3)
bullet_style = S("Bullet",
fontSize=9.2, fontName="Helvetica", textColor=BLACK,
leading=13.5, leftIndent=12, spaceAfter=2,
bulletIndent=0, bulletFontName="Helvetica")
warn_style = S("Warn",
fontSize=9, fontName="Helvetica-Bold", textColor=RED,
leading=13, leftIndent=8, spaceAfter=2)
note_style = S("Note",
fontSize=8.8, fontName="Helvetica-Oblique", textColor=DGREY,
leading=13, alignment=TA_JUSTIFY)
table_header_style = S("TableHeader",
fontSize=8.5, fontName="Helvetica-Bold", textColor=WHITE,
alignment=TA_CENTER, leading=11)
table_cell_style = S("TableCell",
fontSize=8.5, fontName="Helvetica", textColor=BLACK,
alignment=TA_LEFT, leading=11)
mnemonic_style = S("Mnemonic",
fontSize=11, fontName="Helvetica-Bold", textColor=PURPLE,
alignment=TA_CENTER, leading=18)
footer_style = S("Footer",
fontSize=7.5, fontName="Helvetica-Oblique", textColor=DGREY,
alignment=TA_CENTER)
# ββ Helper builders ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def header_bar(text, bg=NAVY, text_color=WHITE):
data = [[Paragraph(text, ParagraphStyle("hdr",
fontSize=12, fontName="Helvetica-Bold",
textColor=text_color, alignment=TA_LEFT, leading=15))]]
t = Table(data, colWidths=[doc.width])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0), (-1,-1), 6),
("ROUNDEDCORNERS", [4]),
]))
return t
def two_col_table(rows, col1_w=4.5*cm, bg_header=NAVY, header_row=None):
col2_w = doc.width - col1_w
data = []
if header_row:
data.append([
Paragraph(header_row[0], table_header_style),
Paragraph(header_row[1], table_header_style)
])
for r in rows:
data.append([
Paragraph(r[0], bold_body),
Paragraph(r[1], body_style)
])
t = Table(data, colWidths=[col1_w, col2_w])
style = [
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#CBD5E1")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING",(0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS", (0,0), (-1,-1), [GREY, WHITE]),
]
if header_row:
style += [
("BACKGROUND", (0,0), (-1,0), bg_header),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, GREY]),
]
t.setStyle(TableStyle(style))
return t
def three_col_table(rows, widths, header_row=None, bg_header=NAVY):
data = []
if header_row:
data.append([Paragraph(h, table_header_style) for h in header_row])
for r in rows:
data.append([Paragraph(c, body_style) for c in r])
t = Table(data, colWidths=widths)
style = [
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#CBD5E1")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING",(0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS",(0,0),(-1,-1), [GREY, WHITE]),
]
if header_row:
style += [
("BACKGROUND", (0,0), (-1,0), bg_header),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, GREY]),
]
t.setStyle(TableStyle(style))
return t
def colored_box(content_rows, bg=LBLUE, border=BLUE):
"""Wrap a list of flowables in a colored 1-cell table."""
inner = []
for item in content_rows:
inner.append(item)
data = [[inner]]
t = Table([[content_rows]], colWidths=[doc.width])
# Use a simpler approach - just a paragraph list in a table cell
cell_content = "".join(
f"<para>{r}</para>" for r in content_rows
) if isinstance(content_rows[0], str) else None
return t
def info_box(paragraphs_list, bg=LBLUE, border_color=BLUE):
data = [[paragraphs_list]]
t = Table(data, colWidths=[doc.width])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 1.2, border_color),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING",(0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
return t
def bullet(text, color="β’"):
return Paragraph(f"{color} {text}", bullet_style)
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# BUILD CONTENT
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story = []
# ββ COVER BANNER ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
cover_data = [[
Paragraph("ELBOW JOINT FRACTURES", title_style),
Paragraph("Quick Revision Notes β 1st Year MBBS", subtitle_style),
Paragraph("Anatomy β’ Clinical Features β’ Complications β’ Management", tag_style),
]]
cover = Table(cover_data, colWidths=[doc.width])
cover.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("BOX", (0,0), (-1,-1), 0, NAVY),
("TOPPADDING", (0,0), (-1,-1), 18),
("BOTTOMPADDING",(0,0), (-1,-1), 18),
("LEFTPADDING", (0,0), (-1,-1), 14),
("RIGHTPADDING", (0,0), (-1,-1), 14),
("ROUNDEDCORNERS",[6]),
]))
story.append(cover)
story.append(Spacer(1, 0.35*cm))
# ββ QUICK OVERVIEW TABLE βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(header_bar("π AT A GLANCE β Elbow Fracture Types", NAVY))
story.append(Spacer(1, 0.2*cm))
overview_rows = [
["Supracondylar Hx", "Distal humerus above epicondyles", "Children 5β10 yrs", "FOOSH"],
["Lateral Condyle Fx", "Lateral condyle of humerus", "Children 5β10 yrs", "FOOSH + varus force"],
["Medial Epicondyle Fx", "Medial epicondyle avulsion", "Children/adolescents", "Valgus stress / dislocation"],
["Olecranon Fx", "Olecranon process of ulna", "Adults", "Direct blow / triceps avulsion"],
["Radial Head Fx", "Head of radius", "Adults", "FOOSH"],
["Intercondylar Fx", "T/Y fracture through condyles", "Elderly adults", "High energy trauma"],
["Nursemaid's Elbow", "Radial head subluxation", "< 5 years", "Axial pull on hand"],
]
w1 = 3.8*cm; w2 = 4.5*cm; w3 = 3.2*cm; w4 = doc.width - w1 - w2 - w3
overview = three_col_table(
overview_rows,
widths=[w1, w2, w3, w4],
header_row=["Fracture", "Site", "Age Group", "Mechanism"],
bg_header=NAVY
)
story.append(overview)
story.append(Spacer(1, 0.4*cm))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# 1. SUPRACONDYLAR FRACTURE
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(KeepTogether([
header_bar("1. SUPRACONDYLAR FRACTURE OF HUMERUS", BLUE),
Spacer(1, 0.15*cm),
]))
sc_rows = [
["Site", "Transverse fracture of distal humerus ABOVE the level of epicondyles"],
["Age / Incidence", "Most common elbow fracture in children (5β10 yrs). Rare in adults."],
["Mechanism", "Fall on outstretched hand (FOOSH) β extension type (95%). Flexion type (5%) β direct blow on flexed elbow."],
["Displacement", "Posterior displacement of distal fragment by triceps pull (extension type)."],
["Classification", "Gartland I β undisplaced | II β partially displaced | III β fully displaced"],
]
story.append(two_col_table(sc_rows, col1_w=3.5*cm))
story.append(Spacer(1, 0.2*cm))
# Clinical features sub-header
story.append(Paragraph("<b>Clinical Features</b>", bold_body))
sc_cf = [
bullet("Pain, swelling, tenderness around the elbow"),
bullet("S-shaped deformity (extension type)"),
bullet("Posterior prominence of olecranon"),
bullet("Normal triangle of bony points (medial epicondyle, lateral epicondyle, olecranon) β PRESERVED (unlike dislocation)"),
bullet("Pucker sign: Puckering of skin anteriorly due to proximal fragment piercing brachialis"),
]
story.append(info_box(sc_cf, bg=LBLUE, border_color=BLUE))
story.append(Spacer(1, 0.2*cm))
# Neurovascular complications
story.append(Paragraph("<b>β Complications β The Most Important Part!</b>", warn_style))
comp_rows = [
["Brachial Artery Injury", "Bowstringing over proximal fragment β ischaemia β Volkmann's Ischaemic Contracture (VIC)"],
["Anterior Interosseous N. (AIN)", "Branch of median nerve. Test: 'OK sign' β inability to flex terminal IP of thumb + index finger"],
["Radial Nerve", "Less common. Wrist drop."],
["Median Nerve", "Rare. Sensory loss over lateral 3Β½ fingers."],
["Ulnar Nerve", "Most common in flexion type fractures."],
["Cubitus Varus (Gunstock deformity)", "Most common late complication. Due to malunion. Cosmetic, not functional."],
["Cubitus Valgus", "Less common. Can cause delayed ulnar nerve palsy."],
["Myositis Ossificans", "Heterotopic ossification β avoid passive stretching."],
]
story.append(two_col_table(comp_rows, col1_w=4.2*cm, bg_header=RED,
header_row=["Complication", "Details"]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>Volkmann's Ischaemic Contracture (VIC)</b>", bold_body))
vic_items = [
bullet("Caused by ischaemia of anterior compartment muscles (flexors of forearm)"),
bullet("Classic triad: Pain on passive extension of fingers + Pallor + Pulselessness"),
bullet("Late: Wrist flexion + finger flexion contracture (clawing), forearm pronation"),
bullet("3 Ps of compartment syndrome: Pain, Pallor, Pulselessness (also Paraesthesia, Paralysis)"),
]
story.append(info_box(vic_items, bg=LRED, border_color=RED))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>Management</b>", bold_body))
mgmt_rows = [
["Gartland I", "Above-elbow POP cast in 90Β° flexion for 3 weeks"],
["Gartland II", "Closed reduction + POP / percutaneous K-wire fixation"],
["Gartland III", "Closed reduction + percutaneous K-wire (crossed or lateral). ORIF if closed fails."],
["Neurovascular compromise", "Urgent reduction. If no pulse after reduction β explore brachial artery."],
]
story.append(two_col_table(mgmt_rows, col1_w=3.5*cm))
story.append(Spacer(1, 0.5*cm))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# 2. LATERAL CONDYLE FRACTURE
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(KeepTogether([
header_bar("2. LATERAL CONDYLE FRACTURE", colors.HexColor("#0369A1")),
Spacer(1, 0.15*cm),
]))
lc_rows = [
["Site", "Fracture through lateral condyle of humerus (Salter-Harris Type IV physeal injury)"],
["Age", "2nd most common elbow fracture in children (5β10 yrs)"],
["Mechanism", "FOOSH with varus stress / avulsion by common extensor origin"],
["Key Feature", "Fracture line enters the joint β intra-articular. Risk of non-union is HIGH."],
["Classification", "Milch Type I (lateral trochlear ridge intact) & Type II (fracture through trochlear groove)"],
]
story.append(two_col_table(lc_rows, col1_w=3.5*cm))
lc_comp = [
bullet("Non-union (most common complication) β fishtail deformity on X-ray"),
bullet("Malunion β Cubitus valgus β Late ulnar nerve palsy (tardy ulnar palsy)"),
bullet("Avascular necrosis of lateral condyle"),
bullet("Stiffness"),
]
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph("<b>Complications</b>", bold_body))
story.append(info_box(lc_comp, bg=LYELLOW, border_color=YELLOW))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>Management</b>: Undisplaced β POP cast. Displaced β ORIF with K-wires or screws.", body_style))
story.append(Spacer(1, 0.4*cm))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# 3. MEDIAL EPICONDYLE FRACTURE
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(KeepTogether([
header_bar("3. MEDIAL EPICONDYLE FRACTURE", colors.HexColor("#0F766E")),
Spacer(1, 0.15*cm),
]))
me_rows = [
["Type", "Extra-articular avulsion fracture (apophyseal)"],
["Age", "Adolescents (10β15 yrs). Ossification centre appears at ~5 yrs."],
["Mechanism", "Valgus stress (FOOSH) or elbow dislocation (associated in 50% cases)"],
["Key Point", "Epicondyle may become trapped inside the joint following reduction of dislocation β check post-reduction X-ray!"],
]
story.append(two_col_table(me_rows, col1_w=3.5*cm))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph(
"<b>Nerve at Risk:</b> Ulnar nerve (runs in groove posterior to medial epicondyle). "
"Injury causes: Weakness of intrinsic hand muscles, claw hand, sensory loss over medial 1Β½ fingers.",
body_style))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph("<b>Management</b>: Undisplaced β conservative. Displaced / incarcerated in joint β ORIF.", body_style))
story.append(Spacer(1, 0.4*cm))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# 4. OLECRANON FRACTURE
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(KeepTogether([
header_bar("4. OLECRANON FRACTURE", ORANGE),
Spacer(1, 0.15*cm),
]))
ol_rows = [
["Site", "Olecranon process of ulna (insertion of triceps brachii)"],
["Age", "Adults (all ages)"],
["Mechanism", "1. Direct blow to olecranon 2. FOOSH + triceps avulsion 3. Avulsion by triceps contraction"],
["Clinical", "Pain, swelling over olecranon. Gap palpable at fracture site. INABILITY TO EXTEND the elbow actively."],
["X-ray", "Lateral view β transverse fracture at olecranon. Check for displacement."],
]
story.append(two_col_table(ol_rows, col1_w=3.5*cm))
story.append(Spacer(1, 0.15*cm))
ol_mgmt = [
bullet("Undisplaced: Above elbow POP in 90Β° flexion for 3β4 weeks"),
bullet("Displaced: Tension band wiring (TBW) β converts tensile force to compressive force at fracture site"),
bullet("Comminuted: Plate and screw fixation or olecranon excision (elderly)"),
]
story.append(Paragraph("<b>Management</b>", bold_body))
story.append(info_box(ol_mgmt, bg=LORANGE, border_color=ORANGE))
story.append(Spacer(1, 0.4*cm))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# 5. RADIAL HEAD FRACTURE
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(KeepTogether([
header_bar("5. FRACTURE OF HEAD OF RADIUS", GREEN),
Spacer(1, 0.15*cm),
]))
rh_rows = [
["Mechanism", "FOOSH β axial force transmitted up radius to radial head"],
["Age", "Adults (20β60 yrs). Most common elbow fracture in adults."],
["Clinical", "Lateral elbow pain, tenderness over radial head, painful pronation/supination, restricted extension"],
["X-ray Sign", "Posterior fat pad sign (sail sign) on lateral view = haemarthrosis = intra-articular fracture"],
["Classification", "Mason Classification (IβIII, +/- Essex-Lopresti variant)"],
]
story.append(two_col_table(rh_rows, col1_w=3.5*cm))
story.append(Spacer(1, 0.15*cm))
mason_rows = [
["Mason I", "Undisplaced marginal fracture", "Sling, early mobilization"],
["Mason II", "Displaced / angulated (>30Β°, >30% head)", "ORIF with Herbert screw"],
["Mason III", "Comminuted fracture of entire head", "Radial head excision or prosthetic replacement"],
["Mason IV", "Any of above + elbow dislocation", "Treat dislocation first, then fracture"],
]
story.append(three_col_table(
mason_rows,
widths=[2.5*cm, 8.0*cm, doc.width-2.5*cm-8.0*cm],
header_row=["Type", "Description", "Treatment"],
bg_header=GREEN
))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph(
"<b>Essex-Lopresti injury:</b> Radial head fracture + disruption of interosseous membrane + "
"distal radioulnar joint subluxation. Do NOT excise radial head β causes proximal migration of radius.",
body_style))
story.append(Spacer(1, 0.4*cm))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# 6. PULLED ELBOW (NURSEMAID'S ELBOW)
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(KeepTogether([
header_bar("6. PULLED ELBOW (NURSEMAID'S ELBOW)", PURPLE),
Spacer(1, 0.15*cm),
]))
pe_rows = [
["Age", "< 5 years (radial head small + annular ligament lax)"],
["Mechanism", "Axial pull on the child's hand (e.g., pulled over a curb, swinging by hands)"],
["Pathology", "Radial head subluxes UNDER the annular ligament of radius"],
["Clinical", "Child holds arm in slight flexion + pronation, refuses to use arm, no obvious swelling"],
["X-ray", "Usually normal (subluxation, not fracture). Done to exclude fracture."],
["Treatment", "Closed reduction: Supination + compression over radial head (or hyperpronation method). IMMEDIATE pain relief after reduction."],
]
story.append(two_col_table(pe_rows, col1_w=3.5*cm))
story.append(Spacer(1, 0.4*cm))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# 7. ELBOW DISLOCATION
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(KeepTogether([
header_bar("7. ELBOW DISLOCATION", RED),
Spacer(1, 0.15*cm),
]))
ed_rows = [
["Most Common Type", "Posterior dislocation (both forearm bones displace posteriorly)"],
["Age", "Adults and children. Most common dislocation in children."],
["Mechanism", "FOOSH with valgus stress"],
["Clinical", "Elbow appears shortened, posterior displacement of olecranon, elbow held in flexion, loss of normal triangle of bony points"],
["Key Difference from Supracondylar", "Triangle of bony points DISRUPTED (vs. preserved in supracondylar Fx)"],
["Complications", "Brachial artery, median/ulnar nerve injury. Associated fractures (medial epicondyle 50%, coronoid, radial head)."],
["Treatment", "Closed reduction under sedation. Immobilize in 90Β° for 2β3 weeks, then physiotherapy."],
]
story.append(two_col_table(ed_rows, col1_w=4.0*cm))
story.append(Spacer(1, 0.4*cm))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# MNEMONIC / MEMORY AIDS PAGE
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(header_bar("π§ MNEMONICS & MEMORY AIDS", PURPLE))
story.append(Spacer(1, 0.2*cm))
# CRITOE box
critoe_items = [
Paragraph("<b>CRITOE</b> β Ossification centres of elbow (order of appearance)",
ParagraphStyle("mn_hdr", fontSize=10, fontName="Helvetica-Bold", textColor=PURPLE, leading=15)),
Spacer(1, 0.1*cm),
Paragraph(
"<b>C</b>apitulum (1 yr) <b>R</b>adial head (5 yrs) <b>I</b>nternal epicondyle (5 yrs) "
"<b>T</b>rochlea (11 yrs) <b>O</b>lecranon (12 yrs) <b>E</b>xternal epicondyle (13 yrs)",
ParagraphStyle("critoe", fontSize=9.5, fontName="Helvetica", textColor=BLACK, leading=15)),
Spacer(1, 0.05*cm),
Paragraph("Rule: If a centre appears in the wrong order on X-ray β suspect avulsion fracture!",
note_style),
]
story.append(info_box(critoe_items, bg=LPURPLE, border_color=PURPLE))
story.append(Spacer(1, 0.2*cm))
# Nerve injuries box
nerve_data = [
["Supracondylar Fx", "AIN (anterior interosseous nerve) β branch of median", "Cannot make 'OK' sign"],
["Medial Epicondyle Fx", "Ulnar nerve", "Claw hand, sensory loss medial 1Β½ fingers"],
["Lateral Condyle Fx (late)", "Ulnar nerve (tardy)", "Late progressive claw hand"],
["Radial Head Fx", "Posterior interosseous nerve (PIN)", "Wrist/finger drop"],
["Elbow Dislocation", "Median or ulnar nerve", "Variable"],
]
story.append(Paragraph("<b>Nerve Injuries β Quick Reference</b>", bold_body))
nerve_table = three_col_table(
nerve_data,
widths=[4.0*cm, 6.5*cm, doc.width-4.0*cm-6.5*cm],
header_row=["Fracture", "Nerve at Risk", "Deficit"],
bg_header=PURPLE
)
story.append(nerve_table)
story.append(Spacer(1, 0.2*cm))
# Bony points box
bp_items = [
Paragraph("<b>Triangle of Bony Points</b> (medial epicondyle, lateral epicondyle, olecranon tip)", bold_body),
bullet("Elbow <b>extended</b>: Three points form a <b>straight horizontal line</b>"),
bullet("Elbow <b>flexed 90Β°</b>: Three points form an <b>isosceles triangle</b>"),
bullet("<b>Supracondylar Fx:</b> Triangle PRESERVED (fracture above epicondyles)"),
bullet("<b>Elbow Dislocation:</b> Triangle DISRUPTED (bones displaced)"),
]
story.append(info_box(bp_items, bg=LGREEN, border_color=GREEN))
story.append(Spacer(1, 0.2*cm))
# Volkmann box
vic2_items = [
Paragraph("<b>Volkmann's Ischaemic Contracture β 5 Ps of Compartment Syndrome</b>", bold_body),
Paragraph(
"<b>P</b>ain (on passive extension of fingers) | "
"<b>P</b>allor | <b>P</b>ulselessness | "
"<b>P</b>araesthesia | <b>P</b>aralysis",
ParagraphStyle("5ps", fontSize=9.5, fontName="Helvetica", textColor=BLACK, leading=16)
),
Paragraph("Late deformity: Wrist flexion + finger flexion + forearm pronation (flexor ischaemia)", note_style),
]
story.append(info_box(vic2_items, bg=LRED, border_color=RED))
story.append(Spacer(1, 0.4*cm))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# COMPARISON TABLE
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(header_bar("π SUPRACONDYLAR Fx vs ELBOW DISLOCATION vs LATERAL CONDYLE Fx", DGREY))
story.append(Spacer(1, 0.15*cm))
compare_rows = [
["Age", "Children 5β10 yrs", "Any age", "Children 5β10 yrs"],
["Mechanism", "FOOSH (extension)", "FOOSH + valgus", "FOOSH + varus"],
["Deformity", "S-shaped", "Posterior prominence", "Lateral swelling"],
["Bony Triangle", "PRESERVED", "DISRUPTED", "Preserved (usually)"],
["Nerve at Risk", "AIN (median branch)", "Median / Ulnar", "Ulnar (late)"],
["Main Complication", "Volkmann's, cubitus varus", "Associated fractures", "Non-union, cubitus valgus"],
["X-ray", "Oblique fracture line above epicondyles", "Posterior displacement both bones", "Fracture lateral condyle"],
]
compare = Table(
[[Paragraph(f, ParagraphStyle("ch", fontSize=8.5, fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER))]
for f in ["Feature", "Supracondylar Fx", "Elbow Dislocation", "Lateral Condyle Fx"]],
colWidths=[0]*4
)
# Build as proper table
header = ["Feature", "Supracondylar Fx", "Elbow Dislocation", "Lateral Condyle Fx"]
w_c = [3.2*cm, 4.6*cm, 4.6*cm, doc.width-3.2*cm-4.6*cm-4.6*cm]
comp_data = [[Paragraph(h, table_header_style) for h in header]]
for row in compare_rows:
comp_data.append([Paragraph(c, body_style) for c in row])
comp_t = Table(comp_data, colWidths=w_c)
comp_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DGREY),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#CBD5E1")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, GREY]),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
]))
story.append(comp_t)
story.append(Spacer(1, 0.4*cm))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# FAT PAD SIGN
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(KeepTogether([
header_bar("π FAT PAD SIGN (X-ray)", colors.HexColor("#1D4ED8")),
Spacer(1, 0.15*cm),
info_box([
Paragraph("<b>Anterior fat pad</b>: Normally visible as a thin lucent stripe β NOT significant alone.", body_style),
bullet("<b>Elevated anterior fat pad</b> = may indicate effusion"),
bullet("<b>Posterior fat pad sign</b> = ALWAYS abnormal = haemarthrosis = occult intra-articular fracture"),
bullet("Seen on lateral X-ray of elbow in 90Β° flexion"),
bullet("Most commonly indicates radial head fracture in adults, supracondylar fracture in children"),
Paragraph("<i>Even if no fracture line visible, positive fat pad sign = treat as fracture!</i>", note_style),
], bg=LBLUE, border_color=BLUE),
]))
story.append(Spacer(1, 0.4*cm))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# FOOTER
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(HRFlowable(width="100%", thickness=0.5, color=DGREY))
story.append(Spacer(1, 0.1*cm))
story.append(Paragraph(
"Sources: Gray's Anatomy for Students | S Das Manual on Clinical Surgery (13th Ed.) | Campbell's Operative Orthopaedics (15th Ed. 2026) β For 1st Year MBBS Quick Revision",
footer_style))
# ββ BUILD PDF ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /home/daytona/workspace/elbow-revision && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/elbow-revision/Elbow_Joint_Fractures_Revision.pdf
Elbow Joint Fractures Revision
PDF Document Β· PDF
| Section | Content |
|---|---|
| At a Glance Table | All fracture types, sites, age groups, mechanisms |
| Supracondylar Fracture | Gartland classification, VIC, nerve injuries, management |
| Lateral Condyle Fracture | Milch classification, non-union, tardy ulnar palsy |
| Medial Epicondyle Fracture | Incarceration in joint, ulnar nerve injury |
| Olecranon Fracture | Tension band wiring principle |
| Radial Head Fracture | Mason classification, fat pad sign, Essex-Lopresti |
| Pulled Elbow | Mechanism, reduction technique |
| Elbow Dislocation | vs supracondylar comparison |
| Mnemonics | CRITOE, 5 Ps, bony triangle rules |
| Nerve Injury Table | Every fracture + nerve at risk + deficit |
| Comparison Table | Supracondylar vs Dislocation vs Lateral Condyle |
| Fat Pad Sign | X-ray interpretation |