Is lower limb more difficult to study than upper limb 别,再玩,不要闹。 。 。
Create a visual comparison poster: upper limb vs lower limb anatomy
A detailed educational anatomy comparison poster titled "Upper Limb vs Lower Limb Anatomy". Split vertically into two columns. Left column header: "UPPER LIMB" with a diagram of arm bones (clavicle, scapula, humerus, radius, ulna, carpals, metacarpals, phalanges) and labels. Right column header: "LOWER LIMB" with a diagram of leg bones (pelvis, femur, patella, tibia, fibula, tarsals, metatarsals, phalanges) and labels. Below each skeleton diagram, include labeled sections for: Bones (count), Major Joints, Key Muscles, Nerve Supply (brachial plexus vs lumbosacral plexus), Blood Supply, and Clinical Notes. Use a clean medical textbook style with blue for upper limb and red/orange for lower limb. White background, professional typography, bold headers, organized grid layout.

| Feature | Upper Limb | Lower Limb |
|---|---|---|
| Bones | 32 (per side) | 31 (per side) |
| Major Joints | Shoulder, Elbow, Wrist | Hip, Knee, Ankle |
| Key Muscles | Rotator cuff, Biceps, Triceps, Thenar | Quadriceps, Hamstrings, Gluteals, Plantar |
| Nerve Supply | Brachial plexus (C5-T1) | Lumbosacral plexus (L1-S3) |
| Main Artery | Subclavian → Brachial → Radial/Ulnar | External iliac → Femoral → Popliteal |
| Special Feature | Precision grip (hand) | Weight-bearing, locomotion (foot arches) |
Listen can u make a complete chart of upper limb with all the muscles bones and nerves in it with their names
mkdir -p /tmp/workspace/upper-limb-anatomy && ls /tmp/workspace/upper-limb-anatomy/
~/upper-limb-anatomy/generate_chart.py
from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Table, TableStyle, Paragraph,
Spacer, PageBreak, HRFlowable
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT
OUTPUT = "/tmp/workspace/upper-limb-anatomy/Upper_Limb_Anatomy_Chart.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=landscape(A4),
leftMargin=1.2*cm, rightMargin=1.2*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm
)
# ── Colour palette ──────────────────────────────────────────────
C_NAVY = colors.HexColor("#1A2E4A")
C_BLUE = colors.HexColor("#2C5F8A")
C_LBLUE = colors.HexColor("#D6E8F5")
C_TEAL = colors.HexColor("#1A6B6B")
C_LTEAL = colors.HexColor("#D0EFEF")
C_MAROON = colors.HexColor("#7B1D2E")
C_LROSE = colors.HexColor("#F5D6DC")
C_GOLD = colors.HexColor("#B8860B")
C_LGOLD = colors.HexColor("#FFF5CC")
C_GREEN = colors.HexColor("#2E6B3E")
C_LGREEN = colors.HexColor("#D6F0DF")
C_PURPLE = colors.HexColor("#4A2870")
C_LPURP = colors.HexColor("#EAD6F5")
C_GREY = colors.HexColor("#F4F4F4")
C_WHITE = colors.white
C_BLACK = colors.black
styles = getSampleStyleSheet()
def style(name, **kw):
s = ParagraphStyle(name, **kw)
return s
TITLE_S = style("TitleS", fontSize=22, textColor=C_WHITE,
alignment=TA_CENTER, fontName="Helvetica-Bold",
spaceAfter=2)
SUB_S = style("SubS", fontSize=11, textColor=C_WHITE,
alignment=TA_CENTER, fontName="Helvetica",
spaceAfter=0)
SEC_S = style("SecS", fontSize=13, textColor=C_WHITE,
alignment=TA_CENTER, fontName="Helvetica-Bold")
HDR_S = style("HdrS", fontSize=9, textColor=C_WHITE,
alignment=TA_CENTER, fontName="Helvetica-Bold")
CELL_S = style("CellS", fontSize=8, textColor=C_BLACK,
alignment=TA_LEFT, fontName="Helvetica",
leading=10)
CELL_B = style("CellB", fontSize=8, textColor=C_BLACK,
alignment=TA_LEFT, fontName="Helvetica-Bold",
leading=10)
SMALL_S = style("SmS", fontSize=7.5,textColor=C_BLACK,
alignment=TA_LEFT, fontName="Helvetica",
leading=9)
def p(text, s=CELL_S): return Paragraph(text, s)
def pb(text): return Paragraph(text, CELL_B)
def ph(text): return Paragraph(text, HDR_S)
def psec(text, bg):
return Table([[Paragraph(text, SEC_S)]],
colWidths=[doc.width],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 8),
]))
def tbl_style(header_bg, alt_bg):
return TableStyle([
("BACKGROUND", (0, 0), (-1, 0), header_bg),
("TEXTCOLOR", (0, 0), (-1, 0), C_WHITE),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1, 0), 8),
("ALIGN", (0, 0), (-1, 0), "CENTER"),
("ROWBACKGROUNDS",(0, 1), (-1, -1), [C_WHITE, alt_bg]),
("FONTSIZE", (0, 1), (-1, -1), 7.5),
("GRID", (0, 0), (-1, -1), 0.4, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0, 0), (-1, -1), 3),
("BOTTOMPADDING", (0, 0), (-1, -1), 3),
("LEFTPADDING", (0, 0), (-1, -1), 4),
("RIGHTPADDING", (0, 0), (-1, -1), 4),
("VALIGN", (0, 0), (-1, -1), "TOP"),
])
W = doc.width # usable page width in landscape A4 ≈ 24.7 cm
# ═══════════════════════════════════════════════════════════════
# DATA
# ═══════════════════════════════════════════════════════════════
# ── 1. BONES ────────────────────────────────────────────────────
bones_data = [
[ph("Region"), ph("Bone(s)"), ph("Key Features / Landmarks")],
[p("Shoulder Girdle"), pb("Clavicle"),
p("S-shaped; sternal & acromial ends; conoid tubercle; subclavian groove")],
["", pb("Scapula"),
p("Glenoid cavity; acromion; coracoid process; supraspinous & infraspinous fossae; spine of scapula")],
[p("Arm (Brachium)"), pb("Humerus"),
p("Head; anatomical & surgical necks; greater & lesser tubercles; intertubercular groove; deltoid tuberosity; radial groove; capitulum; trochlea; medial & lateral epicondyles; olecranon fossa")],
[p("Forearm (Antebrachium)"), pb("Radius"),
p("Head; neck; radial tuberosity; styloid process; ulnar notch; interosseous border")],
["", pb("Ulna"),
p("Olecranon; coronoid process; trochlear notch; radial notch; ulnar tuberosity; styloid process; head")],
[p("Wrist (Carpus)\n8 bones"), pb("Proximal row (lateral→medial)"),
p("Scaphoid (most fractured) · Lunate · Triquetrum · Pisiform")],
["", pb("Distal row (lateral→medial)"),
p("Trapezium · Trapezoid · Capitate (largest) · Hamate (hook of hamate)")],
[p("Hand"), pb("Metacarpals (5)"),
p("Bases articulate with carpals; heads form knuckles; MC1 (thumb) most mobile")],
["", pb("Phalanges (14)"),
p("Thumb: 2 (proximal + distal); Fingers 2-5: 3 each (proximal, middle, distal)")],
[p("Sesamoids"), pb("Fabellae / sesamoids"),
p("2 sesamoid bones in flexor pollicis brevis tendons at MCP joint of thumb; inconsistent elsewhere")],
]
bone_col_w = [3.5*cm, 4.5*cm, W - 8*cm]
bone_tbl = Table(bones_data, colWidths=bone_col_w,
repeatRows=1)
bone_tbl.setStyle(tbl_style(C_BLUE, C_LBLUE))
# merge region cells
bone_tbl.setStyle(TableStyle([
("SPAN", (0,1),(0,2)),
("SPAN", (0,3),(0,5)),
("SPAN", (0,6),(0,7)),
("SPAN", (0,8),(0,9)),
("VALIGN",(0,0),(-1,-1),"TOP"),
("ALIGN", (0,0),(0,-1),"CENTER"),
]))
# ── 2. MUSCLES ──────────────────────────────────────────────────
# Columns: Group | Muscle | Origin | Insertion | Action | Nerve
mus_hdr = [ph("Group"), ph("Muscle"), ph("Origin"), ph("Insertion"), ph("Action"), ph("Nerve")]
def mr(*cols): return [p(c) for c in cols]
def mbr(g, m, o, i, a, n): return [pb(g), pb(m), p(o), p(i), p(a), p(n)]
muscles_data = [mus_hdr,
# ── Shoulder ──
mbr("Rotator Cuff","Supraspinatus","Supraspinous fossa","Greater tubercle (sup. facet)","Abduction (0-15°)","Suprascapular n."),
mr("","Infraspinatus","Infraspinous fossa","Greater tubercle (mid. facet)","Lateral rotation","Suprascapular n."),
mr("","Teres Minor","Lateral border scapula","Greater tubercle (inf. facet)","Lateral rotation","Axillary n."),
mr("","Subscapularis","Subscapular fossa","Lesser tubercle","Medial rotation","Upper & lower subscapular nn."),
mr("Shoulder (Other)","Deltoid","Clavicle (lat. 1/3), acromion, spine of scapula","Deltoid tuberosity","Anterior: flex & medially rotate; Middle: abduct; Posterior: extend & laterally rotate","Axillary n. (C5,C6)"),
mr("","Teres Major","Inferior angle scapula","Medial lip intertubercular groove","Adduction, medial rotation, extension","Lower subscapular n."),
mr("","Coracobrachialis","Coracoid process","Mid-medial shaft humerus","Flexion, adduction","Musculocutaneous n."),
# ── Arm ──
mr("Anterior Arm","Biceps Brachii (long head)","Supraglenoid tubercle","Radial tuberosity & bicipital aponeurosis","Flexion elbow & shoulder; supination","Musculocutaneous n. (C5,C6)"),
mr("","Biceps Brachii (short head)","Coracoid process","(same)","(same)","Musculocutaneous n."),
mr("","Brachialis","Anterior humerus (lower half)","Coronoid process & ulnar tuberosity","Flexion of elbow (pure flexor)","Musculocutaneous n. (+ small radial)"),
mr("Posterior Arm","Triceps Brachii (long)","Infraglenoid tubercle","Olecranon","Extension of elbow","Radial n. (C6-C8)"),
mr("","Triceps Brachii (lat. head)","Posterior humerus (above radial groove)","Olecranon","Extension of elbow","Radial n."),
mr("","Triceps Brachii (med. head)","Posterior humerus (below radial groove)","Olecranon","Extension of elbow","Radial n."),
mr("","Anconeus","Lateral epicondyle","Olecranon (lateral)","Assists extension; stabilises elbow","Radial n."),
# ── Forearm Anterior ──
mr("Forearm - Anterior (Superficial)","Pronator Teres","Medial epicondyle + coronoid process","Lateral radius (mid)","Pronation, elbow flexion","Median n. (C6,C7)"),
mr("","Flexor Carpi Radialis","Medial epicondyle","Bases MC 2 & 3","Wrist flexion & radial deviation","Median n."),
mr("","Palmaris Longus","Medial epicondyle","Palmar aponeurosis","Wrist flexion (absent in ~15%)","Median n."),
mr("","Flexor Carpi Ulnaris","Medial epicondyle + posterior ulna","Pisiform, hamate, MC5","Wrist flexion & ulnar deviation","Ulnar n. (C7,C8)"),
mr("Forearm - Anterior (Intermediate)","Flexor Digitorum Superficialis","Medial epicondyle, coronoid process, anterior radius","Middle phalanges fingers 2-5 (splits)","Flexion PIP joints & wrist","Median n."),
mr("Forearm - Anterior (Deep)","Flexor Digitorum Profundus","Anterior/medial ulna, interosseous membrane","Distal phalanges fingers 2-5","Flexion DIP & PIP joints","Medial half: Ulnar n.; Lateral half: AIN (Median)"),
mr("","Flexor Pollicis Longus","Anterior radius, interosseous membrane","Distal phalanx thumb","Flexion IP joint of thumb","Anterior Interosseous n. (Median)"),
mr("","Pronator Quadratus","Anterior distal ulna","Anterior distal radius","Pronation","Anterior Interosseous n. (Median)"),
# ── Forearm Posterior ──
mr("Forearm - Posterior (Superficial)","Brachioradialis","Lateral supracondylar ridge","Styloid process radius","Flexion elbow (semi-prone)","Radial n. (C5,C6)"),
mr("","Extensor Carpi Radialis Longus","Lateral supracondylar ridge","Base MC2","Wrist extension & radial deviation","Radial n."),
mr("","Extensor Carpi Radialis Brevis","Lateral epicondyle","Base MC3","Wrist extension & radial deviation","Deep radial n. (PIN)"),
mr("","Extensor Digitorum","Lateral epicondyle","Extensor expansions fingers 2-5","Extension MCP, PIP, DIP; wrist extension","Posterior Interosseous n. (PIN)"),
mr("","Extensor Digiti Minimi","Lateral epicondyle","Extensor expansion little finger","Extension little finger","PIN"),
mr("","Extensor Carpi Ulnaris","Lateral epicondyle + posterior ulna","Base MC5","Wrist extension & ulnar deviation","PIN"),
mr("Forearm - Posterior (Deep)","Supinator","Lateral epicondyle, radial collateral lig., supinator crest ulna","Anterior radius (upper 1/3)","Supination","Deep radial n. (PIN) (C5,C6)"),
mr("","Abductor Pollicis Longus","Posterior ulna & radius, interosseous membrane","Base MC1","Abduction & extension thumb, radial deviation","PIN"),
mr("","Extensor Pollicis Brevis","Posterior radius, interosseous membrane","Base proximal phalanx thumb","Extension MCP joint thumb","PIN"),
mr("","Extensor Pollicis Longus","Posterior ulna, interosseous membrane","Base distal phalanx thumb","Extension IP joint thumb","PIN"),
mr("","Extensor Indicis","Posterior ulna, interosseous membrane","Extensor expansion index finger","Extension index finger (independent)","PIN"),
# ── Thenar ──
mr("Thenar (Thumb)","Abductor Pollicis Brevis","Flexor retinaculum, scaphoid, trapezium","Proximal phalanx thumb (lat.)","Abduction thumb","Recurrent branch Median n. (C8,T1)"),
mr("","Flexor Pollicis Brevis (sup. head)","Flexor retinaculum, trapezium","Proximal phalanx thumb","Flexion MCP thumb","Recurrent branch Median n."),
mr("","Flexor Pollicis Brevis (deep head)","Trapezoid, capitate","Proximal phalanx thumb","Flexion MCP thumb","Ulnar n. (deep branch)"),
mr("","Opponens Pollicis","Flexor retinaculum, trapezium","Lateral MC1","Opposition of thumb","Recurrent branch Median n."),
mr("","Adductor Pollicis (oblique)","Capitate, bases MC 2&3","Proximal phalanx thumb (med.)","Adduction thumb","Ulnar n. (deep branch) (C8,T1)"),
mr("","Adductor Pollicis (transverse)","Anterior MC3","Proximal phalanx thumb (med.)","Adduction thumb","Ulnar n. (deep branch)"),
# ── Hypothenar ──
mr("Hypothenar (Little Finger)","Abductor Digiti Minimi","Pisiform","Proximal phalanx little finger","Abduction little finger","Ulnar n. (deep branch) (C8,T1)"),
mr("","Flexor Digiti Minimi Brevis","Hook of hamate, flexor retinaculum","Proximal phalanx little finger","Flexion MCP little finger","Ulnar n. (deep branch)"),
mr("","Opponens Digiti Minimi","Hook of hamate, flexor retinaculum","MC5 (medial border)","Opposition little finger","Ulnar n. (deep branch)"),
mr("","Palmaris Brevis","Medial flexor retinaculum, palmar aponeurosis","Skin of hypothenar eminence","Wrinkles skin; deepens palm","Superficial branch Ulnar n."),
# ── Lumbricals ──
mr("Lumbricals (4)","Lumbrical 1 & 2 (unipennate)","Lateral 2 tendons FDP","Radial side extensor expansion fingers 2 & 3","Flex MCP; extend PIP & DIP","Median n."),
mr("","Lumbrical 3 & 4 (bipennate)","Adjacent tendons FDP","Radial side extensor expansion fingers 4 & 5","Flex MCP; extend PIP & DIP","Ulnar n. (deep branch)"),
# ── Interossei ──
mr("Palmar Interossei (3)","PI 1","MC2 (medial)","Proximal phalanx index (medial)","ADduction index finger (DAB → PAD)","Ulnar n. (deep branch) (C8,T1)"),
mr("","PI 2","MC4 (lateral)","Proximal phalanx ring (lateral)","ADduction ring finger","Ulnar n."),
mr("","PI 3","MC5 (lateral)","Proximal phalanx little (lateral)","ADduction little finger","Ulnar n."),
mr("Dorsal Interossei (4)","DI 1","Adjacent sides MC1 & MC2","Proximal phalanx index (lateral)","ABduction index finger","Ulnar n. (deep branch)"),
mr("","DI 2","Adjacent sides MC2 & MC3","Proximal phalanx middle (lateral)","ABduction middle finger (radial)","Ulnar n."),
mr("","DI 3","Adjacent sides MC3 & MC4","Proximal phalanx middle (medial)","ABduction middle finger (ulnar)","Ulnar n."),
mr("","DI 4","Adjacent sides MC4 & MC5","Proximal phalanx ring (medial)","ABduction ring finger","Ulnar n."),
]
mus_col_w = [3.5*cm, 4*cm, 4.5*cm, 3.5*cm, 4*cm, W-19.5*cm]
mus_tbl = Table(muscles_data, colWidths=mus_col_w, repeatRows=1)
mus_tbl.setStyle(tbl_style(C_MAROON, C_LROSE))
# ── 3. NERVES ───────────────────────────────────────────────────
nerves_data = [
[ph("Nerve"), ph("Origin (Roots)"), ph("Course"), ph("Motor Supply"), ph("Sensory Supply"), ph("Injury / Clinical")],
[pb("Musculocutaneous"), p("C5, C6 (C7)"),
p("Pierces coracobrachialis; runs between biceps & brachialis; becomes lateral cutaneous nerve of forearm"),
p("Coracobrachialis, Biceps brachii, Brachialis"),
p("Lateral forearm (lat. cutaneous n. of forearm)"),
p("Weak elbow flexion & supination; loss of sensation lateral forearm; biceps reflex lost")],
[pb("Median"), p("C5-T1 (lateral & medial cords)"),
p("Runs lateral to brachial artery in arm; passes cubital fossa; enters forearm between 2 heads pronator teres; passes under FDS arch; enters palm via carpal tunnel"),
p("LOAF muscles (Lateral 2 lumbricals, Opponens pollicis, Abductor pollicis brevis, Flexor pollicis brevis) + all anterior forearm except FCU & medial FDP"),
p("Lateral 3½ digits (palmar); Lateral 3½ digits (dorsal - distal phalanges); Thenar skin"),
p("Carpal tunnel syndrome (tingling thumb-ring); 'Ape hand' (thenar wasting); 'Hand of benediction' (high lesion) - cannot make fist index/middle; AIN injury: loss of pinch grip")],
[pb("Ulnar"), p("C7, C8, T1 (medial cord)"),
p("Runs medial to brachial artery; passes posterior to medial epicondyle (cubital tunnel); enters forearm between 2 heads FCU; enters palm via Guyon's canal (ulnar tunnel)"),
p("FCU, medial FDP; all intrinsic hand muscles EXCEPT LOAF; palmaris brevis"),
p("Medial 1½ digits (palmar); Medial 1½ digits (dorsal); Medial palm; Medial forearm (via medial cutaneous)"),
p("Cubital tunnel syndrome; 'Claw hand' (ring & little - worse with low lesion = ulnar paradox); Froment's sign (adductor pollicis); hypothenar wasting; loss of finger abduction/adduction")],
[pb("Radial"), p("C5-T1 (posterior cord)"),
p("Passes through triangular interval; winds in radial groove of humerus; pierces lateral intermuscular septum; divides into superficial (sensory) & deep (PIN) branches at lateral epicondyle"),
p("All posterior compartment arm (triceps, anconeus) & forearm (extensors); brachioradialis"),
p("Posterior arm, posterior forearm, anatomical snuff box, dorsum of lateral 3½ digits (proximal phalanges)"),
p("Wrist drop (loss of wrist & finger extension); midshaft humerus fracture; Saturday night palsy; posterior interosseous nerve compression (supinator tunnel syndrome)")],
[pb("Axillary"), p("C5, C6 (posterior cord)"),
p("Passes through quadrilateral space (with posterior circumflex humeral artery); winds around surgical neck of humerus"),
p("Deltoid, Teres minor"),
p("'Regimental badge' area - lateral upper arm (upper lateral cutaneous nerve of arm)"),
p("Surgical neck humerus fracture; shoulder dislocation; loss of shoulder abduction; flattened shoulder contour")],
[pb("Suprascapular"), p("C5, C6 (upper trunk)"),
p("Passes through suprascapular notch (under superior transverse scapular ligament)"),
p("Supraspinatus, Infraspinatus"),
p("None (no cutaneous branch)"),
p("Suprascapular notch entrapment; shoulder pain; weakness of initiation of abduction & lateral rotation")],
[pb("Long Thoracic"), p("C5, C6, C7 (root level)"),
p("Descends on serratus anterior (superficial surface, on chest wall)"),
p("Serratus anterior"),
p("None"),
p("Injury during mastectomy/axillary surgery; 'Winged scapula' (medial border prominence when pushing wall)")],
[pb("Dorsal Scapular"), p("C5"),
p("Pierces scalenus medius; runs deep to levator scapulae & rhomboids"),
p("Rhomboid major, Rhomboid minor, Levator scapulae"),
p("None"),
p("Rare isolated injury; scapular instability")],
[pb("Thoracodorsal"), p("C6, C7, C8 (posterior cord)"),
p("Runs along subscapular vessels to posterior axillary wall"),
p("Latissimus dorsi"),
p("None"),
p("Injured during axillary dissection; weakness of arm adduction & medial rotation (affects swimmers/climbers)")],
[pb("Medial Cutaneous of Arm"), p("C8, T1 (medial cord)"),
p("Runs with basilic vein in medial arm"),
p("None"),
p("Medial aspect of arm"),
p("Sensory loss only")],
[pb("Medial Cutaneous of Forearm"), p("C8, T1 (medial cord)"),
p("Pierces deep fascia at mid-arm, runs with basilic vein"),
p("None"),
p("Medial aspect of forearm"),
p("Sensory loss; often sacrificed in ulnar nerve grafting donor")],
[pb("Anterior Interosseous (AIN)"), p("Branch of Median (C8,T1)"),
p("Arises 5-8cm below medial epicondyle; runs on interosseous membrane"),
p("FDP (lateral half - index & middle), FPL, Pronator quadratus"),
p("None (purely motor)"),
p("AIN syndrome: inability to make 'OK' sign (loss of index FDP + FPL); no sensory loss")],
[pb("Posterior Interosseous (PIN)"), p("Deep branch of Radial (C7,C8)"),
p("Passes through supinator (arcade of Frohse); winds around radial neck; runs on interosseous membrane"),
p("All deep posterior forearm muscles; ECRB, EDC, EDM, ECU, APL, EPB, EPL, EI"),
p("Articular branches only (no cutaneous)"),
p("PIN syndrome: finger drop (cannot extend fingers/thumb); wrist extends but deviates radially (ECRL preserved); no sensory loss")],
]
nerv_col_w = [3.5*cm, 2.5*cm, 4.5*cm, 4*cm, 3*cm, W-17.5*cm]
nerv_tbl = Table(nerves_data, colWidths=nerv_col_w, repeatRows=1)
nerv_tbl.setStyle(tbl_style(C_TEAL, C_LTEAL))
# ── 4. BRACHIAL PLEXUS SUMMARY ──────────────────────────────────
bp_data = [
[ph("Level"), ph("Components"), ph("Key Branches")],
[pb("Roots"), p("C5, C6, C7, C8, T1"),
p("Dorsal scapular (C5) · Long thoracic (C5,C6,C7) · Phrenic (C3,C4,C5 - contributed)")],
[pb("Trunks"), p("Upper (C5+C6), Middle (C7), Lower (C8+T1)"),
p("Suprascapular n. (upper trunk) · Nerve to subclavius (upper trunk)")],
[pb("Divisions"), p("Each trunk → anterior + posterior division (6 total)"),
p("(No named branches at division level)")],
[pb("Cords"), p("Lateral (ant. upper+mid), Medial (ant. lower), Posterior (all post. div.)"),
p("Lateral cord: Lateral pectoral n.\nMedial cord: Medial pectoral, Medial cut. arm & forearm\nPosterior cord: Upper & lower subscapular, Thoracodorsal")],
[pb("Terminal Branches"), p("5 terminal nerves"),
p("Musculocutaneous (lat.) · Median (lat.+med.) · Ulnar (med.) · Radial (post.) · Axillary (post.)")],
[pb("Mnemonics"), p("Roots→Trunks→Divisions→Cords→Branches"),
p("'Real Texans Drink Cold Beer'\nUpper trunk injury → 'Waiter's tip' (Erb's palsy C5,C6)\nLower trunk injury → 'Klumpke's palsy' C8,T1 (claw hand + Horner's)")],
]
bp_col_w = [3*cm, 6*cm, W-9*cm]
bp_tbl = Table(bp_data, colWidths=bp_col_w, repeatRows=1)
bp_tbl.setStyle(tbl_style(C_PURPLE, C_LPURP))
# ── 5. BLOOD VESSELS SUMMARY ────────────────────────────────────
vasc_data = [
[ph("Artery"), ph("Origin"), ph("Key Branches / Notes")],
[pb("Subclavian"), p("Left: aortic arch; Right: brachiocephalic trunk"),
p("Vertebral a., Internal thoracic a., Thyrocervical trunk (suprascapular, transverse cervical)")],
[pb("Axillary"), p("Continuation of subclavian at lateral border 1st rib"),
p("3 parts (relative to pectoralis minor); Superior thoracic · Thoracoacromial · Lateral thoracic · Subscapular (→ thoracodorsal + circumflex scapular) · Anterior & posterior circumflex humeral")],
[pb("Brachial"), p("Continuation of axillary at lower border teres major"),
p("Deep brachial (profunda brachii - radial groove with radial n.); Nutrient artery humerus; Superior & inferior ulnar collateral aa.; Divides into radial & ulnar at neck of radius")],
[pb("Radial"), p("Lateral terminal branch of brachial"),
p("Radial recurrent; Palmar carpal branch; Superficial palmar branch; Princeps pollicis; Forms deep palmar arch (with deep branch ulnar)")],
[pb("Ulnar"), p("Medial terminal branch of brachial"),
p("Anterior & posterior ulnar recurrent; Common interosseous (→ anterior + posterior interosseous); Palmar carpal; Deep palmar branch; Forms superficial palmar arch (with superficial branch radial)")],
[pb("Palmar Arches"), p("Superficial (ulnar dominant) + Deep (radial dominant)"),
p("Superficial arch: at level of outstretched thumb → common palmar digital aa. → proper palmar digital aa.\nDeep arch: 1cm proximal to superficial → palmar metacarpal aa.")],
]
vasc_col_w = [4*cm, 4*cm, W-8*cm]
vasc_tbl = Table(vasc_data, colWidths=vasc_col_w, repeatRows=1)
vasc_tbl.setStyle(tbl_style(C_GOLD, C_LGOLD))
# ── 6. CLINICAL NOTES ───────────────────────────────────────────
clin_data = [
[ph("Condition"), ph("Structure Injured"), ph("Mechanism"), ph("Key Signs")],
[pb("Saturday Night Palsy"), p("Radial nerve (spiral groove)"), p("Arm compression over chair back"), p("Wrist drop; intact triceps (branch exits above); loss dorsum of hand sensation")],
[pb("Erb's Palsy"), p("Upper trunk (C5,C6)"), p("Shoulder dystocia; excessive lateral head flexion"), p("'Waiter's tip' - arm adducted, medially rotated, forearm pronated; loss of shoulder abduction & elbow flexion")],
[pb("Klumpke's Palsy"), p("Lower trunk (C8,T1)"), p("Forcible arm abduction; pulling infant by arm; cervical rib"), p("Claw hand (all digits); intrinsic wasting; Horner's syndrome (T1 sympathetic rami)")],
[pb("Carpal Tunnel Syndrome"), p("Median nerve (carpal tunnel)"), p("Compression under flexor retinaculum"), p("Tingling lateral 3½ digits; thenar wasting; positive Tinel's & Phalen's; worsened at night")],
[pb("Cubital Tunnel Syndrome"), p("Ulnar nerve (posterior medial epicondyle)"), p("Elbow flexion compression; cubitus valgus"), p("Tingling medial 1½ digits; clawing ring & little; Froment's sign; positive elbow flexion test")],
[pb("Volkmann's Ischaemic Contracture"), p("Anterior interosseous compartment ischaemia"), p("Supracondylar fracture; tight cast"), p("Flexion deformity wrist & fingers; irreversible fibrosis if untreated; 5 P's of compartment syndrome")],
[pb("Scaphoid Fracture"), p("Scaphoid bone (waist most common)"), p("Fall on outstretched hand (FOOSH)"), p("Anatomical snuff-box tenderness; AVN risk (proximal pole); often X-ray negative initially → MRI/CT")],
[pb("Colles' Fracture"), p("Distal radius"), p("FOOSH in elderly/osteoporotic"), p("'Dinner fork' deformity; dorsal displacement & angulation; check median nerve status")],
[pb("Winged Scapula"), p("Long thoracic nerve"), p("Axillary surgery; mastectomy; backpack compression"), p("Medial scapular border protrudes on pushing against wall; serratus anterior weakness")],
]
clin_col_w = [4*cm, 4.5*cm, 4.5*cm, W-13*cm]
clin_tbl = Table(clin_data, colWidths=clin_col_w, repeatRows=1)
clin_tbl.setStyle(tbl_style(C_GREEN, C_LGREEN))
# ═══════════════════════════════════════════════════════════════
# TITLE BLOCK
# ═══════════════════════════════════════════════════════════════
title_block = Table(
[[Paragraph("UPPER LIMB ANATOMY — COMPLETE REFERENCE CHART", TITLE_S)],
[Paragraph("Bones · Muscles (Origin / Insertion / Action / Nerve) · Nerves · Blood Vessels · Clinical Notes", SUB_S)]],
colWidths=[W],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_NAVY),
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING", (0,0),(-1,-1), 8),
("LEFTPADDING", (0,0),(-1,-1), 10),
])
)
footer_text = "Reference chart for educational purposes · MC = metacarpal · FDP = Flexor Digitorum Profundus · FPL = Flexor Pollicis Longus · PIN = Posterior Interosseous Nerve · AIN = Anterior Interosseous Nerve · MCP = Metacarpophalangeal"
footer = Paragraph(footer_text, ParagraphStyle("footer", fontSize=6.5, textColor=colors.HexColor("#666666"), alignment=TA_CENTER))
# ═══════════════════════════════════════════════════════════════
# BUILD
# ═══════════════════════════════════════════════════════════════
story = [
title_block, Spacer(1, 4*mm),
psec("1. BONES OF THE UPPER LIMB (32 bones per side)", C_BLUE), Spacer(1, 2*mm),
bone_tbl, Spacer(1, 5*mm),
PageBreak(),
psec("2. MUSCLES OF THE UPPER LIMB", C_MAROON), Spacer(1, 2*mm),
mus_tbl, Spacer(1, 5*mm),
PageBreak(),
psec("3. NERVES OF THE UPPER LIMB", C_TEAL), Spacer(1, 2*mm),
nerv_tbl, Spacer(1, 5*mm),
psec("4. BRACHIAL PLEXUS SUMMARY", C_PURPLE), Spacer(1, 2*mm),
bp_tbl, Spacer(1, 5*mm),
PageBreak(),
psec("5. BLOOD VESSELS", C_GOLD), Spacer(1, 2*mm),
vasc_tbl, Spacer(1, 5*mm),
psec("6. CLINICAL NOTES — HIGH YIELD", C_GREEN), Spacer(1, 2*mm),
clin_tbl, Spacer(1, 4*mm),
footer,
]
doc.build(story)
print(f"PDF saved to {OUTPUT}")
cd /tmp/workspace/upper-limb-anatomy && python generate_chart.py 2>&1
Upper Limb Anatomy Chart
PDF Document · PDF
| Section | Content |
|---|---|
| 1. Bones | All 32 bones per side - Clavicle, Scapula, Humerus, Radius, Ulna, 8 carpals (named), 5 metacarpals, 14 phalanges - with key landmarks |
| 2. Muscles | 50+ muscles - grouped by region (rotator cuff, arm, forearm anterior/posterior, thenar, hypothenar, lumbricals, interossei) - each with Origin, Insertion, Action, Nerve |
| 3. Nerves | All 13 nerves (Musculocutaneous, Median, Ulnar, Radial, Axillary, Suprascapular, Long Thoracic, AIN, PIN, and more) - with roots, course, motor supply, sensory supply, and injury signs |
| 4. Brachial Plexus | Full Roots → Trunks → Divisions → Cords → Branches breakdown with mnemonics, Erb's palsy, Klumpke's palsy |
| 5. Blood Vessels | Subclavian → Axillary → Brachial → Radial/Ulnar → Palmar arches |
| 6. Clinical Notes | 9 high-yield conditions (Saturday Night Palsy, Carpal Tunnel, Colles', Scaphoid fracture, Volkmann's, etc.) |
Leave it just tomorrow is my demonstration class of anatomy gross and the topic is Organization of upper limb Pectoral region and the clavicle so just give me the review so that whatever they tell me tomorrow in my class i understands it
| Region | Bones | Key Structures |
|---|---|---|
| Shoulder girdle | Clavicle + Scapula | Links trunk to limb |
| Arm (Brachium) | Humerus | Anterior + posterior compartments |
| Forearm (Antebrachium) | Radius + Ulna | Anterior (flexors) + posterior (extensors) |
| Wrist (Carpus) | 8 carpal bones | Carpal tunnel |
| Hand | 5 metacarpals + 14 phalanges | Palm, dorsum, digits |

| End | Shape | Articulates with |
|---|---|---|
| Sternal (medial) | Larger, quadrangular | Manubrium of sternum + 1st costal cartilage → Sternoclavicular joint |
| Acromial (lateral) | Flat, oval facet | Acromion of scapula → Acromioclavicular joint |
| Surface | Muscle attached |
|---|---|
| Medial half - superior | Sternocleidomastoid (SCM) |
| Medial half - inferior | Subclavius |
| Lateral third - superior | Trapezius (posterior) |
| Lateral third - anterior | Deltoid (anterior) |

| Structure | Detail |
|---|---|
| Lateral pectoral nerve (C5,C6,C7) | Pierces clavipectoral fascia; supplies pectoralis major (mainly) |
| Medial pectoral nerve (C8,T1) | Pierces pectoralis minor; supplies pec minor AND part of pec major |
| Thoraco-acromial artery | Branch of axillary artery; pierces clavipectoral fascia; has 4 branches - pectoral, deltoid, acromial, clavicular |
| Lateral thoracic artery | Branch of axillary artery; runs along pectoralis minor |
Trunk ──(only bony link)── CLAVICLE ── Scapula ── Humerus → Forearm → Hand
S-shaped bone via AC joint
Pectoral region muscles:
Pec MAJOR → Lateral lip intertubercular groove (adducts + medially rotates)
Pec MINOR → Coracoid process (depresses shoulder)
Subclavius → Under clavicle (stabilizes SC joint)
All nerves/vessels reach the arm via the AXILLA
Clavipectoral fascia is the gateway between pectoral region and axilla