Type of Fractures Osteomyelitis Tb Talus fracture
| Type | Description |
|---|---|
| Closed (Simple) | Skin overlying fracture is intact |
| Open (Compound) | Fracture exposed to external environment - treat as open until proven otherwise |

| Type | Mechanism | Key Feature |
|---|---|---|
| Transverse | Direct blow / tension | Line at 90° to long axis of bone |
| Oblique | Compression + bending | Line runs oblique to long axis |
| Spiral | Rotational/torsion force | Encircles shaft in spiral fashion - often confused with oblique |
| Comminuted | High-energy crush | More than 2 fragments |
Exam tip: Always describe a fracture as: Open/closed + Bone + Side + Location (proximal/middle/distal third) + Fracture line + Displacement
| Setting | Organism |
|---|---|
| Children (all ages) | S. aureus (MRSA most common in AHO) |
| Neonates | Group B Streptococcus, E. coli |
| Sickle cell disease | Salmonella (classic exam answer), gram-negatives |
| Open fractures / surgery | Mixed organisms |
| Adults + diabetes | S. aureus, gram-negatives (feet) |
| Site | Frequency |
|---|---|
| Spine (Pott's disease) | 50-70% of cases |
| Hip or Knee | 15-20% |
| Shoulder, elbow, ankle, wrist, other | 15-20% |
| Usually monoarticular (one joint) |
| Type | Frequency | Mechanism |
|---|---|---|
| Neck fracture | 50% | Forced dorsiflexion (falls, MVA) - "Aviator's astragalus" |
| Head fracture | 10% | Axial compression on plantar-flexed foot |
| Body fracture | Uncommon | Axial compression between tibia and calcaneus |
| Minor fractures | - | Lateral/posterior process, osteochondral dome, avulsion fractures |

| Type | Description | AVN Rate |
|---|---|---|
| Type I | Nondisplaced fracture | ~10% |
| Type II | Displaced + subtalar joint subluxation | ~27% |
| Type III | Displaced + subtalar AND tibiotalar subluxation (50% open) | ~53% |
| Type IV | Distraction of subtalar + tibiotalar + talonavicular joints | ~48% |
Higher the type = more vascular disruption = higher AVN risk
| Your Note | Relevance |
|---|---|
| Sequestrum | Dead bone in chronic osteomyelitis |
| Wrist drop | Complication - radial nerve injury |
| Foot drop | Complication - common peroneal nerve injury |
| Compartment syndrome | Post-fracture emergency |
| Complications of fractures | Fat embolism, DVT, nerve/vessel injury, AVN, malunion |
| Congenital dislocation of hip | Ortolani/Barlow positive |
| Club foot (CTEV) | Congenital Talipes Equinovarus |
| Scaphoid fracture | Snuffbox tenderness, risk of AVN |
| Supracondylar humerus | Anterior interosseous nerve / brachial artery injury risk |
MAKE A PDF
mkdir -p /home/daytona/workspace/ortho-pdf && ls /home/daytona/workspace/ortho-p…
~/ortho-pdf/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, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import Image as RLImage
import urllib.request
import os
OUTPUT = "/home/daytona/workspace/ortho-pdf/Orthopaedics_Study_Guide.pdf"
# ── Colour palette ─────────────────────────────────────────────────────────────
C_DARK_BLUE = colors.HexColor("#1A3A5C")
C_MED_BLUE = colors.HexColor("#2E6DA4")
C_LIGHT_BLUE = colors.HexColor("#D6E8F7")
C_ACCENT = colors.HexColor("#E8522A")
C_GOLD = colors.HexColor("#F5A623")
C_LIGHT_GOLD = colors.HexColor("#FFF8E7")
C_GREEN = colors.HexColor("#2E7D32")
C_LIGHT_GREEN= colors.HexColor("#E8F5E9")
C_RED = colors.HexColor("#C62828")
C_LIGHT_RED = colors.HexColor("#FFEBEE")
C_GREY = colors.HexColor("#F4F6F8")
C_DARK_GREY = colors.HexColor("#455A64")
C_WHITE = colors.white
# ── Styles ─────────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
title_style = S("MainTitle",
fontName="Helvetica-Bold", fontSize=26, textColor=C_WHITE,
alignment=TA_CENTER, leading=32, spaceAfter=4)
subtitle_style = S("Subtitle",
fontName="Helvetica", fontSize=13, textColor=C_LIGHT_BLUE,
alignment=TA_CENTER, leading=18, spaceAfter=2)
h1_style = S("H1",
fontName="Helvetica-Bold", fontSize=16, textColor=C_WHITE,
spaceBefore=14, spaceAfter=6, leading=20)
h2_style = S("H2",
fontName="Helvetica-Bold", fontSize=13, textColor=C_DARK_BLUE,
spaceBefore=10, spaceAfter=4, leading=17)
h3_style = S("H3",
fontName="Helvetica-Bold", fontSize=11, textColor=C_MED_BLUE,
spaceBefore=6, spaceAfter=3, leading=15)
body_style = S("Body",
fontName="Helvetica", fontSize=10, textColor=colors.HexColor("#222222"),
leading=15, spaceAfter=3, alignment=TA_JUSTIFY)
bullet_style = S("Bullet",
fontName="Helvetica", fontSize=10, textColor=colors.HexColor("#222222"),
leading=14, spaceAfter=2, leftIndent=12, bulletIndent=0)
bold_body = S("BoldBody",
fontName="Helvetica-Bold", fontSize=10, textColor=C_DARK_BLUE,
leading=14, spaceAfter=2)
highlight_style = S("Highlight",
fontName="Helvetica-Bold", fontSize=10, textColor=C_RED,
leading=14, spaceAfter=3, leftIndent=8,
backColor=C_LIGHT_RED, borderPad=4)
caption_style = S("Caption",
fontName="Helvetica-Oblique", fontSize=8, textColor=C_DARK_GREY,
alignment=TA_CENTER, leading=11, spaceAfter=4)
footer_style = S("Footer",
fontName="Helvetica", fontSize=8, textColor=C_DARK_GREY,
alignment=TA_CENTER)
# ── Helper utilities ──────────────────────────────────────────────────────────
def section_header(number, title, color=C_DARK_BLUE):
"""Returns a coloured section header block."""
data = [[Paragraph(f"<font color='white'><b>{number}. {title}</b></font>", h1_style)]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("ROUNDEDCORNERS", [6]),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
]))
return t
def info_box(text, bg=C_LIGHT_BLUE, border=C_MED_BLUE):
data = [[Paragraph(text, body_style)]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 1.5, border),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING",(0,0),(-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING",(0,0), (-1,-1), 10),
]))
return t
def make_table(headers, rows, col_widths=None):
if col_widths is None:
col_widths = [17*cm/len(headers)] * len(headers)
header_row = [Paragraph(f"<b>{h}</b>", S("TH", fontName="Helvetica-Bold",
fontSize=9.5, textColor=C_WHITE, leading=13, alignment=TA_CENTER))
for h in headers]
data = [header_row]
for row in rows:
data.append([Paragraph(str(c), S("TD", fontName="Helvetica", fontSize=9.5,
textColor=colors.HexColor("#1A1A1A"), leading=13))
for c in row])
t = Table(data, colWidths=col_widths, repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_DARK_BLUE),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C_WHITE, C_GREY]),
("GRID", (0,0), (-1,-1), 0.5, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
return t
def bullet(text):
return Paragraph(f"\u2022 {text}", bullet_style)
def download_image(url, filename):
path = f"/home/daytona/workspace/ortho-pdf/{filename}"
if not os.path.exists(path):
try:
urllib.request.urlretrieve(url, path)
except Exception as e:
print(f"Image download failed: {e}")
return None
return path
# ── Page template with header/footer ─────────────────────────────────────────
def on_page(canvas, doc):
canvas.saveState()
w, h = A4
# Top stripe
canvas.setFillColor(C_DARK_BLUE)
canvas.rect(0, h-18, w, 18, fill=1, stroke=0)
canvas.setFillColor(C_WHITE)
canvas.setFont("Helvetica-Bold", 8)
canvas.drawString(1.5*cm, h-12, "ORTHOPAEDICS STUDY GUIDE")
canvas.drawRightString(w-1.5*cm, h-12, "Types of Fractures | Osteomyelitis | TB | Talus Fracture")
# Bottom footer
canvas.setFillColor(C_DARK_GREY)
canvas.setFont("Helvetica", 7.5)
canvas.drawCentredString(w/2, 1.0*cm, f"Page {doc.page} | Sources: Rosen's Emergency Medicine · Robbins & Kumar · Bailey & Love · Murray & Nadel")
canvas.restoreState()
# ── Build story ───────────────────────────────────────────────────────────────
story = []
# ══ COVER PAGE ══════════════════════════════════════════════════════════════════
story.append(Spacer(1, 2.5*cm))
# Big cover banner
cover_data = [[
Paragraph("ORTHOPAEDICS", S("CT1", fontName="Helvetica-Bold", fontSize=34,
textColor=C_WHITE, alignment=TA_CENTER, leading=40)),
],[
Paragraph("STUDY GUIDE", S("CT2", fontName="Helvetica-Bold", fontSize=28,
textColor=C_GOLD, alignment=TA_CENTER, leading=34)),
]]
cover_t = Table([[Paragraph("ORTHOPAEDICS STUDY GUIDE",
S("CoverTitle", fontName="Helvetica-Bold", fontSize=30,
textColor=C_WHITE, alignment=TA_CENTER, leading=38))],
[Paragraph("Types of Fractures · Osteomyelitis · Tuberculosis of Bone · Talus Fracture",
S("CoverSub", fontName="Helvetica", fontSize=13,
textColor=C_LIGHT_BLUE, alignment=TA_CENTER, leading=20))]],
colWidths=[17*cm])
cover_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 20),
("BOTTOMPADDING", (0,0), (-1,-1), 20),
("LEFTPADDING", (0,0), (-1,-1), 20),
("RIGHTPADDING", (0,0), (-1,-1), 20),
("ROUNDEDCORNERS",[8]),
]))
story.append(cover_t)
story.append(Spacer(1, 1.2*cm))
# Topic cards
topic_data = [
["01", "Types of Fractures", "Classification, patterns, descriptors"],
["02", "Osteomyelitis", "Pathology, organisms, sequestrum"],
["03", "TB of Bone", "Pott's disease, spinal TB, imaging"],
["04", "Talus Fracture", "Hawkins classification, AVN, management"],
]
card_rows = []
for num, title, sub in topic_data:
cell = Table([[
Paragraph(f"<b><font color='white'>{num}</font></b>",
S("Num", fontName="Helvetica-Bold", fontSize=18,
textColor=C_WHITE, alignment=TA_CENTER, leading=22)),
Table([[
Paragraph(f"<b>{title}</b>",
S("CardT", fontName="Helvetica-Bold", fontSize=12,
textColor=C_DARK_BLUE, leading=16)),
Paragraph(sub,
S("CardS", fontName="Helvetica", fontSize=9.5,
textColor=C_DARK_GREY, leading=13)),
]], colWidths=[11*cm])
]], colWidths=[1.8*cm, 11.2*cm])
cell.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), C_MED_BLUE),
("BACKGROUND", (1,0), (1,0), C_WHITE),
("BOX", (0,0), (-1,-1), 1, C_MED_BLUE),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 8),
]))
card_rows.append(cell)
card_rows.append(Spacer(1, 6))
for c in card_rows:
story.append(c)
story.append(Spacer(1, 1*cm))
story.append(Paragraph("Based on: Rosen's Emergency Medicine · Robbins & Kumar Basic Pathology · Bailey & Love's Surgery · Murray & Nadel's Respiratory Medicine",
S("Src", fontName="Helvetica-Oblique", fontSize=8.5, textColor=C_DARK_GREY, alignment=TA_CENTER)))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 1 – TYPES OF FRACTURES
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("1", "TYPES OF FRACTURES", C_DARK_BLUE))
story.append(Spacer(1, 8))
story.append(Paragraph("A. Based on Skin Integrity", h2_style))
story.append(make_table(
["Type", "Description", "Clinical Implication"],
[
["Closed (Simple)", "Skin over fracture is intact", "Lower infection risk; standard management"],
["Open (Compound)", "Fracture communicates with external environment", "Treat as open if ANY doubt; high infection risk"],
],
col_widths=[4.5*cm, 7*cm, 5.5*cm]
))
story.append(Spacer(1, 8))
story.append(Paragraph("B. Based on Fracture Line Direction", h2_style))
# Image
img_path = download_image(
"https://cdn.orris.care/cdss_images/bdf3ea68a8e1e500524af235aab71ade0b9c467829cf558252672f96b5164631.png",
"fracture_types.png")
if img_path:
img = RLImage(img_path, width=11*cm, height=7*cm)
cap = Paragraph("Fig 1.1 – Types of fractures: (A) Transverse, (B) Oblique, (C) Spiral, (D) Comminuted<br/><i>Source: Rosen's Emergency Medicine 9e</i>", caption_style)
img_table = Table([[img], [cap]], colWidths=[17*cm])
img_table.setStyle(TableStyle([
("ALIGN", (0,0), (-1,-1), "CENTER"),
("BOX", (0,0), (-1,-1), 1, C_LIGHT_BLUE),
("BACKGROUND", (0,0), (-1,-1), C_GREY),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
]))
story.append(img_table)
story.append(Spacer(1, 8))
story.append(make_table(
["Type", "Mechanism", "Key Feature / Exam Tip"],
[
["Transverse", "Direct blow / tension force", "Line at 90° to long axis"],
["Oblique", "Compression + bending", "Line runs obliquely to long axis"],
["Spiral", "Rotational / torsional force", "Encircles shaft — often confused with oblique"],
["Comminuted", "High-energy crush injury", "More than 2 fragments; difficult fixation"],
["Greenstick", "Bending force in children", "One cortex breaks, other bends (incomplete)"],
["Torus (Buckle)","Axial compression in children", "Cortex buckles — stable fracture"],
],
col_widths=[3.8*cm, 6.2*cm, 7*cm]
))
story.append(Spacer(1, 8))
story.append(Paragraph("C. Special Fracture Types", h2_style))
special = [
("<b>Avulsion</b>", "Ligament/tendon pulls off bone fragment — e.g., 5th metatarsal base (peroneus brevis)"),
("<b>Impaction</b>", "Fragments driven into each other — e.g., neck of femur"),
("<b>Depression</b>", "Cortex driven inward — e.g., skull fracture, tibial plateau"),
("<b>Compression</b>", "Vertebral body axial collapse — osteoporosis common cause"),
("<b>Pathologic</b>", "Fracture through diseased bone (tumor, Paget's, infection, osteoporosis)"),
("<b>Stress/Fatigue</b>", "Repeated sub-threshold loading — march fracture (2nd metatarsal), tibial stress fracture"),
]
for t, d in special:
row_t = Table([[Paragraph(t, bold_body), Paragraph(d, body_style)]],
colWidths=[4.5*cm, 12.5*cm])
row_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), C_LIGHT_BLUE),
("BACKGROUND", (1,0), (1,0), C_WHITE),
("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(row_t)
story.append(Spacer(1, 2))
story.append(Spacer(1, 8))
story.append(Paragraph("D. Complete Fracture Description Format (Exam)", h2_style))
story.append(info_box(
"Open/Closed + Bone name + Side (L/R) + Location (proximal/middle/distal third) + "
"Fracture line direction + Displacement/alignment + Articular involvement\n\n"
"Example: \"Closed fracture of the right distal radius — transverse, dorsally displaced\" (Colles' fracture)",
bg=C_LIGHT_GOLD, border=C_GOLD))
story.append(Spacer(1, 6))
story.append(Paragraph(
"<i>Sources: Rosen's Emergency Medicine 9e · Rockwood and Green's Fractures in Adults 10e 2025</i>",
caption_style))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 2 – OSTEOMYELITIS
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("2", "OSTEOMYELITIS", colors.HexColor("#1B5E20")))
story.append(Spacer(1, 8))
story.append(info_box(
"<b>Definition:</b> Bone and marrow inflammation, virtually always secondary to infection. "
"All organisms can cause it, but pyogenic bacteria and mycobacteria are most common.",
bg=C_LIGHT_GREEN, border=C_GREEN))
story.append(Spacer(1, 8))
story.append(Paragraph("Routes of Infection", h2_style))
story.append(make_table(
["Route", "Population", "Common Sites"],
[
["1. Hematogenous spread", "Children (most common route)", "Metaphysis of long bones (distal femur, proximal tibia)"],
["2. Contiguous spread", "Any age — adjacent infection", "Diabetic foot, decubitus ulcer, sinusitis → frontal bone"],
["3. Direct inoculation", "Adults — trauma/surgery", "Open fractures, orthopaedic implants"],
],
col_widths=[5*cm, 5.5*cm, 6.5*cm]
))
story.append(Spacer(1, 8))
story.append(Paragraph("Common Organisms", h2_style))
story.append(make_table(
["Clinical Setting", "Organism", "Exam Tip"],
[
["Children (all ages)", "S. aureus (MRSA most common in AHO)", "Male:Female = 2:1 to 3:1"],
["Neonates", "Group B Streptococcus, E. coli", "Multifocal osteomyelitis possible"],
["Sickle cell disease", "Salmonella spp. ★", "Classic exam — remember Salmonella!"],
["IV drug users", "Pseudomonas aeruginosa", "Vertebrae / sternoclavicular joint"],
["Open fractures/surgery", "Mixed organisms (polymicrobial)", "Gram-positive + gram-negative"],
["Diabetic foot", "S. aureus + gram-negatives", "Probing to bone = 89% PPV for OM"],
],
col_widths=[4.5*cm, 5.5*cm, 7*cm]
))
story.append(Spacer(1, 8))
story.append(Paragraph("Pathology: Acute vs. Chronic", h2_style))
story.append(Paragraph("Acute Phase:", h3_style))
bullets_acute = [
"Bacteria proliferate → neutrophilic inflammation → bone/marrow necrosis within <b>48 hours</b>",
"Spreads via Haversian canals → reaches periosteum",
"In children: periosteum loosely attached → elevated → <b>subperiosteal abscess</b>",
"Further periosteal lifting → ischaemia → more necrosis (vicious cycle)",
"Rupture → soft-tissue abscess → sinus tract to skin",
"Epiphyseal spread → <b>septic arthritis</b> (especially in infants)",
]
for b in bullets_acute:
story.append(bullet(b))
story.append(Spacer(1, 6))
story.append(Paragraph("Chronic Phase — Key Terms:", h3_style))
chronic_terms = [
("Sequestrum ★", "Fragment of <b>dead (necrotic) bone</b>, separated from living bone by granulation tissue. Appears as dense radio-opaque fragment on X-ray."),
("Involucrum ★", "New periosteal bone shell <b>laid around the sequestrum</b> by the lifted periosteum."),
("Cloaca", "Opening in the involucrum through which pus (and sequestrum) may discharge."),
("Sinus tract", "Fistula from bone cavity tracking through soft tissue to the skin surface."),
("Brodie's abscess", "Localised intraosseous abscess — subacute osteomyelitis. Seen in metaphysis of tibia. Low-grade S. aureus. Sclerotic rim on X-ray."),
]
for term, defn in chronic_terms:
row_t = Table([[
Paragraph(f"<b>{term}</b>", S("Term", fontName="Helvetica-Bold", fontSize=10,
textColor=C_RED, leading=14)),
Paragraph(defn, body_style)
]], colWidths=[4.2*cm, 12.8*cm])
row_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), C_LIGHT_RED),
("BACKGROUND", (1,0), (1,0), C_WHITE),
("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(row_t)
story.append(Spacer(1, 2))
story.append(Spacer(1, 8))
story.append(Paragraph("Clinical Features", h2_style))
feat_table = make_table(
["Feature", "Acute Osteomyelitis", "Chronic Osteomyelitis"],
[
["Onset", "Sudden; days", "Insidious; weeks-months"],
["Fever", "High-grade; rigors", "Low-grade or absent"],
["Local signs", "Warmth, swelling, point tenderness","Discharging sinus, hard swelling"],
["X-ray", "Normal in first 10-14 days", "Sclerosis + sequestrum + involucrum"],
["MRI", "Early changes — best early modality","Extent of infection, sinus tract"],
["WBC/ESR/CRP", "Elevated", "Mildly elevated or normal"],
],
col_widths=[4*cm, 6.5*cm, 6.5*cm]
)
story.append(feat_table)
story.append(Spacer(1, 8))
story.append(Paragraph("Complications", h2_style))
comp = [
"Septicaemia and bacteraemia",
"Septic arthritis (adjacent joint)",
"Pathologic fracture through infected bone",
"Growth disturbance — shortened/deformed limb (in children, if epiphysis involved)",
"Chronic osteomyelitis — difficult to eradicate",
"Squamous cell carcinoma in chronic sinus (Marjolin's ulcer — rare, long-standing sinus)",
]
for c in comp:
story.append(bullet(c))
story.append(Spacer(1, 6))
story.append(Paragraph(
"<i>Sources: ROSEN's Emergency Medicine · Robbins & Kumar Basic Pathology · Goldman-Cecil Medicine</i>",
caption_style))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 3 – TUBERCULOSIS OF BONE
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("3", "TUBERCULOSIS OF BONE (Skeletal TB)", colors.HexColor("#4A148C")))
story.append(Spacer(1, 8))
story.append(Paragraph("Pathogenesis", h2_style))
patho_points = [
"Results from <b>endogenous reactivation</b> of foci seeded during initial haematogenous spread of primary TB",
"TB localises to <b>metaphyses of long bones</b> — rich blood supply + scarcity of phagocytic cells",
"Starts in <b>subchondral region</b> → spreads to cartilage, synovium, and joint space",
"Produces: metaphyseal erosion, cysts, cartilage loss, joint space narrowing",
"Spine: typically involves <b>two adjacent vertebrae + the intervertebral disc</b> (Pott's disease)",
]
for p in patho_points:
story.append(bullet(p))
story.append(Spacer(1, 8))
story.append(Paragraph("Distribution of Skeletal TB", h2_style))
story.append(make_table(
["Site", "Frequency", "Notes"],
[
["Spine (Pott's disease) ★", "50–70% of cases", "Lower thoracic + upper lumbar (adults); upper thoracic (children)"],
["Hip or Knee", "15–20%", "Weight-bearing joints — limp, restricted ROM"],
["Shoulder, elbow, ankle, wrist","15–20%", "Less common; any bone/joint can be involved"],
["Usually monoarticular", "~80%", "Multifocal rare — suggests immunocompromise"],
],
col_widths=[5.5*cm, 3*cm, 8.5*cm]
))
story.append(Spacer(1, 8))
story.append(Paragraph("Pott's Disease (Spinal TB) — Key Features", h2_style))
pott = [
"Adults: <b>Lower thoracic and upper lumbar vertebrae</b> most commonly affected",
"Children: <b>Upper thoracic spine</b> most common site",
"Classic: 2 adjacent vertebral bodies + intervertebral disc destroyed",
"<b>Atypical form</b> (>50% of cases): disc may be preserved — does NOT rule out TB spondylitis",
"Paradiscal → paravertebral → <b>psoas abscess</b> — tracks along psoas fascia to groin",
"<b>Gibbus deformity</b> — angular kyphosis from anterior vertebral collapse",
"<b>Pott's paraplegia</b> — cord compression from caseous granulation tissue or pus from infected vertebra",
"Evidence of pulmonary TB found in ~<b>50%</b> of patients",
]
for p in pott:
story.append(bullet(p))
story.append(Spacer(1, 8))
story.append(Paragraph("Imaging", h2_style))
story.append(make_table(
["Modality", "Findings", "Sensitivity"],
[
["X-ray", "Early: only soft tissue swelling. Late: vertebral destruction, disc space loss, gibbus", "Low early"],
["CT scan", "Bony destruction, calcification in abscess, extent of involvement", "Good for bone"],
["MRI ★", "Vertebral body disease + disc destruction + paravertebral abscess = classic triad\nDiagnoses TB before deformity develops", "100% sensitivity, 88% specificity"],
],
col_widths=[3*cm, 10*cm, 4*cm]
))
story.append(Spacer(1, 8))
story.append(Paragraph("Treatment", h2_style))
tx = [
"<b>Anti-TB chemotherapy:</b> Standard HRZE (Isoniazid + Rifampicin + Pyrazinamide + Ethambutol) × 2 months, then HR × 4–7 months",
"<b>Surgery indications:</b> Cord compression, spinal instability, failure of conservative management, abscess drainage",
"<b>Bracing</b> may help in spinal TB to reduce pain and prevent deformity progression",
]
for t in tx:
story.append(bullet(t))
story.append(Spacer(1, 6))
story.append(Paragraph(
"<i>Sources: Murray & Nadel's Textbook of Respiratory Medicine · Adams and Victor's Principles of Neurology 12e</i>",
caption_style))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 4 – TALUS FRACTURE
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("4", "TALUS FRACTURE", C_ACCENT))
story.append(Spacer(1, 8))
story.append(info_box(
"<b>Key Fact:</b> ~60–70% of the talus surface is covered by articular cartilage with NO muscular "
"attachments. Blood supply is precarious — disruption leads to Avascular Necrosis (AVN). "
"The talus consists of a <b>head, neck, and body</b>.",
bg=C_LIGHT_RED, border=C_ACCENT))
story.append(Spacer(1, 8))
story.append(Paragraph("Blood Supply of the Talus", h2_style))
bs = [
"<b>Artery of tarsal canal</b> (from posterior tibial artery) — main/dominant supply to talar body",
"<b>Artery of tarsal sinus</b> (from perforating peroneal artery) — supplies talar head/neck",
"<b>Dorsalis pedis branches</b> — dorsal supply to talar head",
"All three are vulnerable in displaced fractures → risk of <b>AVN of talar body</b>",
]
for b in bs:
story.append(bullet(b))
story.append(Spacer(1, 8))
story.append(Paragraph("Types of Talus Fractures", h2_style))
story.append(make_table(
["Type", "Frequency", "Mechanism", "Notes"],
[
["Talar Neck ★", "50% of all talus Fx", "Forced dorsiflexion (MVA/falls) — 'Aviator's astragalus'", "Highest AVN risk; associated medial malleolus Fx"],
["Talar Head", "10%", "Axial compression on plantar-flexed foot", "Comminution common; navicular Fx associated"],
["Talar Body", "Uncommon", "Axial compression between tibia and calcaneus", "Falls from height; severe injury"],
["Minor Fx", "Remainder", "Lateral/posterior process; osteochondral dome; avulsion", "Ankle sprain mechanism; easier to miss"],
],
col_widths=[3.5*cm, 2.5*cm, 5.5*cm, 5.5*cm]
))
story.append(Spacer(1, 8))
story.append(Paragraph("Hawkins Classification — Talar Neck Fractures ★ (KEY EXAM TOPIC)", h2_style))
story.append(info_box(
"Higher the Hawkins type = greater vascular disruption = higher AVN risk",
bg=C_LIGHT_RED, border=C_ACCENT))
story.append(Spacer(1, 6))
# Hawkins image
img2_path = download_image(
"https://cdn.orris.care/cdss_images/bb9700690d6b8405fdb19afbdfa51bd2de6e3ac44ba7011490c7fec399790d5a.png",
"hawkins.png")
if img2_path:
img2 = RLImage(img2_path, width=13*cm, height=4.5*cm)
cap2 = Paragraph("Fig 4.1 – Hawkins Classification: (A) Type I, (B) Type II, (C) Type III, (D) Type IV. Blue shading = articular surface of talar dome.<br/><i>Source: Rosen's Emergency Medicine 9e</i>", caption_style)
img2_table = Table([[img2], [cap2]], colWidths=[17*cm])
img2_table.setStyle(TableStyle([
("ALIGN", (0,0), (-1,-1), "CENTER"),
("BOX", (0,0), (-1,-1), 1, C_LIGHT_BLUE),
("BACKGROUND", (0,0), (-1,-1), C_GREY),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
]))
story.append(img2_table)
story.append(Spacer(1, 8))
story.append(make_table(
["Type", "Description", "Joint Disruption", "AVN Rate"],
[
["Type I", "Nondisplaced talar neck fracture", "None", "~10%"],
["Type II", "Displaced + subtalar joint subluxation/dislocation", "Subtalar joint", "~27%"],
["Type III", "Displaced + subtalar AND tibiotalar joints dislocated (50% open)", "Subtalar + Tibiotalar", "~53%"],
["Type IV", "Type III + talonavicular joint dislocation (uncommon)", "Subtalar + Tibiotalar + Talonavicular", "~48%"],
],
col_widths=[2*cm, 6.5*cm, 5.5*cm, 3*cm]
))
story.append(Spacer(1, 8))
story.append(Paragraph("Complications", h2_style))
comps = [
("<b>Avascular Necrosis (AVN) ★</b>", "Most significant complication. Rate: Type I 10% → Type III 53%. Hawkins sign (subchondral lucency at 6-8 weeks on X-ray) = good sign → vascularity preserved"),
("<b>Subtalar arthritis</b>", "Approaches 80% at 2-year follow-up in high-energy fractures"),
("<b>Skin necrosis</b>", "Especially Type III (often open); skin tenting over prominent bone fragment"),
("<b>Malunion / Non-union</b>", "Comminution makes compression fixation technically difficult"),
("<b>Posttraumatic arthritis</b>", "Tibiotalar, talocalcaneal, and talonavicular joints all at risk"),
("<b>Peroneal tendon dislocation</b>", "Associated lateral soft tissue disruption"),
]
comp_data = [[Paragraph(t, S("CT", fontName="Helvetica-Bold", fontSize=9.5,
textColor=C_DARK_BLUE, leading=13)),
Paragraph(d, body_style)] for t, d in comps]
comp_t = Table(comp_data, colWidths=[5*cm, 12*cm])
comp_t.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0), (-1,-1), [C_WHITE, C_GREY]),
("GRID", (0,0), (-1,-1), 0.5, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(comp_t)
story.append(Spacer(1, 8))
story.append(Paragraph("Management", h2_style))
story.append(make_table(
["Type", "Treatment", "Key Principle"],
[
["Type I", "Cast immobilization, non-weight bearing × 6–8 weeks", "Check Hawkins sign at 6–8 weeks"],
["Type II", "Urgent ORIF — anatomical reduction and stable fixation", "Restore subtalar joint congruity"],
["Type III", "Emergency ORIF ± wound care if open", "Reduce talar dislocation urgently"],
["Type IV", "Emergency ORIF of all joints", "Highest surgical complexity"],
],
col_widths=[2.5*cm, 8*cm, 6.5*cm]
))
story.append(Spacer(1, 6))
story.append(Paragraph(
"<i>Sources: Bailey and Love's Short Practice of Surgery 28e · Rosen's Emergency Medicine · Campbell's Operative Orthopaedics 15e 2026</i>",
caption_style))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# QUICK REVISION PAGE
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("★", "QUICK REVISION — YOUR NOTES AT A GLANCE", colors.HexColor("#B71C1C")))
story.append(Spacer(1, 10))
story.append(make_table(
["Your Note", "What It Means", "Key Fact"],
[
["Sequestrum", "Dead bone in chronic osteomyelitis", "Radio-opaque fragment surrounded by granulation tissue"],
["Wrist drop", "Radial nerve injury", "Saturday night palsy / humeral shaft fracture"],
["Foot drop", "Common peroneal nerve injury", "Neck of fibula fracture — high risk"],
["Compartment syndrome", "Post-fracture emergency", "Pain on passive stretch; 6 Ps; fasciotomy if confirmed"],
["Complications of fractures","Fat embolism, DVT, nerve/vessel injury, AVN, malunion", "Fat embolism: triad = hypoxia + confusion + petechiae"],
["CDH (Cong. dislocation hip)","Barlow + Ortolani tests", "Treat early with Pavlik harness"],
["Club foot (CTEV)", "Congenital Talipes Equino Varus", "Components: CAVE — Cavus, Adductus, Varus, Equinus"],
["Scaphoid fracture", "Snuffbox tenderness; risk of AVN", "Blood supply from distal to proximal — proximal pole at risk"],
["Supracondylar humerus Fx","Most common elbow fracture in children", "Anterior interosseous nerve + brachial artery at risk"],
["Femur fracture", "Blood loss up to 1.5L in closed femoral shaft Fx", "Traction → ORIF with IM nail; watch for fat embolism"],
["Gout pathology", "Sodium urate crystal deposition", "Negatively birefringent crystals on polarised light"],
["Skeletal traction", "Continuous pulling force via pin through bone", "Bohler-Braun for femur; 10% body weight"],
["Osteoarthritis knee", "Degenerative joint disease — cartilage loss", "Medial compartment most common; varus deformity"],
["ACL injury", "Anterior cruciate ligament tear", "Pivot shift + Lachman test positive; MRI confirms"],
],
col_widths=[4.5*cm, 6.5*cm, 6*cm]
))
story.append(Spacer(1, 10))
story.append(info_box(
"<b>Sources used:</b> Rosen's Emergency Medicine 9e · Robbins & Kumar Basic Pathology · "
"Bailey and Love's Short Practice of Surgery 28e · Murray & Nadel's Respiratory Medicine · "
"Rockwood and Green's Fractures in Adults 10e · Campbell's Operative Orthopaedics 15e · "
"Adams and Victor's Principles of Neurology 12e",
bg=C_LIGHT_BLUE, border=C_MED_BLUE))
# ── Build PDF ──────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
topMargin=1.8*cm,
bottomMargin=1.5*cm,
leftMargin=2*cm,
rightMargin=2*cm,
title="Orthopaedics Study Guide",
author="Orris Medical AI",
subject="Types of Fractures | Osteomyelitis | TB | Talus Fracture",
)
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"PDF created: {OUTPUT}")
cd /home/daytona/workspace/ortho-pdf && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/ortho-pdf/Orthopaedics_Study_Guide.pdf
Orthopaedics Study Guide
PDF Document · PDF
| Page | Content |
|---|---|
| Cover | Topic cards for all 4 sections with colour coding |
| Page 2 | Types of Fractures — classification tables, fracture line diagram image, special types |
| Page 3 | Osteomyelitis — routes, organisms (Salmonella in sickle cell highlighted), acute/chronic pathology, sequestrum/involucrum/cloaca definitions |
| Page 4 | TB of Bone — Pott's disease, distribution table, MRI criteria, treatment |
| Page 5 | Talus Fracture — Hawkins classification with diagram image, AVN rates per type, management |
| Page 6 | Quick Revision table covering all your handwritten notes (foot drop, wrist drop, CTEV, compartment syndrome, scaphoid, etc.) |
GOOD ANSWE OFF ALL THIS QUESSION WITH IMAGE AND MAKE IT IN A PDF FORN
~/ortho-pdf2/generate_full.py
#!/usr/bin/env python3
"""
Comprehensive Orthopaedics PDF — All 16 topics from the student's note
"""
import os, urllib.request
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, PageBreak, KeepTogether
)
from reportlab.platypus import Image as RLImage
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
os.makedirs("/home/daytona/workspace/ortho-pdf2/imgs", exist_ok=True)
OUTPUT = "/home/daytona/workspace/ortho-pdf2/Orthopaedics_Full_Guide.pdf"
# ── Palette ───────────────────────────────────────────────────────────────────
DB = colors.HexColor("#1A3A5C") # dark blue
MB = colors.HexColor("#2E6DA4") # mid blue
LB = colors.HexColor("#D6E8F7") # light blue
ACC = colors.HexColor("#E8522A") # orange-red
GOLD = colors.HexColor("#F5A623")
LG = colors.HexColor("#FFF8E7") # light gold
DG = colors.HexColor("#455A64") # dark grey
GR = colors.HexColor("#F4F6F8") # grey
GRN = colors.HexColor("#2E7D32")
LGN = colors.HexColor("#E8F5E9")
RED = colors.HexColor("#C62828")
LRD = colors.HexColor("#FFEBEE")
PUR = colors.HexColor("#4A148C")
LPR = colors.HexColor("#EDE7F6")
TEA = colors.HexColor("#00695C")
LTE = colors.HexColor("#E0F2F1")
WHT = colors.white
def sty(name, **kw):
return ParagraphStyle(name, **kw)
body = sty("body", fontName="Helvetica", fontSize=10, leading=15, spaceAfter=3, alignment=TA_JUSTIFY, textColor=colors.HexColor("#1A1A1A"))
bld = sty("bld", fontName="Helvetica-Bold", fontSize=10, leading=14, spaceAfter=2, textColor=DB)
blt = sty("blt", fontName="Helvetica", fontSize=10, leading=14, spaceAfter=2, leftIndent=10, textColor=colors.HexColor("#1A1A1A"))
h2 = sty("h2", fontName="Helvetica-Bold", fontSize=12, leading=16, spaceBefore=8, spaceAfter=4, textColor=DB)
h3 = sty("h3", fontName="Helvetica-Bold", fontSize=10.5, leading=14, spaceBefore=5, spaceAfter=3, textColor=MB)
cap = sty("cap", fontName="Helvetica-Oblique", fontSize=8, leading=11, alignment=TA_CENTER, textColor=DG, spaceAfter=4)
foot = sty("foot", fontName="Helvetica", fontSize=7.5, alignment=TA_CENTER, textColor=DG)
def sec_hdr(num, title, bg=DB):
p = Paragraph(f"<font color='white'><b>{num}. {title}</b></font>",
sty("sh", fontName="Helvetica-Bold", fontSize=14, leading=18, textColor=WHT))
t = Table([[p]], colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("TOPPADDING", (0,0),(-1,-1), 9),
("BOTTOMPADDING", (0,0),(-1,-1), 9),
("LEFTPADDING", (0,0),(-1,-1), 12),
]))
return t
def infobox(text, bg=LB, border=MB):
t = Table([[Paragraph(text, body)]], colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("BOX", (0,0),(-1,-1), 1.5, border),
("TOPPADDING", (0,0),(-1,-1), 7),
("BOTTOMPADDING", (0,0),(-1,-1), 7),
("LEFTPADDING", (0,0),(-1,-1), 10),
("RIGHTPADDING", (0,0),(-1,-1), 10),
]))
return t
def tbl(headers, rows, cw=None):
if cw is None:
cw = [17*cm/len(headers)]*len(headers)
hrow = [Paragraph(f"<b>{h}</b>", sty("th", fontName="Helvetica-Bold", fontSize=9.5,
textColor=WHT, leading=13, alignment=TA_CENTER)) for h in headers]
data = [hrow] + [[Paragraph(str(c), sty("td", fontName="Helvetica", fontSize=9.5,
textColor=colors.HexColor("#1A1A1A"), leading=13)) for c in r] for r in rows]
t = Table(data, colWidths=cw, repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), DB),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHT, GR]),
("GRID", (0,0),(-1,-1), 0.5, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 7),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
return t
def kv_list(pairs, lbg=LB, rbg=WHT, lcw=4.5*cm):
rows = []
for k,v in pairs:
r = Table([[Paragraph(f"<b>{k}</b>", sty("kk", fontName="Helvetica-Bold", fontSize=9.5,
textColor=DB, leading=13)),
Paragraph(v, sty("vv", fontName="Helvetica", fontSize=9.5,
textColor=colors.HexColor("#1A1A1A"), leading=13))]],
colWidths=[lcw, 17*cm-lcw])
r.setStyle(TableStyle([
("BACKGROUND", (0,0),(0,0), lbg),
("BACKGROUND", (1,0),(1,0), rbg),
("BOX", (0,0),(-1,-1), 0.5, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
rows.append(r)
rows.append(Spacer(1,2))
return rows
def b(text):
return Paragraph(f"\u2022 {text}", blt)
def dl(url, fn):
path = f"/home/daytona/workspace/ortho-pdf2/imgs/{fn}"
if not os.path.exists(path):
try: urllib.request.urlretrieve(url, path)
except: return None
return path
def img_block(path, w, h, caption_text):
if not path: return []
img = RLImage(path, width=w, height=h)
cap_p = Paragraph(caption_text, cap)
t = Table([[img],[cap_p]], colWidths=[17*cm])
t.setStyle(TableStyle([
("ALIGN", (0,0),(-1,-1), "CENTER"),
("BOX", (0,0),(-1,-1), 1, LB),
("BACKGROUND", (0,0),(-1,-1), GR),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
]))
return [t, Spacer(1,8)]
# ── on_page header/footer ─────────────────────────────────────────────────────
def on_page(canvas, doc):
canvas.saveState()
w, h = A4
canvas.setFillColor(DB)
canvas.rect(0, h-18, w, 18, fill=1, stroke=0)
canvas.setFillColor(WHT)
canvas.setFont("Helvetica-Bold", 8)
canvas.drawString(1.5*cm, h-12, "ORTHOPAEDICS COMPREHENSIVE GUIDE")
canvas.drawRightString(w-1.5*cm, h-12, "16 Topics — Complete Answers")
canvas.setFillColor(DG)
canvas.setFont("Helvetica", 7.5)
canvas.drawCentredString(w/2, 0.9*cm, f"Page {doc.page} | Sources: Bailey & Love · Rosen's EM · Robbins & Kumar · Campbell's Orthopaedics · Harrison's · Adams & Victor")
canvas.restoreState()
# ── IMAGE DOWNLOADS ───────────────────────────────────────────────────────────
imgs = {
"fx_types": dl("https://cdn.orris.care/cdss_images/bdf3ea68a8e1e500524af235aab71ade0b9c467829cf558252672f96b5164631.png", "fx_types.png"),
"hawkins": dl("https://cdn.orris.care/cdss_images/bb9700690d6b8405fdb19afbdfa51bd2de6e3ac44ba7011490c7fec399790d5a.png", "hawkins.png"),
"traction": dl("https://cdn.orris.care/cdss_images/b6915e70e837f2ed997444c5685a5130d04b07be82caf1f3e8ff80a6be6a8f1c.png", "traction.png"),
"osteomyelitis": dl("https://cdn.orris.care/cdss_images/6832d62d563ee07d38513d72e844e0f0efe38b1206ddd89287780be8a48ea8b3.png", "osteo.png"),
"tb_spine": dl("https://cdn.orris.care/cdss_images/2f34bb493f493b9a32c62fcd142f5fd18d51626950d6cda606efcbeb1182f736.png", "tb_spine.png"),
"talus_ct": dl("https://cdn.orris.care/cdss_images/3663b71939894ea504fedc632cfa83394e0f400b9a8df5c670fb7aa3137a9d21.png", "talus_ct.png"),
}
# ── BUILD STORY ───────────────────────────────────────────────────────────────
story = []
# ══ COVER ══════════════════════════════════════════════════════════════════════
story.append(Spacer(1, 2*cm))
cov = Table([[
Paragraph("ORTHOPAEDICS", sty("c1", fontName="Helvetica-Bold", fontSize=34, textColor=WHT, alignment=TA_CENTER, leading=40)),
],[
Paragraph("COMPREHENSIVE STUDY GUIDE", sty("c2", fontName="Helvetica-Bold", fontSize=20, textColor=GOLD, alignment=TA_CENTER, leading=26)),
],[
Paragraph("Complete Answers with Images for All 16 Topics", sty("c3", fontName="Helvetica", fontSize=12, textColor=LB, alignment=TA_CENTER, leading=18)),
]], colWidths=[17*cm])
cov.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), DB),
("TOPPADDING", (0,0),(-1,-1), 18),
("BOTTOMPADDING", (0,0),(-1,-1), 18),
("LEFTPADDING", (0,0),(-1,-1), 20),
("RIGHTPADDING", (0,0),(-1,-1), 20),
]))
story.append(cov)
story.append(Spacer(1,1*cm))
topics = [
("01","Foot Drop", DB),
("02","Gout Pathology", MB),
("03","Skeletal Traction", GRN),
("04","Osteoarthritis of Knee", colors.HexColor("#E65100")),
("05","Compartment Syndrome", RED),
("06","Club Foot (CTEV)", colors.HexColor("#1565C0")),
("07","Anterior Cruciate Ligament", TEA),
("08","Sequestrum", PUR),
("09","Wrist Drop", colors.HexColor("#4E342E")),
("10","Congenital Dislocation Hip", colors.HexColor("#00838F")),
("11","Complications of Fractures", RED),
("12","Classification of Nerve Injury", colors.HexColor("#37474F")),
("13","Supracondylar Fracture Humerus", colors.HexColor("#880E4F")),
("14","Femur Fracture", DB),
("15","Scaphoid Fracture", GRN),
("16","Spinal Anaesthesia", DG),
]
for num,title,col in topics:
card = Table([[
Paragraph(f"<font color='white'><b>{num}</b></font>",
sty("cn", fontName="Helvetica-Bold", fontSize=14, textColor=WHT, alignment=TA_CENTER)),
Paragraph(f"<b>{title}</b>", sty("ct", fontName="Helvetica-Bold", fontSize=11, textColor=DB, leading=15)),
]], colWidths=[1.6*cm, 15.4*cm])
card.setStyle(TableStyle([
("BACKGROUND", (0,0),(0,0), col),
("BACKGROUND", (1,0),(1,0), WHT),
("BOX", (0,0),(-1,-1), 1, col),
("TOPPADDING", (0,0),(-1,-1), 7),
("BOTTOMPADDING", (0,0),(-1,-1), 7),
("LEFTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
story.append(card)
story.append(Spacer(1,4))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q1: FOOT DROP
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("01","FOOT DROP", DB))
story.append(Spacer(1,6))
story.append(infobox("<b>Definition:</b> Inability to dorsiflex the foot at the ankle, causing it to drag during walking (steppage gait).", LB, MB))
story.append(Spacer(1,6))
story.append(Paragraph("Nerve Involved", h2))
story.append(b("<b>Common peroneal (fibular) nerve</b> — L4, L5, S1"))
story.append(b("Winds around the neck of the fibula — most vulnerable point"))
story.append(b("Divides into: Superficial peroneal (eversion) + Deep peroneal (dorsiflexion)"))
story.append(Spacer(1,6))
story.append(Paragraph("Causes", h2))
story.append(tbl(
["Cause","Mechanism","Example"],
[
["Nerve compression","Pressure at fibular neck","Tight cast, prolonged leg crossing, squatting"],
["Trauma","Direct injury or fracture","Neck of fibula fracture ★"],
["Iatrogenic","Operative position","Knee arthroplasty, lithotomy position"],
["Systemic","Mononeuritis multiplex","Diabetes, vasculitis, leprosy"],
["Tumour / cyst","Nerve compression","Baker's cyst, fibular tumour"],
["Lumbar disc herniation","L4/L5 root compression","Disc prolapse — central/foraminal"],
],
cw=[3.5*cm, 5.5*cm, 8*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Clinical Features", h2))
story.append(tbl(
["Feature","Finding"],
[
["Gait","Steppage gait — high-stepping to clear the dropped foot"],
["Weakness","Cannot dorsiflex foot (deep peroneal) or evert foot (superficial peroneal)"],
["Sensation lost","Dorsum of foot and lateral lower leg"],
["Sensation spared","Sole of foot (tibial nerve) and medial leg (saphenous nerve)"],
["Inversion","Preserved — tibial nerve function → helps localise lesion"],
],
cw=[4*cm, 13*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Treatment", h2))
for t in ["<b>Conservative:</b> Ankle-foot orthosis (AFO) — prevents dragging, improves gait",
"<b>Physiotherapy:</b> Dorsiflexor strengthening, peroneal exercises",
"<b>Surgery:</b> Nerve decompression / repair if structural lesion; tendon transfer (tibialis posterior) for permanent palsy",
"<b>Remove cause:</b> Decompress cast, treat disc prolapse"]:
story.append(b(t))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: Adams and Victor's Principles of Neurology 12e · Harrison's Principles of Internal Medicine 22e</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q2: GOUT PATHOLOGY
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("02","GOUT PATHOLOGY", MB))
story.append(Spacer(1,6))
story.append(infobox("<b>Definition:</b> Gout is a metabolic disease characterised by hyperuricaemia and deposition of monosodium urate (MSU) crystals in joints, soft tissues, and kidneys.", LB, MB))
story.append(Spacer(1,6))
story.append(Paragraph("Pathophysiology", h2))
for t in [
"Purine metabolism → uric acid → <b>hyperuricaemia</b> (serum urate >6.8 mg/dL)",
"Urate precipitates as <b>monosodium urate crystals</b> in cooler peripheral joints",
"Crystals engulfed by neutrophils → lysosomal enzyme release → acute inflammatory arthritis",
"Repeated attacks → chronic tophaceous gout with tophi (urate deposits)",
]:
story.append(b(t))
story.append(Spacer(1,6))
story.append(Paragraph("Crystal Characteristics (Exam Key)", h2))
story.append(tbl(
["Property","Gout (MSU)","Pseudogout (CPPD)"],
[
["Crystal type", "Monosodium urate (MSU)", "Calcium pyrophosphate dihydrate (CPPD)"],
["Shape", "Needle-shaped", "Rhomboid / rectangular"],
["Birefringence", "Strongly NEGATIVE (yellow under parallel polariser)", "Weakly POSITIVE (blue under parallel polariser)"],
["Site", "1st MTP joint (podagra) ★", "Knee, wrist"],
["Chondrocalcinosis","Absent", "Present on X-ray"],
],
cw=[3.5*cm, 6.5*cm, 7*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Clinical Stages", h2))
for s, d in [("Asymptomatic hyperuricaemia","No symptoms; raised uric acid only"),
("Acute gouty arthritis ★","Sudden severe pain, swelling, redness — often 1st MTP (podagra) — triggered by alcohol, red meat, diuretics, dehydration"),
("Intercritical gout","Symptom-free interval between attacks; crystals remain"),
("Chronic tophaceous gout","Persistent tophi (ear, olecranon, Achilles tendon); joint destruction; renal stones")]:
story.append(b(f"<b>{s}:</b> {d}"))
story.append(Spacer(1,6))
story.append(Paragraph("Management", h2))
story.append(tbl(
["Phase","Drug","Notes"],
[
["Acute attack", "NSAIDs (Indomethacin) ★", "First-line; start ASAP"],
["Acute attack", "Colchicine", "If NSAIDs contraindicated"],
["Acute attack", "Corticosteroids", "If both contraindicated (renal failure)"],
["Long-term ULT", "Allopurinol (XO inhibitor)","Start 2–4 weeks AFTER acute settles; target urate <6 mg/dL"],
["Long-term ULT", "Febuxostat", "Alternative XO inhibitor"],
["Uricosuric", "Probenecid", "Increases renal urate excretion; avoid if renal stones"],
],
cw=[3.5*cm, 5*cm, 8.5*cm]
))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: Harrison's Principles of Internal Medicine 22e · Firestein & Kelley's Rheumatology</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q3: SKELETAL TRACTION
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("03","SKELETAL TRACTION", GRN))
story.append(Spacer(1,6))
story.append(infobox("<b>Definition:</b> Application of a continuous pulling force directly through bone via a pin or wire to reduce and maintain fracture alignment.", LGN, GRN))
story.append(Spacer(1,6))
if imgs["traction"]:
story.extend(img_block(imgs["traction"], 12*cm, 5.5*cm,
"Fig 3.1 – Six methods of skeletal traction (A–F). Source: Rockwood & Green's Fractures in Adults 10e 2025"))
story.append(Paragraph("Pins Used", h2))
story.append(tbl(
["Pin / Wire","Site","Indication"],
[
["Steinmann pin", "Upper tibia (most common site) ★", "Femoral shaft fractures, tibial fractures"],
["Steinmann pin", "Distal femur", "Hip dislocation, acetabular fractures"],
["Steinmann pin", "Os calcis (calcaneum)", "Tibial plateau, ankle fractures"],
["Kirschner wire", "Olecranon", "Humeral shaft, supracondylar (adults)"],
["Crutchfield tongs","Skull (parietal)", "Cervical spine fracture/dislocation"],
],
cw=[3.5*cm, 5*cm, 8.5*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Types of Traction", h2))
for t,d in [
("Thomas splint traction","Balanced traction for femoral shaft; 90–90 variant for children"),
("Perkins traction","Allows knee exercises during femoral traction"),
("Fisk traction","Short Thomas splint + hinged knee piece — allows hip & knee flexion"),
("90–90 traction","Hip and knee both at 90° — for proximal femoral fractures or paediatric femur"),
("Bryant's traction","Vertical skin traction for children <2 years with femoral fractures"),
]:
story.append(b(f"<b>{t}:</b> {d}"))
story.append(Spacer(1,6))
story.append(Paragraph("Weight Applied", h2))
story.append(b("General rule: ~<b>1/7th of body weight</b> (approximately 10% of body weight)"))
story.append(b("Over-traction risk: distraction at fracture site → non-union"))
story.append(Spacer(1,6))
story.append(Paragraph("Complications", h2))
story.append(tbl(
["Complication","Details"],
[
["Pin-tract infection","Most common; clean daily; remove if severe"],
["Pressure sores", "Prolonged bed rest; heel and sacrum at risk"],
["DVT / PE", "Immobility; prophylactic LMWH"],
["Knee stiffness", "30–50% with prolonged traction — use Perkins/Fisk to prevent"],
["Malunion", "Failure to maintain alignment; shortening in 14–30%"],
["Neurovascular damage","Pin placement injury; check distal pulse and sensation"],
],
cw=[5*cm, 12*cm]
))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: Rockwood & Green's Fractures in Adults 10e 2025 · Bailey & Love's Surgery 28e</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q4: OSTEOARTHRITIS OF KNEE
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("04","OSTEOARTHRITIS OF KNEE", colors.HexColor("#E65100")))
story.append(Spacer(1,6))
story.append(infobox("<b>Definition:</b> Degenerative joint disease characterised by progressive cartilage loss, subchondral bone sclerosis, osteophyte formation, and joint space narrowing.", LG, GOLD))
story.append(Spacer(1,6))
story.append(Paragraph("Pathology", h2))
for t in [
"<b>Articular cartilage:</b> Fibrillation → fissuring → erosion → eburnation (ivory-like exposed bone)",
"<b>Subchondral bone:</b> Sclerosis (increased density), bone cysts (subchondral geodes)",
"<b>Osteophytes:</b> New bone formation at joint margins — characteristic finding",
"<b>Synovium:</b> Secondary mild synovitis; effusion may occur",
"<b>Joint capsule:</b> Contracture → reduced range of motion",
]:
story.append(b(t))
story.append(Spacer(1,6))
story.append(Paragraph("Risk Factors", h2))
story.append(tbl(
["Category","Factor"],
[
["Non-modifiable","Age (>45), Female sex, Genetics"],
["Modifiable", "Obesity ★ (most important modifiable), Prior knee injury (ACL/meniscus), Malalignment"],
["Occupation", "Repetitive kneeling, squatting, heavy physical work"],
["Secondary OA", "Post-traumatic, inflammatory arthritis, metabolic (CPPD, haemochromatosis, gout)"],
],
cw=[4*cm, 13*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("X-ray Features (LOSS mnemonic)", h2))
story.append(tbl(
["Letter","Feature","Description"],
[
["L","Loss of joint space", "Medial compartment most commonly narrowed → varus deformity ★"],
["O","Osteophytes", "Bony spurs at joint margins (best seen on weight-bearing X-rays)"],
["S","Subchondral sclerosis", "Increased density of subchondral bone"],
["S","Subchondral cysts", "Lucent areas beneath sclerotic bone"],
],
cw=[1.5*cm, 5*cm, 10.5*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Clinical Features", h2))
for t in ["Pain — worse on activity, better at rest (unlike inflammatory arthritis)", "Morning stiffness <30 min (vs >1 hour in RA)", "Crepitus on movement", "Bony enlargement — osteophytes palpable", "Varus deformity (bow-leg) — medial compartment OA", "Effusion — mild, cool (not warm like septic/RA)"]:
story.append(b(t))
story.append(Spacer(1,6))
story.append(Paragraph("Management", h2))
story.append(tbl(
["Stage","Treatment"],
[
["Conservative","Weight loss, physiotherapy (quadriceps strengthening), walking aids, analgesia (paracetamol/NSAIDs)"],
["Injections","Intra-articular corticosteroids (short-term); hyaluronic acid (limited evidence)"],
["Surgical — preserving","High tibial osteotomy (HTO) — realigns varus; for medial compartment OA in young active patients"],
["Surgical — replacement","Unicompartmental knee replacement (UKR) — one compartment; Total knee replacement (TKR) — gold standard for severe OA"],
],
cw=[4.5*cm, 12.5*cm]
))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: Harrison's Internal Medicine 22e · Campbell's Operative Orthopaedics 15e</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q5: COMPARTMENT SYNDROME
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("05","COMPARTMENT SYNDROME", RED))
story.append(Spacer(1,6))
story.append(infobox("<b>Definition:</b> A condition in which increased pressure within an osteofascial compartment reduces perfusion pressure below the level required for tissue viability.", LRD, RED))
story.append(Spacer(1,6))
story.append(Paragraph("Most Common Cause", h2))
story.append(b("<b>Fractures</b> — Tibial shaft fracture is most common cause ★"))
story.append(b("Also: crush injuries, tight casts/dressings, burns, reperfusion injury after vascular repair"))
story.append(Spacer(1,6))
story.append(Paragraph("The 6 P's of Compartment Syndrome", h2))
story.append(tbl(
["Sign","Description","Importance"],
[
["Pain ★", "Severe, out of proportion to injury", "EARLIEST sign — most sensitive"],
["Pain on passive stretch ★★","Passive stretch of muscles in compartment", "MOST SPECIFIC sign — e.g., passive toe extension for anterior leg compartment"],
["Paraesthesia", "Tingling, burning — nerve ischaemia", "Early neurological involvement"],
["Pallor", "Skin colour change", "Late sign"],
["Paralysis", "Loss of muscle function", "Late — indicates severe ischaemia"],
["Pulselessness", "Absent distal pulses", "Very late — critical emergency"],
],
cw=[4*cm, 6*cm, 7*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Compartment Pressure Thresholds", h2))
story.append(infobox(
"<b>Absolute threshold:</b> Compartment pressure ≥ 30 mmHg → consider fasciotomy<br/>"
"<b>Delta P (ΔP) threshold ★★★:</b> Diastolic BP − Compartment Pressure < 30 mmHg → FASCIOTOMY<br/>"
"This is the most reliable criterion in clinical practice.",
LRD, RED))
story.append(Spacer(1,6))
story.append(Paragraph("Treatment — FASCIOTOMY", h2))
for t in ["<b>Emergency fasciotomy</b> — release of ALL compartments of the affected segment",
"<b>Leg:</b> 4 compartments (anterior, lateral, deep posterior, superficial posterior) — 2-incision technique",
"<b>Forearm:</b> 3 compartments (volar, dorsal, mobile wad) — volar Henry incision ± dorsal incision",
"<b>Wound left open</b> 48–72 hours → delayed primary closure or skin graft",
"<b>Time is muscle</b> — irreversible damage within 6 hours of ischaemia"]:
story.append(b(t))
story.append(Spacer(1,6))
story.append(Paragraph("Complications of Untreated Compartment Syndrome", h2))
for t in ["Volkmann's ischaemic contracture (forearm) ★ — classical complication",
"Rhabdomyolysis → myoglobinuria → acute kidney injury",
"Permanent neurological deficit",
"Limb loss (gangrene)"]:
story.append(b(t))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: Roberts & Hedges' Clinical Procedures in Emergency Medicine · Campbell's Operative Orthopaedics 15e</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q6: CLUB FOOT (CTEV)
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("06","CLUB FOOT — CONGENITAL TALIPES EQUINO VARUS (CTEV)", colors.HexColor("#1565C0")))
story.append(Spacer(1,6))
story.append(infobox(
"<b>Definition:</b> Congenital talipes equino varus (CTEV) is a complex three-dimensional foot deformity present at birth, characterised by hindfoot equinus and varus with forefoot adductus and cavus.",
LB, MB))
story.append(Spacer(1,6))
story.append(Paragraph("Components — CAVE Mnemonic", h2))
story.append(tbl(
["Letter","Component","Deformity at"],
[
["C","Cavus", "Midfoot — high arch (increased plantar flexion of 1st ray)"],
["A","Adductus","Forefoot — adducted towards midline"],
["V","Varus", "Hindfoot — heel inverted (varus)"],
["E","Equinus ★","Hindfoot — plantar-flexed (foot pointing down) — MOST RIGID"],
],
cw=[1.5*cm, 3.5*cm, 12*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Epidemiology & Aetiology", h2))
for t in ["Incidence: 1–2 per 1000 live births",
"Male:Female = 2:1",
"50% bilateral",
"Aetiology: multifactorial — genetic + intrauterine position + neuromuscular (spina bifida association)",
"Right side more commonly involved"]:
story.append(b(t))
story.append(Spacer(1,6))
story.append(Paragraph("Treatment — Ponseti Method (Gold Standard)", h2))
story.append(tbl(
["Step","Time","Details"],
[
["1. Serial casting","Starting in first week of life", "Weekly plaster of Paris casts correcting CAVE in sequence (C→A→V first, E last)"],
["2. Percutaneous tenotomy","After ~5 casts", "Achilles tenotomy to correct equinus — 90% of cases"],
["3. Denis-Browne splint","For 3–4 years after casting", "Foot abduction brace worn full-time (23hrs/day) then nights"],
["4. Surgery","If failed conservative", "Posteromedial release (PMR), tibialis anterior transfer for recurrent adductus"],
],
cw=[3.5*cm, 3.5*cm, 10*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Differential Diagnosis", h2))
for t in ["Positional talipes (flexible — corrects with passive manipulation, no treatment needed)",
"Metatarsus adductus (forefoot only adducted; hindfoot normal)",
"Congenital vertical talus (rocker-bottom foot — opposite deformity)"]:
story.append(b(t))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: Bailey & Love's Short Practice of Surgery 28e · Campbell's Operative Orthopaedics 15e</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q7: ANTERIOR CRUCIATE LIGAMENT (ACL)
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("07","ANTERIOR CRUCIATE LIGAMENT (ACL) OF KNEE", TEA))
story.append(Spacer(1,6))
story.append(infobox(
"<b>Anatomy:</b> ACL runs from the posterior aspect of the lateral femoral condyle to the anterior tibial spine (intercondylar area). It prevents anterior translation of tibia on femur and controls rotational stability.",
LTE, TEA))
story.append(Spacer(1,6))
story.append(Paragraph("Mechanism of Injury", h2))
for t in ["Non-contact deceleration + valgus + external rotation (most common — e.g., cutting in football)",
"Direct contact — valgus force to lateral knee",
"<b>Classic history:</b> Audible 'pop', immediate haemarthrosis (within 2 hours), inability to continue activity"]:
story.append(b(t))
story.append(Spacer(1,6))
story.append(Paragraph("Clinical Tests", h2))
story.append(tbl(
["Test","Technique","Positive Finding","Tests"],
[
["Lachman test ★★★", "Knee at 20–30° flexion; anterior drawer on tibia with one hand stabilising femur","Soft/absent end-point with excess anterior translation","ACL (most sensitive test — 87%)"],
["Anterior Drawer","Knee at 90° flexion; anterior pull on tibia","Anterior displacement >6mm","ACL (less sensitive than Lachman)"],
["Pivot shift test","Valgus + internal rotation of tibia while extending knee","Clunk as tibia reduces","ACL (most specific — confirms rotational instability)"],
],
cw=[3.5*cm, 5.5*cm, 4*cm, 4*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Investigation", h2))
for t in ["<b>MRI knee:</b> Gold standard — shows ACL disruption; also identifies associated meniscal tears (50–70% associated)",
"<b>X-ray:</b> Usually normal; look for Segond fracture (avulsion of lateral tibial rim — pathognomonic of ACL injury)"]:
story.append(b(t))
story.append(Spacer(1,6))
story.append(Paragraph("Treatment", h2))
story.append(tbl(
["Approach","When","Details"],
[
["Conservative","Low-demand, elderly, partial tears","Physiotherapy, quadriceps/hamstring strengthening, functional bracing"],
["ACL Reconstruction ★","Young, active, pivot sports","Arthroscopic; autograft (BPTB or hamstring tendon) preferred; return to sport 9–12 months"],
],
cw=[3.5*cm, 4*cm, 9.5*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Associated Injuries — 'Unhappy Triad' (O'Donoghue)", h2))
story.append(infobox("ACL + MCL + Medial meniscus tear — classic knee injury from valgus + rotation force", LTE, TEA))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: Gray's Anatomy for Students · Campbell's Operative Orthopaedics 15e · Thieme Atlas of Anatomy</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q8: SEQUESTRUM
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("08","SEQUESTRUM — CHRONIC OSTEOMYELITIS", PUR))
story.append(Spacer(1,6))
story.append(infobox("<b>Sequestrum:</b> A fragment of dead (necrotic) bone that has become separated from the surrounding living bone by a layer of granulation tissue, pus, and fibrous tissue.", LPR, PUR))
story.append(Spacer(1,6))
if imgs["osteomyelitis"]:
story.extend(img_block(imgs["osteomyelitis"], 8*cm, 6*cm, "Fig 8.1 – Gross pathology of osteomyelitis. Source: Robbins & Kumar Basic Pathology"))
story.append(Paragraph("Key Terms in Chronic Osteomyelitis", h2))
for t in [
("<b>Sequestrum ★</b>", "Dead bone fragment; dense, radio-opaque; surrounded by granulation tissue/pus; no blood supply; acts as persistent nidus of infection"),
("<b>Involucrum ★</b>", "New periosteal bone shell formed around the sequestrum by the elevated periosteum; living bone envelops the dead"),
("<b>Cloaca</b>", "Opening/gap in the involucrum through which pus (and eventually the sequestrum) can discharge to the surface"),
("<b>Sinus tract</b>", "Channel from the infected bone cavity tracking through soft tissue to the skin surface; discharges pus"),
("<b>Brodie's abscess</b>", "Subacute localised intraosseous abscess; metaphysis of tibia; S. aureus; sclerotic rim on X-ray; low-grade chronic infection"),
]:
story.extend(kv_list([t], lbg=LPR, lcw=4.2*cm))
story.append(Spacer(1,6))
story.append(Paragraph("Pathogenesis of Sequestrum Formation", h2))
for step, text in enumerate([
"Bacteria in bone → neutrophilic inflammation",
"Inflammatory exudate builds up → raises intraosseous pressure",
"Periosteum elevated by subperiosteal abscess → interrupts cortical blood supply",
"Avascular cortical bone undergoes necrosis → <b>sequestrum</b> formed",
"Periosteum lays down new bone shell → <b>involucrum</b>",
"Pus erodes through involucrum via cloaca → tracks to skin via sinus",
], 1):
story.append(b(f"<b>Step {step}:</b> {text}"))
story.append(Spacer(1,6))
story.append(Paragraph("X-ray Findings of Chronic Osteomyelitis", h2))
for t in ["Dense radio-opaque sequestrum within radiolucent cavity",
"Surrounding involucrum (periosteal new bone)",
"Cloaca — gap in involucrum",
"Mixed sclerosis and lysis",
"MRI best for extent; technetium-99m bone scan — sensitive but not specific"]:
story.append(b(t))
story.append(Spacer(1,6))
story.append(Paragraph("Treatment", h2))
for t in ["Prolonged antibiotics (IV then oral, 6–12 weeks based on culture)",
"<b>Sequestrectomy</b> — surgical removal of sequestrum (definitive treatment for chronic OM)",
"Debridement of sinus tract and infected tissue",
"Dead space management — muscle flap, antibiotic-impregnated beads (PMMA)",
"Bone reconstruction if large defect — Ilizarov technique, bone grafting"]:
story.append(b(t))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: Robbins & Kumar Basic Pathology · Rosen's Emergency Medicine · Goldman-Cecil Medicine</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q9: WRIST DROP
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("09","WRIST DROP", colors.HexColor("#4E342E")))
story.append(Spacer(1,6))
story.append(infobox("<b>Definition:</b> Inability to extend the wrist due to paralysis of the wrist extensors, caused by radial nerve injury.", LG, GOLD))
story.append(Spacer(1,6))
story.append(Paragraph("Nerve Involved", h2))
story.append(b("<b>Radial nerve</b> — C5, C6, C7, C8, T1"))
story.append(b("Winds around the posterior aspect of the <b>mid-shaft of humerus</b> in the spiral groove — most vulnerable site"))
story.append(Spacer(1,6))
story.append(Paragraph("Common Causes", h2))
story.append(tbl(
["Cause","Mechanism / Mnemonic"],
[
["Humeral shaft fracture ★","Mid-shaft spiral fracture — nerve in spiral groove"],
["Saturday night palsy","Axilla compression — arm over chair while intoxicated"],
["Crutch palsy / Honeymoon palsy","Axillary compression — also 'honeymoon palsy' (partner's head on arm)"],
["Posterior interosseous nerve (PIN) compression","At radial tunnel — lateral epicondyle region; wrist extension preserved (ECRL)"],
["Systemic neuropathy","Diabetes, lead poisoning — bilateral wrist drop"],
],
cw=[5.5*cm, 11.5*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Clinical Features", h2))
story.append(tbl(
["Feature","Finding"],
[
["Wrist","Cannot extend — 'wrist drop'"],
["Fingers","Cannot extend MCP joints (intrinsics — ulnar/median — still extend IP joints)"],
["Thumb","Cannot extend or abduct"],
["Triceps","Spared if lesion is distal to spiral groove (mid-shaft)"],
["Sensation","Dorsum of hand — 'first web space' (key area — deep radial nerve)"],
["Grip strength","Reduced (need wrist extension for optimal grip)"],
],
cw=[3.5*cm, 13.5*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Levels of Radial Nerve Injury", h2))
for t,d in [
("Axilla","Triceps + wrist/finger extensors + sensory — crutch/Saturday night palsy"),
("Spiral groove (mid-shaft humerus) ★","Triceps SPARED; wrist drop + finger extension lost + sensation"),
("Lateral epicondyle / Posterior interosseous","Finger extension lost; wrist extension partly preserved (ECRL); NO sensory loss"),
]:
story.append(b(f"<b>{t}:</b> {d}"))
story.append(Spacer(1,6))
story.append(Paragraph("Treatment", h2))
for t in ["Cock-up splint (wrist extension splint) — prevents contracture and improves function",
"Physiotherapy — maintain passive movements",
"<b>Observation 3 months</b> (most recover if caused by compression/contusion — neuropraxia)",
"<b>Surgery:</b> Nerve exploration/repair if no recovery by 3 months; tendon transfer if permanent"]:
story.append(b(t))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: S Das Manual on Clinical Surgery 13e · Rosen's Emergency Medicine</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q10: CONGENITAL DISLOCATION OF HIP (CDH / DDH)
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("10","CONGENITAL DISLOCATION OF HIP (CDH / DDH)", colors.HexColor("#00838F")))
story.append(Spacer(1,6))
story.append(infobox("<b>DDH (Developmental Dysplasia of the Hip):</b> Spectrum of hip instability ranging from mild acetabular dysplasia to complete dislocation of the femoral head from the acetabulum.", LTE, TEA))
story.append(Spacer(1,6))
story.append(Paragraph("Risk Factors", h2))
for t,d in [
("Female sex ★","F:M = 6:1"),
("Firstborn","Uterus less distensible"),
("Breech presentation ★","Hip in extension → stretches capsule"),
("Family history","10× increased risk"),
("Left hip","Most commonly affected (L:R:B = 3:1:1)"),
("Associated conditions","CTEV, muscular torticollis, metatarsus adductus"),
]:
story.append(b(f"<b>{t}:</b> {d}"))
story.append(Spacer(1,6))
story.append(Paragraph("Clinical Tests", h2))
story.append(tbl(
["Test","Age Used","Technique","Positive"],
[
["Ortolani test ★","Neonatal","Abduct hip while pushing femur anteriorly","Clunk as dislocated hip REDUCES — 'click OUT'"],
["Barlow test ★", "Neonatal","Adduct hip while pushing femur posteriorly","Clunk/telescoping as hip DISLOCATES — 'click IN'"],
["Galeazzi sign", ">3 months","Supine, both hips flexed; compare knee heights","Affected side knee lower — limb shortening"],
["Trendelenburg sign","Walking child","Stand on affected leg","Pelvis drops on opposite side — gluteus medius weakness"],
["Asymmetric skin folds","Any","Thigh/inguinal folds","Additional folds on affected side (unreliable alone)"],
],
cw=[3.5*cm, 2.5*cm, 5.5*cm, 5.5*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Investigation", h2))
for t in ["<b>Ultrasound ★ (under 4–6 months):</b> Dynamic USS — cartilaginous acetabulum visible; Graf classification",
"<b>X-ray (after 4–6 months):</b> Hilgenreiner line, Perkin's line, Shenton's line — assess acetabular index"]:
story.append(b(t))
story.append(Spacer(1,6))
story.append(Paragraph("Treatment", h2))
story.append(tbl(
["Age","Treatment"],
[
["0–6 months", "Pavlik harness ★ — dynamic flexion abduction splint; success rate 85–90%"],
["6–18 months", "Closed reduction under GA + hip spica cast (if Pavlik failed)"],
["18 months – 3 years","Open reduction ± Salter innominate osteotomy + femoral osteotomy"],
[">3–4 years", "Open reduction + acetabular + femoral osteotomy (complex reconstruction)"],
[">8 years", "Results poor; salvage procedures only"],
],
cw=[4*cm, 13*cm]
))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: Campbell's Operative Orthopaedics 15e · Bailey & Love's Surgery 28e</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q11: COMPLICATIONS OF FRACTURES
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("11","COMPLICATIONS OF FRACTURES", RED))
story.append(Spacer(1,6))
story.append(Paragraph("Immediate (0–24 hours)", h2))
story.append(tbl(
["Complication","Notes"],
[
["Haemorrhage", "Femur ~1.5L, Pelvis ~3–4L, Tibia ~0.5L closed; can cause haemorrhagic shock"],
["Vascular injury", "Supracondylar humerus → brachial artery; Knee dislocation → popliteal artery; Femoral shaft → femoral artery"],
["Nerve injury", "Humeral shaft → radial nerve; Neck of fibula → peroneal nerve; Hip dislocation → sciatic nerve"],
["Skin/soft tissue", "Open fractures — contamination and infection risk"],
["Visceral injury", "Rib fractures → pneumothorax/haemothorax; Pelvic → bladder/urethra rupture"],
],
cw=[5*cm, 12*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Early (24 hours – 3 weeks)", h2))
story.append(tbl(
["Complication","Notes"],
[
["Compartment syndrome ★","Especially forearm/leg; 6 Ps; emergency fasciotomy"],
["Fat embolism syndrome","Triad: Hypoxia + Confusion + Petechiae; 24–72h post long bone/pelvic fracture; O₂ + ICU support"],
["Infection", "Open fractures; gas gangrene; osteomyelitis"],
["DVT / PE", "Immobility post fracture; prophylactic LMWH"],
["Volkmann's contracture","Forearm compartment syndrome → flexor contracture"],
],
cw=[5*cm, 12*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Late Complications", h2))
story.append(tbl(
["Complication","Description / Example"],
[
["Malunion", "Fracture heals in incorrect position (angulation, rotation, shortening)"],
["Non-union ★", "Failure to unite by expected time (6 months for most fractures)"],
["Delayed union", "Healing slower than expected but still progressing"],
["Avascular necrosis (AVN)","Disrupted blood supply → bone death; Femoral head (neck of femur Fx), Scaphoid (waist), Talus (neck)"],
["Post-traumatic arthritis","Articular surface damage → degeneration"],
["Osteoporosis / Disuse","Immobilisation → bone loss; Sudeck's atrophy (CRPS Type I)"],
["Growth disturbance","Epiphyseal plate injury in children → limb length discrepancy"],
["Osteomyelitis", "Especially open fractures — Staphylococcus aureus most common"],
["Myositis ossificans","Heterotopic ossification in muscle haematoma; elbow most common"],
["Knee/joint stiffness","Post-immobilisation; physiotherapy to prevent"],
],
cw=[5*cm, 12*cm]
))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: Bailey & Love's Surgery 28e · Rosen's Emergency Medicine 9e</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q12: CLASSIFICATION OF NERVE INJURY
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("12","CLASSIFICATION OF NERVE INJURY", colors.HexColor("#37474F")))
story.append(Spacer(1,6))
story.append(infobox("Two key classification systems: Seddon (3 types) and Sunderland (5 types). Sunderland is more detailed; Seddon is more clinically used.", GR, DG))
story.append(Spacer(1,6))
story.append(Paragraph("Seddon Classification (1943)", h2))
story.append(tbl(
["Type","Pathology","Recovery","Example"],
[
["Neuropraxia ★","Conduction block only; axon intact; myelin temporarily disrupted","Complete spontaneous recovery in days to weeks","Saturday night palsy (radial nerve compression)"],
["Axonotmesis","Axon disrupted; endoneurium intact; Wallerian degeneration occurs","Recovery occurs along intact endoneurial tube; 1mm/day (slow)","Closed fracture with nerve damage"],
["Neurotmesis","Complete nerve disruption (axon + all connective tissue sheaths cut)","No spontaneous recovery; surgical repair needed","Knife wound, open fracture"],
],
cw=[3*cm, 5*cm, 4.5*cm, 4.5*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Sunderland Classification (1951) — More Detailed", h2))
story.append(tbl(
["Grade","Structures Injured","Prognosis","= Seddon"],
[
["Grade I", "Myelin only (conduction block)", "Full spontaneous recovery", "Neuropraxia"],
["Grade II", "Axon only (endoneurium intact)", "Complete recovery; 1mm/day", "Axonotmesis"],
["Grade III", "Axon + endoneurium (perineurium intact)", "Incomplete; some fascicular fibrosis","Axonotmesis"],
["Grade IV", "Axon + endo + perineurium (epineurium intact)", "Poor without surgery", "Axonotmesis/Neurotmesis"],
["Grade V", "Complete nerve trunk transection", "No recovery; needs surgery", "Neurotmesis"],
],
cw=[2*cm, 6*cm, 5.5*cm, 3.5*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Rate of Nerve Regeneration", h2))
story.append(infobox("<b>Rate of regeneration:</b> ~1 mm/day = ~3 cm/month = ~1 inch/month<br/>Used clinically to predict time to recovery after nerve injury.", LB, MB))
story.append(Spacer(1,6))
story.append(Paragraph("Tinel's Sign", h2))
story.append(b("<b>Tinel's sign:</b> Tingling/paraesthesia on percussion over regenerating nerve — indicates axonal regrowth; progresses distally over time — good prognostic sign"))
story.append(Spacer(1,6))
story.append(Paragraph("Management Principles", h2))
story.append(tbl(
["Type","Management"],
[
["Neuropraxia", "Conservative — remove cause, splinting; recovery expected within weeks"],
["Axonotmesis", "Conservative — physiotherapy, splinting; recovery depends on distance to target muscle"],
["Neurotmesis", "Surgical — primary repair (epineurial/fascicular suture) or nerve graft if gap >2–3cm; better results if repaired early"],
],
cw=[3.5*cm, 13.5*cm]
))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: S Das Manual on Clinical Surgery 13e · Adams & Victor's Principles of Neurology 12e</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q13: SUPRACONDYLAR FRACTURE OF HUMERUS
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("13","SUPRACONDYLAR FRACTURE OF HUMERUS", colors.HexColor("#880E4F")))
story.append(Spacer(1,6))
story.append(infobox("<b>Most common fracture about the elbow in children (5–10 years). Almost always extension type (95%) — FOOSH injury.</b>", LRD, RED))
story.append(Spacer(1,6))
story.append(Paragraph("Types", h2))
story.append(tbl(
["Type","Mechanism","Frequency"],
[
["Extension type ★★","Fall on outstretched hand (FOOSH) → hyperextension → posterior displacement of distal fragment","~95%"],
["Flexion type", "Direct blow to posterior elbow → anterior displacement of distal fragment","~5%"],
],
cw=[4*cm, 9*cm, 4*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Gartland Classification (Extension Type)", h2))
story.append(tbl(
["Type","Description","Displacement","Treatment"],
[
["Type I", "Undisplaced", "None", "Above-elbow backslab/cast"],
["Type II", "Partially displaced", "Posterior cortex intact", "Closed reduction + cast OR percutaneous pinning"],
["Type III ★","Completely displaced", "No cortical contact", "URGENT closed reduction + percutaneous K-wire fixation"],
["Type IV", "Multidirectional instability","Unstable in flexion and extension","Surgical stabilisation"],
],
cw=[2*cm, 4*cm, 4.5*cm, 6.5*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Neurovascular Complications (CRITICAL)", h2))
story.append(tbl(
["Structure","Risk","Sign"],
[
["Brachial artery ★★★","Anterior interosseous branch especially; pulseless limb","Absent radial pulse; cool, pale, pulseless hand — EMERGENCY"],
["Anterior interosseous nerve ★","Most commonly injured nerve","Cannot make 'OK sign' — weak FPL + FDP of index — weakness NOT sensory"],
["Median nerve", "Injury from displacement", "Loss of sensation thumb, index, middle fingers"],
["Radial nerve", "Less common", "Wrist/finger drop"],
["Ulnar nerve", "Iatrogenic — medial pin placement", "Clawing of little/ring fingers"],
],
cw=[4.5*cm, 5.5*cm, 7*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Late Complications", h2))
for t in ["<b>Cubitus varus (gun-stock deformity) ★</b> — most common late complication; due to malunion with medial rotation; cosmetic deformity; corrected by supracondylar osteotomy",
"<b>Volkmann's ischaemic contracture</b> — if vascular injury/compartment syndrome missed",
"<b>Myositis ossificans</b> — heterotopic ossification if rough manipulation"]:
story.append(b(t))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: Campbell's Operative Orthopaedics 15e · Tintinalli's Emergency Medicine</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q14: FEMUR FRACTURE
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("14","FEMUR FRACTURE", DB))
story.append(Spacer(1,6))
story.append(Paragraph("Types of Femoral Fractures", h2))
story.append(tbl(
["Type","Location","Typical Patient","Blood Loss"],
[
["Femoral neck fracture ★","Intracapsular/extracapsular","Elderly osteoporotic female; FOOSH","500–800 mL"],
["Intertrochanteric fracture","Between greater and lesser trochanter","Elderly; high energy","500–1000 mL"],
["Subtrochanteric fracture","5 cm below lesser trochanter","Younger high-energy OR pathological","High"],
["Femoral shaft fracture ★","Diaphysis — mid 1/3 most common","Any age; high energy (RTA)","~1500 mL closed"],
["Supracondylar/distal","Distal metaphysis","Elderly + younger high-energy","Popliteal artery risk"],
],
cw=[4.5*cm, 4*cm, 4.5*cm, 4*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Femoral Neck Fracture — Garden Classification", h2))
story.append(tbl(
["Garden Grade","Description","AVN Risk","Treatment"],
[
["I", "Incomplete (abduction impacted)", "Low (5–10%)", "Internal fixation (cannulated screws)"],
["II", "Complete, undisplaced", "Low (10–20%)", "Internal fixation"],
["III","Complete, partially displaced", "High (25–30%)", "Hemi/total hip replacement (elderly); fixation (young)"],
["IV ★","Complete, fully displaced", "Very high (~35%)","Hemi/THA (elderly); urgent fixation within 6h (young)"],
],
cw=[2*cm, 5.5*cm, 4*cm, 5.5*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Femoral Shaft Fracture — Management", h2))
for t in ["<b>Primary survey</b> — femoral shaft can lose 1–1.5L blood → haemorrhagic shock → IV fluids",
"<b>Thomas splint</b> — emergency temporary traction splint",
"<b>Definitive: Intramedullary nail (IM nail) ★</b> — antegrade nail via piriformis fossa/GT; early mobilisation",
"<b>Fat embolism watch</b> — 24–48h post-injury: hypoxia, confusion, petechial rash"]:
story.append(b(t))
story.append(Spacer(1,6))
story.append(Paragraph("AVN in Femoral Neck Fractures", h2))
story.append(infobox(
"<b>Blood supply to femoral head:</b> Medial circumflex femoral artery (MCFA) is the dominant supply via retinacular vessels. Disrupted in displaced femoral neck fractures → AVN.<br/>"
"AVN risk: Grade I=5%, Grade II=10%, Grade III=25%, Grade IV=35%",
LRD, RED))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: Bailey & Love's Surgery 28e · Rockwood & Green's Fractures in Adults 10e</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q15: SCAPHOID FRACTURE
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("15","SCAPHOID FRACTURE", GRN))
story.append(Spacer(1,6))
story.append(infobox("<b>Most common carpal bone fracture (70% of all carpal fractures). High risk of AVN and non-union due to retrograde blood supply.</b>", LGN, GRN))
story.append(Spacer(1,6))
story.append(Paragraph("Anatomy & Blood Supply", h2))
for t in ["Scaphoid lies in the floor of the anatomical snuffbox",
"Blood supply: <b>enters distally via dorsal ridge vessels → supplies proximal pole retrogradely</b>",
"Proximal pole = poorest blood supply = HIGHEST risk of AVN",
"Waist fractures (70%) most common — interrupt retrograde supply to proximal pole"]:
story.append(b(t))
story.append(Spacer(1,6))
story.append(Paragraph("Mechanism & Location", h2))
story.append(tbl(
["Fracture Site","Frequency","AVN Risk","Non-union Risk"],
[
["Proximal pole","10–15%","High (~30%)", "High"],
["Waist ★", "65–70%","Moderate", "10–15%"],
["Distal pole", "15–20%","Low (good supply)","Low"],
],
cw=[5*cm, 3.5*cm, 4.5*cm, 4*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Clinical Features", h2))
for t in ["Mechanism: FOOSH — fall on outstretched hand with wrist extended",
"<b>Anatomical snuffbox tenderness ★</b> — between APL/EPB (lateral) and EPL (medial)",
"Tenderness on axial compression of thumb along 1st metacarpal",
"Scaphoid tubercle tenderness (palmar)",
"<b>Key rule:</b> Normal X-ray does NOT exclude scaphoid fracture — 'clinical diagnosis'"]:
story.append(b(t))
story.append(Spacer(1,6))
story.append(Paragraph("Investigations", h2))
story.append(tbl(
["Modality","Sensitivity","Notes"],
[
["X-ray (initial)", "65–70%", "Fracture may not be visible for 10–14 days; repeat X-ray at 2 weeks"],
["MRI ★★★", "~100%", "Gold standard if X-ray negative but clinical suspicion high; shows early fracture and AVN"],
["CT scan", "85–90%", "Best for defining fracture displacement and guiding surgical planning"],
["Bone scan (Tc-99m)", "~99%", "Sensitive but not specific; available early but non-specific"],
],
cw=[4*cm, 3*cm, 10*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Treatment", h2))
story.append(tbl(
["Type","Treatment"],
[
["Undisplaced waist/distal","Thumb spica cast 6–10 weeks (from elbow to thumb IP joint)"],
["Undisplaced proximal pole","Percutaneous headless compression screw (e.g., Herbert screw) — faster healing"],
["Displaced (>1mm)","ORIF — Herbert/Acutrak screw; ± bone graft for non-union"],
["Non-union (established)","Russe bone grafting ± vascularised graft (1,2-ICSRA graft) ± screw"],
],
cw=[5*cm, 12*cm]
))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: Schwartz's Principles of Surgery 11e · Bailey & Love's Surgery 28e</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# Q16: SPINAL ANAESTHESIA
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("16","SPINAL ANAESTHESIA", DG))
story.append(Spacer(1,6))
story.append(infobox("<b>Definition:</b> Intrathecal injection of local anaesthetic into the subarachnoid space (CSF) to produce reversible blockade of spinal nerve roots and spinal cord segments.", LB, MB))
story.append(Spacer(1,6))
story.append(Paragraph("Anatomy of Spinal Anaesthesia", h2))
for t in ["Needle inserted between vertebral spinous processes — usually <b>L3/L4 or L4/L5</b> (below L1 in adults to avoid spinal cord — cord ends at L1/L2)",
"Layers pierced: Skin → subcutaneous fat → supraspinous lig → interspinous lig → ligamentum flavum → epidural space → dura → subarachnoid space",
"Needle type: <b>Quincke</b> (cutting tip) or <b>Whitacre/Sprotte</b> (pencil-point — less PDPH risk)"]:
story.append(b(t))
story.append(Spacer(1,6))
story.append(Paragraph("Common Drugs Used", h2))
story.append(tbl(
["Drug","Baricity","Duration","Notes"],
[
["Bupivacaine 0.5% heavy ★★","Hyperbaric (glucose added)","2–4 hours","Most commonly used for spinal in surgery"],
["Bupivacaine 0.5% plain","Isobaric","2–4 hours","Less predictable spread"],
["Lignocaine 5% (Cinchocaine)","Hyperbaric","1.5–2 hours","Faster onset; risk of transient neurological symptoms"],
["Fentanyl (adjuvant)","Isobaric","—","Enhances block quality + duration; reduces LA dose"],
],
cw=[5*cm, 3.5*cm, 3*cm, 5.5*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Levels of Block for Common Orthopaedic Surgeries", h2))
story.append(tbl(
["Surgery","Block Level Needed"],
[
["Hip / femur fracture","T10"],
["Knee replacement (TKR)","T12"],
["Below-knee amputation / foot surgery","L2–L3"],
["TURP (urology)","T10"],
],
cw=[7*cm, 10*cm]
))
story.append(Spacer(1,6))
story.append(Paragraph("Complications", h2))
story.append(tbl(
["Complication","Details","Management"],
[
["Hypotension ★ (most common)","Sympathetic blockade → vasodilation → ↓SVR","IV fluids, vasopressors (ephedrine, phenylephrine), leg elevation"],
["Post-dural puncture headache (PDPH) ★","CSF leak → traction on meninges; frontal/occipital; worse on sitting","Bed rest, fluids, caffeine; <b>epidural blood patch</b> if persistent (gold standard)"],
["High/total spinal", "Inadvertent cephalad spread → respiratory arrest","Intubation, resuscitation"],
["Urinary retention", "S2–4 blockade → bladder atony","Catheterisation"],
["Cauda equina syndrome", "Neurotoxicity (concentrated lignocaine) → permanent deficit","Prevention: dilute LA, avoid concentrated solutions"],
["Infection / meningitis", "Aseptic technique failure","Antibiotic treatment"],
["Spinal haematoma", "In anticoagulated patients","Urgent surgical decompression"],
],
cw=[4.5*cm, 6*cm, 6.5*cm]
))
story.append(Spacer(1,4))
story.append(Paragraph("<i>Source: Miller's Anesthesia · Morgan & Mikhail's Clinical Anesthesiology</i>", cap))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# FINAL QUICK REVISION SUMMARY
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("★","MASTER REVISION TABLE — HIGH-YIELD EXAM FACTS", colors.HexColor("#B71C1C")))
story.append(Spacer(1,8))
story.append(tbl(
["Topic","★ Exam Fact","Classic Scenario"],
[
["Foot drop", "Common peroneal nerve at fibular neck", "Tight POP cast → foot drop"],
["Gout", "Negatively birefringent needle crystals; MSU", "Red hot 1st MTP joint in middle-aged male after alcohol"],
["Skeletal traction", "10% body weight; upper tibial pin for femur Fx", "Femoral shaft Fx awaiting ORIF"],
["OA knee", "LOSS X-ray findings; medial compartment → varus", "Elderly obese woman; varus knee; X-ray shows medial joint space loss"],
["Compartment syndrome","ΔP = Diastolic BP − Compartment P <30 = fasciotomy","Post tibial Fx: severe pain, passive stretch pain — do fasciotomy"],
["CTEV", "CAVE components; Ponseti method (gold std)", "Newborn with foot pointing down and inward"],
["ACL", "Lachman test most sensitive; pivot shift most specific", "Football player: pop, immediate haemarthrosis, positive Lachman"],
["Sequestrum", "Dead bone; involucrum = new bone around it", "Child with chronic discharging sinus from tibia after osteomyelitis"],
["Wrist drop", "Radial nerve in spiral groove; humeral shaft Fx", "Mid-shaft humerus spiral Fx → cannot extend wrist"],
["CDH/DDH", "Ortolani (reduces) + Barlow (dislocates); Pavlik harness","Newborn: clunk on hip examination; USS confirms"],
["Fx complications", "Fat embolism: hypoxia + confusion + petechiae 48h post","Long bone Fx → confused, O₂ sats drop, petechiae on chest"],
["Nerve injury", "Seddon: Neuropraxia/Axonotmesis/Neurotmesis", "Post pressure injury → full recovery = neuropraxia"],
["Supracondylar Humerus","Gartland III → closed reduction + K-wire; AIN most damaged","Child FOOSH → absent radial pulse → emergency ORIF"],
["Femur Fx", "Garden III/IV → THR/hemiarthroplasty in elderly", "Elderly woman hip Fx: shortened, externally rotated leg"],
["Scaphoid Fx", "Snuffbox tenderness; normal X-ray doesn't exclude; MRI","FOOSH → snuffbox tender → X-ray normal → get MRI"],
["Spinal anaesthesia", "L3/L4; PDPH → epidural blood patch", "Post-spinal: positional headache → epidural blood patch"],
],
cw=[4.5*cm, 6.5*cm, 6*cm]
))
story.append(Spacer(1,8))
story.append(infobox(
"<b>Sources:</b> Bailey & Love's Surgery 28e · Rosen's Emergency Medicine 9e · Robbins & Kumar Basic Pathology · "
"Campbell's Operative Orthopaedics 15e 2026 · Rockwood & Green's Fractures 10e 2025 · Adams & Victor 12e · "
"Harrison's Internal Medicine 22e · S Das Manual of Clinical Surgery 13e",
LB, MB))
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
topMargin=1.8*cm, bottomMargin=1.5*cm,
leftMargin=2*cm, rightMargin=2*cm,
title="Orthopaedics Comprehensive Study Guide — 16 Topics",
author="Orris Medical AI",
subject="Complete Answers with Images for All 16 Orthopaedic Topics",
)
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"SUCCESS: {OUTPUT}")
cd /home/daytona/workspace/ortho-pdf2 && python generate_full.py 2>&1
ls -lh /home/daytona/workspace/ortho-pdf2/Orthopaedics_Full_Guide.pdf
Orthopaedics Full Guide
PDF Document · PDF
| # | Topic | What's Inside |
|---|---|---|
| 01 | Foot Drop | Common peroneal nerve anatomy, causes table, steppage gait, sensory map, treatment |
| 02 | Gout Pathology | MSU crystal features, negative birefringence, 4 stages, Gout vs Pseudogout comparison table, drugs |
| 03 | Skeletal Traction | Traction diagram image, pin sites, Thomas/Perkins/90-90 types, complications |
| 04 | Osteoarthritis Knee | LOSS X-ray mnemonic, cartilage pathology, varus deformity, conservative → TKR management |
| 05 | Compartment Syndrome | 6 P's table, ΔP threshold formula, 4-compartment fasciotomy, Volkmann's contracture |
| 06 | Club Foot (CTEV) | CAVE mnemonic, Ponseti method steps, Denis-Browne splint, differentials |
| 07 | ACL of Knee | Lachman/Pivot shift/Anterior drawer, Unhappy Triad, MRI, reconstruction |
| 08 | Sequestrum | Osteomyelitis gross pathology image, sequestrum/involucrum/cloaca/Brodie's abscess definitions, sequestrectomy |
| 09 | Wrist Drop | Radial nerve levels, spiral groove, Saturday night palsy, levels of injury comparison |
| 10 | CDH / DDH | Ortolani/Barlow/Galeazzi/Trendelenburg table, Graf USS, Pavlik harness age guide |
| 11 | Complications of Fractures | Immediate/Early/Late tables — fat embolism triad, AVN sites, malunion vs non-union |
| 12 | Nerve Injury Classification | Seddon 3-type + Sunderland 5-grade full comparison, 1mm/day rule, Tinel's sign |
| 13 | Supracondylar Humerus | Gartland I-IV, AIN most injured nerve, cubitus varus, brachial artery emergency |
| 14 | Femur Fracture | Garden classification + AVN%, Thomas splint, IM nail, MCFA blood supply |
| 15 | Scaphoid Fracture | Snuffbox tenderness, retrograde blood supply, proximal pole AVN, Herbert screw |
| 16 | Spinal Anaesthesia | Drug table, L3/L4 landmark, block levels for ortho surgeries, PDPH → epidural blood patch |
| ★ | Master Revision Table | All 16 topics: single high-yield fact + classic exam scenario |