Orthopaedic disease with examination

Asking for Preferences
Reading File
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Finding Sources
Reading File
Reading File
Reading File
Here is the comprehensive full clinical write-up for Orthopaedic Diseases of the Upper Limb - covering anatomy, examination, specific conditions, investigations, and treatment.

ORTHOPAEDIC DISEASES OF THE UPPER LIMB


PART 1: CLINICAL EXAMINATION FRAMEWORK

General Approach

Every upper limb joint examination follows the same structured sequence:
Look → Feel → Move → Special Tests
The patient should be stripped to the waist. Always compare the injured side with the normal side. Observe the patient's attitude as they walk in - it often gives diagnostic clues immediately.

PART 2: THE SHOULDER

Anatomy Recall

The glenohumeral joint is a ball-and-socket synovial joint with the greatest range of motion of any joint in the body, but at the cost of inherent instability. The rotator cuff comprises four muscles: supraspinatus, infraspinatus, subscapularis, and teres minor. Pain from the shoulder joint may be felt anterolaterally; referred pain can arise from the cervical spine, heart, mediastinum, or diaphragm.

Examination of the Shoulder

LOOK

  • Attitude of the limb - note how the arm is held
    • Fracture of clavicle: patient supports the flexed elbow of the injured side with the other hand
    • Anterior shoulder dislocation: same supportive attitude, with flattening of the shoulder contour and a prominent anterior bulge
  • Skin: Check for surgical scars. Anterior scar = deltopectoral approach; lateral scar = deltoid-splitting approach; posterior port sites = arthroscopy
  • Soft tissues: Wasting of the deltoid is common after shoulder dislocation (temporary axillary nerve injury). Wasting of the rotator cuff muscles indicates a cuff problem
  • Bone: Deformity or prominence. Middle-third clavicle fracture is the most common cause. Prominent acromial end = acromioclavicular (AC) joint dislocation; prominent sternal end = sternoclavicular dislocation

FEEL

  • Skin: Test sensation over the upper lateral arm - the "regimental badge area" (axillary nerve territory). Loss = axillary nerve damage (complication of shoulder dislocation)
Regimental badge area of axillary nerve
  • Bones: Palpate sternoclavicular joint, clavicle, AC joint, acromion, coracoid process, greater tuberosity, and bicipital groove
  • Generalised shoulder pain suggests glenohumeral pathology or referred neck pain; localised pain is often AC joint pathology

MOVE

Differentiate true glenohumeral movement from scapulothoracic movement. Stabilise the scapula with the thumb over the coracoid and fingers over the spine of the scapula. Start with arms at sides, elbows extended, palms forward (anatomical position).
MovementNormal Range
Flexion0-180°
Extension0-60°
Abduction0-180°
Adduction0-50°
Internal rotation0-90°
External rotation0-60°
Painful arc (60°-120° of abduction): classic for supraspinatus tendinitis or impingement.

SPECIAL TESTS (KEY)

TestTechniqueSignificance
Impingement sign (Neer)Passive forward flexion >90°Pain = impingement syndrome
Hawkins' testPassive FF to 90° + internal rotationPain = impingement
Jobe's test (Empty can)Resisted pronation/FF at 90° in scapular planePain = supraspinatus lesion
Drop-arm testArm placed in abduction then releasedCannot maintain = supraspinatus rupture
Hornblower signResisted ER with arm at 90° abductionPain = infraspinatus / teres minor lesion
Lift-off test (Gerber)Arm in internal rotation behind backCannot lift off = subscapularis tear
Bear-hug testPatient's hand on opposite shoulder; examiner lifts itCannot maintain = subscapularis lesion
Belly-push testElbow held anteriorly with abduction pressureCannot hold elbow forward = subscapularis
Apprehension testSupine, 90° abduction + ERApprehension = anterior instability
Relocation testPosterior force during apprehension testRelief = anterior instability
Sulcus signInferior traction on arm at sideGap below acromion = inferior laxity
O'Brien test10° adduction, 90° FF, maximal pronation; resistPain = SLAP lesion or AC joint pathology
Speed's testResisted FF with elbow extended, forearm supinatedPain in bicipital groove = biceps tendinopathy
(- Bailey and Love's Short Practice of Surgery 28th Ed., Miller's Review of Orthopaedics 9th Ed.)

PART 3: SHOULDER CONDITIONS


1. FROZEN SHOULDER (Adhesive Capsulitis)

Definition: Painful, progressive restriction of glenohumeral motion, especially external rotation, due to fibrotic contracture of the capsule.
Epidemiology
  • Age 40-70 years; nondominant side more frequently affected; female sex predominates
  • Peak associations: diabetes mellitus (disproportionately affected, worse outcomes), thyroid disease, post-chest/breast surgery, prolonged immobilization
Pathology
  • Essential lesion: coracohumeral ligament (CHL) and rotator interval capsule
  • Histology: dense matrix of type III collagen with fibroblasts and myofibroblasts - resembles Dupuytren disease contracture tissue
Clinical Stages
StageNameDurationFeatures
1Pre-adhesiveWeeks-monthsNocturnal pain, full ROM initially
2Freezing3-9 monthsPain + progressive loss of ROM
3Frozen9-15 monthsStiffness predominates; pain decreases
4Thawing15-24 monthsGradual ROM recovery
Key Examination Findings
  • Global restriction of all shoulder movements (active = passive)
  • External rotation is the FIRST and MOST affected movement
  • Classic: equal loss of active and passive ROM (unlike rotator cuff tear where active < passive)
  • Two other causes of selective loss of ER to rule out: glenohumeral OA and locked posterior dislocation - radiographs mandatory before diagnosis
Investigations
  • X-ray: Normal (mandatory to exclude OA, posterior dislocation)
  • Arthrography: Loss of normal axillary recess - reveals capsular contracture (joint volume reduced from normal ~35 mL to <10 mL)
  • MRI: Thickening of glenohumeral capsule along axillary pouch, thickening of CHL, obliteration of subcoracoid fat triangle, rotator interval synovitis (none are pathognomonic)
Treatment
  • Conservative (90% respond): NSAIDs, physiotherapy (pendulum exercises, Codman exercises), intraarticular corticosteroid injections, distention arthrography/hydrodistention
  • Surgical: Closed manipulation under anaesthesia; arthroscopic capsular release (if 12-16 weeks conservative treatment fails); open release of coracohumeral ligament (last resort)
  • Prognosis: 90% recover to normal function; ~10% have long-term problems; diabetic patients have worse outcomes (full ROM in only 71% vs 90% nondiabetics)
(- Miller's Review of Orthopaedics 9th Ed., Campbell's Operative Orthopaedics 15th Ed. 2026)

2. ROTATOR CUFF PATHOLOGY

Spectrum: Impingement syndrome → Partial tear → Full-thickness tear
Presentation: Pain on raising arm above shoulder height, painful arc (60°-120°), nocturnal pain (lying on the affected shoulder), weakness
Examination
  • Painful arc (60°-120°) during abduction
  • Impingement tests (Neer, Hawkins) positive
  • Specific muscle tests as per table above
  • Drop-arm test positive in complete supraspinatus rupture
  • No restriction of passive ROM (distinguishes from frozen shoulder)
Investigations
  • X-ray: May show superior migration of humeral head (massive cuff tear), calcific deposits
  • Ultrasound: Dynamic assessment, good for partial vs full-thickness tears
  • MRI: Gold standard - shows tear size, retraction, muscle atrophy
Treatment
  • Conservative: Physiotherapy, subacromial corticosteroid injection, NSAIDs
  • Surgical: Arthroscopic or open cuff repair (for full-thickness tears failing conservative management); subacromial decompression (acromioplasty)

PART 4: THE ELBOW

Anatomy Recall

Hinge joint. Three key bony landmarks: medial epicondyle, lateral epicondyle, and olecranon tip - form an equilateral triangle when elbow flexed to 90° (Hueter's triangle). Normal carrying angle: 9-14° valgus (greater in women). Normal range: -5° (hyperextension) to 150° flexion; 70° pronation, 90° supination.

Examination of the Elbow

LOOK

  • Attitude: Elbow usually held flexed after injury. Child with swollen flexed elbow supported by other hand = supracondylar fracture until proven otherwise
  • Carrying angle (with elbow extended, forearm supinated, anatomical position):
    • Cubitus valgus: Increased carrying angle - caused by malunion of distal humeral fracture (lateral condyle fracture in children) - risk of tardy ulnar nerve palsy
    • Cubitus varus (gun-stock deformity): Reversed carrying angle - secondary to malunited supracondylar fracture (most common deformity after supracondylar fracture in children)
  • View from front, behind, and side
  • From behind: Unduly prominent olecranon - in children suggests supracondylar fracture more than posterior dislocation
  • From the side: Anteroposterior broadening - seen in posterior dislocation and supracondylar fracture
  • Soft tissues: Olecranon bursa, rheumatoid nodules, gouty tophi
  • Skin: Psoriatic plaques on extensor surface

FEEL

  • Cross-fluctuation test for effusion
  • Ulnar nerve: Roll under fingers in the groove between medial epicondyle and olecranon
  • Three-point bony landmarks: Medial epicondyle, lateral epicondyle, olecranon tip - equilateral triangle at 90° flexion (disrupted in posterior dislocation; preserved in supracondylar fracture)
  • Radial head: Palpate with thumb while pronating/supinating - feel for rotation, tenderness, irregularity
  • Test distal sensation in ulnar nerve distribution
  • Springing the radius: Squeeze radius and ulna together distally - referred pain at upper radius = fracture head/neck of radius

MOVE

MovementNormal
Flexion-Extension-5° (hyperextension) to 150°
Pronation70°
Supination90°

ELBOW CONDITIONS

3. LATERAL EPICONDYLITIS (Tennis Elbow)

Definition: Degenerative tendinopathy at the origin of the extensor carpi radialis brevis (ECRB) at the lateral epicondyle.
Epidemiology
  • Peak incidence: early fifth decade; more common in non-athletes than athletes
  • Risk factors: female sex, smoking, manual labour, statin use
  • Mechanism: Repetitive supination/pronation of forearm with elbow in near-full extension (e.g., backhand tennis stroke, painting, carpentry)
Pathology: Microtear at origin of ECRB → angiofibroblastic hyperplasia (NOT true inflammation). Also involves extensor carpi radialis longus and extensor digitorum communis origins.
Clinical Features
  • Lateral elbow pain, worse with gripping activities
  • Tenderness ~5 mm distal and anterior to the midpoint of the lateral epicondyle
  • Pain exacerbated by resisted wrist dorsiflexion and forearm supination
Special Tests
  • Mill's test: Pain on passive wrist flexion with elbow extended
  • Cozen's test: Pain on resisted wrist extension with elbow extended
  • Middle finger extension test: Pain at lateral epicondyle on resisted middle finger extension (tests ECRB specifically)
Differential Diagnosis: Radial tunnel syndrome (pain 3-4 cm distal to epicondyle, reproduced by resisted long finger extension), osteochondritis dissecans of capitellum, lateral compartment arthrosis
Investigations
  • X-ray: Usually normal; occasionally calcific tendinitis
  • MRI: Tendon thickening with increased T1 and T2 signal at ECRB origin; high T2 signal correlates with better surgical outcomes
Treatment
  • Conservative (successful in 84-95%): Rest, ice, counter-force brace (tennis elbow clasp), physiotherapy, corticosteroid injection (short-term benefit)
  • Surgical: Débridement of angiofibroblastic tissue - open or arthroscopic release of ECRB origin; percutaneous tenotomy

4. MEDIAL EPICONDYLITIS (Golfer's Elbow)

  • Pain at medial epicondyle, involving flexor-pronator origin (flexor carpi radialis, pronator teres)
  • Tenderness at medial epicondyle; pain with resisted wrist flexion and forearm pronation
  • Must exclude ulnar nerve pathology at elbow (coexists in ~60%)
  • Treatment similar to tennis elbow

5. POSTERIOR DISLOCATION OF THE ELBOW

  • Most common dislocation of the elbow; typically FOOSH (fall on outstretched hand) mechanism
  • Examination: Olecranon unduly prominent posteriorly; anteroposterior broadening; elbow held in ~45° flexion; Hueter's triangle disrupted
  • Complications: Median and ulnar nerve injury, brachial artery injury, myositis ossificans, recurrent instability

PART 5: WRIST AND HAND

Examination of the Wrist

LOOK

  • Attitude (e.g., dinner fork deformity = Colles' fracture)
  • Swelling, deformity, scars, muscle wasting (thenar, hypothenar)
  • Examine for trophic changes (Complex Regional Pain Syndrome/CRPS after Colles' fracture)

FEEL

  • Anatomical snuffbox tenderness = scaphoid fracture until proven otherwise
  • Lister's tubercle - landmark for scaphoid approach
  • Tender 1 cm distal to Lister's tubercle = scaphoid fracture
  • Palpate carpal bones individually

MOVE

MovementNormal
Flexion75-80°
Extension70-75°
Radial deviation15°
Ulnar deviation30-40°

6. COLLES' FRACTURE (FOOSH Injury - Distal Radius)

Definition: Transverse fracture of the distal radius within 2.5 cm of the wrist with dorsal displacement, dorsal angulation, and radial shift.
Epidemiology: Commonest fracture in adults >40 years; bimodal (young high-energy trauma + elderly osteoporotic women FOOSH)
Classic "Dinner Fork" Deformity
Displacement pattern:
  • Dorsal displacement
  • Dorsal angulation (reverse tilt)
  • Radial shift
  • Supination of distal fragment
  • Impacted often
Examination Findings
  • Dinner fork deformity on lateral view
  • Radial deviation of wrist
  • Local swelling and bruising
  • Tenderness over distal radius
Investigations
  • X-ray (AP + lateral): Confirm fracture, measure radial inclination, volar tilt, radial length
  • Normal parameters: Volar tilt 11°, radial inclination 22°, radial height 12 mm
Treatment
  • Undisplaced: Below-elbow backslab → cast for 6 weeks
  • Displaced: Closed reduction under haematoma block or Bier's block → cast
  • Acceptable reduction: Volar tilt ≥0°, radial inclination ≥15°, radial height ≤3 mm shortening
  • Unstable/irreducible: K-wire fixation, volar locking plate (ORIF)
Complications: CRPS (Sudeck's atrophy), malunion, median nerve injury, EPL rupture, carpal tunnel syndrome

7. SCAPHOID FRACTURE

Importance: Most commonly missed fracture. Blood supply enters distally; proximal fractures risk avascular necrosis (AVN) of proximal pole.
Mechanism: FOOSH with wrist in dorsiflexion and radial deviation
Clinical Findings
  • Anatomical snuffbox tenderness (dorsal, between APL/EPB and EPL tendons)
  • Tenderness over scaphoid tubercle (volar)
  • Scaphoid compression test: Axial compression along thumb axis
  • Pain with "telescoping" the thumb
Investigations
  • X-ray: May be NORMAL in acute fracture (30% missed on initial X-ray)
  • If clinical suspicion and normal X-ray: Repeat X-ray at 10-14 days OR MRI (most sensitive, early), CT (best for assessing displacement and union)
  • Treat as scaphoid fracture clinically even with normal X-ray
Treatment
  • Undisplaced waist fracture: Scaphoid cast (thumb spica) for 8-12 weeks
  • Displaced (>1 mm) or proximal pole: Surgical fixation (Herbert screw)
  • Established non-union/AVN: Bone grafting + fixation; vascularised bone graft

8. CARPAL TUNNEL SYNDROME (CTS)

Definition: Compression of the median nerve within the carpal tunnel at the wrist. Most common entrapment neuropathy.
Anatomy: Carpal tunnel bounded by carpal bones (3 sides) and transverse carpal ligament (flexor retinaculum) volarly. Contains 9 flexor tendons + median nerve.
Epidemiology: More common in women; affects ~3% of adult population. Common in pregnancy.
Aetiology: Tenosynovitis of flexor tendons (most common), rheumatoid arthritis, hypothyroidism, diabetes, pregnancy, acromegaly, amyloidosis, ganglion/lipoma, fracture malunion
Clinical Features
  • Pain, numbness, paraesthesia in radial 3½ digits (thumb, index, middle, radial half of ring finger)
  • Symptoms worse at night and with repetitive hand movements
  • Thenar wasting (late sign - indicates chronic compression)
  • Decreased sensation over radial 3½ digits
  • Weakness of thumb abduction (APB)
Special Tests
TestMethodSignificance
Tinel's signTap over carpal tunnel at wrist flexor retinaculumParaesthesia in median nerve distribution
Phalen's manoeuvreWrist fully flexed (dorsal surfaces back to back) for 60 secondsReproduces symptoms - most specific
Carpal compression testDirect pressure over carpal tunnelMost sensitive test
Reverse Phalen (prayer sign)Wrist extended back to backSymptom reproduction
Investigations
  • Clinical diagnosis primarily
  • Nerve conduction studies (NCS)/EMG: Confirm diagnosis, essential before surgery; shows prolonged sensory latency before motor latency. Note: up to 25% false-negative rate
  • X-ray: To exclude bony cause (fracture, arthritis)
  • USS: Can visualise enlarged median nerve
Treatment
  • Conservative: Wrist splint in neutral (especially night splinting), activity modification, ergonomic changes, nerve gliding exercises, corticosteroid injection (good short-term relief; most recur at 1 year)
  • Surgical: Carpal tunnel decompression (open or endoscopic division of flexor retinaculum) - equivalent long-term results for both; excellent outcomes; indicated after failed conservative treatment or thenar wasting
(- Textbook of Family Medicine 9th Ed.)

PART 6: ADDITIONAL UPPER LIMB CONDITIONS


9. DUPUYTREN'S CONTRACTURE

Definition: Palmar fascial fibrosis causing progressive flexion contracture of digits (ring and little fingers most commonly).
Pathology: Excessive myofibroblast activity with type III collagen deposition (similar to frozen shoulder histologically)
Associations: Male sex, Northern European ancestry, diabetes, alcohol use, phenytoin use, occupational vibration, HIV
Examination
  • Pitting/dimpling of palmar skin
  • Palpable nodules in palm along longitudinal fascial bands
  • Progressive flexion contracture of MCPj and PIPj
  • Hueston's tabletop test: Cannot place palm flat on table
Treatment
  • Observation if mild
  • Needling/fasciotomy, collagenase injection (Xiaflex), limited fasciectomy (MCP contracture >30°, PIP contracture any degree)

10. DE QUERVAIN'S TENOSYNOVITIS

Definition: Stenosing tenosynovitis of the first dorsal extensor compartment (APL and EPB tendons) at the radial styloid.
Aetiology: Repetitive pinch-grip activity; common in new mothers (lifting infant)
Clinical Features
  • Pain over radial styloid and first extensor compartment
  • Tenderness over radial styloid and 1st dorsal compartment
  • Crepitus on movement
Special Test
  • Finkelstein's test: Patient makes a fist with thumb inside fingers; examiner passively ulnar deviates the wrist - sharp pain at radial styloid = positive
Treatment
  • Thumb spica splint, NSAIDs, corticosteroid injection; surgical release of first compartment if conservative fails

SUMMARY TABLE: Upper Limb Orthopaedic Conditions at a Glance

ConditionLocationKey SignInvestigationTreatment
Frozen shoulderGHJEqual active = passive loss of ERX-ray (normal), MRIPhysio, steroid injection, arthroscopic release
Supraspinatus tearShoulderDrop-arm test, painful arcMRIPhysio → surgical repair
Tennis elbowLateral epicondyleCozen's test, Mill's testClinical/MRIRest, brace, steroid injection
Golfer's elbowMedial epicondyleResisted wrist flexion painClinicalSame as tennis elbow
Colles' fractureDistal radiusDinner-fork deformityX-rayCast; ORIF if unstable
Scaphoid fractureAnatomical snuffboxSnuffbox tendernessMRI (gold standard)Thumb spica; Herbert screw
Carpal Tunnel SyndromeWristTinel's, Phalen's, thenar wastingNCS/EMGSplinting, injection; CTD surgery
Dupuytren'sPalmTabletop testClinicalFasciectomy, collagenase
De Quervain'sRadial styloidFinkelstein's testClinicalSplint, injection, release

KEY EXAMINATION PRINCIPLES (Summary)

  1. Look - attitude, asymmetry, wasting, deformity, scars, swelling
  2. Feel - skin temperature, tenderness (point/diffuse), bone landmarks, pulses, sensation
  3. Move - active first (patient moves), then passive (you move), then resisted (isometric - tests muscle/tendon)
  4. Special tests - specific to joint and suspected pathology
  5. Neurovascular assessment - always check distal pulses and nerve function after any upper limb injury
Regimental badge area - loss of sensation here after shoulder trauma = axillary nerve palsy Hueter's triangle - disrupted in elbow dislocation, preserved in supracondylar fracture Anatomical snuffbox tenderness - scaphoid fracture until proven otherwise (treat and investigate even with normal X-ray) Active = Passive ROM loss - frozen shoulder (vs. active < passive = rotator cuff tear)

Sources: Bailey and Love's Short Practice of Surgery 28th Ed.; Miller's Review of Orthopaedics 9th Ed.; Campbell's Operative Orthopaedics 15th Ed. 2026; S Das Manual on Clinical Surgery 13th Ed.; Textbook of Family Medicine 9th Ed.

Generate a summary document or PDF guide of upper limb exam techniques

Reading File
Running Command

ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or not foun…

Running Command

mkdir -p /home/daytona/workspace/upper-limb-guide && echo "dir created"

Writing File

~/upper-limb-guide/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_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate
from reportlab.lib.colors import HexColor

OUTPUT = "/home/daytona/workspace/upper-limb-guide/Upper_Limb_Exam_Guide.pdf"

# ── Colour palette ──────────────────────────────────────────────────────────
C_NAVY   = HexColor("#1B3A5C")
C_TEAL   = HexColor("#1A7A8A")
C_LTBLUE = HexColor("#D6EAF8")
C_MINT   = HexColor("#E8F8F5")
C_GOLD   = HexColor("#F0A500")
C_WHITE  = colors.white
C_BLACK  = colors.black
C_LGREY  = HexColor("#F4F6F7")
C_DGREY  = HexColor("#555555")
C_RED    = HexColor("#C0392B")
C_GREEN  = HexColor("#1E8449")

# ── Page numbering ───────────────────────────────────────────────────────────
def on_page(canvas, doc):
    canvas.saveState()
    w, h = A4
    # Header bar
    canvas.setFillColor(C_NAVY)
    canvas.rect(0, h - 22*mm, w, 22*mm, fill=1, stroke=0)
    canvas.setFillColor(C_WHITE)
    canvas.setFont("Helvetica-Bold", 10)
    canvas.drawString(15*mm, h - 13*mm, "UPPER LIMB ORTHOPAEDIC EXAMINATION GUIDE")
    canvas.setFont("Helvetica", 9)
    canvas.drawRightString(w - 15*mm, h - 13*mm, "Clinical Reference")
    # Footer
    canvas.setFillColor(C_NAVY)
    canvas.rect(0, 0, w, 12*mm, fill=1, stroke=0)
    canvas.setFillColor(C_WHITE)
    canvas.setFont("Helvetica", 8)
    canvas.drawString(15*mm, 4*mm, "Sources: Bailey & Love 28th Ed | Miller's Review of Orthopaedics 9th Ed | Campbell's Operative Orthopaedics 15th Ed 2026")
    canvas.drawRightString(w - 15*mm, 4*mm, f"Page {doc.page}")
    canvas.restoreState()

# ── Document setup ───────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    topMargin=28*mm,
    bottomMargin=18*mm,
    leftMargin=18*mm,
    rightMargin=18*mm,
    title="Upper Limb Orthopaedic Examination Guide",
    author="Orris Medical Reference",
)

styles = getSampleStyleSheet()

# Custom styles
def S(name, parent="Normal", **kwargs):
    return ParagraphStyle(name, parent=styles[parent], **kwargs)

sTitle    = S("sTitle",    "Title",   fontSize=26, textColor=C_WHITE,   alignment=TA_CENTER, spaceAfter=4)
sSubtitle = S("sSubtitle", "Normal",  fontSize=12, textColor=HexColor("#AED6F1"), alignment=TA_CENTER, spaceAfter=6)
sH1       = S("sH1",       "Heading1",fontSize=14, textColor=C_WHITE,   spaceAfter=4, spaceBefore=2, leading=18)
sH2       = S("sH2",       "Heading2",fontSize=12, textColor=C_NAVY,    spaceAfter=3, spaceBefore=8, leading=16)
sH3       = S("sH3",       "Heading3",fontSize=10, textColor=C_TEAL,    spaceAfter=2, spaceBefore=6, leading=14)
sBody     = S("sBody",     "Normal",  fontSize=9,  textColor=C_BLACK,   spaceAfter=3, leading=13, alignment=TA_JUSTIFY)
sBullet   = S("sBullet",   "Normal",  fontSize=9,  textColor=C_BLACK,   spaceAfter=2, leading=12, leftIndent=12, bulletIndent=0)
sNote     = S("sNote",     "Normal",  fontSize=8,  textColor=C_DGREY,   spaceAfter=2, leading=11, leftIndent=6, fontName="Helvetica-Oblique")
sCaption  = S("sCaption",  "Normal",  fontSize=8,  textColor=C_DGREY,   alignment=TA_CENTER, spaceAfter=4)
sTH       = S("sTH",       "Normal",  fontSize=8,  textColor=C_WHITE,   fontName="Helvetica-Bold", leading=11)
sTD       = S("sTD",       "Normal",  fontSize=8,  textColor=C_BLACK,   leading=11)
sTD2      = S("sTD2",      "Normal",  fontSize=8,  textColor=C_BLACK,   leading=11, fontName="Helvetica-Bold")
sAlert    = S("sAlert",    "Normal",  fontSize=9,  textColor=C_RED,     fontName="Helvetica-Bold", spaceAfter=3, leading=12)
sGreen    = S("sGreen",    "Normal",  fontSize=9,  textColor=C_GREEN,   fontName="Helvetica-Bold", spaceAfter=3, leading=12)

# ── Helpers ──────────────────────────────────────────────────────────────────
def section_header(title, subtitle=""):
    """Navy banner heading."""
    w = A4[0] - 36*mm
    data = [[Paragraph(title, sH1)]]
    t = Table(data, colWidths=[w])
    t.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), C_NAVY),
        ("TOPPADDING",    (0,0), (-1,-1), 6),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
        ("LEFTPADDING",   (0,0), (-1,-1), 10),
        ("RIGHTPADDING",  (0,0), (-1,-1), 10),
        ("ROUNDEDCORNERS", [4,4,4,4]),
    ]))
    items = [t]
    if subtitle:
        items.append(Paragraph(subtitle, sNote))
    items.append(Spacer(1, 3*mm))
    return items

def subsection(title):
    return [Paragraph(title, sH2), HRFlowable(width="100%", thickness=1, color=C_TEAL, spaceAfter=3)]

def sub2(title):
    return [Paragraph(title, sH3)]

def bullet(text, bold_prefix=""):
    if bold_prefix:
        full = f"<b>{bold_prefix}</b> {text}"
    else:
        full = text
    return Paragraph(f"\u2022  {full}", sBullet)

def note(text):
    return Paragraph(f"<i>{text}</i>", sNote)

def alert(text):
    return Paragraph(f"&#9888;  {text}", sAlert)

def tip(text):
    return Paragraph(f"&#10003;  {text}", sGreen)

def make_table(headers, rows, col_widths=None, alt_rows=True):
    w = A4[0] - 36*mm
    if col_widths is None:
        n = len(headers)
        col_widths = [w/n]*n
    header_row = [Paragraph(h, sTH) for h in headers]
    table_data = [header_row]
    for r in rows:
        table_data.append([Paragraph(str(c), sTD) for c in r])
    t = Table(table_data, colWidths=col_widths, repeatRows=1)
    style = [
        ("BACKGROUND",    (0,0), (-1,0), C_NAVY),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [C_WHITE, C_LGREY] if alt_rows else [C_WHITE]),
        ("GRID",          (0,0), (-1,-1), 0.4, HexColor("#CCCCCC")),
        ("TOPPADDING",    (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING",   (0,0), (-1,-1), 6),
        ("RIGHTPADDING",  (0,0), (-1,-1), 6),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
    ]
    t.setStyle(TableStyle(style))
    return t

def highlight_box(text, bg=C_LTBLUE, border=C_TEAL):
    w = A4[0] - 36*mm
    t = Table([[Paragraph(text, sBody)]], colWidths=[w])
    t.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,-1), bg),
        ("LINEABOVE",     (0,0), (-1,0), 2, border),
        ("LINEBELOW",     (0,-1),(-1,-1),2, border),
        ("LEFTPADDING",   (0,0), (-1,-1), 10),
        ("RIGHTPADDING",  (0,0), (-1,-1), 10),
        ("TOPPADDING",    (0,0), (-1,-1), 6),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
    ]))
    return t

# ── Content builder ──────────────────────────────────────────────────────────
story = []

# ── COVER PAGE ───────────────────────────────────────────────────────────────
w_page, h_page = A4

# Title block
story.append(Spacer(1, 20*mm))
cover_title = Table([[Paragraph(
    "<font color='white'><b>UPPER LIMB</b></font>", 
    S("CT", fontSize=36, textColor=C_WHITE, alignment=TA_CENTER, leading=42))
]], colWidths=[A4[0]-36*mm])
cover_title.setStyle(TableStyle([
    ("BACKGROUND", (0,0),(-1,-1), C_NAVY),
    ("TOPPADDING",    (0,0),(-1,-1), 14),
    ("BOTTOMPADDING", (0,0),(-1,-1), 4),
    ("LEFTPADDING",   (0,0),(-1,-1), 10),
]))
story.append(cover_title)

cover_sub = Table([[Paragraph(
    "<font color='white'>Orthopaedic Examination Guide</font>",
    S("CS", fontSize=18, textColor=C_WHITE, alignment=TA_CENTER))
]], colWidths=[A4[0]-36*mm])
cover_sub.setStyle(TableStyle([
    ("BACKGROUND", (0,0),(-1,-1), C_TEAL),
    ("TOPPADDING",    (0,0),(-1,-1), 8),
    ("BOTTOMPADDING", (0,0),(-1,-1), 8),
    ("LEFTPADDING",   (0,0),(-1,-1), 10),
]))
story.append(cover_sub)

story.append(Spacer(1, 8*mm))

# Cover info box
cover_info = [
    ["JOINT", "CONDITIONS COVERED"],
    ["Shoulder", "Frozen shoulder, Rotator cuff tears, Dislocation, Impingement"],
    ["Elbow", "Tennis elbow, Golfer's elbow, Supracondylar fracture, OA"],
    ["Wrist", "Colles' fracture, Scaphoid fracture, De Quervain's"],
    ["Hand", "Carpal tunnel syndrome, Dupuytren's contracture"],
]
cw = [(A4[0]-36*mm)*0.25, (A4[0]-36*mm)*0.75]
ct = Table(cover_info, colWidths=cw)
ct.setStyle(TableStyle([
    ("BACKGROUND",    (0,0), (-1,0), C_TEAL),
    ("ROWBACKGROUNDS",(0,1), (-1,-1), [C_LTBLUE, C_WHITE]),
    ("TEXTCOLOR",     (0,0), (-1,0), C_WHITE),
    ("FONTNAME",      (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTNAME",      (0,1), (0,-1), "Helvetica-Bold"),
    ("FONTSIZE",      (0,0), (-1,-1), 9),
    ("GRID",          (0,0), (-1,-1), 0.5, HexColor("#AAAAAA")),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING",   (0,0), (-1,-1), 8),
]))
story.append(ct)
story.append(Spacer(1, 8*mm))

# Exam framework reminder
story.append(highlight_box(
    "<b>UNIVERSAL EXAMINATION SEQUENCE</b>  \u2192  "
    "<b>LOOK</b> (inspect) \u2192 <b>FEEL</b> (palpate) \u2192 <b>MOVE</b> (active \u2192 passive \u2192 resisted) \u2192 <b>SPECIAL TESTS</b> \u2192 <b>NEUROVASCULAR</b>",
    bg=C_MINT, border=C_GREEN
))
story.append(Spacer(1, 5*mm))
story.append(note("Sources: Bailey & Love's Short Practice of Surgery 28th Ed | Miller's Review of Orthopaedics 9th Ed | Campbell's Operative Orthopaedics 15th Ed 2026 | S Das Manual on Clinical Surgery 13th Ed"))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 1 – SHOULDER
# ═══════════════════════════════════════════════════════════════════════════
story += section_header("SECTION 1 — THE SHOULDER", "Glenohumeral joint examination & common conditions")

story += subsection("Anatomy Reminders")
story.append(bullet("Ball-and-socket joint — greatest ROM, least intrinsic stability"))
story.append(bullet("Rotator cuff: <b>S</b>upraspinatus, <b>I</b>nfraspinatus, <b>T</b>eres minor, <b>S</b>ubscapularis (SITS)"))
story.append(bullet("Pain anterolateral; referred pain from cervical spine, heart, mediastinum, diaphragm"))
story.append(bullet("Axillary nerve supplies deltoid + 'regimental badge area' of lateral arm"))
story.append(Spacer(1, 3*mm))

story += subsection("LOOK")
story.append(bullet("Strip to waist. Inspect front, side, back — compare both sides"))
story.append(bullet("Attitude: Clavicle fracture / anterior dislocation → patient supports flexed elbow with other hand"))
story.append(bullet("Deformity: Flattening = dislocation (greater tuberosity displaced medially); step deformity at ACJ"))
story.append(bullet("Muscle wasting: Deltoid wasting = axillary nerve palsy; supraspinous/infraspinous fossa wasting = rotator cuff"))
story.append(bullet("Scars: Anterior (deltopectoral) | Lateral (deltoid-splitting) | Posterior ports (arthroscopy)"))
story.append(Spacer(1, 3*mm))

story += subsection("FEEL")
story.append(bullet("Test 'regimental badge area' sensation (upper lateral arm) — loss = axillary nerve injury"))
story.append(bullet("Palpate: Sternoclavicular joint → clavicle → AC joint → acromion → coracoid → greater tuberosity → bicipital groove"))
story.append(bullet("Localised ACJ pain = acromioclavicular pathology; diffuse = glenohumeral or referred"))
story.append(Spacer(1, 3*mm))

story += subsection("MOVE")
story.append(bullet("Stabilise scapula: thumb on coracoid + fingers on scapular spine — prevents scapulothoracic compensation"))
story.append(bullet("Start: arms at sides, elbows extended, palms forward (anatomical position)"))
story.append(bullet("Note pain throughout range — painful arc 60°–120° = supraspinatus/impingement"))
story.append(Spacer(1, 2*mm))

rom_data = [
    ["Movement", "Normal Range", "Clinical Note"],
    ["Flexion", "0–180°", "Loss = adhesive capsulitis, GHJ OA"],
    ["Extension", "0–60°", ""],
    ["Abduction", "0–180°", "Painful arc 60–120° = impingement"],
    ["Adduction", "0–50°", ""],
    ["External Rotation", "0–60°", "FIRST lost in frozen shoulder"],
    ["Internal Rotation", "0–90°", "Test: thumb to spine level"],
]
story.append(make_table(rom_data[0], rom_data[1:], col_widths=[(A4[0]-36*mm)*0.28,(A4[0]-36*mm)*0.22,(A4[0]-36*mm)*0.50]))
story.append(Spacer(1, 4*mm))

story += subsection("SPECIAL TESTS — SHOULDER")
story.append(Spacer(1, 2*mm))

story += sub2("Impingement / Rotator Cuff")
imp_data = [
    ["Test", "Technique", "Positive Finding & Meaning"],
    ["Impingement sign (Neer)", "Passive forward flexion >90°", "Pain = subacromial impingement"],
    ["Hawkins' test", "Passive FF 90° + internal rotation", "Pain = impingement syndrome"],
    ["Jobe's test (Empty can)", "Resisted pronation/FF at 90° in scapular plane", "Pain/weakness = supraspinatus lesion"],
    ["Drop-arm test", "Arm placed in abduction then released", "Cannot maintain = supraspinatus rupture"],
    ["Hornblower sign", "Resisted ER at 90° abduction", "Pain = infraspinatus / teres minor lesion"],
    ["Lift-off test (Gerber)", "Arm in IR behind back; lift off", "Cannot lift = subscapularis tear"],
    ["Bear-hug test", "Hand on opposite shoulder; examiner tries to lift", "Cannot maintain = subscapularis lesion"],
    ["Belly-push test", "Elbow held forward with abduction pressure", "Cannot hold elbow forward = subscapularis"],
]
story.append(make_table(imp_data[0], imp_data[1:],
    col_widths=[(A4[0]-36*mm)*0.28,(A4[0]-36*mm)*0.35,(A4[0]-36*mm)*0.37]))
story.append(Spacer(1, 4*mm))

story += sub2("Instability Tests")
inst_data = [
    ["Test", "Technique", "Positive Finding & Meaning"],
    ["Apprehension test", "Supine: 90° abduction + ER", "Apprehension = anterior instability"],
    ["Relocation test", "Posterior force during apprehension", "Relief = anterior instability confirmed"],
    ["Load-and-shift test", "Ant/post force on humeral head", "Degree of translation = laxity"],
    ["Sulcus sign", "Inferior traction on arm at side", "Gap below acromion = inferior laxity"],
]
story.append(make_table(inst_data[0], inst_data[1:],
    col_widths=[(A4[0]-36*mm)*0.28,(A4[0]-36*mm)*0.35,(A4[0]-36*mm)*0.37]))
story.append(Spacer(1, 4*mm))

story += sub2("Labrum / Biceps Tests")
lab_data = [
    ["Test", "Technique", "Positive Finding & Meaning"],
    ["O'Brien (Active compression)", "10° adduction, 90° FF, max pronation; resist", "Pain = SLAP lesion / ACJ pathology"],
    ["Speed's test", "Resisted FF, elbow extended, forearm supinated", "Pain in bicipital groove = biceps tendinopathy"],
    ["Yergason's test", "Resisted supination with elbow at 90°", "Pain in groove = biceps tendinopathy / SLAP"],
]
story.append(make_table(lab_data[0], lab_data[1:],
    col_widths=[(A4[0]-36*mm)*0.28,(A4[0]-36*mm)*0.38,(A4[0]-36*mm)*0.34]))
story.append(Spacer(1, 3*mm))

story.append(alert("Always obtain X-rays before diagnosing frozen shoulder — exclude GHJ osteoarthritis and locked posterior dislocation (both cause selective ER loss)."))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 2 – SHOULDER CONDITIONS
# ═══════════════════════════════════════════════════════════════════════════
story += section_header("SECTION 2 — SHOULDER CONDITIONS")

story += subsection("Frozen Shoulder (Adhesive Capsulitis)")
story.append(bullet("Age 40–70 years; female predominance; nondominant side more common"))
story.append(bullet("Associations: Diabetes mellitus (disproportionately affected, worse outcomes), thyroid disease, post-breast/chest surgery, prolonged immobilisation"))
story.append(bullet("Pathology: Fibrosis of CHL and rotator interval capsule; type III collagen + myofibroblasts (resembles Dupuytren histology)"))
story.append(Spacer(1, 2*mm))

stage_data = [
    ["Stage", "Name", "Duration", "Features"],
    ["1", "Pre-adhesive", "Weeks–months", "Nocturnal pain; ROM initially preserved"],
    ["2", "Freezing", "3–9 months", "Pain + progressive ROM loss"],
    ["3", "Frozen", "9–15 months", "Stiffness dominates; pain decreases"],
    ["4", "Thawing", "15–24 months", "Gradual ROM recovery"],
]
story.append(make_table(stage_data[0], stage_data[1:],
    col_widths=[(A4[0]-36*mm)*0.08,(A4[0]-36*mm)*0.20,(A4[0]-36*mm)*0.22,(A4[0]-36*mm)*0.50]))
story.append(Spacer(1, 3*mm))

story.append(Paragraph("Key Examination Findings", sH3))
story.append(bullet("Global loss of all shoulder movements — active ROM = passive ROM"))
story.append(bullet("External rotation is FIRST and MOST affected movement"))
story.append(highlight_box(
    "<b>KEY DISTINGUISHER:</b>  Active ROM = Passive ROM \u2192 Frozen shoulder  |  Active &lt; Passive ROM \u2192 Rotator cuff tear",
    bg=C_LTBLUE, border=C_TEAL
))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("Investigations & Treatment", sH3))
frozen_rx = [
    ["Modality", "Detail"],
    ["X-ray", "Normal — mandatory to exclude GHJ OA and posterior dislocation"],
    ["Arthrography", "Reduced joint volume (<10 mL vs normal 35 mL); loss of axillary recess"],
    ["MRI", "Capsular thickening, CHL thickening, obliterated subcoracoid fat triangle"],
    ["Conservative (90%)", "NSAIDs + physiotherapy (pendulum/Codman exercises) + intraarticular steroid injection"],
    ["Distention arthrography", "Hydrodistention — inflates and stretches capsule"],
    ["Surgical", "Closed manipulation under anaesthesia; arthroscopic capsular release (if 12–16 wks conservative fails)"],
]
story.append(make_table(frozen_rx[0], frozen_rx[1:],
    col_widths=[(A4[0]-36*mm)*0.30,(A4[0]-36*mm)*0.70]))
story.append(Spacer(1, 5*mm))

story += subsection("Rotator Cuff Tears")
story.append(bullet("Supraspinatus most commonly torn (exits supraspinous fossa, passes under coracoacromial arch — 'critical zone' of poor vascularity)"))
story.append(bullet("Presentation: Painful arc, weakness on abduction/ER, nocturnal pain; may be acute (trauma) or degenerative (gradual)"))
story.append(bullet("Drop-arm test positive in complete supraspinatus rupture"))
story.append(bullet("No restriction of passive ROM — distinguishes from frozen shoulder"))
story.append(bullet("Investigations: X-ray (superior head migration in massive tear), Ultrasound (dynamic, good for tears), MRI (gold standard — size, retraction, fatty atrophy)"))
story.append(bullet("Treatment: Physiotherapy + subacromial steroid injection; arthroscopic/open cuff repair for full-thickness tears"))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 3 – ELBOW
# ═══════════════════════════════════════════════════════════════════════════
story += section_header("SECTION 3 — THE ELBOW", "Hinge joint examination & common conditions")

story += subsection("Anatomy Reminders")
story.append(bullet("Hinge (trochleoulnar) + pivot (radioulnar) joint combined"))
story.append(bullet("Normal carrying angle: 9–14° valgus (physiological cubitus valgus); greater in females"))
story.append(bullet("Hueter's triangle: Medial epicondyle + lateral epicondyle + olecranon tip = equilateral triangle at 90° flexion"))
story.append(bullet("Normal range: −5° (hyperextension) to 150° flexion | Pronation 70° | Supination 90°"))
story.append(Spacer(1, 3*mm))

story += subsection("LOOK")
story.append(bullet("Attitude: Elbow held in flexion after most injuries. Child with swollen flexed elbow = supracondylar fracture until proven otherwise"))
story.append(bullet("Inspect from FRONT: Carrying angle, position (extended/flexed, pronated/supinated)"))
story.append(bullet("From BEHIND: Olecranon prominence posteriorly"))
story.append(bullet("From THE SIDE: Anteroposterior broadening = posterior dislocation or supracondylar fracture"))
story.append(Spacer(1, 2*mm))
carrying_data = [
    ["Deformity", "Definition", "Common Cause", "Complication"],
    ["Cubitus valgus", "Increased carrying angle >15–20°", "Malunion lateral condyle fracture (child)", "Tardy ulnar nerve palsy"],
    ["Cubitus varus\n(gun-stock deformity)", "Reversed/decreased carrying angle", "Malunited supracondylar fracture", "Mainly cosmetic"],
]
story.append(make_table(carrying_data[0], carrying_data[1:],
    col_widths=[(A4[0]-36*mm)*0.25,(A4[0]-36*mm)*0.25,(A4[0]-36*mm)*0.27,(A4[0]-36*mm)*0.23]))
story.append(Spacer(1, 3*mm))

story += subsection("FEEL")
story.append(bullet("Cross-fluctuation test for joint effusion"))
story.append(bullet("Ulnar nerve: Roll under fingers between medial epicondyle and olecranon; assess distal ulnar sensation"))
story.append(bullet("Radial head: Palpate with thumb while pronating/supinating — feel for rotation, tenderness, irregularity"))
story.append(bullet("Springing the radius: Squeeze radius + ulna together distally → referred pain at upper radius = fracture head/neck radius"))
story.append(highlight_box(
    "<b>Hueter's Triangle Rule:</b> Equilateral triangle at 90° = preserved in <b>supracondylar fracture</b> "
    "(distal fragment moves as one). Triangle DISRUPTED in <b>posterior elbow dislocation</b> "
    "(olecranon displaced posteriorly relative to epicondyles).",
    bg=C_MINT, border=C_GREEN
))
story.append(Spacer(1, 3*mm))

story += subsection("MOVE")
story.append(bullet("Flexion–Extension: −5° to 150°"))
story.append(bullet("Pronation: 70° | Supination: 90° — tested with elbows at 90°"))
story.append(Spacer(1, 3*mm))

story += subsection("Elbow Conditions")
story += sub2("Lateral Epicondylitis (Tennis Elbow)")
story.append(bullet("Degenerative tendinopathy at origin of extensor carpi radialis brevis (ECRB) — NOT true inflammation"))
story.append(bullet("Peak: 5th decade; more common in non-athletes; risk factors: female, smoking, manual labour, statins"))
story.append(bullet("Mechanism: Repetitive supination/pronation with elbow near full extension"))
story.append(bullet("Tenderness: 5 mm distal and anterior to midpoint of lateral epicondyle"))
story.append(bullet("Pain: Exacerbated by resisted wrist dorsiflexion and forearm supination, gripping objects"))
story.append(Spacer(1, 2*mm))

te_tests = [
    ["Test", "Technique", "Positive"],
    ["Cozen's test", "Resisted wrist extension, elbow extended", "Pain at lateral epicondyle"],
    ["Mill's test", "Passive wrist flexion, elbow extended", "Pain at lateral epicondyle"],
    ["Middle finger test", "Resisted extension of middle finger", "Pain at ECRB origin (most specific for ECRB)"],
]
story.append(make_table(te_tests[0], te_tests[1:],
    col_widths=[(A4[0]-36*mm)*0.25,(A4[0]-36*mm)*0.43,(A4[0]-36*mm)*0.32]))
story.append(Spacer(1, 2*mm))
story.append(bullet("X-ray: Usually normal (occasionally calcific tendinitis). MRI: Tendon thickening, increased T1/T2 signal at ECRB"))
story.append(bullet("Treatment: Conservative (84–95% respond): rest, ice, counter-force brace, physio, steroid injection"))
story.append(bullet("Surgical: Débridement/release of ECRB origin (open or arthroscopic) if conservative fails at 6 months"))
story.append(Spacer(1, 3*mm))

story += sub2("Medial Epicondylitis (Golfer's Elbow)")
story.append(bullet("Flexor-pronator origin tendinopathy at medial epicondyle (flexor carpi radialis, pronator teres)"))
story.append(bullet("Tenderness at medial epicondyle; pain with resisted wrist flexion + forearm pronation"))
story.append(bullet("Must exclude ulnar nerve entrapment at elbow (coexists in ~60% of cases)"))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 4 – WRIST
# ═══════════════════════════════════════════════════════════════════════════
story += section_header("SECTION 4 — THE WRIST", "Examination and FOOSH injuries")

story += subsection("Anatomy Reminders")
story.append(bullet("Wrist ROM: Flexion 75–80° | Extension 70–75° | Radial deviation 15° | Ulnar deviation 30–40°"))
story.append(bullet("Normal parameters (X-ray): Volar tilt 11° | Radial inclination 22° | Radial height 12 mm"))
story.append(bullet("Lister's tubercle: Palpable on dorsal distal radius; 1 cm distal = scaphoid"))
story.append(bullet("Anatomical snuffbox: Between APL/EPB (radial border) and EPL (ulnar border) — SCAPHOID lies below"))
story.append(Spacer(1, 3*mm))

story += subsection("Colles' Fracture")
story.append(bullet("Transverse fracture of distal radius within 2.5 cm of wrist"))
story.append(bullet("Commonest fracture in adults >40 years; elderly osteoporotic women after FOOSH most typical"))
story.append(Spacer(1, 2*mm))

colles_data = [
    ["Feature", "Description"],
    ["Displacement (5Ds)", "Dorsal displacement, Dorsal angulation, radial Deviation, Dinner-fork Deformity, impacteD"],
    ["Examination", "Dinner-fork deformity on lateral view; radial deviation; local swelling and bruising"],
    ["X-ray (AP + Lateral)", "Confirm fracture; measure volar tilt, radial inclination, radial height"],
    ["Acceptable reduction", "Volar tilt ≥0°, radial inclination ≥15°, radial height shortening ≤3 mm"],
    ["Treatment", "Undisplaced: Below-elbow cast 6 wks. Displaced: Closed reduction (haematoma block or Bier's) + cast. Unstable: K-wires or volar locking plate (ORIF)"],
    ["Complications", "CRPS (Sudeck's atrophy), malunion, median nerve injury, EPL rupture, carpal tunnel syndrome"],
]
story.append(make_table(colles_data[0], colles_data[1:],
    col_widths=[(A4[0]-36*mm)*0.28,(A4[0]-36*mm)*0.72]))
story.append(Spacer(1, 5*mm))

story += subsection("Scaphoid Fracture")
story.append(alert("Most commonly MISSED fracture — 30% have normal initial X-ray. Normal X-ray does NOT exclude scaphoid fracture."))
story.append(bullet("Mechanism: FOOSH with wrist in dorsiflexion and radial deviation"))
story.append(bullet("Blood supply enters distally — proximal pole fractures risk avascular necrosis (AVN)"))
story.append(Spacer(1, 2*mm))

scaph_tests = [
    ["Clinical Test", "Technique", "Positive Finding"],
    ["Anatomical snuffbox tenderness", "Palpate dorsal snuffbox with wrist in ulnar deviation", "Tenderness = scaphoid # until proven otherwise"],
    ["Scaphoid tubercle tenderness", "Palpate volar tubercle at wrist crease", "Tenderness (more specific than snuffbox)"],
    ["Scaphoid compression test", "Axial compression along axis of thumb", "Pain at wrist"],
    ["Telescoping test", "Telescoping the thumb proximally", "Pain at scaphoid"],
]
story.append(make_table(scaph_tests[0], scaph_tests[1:],
    col_widths=[(A4[0]-36*mm)*0.30,(A4[0]-36*mm)*0.38,(A4[0]-36*mm)*0.32]))
story.append(Spacer(1, 3*mm))

scaph_rx = [
    ["Investigation", "Role"],
    ["X-ray (AP, lateral, scaphoid views)", "First line; may be NORMAL acutely — repeat at 10–14 days if clinical suspicion"],
    ["MRI", "Most sensitive and specific — detects fracture within 24–48 hours"],
    ["CT", "Best for assessing displacement and union"],
    ["Bone scan", "Sensitive but non-specific; use if MRI unavailable"],
]
story.append(make_table(scaph_rx[0], scaph_rx[1:],
    col_widths=[(A4[0]-36*mm)*0.38,(A4[0]-36*mm)*0.62]))
story.append(Spacer(1, 3*mm))

story += sub2("Treatment")
story.append(bullet("Undisplaced waist: Thumb spica cast 8–12 weeks"))
story.append(bullet("Displaced (>1 mm) or proximal pole: Surgical fixation (Herbert screw)"))
story.append(bullet("Non-union/AVN: Bone grafting + fixation; vascularised bone graft (1,2-ICSRA graft)"))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 5 – HAND
# ═══════════════════════════════════════════════════════════════════════════
story += section_header("SECTION 5 — THE HAND", "Carpal tunnel syndrome, Dupuytren's, De Quervain's")

story += subsection("Carpal Tunnel Syndrome (CTS)")
story.append(bullet("Most common entrapment neuropathy — median nerve compressed under flexor retinaculum"))
story.append(bullet("Anatomy: Carpal tunnel = carpal bones (3 sides) + transverse carpal ligament (floor). Contains 9 flexor tendons + median nerve"))
story.append(bullet("Epidemiology: More common in women; ~3% of adults; common in pregnancy"))
story.append(Spacer(1, 2*mm))

cts_aet = [
    ["Category", "Causes"],
    ["Inflammatory", "Rheumatoid arthritis, tenosynovitis (most common cause)"],
    ["Metabolic/Endocrine", "Hypothyroidism, diabetes mellitus, acromegaly, pregnancy"],
    ["Space-occupying", "Ganglion, lipoma, carpal fracture malunion, amyloidosis"],
    ["Occupation", "Repetitive wrist flexion/extension, vibrating tools"],
]
story.append(make_table(cts_aet[0], cts_aet[1:],
    col_widths=[(A4[0]-36*mm)*0.28,(A4[0]-36*mm)*0.72]))
story.append(Spacer(1, 3*mm))

story.append(Paragraph("Clinical Features", sH3))
story.append(bullet("Pain, numbness, paraesthesia in radial 3½ digits (thumb, index, middle, radial half of ring)"))
story.append(bullet("Worse at night and with repetitive hand motion — 'flick sign' (shaking hand relieves symptoms)"))
story.append(bullet("Thenar wasting = late sign indicating chronic compression"))
story.append(bullet("Weakness of thumb abduction (abductor pollicis brevis)"))
story.append(Spacer(1, 2*mm))

cts_tests = [
    ["Test", "Technique", "Sensitivity / Significance"],
    ["Tinel's sign", "Tap over carpal tunnel at wrist flexor retinaculum", "Paraesthesia in median nerve distribution"],
    ["Phalen's manoeuvre", "Wrist fully flexed for 60 seconds (dorsal surfaces back to back)", "Symptom reproduction — most specific"],
    ["Carpal compression test", "Direct pressure over tunnel for 30 seconds", "Most sensitive clinical test"],
    ["Reverse Phalen", "Wrists extended back to back", "Symptom reproduction"],
    ["Abductor pollicis brevis test", "Resisted thumb abduction against resistance", "Weakness = thenar denervation"],
]
story.append(make_table(cts_tests[0], cts_tests[1:],
    col_widths=[(A4[0]-36*mm)*0.27,(A4[0]-36*mm)*0.40,(A4[0]-36*mm)*0.33]))
story.append(Spacer(1, 3*mm))

story.append(Paragraph("Investigations & Treatment", sH3))
cts_rx = [
    ["Step", "Detail"],
    ["NCS / EMG", "Confirms diagnosis; prolonged sensory latency before motor latency; mandatory before surgery; 25% false-negative rate"],
    ["Conservative", "Night wrist splinting in neutral; activity modification; nerve gliding exercises; corticosteroid injection"],
    ["Surgical", "Carpal tunnel decompression — open or endoscopic division of flexor retinaculum. Equivalent long-term outcomes. Excellent results."],
    ["Indication for surgery", "Failed conservative measures OR thenar wasting (indicating muscle denervation)"],
]
story.append(make_table(cts_rx[0], cts_rx[1:],
    col_widths=[(A4[0]-36*mm)*0.28,(A4[0]-36*mm)*0.72]))
story.append(Spacer(1, 5*mm))

story += subsection("Dupuytren's Contracture")
story.append(bullet("Progressive palmar fascial fibrosis → flexion contracture (ring and little fingers most common)"))
story.append(bullet("Pathology: Myofibroblast proliferation, type III collagen — histologically similar to frozen shoulder capsule"))
story.append(bullet("Associations: Male sex, Northern European descent, diabetes, alcohol, phenytoin, vibration exposure, HIV"))
story.append(bullet("Examination: Palmar pitting/dimpling, palpable nodules along fascial bands, MCPj and PIPj flexion deformity"))
story.append(bullet("Hueston tabletop test: Cannot place palm flat on table = significant contracture"))
story.append(bullet("Treatment: Observation if mild | Needle fasciotomy, collagenase injection (Xiaflex) | Fasciectomy (surgical)"))
story.append(bullet("Surgery indicated: MCP contracture ≥30° OR any degree of PIP contracture"))
story.append(Spacer(1, 5*mm))

story += subsection("De Quervain's Tenosynovitis")
story.append(bullet("Stenosing tenosynovitis of 1st dorsal extensor compartment: APL (abductor pollicis longus) + EPB (extensor pollicis brevis)"))
story.append(bullet("Common in new mothers (lifting infant); repetitive pinch-grip activities"))
story.append(bullet("Tenderness over radial styloid and 1st dorsal compartment; crepitus on movement"))
story.append(highlight_box(
    "<b>Finkelstein's test:</b> Patient makes a fist with thumb inside fingers. "
    "Examiner passively ulnar deviates the wrist. "
    "Sharp pain at radial styloid = POSITIVE (De Quervain's).",
    bg=C_LTBLUE, border=C_TEAL
))
story.append(Spacer(1, 2*mm))
story.append(bullet("Treatment: Thumb spica splint + NSAIDs → corticosteroid injection → surgical release of 1st compartment"))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 6 – QUICK REFERENCE SUMMARY TABLE
# ═══════════════════════════════════════════════════════════════════════════
story += section_header("SECTION 6 — QUICK REFERENCE SUMMARY")

story.append(Spacer(1, 3*mm))

summary_data = [
    ["Condition", "Site", "Key Sign/Test", "Investigation", "1st-Line Tx", "Surgical Tx"],
    ["Frozen shoulder", "GHJ", "Equal active=passive loss; ER first", "X-ray (normal), MRI", "Physio, steroid inj", "Arthroscopic capsular release"],
    ["Rotator cuff tear", "Shoulder", "Drop-arm, painful arc, Jobe's", "MRI", "Physio, subacromial inj", "Arthroscopic repair"],
    ["Shoulder dislocation (ant)", "GHJ", "Flattening, anterior bulge", "X-ray AP + lateral", "Reduction (Kocher/Hippocratic)", "Latarjet / Bankart repair (recurrent)"],
    ["Tennis elbow", "Lateral epicondyle", "Cozen's, Mill's test", "Clinical ± MRI", "Brace, steroid inj", "ECRB release"],
    ["Golfer's elbow", "Medial epicondyle", "Resisted wrist flexion", "Clinical", "Brace, steroid inj", "Flexor-pronator release"],
    ["Supracondylar # humerus", "Elbow", "Posterior displacement; Hueter's intact", "X-ray", "MUA + K-wires", "ORIF if NV compromise"],
    ["Colles' fracture", "Distal radius", "Dinner-fork deformity", "X-ray", "Closed reduction + cast", "Volar locking plate ORIF"],
    ["Scaphoid fracture", "Wrist", "Snuffbox tenderness", "MRI (gold)", "Thumb spica 8–12 wks", "Herbert screw"],
    ["Carpal tunnel", "Wrist", "Phalen's, Tinel's, thenar wasting", "NCS/EMG", "Night splint, steroid inj", "CTD (open/endoscopic)"],
    ["Dupuytren's", "Palm", "Tabletop test", "Clinical", "Observation if mild", "Fasciectomy / Collagenase"],
    ["De Quervain's", "Radial styloid", "Finkelstein's test", "Clinical ± USS", "Splint + NSAID + inj", "1st compartment release"],
]
story.append(make_table(
    summary_data[0], summary_data[1:],
    col_widths=[
        (A4[0]-36*mm)*0.16,
        (A4[0]-36*mm)*0.10,
        (A4[0]-36*mm)*0.20,
        (A4[0]-36*mm)*0.16,
        (A4[0]-36*mm)*0.18,
        (A4[0]-36*mm)*0.20,
    ]
))
story.append(Spacer(1, 5*mm))

story += subsection("Classic Examination Mnemonics & Key Rules")

rules = [
    ("Regimental badge area", "Upper lateral arm sensation → axillary nerve. Loss after shoulder dislocation = axillary nerve palsy."),
    ("Active = Passive ROM loss", "Frozen shoulder (capsular contracture)"),
    ("Active < Passive ROM loss", "Rotator cuff tear (muscle/tendon discontinuity)"),
    ("Hueter's triangle INTACT", "Supracondylar fracture (distal fragment moves as one unit)"),
    ("Hueter's triangle DISRUPTED", "Posterior elbow dislocation (olecranon displaced)"),
    ("Anatomical snuffbox tenderness", "Scaphoid fracture until proven otherwise — treat + investigate even with normal X-ray"),
    ("Normal X-ray ≠ No fracture", "Scaphoid: 30% missed on initial films. Get MRI if clinically suspected."),
    ("Equal active = passive ROM", "Frozen shoulder — capsular disease"),
    ("Dinner-fork deformity", "Colles' fracture — dorsal displacement + angulation of distal radius"),
    ("Radial 3½ digits + night sx", "Carpal tunnel syndrome (median nerve)"),
    ("Ring + little finger contracture", "Dupuytren's contracture (ulnar palmar fascia)"),
    ("Finkelstein positive", "De Quervain's stenosing tenosynovitis"),
]

for rule, explanation in rules:
    story.append(bullet(f"<b>{rule}:</b> {explanation}"))

story.append(Spacer(1, 5*mm))
story.append(highlight_box(
    "<b>NEUROVASCULAR CHECK — Always at end of upper limb examination:</b>  "
    "Radial pulse | Capillary refill | Sensation in median / ulnar / radial nerve distributions | "
    "Motor function of intrinsic hand muscles",
    bg=C_MINT, border=C_GREEN
))

story.append(Spacer(1, 8*mm))
story.append(Paragraph(
    "Sources: Bailey & Love's Short Practice of Surgery 28th Ed | Miller's Review of Orthopaedics 9th Ed | "
    "Campbell's Operative Orthopaedics 15th Ed 2026 | S Das Manual on Clinical Surgery 13th Ed | "
    "Textbook of Family Medicine 9th Ed",
    sNote
))

# ── Build ────────────────────────────────────────────────────────────────────
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print("PDF generated:", OUTPUT)
Running Command

cd /home/daytona/workspace/upper-limb-guide && python generate_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/upper-limb-guide/Upper_Limb_Exam_Guide.pdf

Your PDF guide is ready! Here's the download link:

Upper Limb Exam Guide

PDF Document · PDF


What's inside the guide (6 sections, ~34 KB):
SectionContent
CoverContents overview + universal exam sequence reminder
Section 1 — Shoulder ExamLook/Feel/Move with ROM table + full special tests tables (impingement, instability, labrum/biceps)
Section 2 — Shoulder ConditionsFrozen shoulder (stages table, distinguisher box), Rotator cuff tears
Section 3 — ElbowLook/Feel/Move + Hueter's triangle rule + Tennis elbow / Golfer's elbow with special tests
Section 4 — WristColles' fracture (5 Ds), Scaphoid fracture (clinical tests + imaging choice)
Section 5 — HandCTS (aetiology table, tests, treatment ladder), Dupuytren's, De Quervain's + Finkelstein's
Section 6 — Quick ReferenceMaster summary table of all 11 conditions + 12 classic clinical rules/mnemonics
The document has a navy header/footer on every page, colour-coded alert boxes for high-yield rules, and alternating-row tables throughout for easy scanning during revision.

Lower limb

Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Reading File
Finding Sources
Finding Sources
Reading File
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Reading File
Writing File

~/upper-limb-guide/generate_lower_limb_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_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.lib.colors import HexColor

OUTPUT = "/home/daytona/workspace/upper-limb-guide/Lower_Limb_Exam_Guide.pdf"

# ── Colour palette ──────────────────────────────────────────────────────────
C_NAVY   = HexColor("#1B3A5C")
C_TEAL   = HexColor("#1A7A8A")
C_LTBLUE = HexColor("#D6EAF8")
C_MINT   = HexColor("#E8F8F5")
C_GOLD   = HexColor("#F0A500")
C_WHITE  = colors.white
C_BLACK  = colors.black
C_LGREY  = HexColor("#F4F6F7")
C_DGREY  = HexColor("#555555")
C_RED    = HexColor("#C0392B")
C_GREEN  = HexColor("#1E8449")

def on_page(canvas, doc):
    canvas.saveState()
    w, h = A4
    canvas.setFillColor(C_NAVY)
    canvas.rect(0, h - 22*mm, w, 22*mm, fill=1, stroke=0)
    canvas.setFillColor(C_WHITE)
    canvas.setFont("Helvetica-Bold", 10)
    canvas.drawString(15*mm, h - 13*mm, "LOWER LIMB ORTHOPAEDIC EXAMINATION GUIDE")
    canvas.setFont("Helvetica", 9)
    canvas.drawRightString(w - 15*mm, h - 13*mm, "Clinical Reference")
    canvas.setFillColor(C_NAVY)
    canvas.rect(0, 0, w, 12*mm, fill=1, stroke=0)
    canvas.setFillColor(C_WHITE)
    canvas.setFont("Helvetica", 8)
    canvas.drawString(15*mm, 4*mm, "Sources: Bailey & Love 28th Ed | Miller's Review of Orthopaedics 9th Ed | Campbell's Operative Orthopaedics 15th Ed 2026 | S Das 13th Ed")
    canvas.drawRightString(w - 15*mm, 4*mm, f"Page {doc.page}")
    canvas.restoreState()

doc = SimpleDocTemplate(
    OUTPUT, pagesize=A4,
    topMargin=28*mm, bottomMargin=18*mm,
    leftMargin=18*mm, rightMargin=18*mm,
    title="Lower Limb Orthopaedic Examination Guide",
    author="Orris Medical Reference",
)

styles = getSampleStyleSheet()

def S(name, parent="Normal", **kwargs):
    return ParagraphStyle(name, parent=styles[parent], **kwargs)

sH1    = S("sH1","Heading1",fontSize=14,textColor=C_WHITE,spaceAfter=4,spaceBefore=2,leading=18)
sH2    = S("sH2","Heading2",fontSize=12,textColor=C_NAVY,spaceAfter=3,spaceBefore=8,leading=16)
sH3    = S("sH3","Heading3",fontSize=10,textColor=C_TEAL,spaceAfter=2,spaceBefore=6,leading=14)
sBody  = S("sBody","Normal",fontSize=9,textColor=C_BLACK,spaceAfter=3,leading=13,alignment=TA_JUSTIFY)
sBullet= S("sBullet","Normal",fontSize=9,textColor=C_BLACK,spaceAfter=2,leading=12,leftIndent=12)
sNote  = S("sNote","Normal",fontSize=8,textColor=C_DGREY,spaceAfter=2,leading=11,leftIndent=6,fontName="Helvetica-Oblique")
sTH    = S("sTH","Normal",fontSize=8,textColor=C_WHITE,fontName="Helvetica-Bold",leading=11)
sTD    = S("sTD","Normal",fontSize=8,textColor=C_BLACK,leading=11)
sAlert = S("sAlert","Normal",fontSize=9,textColor=C_RED,fontName="Helvetica-Bold",spaceAfter=3,leading=12)
sGreen = S("sGreen","Normal",fontSize=9,textColor=C_GREEN,fontName="Helvetica-Bold",spaceAfter=3,leading=12)

def section_header(title, subtitle=""):
    w = A4[0] - 36*mm
    data = [[Paragraph(title, sH1)]]
    t = Table(data, colWidths=[w])
    t.setStyle(TableStyle([
        ("BACKGROUND",(0,0),(-1,-1),C_NAVY),
        ("TOPPADDING",(0,0),(-1,-1),6),("BOTTOMPADDING",(0,0),(-1,-1),6),
        ("LEFTPADDING",(0,0),(-1,-1),10),("RIGHTPADDING",(0,0),(-1,-1),10),
    ]))
    items = [t]
    if subtitle:
        items.append(Paragraph(subtitle, sNote))
    items.append(Spacer(1,3*mm))
    return items

def subsection(title):
    return [Paragraph(title, sH2), HRFlowable(width="100%",thickness=1,color=C_TEAL,spaceAfter=3)]

def sub2(title):
    return [Paragraph(title, sH3)]

def bullet(text):
    return Paragraph(f"\u2022  {text}", sBullet)

def note(text):
    return Paragraph(f"<i>{text}</i>", sNote)

def alert(text):
    return Paragraph(f"&#9888;  {text}", sAlert)

def tip(text):
    return Paragraph(f"&#10003;  {text}", sGreen)

def make_table(headers, rows, col_widths=None):
    w = A4[0] - 36*mm
    if col_widths is None:
        n = len(headers)
        col_widths = [w/n]*n
    table_data = [[Paragraph(h, sTH) for h in headers]]
    for r in rows:
        table_data.append([Paragraph(str(c), sTD) for c in r])
    t = Table(table_data, colWidths=col_widths, repeatRows=1)
    t.setStyle(TableStyle([
        ("BACKGROUND",(0,0),(-1,0),C_NAVY),
        ("ROWBACKGROUNDS",(0,1),(-1,-1),[C_WHITE,C_LGREY]),
        ("GRID",(0,0),(-1,-1),0.4,HexColor("#CCCCCC")),
        ("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4),
        ("LEFTPADDING",(0,0),(-1,-1),6),("RIGHTPADDING",(0,0),(-1,-1),6),
        ("VALIGN",(0,0),(-1,-1),"TOP"),
    ]))
    return t

def hbox(text, bg=C_LTBLUE, border=C_TEAL):
    w = A4[0] - 36*mm
    t = Table([[Paragraph(text, sBody)]], colWidths=[w])
    t.setStyle(TableStyle([
        ("BACKGROUND",(0,0),(-1,-1),bg),
        ("LINEABOVE",(0,0),(-1,0),2,border),("LINEBELOW",(0,-1),(-1,-1),2,border),
        ("LEFTPADDING",(0,0),(-1,-1),10),("RIGHTPADDING",(0,0),(-1,-1),10),
        ("TOPPADDING",(0,0),(-1,-1),6),("BOTTOMPADDING",(0,0),(-1,-1),6),
    ]))
    return t

# ────────────────────────────────────────────────────────────────────────────
story = []

# ── COVER ────────────────────────────────────────────────────────────────────
story.append(Spacer(1,18*mm))
ct = Table([[Paragraph("<font color='white'><b>LOWER LIMB</b></font>",
    S("CT",fontSize=36,textColor=C_WHITE,alignment=TA_CENTER,leading=42))]],
    colWidths=[A4[0]-36*mm])
ct.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),C_NAVY),
    ("TOPPADDING",(0,0),(-1,-1),14),("BOTTOMPADDING",(0,0),(-1,-1),4),
    ("LEFTPADDING",(0,0),(-1,-1),10)]))
story.append(ct)
cs = Table([[Paragraph("<font color='white'>Orthopaedic Examination Guide</font>",
    S("CS",fontSize=18,textColor=C_WHITE,alignment=TA_CENTER))]],
    colWidths=[A4[0]-36*mm])
cs.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),C_TEAL),
    ("TOPPADDING",(0,0),(-1,-1),8),("BOTTOMPADDING",(0,0),(-1,-1),8),
    ("LEFTPADDING",(0,0),(-1,-1),10)]))
story.append(cs)
story.append(Spacer(1,8*mm))

cover_info = [
    ["JOINT","CONDITIONS COVERED"],
    ["Hip","NOF fracture, Dislocation, OA, Perthes', SCFE, Developmental dysplasia"],
    ["Knee","ACL/PCL tears, Meniscal tears, OA, MCL/LCL, Patellofemoral syndrome"],
    ["Ankle","Ankle sprain (lateral ligament), Achilles tendon rupture"],
    ["Foot","Hallux valgus, Pes planus, Pes cavus, Plantar fasciitis, Metatarsalgia"],
]
cw = [(A4[0]-36*mm)*0.20,(A4[0]-36*mm)*0.80]
ci = Table(cover_info, colWidths=cw)
ci.setStyle(TableStyle([
    ("BACKGROUND",(0,0),(-1,0),C_TEAL),
    ("ROWBACKGROUNDS",(0,1),(-1,-1),[C_LTBLUE,C_WHITE]),
    ("TEXTCOLOR",(0,0),(-1,0),C_WHITE),
    ("FONTNAME",(0,0),(-1,0),"Helvetica-Bold"),
    ("FONTNAME",(0,1),(0,-1),"Helvetica-Bold"),
    ("FONTSIZE",(0,0),(-1,-1),9),
    ("GRID",(0,0),(-1,-1),0.5,HexColor("#AAAAAA")),
    ("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5),
    ("LEFTPADDING",(0,0),(-1,-1),8),
]))
story.append(ci)
story.append(Spacer(1,8*mm))
story.append(hbox(
    "<b>UNIVERSAL EXAMINATION SEQUENCE</b>  \u2192  "
    "<b>LOOK</b> (inspect) \u2192 <b>FEEL</b> (palpate) \u2192 "
    "<b>MOVE</b> (active \u2192 passive \u2192 resisted) \u2192 "
    "<b>SPECIAL TESTS</b> \u2192 <b>GAIT &amp; NEUROVASCULAR</b>",
    bg=C_MINT, border=C_GREEN
))
story.append(Spacer(1,5*mm))
story.append(note("Sources: Bailey & Love's Short Practice of Surgery 28th Ed | Miller's Review of Orthopaedics 9th Ed | "
    "Campbell's Operative Orthopaedics 15th Ed 2026 | S Das Manual on Clinical Surgery 13th Ed | "
    "Rheumatology 2022 Elsevier"))
story.append(PageBreak())

# ════════════════════════════════════════════════════════════════════════════
# SECTION 1 – HIP
# ════════════════════════════════════════════════════════════════════════════
story += section_header("SECTION 1 — THE HIP",
    "Ball-and-socket joint — examine spine, abdomen, pelvis, groin, thigh & consider gynaecological causes in women")

story += subsection("Anatomy Reminders")
story.append(bullet("Ball-and-socket synovial joint: femoral head + acetabulum"))
story.append(bullet("Key bony landmarks: ASIS, iliac crest, greater trochanter, ischial tuberosity, pubic tubercle"))
story.append(bullet("Femoral artery: palpated at midpoint of inguinal ligament (ASIS to pubic tubercle)"))
story.append(bullet("Nerve supply: femoral nerve (L2–L4), obturator nerve (L2–L4), sciatic nerve (L4–S3)"))
story.append(Spacer(1,3*mm))

story += subsection("GAIT (Observe First — Before the Patient Lies Down)")
story.append(bullet("<b>Trendelenburg gait (gluteus medius lurch):</b> Pelvis drops to contralateral side during stance; trunk leans to ipsilateral side to compensate. Causes: hip OA, NOF fracture, superior gluteal nerve palsy, DDH"))
story.append(bullet("<b>Antalgic gait:</b> Short stance phase on painful side — minimises time weight-bearing on affected hip"))
story.append(bullet("<b>Scissors gait:</b> Spastic hip adductors — knees cross midline (cerebral palsy)"))
story.append(Spacer(1,3*mm))

story += subsection("LOOK (Standing → Supine)")
story.append(Paragraph("<b>Standing — inspect front, side, back:</b>", sBody))
story.append(bullet("Pelvic tilt: One ASIS higher than the other (true/apparent leg length discrepancy)"))
story.append(bullet("Rotational deformity: foot progression angle (in-toeing vs. out-toeing)"))
story.append(bullet("Gluteal wasting: abductor weakness; scoliosis secondary to pelvic tilt; lumbar lordosis"))
story.append(Paragraph("<b>Supine:</b>", sBody))
story.append(bullet("Scars and sinuses (previous surgery, septic arthritis)"))
story.append(bullet("Rotational deformity: patellae pointing outward/inward"))
story.append(bullet("Fixed adduction deformity (OA, cerebral palsy) → apparent shortening due to pelvic tilt"))
story.append(Spacer(1,3*mm))

story += subsection("FEEL")
story.append(bullet("Greater trochanter: tenderness = trochanteric bursitis or abductor enthesopathy"))
story.append(bullet("ASIS, iliac crest, pubic tubercle (bony landmarks for measurements)"))
story.append(bullet("Inguinal ligament: lymphadenopathy, hernia"))
story.append(bullet("Femoral pulse: palpate at midinguinal point. Absent in posterior dislocation (head of femur no longer supports artery from behind)"))
story.append(bullet("Posterior hip: ischial tuberosity tenderness (hamstring origin)"))
story.append(Spacer(1,3*mm))

story += subsection("MOVE")
story.append(Paragraph("<b>Passive Hip Movements (normal ranges):</b>", sBody))
hip_rom = [
    ["Movement","Normal Range","How to Test"],
    ["Flexion","0–120°","Supine; flex hip+knee. Modified Thomas' test for fixed flexion."],
    ["Extension","0–10°","Prone; lift leg off couch. (Or Thomas' test)"],
    ["Abduction","0–45°","Supine; stabilise contralateral ASIS; slide leg out"],
    ["Adduction","0–30°","Supine; cross leg over midline"],
    ["Internal rotation","0–45°","Hip+knee at 90°; swing foot outward"],
    ["External rotation","0–45°","Hip+knee at 90°; swing foot inward"],
]
story.append(make_table(hip_rom[0],hip_rom[1:],
    col_widths=[(A4[0]-36*mm)*0.22,(A4[0]-36*mm)*0.18,(A4[0]-36*mm)*0.60]))
story.append(Spacer(1,2*mm))
story.append(alert("First movement lost in hip OA: Internal rotation — always test this!"))
story.append(Spacer(1,3*mm))

story += subsection("SPECIAL TESTS — HIP")
story.append(Spacer(1,2*mm))
hip_tests = [
    ["Test","Technique","Positive Finding & Meaning"],
    ["Thomas' test\n(fixed flexion deformity)","Patient supine. Flex both hips fully. Hold one hip flexed (flattens lumbar lordosis). Allow other leg to drop to couch.",
     "Leg unable to reach couch = fixed flexion deformity of that hip. Angle = degree of FFD"],
    ["Trendelenburg test\n(abductor integrity)","Patient stands on one leg. Examiner stands behind.",
     "Pelvis drops on contralateral (unsupported) side = POSITIVE. Weak abductors on standing leg (gluteus medius)"],
    ["Leg length measurement\n(True LLD)","ASIS to medial malleolus",
     "Difference indicates true shortening (femoral/tibial). Compare both sides."],
    ["Apparent LLD","Xiphisternum to medial malleolus",
     "Difference due to pelvic tilt/adduction contracture, not actual bone shortening"],
    ["Bryant's triangle","Patient supine. Vertical line from ASIS. Horizontal line from GT to meet it. Measure horizontal limb.",
     "Shortened horizontal limb = upward displacement of GT (NOF #, posterior dislocation)"],
    ["Nelaton's line","Line from ASIS to ischial tuberosity in lateral decubitus",
     "GT lies above line = upward displacement (NOF #, dislocation)"],
    ["FABER/Patrick test","Flex, Abduct, Externally Rotate hip (figure-of-4 position)",
     "Anterior hip pain = hip joint pathology. Posterior pain = SI joint / L5–S1 referred"],
    ["FADIR/Impingement test","Flex hip 90°, Adduct, Internally Rotate",
     "Anterior groin pain = femoroacetabular impingement (FAI) or labral tear"],
    ["Stinchfield test","Active straight-leg raise ~20 cm against mild resistance",
     "Anterior hip pain = hip joint pathology (contracts iliopsoas and compresses joint)"],
    ["Ober's test","Lateral decubitus: lower leg flexed. Extend and abduct upper leg then let drop.",
     "Leg fails to adduct below horizontal = tight iliotibial band (ITB)"],
    ["Log roll (Roll test)","Supine: rotate leg in/out gently at calf level",
     "Stiffness or pain = hip joint irritability (useful in acute hip pathology)"],
]
story.append(make_table(hip_tests[0],hip_tests[1:],
    col_widths=[(A4[0]-36*mm)*0.22,(A4[0]-36*mm)*0.38,(A4[0]-36*mm)*0.40]))
story.append(PageBreak())

# ════════════════════════════════════════════════════════════════════════════
# SECTION 2 – HIP CONDITIONS
# ════════════════════════════════════════════════════════════════════════════
story += section_header("SECTION 2 — HIP CONDITIONS")

story += subsection("Hip Osteoarthritis (OA)")
story.append(bullet("Most common joint disease. Primary (idiopathic) or secondary (DDH, Perthes', SCFE, trauma)"))
story.append(bullet("Presentation: Groin pain (referred to knee), stiffness worse in morning/rest, antalgic or Trendelenburg gait"))
story.append(Paragraph("<b>Examination Findings:</b>", sBody))
story.append(bullet("Antalgic/Trendelenburg gait"))
story.append(bullet("Fixed flexion deformity (Thomas' test positive)"))
story.append(bullet("Internal rotation FIRST lost; then all movements restricted"))
story.append(bullet("Shortening of limb (advanced OA with superior/posterior head migration)"))
story.append(Paragraph("<b>Investigations:</b>", sBody))
story.append(bullet("X-ray (AP pelvis + lateral frog-leg): Loss of joint space (superolateral), subchondral sclerosis, osteophytes, subchondral cysts (LOSS)"))
story.append(bullet("MRI: Early cartilage loss, avascular necrosis, labral tears"))
story.append(Paragraph("<b>Treatment:</b>", sBody))
oa_rx = [
    ["Stage","Treatment"],
    ["Mild","Analgesia (paracetamol, NSAIDs), physiotherapy, weight loss, activity modification, walking aids"],
    ["Moderate","Intraarticular steroid injection, hyaluronic acid injection, bracing"],
    ["Severe / Failed conservative","Total Hip Replacement (THR) — gold standard; excellent long-term outcomes"],
]
story.append(make_table(oa_rx[0],oa_rx[1:],col_widths=[(A4[0]-36*mm)*0.18,(A4[0]-36*mm)*0.82]))
story.append(Spacer(1,5*mm))

story += subsection("Neck of Femur (NOF) Fracture")
story.append(alert("Elderly patient lying helplessly with externally rotated, shortened lower limb = NOF fracture until proven otherwise"))
story.append(Spacer(1,2*mm))
story.append(bullet("Commonest serious fracture in elderly; high morbidity/mortality (1-year mortality ~30%)"))
story.append(bullet("Mechanism: Low-energy fall in osteoporotic patients; high-energy trauma in young"))
story.append(Paragraph("<b>Garden Classification (Subcapital):</b>", sBody))
garden = [
    ["Grade","Description","Blood Supply"],
    ["I","Incomplete/impacted — valgus impaction","Usually intact"],
    ["II","Complete, non-displaced","Usually intact"],
    ["III","Complete, partial displacement — head partially rotated","Disrupted"],
    ["IV","Complete, full displacement — head rotated, trabeculae not aligned","Disrupted — HIGH AVN risk"],
]
story.append(make_table(garden[0],garden[1:],
    col_widths=[(A4[0]-36*mm)*0.12,(A4[0]-36*mm)*0.55,(A4[0]-36*mm)*0.33]))
story.append(Spacer(1,3*mm))
story.append(Paragraph("<b>Examination Findings:</b>", sBody))
story.append(bullet("Lying helpless; cannot weight bear; extreme pain on any movement"))
story.append(bullet("Lower limb: <b>shortened, externally rotated</b> (sternomastoid + iliacus/iliopsoas retract and rotate fragment)"))
story.append(bullet("Bony tenderness on attempted rotation of shaft of femur (transcervical/subcapital)"))
story.append(bullet("Bryant's triangle: horizontal limb shortened (upward GT displacement)"))
story.append(bullet("Nelaton's line: GT above line"))
story.append(Paragraph("<b>Investigations:</b>", sBody))
story.append(bullet("X-ray (AP pelvis + lateral): Always obtain both views. Shenton's line disrupted."))
story.append(bullet("MRI: Most sensitive — detects occult fractures within 24–48 hours (superior to bone scan)"))
story.append(Paragraph("<b>Treatment (operative for almost all):</b>", sBody))
nof_rx = [
    ["Fracture Type","Patient","Treatment"],
    ["Intracapsular undisplaced (Garden I/II)","Young + elderly","DHS or cannulated screws"],
    ["Intracapsular displaced (Garden III/IV)","Elderly (>65)","Hemiarthroplasty (cemented Austin Moore/Thompson) or THR"],
    ["Intracapsular displaced (Garden III/IV)","Young (<65)","Reduction + internal fixation (preserve head)"],
    ["Extracapsular (intertrochanteric)","Any age","Dynamic Hip Screw (DHS)"],
    ["Subtrochanteric","Any","Intramedullary nail (e.g. PFNA)"],
]
story.append(make_table(nof_rx[0],nof_rx[1:],
    col_widths=[(A4[0]-36*mm)*0.34,(A4[0]-36*mm)*0.22,(A4[0]-36*mm)*0.44]))
story.append(Spacer(1,5*mm))

story += subsection("Hip Dislocation")
story.append(Paragraph("<b>Posterior Dislocation (90% of hip dislocations):</b>", sBody))
story.append(bullet("Mechanism: Dashboard injury (knee hits dashboard forcing femoral head posteriorly) — high-energy RTA"))
story.append(bullet("Attitude: <b>Flexion, adduction, internal rotation</b> of the thigh"))
story.append(bullet("Limb: Shortened; fixed in above posture"))
story.append(bullet("Femoral pulse: Difficult to palpate (head absent from acetabulum)"))
story.append(bullet("Complications: Sciatic nerve injury (10–20%), avascular necrosis of femoral head, post-traumatic OA"))
story.append(Spacer(1,2*mm))
story.append(Paragraph("<b>Anterior Dislocation (rare):</b>", sBody))
story.append(bullet("Attitude: <b>Extension, abduction, external rotation</b> of the thigh"))
story.append(bullet("Femoral head palpable in groin (pubic/obturator type)"))
story.append(bullet("Treatment: Emergency closed reduction under GA; post-reduction CT to check for fragment"))
story.append(PageBreak())

# ════════════════════════════════════════════════════════════════════════════
# SECTION 3 – KNEE
# ════════════════════════════════════════════════════════════════════════════
story += section_header("SECTION 3 — THE KNEE",
    "Three compartments: medial, lateral, patellofemoral | Ligaments: ACL, PCL, MCL, LCL, posterolateral corner")

story += subsection("Anatomy Reminders")
story.append(bullet("Synovial hinge joint (+ slight rotation in last 15° of extension — 'screw-home mechanism')"))
story.append(bullet("ACL: Primary restraint to anterior tibial translation (resists anterior draw + rotational instability)"))
story.append(bullet("PCL: Primary restraint to posterior tibial translation (90°)"))
story.append(bullet("MCL (medial): Resists valgus stress + external rotation forces"))
story.append(bullet("LCL (lateral): Resists varus stress"))
story.append(bullet("Menisci: Shock absorption, load distribution, joint stability, lubrication"))
story.append(bullet("Extensor mechanism: Quadriceps → quadriceps tendon → patella → patellar tendon → tibial tuberosity"))
story.append(Spacer(1,3*mm))

story += subsection("LOOK")
story.append(bullet("<b>Standing:</b> Alignment — varus ('bow-legged', medial compartment OA) or valgus ('knock-knee'); measure intermalleolar/intercondylar distance"))
story.append(bullet("Fixed flexion deformity (FFD) from the side; recurvatum (hyperextension)"))
story.append(bullet("Quadriceps wasting — universal sign of chronic knee pathology"))
story.append(bullet("Gait: Antalgic (OA), varus thrust (medial compartment collapse), high-stepping (foot drop)"))
story.append(bullet("<b>Supine:</b> Swelling pattern — prepatellar bursa, Baker's cyst (popliteal), diffuse effusion"))
story.append(bullet("Scars (previous arthroscopy, ligament reconstruction, TKR)"))
story.append(Spacer(1,3*mm))

story += subsection("FEEL")
story.append(Paragraph("<b>Effusion Tests:</b>", sBody))
story.append(bullet("<b>Fluid displacement (stroke/bulge test):</b> Stroke fluid from medial side into suprapatellar pouch; press pouch inferiorly; fluid returns to medial side as a visible bulge — SMALL effusion"))
story.append(bullet("<b>Patellar tap test:</b> Compress fluid into joint; tap patella; floats off the trochlea — LARGE effusion"))
story.append(Spacer(1,2*mm))
story.append(Paragraph("<b>Palpation Points:</b>", sBody))
story.append(bullet("Joint line (medial and lateral) — tenderness = meniscal pathology or compartment OA"))
story.append(bullet("Tibial tuberosity — Osgood-Schlatter disease (adolescents); patellar tendon insertion"))
story.append(bullet("Inferior pole of patella — patellar tendinopathy ('jumper's knee')"))
story.append(bullet("Medial epicondyle of femur — MCL origin"))
story.append(bullet("Popliteal fossa — Baker's cyst (communicating with joint via posterior capsule); popliteal aneurysm"))
story.append(Spacer(1,3*mm))

story += subsection("MOVE")
story.append(bullet("Flexion–Extension: −5° (hyperextension) to 135°"))
story.append(bullet("<b>Lag test (extensor mechanism):</b> Ask patient to lift straight leg off bed (SLR). Then flex knee and try to straighten against gravity. Cannot re-straighten = extensor mechanism failure"))
story.append(bullet("Fixed flexion deformity: Patient prone — measure angle of FFD or height of heel off couch"))
story.append(Spacer(1,3*mm))

story += subsection("SPECIAL TESTS — KNEE")
story.append(Spacer(1,2*mm))

story += sub2("Cruciate Ligaments")
cr_tests = [
    ["Test","Technique","Positive Finding"],
    ["Lachman test (best for ACL)","Knee at 15–30° flexion; pull proximal tibia anteriorly",
     "Excessive anterior translation with soft/absent end-point = ACL rupture. Most sensitive ACL test."],
    ["Anterior draw test (ACL)","Knee at 90°; sit on foot; draw tibia forward. Grade I <5 mm, II 5–10 mm, III >10 mm",
     "Anterior translation = ACL injury. Also check for posterior sag before drawing."],
    ["Posterior draw test (PCL)","Knee at 90°; push tibia posteriorly. >10 mm = combined PCL + PLC",
     "Posterior translation = PCL rupture"],
    ["Posterior sag sign (PCL)","Knees flexed 90°; look from side at tibial tuberosity level",
     "Posterior sag of tibia = PCL rupture"],
    ["Pivot shift test (ACL)","Valgus + internal rotation force on flexed knee; then extend",
     "Clunk as lateral tibial plateau reduces at ~30° = rotatory instability (ACL deficiency)"],
]
story.append(make_table(cr_tests[0],cr_tests[1:],
    col_widths=[(A4[0]-36*mm)*0.27,(A4[0]-36*mm)*0.40,(A4[0]-36*mm)*0.33]))
story.append(Spacer(1,3*mm))

story += sub2("Collateral Ligaments")
col_tests = [
    ["Test","Technique","Positive Finding"],
    ["Valgus stress test (MCL)","Apply valgus force at 0° and 30° flexion",
     "Laxity/pain at 30° = MCL tear. Laxity at 0° = complete MCL + cruciate injury."],
    ["Varus stress test (LCL)","Apply varus force at 0° and 30° flexion",
     "Laxity/pain at 30° = LCL tear. Laxity at 0° = severe posterolateral corner injury."],
]
story.append(make_table(col_tests[0],col_tests[1:],
    col_widths=[(A4[0]-36*mm)*0.27,(A4[0]-36*mm)*0.40,(A4[0]-36*mm)*0.33]))
story.append(Spacer(1,3*mm))

story += sub2("Menisci")
men_tests = [
    ["Test","Technique","Positive Finding"],
    ["Joint line tenderness","Flex knee 90°; palpate joint line with thumb + index",
     "Tenderness = most sensitive clinical test for meniscal tear"],
    ["McMurray's test","Supine. Fully flex knee. Externally rotate + extend (medial); internally rotate + extend (lateral).",
     "Palpable/audible click or pain at joint line = meniscal tear"],
    ["Thessaly test","Patient stands on one leg, flexes knee 20°, rotates body medially + laterally 3 times",
     "Joint line pain or sensation of locking = meniscal tear (good sensitivity/specificity)"],
    ["Apley grind test","Prone; flex knee 90°; compress + rotate (grind) then distract + rotate",
     "Pain with compression + rotation = meniscal tear; pain with distraction = ligament injury"],
]
story.append(make_table(men_tests[0],men_tests[1:],
    col_widths=[(A4[0]-36*mm)*0.27,(A4[0]-36*mm)*0.40,(A4[0]-36*mm)*0.33]))
story.append(Spacer(1,3*mm))

story += sub2("Patellofemoral Joint")
pf_tests = [
    ["Test","Technique","Positive Finding"],
    ["Patellar apprehension\n(Fairbank's) test","Attempt to push patella laterally with knee extended. Also at 30° flexion.",
     "Patient contracts quads / grabs examiner / complains of pain = lateral patellar instability"],
    ["J-sign / Patellar tracking","Patient extends knee slowly from 90° — observe patella path",
     "Lateral jump at end of extension = maltracking (VMO weakness)"],
    ["Clarke's test (patellar grind)","Push patella distally; patient tenses quads",
     "Pain = patellofemoral syndrome / chondromalacia patellae"],
]
story.append(make_table(pf_tests[0],pf_tests[1:],
    col_widths=[(A4[0]-36*mm)*0.27,(A4[0]-36*mm)*0.40,(A4[0]-36*mm)*0.33]))
story.append(PageBreak())

# ════════════════════════════════════════════════════════════════════════════
# SECTION 4 – KNEE CONDITIONS
# ════════════════════════════════════════════════════════════════════════════
story += section_header("SECTION 4 — KNEE CONDITIONS")

story += subsection("ACL Rupture")
story.append(bullet("Most common serious knee ligament injury; young athletic population (pivoting sports)"))
story.append(bullet("Mechanism: Non-contact deceleration + valgus collapse + internal rotation (most common); direct blow"))
story.append(bullet("Presentation: Haemarthrosis within 2 hours, 'pop' heard, immediate inability to continue sport"))
story.append(Paragraph("<b>Examination:</b>", sBody))
story.append(bullet("Lachman test positive (most sensitive, best performed acutely)"))
story.append(bullet("Anterior draw test positive (less sensitive acutely — hamstring guarding at 90°)"))
story.append(bullet("Pivot shift test positive (pathognomonic of rotatory instability but difficult acutely)"))
story.append(Paragraph("<b>Investigations:</b>", sBody))
story.append(bullet("X-ray: Segond fracture (avulsion of lateral tibial plateau = pathognomonic for ACL rupture)"))
story.append(bullet("MRI: Gold standard — shows ligament signal change/discontinuity, bone bruising, meniscal tears"))
story.append(Paragraph("<b>Treatment:</b>", sBody))
story.append(bullet("Conservative: Physiotherapy, quadriceps strengthening — for low-demand patients"))
story.append(bullet("Surgical: ACL reconstruction (hamstring/patellar tendon/quadriceps tendon graft) — for young, active patients or those with instability; arthroscopic"))
story.append(Spacer(1,5*mm))

story += subsection("Meniscal Tear")
story.append(bullet("Medial meniscus more commonly torn than lateral (less mobile; attached to MCL)"))
story.append(bullet("Mechanism: Twisting injury in young; degenerative in elderly"))
story.append(bullet("Presentation: Joint line pain, swelling, locking (bucket-handle tear), giving way"))
story.append(Paragraph("<b>Examination:</b>", sBody))
story.append(bullet("Joint line tenderness (most sensitive)"))
story.append(bullet("McMurray's test, Apley grind test positive"))
story.append(bullet("Locked knee (cannot achieve full extension) = bucket-handle meniscal tear"))
story.append(Paragraph("<b>Investigations:</b>", sBody))
story.append(bullet("MRI: Grade I = intrameniscal signal; Grade II = signal not reaching surface; Grade III = tear reaching articular surface (surgical)"))
story.append(Paragraph("<b>Treatment:</b>", sBody))
story.append(bullet("Conservative: RICE, physiotherapy for stable peripheral tears"))
story.append(bullet("Surgical: Arthroscopic meniscal repair (peripheral vascular zone — red zone) or partial meniscectomy (avascular — white zone)"))
story.append(Spacer(1,5*mm))

story += subsection("Knee Osteoarthritis")
story.append(bullet("Most common: medial compartment (varus knee → medial compartment loading)"))
story.append(bullet("Presentation: Insidious onset pain, crepitus, stiffness, deformity, functional limitation"))
story.append(Paragraph("<b>Examination:</b>", sBody))
story.append(bullet("Varus/valgus deformity; fixed flexion deformity; quadriceps wasting"))
story.append(bullet("Joint line tenderness; bony enlargement (osteophytes); crepitus on movement"))
story.append(bullet("Reduced ROM — flexion most affected"))
story.append(Paragraph("<b>Investigations:</b>", sBody))
story.append(bullet("Weight-bearing X-ray: Loss of joint space (medial > lateral), subchondral sclerosis, osteophytes, varus/valgus alignment (Kellgren-Lawrence grading)"))
story.append(Paragraph("<b>Treatment:</b>", sBody))
knee_oa_rx = [
    ["Stage","Treatment"],
    ["Mild–moderate","Analgesia, NSAIDs, physiotherapy, weight loss, activity modification, knee brace (unloader brace for unicompartmental OA)"],
    ["Moderate","Intraarticular steroid injection; hyaluronic acid injection"],
    ["Severe","Total Knee Replacement (TKR) or Unicompartmental Knee Replacement (UKR) — for isolated compartment disease in lower-demand patients"],
]
story.append(make_table(knee_oa_rx[0],knee_oa_rx[1:],
    col_widths=[(A4[0]-36*mm)*0.18,(A4[0]-36*mm)*0.82]))
story.append(PageBreak())

# ════════════════════════════════════════════════════════════════════════════
# SECTION 5 – ANKLE & FOOT
# ════════════════════════════════════════════════════════════════════════════
story += section_header("SECTION 5 — ANKLE & FOOT",
    "Hindfoot (talus, calcaneus) | Midfoot (navicular, cuboid, cuneiforms) | Forefoot (metatarsals, phalanges)")

story += subsection("Anatomy Reminders")
story.append(bullet("Ankle (talocrural joint): Mortise joint — tibia, fibula, talus. Plantarflexion/dorsiflexion."))
story.append(bullet("Subtalar joint: Inversion/eversion of hindfoot"))
story.append(bullet("Lateral ligament complex: ATFL (anterior talofibular) + CFL (calcaneofibular) + PTFL (posterior talofibular)"))
story.append(bullet("ATFL: Most commonly torn in lateral ankle sprain (plantarflexion + inversion mechanism)"))
story.append(bullet("Medial deltoid ligament: Strong; rarely torn in isolation"))
story.append(bullet("Achilles tendon: Gastrocnemius + soleus → calcaneal insertion. 'Watershed zone' 2–6 cm above insertion"))
story.append(Spacer(1,3*mm))

story += subsection("LOOK (Standing → Supine)")
story.append(Paragraph("<b>Standing (weight-bearing assessment):</b>", sBody))
story.append(bullet("Overall limb alignment: Pelvic obliquity → LLD → knee valgus/varus → foot posture"))
story.append(bullet("Hindfoot (from behind): Achilles + calcaneus angle. Normal heel valgus 5–7°. Too many toes sign (>2 toes visible from behind = pes planus + forefoot abduction)"))
story.append(bullet("Medial longitudinal arch (from side): Absent = pes planus (flat foot); Exaggerated = pes cavus (high arch)"))
story.append(bullet("Forefoot: Hallux valgus (bunion), hallux rigidus; hammer/claw/mallet toe deformities"))
story.append(Spacer(1,2*mm))
toe_table = [
    ["Deformity","MTPj","PIPj","DIPj"],
    ["Claw toe","Hyperextension","Flexion","Flexion"],
    ["Hammer toe","Normal","Flexion","Extension or flexion"],
    ["Mallet toe","Normal","Normal","Flexion"],
    ["Hallux valgus","Valgus (lateral deviation)","Normal","—"],
]
story.append(make_table(toe_table[0],toe_table[1:],
    col_widths=[(A4[0]-36*mm)*0.28,(A4[0]-36*mm)*0.24,(A4[0]-36*mm)*0.24,(A4[0]-36*mm)*0.24]))
story.append(Spacer(1,3*mm))
story.append(Paragraph("<b>Gait:</b>", sBody))
story.append(bullet("High-stepping gait = foot drop (common peroneal nerve palsy, L4 radiculopathy)"))
story.append(bullet("Antalgic gait = ankle/foot joint pain; short propulsive phase = forefoot pain"))
story.append(Paragraph("<b>Footwear inspection:</b>", sBody))
story.append(bullet("Normal wear: posterolateral heel (heel strike) + under big toe ball (toe-off)"))
story.append(bullet("Medial heel wear = hindfoot valgus/pes planus; lateral = hindfoot varus/pes cavus"))
story.append(Spacer(1,3*mm))

story += subsection("FEEL")
story.append(bullet("Skin: Reduced sensation in glove-and-stocking distribution = diabetes peripheral neuropathy"))
story.append(bullet("Pulses: Dorsalis pedis (dorsum of foot) + posterior tibial (behind medial malleolus)"))
story.append(bullet("Medial malleolus, lateral malleolus, base of 5th metatarsal, navicular: Specific bony tenderness points"))
story.append(bullet("Ottawa Rules tender points: Posterior 6 cm of fibula/tibia; base 5th MT; navicular → X-ray required"))
story.append(bullet("Achilles tendon: Palpate for defect, tenderness 2–6 cm above insertion (watershed zone)"))
story.append(bullet("Plantar fascia: Tenderness at calcaneal origin (plantar fasciitis)"))
story.append(Spacer(1,3*mm))

story += subsection("MOVE")
ankle_rom = [
    ["Movement","Joint","Normal Range"],
    ["Dorsiflexion","Talocrural","0–20°"],
    ["Plantarflexion","Talocrural","0–50°"],
    ["Inversion","Subtalar","0–35°"],
    ["Eversion","Subtalar","0–15°"],
    ["Toe extension/flexion","MTP/IP joints","Individually assessed"],
]
story.append(make_table(ankle_rom[0],ankle_rom[1:],
    col_widths=[(A4[0]-36*mm)*0.30,(A4[0]-36*mm)*0.30,(A4[0]-36*mm)*0.40]))
story.append(Spacer(1,3*mm))

story += subsection("SPECIAL TESTS — ANKLE & FOOT")
ankle_tests = [
    ["Test","Technique","Positive Finding & Meaning"],
    ["Anterior draw test (ATFL)","Stabilise distal tibia; pull heel anteriorly in slight plantarflexion",
     "Anterior translation of talus > 3–5 mm (or > other side) = ATFL tear"],
    ["Talar tilt test (CFL)","Invert heel with ankle in neutral; compare with other side",
     "Increased tilt = CFL tear (combined ATFL + CFL = severe lateral ligament complex injury)"],
    ["Thompson (Simmonds') test\n(Achilles tendon integrity)","Patient prone, knee at 90°. Squeeze calf (gastrocnemius bulk).",
     "No plantarflexion = POSITIVE = complete Achilles tendon rupture"],
    ["Single heel rise test","Stand on one foot; rise up onto tiptoe",
     "Unable to rise = tibialis posterior dysfunction / Achilles weakness"],
    ["Silfverskiold test","Dorsiflexion measured with knee extended vs. flexed",
     "Improved DF with knee flexed = gastrocnemius tightness (not combined gastrosoleus)"],
    ["Ottawa ankle rules","Bony tenderness at: posterior 6 cm fibula/tibia; base 5th MT; navicular",
     "Any positive point = X-ray required to exclude fracture"],
]
story.append(make_table(ankle_tests[0],ankle_tests[1:],
    col_widths=[(A4[0]-36*mm)*0.25,(A4[0]-36*mm)*0.38,(A4[0]-36*mm)*0.37]))
story.append(PageBreak())

# ════════════════════════════════════════════════════════════════════════════
# SECTION 6 – ANKLE/FOOT CONDITIONS
# ════════════════════════════════════════════════════════════════════════════
story += section_header("SECTION 6 — ANKLE & FOOT CONDITIONS")

story += subsection("Lateral Ankle Sprain")
story.append(bullet("Most common musculoskeletal injury. Inversion + plantarflexion mechanism"))
story.append(bullet("Lateral ligament complex: ATFL (first), then CFL, then PTFL (most severe)"))
story.append(Paragraph("<b>Examination:</b>", sBody))
story.append(bullet("Swelling + bruising over lateral malleolus + ATFL territory"))
story.append(bullet("Anterior draw test + talar tilt test positive (acute = difficult due to guarding)"))
story.append(bullet("Apply Ottawa rules — X-ray if bony tenderness present"))
story.append(Paragraph("<b>Treatment:</b>", sBody))
story.append(bullet("RICE in acute phase; early functional rehabilitation; ankle brace"))
story.append(bullet("Chronic instability: Bröstrom repair (anatomical ligament reconstruction)"))
story.append(Spacer(1,5*mm))

story += subsection("Achilles Tendon Rupture")
story.append(alert("Thompson's test: Absence of plantarflexion on calf squeeze = complete Achilles rupture"))
story.append(bullet("Peak age: 30–50 years; 'weekend warriors'; fluoroquinolone use increases risk"))
story.append(bullet("Mechanism: Sudden explosive push-off (squash, tennis, basketball)"))
story.append(Paragraph("<b>Examination:</b>", sBody))
story.append(bullet("Sudden pain ('felt like being shot/kicked')"))
story.append(bullet("Palpable gap in tendon 2–6 cm above insertion (watershed zone)"))
story.append(bullet("Thompson's (Simmonds') test POSITIVE — most important clinical test"))
story.append(bullet("Patient can weakly plantarflex using long toe flexors (do not be falsely reassured)"))
story.append(Paragraph("<b>Investigations:</b>", sBody))
story.append(bullet("USS: Confirms tear, gap size, apposition in equinus"))
story.append(bullet("MRI: Detailed anatomy, partial vs. complete"))
story.append(Paragraph("<b>Treatment:</b>", sBody))
story.append(bullet("Non-operative: Functional bracing in equinus (progressive rehabilitation) — similar outcomes to surgery in some studies"))
story.append(bullet("Surgical: End-to-end repair — preferred in young, active patients; lower re-rupture rate"))
story.append(Spacer(1,5*mm))

story += subsection("Foot Conditions Summary")
foot_conds = [
    ["Condition","Typical Patient","Key Finding","Treatment"],
    ["Plantar fasciitis","Middle-aged, overweight, runners","Heel pain worst in morning 1st steps; tenderness at calcaneal origin of plantar fascia","Stretching, orthotics, steroid injection, ESWT"],
    ["Hallux valgus (bunion)","Middle-aged women; tight shoes","Lateral deviation of hallux; medial prominence; MTPj bursa","Shoes modification; osteotomy (scarf/chevron) if symptomatic"],
    ["Hallux rigidus","Adults 30–60","Stiff, painful 1st MTPj; dorsal osteophyte; reduced dorsiflexion","Stiff-soled shoes, orthotics; 1st MTPj fusion or cheilectomy"],
    ["Pes planus (flat foot)","All ages","Collapsed medial arch; too many toes sign; tibialis posterior tenderness","Physiotherapy, orthotics; corrective surgery for rigid flat foot"],
    ["Pes cavus","Neurological cause (CMT, spina bifida)","High arch; clawing of toes; calluses under metatarsal heads","Assess neurological cause; orthotics; corrective osteotomy"],
    ["Morton's neuroma","Middle-aged women","Burning/shooting pain 3rd–4th web space; Mulder's click","Wide shoes, metatarsal dome pad, steroid injection; surgical excision"],
    ["Ankle OA","Post-traumatic (recurrent sprains/fractures)","Reduced ankle ROM; joint line tenderness; varus/valgus deformity","Physiotherapy, bracing; ankle fusion (arthrodesis) or total ankle replacement"],
]
story.append(make_table(foot_conds[0],foot_conds[1:],
    col_widths=[(A4[0]-36*mm)*0.18,(A4[0]-36*mm)*0.18,(A4[0]-36*mm)*0.31,(A4[0]-36*mm)*0.33]))
story.append(PageBreak())

# ════════════════════════════════════════════════════════════════════════════
# SECTION 7 – QUICK REFERENCE SUMMARY
# ════════════════════════════════════════════════════════════════════════════
story += section_header("SECTION 7 — QUICK REFERENCE SUMMARY")
story.append(Spacer(1,3*mm))

summary = [
    ["Condition","Site","Attitude/Deformity","Key Test","Investigation","Treatment"],
    ["Hip OA","Hip","Fixed flexion (Thomas'+)","IR first lost","X-ray: LOSS","Analgesia → THR"],
    ["NOF fracture","Hip","Short, ER, helpless","Bryant's triangle short","X-ray ± MRI","DHS/Hemiarthroplasty/THR"],
    ["Post. dislocation hip","Hip","Flex, adduct, IR","Head in buttock; posterior","X-ray (AP + lateral)","Urgent closed reduction"],
    ["Ant. dislocation hip","Hip","Extend, abduct, ER","Head in groin","X-ray","Closed reduction"],
    ["ACL rupture","Knee","Haemarthrosis","Lachman + pivot shift","MRI","Physio / ACL recon"],
    ["PCL rupture","Knee","Posterior sag","Posterior draw","MRI","Bracing / PCL recon"],
    ["Meniscal tear","Knee","Joint line pain","McMurray, joint line TTP","MRI","Repair or partial meniscectomy"],
    ["Knee OA","Knee","Varus; FFD","Crepitus, reduced ROM","WB X-ray","Analgesia → TKR/UKR"],
    ["Lat. ankle sprain","ATFL/CFL","Swelling lateral malleolus","Anterior draw, talar tilt","X-ray if Ottawa +","RICE, rehab, brace"],
    ["Achilles rupture","Tendo-Achilles","Palpable gap","Thompson + (no PF)","USS/MRI","Functional brace / repair"],
    ["Plantar fasciitis","Heel","Morning pain","Calcaneal origin TTP","Clinical ± USS","Stretching, steroid inj"],
    ["Hallux valgus","1st MTPj","Lateral hallux deviation","Bunion; MTPj ROM","X-ray (WB)","Shoes; osteotomy"],
]
story.append(make_table(summary[0],summary[1:],
    col_widths=[
        (A4[0]-36*mm)*0.18,
        (A4[0]-36*mm)*0.08,
        (A4[0]-36*mm)*0.19,
        (A4[0]-36*mm)*0.18,
        (A4[0]-36*mm)*0.16,
        (A4[0]-36*mm)*0.21,
    ]))
story.append(Spacer(1,5*mm))

story += subsection("Classic Rules & Mnemonics")
rules = [
    ("<b>Trendelenburg gait</b>", "Pelvis drops CONTRALATERAL to weak abductor. Trunk leans IPSILATERAL to compensate."),
    ("<b>Thomas' test positive</b>", "Fixed flexion deformity of hip — hip cannot reach neutral extension."),
    ("<b>First movement lost in hip OA</b>", "Internal rotation."),
    ("<b>NOF fracture attitude</b>", "Shortened, externally rotated lower limb — helpless on floor."),
    ("<b>Posterior hip dislocation attitude</b>", "Flexion + adduction + internal rotation (FAIR)."),
    ("<b>Anterior hip dislocation attitude</b>", "Extension + abduction + external rotation."),
    ("<b>Haemarthrosis within 2 hours</b>", "ACL rupture, osteochondral fracture, peripheral meniscal tear (vascular zone), tibial plateau fracture."),
    ("<b>Lachman test</b>", "Most sensitive clinical test for ACL rupture. Perform at 15–30° flexion."),
    ("<b>Fluid displacement test</b>", "Small effusion. Patellar tap: large effusion."),
    ("<b>Joint line tenderness</b>", "Most sensitive clinical test for meniscal tear."),
    ("<b>Thompson's test positive</b>", "No plantarflexion on calf squeeze = complete Achilles rupture."),
    ("<b>Too many toes sign</b>", "Forefoot abduction + hindfoot valgus = pes planus."),
    ("<b>Ottawa ankle rules</b>", "Bony tenderness posterior fibula/tibia, base 5th MT, or navicular → X-ray."),
    ("<b>Segond fracture</b>", "Lateral tibial plateau avulsion on X-ray = pathognomonic ACL rupture."),
    ("<b>Shenton's line disrupted</b>", "Hip fracture or dislocation (smooth arc from inferior femoral neck to superior obturator foramen)."),
]
for rule, explanation in rules:
    story.append(bullet(f"{rule}: {explanation}"))

story.append(Spacer(1,5*mm))
story.append(hbox(
    "<b>NEUROVASCULAR CHECK — Always at end of lower limb examination:</b>  "
    "Femoral + popliteal + dorsalis pedis + posterior tibial pulses | Capillary refill | "
    "Sensation in femoral / obturator / sciatic (common peroneal + tibial) distributions | "
    "Motor function: hip flexion (L1–L2), knee extension (L3–L4), dorsiflexion (L4), plantarflexion (S1–S2)",
    bg=C_MINT, border=C_GREEN
))
story.append(Spacer(1,8*mm))
story.append(note(
    "Sources: Bailey & Love's Short Practice of Surgery 28th Ed | Miller's Review of Orthopaedics 9th Ed | "
    "Campbell's Operative Orthopaedics 15th Ed 2026 | S Das Manual on Clinical Surgery 13th Ed | "
    "Rheumatology 2-Volume Set 2022 Elsevier"
))

# ── Build ────────────────────────────────────────────────────────────────────
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print("PDF generated:", OUTPUT)
Running Command

cd /home/daytona/workspace/upper-limb-guide && python generate_lower_limb_pdf.py…

Running Command

ls -lh /home/daytona/workspace/upper-limb-guide/

Your Lower Limb PDF guide is ready!

Lower Limb Exam Guide

PDF Document · PDF


Here's the full clinical write-up covered in the guide:

LOWER LIMB ORTHOPAEDIC DISEASES WITH EXAMINATION

PART 1: THE HIP

Anatomy Reminders

Ball-and-socket synovial joint. Key landmarks: ASIS, iliac crest, greater trochanter, ischial tuberosity. Femoral artery is palpated at the midinguinal point (midpoint between ASIS and pubic tubercle). Always examine the spine, abdomen, pelvis, groin, and thigh together - and consider gynaecological causes in women.

Gait Assessment (Before the Patient Lies Down)

GaitDescriptionCause
Trendelenburg gaitPelvis drops to contralateral side; trunk leans ipsilateralWeak gluteus medius (hip OA, NOF#, DDH, superior gluteal nerve palsy)
Antalgic gaitShort stance phase on affected sidePain of any cause
Scissors gaitKnees cross midlineSpastic hip adductors (cerebral palsy)

LOOK

Standing (front, side, back):
  • Pelvic tilt - one ASIS higher than other
  • Rotational deformity (in-toeing/out-toeing)
  • Lumbar lordosis (compensates for hip flexion deformity)
  • Gluteal wasting; secondary scoliosis
Supine:
  • Fixed adduction deformity (severe OA, cerebral palsy) → apparent shortening from pelvic tilt
  • Rotational posture of the limb

FEEL

  • Greater trochanter tenderness = trochanteric bursitis / abductor enthesopathy
  • ASIS, iliac crest, pubic tubercle (for measurements)
  • Femoral pulse (absent/diminished in posterior dislocation - femoral head no longer supporting the artery)
  • Inguinal region: lymphadenopathy, hernia

MOVE

MovementNormalNote
Flexion0–120°Modified Thomas' test
Extension0–10°Prone
Abduction0–45°Stabilise opposite ASIS
Adduction0–30°Cross over midline
Internal rotation0–45°Hip+knee at 90°; swing foot out
External rotation0–45°Swing foot in
First movement lost in hip OA = Internal rotation (always test this)

SPECIAL TESTS - HIP

TestTechniquePositive Meaning
Thomas' testHold one hip fully flexed; other leg drops to couchLeg cannot reach couch = fixed flexion deformity; angle = degree of FFD
Trendelenburg testStand on one leg; examiner stands behindPelvis drops to unsupported side = positive = weak abductors on standing leg
True leg length (ASIS → medial malleolus)Tape measureDifference = true shortening (bone)
Apparent leg length (xiphisternum → medial malleolus)Tape measureDifference = pelvic tilt/adduction contracture
Bryant's triangleVertical from ASIS + horizontal from GT; measure horizontal limbShortened = upward GT displacement (NOF#, dislocation)
Nelaton's lineASIS to ischial tuberosity lineGT above line = upward displacement
FABER/Patrick testFigure-of-4 positionAnterior hip pain = hip joint; posterior pain = SI joint/L5-S1
FADIR/Impingement testFlex 90° + adduct + IRAnterior groin pain = FAI or labral tear
Stinchfield testResisted SLR ~20 cmAnterior hip pain = hip joint pathology
Ober's testLateral decubitus; extend and abduct upper leg; let dropCannot adduct = tight ITB

HIP CONDITIONS

NOF Fracture

Classic picture: Elderly patient lying helplessly with shortened, externally rotated lower limb.
Garden Classification (Subcapital):
  • Garden I: Incomplete/impacted — usually intact blood supply
  • Garden II: Complete, non-displaced — usually intact
  • Garden III: Complete, partial displacement — blood supply disrupted
  • Garden IV: Complete, full displacement — HIGH AVN risk
Deformity explained: Iliopsoas pulls the shaft into flexion + ER; the shortened limb results from upward migration of the proximal fragment.
Treatment:
  • Garden I/II: DHS or cannulated screws
  • Garden III/IV elderly: Hemiarthroplasty (Austin Moore/Thompson) or THR
  • Garden III/IV young: Reduction + internal fixation (preserve head)
  • Extracapsular (intertrochanteric): Dynamic Hip Screw (DHS)
  • Subtrochanteric: Intramedullary nail (PFNA)

Hip Dislocation

TypeAttitudeComplication
Posterior (90%)Flexion, adduction, internal rotationSciatic nerve injury (10-20%), AVN, post-traumatic OA
AnteriorExtension, abduction, external rotationFemoral nerve/artery injury

PART 2: THE KNEE

Anatomy

  • ACL: primary restraint to anterior tibial translation and rotational instability
  • PCL: primary restraint to posterior tibial translation (at 90° flexion)
  • MCL: resists valgus stress
  • LCL: resists varus stress
  • Medial meniscus: less mobile (attached to MCL) - more commonly torn

LOOK

  • Alignment: Varus ('bow-legged', medial compartment OA) or Valgus ('knock-knee', lateral/PFj OA)
  • Quadriceps wasting - universal sign of chronic knee pathology
  • Fixed flexion deformity (from side) or recurvatum (hyperextension)
  • Gait: antalgic, varus thrust, high-stepping

FEEL

Effusion Tests:
  • Fluid displacement (stroke test): Stroke medial side fluid into suprapatellar pouch → press pouch → fluid returns to medial side = SMALL effusion
  • Patellar tap test: Compress fluid, push patella down - it floats = LARGE effusion
Palpation:
  • Joint line (medial + lateral): tenderness = meniscal pathology or compartment OA
  • Tibial tuberosity: Osgood-Schlatter (adolescents)
  • Inferior patellar pole: patellar tendinopathy
  • Popliteal fossa: Baker's cyst

SPECIAL TESTS - KNEE

Cruciate Ligaments

TestTechniqueSignificance
Lachman testKnee 15-30°; pull proximal tibia anteriorlyAnterior translation + soft end-point = ACL rupture. Most sensitive ACL test.
Anterior drawKnee 90°; draw tibia forward; grade I/II/IIIACL injury (less sensitive acutely)
Posterior drawKnee 90°; push tibia posteriorlyPCL rupture
Posterior sag signKnees flexed 90°; look from sidePosterior sag = PCL rupture
Pivot shiftValgus + IR while extendingClunk = rotatory instability (ACL deficiency); pathognomonic

Collateral Ligaments

TestStressPositive
Valgus stress (MCL)At 30° and 0°Laxity at 30° = MCL; at 0° = MCL + cruciate
Varus stress (LCL)At 30° and 0°Laxity at 30° = LCL; at 0° = posterolateral corner

Menisci

TestTechniquePositive
Joint line tendernessFlex 90°; palpate joint lineMost sensitive test for meniscal tear
McMurray's testFully flex → ER + extend (medial); IR + extend (lateral)Click/pain at joint line
Thessaly testStand on one leg, knee 20° flexed, rotate bodyJoint line pain = meniscal tear
Apley grindProne; compression + rotation vs. distraction + rotationCompression pain = meniscus; distraction pain = ligament

Patellofemoral Joint

TestPositive Meaning
Patellar apprehension (Fairbank's)Lateral instability (pushes patella laterally at 0° and 30°)
J-signMaltracking (lateral jump on last degrees of extension)
Clarke's testPatellofemoral syndrome / chondromalacia patellae

KNEE CONDITIONS

ACL Rupture

  • Mechanism: Non-contact deceleration + valgus + IR; squash, football, skiing
  • Haemarthrosis within 2 hours + 'pop' + immediate disability
  • Segond fracture on X-ray = lateral tibial plateau avulsion = pathognomonic for ACL rupture
  • MRI: gold standard
  • Treatment: Physio (low-demand) or ACL reconstruction (young, active, instability)

Meniscal Tear

  • Medial > lateral (less mobile)
  • Bucket-handle tear → locked knee (cannot fully extend)
  • MRI: Grade III = tear reaching articular surface = surgical
  • Treatment: Repair (red zone, peripheral) or partial meniscectomy (white zone, avascular)

Knee OA

  • Medial compartment most common (varus knee)
  • Kellgren-Lawrence grading on weight-bearing X-ray
  • Treatment: conservative → TKR (gold standard) or UKR (unicompartmental, isolated disease)

PART 3: ANKLE & FOOT

Anatomy

  • ATFL: first torn in lateral ankle sprain (plantarflexion + inversion)
  • Achilles watershed zone: 2–6 cm above insertion = site of rupture
  • Ottawa ankle rules: posterior 6 cm fibula/tibia + base 5th MT + navicular = X-ray if tender

LOOK

  • Too many toes sign (from behind): forefoot abduction + hindfoot valgus = pes planus
  • Medial arch collapse = pes planus; exaggerated arch = pes cavus
  • Hallux valgus; hammer/claw/mallet toe deformities (table above in guide)
Foot deformities:
DeformityMTPjPIPjDIPj
Claw toeHyperextensionFlexionFlexion
Hammer toeNormalFlexionFlexion
Mallet toeNormalNormalFlexion
Hallux valgusValgusNormal-
Causes of pes planus: Normal variant, hyperlaxity (Marfan's), tarsal coalition, tibialis posterior dysfunction
Causes of pes cavus: Spina bifida, Charcot-Marie-Tooth disease, Charcot foot, post-compartment syndrome (Volkmann's)

SPECIAL TESTS - ANKLE

TestTechniquePositive
Anterior draw testPull heel anteriorly in slight plantarflexion>3-5 mm anterior translation = ATFL tear
Talar tilt testInvert heel in neutralIncreased tilt = CFL tear
Thompson's (Simmonds') testSqueeze calf (prone, knee 90°)No plantarflexion = complete Achilles rupture
Single heel rise testRise on tiptoeCannot rise = tibialis posterior dysfunction
Silfverskiold testDorsiflexion with knee extended vs. flexedImproved with knee flexed = gastrocnemius tightness

COMPLETE SUMMARY TABLE

ConditionSiteAttitude/DeformityKey TestInvestigationTreatment
Hip OAHipFixed flexion (Thomas'+)IR first lostX-ray: LOSSAnalgesia → THR
NOF fractureHipShort, ER, helplessBryant's triangleX-ray ± MRIDHS/Hemiarthroplasty/THR
Post. dislocationHipFlex + adduct + IRHead in buttockX-rayUrgent reduction
Ant. dislocationHipExtend + abduct + ERHead in groinX-rayClosed reduction
ACL ruptureKneeHaemarthrosisLachman + Pivot shiftMRIPhysio / ACL reconstruction
PCL ruptureKneePosterior sagPosterior drawMRIBracing / PCL reconstruction
Meniscal tearKneeJoint line pain, lockingMcMurray, JL tendernessMRIRepair or meniscectomy
Knee OAKneeVarus, FFDCrepitus, reduced ROMWB X-rayAnalgesia → TKR/UKR
Lateral ankle sprainATFL/CFLSwelling lateralAnterior drawX-ray (Ottawa)RICE, rehab, brace
Achilles ruptureTendo-AchillesPalpable gapThompson's +USS/MRIFunctional brace / repair
Plantar fasciitisHeelMorning painCalcaneal origin TTPClinicalStretching, steroid injection
Hallux valgus1st MTPjLateral deviationBunion, ROMWB X-rayShoes → osteotomy

KEY RULES (Mnemonics)

  • Trendelenburg positive: Pelvis drops CONTRALATERAL; trunk leans IPSILATERAL
  • Hip OA: Internal rotation lost first
  • NOF fracture: Shortened, externally rotated - helpless
  • Post. hip dislocation: FAIR - Flexion, Adduction, Internal Rotation
  • Ant. hip dislocation: Extension + Abduction + External rotation
  • Haemarthrosis within 2 hours: ACL rupture, osteochondral fracture, peripheral meniscal tear
  • Lachman test: most sensitive for ACL (15-30° flexion)
  • Joint line tenderness: most sensitive for meniscal tear
  • Segond fracture: pathognomonic for ACL rupture
  • Thompson's test positive: complete Achilles rupture
  • Too many toes sign: pes planus
  • Ottawa rules: bony tenderness = X-ray mandatory

Sources: Bailey & Love's Short Practice of Surgery 28th Ed | Miller's Review of Orthopaedics 9th Ed | Campbell's Operative Orthopaedics 15th Ed 2026 | S Das Manual on Clinical Surgery 13th Ed | Rheumatology 2022 Elsevier

PDF guide (7 sections, 42KB):

Lower Limb Exam Guide

PDF Document · PDF

Lower limb

It looks like you sent "Lower limb" again — the full clinical write-up and PDF guide were just completed above. Here's a quick recap of what was covered and the download link:

Already covered in the previous response:
SectionContent
Hip ExamLook/Feel/Move, gait analysis, special tests (Thomas', Trendelenburg, Bryant's, FABER, FADIR, Stinchfield, Ober's)
Hip ConditionsOA, NOF fracture (Garden classification), hip dislocation (anterior vs. posterior attitudes)
Knee ExamLook/Feel/Move, effusion tests (stroke test, patellar tap), joint line palpation
Knee Special TestsACL (Lachman, anterior draw, pivot shift), PCL (posterior draw, sag sign), Menisci (McMurray, Thessaly, Apley), Patellofemoral (apprehension, J-sign)
Knee ConditionsACL rupture, meniscal tear, knee OA
Ankle & Foot ExamLook/Feel/Move, Ottawa rules, gait, footwear inspection, foot deformity classification
Ankle Special TestsAnterior draw, talar tilt, Thompson's (Achilles), Silfverskiold, single heel rise
Foot ConditionsLateral ankle sprain, Achilles rupture, plantar fasciitis, hallux valgus, pes planus/cavus, Morton's neuroma
Quick ReferenceFull 12-condition summary table + 14 classic rules/mnemonics

Download the PDF:

Lower Limb Exam Guide

PDF Document · PDF


Did you want something additional or different — for example:
  • A specific condition in more depth (e.g. Perthes' disease, SCFE, tibial plateau fracture)?
  • Paediatric lower limb conditions separately?
  • A combined upper + lower limb PDF in one file?

The pdf of both upper limb above & lower limb are not opening so give it in a text format

Here is the complete text of both guides in full.

UPPER LIMB ORTHOPAEDIC EXAMINATION GUIDE


UNIVERSAL EXAMINATION SEQUENCE

LOOK → FEEL → MOVE → SPECIAL TESTS → NEUROVASCULAR

SECTION 1 — THE SHOULDER

Anatomy Reminders

  • Ball-and-socket joint — greatest ROM, least intrinsic stability
  • Rotator cuff (SITS): Supraspinatus, Infraspinatus, Teres minor, Subscapularis
  • Pain anterolateral; referred pain from cervical spine, heart, mediastinum, diaphragm
  • Axillary nerve supplies deltoid + "regimental badge area" of upper lateral arm

LOOK (Strip to waist — compare both sides)

  • Attitude: Clavicle fracture / anterior dislocation → patient supports flexed elbow with other hand
  • Deformity: Flattening = dislocation (GT displaced medially); step at ACJ = AC dislocation
  • Muscle wasting: Deltoid wasting = axillary nerve palsy; supraspinous/infraspinous fossa wasting = rotator cuff
  • Scars: Anterior (deltopectoral) | Lateral (deltoid-splitting) | Posterior ports (arthroscopy)

FEEL

  • Test regimental badge area sensation (upper lateral arm) — loss = axillary nerve injury
  • Palpate: Sternoclavicular joint → clavicle → AC joint → acromion → coracoid → greater tuberosity → bicipital groove
  • Localised ACJ pain = AC pathology; diffuse = glenohumeral or referred

MOVE

Stabilise scapula: thumb on coracoid + fingers on scapular spine. Note painful arc (60°–120° = impingement).
MovementNormal RangeClinical Note
Flexion0–180°Loss = adhesive capsulitis, GHJ OA
Extension0–60°
Abduction0–180°Painful arc 60–120° = impingement
Adduction0–50°
External Rotation0–60°FIRST lost in frozen shoulder
Internal Rotation0–90°Test: thumb to spine level

SPECIAL TESTS — SHOULDER

Impingement / Rotator Cuff

TestTechniquePositive Meaning
Impingement sign (Neer)Passive forward flexion >90°Pain = subacromial impingement
Hawkins' testPassive FF 90° + internal rotationPain = impingement syndrome
Jobe's test (Empty can)Resisted pronation/FF at 90° in scapular planePain/weakness = supraspinatus lesion
Drop-arm testArm placed in abduction then releasedCannot maintain = supraspinatus rupture
Hornblower signResisted ER at 90° abductionPain = infraspinatus/teres minor lesion
Lift-off test (Gerber)Arm in IR behind back; lift offCannot lift = subscapularis tear
Bear-hug testHand on opposite shoulder; examiner tries to liftCannot maintain = subscapularis lesion
Belly-push testElbow held forward with abduction pressureCannot hold elbow forward = subscapularis

Instability Tests

TestTechniquePositive Meaning
Apprehension testSupine: 90° abduction + ERApprehension = anterior instability
Relocation testPosterior force during apprehensionRelief = anterior instability confirmed
Load-and-shift testAnt/post force on humeral headDegree of translation = laxity
Sulcus signInferior traction on arm at sideGap below acromion = inferior laxity

Labrum / Biceps Tests

TestTechniquePositive Meaning
O'Brien (Active compression)10° adduction, 90° FF, max pronation; resistPain = SLAP lesion / ACJ pathology
Speed's testResisted FF, elbow extended, forearm supinatedPain in bicipital groove = biceps tendinopathy
Yergason's testResisted supination with elbow at 90°Pain in groove = biceps tendinopathy/SLAP
Always obtain X-rays before diagnosing frozen shoulder — exclude GHJ OA and locked posterior dislocation (both cause selective ER loss).

SECTION 2 — SHOULDER CONDITIONS

Frozen Shoulder (Adhesive Capsulitis)

  • Age 40–70 years; female predominance; nondominant side more common
  • Associations: Diabetes mellitus (worse outcomes), thyroid disease, post-breast/chest surgery, prolonged immobilisation
  • Pathology: Fibrosis of coracohumeral ligament (CHL) and rotator interval capsule; type III collagen + myofibroblasts (resembles Dupuytren histology)

Stages

StageNameDurationFeatures
1Pre-adhesiveWeeks–monthsNocturnal pain; ROM initially preserved
2Freezing3–9 monthsPain + progressive ROM loss
3Frozen9–15 monthsStiffness dominates; pain decreases
4Thawing15–24 monthsGradual ROM recovery

Key Examination Findings

  • Global loss of all shoulder movements — active ROM = passive ROM
  • External rotation is FIRST and MOST affected
  • KEY DISTINGUISHER: Active = Passive ROM loss → Frozen shoulder | Active < Passive ROM loss → Rotator cuff tear
  • Two other causes of selective ER loss: GHJ OA + locked posterior dislocation → X-ray mandatory

Investigations & Treatment

ModalityDetail
X-rayNormal — mandatory to exclude GHJ OA and posterior dislocation
ArthrographyReduced joint volume (<10 mL vs. normal 35 mL); loss of axillary recess
MRICapsular thickening, CHL thickening, obliterated subcoracoid fat triangle
Conservative (90%)NSAIDs + physiotherapy (pendulum/Codman exercises) + intraarticular steroid injection
Distention arthrographyHydrodistention — inflates and stretches capsule
SurgicalClosed manipulation under anaesthesia; arthroscopic capsular release (if 12–16 wks conservative fails)

Rotator Cuff Tears

  • Supraspinatus most commonly torn (exits supraspinous fossa, passes under coracoacromial arch — "critical zone" of poor vascularity)
  • Presentation: Painful arc, weakness on abduction/ER, nocturnal pain; acute (trauma) or degenerative (gradual)
  • Drop-arm test positive in complete supraspinatus rupture
  • No restriction of passive ROM — distinguishes from frozen shoulder
  • Investigations: X-ray (superior head migration in massive tear), Ultrasound (dynamic), MRI (gold standard — size, retraction, fatty atrophy)
  • Treatment: Physiotherapy + subacromial steroid injection; arthroscopic/open cuff repair for full-thickness tears

SECTION 3 — THE ELBOW

Anatomy Reminders

  • Hinge (trochleoulnar) + pivot (radioulnar) joint
  • Normal carrying angle: 9–14° valgus; greater in females
  • Hueter's triangle: Medial epicondyle + lateral epicondyle + olecranon tip = equilateral triangle at 90° flexion
  • Normal range: −5° (hyperextension) to 150° flexion | Pronation 70° | Supination 90°

LOOK

  • Attitude: Elbow held flexed after injury. Child with swollen flexed elbow = supracondylar fracture until proven otherwise
  • Inspect from front: Carrying angle
  • From behind: Olecranon prominence — in children = supracondylar fracture (not dislocation)
  • From the side: AP broadening = posterior dislocation or supracondylar fracture
DeformityDefinitionCommon CauseComplication
Cubitus valgusIncreased carrying angle >15–20°Malunion lateral condyle fracture (child)Tardy ulnar nerve palsy
Cubitus varus (gun-stock)Reversed/decreased carrying angleMalunited supracondylar fractureMainly cosmetic

FEEL

  • Cross-fluctuation test for effusion
  • Ulnar nerve: Roll between medial epicondyle and olecranon; assess distal ulnar sensation
  • Radial head: Palpate with thumb while pronating/supinating
  • Springing the radius: Squeeze radius + ulna together distally → pain at upper radius = fracture head/neck radius
Hueter's Triangle Rule: Equilateral triangle at 90° — PRESERVED in supracondylar fracture | DISRUPTED in posterior elbow dislocation

ELBOW CONDITIONS

Lateral Epicondylitis (Tennis Elbow)

  • Degenerative tendinopathy at origin of ECRB — NOT true inflammation
  • Peak: 5th decade; more common in non-athletes; risk factors: female, smoking, manual labour, statins
  • Mechanism: Repetitive supination/pronation with elbow near full extension
  • Tenderness: 5 mm distal and anterior to midpoint of lateral epicondyle
TestTechniquePositive
Cozen's testResisted wrist extension, elbow extendedPain at lateral epicondyle
Mill's testPassive wrist flexion, elbow extendedPain at lateral epicondyle
Middle finger testResisted extension of middle fingerPain at ECRB origin (most specific)
  • X-ray: Usually normal. MRI: Tendon thickening, increased T1/T2 signal at ECRB
  • Treatment: Conservative (84–95% respond): rest, ice, counter-force brace, physio, steroid injection. Surgical: ECRB débridement/release if conservative fails at 6 months

Medial Epicondylitis (Golfer's Elbow)

  • Flexor-pronator origin tendinopathy at medial epicondyle
  • Tenderness at medial epicondyle; pain with resisted wrist flexion + forearm pronation
  • Must exclude ulnar nerve entrapment at elbow (coexists in ~60%)

SECTION 4 — THE WRIST

Anatomy Reminders

  • ROM: Flexion 75–80° | Extension 70–75° | Radial deviation 15° | Ulnar deviation 30–40°
  • Normal X-ray parameters: Volar tilt 11° | Radial inclination 22° | Radial height 12 mm
  • Lister's tubercle: Palpable on dorsal distal radius; 1 cm distal = scaphoid
  • Anatomical snuffbox: Between APL/EPB and EPL tendons — scaphoid lies below

Colles' Fracture

  • Transverse fracture of distal radius within 2.5 cm of wrist
  • Commonest fracture in adults >40 years; elderly osteoporotic women after FOOSH

The 5 Ds of Colles' Fracture

Dorsal displacement, Dorsal angulation, radial Deviation, Dinner-fork Deformity, impacteD
FeatureDescription
ExaminationDinner-fork deformity on lateral view; radial deviation; local swelling and bruising
X-ray (AP + Lateral)Confirm fracture; measure volar tilt, radial inclination, radial height
Acceptable reductionVolar tilt ≥0°, radial inclination ≥15°, radial height shortening ≤3 mm
TreatmentUndisplaced: Below-elbow cast 6 wks. Displaced: Closed reduction (haematoma block or Bier's) + cast. Unstable: K-wires or volar locking plate (ORIF)
ComplicationsCRPS (Sudeck's atrophy), malunion, median nerve injury, EPL rupture, carpal tunnel syndrome

Scaphoid Fracture

Most commonly MISSED fracture — 30% have normal initial X-ray. Normal X-ray does NOT exclude scaphoid fracture.
  • Mechanism: FOOSH with wrist in dorsiflexion and radial deviation
  • Blood supply enters distally — proximal pole fractures risk AVN
Clinical TestTechniquePositive Finding
Anatomical snuffbox tendernessPalpate dorsal snuffbox with wrist in ulnar deviationTenderness = scaphoid fracture until proven otherwise
Scaphoid tubercle tendernessPalpate volar tubercle at wrist creaseMore specific than snuffbox
Scaphoid compression testAxial compression along axis of thumbPain at wrist
Telescoping testTelescoping the thumb proximallyPain at scaphoid
InvestigationRole
X-ray (AP, lateral, scaphoid views)First line; may be NORMAL — repeat at 10–14 days
MRIMost sensitive — detects fracture within 24–48 hours
CTBest for displacement assessment and union
Bone scanSensitive but non-specific
Treatment:
  • Undisplaced waist: Thumb spica cast 8–12 weeks
  • Displaced (>1 mm) or proximal pole: Surgical fixation (Herbert screw)
  • Non-union/AVN: Bone grafting + fixation; vascularised bone graft

SECTION 5 — THE HAND

Carpal Tunnel Syndrome (CTS)

  • Most common entrapment neuropathy — median nerve compressed under flexor retinaculum
  • Anatomy: 9 flexor tendons + median nerve pass through carpal tunnel
  • More common in women; ~3% of adults; common in pregnancy
CategoryCauses
InflammatoryRheumatoid arthritis, tenosynovitis (most common)
Metabolic/EndocrineHypothyroidism, diabetes, acromegaly, pregnancy
Space-occupyingGanglion, lipoma, carpal fracture malunion, amyloidosis
OccupationRepetitive wrist flexion/extension, vibrating tools
Clinical Features:
  • Pain, numbness, paraesthesia in radial 3½ digits (thumb, index, middle, radial half of ring)
  • Worse at night and with repetitive motion — "flick sign" (shaking relieves)
  • Thenar wasting = late sign (chronic compression)
  • Weakness of thumb abduction (APB)
TestTechniqueSignificance
Tinel's signTap over carpal tunnel at wristParaesthesia in median nerve distribution
Phalen's manoeuvreWrists fully flexed for 60 seconds (dorsal surfaces back to back)Symptom reproduction — most specific
Carpal compression testDirect pressure over tunnel for 30 secondsMost sensitive clinical test
Reverse PhalenWrists extended back to backSymptom reproduction
APB testResisted thumb abductionWeakness = thenar denervation
Investigations & Treatment:
StepDetail
NCS/EMGConfirms diagnosis; prolonged sensory latency before motor; mandatory before surgery; 25% false-negative rate
ConservativeNight wrist splinting in neutral; activity modification; nerve gliding exercises; corticosteroid injection
SurgicalCarpal tunnel decompression — open or endoscopic division of flexor retinaculum; equivalent long-term outcomes; excellent results
Indication for surgeryFailed conservative measures OR thenar wasting

Dupuytren's Contracture

  • Progressive palmar fascial fibrosis → flexion contracture (ring and little fingers most common)
  • Pathology: Myofibroblast proliferation, type III collagen — histologically similar to frozen shoulder
  • Associations: Male sex, Northern European descent, diabetes, alcohol, phenytoin, vibration, HIV
  • Examination: Palmar pitting/dimpling, palpable nodules, MCPj and PIPj flexion contracture
  • Hueston tabletop test: Cannot place palm flat on table = significant contracture
  • Treatment: Observation if mild | Needle fasciotomy, collagenase injection (Xiaflex) | Fasciectomy
  • Surgery indicated: MCP contracture ≥30° OR any degree of PIP contracture

De Quervain's Tenosynovitis

  • Stenosing tenosynovitis of 1st dorsal extensor compartment: APL + EPB tendons
  • Common in new mothers; repetitive pinch-grip
  • Tenderness over radial styloid + 1st dorsal compartment; crepitus
Finkelstein's test: Patient makes fist with thumb inside fingers. Examiner passively ulnar deviates the wrist. Sharp pain at radial styloid = POSITIVE (De Quervain's).
  • Treatment: Thumb spica splint + NSAIDs → corticosteroid injection → surgical release of 1st compartment

SECTION 6 — UPPER LIMB QUICK REFERENCE SUMMARY

ConditionSiteKey Sign/TestInvestigation1st-Line TxSurgical Tx
Frozen shoulderGHJEqual active=passive loss; ER firstX-ray (normal), MRIPhysio, steroid injArthroscopic capsular release
Rotator cuff tearShoulderDrop-arm, painful arc, Jobe'sMRIPhysio, subacromial injArthroscopic repair
Shoulder dislocation (ant)GHJFlattening, anterior bulgeX-ray AP + lateralReduction (Kocher/Hippocratic)Latarjet/Bankart (recurrent)
Tennis elbowLateral epicondyleCozen's, Mill's testClinical ± MRIBrace, steroid injECRB release
Golfer's elbowMedial epicondyleResisted wrist flexionClinicalBrace, steroid injFlexor-pronator release
Supracondylar # humerusElbowPosterior displacement; Hueter's intactX-rayMUA + K-wiresORIF if NV compromise
Colles' fractureDistal radiusDinner-fork deformityX-rayClosed reduction + castVolar locking plate ORIF
Scaphoid fractureWristSnuffbox tendernessMRI (gold)Thumb spica 8–12 wksHerbert screw
Carpal tunnelWristPhalen's, Tinel's, thenar wastingNCS/EMGNight splint, steroid injCTD (open/endoscopic)
Dupuytren'sPalmTabletop testClinicalObservation if mildFasciectomy/Collagenase
De Quervain'sRadial styloidFinkelstein's testClinical ± USSSplint + NSAID + inj1st compartment release

UPPER LIMB KEY RULES

  • Regimental badge area: Upper lateral arm sensation. Loss after shoulder trauma = axillary nerve palsy
  • Active = Passive ROM loss: Frozen shoulder
  • Active < Passive ROM loss: Rotator cuff tear
  • Hueter's triangle INTACT: Supracondylar fracture
  • Hueter's triangle DISRUPTED: Posterior elbow dislocation
  • Anatomical snuffbox tenderness: Scaphoid fracture until proven otherwise
  • Normal X-ray: Does NOT exclude scaphoid fracture — get MRI
  • Dinner-fork deformity: Colles' fracture
  • Radial 3½ digits + night symptoms: Carpal tunnel syndrome (median nerve)
  • Ring + little finger contracture: Dupuytren's contracture
  • Finkelstein positive: De Quervain's tenosynovitis


LOWER LIMB ORTHOPAEDIC EXAMINATION GUIDE


SECTION 1 — THE HIP

Anatomy Reminders

  • Ball-and-socket synovial joint: femoral head + acetabulum
  • Key bony landmarks: ASIS, iliac crest, greater trochanter, ischial tuberosity, pubic tubercle
  • Femoral artery: palpated at midpoint of inguinal ligament (ASIS to pubic tubercle)
  • Nerve supply: femoral nerve (L2–L4), obturator nerve (L2–L4), sciatic nerve (L4–S3)
  • Always examine spine, abdomen, pelvis, groin, thigh together; consider gynaecological causes in women

GAIT (Observe Before Patient Lies Down)

GaitDescriptionCause
Trendelenburg gaitPelvis drops contralateral; trunk leans ipsilateral to compensateWeak gluteus medius — hip OA, NOF#, DDH, superior gluteal nerve palsy
Antalgic gaitShort stance phase on painful sidePain of any cause
Scissors gaitKnees cross midlineSpastic hip adductors (cerebral palsy)

LOOK (Standing → Supine)

Standing (front, side, back):
  • Pelvic tilt — one ASIS higher than the other
  • Rotational deformity — foot progression angle (in-toeing/out-toeing)
  • Lumbar lordosis (compensates for hip FFD)
  • Gluteal wasting; secondary scoliosis
Supine:
  • Fixed adduction deformity (OA, cerebral palsy) → apparent shortening from pelvic tilt
  • Rotational posture of the limb; scars and sinuses

FEEL

  • Greater trochanter: Tenderness = trochanteric bursitis / abductor enthesopathy
  • ASIS, iliac crest, pubic tubercle — bony landmarks for measurements
  • Femoral pulse: At midinguinal point. Absent/diminished in posterior dislocation (head absent from acetabulum, no longer supporting artery from behind)
  • Inguinal region: Lymphadenopathy, hernia

MOVE

MovementNormal RangeHow to Test
Flexion0–120°Supine; flex hip + knee. Modified Thomas' test for FFD
Extension0–10°Prone; lift leg off couch
Abduction0–45°Supine; stabilise contralateral ASIS; slide leg out
Adduction0–30°Cross leg over midline
Internal rotation0–45°Hip + knee at 90°; swing foot outward
External rotation0–45°Hip + knee at 90°; swing foot inward
First movement lost in hip OA = Internal rotation — always test this!

SPECIAL TESTS — HIP

TestTechniquePositive Finding & Meaning
Thomas' testPatient supine. Flex both hips fully. Hold one hip flexed (flattens lumbar lordosis). Allow other leg to drop.Leg unable to reach couch = fixed flexion deformity. Angle = degree of FFD
Trendelenburg testPatient stands on one leg. Examiner stands behind.Pelvis drops on contralateral (unsupported) side = POSITIVE = weak abductors on standing leg
True leg lengthASIS to medial malleolusDifference = true shortening (bone)
Apparent leg lengthXiphisternum to medial malleolusDifference = pelvic tilt/adduction contracture
Bryant's triangleVertical from ASIS; horizontal from GT to meet it; measure horizontal limbShortened horizontal limb = upward GT displacement (NOF#, dislocation)
Nelaton's lineASIS to ischial tuberosity line (lateral decubitus)GT above line = upward displacement
FABER/Patrick testFlex, Abduct, Externally Rotate (figure-of-4 position)Anterior hip pain = hip joint. Posterior pain = SI joint/L5–S1
FADIR/Impingement testFlex 90° + Adduct + Internally RotateAnterior groin pain = FAI or labral tear
Stinchfield testActive straight-leg raise ~20 cm against mild resistanceAnterior hip pain = hip joint pathology
Ober's testLateral decubitus; extend and abduct upper leg; let dropLeg fails to adduct below horizontal = tight ITB
Log roll (Roll test)Supine; rotate leg in/out gently at calf levelStiffness or pain = hip joint irritability

SECTION 2 — HIP CONDITIONS

Hip Osteoarthritis

  • Most common joint disease. Primary or secondary (DDH, Perthes', SCFE, trauma)
  • Presentation: Groin pain (referred to knee), morning stiffness, antalgic or Trendelenburg gait
Examination Findings:
  • Antalgic/Trendelenburg gait
  • Fixed flexion deformity (Thomas' test positive)
  • Internal rotation FIRST lost; then all movements restricted
  • Shortening of limb (advanced OA)
Investigations:
  • X-ray (AP pelvis + lateral): LOSS — Loss of joint space (superolateral), subchondral sClerosis, Osteophytes, Subchondral cysts
  • MRI: Early cartilage loss, AVN, labral tears
Treatment:
StageTreatment
MildAnalgesia (paracetamol, NSAIDs), physiotherapy, weight loss, walking aids
ModerateIntraarticular steroid injection, hyaluronic acid injection
SevereTotal Hip Replacement (THR) — gold standard

Neck of Femur (NOF) Fracture

Elderly patient lying helplessly with shortened, externally rotated lower limb = NOF fracture until proven otherwise.
  • Commonest serious fracture in elderly; 1-year mortality ~30%
  • Mechanism: Low-energy fall in osteoporotic patients

Garden Classification (Subcapital)

GradeDescriptionBlood Supply
IIncomplete/impacted — valgus impactionUsually intact
IIComplete, non-displacedUsually intact
IIIComplete, partial displacement — head partially rotatedDisrupted
IVComplete, full displacement — trabeculae not alignedDisrupted — HIGH AVN risk
Examination Findings:
  • Lying helpless; cannot weight bear
  • Lower limb: shortened, externally rotated
  • Bony tenderness on attempted rotation of shaft
  • Bryant's triangle: horizontal limb shortened
  • Nelaton's line: GT above line
Investigations:
  • X-ray (AP pelvis + lateral): Always obtain both views. Shenton's line disrupted.
  • MRI: Most sensitive — detects occult fractures within 24–48 hours
Treatment:
Fracture TypePatientTreatment
Intracapsular undisplaced (Garden I/II)AnyDHS or cannulated screws
Intracapsular displaced (Garden III/IV)Elderly (>65)Hemiarthroplasty (Austin Moore/Thompson) or THR
Intracapsular displaced (Garden III/IV)Young (<65)Reduction + internal fixation (preserve head)
Extracapsular (intertrochanteric)Any ageDynamic Hip Screw (DHS)
SubtrochantericAnyIntramedullary nail (e.g. PFNA)

Hip Dislocation

TypeAttitudeComplication
Posterior (90%)Flexion, Adduction, Internal Rotation (FAIR)Sciatic nerve injury (10–20%), AVN, post-traumatic OA
Anterior (rare)Extension, Abduction, External RotationFemoral nerve/artery injury; head in groin
  • Treatment: Emergency closed reduction under GA; post-reduction CT to check for loose fragment

SECTION 3 — THE KNEE

Anatomy Reminders

  • Synovial hinge joint (+ slight rotation — screw-home mechanism last 15° extension)
  • ACL: Primary restraint to anterior tibial translation + rotational instability
  • PCL: Primary restraint to posterior tibial translation (at 90° flexion)
  • MCL (medial): Resists valgus stress + external rotation
  • LCL (lateral): Resists varus stress
  • Medial meniscus: Less mobile (attached to MCL) — more commonly torn
  • Extensor mechanism: Quadriceps → quadriceps tendon → patella → patellar tendon → tibial tuberosity

LOOK

  • Standing: Alignment — varus ('bow-legged', medial OA) or valgus ('knock-knee')
  • Fixed flexion deformity from the side; recurvatum (hyperextension)
  • Quadriceps wasting — universal sign of chronic knee pathology
  • Gait: Antalgic (OA), varus thrust (medial compartment collapse), high-stepping (foot drop)
  • Supine: Diffuse effusion, prepatellar bursa, scars

FEEL

Effusion Tests:
  • Fluid displacement (stroke/bulge test): Stroke fluid from medial side into suprapatellar pouch; press pouch inferiorly; fluid returns = small effusion
  • Patellar tap test: Compress fluid; tap patella — it floats = large effusion
Palpation Points:
  • Joint line (medial and lateral) — tenderness = meniscal pathology or compartment OA
  • Tibial tuberosity — Osgood-Schlatter (adolescents)
  • Inferior pole of patella — patellar tendinopathy ("jumper's knee")
  • MCL origin: Medial femoral epicondyle
  • Popliteal fossa — Baker's cyst; popliteal aneurysm

MOVE

  • Flexion–Extension: −5° (hyperextension) to 135°
  • Lag test: Ask patient to SLR (10°), flex knee, then re-straighten in air. Cannot re-straighten = extensor mechanism failure

SPECIAL TESTS — KNEE

Cruciate Ligaments

TestTechniquePositive Finding
Lachman test (best for ACL)Knee at 15–30° flexion; pull proximal tibia anteriorlyExcessive anterior translation with soft/absent end-point = ACL rupture. Most sensitive ACL test.
Anterior draw test (ACL)Knee at 90°; sit on foot; draw tibia forward. Grade I <5 mm, II 5–10 mm, III >10 mmAnterior translation = ACL injury
Posterior draw test (PCL)Knee at 90°; push tibia posteriorly. >10 mm = combined PCL + PLCPosterior translation = PCL rupture
Posterior sag sign (PCL)Knees flexed 90°; look from side at tibial tuberosity levelPosterior sag of tibia = PCL rupture
Pivot shift test (ACL)Valgus + internal rotation force on flexed knee; then extendClunk as lateral tibial plateau reduces at ~30° = rotatory instability (ACL deficiency)

Collateral Ligaments

TestTechniquePositive Finding
Valgus stress test (MCL)Apply valgus force at 0° and 30° flexionLaxity/pain at 30° = MCL tear. Laxity at 0° = complete MCL + cruciate injury
Varus stress test (LCL)Apply varus force at 0° and 30° flexionLaxity/pain at 30° = LCL tear. Laxity at 0° = severe posterolateral corner injury

Menisci

TestTechniquePositive Finding
Joint line tendernessFlex knee 90°; palpate joint line with thumb + indexTenderness = most sensitive clinical test for meniscal tear
McMurray's testFully flex knee. ER + extend (medial); IR + extend (lateral)Palpable/audible click or pain at joint line = meniscal tear
Thessaly testStand on one leg, flexes knee 20°, rotate body medially + laterallyJoint line pain = meniscal tear
Apley grind testProne; flex knee 90°; compress + rotate (grind) then distract + rotatePain with compression + rotation = meniscus; distraction = ligament

Patellofemoral Joint

TestTechniquePositive Finding
Patellar apprehension (Fairbank's)Push patella laterally at 0° and 30°Patient contracts quads/grabs examiner = lateral instability
J-sign / Patellar trackingExtend knee slowly from 90°; observe patella pathLateral jump at end of extension = maltracking (VMO weakness)
Clarke's test (patellar grind)Push patella distally; patient tenses quadsPain = patellofemoral syndrome / chondromalacia patellae

SECTION 4 — KNEE CONDITIONS

ACL Rupture

  • Young athletic population — pivoting sports (football, squash, skiing)
  • Mechanism: Non-contact deceleration + valgus + IR; or direct blow
  • Presentation: Haemarthrosis within 2 hours + 'pop' heard + immediate disability
  • Lachman test positive (most sensitive); anterior draw; pivot shift (pathognomonic)
  • Segond fracture on X-ray (lateral tibial plateau avulsion) = pathognomonic for ACL rupture
  • MRI: Gold standard — ligament signal change, bone bruising, associated meniscal tears
  • Treatment: Physio (low-demand) or ACL reconstruction with hamstring/patellar tendon graft (young, active)

Meniscal Tear

  • Medial meniscus more commonly torn (less mobile, attached to MCL)
  • Mechanism: Twisting injury in young; degenerative in elderly
  • Presentation: Joint line pain, swelling, locking (bucket-handle), giving way
  • Bucket-handle tear → locked knee (cannot achieve full extension)
  • MRI: Grade III = tear reaching articular surface = surgical
  • Treatment: Conservative (stable peripheral tears) or arthroscopic repair (red/vascular zone) / partial meniscectomy (white/avascular zone)

Knee Osteoarthritis

  • Medial compartment most common (varus knee)
  • Kellgren-Lawrence grading on weight-bearing X-ray
  • Examination: Varus/valgus deformity, FFD, quadriceps wasting, crepitus, joint line tenderness, reduced ROM
  • Treatment: Conservative → TKR (gold standard) or UKR (isolated unicompartmental disease)

SECTION 5 — ANKLE & FOOT

Anatomy Reminders

  • Ankle (talocrural): Tibia + fibula + talus. Plantarflexion/dorsiflexion
  • Subtalar joint: Inversion/eversion of hindfoot
  • Lateral ligament complex: ATFL + CFL + PTFL
  • ATFL: Most commonly torn in lateral ankle sprain (plantarflexion + inversion)
  • Medial deltoid: Strong; rarely torn in isolation
  • Achilles watershed zone: 2–6 cm above calcaneal insertion = site of rupture

LOOK (Standing → Supine)

Standing:
  • Hindfoot from behind: Normal heel valgus 5–7°
  • Too many toes sign (>2 toes visible from behind) = forefoot abduction + hindfoot valgus = pes planus
  • Medial longitudinal arch from side: Absent = pes planus; Exaggerated = pes cavus
  • Forefoot: Hallux valgus (bunion), hallux rigidus; toe deformities
Toe Deformities:
DeformityMTPjPIPjDIPj
Claw toeHyperextensionFlexionFlexion
Hammer toeNormalFlexionFlexion
Mallet toeNormalNormalFlexion
Hallux valgusValgus (lateral deviation)Normal
Causes of pes planus: Normal variant, hyperlaxity (Marfan's), tarsal coalition, tibialis posterior dysfunction
Causes of pes cavus: Spina bifida, Charcot-Marie-Tooth disease, Charcot foot, post-compartment syndrome (Volkmann's)
Gait:
  • High-stepping gait = foot drop (common peroneal nerve palsy, L4 radiculopathy)
  • Antalgic gait = ankle/foot pain; short propulsive phase = forefoot pain
Footwear inspection:
  • Normal wear: posterolateral heel (heel strike) + under big toe ball (toe-off)
  • Medial heel wear = hindfoot valgus/pes planus

FEEL

  • Skin: Reduced glove-and-stocking sensation = diabetic peripheral neuropathy
  • Pulses: Dorsalis pedis (dorsum of foot) + posterior tibial (behind medial malleolus)
  • Ottawa rules tender points: Posterior 6 cm of fibula/tibia; base 5th metatarsal; navicular → X-ray required
  • Achilles tendon: Palpate for defect 2–6 cm above insertion (watershed zone)
  • Plantar fascia: Tenderness at calcaneal origin = plantar fasciitis

MOVE

MovementJointNormal Range
DorsiflexionTalocrural0–20°
PlantarflexionTalocrural0–50°
InversionSubtalar0–35°
EversionSubtalar0–15°

SPECIAL TESTS — ANKLE & FOOT

TestTechniquePositive Finding & Meaning
Anterior draw test (ATFL)Stabilise distal tibia; pull heel anteriorly in slight plantarflexionAnterior translation of talus >3–5 mm = ATFL tear
Talar tilt test (CFL)Invert heel with ankle in neutralIncreased tilt = CFL tear
Thompson (Simmonds') testPatient prone, knee 90°. Squeeze calf.No plantarflexion = POSITIVE = complete Achilles rupture
Single heel rise testStand on one foot; rise on tiptoeUnable to rise = tibialis posterior dysfunction / Achilles weakness
Silfverskiold testDF measured with knee extended vs. flexedImproved DF with knee flexed = gastrocnemius tightness (not combined gastrosoleus)
Ottawa ankle rulesBony tenderness at: posterior 6 cm fibula/tibia; base 5th MT; navicularAny positive point = X-ray required to exclude fracture

SECTION 6 — ANKLE & FOOT CONDITIONS

Lateral Ankle Sprain

  • Most common musculoskeletal injury
  • Mechanism: Inversion + plantarflexion
  • Lateral ligament torn in order: ATFL first → CFL → PTFL (most severe)
  • Swelling + bruising over lateral malleolus; anterior draw + talar tilt tests positive
  • Apply Ottawa rules — X-ray if bony tenderness
  • Treatment: RICE in acute phase; early functional rehabilitation; ankle brace
  • Chronic instability: Bröstrom repair (anatomical ligament reconstruction)

Achilles Tendon Rupture

Thompson's test: Absence of plantarflexion on calf squeeze = complete Achilles rupture
  • Peak age: 30–50 years; "weekend warriors"; fluoroquinolone use increases risk
  • Mechanism: Sudden explosive push-off (squash, tennis, basketball)
  • Presentation: "Felt like being shot/kicked"; sudden pain; cannot continue activity
  • Examination:
    • Palpable gap in tendon 2–6 cm above insertion
    • Thompson's (Simmonds') test POSITIVE
    • Patient can weakly plantarflex using long toe flexors — do not be falsely reassured
  • Investigations: USS (gap size, apposition); MRI (partial vs. complete)
  • Treatment:
    • Non-operative: Functional bracing in equinus (progressive rehabilitation)
    • Surgical: End-to-end repair — preferred in young, active patients; lower re-rupture rate

Foot Conditions Summary

ConditionTypical PatientKey FindingTreatment
Plantar fasciitisMiddle-aged, overweight, runnersHeel pain worst in morning; tenderness at calcaneal originStretching, orthotics, steroid injection, ESWT
Hallux valgusMiddle-aged women; tight shoesLateral deviation of hallux; medial prominence; bursaShoes; osteotomy (scarf/chevron)
Hallux rigidusAdults 30–60Stiff painful 1st MTPj; dorsal osteophyte; reduced dorsiflexionStiff-soled shoes; cheilectomy or 1st MTPj fusion
Pes planusAll agesCollapsed medial arch; too many toes signPhysiotherapy, orthotics; corrective surgery for rigid flat foot
Pes cavusNeurological cause (CMT, spina bifida)High arch; clawing of toes; calluses under MHAssess neurological cause; orthotics; corrective osteotomy
Morton's neuromaMiddle-aged womenBurning/shooting pain 3rd–4th web space; Mulder's clickWide shoes, metatarsal pad, steroid injection; surgical excision
Ankle OAPost-traumaticReduced ankle ROM; joint line tenderness; deformityPhysiotherapy, bracing; arthrodesis or total ankle replacement

SECTION 7 — LOWER LIMB QUICK REFERENCE SUMMARY

ConditionSiteAttitude/DeformityKey TestInvestigationTreatment
Hip OAHipFixed flexion (Thomas'+)IR first lostX-ray (LOSS)Analgesia → THR
NOF fractureHipShort, ER, helplessBryant's triangleX-ray ± MRIDHS/Hemiarthroplasty/THR
Posterior hip dislocationHipFlex + adduct + IR (FAIR)Head in buttockX-rayUrgent closed reduction
Anterior hip dislocationHipExtend + abduct + ERHead in groinX-rayClosed reduction
ACL ruptureKneeHaemarthrosisLachman + pivot shiftMRIPhysio / ACL reconstruction
PCL ruptureKneePosterior sagPosterior drawMRIBracing / PCL reconstruction
Meniscal tearKneeJoint line pain, lockingMcMurray, JL tendernessMRIRepair or partial meniscectomy
Knee OAKneeVarus, FFDCrepitus, reduced ROMWB X-rayAnalgesia → TKR/UKR
Lateral ankle sprainATFL/CFLSwelling lateralAnterior drawX-ray if Ottawa +RICE, rehab, brace
Achilles ruptureAchilles tendonPalpable gapThompson's POSITIVEUSS/MRIFunctional brace / surgical repair
Plantar fasciitisHeelMorning painCalcaneal origin TTPClinicalStretching, steroid injection
Hallux valgus1st MTPjLateral hallux deviationBunion; MTPj ROMWB X-rayShoes → osteotomy

LOWER LIMB KEY RULES

  • Trendelenburg positive: Pelvis drops CONTRALATERAL; trunk leans IPSILATERAL
  • Thomas' test positive: Fixed flexion deformity — hip cannot reach neutral extension
  • First movement lost in hip OA: Internal rotation
  • NOF fracture attitude: Shortened, externally rotated — helpless
  • Posterior hip dislocation (FAIR): Flexion + Adduction + Internal Rotation
  • Anterior hip dislocation: Extension + Abduction + External Rotation
  • Haemarthrosis within 2 hours: ACL rupture, osteochondral fracture, peripheral meniscal tear, tibial plateau fracture
  • Lachman test: Most sensitive for ACL — perform at 15–30° flexion
  • Fluid displacement test: Small effusion. Patellar tap: large effusion
  • Joint line tenderness: Most sensitive clinical test for meniscal tear
  • Segond fracture on X-ray: Pathognomonic for ACL rupture
  • Thompson's test positive: Complete Achilles tendon rupture
  • Too many toes sign: Pes planus (forefoot abduction + hindfoot valgus)
  • Ottawa ankle rules: Bony tenderness at posterior fibula/tibia, base 5th MT, or navicular → X-ray mandatory
  • Shenton's line disrupted: Hip fracture or dislocation

NEUROVASCULAR CHECK — End of Every Lower Limb Examination

  • Femoral + popliteal + dorsalis pedis + posterior tibial pulses
  • Capillary refill
  • Sensation in: femoral (L2–L3), obturator (L2–L3), common peroneal (L4–S1), tibial (L4–S3) distributions
  • Motor function: Hip flexion (L1–L2), knee extension (L3–L4), dorsiflexion (L4), plantarflexion (S1–S2)

Sources: Bailey & Love's Short Practice of Surgery 28th Ed | Miller's Review of Orthopaedics 9th Ed | Campbell's Operative Orthopaedics 15th Ed 2026 | S Das Manual on Clinical Surgery 13th Ed | Rheumatology 2-Volume Set 2022 Elsevier

Continue

Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Reading File
Finding Sources
Finding Sources
Reading File
Reading File
I now have enough material. Here is the full continuation:

LOWER LIMB — CONTINUED (EXTENDED GUIDE)


SECTION 8 — PAEDIATRIC HIP CONDITIONS

Paediatric hip disease follows a distinct age-related pattern. The correct diagnosis depends heavily on the child's age at presentation.

Age-Based Differential Diagnosis of Hip Pain in Children

Age GroupLikely DiagnosisKey Clue
Neonate–6 monthsDevelopmental Dysplasia of Hip (DDH)Barlow/Ortolani positive; unequal skin folds
3–8 yearsTransient synovitis of hipAfter viral URTI; afebrile or low-grade fever
4–8 years (boys)Perthes' disease (LCPD)Insidious limp; AVN of femoral head
Any child (septic)Septic arthritisKocher criteria; systemically unwell; hot joint
10–15 years (obese boys)Slipped Capital Femoral Epiphysis (SCFE)External rotation of limb; knee pain
Hilton's Law: A joint is supplied by the same nerves as the muscles that move it. Explains why hip pathology in children often presents as KNEE PAIN — always examine the hip in any child with knee pain.

1. Developmental Dysplasia of the Hip (DDH)

Definition: Spectrum from acetabular dysplasia to frank dislocation of the femoral head from the acetabulum.
Risk Factors: Female sex, first-born, breech presentation, positive family history, oligohydramnios
Screening Tests (Neonatal):
TestTechniquePositive Meaning
Barlow's testAdduct + apply posterior force on flexed hipFemoral head dislocates posteriorly out of acetabulum = unstable hip
Ortolani's testAbduct hip while applying anterior force on GTClunk as femoral head reduced back into acetabulum = dislocated hip
Galeazzi sign (Allis sign)Supine; flex both hips + knees; compare knee heightsLower knee = shorter femur = unilateral DDH or femoral shortening
Clinical Features (Older Child/Missed DDH):
  • Delayed walking; limp; Trendelenburg gait
  • Unequal leg length; asymmetric skin folds (unreliable in bilateral DDH)
  • Limitation of abduction (important early sign)
  • Telescoping of the limb (pistoning)
Investigations:
  • Ultrasound (USS): Gold standard under 6 months (cartilaginous structures not visible on X-ray)
  • X-ray (AP pelvis): From 4–6 months when ossification begins. Assess: Hilgenreiner's line (horizontal through triradiate cartilage), Perkin's line (vertical through lateral acetabular edge), Shenton's arc continuity
Treatment:
AgeTreatment
0–6 monthsPavlik harness (maintain reduction in flexion + abduction)
6–18 monthsClosed reduction under GA → spica cast
18 months–8 yearsOpen reduction ± femoral/pelvic osteotomy
>8 yearsPalliative (secondary OA inevitable; joint salvage or THR later)

2. Perthes' Disease (Legg-Calvé-Perthes Disease / LCPD)

Definition: Idiopathic avascular necrosis (AVN) of the femoral head in childhood, leading to femoral head collapse and remodelling.
Epidemiology:
  • Most common in boys aged 4–8 years (peak 5–7)
  • Bilateral in 10–12% (simultaneous bilaterality is unusual — consider systemic disease)
  • Prognosis better in younger children (more remodelling potential before skeletal maturity)
Pathological Stages:
StageNameRadiological Features
1Ischaemia/NecrosisIncreased density of femoral head; loss of joint space
2FragmentationFemoral head appears fragmented; lateral pillar affected
3Re-ossificationNew bone laid down; femoral head reshapes
4HealedRemodelling complete; head spherical or aspherical (deformed)
Herring (Lateral Pillar) Classification: Based on height of lateral pillar in fragmentation phase — predicts prognosis and guides treatment.
Clinical Presentation:
  • Insidious onset limp; child rarely in severe pain
  • Hip and thigh pain (or knee pain via Hilton's law)
  • Trendelenburg gait
  • Reduced abduction and internal rotation of hip
  • Muscle spasm; mild Trendelenburg
Investigations:
  • X-ray (AP + frog-leg lateral): Confirm stage, measure lateral pillar height
  • MRI: Most sensitive — shows AVN before X-ray changes; maps extent of involvement
Treatment:
  • Conservative: Maintain ROM with physiotherapy (abduction exercises); avoid weight bearing during fragmentation
  • Surgical (containment): Femoral varus derotation osteotomy or innominate (Salter) osteotomy — to cover vulnerable femoral head
  • Late salvage: Head-neck osteoplasty; trochanteric transfer; THR in adulthood if secondary OA develops
✅ Management aims to maintain femoral head sphericity and containment within acetabulum.

3. Slipped Capital Femoral Epiphysis (SCFE / SUFE)

Definition: Stress fracture through the proximal femoral physis — the femoral neck slips anteriorly and superiorly relative to the epiphysis (which remains in acetabulum).
Epidemiology:
  • Incidence ~5 per 100,000; boys more affected; peak at puberty onset
  • Obese adolescents at highest risk; hypothyroidism, renal failure, and previous radiotherapy are also risk factors
Classification:
TypeDescription
StableCan weight bear (with or without crutches) — better prognosis
UnstableCannot weight bear — HIGH risk of AVN (~50%)
Clinical Presentation:
  • Obese adolescent with hip, groin, or KNEE pain (referred — Hilton's law)
  • Attitude: Limb lies in external rotation; shortened in severe slips
  • Painful restriction of internal rotation and flexion
  • As hip flexed, leg automatically externally rotates (Drehmann's sign)
Investigations:
  • X-ray (AP + frog-leg lateral): "Ice cream falling off cone" appearance. Measure Southwick slip angle. Klein's line (along superior femoral neck) fails to intersect epiphysis in SCFE.
Treatment:
  • In situ fixation with single cannulated screw — urgent/emergency for unstable SCFE
  • Contralateral prophylactic pinning: Considered in high-risk patients
  • Do NOT attempt reduction (increases AVN risk in stable slips)
  • Complications: AVN (especially unstable), chondrolysis, FAI, secondary OA → THR in adult life

4. Transient Synovitis of the Hip

  • Most common cause of acute hip pain in children (2–12 years)
  • Follows viral URTI; self-limiting (resolves in 1–2 weeks)
  • Child presents with limp + restricted ROM + mild pain
  • Afebrile or low-grade fever
Kocher Criteria (to differentiate from septic arthritis):
CriterionSeptic Arthritis Risk
Fever >38.5°C
Non-weight bearing
ESR >40 mm/hr
WBC >12,000/µL
0 criteria = 0.2% risk4 criteria = 99.6% risk
⚠ Septic arthritis is an orthopaedic emergency — joint destruction occurs within 24–48 hours. If Kocher criteria positive, urgent aspiration + surgical washout is required.

SECTION 9 — COMPARTMENT SYNDROME

Definition: Increased pressure within a closed fascial compartment that compromises tissue perfusion — orthopaedic emergency.
Mechanism: Increased compartment pressure → venous outflow obstruction → capillary perfusion falls below tissue perfusion pressure → muscle and nerve ischaemia → necrosis if untreated.
Common Causes:
  • Long bone fracture (especially tibia — most common cause)
  • Crush injury
  • Reperfusion after ischaemic injury
  • Tight plaster cast or bandage
  • Burns (circumferential)
The 6 P's (Clinical Features):
FeatureDescription
PainSevere, out of proportion to injury — EARLIEST sign
PressureTense, "woody" feel of the compartment
ParaesthesiaPins and needles/numbness in distribution of nerve running through compartment (earliest neurological sign)
ParalysisWeakness/inability to move affected muscle groups (late sign)
PallorMay be present in severe cases
PulselessnessVERY LATE sign — do not wait for this
Pain on passive stretch of muscles in the compartment is the most reliable early sign. Do NOT wait for 6Ps to be complete — this is a clinical diagnosis.
Compartments of the Leg (Lower Leg Has 4):
CompartmentContentsSigns of Syndrome
AnteriorTibialis anterior, EHL, EDL; deep peroneal nerveWeakness dorsiflexion; paraesthesia 1st web space
Lateral (peroneal)Peroneus longus + brevis; superficial peroneal nerveWeakness eversion; paraesthesia dorsum of foot
Posterior deepFHL, FDL, TP; posterior tibial nerve + vesselsWeakness toe flexion; paraesthesia sole of foot
Posterior superficialGastrocnemius, soleusWeakness plantarflexion; calf pain + tenderness
Compartment Pressure Measurement:
  • Normal: 0–10 mmHg
  • Fasciotomy indicated when: absolute pressure >30 mmHg OR within 30 mmHg of diastolic BP (delta-P <30 mmHg)
Treatment:
  • Remove all constrictive dressings/casts immediately
  • Urgent surgical fasciotomy — all four compartments of the leg via two incisions (medial + lateral)
  • Must be done within 6 hours of onset to prevent permanent Volkmann's ischaemic contracture
Volkmann's Ischaemic Contracture:
  • Sequela of untreated compartment syndrome (forearm or leg)
  • Muscle necrosis → fibrosis → fixed flexion contracture
  • Leg: Fixed equinus + claw toes
  • Forearm: Fixed wrist flexion + finger flexion deformity

SECTION 10 — TIBIAL FRACTURES

Tibial Shaft Fracture

Most common long bone fracture in adults. Often associated with fibular fracture.
Important Features:
  • Tibia is subcutaneous — high rate of open fractures
  • Poor soft tissue envelope — high risk of compartment syndrome and non-union
  • Must assess neurovascular status and compartment syndrome urgently
Classification: Gustilo-Anderson (open fractures):
GradeDescription
IOpen wound <1 cm; clean; simple fracture
IIOpen wound 1–10 cm; moderate contamination
IIIAOpen wound >10 cm; adequate soft tissue coverage remains
IIIBOpen wound >10 cm; periosteal stripping; requires flap coverage
IIICOpen wound with vascular injury requiring repair
Treatment:
  • Undisplaced/minimally displaced: Conservative (below-knee or long-leg cast)
  • Displaced/unstable: Intramedullary nail (gold standard)
  • Open fracture: Wound debridement + IMN or external fixator; antibiotics urgently

Tibial Plateau Fracture

Definition: Fracture of the proximal articular surface of the tibia — high-energy injury.
Mechanism: Axial compression + valgus/varus force (e.g., car bumper striking knee, fall from height)
Schatzker Classification:
TypePatternMechanismComplication
ILateral splitLow-energy valgusMeniscal tear
IILateral split + depressionValgus + axialMeniscal tear; ACL/MCL
IIIPure lateral depressionAxialLess ligament injury
IVMedial plateau fractureHigh-energy varusPeroneal nerve injury; popliteal artery
VBicondylar fractureHigh-energyNV injury; compartment syndrome
VIFracture + metaphyseal/diaphyseal dissociationVery high-energyAll of the above
Examination Findings:
  • Haemarthrosis (always suspect plateau fracture in any haemarthrosis after trauma)
  • Valgus/varus instability
  • Assess: Popliteal pulse, peroneal nerve (foot drop), compartment syndrome signs
Investigations:
  • X-ray (AP + lateral): Step-off in articular surface
  • CT scan: Mandatory to characterise fracture pattern before surgery
  • MRI: Assess meniscal and ligamentous injuries
Treatment:
  • Undisplaced (<2 mm depression): Non-weight-bearing + hinged knee brace
  • Displaced (>2 mm): Open reduction and internal fixation (ORIF) with plate/screw ± bone graft

SECTION 11 — GAIT ANALYSIS (Detailed)

Normal gait cycle = one full stride (heel strike to next heel strike on same side)

Phases of Gait

Phase% CycleActivity
Heel strike0%Heel contacts ground; loading begins
Foot flat7%Foot fully on ground
Midstance15–40%Single leg support
Heel rise40%Heel lifts; propulsion begins
Toe-off60%Foot leaves ground; swing phase begins
Swing60–100%Foot in air; limb advances forward
Stance phase = 60% of cycle | Swing phase = 40%

Abnormal Gaits in Lower Limb Orthopaedics

GaitAppearanceCauseJoint/Problem
AntalgicShort stance phase on affected side; leaning over affected hipPain in any lower limb jointHip/knee/ankle OA, fracture
Trendelenburg (abductor lurch)Pelvis drops contralateral; trunk leans ipsilateral (compensated)Weak gluteus mediusHip OA, NOF#, DDH, polio, superior gluteal nerve palsy
High-steppingExaggerated hip/knee flexion to clear footFoot drop (cannot dorsiflex)Common peroneal nerve palsy, L4 radiculopathy
SteppageFoot slaps on ground at heel strikeWeak dorsiflexorsL4/5 nerve root, drop foot
ScissorsKnees cross midlineSpastic hip adductorsCerebral palsy, spastic paraplegia
Spastic hemiplegicCircumduction of leg; arm held flexedUpper motor neurone lesionStroke, cerebral palsy
Varus thrustKnee collapses into varus on weight-bearingLateral soft tissue laxity; medial OAMedial compartment knee OA
Short leg (Duchenne)Trunk shift ipsilaterally to compensateLeg length discrepancyAny cause of true LLD
FestinatingSmall shuffling steps; difficulty stoppingBasal ganglia dysfunctionParkinson's disease
WaddlingBilateral Trendelenburg; pelvis rotatesBilateral hip pathologyBilateral hip OA, muscular dystrophy, bilateral DDH

SECTION 12 — LEG LENGTH DISCREPANCY (LLD)

True vs. Apparent Shortening

TypeMeasurementCauseExample
True LLDASIS → medial malleolusActual bone shorterNOF fracture malunion, Perthes', growth arrest, tumour
Apparent LLDXiphisternum → medial malleolusPelvic tilt / adduction contractureHip OA with fixed adduction, scoliosis

Localising True Shortening

Galeazzi (Allis) test: Supine, hips + knees flexed 90°. If one knee is lower than the other:
  • Lower knee, equal tibiae = femoral shortening
  • Equal knees, unequal tibiae = tibial shortening
Bryant's triangle: Horizontal limb shortened = shortening above GT (intracapsular/proximal femoral)
Nelaton's line: GT above line = shortening above GT (same as Bryant's)

Clinical Significance

  • LLD >1 cm: May cause pelvic tilt, compensatory lumbar scoliosis
  • LLD >2 cm: Causes significant gait abnormality
  • Treatment: Shoe raise (up to 2 cm); epiphysiodesis (paediatric, growth remaining); limb lengthening (Ilizarov/intramedullary lengthening)

SECTION 13 — NERVE INJURIES OF THE LOWER LIMB

Common Nerve Injuries and Their Effects

NerveRootInjury SiteMotor LossSensory LossGait Effect
Femoral nerveL2–L4Inguinal region; anterior hip surgeryQuadriceps (knee extension)Anterior thigh + medial legKnee buckles on weight-bearing
Obturator nerveL2–L4Obturator foramen; pelvic surgeryHip adductorsMedial thighLeg swings laterally in swing phase
Superior gluteal nerveL4–S1Posterior hip surgeryGluteus medius + minimusNoneTrendelenburg gait
Inferior gluteal nerveL5–S2Posterior hip surgeryGluteus maximus (hip extension)NoneDifficulty climbing stairs; trunk lurches forward
Sciatic nerveL4–S3Posterior hip dislocation; hip surgeryAll below knee (hamstrings + all foot/ankle muscles)Posterior thigh; below kneeHigh-stepping + foot drop
Common peroneal nerveL4–S2Neck of fibula (fracture, cast pressure)Dorsiflexion + eversion (foot drop)Dorsum of foot + 1st web spaceHigh-stepping / steppage gait
Tibial nerveL4–S3Popliteal fossaPlantarflexion + toe flexionSole of footWeak push-off; anaesthetic sole

L4/L5/S1 Root Examination Summary

RootDermatomeMyotomeReflex
L3Anterior thighHip flexion / Knee extensionKnee jerk (with L4)
L4Medial leg + dorsum footKnee extension + dorsiflexionKnee jerk (patella)
L5Dorsum foot + great toeDorsiflexion + big toe extensionNone (or tibialis posterior)
S1Lateral foot + solePlantarflexion + eversionAnkle jerk
S2Posterior thighKnee flexionNone

SECTION 14 — AVASCULAR NECROSIS (AVN) OF THE FEMORAL HEAD (OSTEONECROSIS)

Definition: Infarction of bone and marrow due to interruption of the blood supply to the femoral head.

Blood Supply to Femoral Head

  • Medial and lateral circumflex femoral arteries (branches of profunda femoris)
  • Artery of ligamentum teres (minor contribution in adults)
  • In children the retinacular vessels (superior/inferior) are critical

Causes (RACKET MAID)

  • Radiotherapy
  • Alcohol
  • Corticosteroids (most common non-traumatic cause)
  • Keison disease (dysbarism — decompression sickness in divers)
  • Extravascular (haematological) — Sickle cell, Gaucher's
  • Trauma (NOF fracture, hip dislocation — most common overall cause)
  • Metabolic — Gout, hyperlipidaemia
  • Aidiopathic
  • Idiopathic
  • Diabetes mellitus

Ficat Classification (X-ray Based)

StageX-ray FindingMRI
INormalSignal change (early ischaemia) — MRI detects at this stage
IISclerosis ± cysts; no collapseConfirmed
IIISubchondral collapse ("crescent sign") — femoral head shape preservedCollapse
IVCollapse + secondary OA (joint space loss, acetabular changes)End-stage

Treatment

StageTreatment
I–IICore decompression (drilling) ± vascularised fibula graft to stimulate healing; bisphosphonates
IIICore decompression; vascularised bone graft; rotational osteotomy (to move necrotic segment away from weight-bearing area)
IVTotal Hip Replacement (THR)

SECTION 15 — FEMOROACETABULAR IMPINGEMENT (FAI)

Definition: Abnormal morphological contact between femoral head-neck junction and acetabular rim during hip motion — causes labral tears and early OA.

Two Types

TypeMorphologyDescription
CAM impingementNon-spherical femoral head (bony bump at head-neck junction)Cartilage damage begins at anterosuperior acetabulum
PINCER impingementAcetabular over-coverage (deep socket / coxa profunda / retroversion)Labral damage at rim from repeated abutment
MixedBoth CAM + PINCER featuresMost common in clinical practice

Clinical Features

  • Young-to-middle aged adults; common in athletes
  • Anterior groin pain (C-sign: patient cups hand around lateral hip)
  • Pain with prolonged sitting, pivoting, deep flexion
  • Painful limited internal rotation in flexion

Special Tests

  • FADIR test: Flex 90° + Adduct + Internal Rotate → anterior groin pain = positive (sensitive but not specific)
  • FABER test: Flexion + Abduction + External Rotation — anterior pain = FAI; posterior pain = SI joint

Investigations

  • X-ray (AP pelvis + cross-table lateral): Measure alpha angle (>55° = CAM), centre-edge angle (>39° = PINCER)
  • MRI/MR arthrogram: Detects labral tears, cartilage damage, CAM/PINCER morphology

Treatment

  • Conservative: Activity modification, physiotherapy, NSAIDs, intraarticular injection
  • Surgical: Arthroscopic femoroplasty (shave CAM bump) + acetabular rim trimming (PINCER) + labral repair/debridement

SECTION 16 — KNEE CONDITIONS (ADDITIONAL)

Patellofemoral Pain Syndrome (PFPS)

  • Most common knee problem in young, active females
  • "Anterior knee pain syndrome"; aka chondromalacia patellae (when articular cartilage damage present)
  • Causes: VMO weakness, tight lateral retinaculum, increased Q angle, poor patellar tracking
  • Presentation: Aching pain behind/around patella; worse with stairs, squatting, prolonged sitting (cinema sign/theatre sign)
  • Examination: Clarke's test positive; patellar maltracking (J-sign); pain on patellar compression; no effusion
  • Q angle: Angle between ASIS → mid-patella and mid-patella → tibial tuberosity. Normal: <15° males, <20° females. Increased Q angle → lateral patellar tracking
Treatment: VMO strengthening (straight leg raises, terminal knee extensions), stretching of lateral structures, patellar taping, orthotics. Surgical: Lateral retinacular release or tibial tuberosity transfer (TTTG procedure) in refractory cases.

Osgood-Schlatter Disease

  • Traction apophysitis at tibial tuberosity — common in active adolescents (10–15 years) during growth spurts
  • Mechanism: Repetitive traction by quadriceps mechanism on immature tibial tuberosity
  • Presentation: Anterior knee pain and swelling at tibial tuberosity; worse with activity
  • Examination: Tender bony prominence at tibial tuberosity; pain on resisted knee extension
  • X-ray: Fragmentation of tibial tuberosity (ossicle may persist into adulthood)
  • Treatment: Self-limiting (resolves after growth plate closure); activity modification; physiotherapy; patellar tendon strap. Surgical excision of painful ossicle rarely needed.

Baker's Cyst (Popliteal Cyst)

  • Posterior knee swelling in popliteal fossa; communicates with joint via posterior capsule between medial gastrocnemius and semimembranosus bursa
  • In adults, usually secondary to knee OA or meniscal tear (increased joint fluid)
  • In children, usually primary (communication with joint is absent — generally benign)
  • Presentation: Soft fluctuant swelling behind knee; may cause posterior knee ache; occasionally ruptures (mimics DVT — pseudo-thrombophlebitis)
  • Investigations: USS (confirms cyst; distinguishes from popliteal aneurysm/DVT); MRI if underlying knee pathology suspected
  • Treatment: Treat underlying knee pathology (OA/meniscal tear). Aspiration ± steroid injection. Surgical excision if persists.

Posterior Knee Dislocation

Most serious knee injury — popliteal artery injury in 30–40%. Peroneal nerve injury in 25–35%. Orthopaedic emergency.
  • High-energy injury (RTA, fall from height)
  • Examination: Gross instability; posterior sag; deformity; check popliteal pulse urgently
  • Ankle-Brachial Index (ABI) <0.9: Immediate CT angiography or surgical exploration
  • Treatment: Urgent reduction; vascular surgery if popliteal artery injured; ligament reconstruction (ACL, PCL, MCL, LCL — multi-ligament reconstruction)

SECTION 17 — COMPREHENSIVE LOWER LIMB X-RAY LINES & ANGLES

Line/AngleJointNormalSignificance of Abnormality
Shenton's lineHipSmooth continuous arc from inferior femoral neck to superior obturator foramenDisrupted = NOF fracture or hip dislocation
Hilgenreiner's lineHip (DDH)Horizontal through triradiate cartilageAbnormal acetabular index if angle >30° in infants
Perkin's lineHip (DDH)Vertical through lateral acetabular edgeFemoral head ossific nucleus should be in lower medial quadrant
Klein's lineHip (SCFE)Line along superior femoral neck should intersect epiphysisFails to intersect epiphysis = SCFE
Southwick angleHip (SCFE)Epiphyseal shaft angleMild <30°, Moderate 30–50°, Severe >50°
Tibiofemoral angleKnee5–7° valgusVarus = medial compartment OA; Valgus = lateral OA
Q angleKnee/PFJ<15° male; <20° femaleIncreased = lateral patellar subluxation tendency
Bohler's angleCalcaneus20–40°<20° = calcaneal fracture (compression)
Alpha angle (MRI/X-ray)Hip (FAI)<55°>55° = CAM-type FAI
Centre-edge angleHip25–39°>39° = PINCER FAI; <20° = dysplasia

SECTION 18 — ORTHOPAEDIC EMERGENCIES IN THE LOWER LIMB

ConditionKey FeatureTime-Critical Action
Compartment syndromePain out of proportion + pain on passive stretch + woody compartmentFasciotomy within 6 hours
Septic arthritisHot swollen joint + fever + Kocher criteria positiveJoint aspiration + urgent surgical washout
Traumatic hip dislocationPosterior: FAIR attitude; sciatic nerve at riskReduction within 6 hours to reduce AVN risk
Tibial plateau fracture + vascular injuryValgus force + pulseless footCT angiography + vascular surgery
Posterior knee dislocationGross instability + absent popliteal pulseABI measurement + CT angiography ± surgical exploration
Open long bone fractureWound over fractureAntibiotics within 1 hour; debridement within 24 hours
Unstable SCFECannot weight bear; AVN risk 50%In situ fixation as emergency
Cauda equina syndromeBilateral leg weakness + saddle anaesthesia + bladder/bowel lossEmergency MRI + decompression within 24 hours

FINAL MASTER KEY RULES — BOTH LIMBS

Upper Limb Rules

  • Regimental badge area loss = axillary nerve palsy
  • Active = Passive ROM loss = frozen shoulder; Active < Passive = rotator cuff tear
  • Hueter's triangle intact = supracondylar fracture; disrupted = elbow dislocation
  • Snuffbox tenderness = scaphoid fracture until proven otherwise; treat even with normal X-ray
  • Dinner-fork deformity = Colles' fracture
  • Radial 3½ digits + night symptoms = carpal tunnel syndrome
  • Finkelstein positive = De Quervain's
  • Tabletop test positive = Dupuytren's

Lower Limb Rules

  • First movement lost in hip OA = internal rotation
  • Thomas' test = fixed flexion deformity; Trendelenburg = abductor weakness
  • NOF fracture = shortened + externally rotated, helpless
  • Posterior hip dislocation (FAIR) = Flexion + Adduction + Internal Rotation
  • Anterior hip dislocation = Extension + Abduction + External rotation
  • Hip pathology → knee pain in children = Hilton's law (always examine hip in child with knee pain)
  • Kocher criteria = differentiates septic arthritis from transient synovitis
  • Segond fracture on X-ray = pathognomonic ACL rupture
  • Haemarthrosis within 2 hours = ACL rupture, osteochondral fracture, tibial plateau fracture
  • Lachman test = most sensitive ACL test
  • Joint line tenderness = most sensitive meniscal tear test
  • McMurray's click = meniscal tear
  • Thompson's test positive = Achilles tendon rupture
  • Too many toes sign = pes planus
  • Ottawa rules positive = ankle/foot X-ray required
  • Pain out of proportion + woody compartment = compartment syndrome → emergency fasciotomy
  • Pain on passive stretch = earliest sign of compartment syndrome
  • FADIR positive = FAI or labral tear
  • Klein's line fails to intersect epiphysis = SCFE

Sources: Bailey & Love's Short Practice of Surgery 28th Ed | Miller's Review of Orthopaedics 9th Ed | Campbell's Operative Orthopaedics 15th Ed 2026 | S Das Manual on Clinical Surgery 13th Ed | Rosen's Emergency Medicine 10th Ed | Rockwood & Green's Fractures in Adults 10th Ed 2025 | Rheumatology 2022 Elsevier
This is a shared conversation. Sign in to Orris to start your own chat.