i need to study the anatomy like for the full bones and full muscle and joints and tell me the notes for studying
human anatomy study notes bones muscles joints complete overview
| Type | Description |
|---|---|
| Compact (cortical) | Dense bone forming the outer shell of ALL bones |
| Spongy (trabecular/cancellous) | Spicules of bone enclosing cavities containing marrow |
| Type | Description | Examples |
|---|---|---|
| Long bones | Tubular; longer than wide | Humerus, femur, tibia, fibula, radius, ulna |
| Short bones | Cuboidal; roughly equal dimensions | Carpals (wrist), tarsals (ankle) |
| Flat bones | Two compact plates + spongy bone between | Skull, scapula, sternum, ribs |
| Irregular bones | Various shapes; don't fit other categories | Vertebrae, facial bones |
| Sesamoid bones | Round/oval; develop inside tendons | Patella (kneecap), sesamoids of thumb/big toe |
"The sites where two skeletal elements come together are termed joints." - Gray's Anatomy for Students
| Type | Movement | Example |
|---|---|---|
| Plane (gliding) | Gliding/sliding in one plane | Intercarpal, intertarsal joints |
| Hinge | Flexion/extension only (1 axis) | Elbow (humeroulnar), interphalangeal joints |
| Pivot | Rotation around longitudinal axis (1 axis) | Atlantoaxial joint (C1-C2), proximal radioulnar |
| Bicondylar | Mostly 1 axis + limited rotation | Knee joint, temporomandibular joint |
| Condylar (ellipsoid) | 2 axes at right angles; flex/ext + abd/add + circumduction | Wrist (radiocarpal) joint |
| Saddle | 2 axes; saddle-shaped surfaces; flex/ext + abd/add + circumduction | Carpometacarpal joint of the thumb |
| Ball-and-socket | Multiple axes; full ROM including rotation | Hip joint, shoulder (glenohumeral) joint |
| Type | Description | Example |
|---|---|---|
| Sutures | Only in skull; thin sutural ligament | Coronal, sagittal, lambdoid sutures |
| Gomphoses | Tooth in bony socket; periodontal ligament | Teeth in alveoli |
| Syndesmoses | Two bones linked by a ligament | Ligamentum flavum (vertebrae), interosseous membrane (radius-ulna) |
| Type | Description | Example |
|---|---|---|
| Synchondroses | Two ossification centers separated by cartilage; eventually ossify | Epiphyseal growth plates |
| Symphyses | Two bones connected by fibrocartilage; mostly midline | Pubic symphysis, intervertebral discs |
| Joint | Type | Key Features |
|---|---|---|
| Shoulder (glenohumeral) | Ball-and-socket | Most mobile joint; least stable; reinforced by rotator cuff |
| Elbow | Hinge (+ pivot) | Humeroulnar + humeroradial + proximal radioulnar |
| Wrist (radiocarpal) | Condylar/ellipsoid | Flexion, extension, radial/ulnar deviation |
| Hip | Ball-and-socket | Very stable; acetabulum + femoral head; reinforced by strong ligaments |
| Knee | Bicondylar (modified hinge) | Largest joint; ACL/PCL + medial/lateral menisci + collateral ligaments |
| Ankle (talocrural) | Hinge | Tibia + fibula + talus; dorsiflexion + plantarflexion |
| Atlantoaxial (C1-C2) | Pivot | Head rotation (nodding = atlantooccipital; rotation = atlantoaxial) |
| Type | Appearance | Control | Location |
|---|---|---|---|
| Skeletal muscle | Striated (striped) | Voluntary (somatic motor nerves) | Body wall, limbs, head/neck |
| Cardiac muscle | Striated + branching | Involuntary | Heart wall + large proximal vessels |
| Smooth muscle | Non-striated | Involuntary (autonomic) | Viscera, blood vessels, skin (arrector pili) |
| Term | Meaning |
|---|---|
| Origin | Fixed proximal attachment point |
| Insertion | Moving distal attachment point |
| Belly | The main contractile body of the muscle |
| Tendon | Dense connective tissue connecting muscle to bone |
| Aponeurosis | Flat, sheet-like tendon |
| Fascia | Connective tissue surrounding muscles; forms compartments |
| Bursa | Fluid-filled sac reducing friction at tendons/joints |
| Retinaculum | Thickened fascia near joints; holds tendons in place |
JOINTS
│
├── SYNOVIAL (cavity present)
│ ├── Plane → gliding (intercarpal)
│ ├── Hinge → 1 axis (elbow, IP joints)
│ ├── Pivot → rotation (atlantoaxial, proximal radioulnar)
│ ├── Bicondylar → mainly 1 axis (knee)
│ ├── Condylar (ellipsoid) → 2 axes (wrist)
│ ├── Saddle → 2 axes (thumb CMC)
│ └── Ball-and-socket → multiaxial (hip, shoulder)
│
└── SOLID (no cavity)
├── FIBROUS
│ ├── Sutures (skull)
│ ├── Gomphoses (teeth)
│ └── Syndesmoses (interosseous membranes)
└── CARTILAGINOUS
├── Synchondroses (growth plates)
└── Symphyses (pubic symphysis, IVDs)
Create a study guide PDF with bone landmarks you can print and label
mkdir -p /home/daytona/workspace/bone-landmarks-pdf && ls /home/daytona/workspac…
~/bone-landmarks-pdf/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
from reportlab.platypus.flowables import Flowable
import reportlab.lib.colors as rlc
OUTPUT = "/home/daytona/workspace/bone-landmarks-pdf/Bone_Landmarks_Study_Guide.pdf"
# ── colour palette ──────────────────────────────────────────────────────────
NAVY = colors.HexColor("#1B3A5C")
TEAL = colors.HexColor("#1A7A8A")
GOLD = colors.HexColor("#D4A017")
LIGHT_BG = colors.HexColor("#F0F6F8")
PALE_GOLD = colors.HexColor("#FFF8E7")
WHITE = colors.white
LIGHT_GREY= colors.HexColor("#E8EEF2")
MID_GREY = colors.HexColor("#6B7C8D")
# ── document ────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=2*cm, bottomMargin=2*cm,
title="Bone Landmarks Study Guide",
author="Orris – Anatomy Study",
)
W, H = A4
CONTENT_W = W - 3.6*cm
styles = getSampleStyleSheet()
# ── custom paragraph styles ─────────────────────────────────────────────────
def make_style(name, parent="Normal", **kw):
return ParagraphStyle(name, parent=styles[parent], **kw)
title_style = make_style("DocTitle", fontSize=26, textColor=WHITE,
leading=32, alignment=TA_CENTER, fontName="Helvetica-Bold")
sub_title = make_style("SubTitle", fontSize=12, textColor=colors.HexColor("#CFE8ED"),
leading=16, alignment=TA_CENTER)
section_hdr = make_style("SectionHdr", fontSize=14, textColor=WHITE,
leading=18, fontName="Helvetica-Bold", alignment=TA_CENTER)
bone_name = make_style("BoneName", fontSize=11, textColor=NAVY,
leading=14, fontName="Helvetica-Bold")
body_txt = make_style("BodyTxt", fontSize=9, textColor=colors.HexColor("#2C3E50"),
leading=13, fontName="Helvetica")
hint_txt = make_style("HintTxt", fontSize=8, textColor=MID_GREY,
leading=11, fontName="Helvetica-Oblique")
label_hdr = make_style("LabelHdr", fontSize=8.5, textColor=NAVY,
leading=11, fontName="Helvetica-Bold")
tip_style = make_style("TipStyle", fontSize=8.5, textColor=colors.HexColor("#5D4037"),
leading=12, fontName="Helvetica")
footer_style = make_style("Footer", fontSize=7.5, textColor=MID_GREY,
alignment=TA_CENTER)
# ── helpers ──────────────────────────────────────────────────────────────────
class ColorRect(Flowable):
"""A filled rectangle used as a section header banner."""
def __init__(self, w, h, fill, text="", text_style=None, radius=4):
Flowable.__init__(self)
self.w = w; self.h = h; self.fill = fill
self.text = text; self.ts = text_style; self.radius = radius
def draw(self):
self.canv.setFillColor(self.fill)
self.canv.roundRect(0, 0, self.w, self.h, self.radius, stroke=0, fill=1)
if self.text and self.ts:
from reportlab.platypus import Paragraph
p = Paragraph(self.text, self.ts)
pw, ph = p.wrap(self.w - 20, self.h)
p.drawOn(self.canv, 10, (self.h - ph) / 2)
def wrap(self, *args):
return self.w, self.h
class LabelBox(Flowable):
"""A blank label box the student fills in."""
def __init__(self, w=4*cm, h=1*cm, label_num=None):
Flowable.__init__(self)
self.w = w; self.h = h; self.num = label_num
def draw(self):
c = self.canv
c.setStrokeColor(TEAL)
c.setLineWidth(0.6)
c.roundRect(0, 0, self.w, self.h, 3, stroke=1, fill=0)
if self.num:
c.setFont("Helvetica-Bold", 7)
c.setFillColor(TEAL)
c.drawString(3, self.h - 9, str(self.num))
def wrap(self, *args):
return self.w, self.h
def section_banner(title_text, color=NAVY):
return [
Spacer(1, 0.35*cm),
ColorRect(CONTENT_W, 0.85*cm, color, title_text, section_hdr),
Spacer(1, 0.25*cm),
]
def landmark_table(rows_data, col_widths=None):
"""
rows_data: list of [landmark_name, description, label_box_flowable]
"""
if col_widths is None:
col_widths = [4.5*cm, 9.5*cm, 4.2*cm]
table_data = [[
Paragraph("LANDMARK", label_hdr),
Paragraph("DESCRIPTION / CLINICAL NOTE", label_hdr),
Paragraph("WRITE IT IN", label_hdr),
]]
for i, (lm, desc, _) in enumerate(rows_data):
bg = LIGHT_BG if i % 2 == 0 else WHITE
table_data.append([
Paragraph(f"<b>{lm}</b>", bone_name),
Paragraph(desc, body_txt),
LabelBox(w=4*cm, h=1.1*cm, label_num=i+1),
])
style = TableStyle([
("BACKGROUND", (0, 0), (-1, 0), NAVY),
("TEXTCOLOR", (0, 0), (-1, 0), WHITE),
("ROWBACKGROUNDS",(0,1),(-1,-1), [LIGHT_BG, WHITE]),
("GRID", (0, 0), (-1, -1), 0.4, colors.HexColor("#C5D5DC")),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING",(0, 0), (-1, -1), 5),
("LEFTPADDING", (0, 0), (-1, -1), 5),
("RIGHTPADDING", (0, 0), (-1, -1), 5),
("ROWBACKGROUNDS",(0,0),(-1,0), [NAVY]),
])
t = Table(table_data, colWidths=col_widths, repeatRows=1)
t.setStyle(style)
return t
def tip_box(text):
data = [[Paragraph(f"<b>Study Tip:</b> {text}", tip_style)]]
t = Table(data, colWidths=[CONTENT_W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), PALE_GOLD),
("BOX", (0,0),(-1,-1), 0.8, GOLD),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1),6),
("LEFTPADDING", (0,0),(-1,-1),8),
]))
return t
# ── page callbacks ───────────────────────────────────────────────────────────
def on_page(canvas, doc):
canvas.saveState()
# footer line
canvas.setStrokeColor(TEAL)
canvas.setLineWidth(0.5)
canvas.line(1.8*cm, 1.5*cm, W - 1.8*cm, 1.5*cm)
canvas.setFont("Helvetica", 7.5)
canvas.setFillColor(MID_GREY)
canvas.drawString(1.8*cm, 1.1*cm, "Bone Landmarks Study Guide | Orris Anatomy Series")
canvas.drawRightString(W - 1.8*cm, 1.1*cm, f"Page {doc.page}")
canvas.restoreState()
def on_first_page(canvas, doc):
# Full-bleed header block
canvas.setFillColor(NAVY)
canvas.rect(0, H - 6.5*cm, W, 6.5*cm, stroke=0, fill=1)
# Accent stripe
canvas.setFillColor(TEAL)
canvas.rect(0, H - 6.5*cm, W, 0.3*cm, stroke=0, fill=1)
# Gold accent bar left
canvas.setFillColor(GOLD)
canvas.rect(0, H - 6.5*cm, 0.55*cm, 6.5*cm, stroke=0, fill=1)
on_page(canvas, doc)
# ── build content ─────────────────────────────────────────────────────────────
story = []
# ── COVER / TITLE BLOCK ──────────────────────────────────────────────────────
story.append(Spacer(1, 3.8*cm)) # push below the painted header
story.append(Paragraph("BONE LANDMARKS", title_style))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("Print & Label Study Guide", sub_title))
story.append(Spacer(1, 0.5*cm))
intro_data = [[Paragraph(
"This guide covers <b>key bony landmarks</b> for every major bone. "
"For each landmark, read the description, then write the name in the label box "
"from memory — the best active-recall technique for anatomy exams. "
"Reproduce each bone from the diagrams in your atlas and mark the numbered landmarks.",
make_style("IntroPara", fontSize=9.5, textColor=colors.HexColor("#CFE8ED"),
leading=14, alignment=TA_CENTER)
)]]
intro_tbl = Table(intro_data, colWidths=[CONTENT_W])
intro_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), colors.HexColor("#243F5E")),
("TOPPADDING",(0,0),(-1,-1),10),("BOTTOMPADDING",(0,0),(-1,-1),10),
("LEFTPADDING",(0,0),(-1,-1),15),("RIGHTPADDING",(0,0),(-1,-1),15),
]))
story.append(intro_tbl)
story.append(Spacer(1, 0.4*cm))
# how-to box
how_data = [[
Paragraph("HOW TO USE", make_style("HowHdr", fontSize=9, textColor=NAVY,
fontName="Helvetica-Bold", leading=12)),
Paragraph(
"1. Cover the LANDMARK column. "
"2. Read the description. "
"3. Write the landmark name in the box. "
"4. Check your answer. "
"5. Repeat until perfect.",
make_style("HowBody", fontSize=8.5, textColor=colors.HexColor("#2C3E50"), leading=12))
]]
how_tbl = Table(how_data, colWidths=[3*cm, CONTENT_W - 3*cm])
how_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(0,0), TEAL),
("BACKGROUND", (1,0),(1,0), LIGHT_GREY),
("TEXTCOLOR", (0,0),(0,0), WHITE),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("TOPPADDING",(0,0),(-1,-1),8),("BOTTOMPADDING",(0,0),(-1,-1),8),
("LEFTPADDING",(0,0),(-1,-1),8),
]))
story.append(how_tbl)
story.append(PageBreak())
# ===========================================================================
# SECTION 1 – SKULL
# ===========================================================================
story += section_banner("1 | SKULL & FACIAL BONES", NAVY)
story.append(landmark_table([
("Glabella", "Smooth elevation between the eyebrows on the frontal bone; useful surface landmark for frontal sinus.", None),
("Supraorbital foramen", "Opening in the supraorbital margin transmitting the supraorbital nerve and vessels.", None),
("Zygomatic arch", "Bony bridge formed by zygomatic process of temporal + temporal process of zygomatic bone.", None),
("Mastoid process", "Rounded bony projection posterior to the ear (temporal bone); attachment for SCM muscle.", None),
("Styloid process", "Slender spike inferior to mastoid; origin of stylohyoid, styloglossus, stylopharyngeus.", None),
("External occipital protuberance (EOP)", "Midline bump at back of skull; palpable; ligamentum nuchae attachment.", None),
("Foramen magnum", "Large opening in occipital bone; brainstem passes through here.", None),
("Sella turcica", "Saddle-shaped depression in sphenoid body; houses the pituitary gland.", None),
("Pterion", "H-shaped junction of frontal, parietal, temporal, sphenoid — thinnest skull region; overlies middle meningeal artery.", None),
("Mental foramen", "On anterior mandible below 2nd premolar; mental nerve exits here (branch of V3).", None),
], col_widths=[4.8*cm, 9.2*cm, 4.2*cm]))
story.append(Spacer(1, 0.2*cm))
story.append(tip_box("Pterion is the classic exam MCQ: epidural haematoma from middle meningeal artery injury. Palpate the mastoid process and zygomatic arch on yourself."))
# ===========================================================================
# SECTION 2 – VERTEBRAL COLUMN
# ===========================================================================
story += section_banner("2 | VERTEBRAL COLUMN", TEAL)
story.append(landmark_table([
("Vertebral body", "Weight-bearing anterior cylinder; separated by intervertebral discs (fibrocartilage).", None),
("Pedicle", "Short, stout bridges connecting body to arch; pedicle screws placed here in spinal surgery.", None),
("Lamina", "Posterior flat plates forming the roof of the vertebral canal; removed in laminectomy.", None),
("Spinous process", "Posterior midline projection; palpable as the 'bumps' down your back.", None),
("Transverse process", "Lateral projections; rib articulation sites (T1-T12); intertransversarii muscle attachments.", None),
("Superior/inferior articular facets", "Paired joints (zygapophyseal) between adjacent vertebrae; orientation varies by region.", None),
("Vertebral foramen", "Central canal; spinal cord + meninges pass through the column of these openings.", None),
("Intervertebral foramen", "Between adjacent pedicles; spinal nerve exits here; compressed in disc herniation.", None),
("Dens (odontoid process)", "Peg on C2 axis; C1 (atlas) rotates around it; #dens fracture = life-threatening.", None),
("Sacral hiatus", "Inferior opening of sacral canal; used for caudal epidural injections.", None),
], col_widths=[4.8*cm, 9.2*cm, 4.2*cm]))
story.append(Spacer(1, 0.2*cm))
story.append(tip_box("Vertebral levels: C7 = most prominent spine (vertebra prominens). T4 = sternal angle. L4 = iliac crest level (lumbar puncture landmark)."))
story.append(PageBreak())
# ===========================================================================
# SECTION 3 – THORACIC CAGE
# ===========================================================================
story += section_banner("3 | THORACIC CAGE", NAVY)
story.append(landmark_table([
("Manubrium", "Upper part of sternum; articulates with clavicles and 1st ribs.", None),
("Sternal angle (of Louis)", "Junction of manubrium + body; T4/5 disc level; 2nd rib articulation; bifurcation of trachea.", None),
("Xiphoid process", "Inferior tip of sternum; xiphisternal junction = T9; CPR landmark.", None),
("Costal angle", "Angle of rib where it bends anterolaterally; weakest part of rib (common fracture site).", None),
("Costal groove", "Inferior inner surface of rib; neurovascular bundle runs here — aim ABOVE rib for needle insertion.", None),
("Costal cartilages", "Hyaline cartilage joining ribs 1-7 directly to sternum; 8-10 join each other.", None),
("Subcostal angle", "Angle between costal margins at xiphoid; normal ~70°; widened in COPD barrel chest.", None),
], col_widths=[4.8*cm, 9.2*cm, 4.2*cm]))
story.append(Spacer(1, 0.2*cm))
story.append(tip_box("Remember: Ribs 1-7 = true ribs (direct sternal attachment). 8-10 = false ribs. 11-12 = floating ribs (no anterior attachment)."))
# ===========================================================================
# SECTION 4 – PECTORAL GIRDLE & UPPER LIMB
# ===========================================================================
story += section_banner("4 | PECTORAL GIRDLE (Clavicle & Scapula)", TEAL)
story.append(landmark_table([
("Clavicle – sternal end", "Medial end; articulates at sternoclavicular joint (SC joint) — only bony link of upper limb to axial skeleton.", None),
("Clavicle – acromial end","Lateral end; forms AC joint with acromion of scapula.", None),
("Acromion", "Flat lateral projection of scapular spine; roof of shoulder joint; AC joint above.", None),
("Coracoid process", "Beak-shaped anterior projection; origin of coracobrachialis, short head of biceps; insertion of pectoralis minor.", None),
("Glenoid fossa", "Shallow oval socket of scapula; articulates with humeral head at glenohumeral joint.", None),
("Scapular spine", "Posterior ridge across scapula; separates supra- from infraspinous fossae.", None),
("Supraspinous fossa", "Above scapular spine; supraspinatus muscle sits here.", None),
("Infraspinous fossa", "Below scapular spine; infraspinatus muscle fills this.", None),
("Subscapular fossa", "Anterior (costal) surface; subscapularis muscle origin.", None),
("Inferior angle", "Lowest tip of scapula; overlies 7th/8th rib; used to count ribs posteriorly.", None),
], col_widths=[4.8*cm, 9.2*cm, 4.2*cm]))
story.append(Spacer(1, 0.2*cm))
story.append(tip_box("Rotator cuff (SITS): Supraspinatus (abduction 0-15°), Infraspinatus (lateral rotation), Teres minor (lateral rotation), Subscapularis (medial rotation)."))
story.append(PageBreak())
# ===========================================================================
# SECTION 5 – HUMERUS
# ===========================================================================
story += section_banner("5 | HUMERUS", NAVY)
story.append(landmark_table([
("Head", "Articulates with glenoid fossa; covered with hyaline cartilage.", None),
("Anatomical neck", "Narrow groove between head and greater/lesser tubercles.", None),
("Surgical neck", "Narrowing below tubercles; common fracture site; axillary nerve & posterior circumflex artery at risk.", None),
("Greater tubercle", "Lateral projection; SITS insertions: supraspinatus (superior facet), infraspinatus (middle), teres minor (inferior).", None),
("Lesser tubercle", "Anterior projection; subscapularis insertion.", None),
("Bicipital groove (intertubercular sulcus)", "Between tubercles; long head of biceps tendon runs here; latissimus dorsi, teres major, pectoralis major insert around it.", None),
("Deltoid tuberosity", "Roughened V-shaped area mid-shaft; deltoid muscle insertion.", None),
("Radial groove (spiral groove)", "Oblique groove on posterior shaft; radial nerve + profunda brachii artery; damaged in mid-shaft humeral fracture.", None),
("Medial epicondyle", "Medial projection at distal end; ulnar nerve passes posterior to it (cubital tunnel).", None),
("Lateral epicondyle", "Lateral projection; common extensor origin; inflamed in tennis elbow (lateral epicondylitis).", None),
("Capitulum", "Rounded lateral condyle; articulates with radial head.", None),
("Trochlea", "Spool-shaped medial condyle; articulates with ulnar trochlear notch.", None),
("Olecranon fossa", "Posterior depression above trochlea; receives olecranon in full elbow extension.", None),
("Coronoid fossa", "Anterior depression; receives coronoid process of ulna in elbow flexion.", None),
], col_widths=[4.8*cm, 9.2*cm, 4.2*cm]))
story.append(Spacer(1, 0.2*cm))
story.append(tip_box("Radial nerve injury at radial groove → wrist drop (loss of wrist + finger extension). Ulnar nerve at medial epicondyle → 'funny bone' tingling in ring + little finger."))
story.append(PageBreak())
# ===========================================================================
# SECTION 6 – RADIUS & ULNA
# ===========================================================================
story += section_banner("6 | RADIUS & ULNA", TEAL)
story.append(landmark_table([
("Radial head", "Disc-shaped; articulates with capitulum (humerus) and radial notch of ulna; palpate in cubital fossa.", None),
("Radial tuberosity", "Medial projection below neck; biceps brachii tendon inserts here.", None),
("Radial styloid process","Lateral distal projection; extends ~1 cm more distally than ulnar styloid.", None),
("Lister's tubercle", "Dorsal ridge on distal radius; extensor pollicis longus wraps around it.", None),
("Olecranon", "Proximal end of ulna; forms the point of the elbow; triceps inserts here.", None),
("Coronoid process", "Anterior projection just below trochlear notch; brachialis insertion.", None),
("Trochlear notch", "C-shaped notch on ulna; articulates with humeral trochlea.", None),
("Ulnar styloid process", "Medial distal projection; ulnar collateral ligament of wrist attaches.", None),
("Interosseous border", "Sharp medial border of radius and lateral border of ulna; interosseous membrane connects them.", None),
("Ulnar head", "Distal rounded knob of ulna; palpable at wrist; articulates at distal radioulnar joint.", None),
], col_widths=[4.8*cm, 9.2*cm, 4.2*cm]))
story.append(Spacer(1, 0.2*cm))
story.append(tip_box("Colles fracture = distal radius fracture; 'dinner fork' deformity; FOOSH (Fall On Out-Stretched Hand). Radial styloid is more distal than ulnar — used to identify which bone is which on plain X-ray."))
story.append(PageBreak())
# ===========================================================================
# SECTION 7 – CARPALS, METACARPALS, PHALANGES
# ===========================================================================
story += section_banner("7 | HAND BONES (Carpals, Metacarpals, Phalanges)", NAVY)
story.append(Paragraph("<b>Carpal bones (proximal row, lateral to medial): Scaphoid, Lunate, Triquetrum, Pisiform</b>", body_txt))
story.append(Paragraph("<b>Carpal bones (distal row, lateral to medial): Trapezium, Trapezoid, Capitate, Hamate</b>", body_txt))
story.append(Paragraph("Mnemonic: <i>\"Some Lovers Try Positions That They Can't Handle\"</i>", hint_txt))
story.append(Spacer(1, 0.2*cm))
story.append(landmark_table([
("Scaphoid tubercle", "Palpable in anatomical snuffbox floor; most commonly fractured carpal (FOOSH); avascular necrosis risk.", None),
("Pisiform", "Sesamoid bone in flexor carpi ulnaris tendon; palpable on medial wrist.", None),
("Hook of hamate", "Hooked projection on palmar surface; ulnar nerve + artery pass lateral to it; fractured in racket sports.", None),
("Trapezium", "Saddle-shaped; articulates with 1st metacarpal at thumb CMC joint (most mobile joint in hand).", None),
("Metacarpal head", "Forms the 'knuckles'; base of each finger; articulates at MCP joint.", None),
("Phalanges", "Proximal, middle, distal (except thumb = proximal + distal only). Distal phalanx = fingertip.", None),
("Styloid of 3rd metacarpal", "Dorsal projection at base of 3rd MC; palpable on dorsum of hand.", None),
], col_widths=[4.8*cm, 9.2*cm, 4.2*cm]))
story.append(Spacer(1, 0.2*cm))
story.append(tip_box("Carpal tunnel boundaries: flexor retinaculum (roof), carpal bones (floor). Contents: median nerve + 9 flexor tendons. Scaphoid fractures easily missed on initial X-ray — treat as fracture if snuffbox tenderness exists."))
story.append(PageBreak())
# ===========================================================================
# SECTION 8 – PELVIS & HIP BONE
# ===========================================================================
story += section_banner("8 | PELVIS & HIP BONE", TEAL)
story.append(Paragraph("<b>Hip bone = Ilium + Ischium + Pubis (fuse at triradiate cartilage by age 16-17)</b>", body_txt))
story.append(Spacer(1, 0.2*cm))
story.append(landmark_table([
("Iliac crest", "Superior curved border of ilium; palpable hip 'top'; L4 vertebral level; bone marrow biopsy site.", None),
("ASIS (Anterior Superior Iliac Spine)", "Anterior tip of iliac crest; sartorius and inguinal ligament attach; used in gait analysis.", None),
("AIIS (Anterior Inferior Iliac Spine)", "Below ASIS; straight head of rectus femoris + iliofemoral ligament.", None),
("PSIS (Posterior Superior Iliac Spine)", "Dimple of Venus; S2 level; site for sacroiliac joint injection.", None),
("Acetabulum", "Deep cup-shaped socket; formed by all 3 hip bones; articulates with femoral head.", None),
("Acetabular notch", "Inferior gap in acetabulum; transmits acetabular artery (branch of obturator).", None),
("Ischial spine", "Sharp projection of ischium; sacrospinous ligament attaches; pudendal nerve block landmark.", None),
("Ischial tuberosity", "Large rough projection; you sit on these! Hamstring origin (sitting bone).", None),
("Greater sciatic notch", "Between PSIS and ischial spine; piriformis and sciatic nerve exit here.", None),
("Pubic symphysis", "Midline fibrocartilaginous joint between pubic bodies.", None),
("Pubic tubercle", "Medial end of inguinal ligament; inguinal hernia emerges medial to it (direct) or lateral (indirect).", None),
("Obturator foramen", "Large oval foramen in hip bone; obturator nerve and vessels pass through obturator canal (superiorly).", None),
], col_widths=[4.8*cm, 9.2*cm, 4.2*cm]))
story.append(Spacer(1, 0.2*cm))
story.append(tip_box("ASIS to pubic tubercle = inguinal ligament (Poupart's ligament). Femoral triangle: medial = adductor longus, lateral = sartorius, superior = inguinal ligament. Contents (lateral to medial): Nerve, Artery, Vein, Empty, Lymphatics — 'NAVEL'."))
story.append(PageBreak())
# ===========================================================================
# SECTION 9 – FEMUR
# ===========================================================================
story += section_banner("9 | FEMUR", NAVY)
story.append(landmark_table([
("Head", "2/3 sphere; articulates with acetabulum; ligament of head carries small artery (foveal artery).", None),
("Fovea capitis", "Small pit on femoral head; attachment of ligamentum teres.", None),
("Neck", "Connects head to shaft at ~125° neck-shaft angle; fractures here in elderly (osteoporosis).", None),
("Greater trochanter", "Large lateral projection at neck-shaft junction; gluteus medius/minimus insertion; palpable landmark.", None),
("Lesser trochanter", "Posteromedial projection; iliopsoas (iliacus + psoas major) inserts here.", None),
("Intertrochanteric line","Anterior line between trochanters; iliofemoral ligament attachment.", None),
("Intertrochanteric crest","Posterior ridge between trochanters; quadratus femoris inserts on quadrate tubercle.", None),
("Linea aspera", "Rough posterior ridge of femoral shaft; multiple muscle attachments (adductors, vastus lateralis/medialis).", None),
("Lateral condyle", "Lateral distal knob; articulates with lateral tibial plateau; iliotibial band inserts on Gerdy's tubercle.", None),
("Medial condyle", "Medial distal knob; projects more inferiorly; medial knee compartment.", None),
("Lateral epicondyle", "Lateral bony projection above condyle; fibular collateral ligament + popliteus tendon.", None),
("Medial epicondyle", "Medial projection; tibial collateral ligament attachment.", None),
("Adductor tubercle", "Small projection above medial epicondyle; adductor magnus tendon insertion.", None),
("Intercondylar notch", "Posterior groove between condyles; ACL and PCL lie within here.", None),
("Patellar surface", "Anterior smooth groove between condyles; patella glides here.", None),
], col_widths=[4.8*cm, 9.2*cm, 4.2*cm]))
story.append(Spacer(1, 0.2*cm))
story.append(tip_box("Femoral neck fracture in elderly: Garden classification (I-IV). Blood supply: retinacular arteries in capsule — disrupted in displaced fractures → avascular necrosis of femoral head."))
story.append(PageBreak())
# ===========================================================================
# SECTION 10 – PATELLA, TIBIA, FIBULA
# ===========================================================================
story += section_banner("10 | PATELLA, TIBIA & FIBULA", TEAL)
story.append(landmark_table([
("Patella – apex", "Inferior point; patellar ligament (quadriceps tendon continues as this) attaches to tibial tuberosity.", None),
("Patella – base", "Superior surface; quadriceps tendon inserts.", None),
("Tibial plateau", "Superior flat surface of tibia; medial + lateral articular facets; weight-bearing surface.", None),
("Tibial tuberosity", "Anterior projection below plateau; patellar ligament inserts here; Osgood-Schlatter disease site in adolescents.", None),
("Gerdy's tubercle", "Lateral tibial flare; iliotibial band insertion; marker for IT band syndrome.", None),
("Anterior crest (shin)", "Sharp anterior border of tibia; subcutaneous (no muscle cover) — vulnerable to direct blows.", None),
("Medial malleolus", "Medial bony projection at distal tibia; forms medial wall of ankle mortise.", None),
("Lateral malleolus", "Distal end of fibula; extends ~1 cm more distally than medial malleolus; lateral ankle mortise.", None),
("Fibular head", "Proximal fibula; palpable below knee; common peroneal nerve winds around neck — vulnerable.", None),
("Fibular neck", "Just below fibular head; common peroneal nerve here; fracture = foot drop.", None),
("Posterior malleolus", "Posterior aspect of distal tibia; forms posterior wall of ankle mortise ('trimalleolar fracture').", None),
("Intercondylar eminence","Central ridge on tibial plateau; ACL and PCL attach to intercondylar tubercles here.", None),
], col_widths=[4.8*cm, 9.2*cm, 4.2*cm]))
story.append(Spacer(1, 0.2*cm))
story.append(tip_box("Ankle mortise = tibia + fibula + talus. Ottawa ankle rules: X-ray if bony tenderness at malleolus tips OR inability to weight-bear. Common peroneal nerve injury at fibular neck → foot drop (cannot dorsiflex)."))
story.append(PageBreak())
# ===========================================================================
# SECTION 11 – FOOT BONES (TARSALS, METATARSALS, PHALANGES)
# ===========================================================================
story += section_banner("11 | FOOT BONES", NAVY)
story.append(Paragraph("<b>Tarsal bones (7): Calcaneus, Talus, Navicular, Cuboid, Medial/Intermediate/Lateral Cuneiforms</b>", body_txt))
story.append(Spacer(1, 0.2*cm))
story.append(landmark_table([
("Calcaneal tuberosity", "Heel bone; Achilles tendon (calcaneal tendon) inserts here; plantar fascia also attaches.", None),
("Sustentaculum tali", "Medial shelf of calcaneus; supports talar neck; flexor hallucis longus runs below it.", None),
("Calcaneal groove", "Posterior groove on inferior calcaneus; used in calcaneal fracture assessment.", None),
("Talar head", "Articulates with navicular; spring ligament (plantar calcaneonavicular) supports it.", None),
("Talar neck", "Most common fracture site in talus; avascular necrosis risk due to limited blood supply.", None),
("Navicular tuberosity", "Medial projection; tibialis posterior inserts; palpable medial foot.", None),
("Base of 5th metatarsal","Lateral styloid process; peroneus brevis inserts; avulsion fracture with ankle inversion.", None),
("Sesamoids (1st MTP)", "Two sesamoid bones under 1st metatarsal head; protect flexor hallucis longus tendon.", None),
("Medial longitudinal arch","Calcaneus → talus → navicular → cuneiforms → metatarsals 1-3; maintained by plantar fascia + tibialis posterior.", None),
("Lateral longitudinal arch", "Calcaneus → cuboid → metatarsals 4-5; lower, more rigid arch.", None),
], col_widths=[4.8*cm, 9.2*cm, 4.2*cm]))
story.append(Spacer(1, 0.2*cm))
story.append(tip_box("Plantar fasciitis = degeneration at calcaneal tuberosity attachment. Jones fracture = 5th metatarsal shaft fracture (different from avulsion). Subtalar joint = talus + calcaneus; inversion/eversion happens here."))
story.append(PageBreak())
# ===========================================================================
# SECTION 12 – QUICK REFERENCE TABLES
# ===========================================================================
story += section_banner("12 | QUICK REFERENCE: Landmark Mnemonics & Levels", TEAL)
mnemonic_data = [
[Paragraph("<b>LANDMARK / TOPIC</b>", label_hdr),
Paragraph("<b>MNEMONIC / MEMORY TIP</b>", label_hdr)],
[Paragraph("Carpal bones (lateral → medial, prox then distal)", body_txt),
Paragraph("<i>Some Lovers Try Positions That They Can't Handle</i><br/>(Scaphoid, Lunate, Triquetrum, Pisiform | Trapezium, Trapezoid, Capitate, Hamate)", hint_txt)],
[Paragraph("Rotator cuff muscles", body_txt),
Paragraph("<i>SITS</i> — Supraspinatus, Infraspinatus, Teres minor, Subscapularis", hint_txt)],
[Paragraph("Femoral triangle contents (lat → med)", body_txt),
Paragraph("<i>NAVEL</i> — Nerve, Artery, Vein, Empty space, Lymphatics", hint_txt)],
[Paragraph("Interosseous membrane bones", body_txt),
Paragraph("Radius LATERAL, Ulna MEDIAL; radial styloid more distal than ulnar", hint_txt)],
[Paragraph("Cranial nerve VII muscles", body_txt),
Paragraph("<i>Two Zulus Bit My Cat</i> — Temporal, Zygomatic, Buccal, Marginal mandibular, Cervical", hint_txt)],
[Paragraph("True/False/Floating ribs", body_txt),
Paragraph("1-7 True (direct sternal), 8-10 False (indirect), 11-12 Floating (free)", hint_txt)],
[Paragraph("Tarsal bones", body_txt),
Paragraph("<i>Tiger Cubs Need MILC</i> — Talus, Calcaneus, Navicular, Medial/Intermediate/Lateral cuneiforms, Cuboid", hint_txt)],
]
mnemonic_tbl = Table(mnemonic_data, colWidths=[5.5*cm, CONTENT_W - 5.5*cm])
mnemonic_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("ROWBACKGROUNDS",(0,1),(-1,-1), [LIGHT_BG, WHITE]),
("GRID", (0,0),(-1,-1), 0.4, colors.HexColor("#C5D5DC")),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 6),
]))
story.append(mnemonic_tbl)
story.append(Spacer(1, 0.4*cm))
# Vertebral levels table
story += section_banner("Vertebral Body Surface Levels (Key Exam Facts)", colors.HexColor("#2C5F2E"))
levels_data = [
[Paragraph("<b>SURFACE LANDMARK</b>", label_hdr), Paragraph("<b>VERTEBRAL LEVEL</b>", label_hdr)],
[Paragraph("Vertex (top of skull)", body_txt), Paragraph("N/A", body_txt)],
[Paragraph("Hyoid bone", body_txt), Paragraph("C3", body_txt)],
[Paragraph("Thyroid cartilage (upper border)", body_txt), Paragraph("C4-C5", body_txt)],
[Paragraph("Cricoid cartilage", body_txt), Paragraph("C6", body_txt)],
[Paragraph("Vertebra prominens (most prominent spine)", body_txt), Paragraph("C7", body_txt)],
[Paragraph("Sternal angle of Louis", body_txt), Paragraph("T4-T5 disc", body_txt)],
[Paragraph("Inferior angle of scapula", body_txt), Paragraph("T7-T8", body_txt)],
[Paragraph("Xiphisternal junction", body_txt), Paragraph("T9", body_txt)],
[Paragraph("Umbilicus", body_txt), Paragraph("L3-L4", body_txt)],
[Paragraph("Iliac crest (highest point)", body_txt), Paragraph("L4", body_txt)],
[Paragraph("PSIS (dimple of Venus)", body_txt), Paragraph("S2", body_txt)],
[Paragraph("Coccyx tip", body_txt), Paragraph("Sacral hiatus / Co", body_txt)],
]
levels_tbl = Table(levels_data, colWidths=[9.5*cm, CONTENT_W - 9.5*cm])
levels_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#2C5F2E")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("ROWBACKGROUNDS",(0,1),(-1,-1), [LIGHT_BG, WHITE]),
("GRID", (0,0),(-1,-1), 0.4, colors.HexColor("#B5CCB5")),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 6),
]))
story.append(levels_tbl)
story.append(PageBreak())
# ===========================================================================
# SECTION 13 – SELF-TEST LABELLING EXERCISES
# ===========================================================================
story += section_banner("13 | SELF-TEST: Write the Landmark Names", NAVY)
story.append(Paragraph(
"For each numbered clue below, write the correct bony landmark name in the answer box. "
"Cover the earlier sections and test yourself from memory.",
body_txt))
story.append(Spacer(1, 0.3*cm))
test_qs = [
("1", "The H-shaped skull junction overlying the middle meningeal artery."),
("2", "The palpable saddle-shaped depression in the sphenoid that houses the pituitary."),
("3", "The posterior bony projection of the elbow; triceps inserts here."),
("4", "The groove on the posterior humerus where the radial nerve travels."),
("5", "The medial ankle projection formed by the distal tibia."),
("6", "The lateral ankle projection; extends ~1 cm more distally than the medial one."),
("7", "The heel bone's posterior process where the Achilles tendon inserts."),
("8", "The rough posterior femoral ridge with multiple muscle attachments."),
("9", "The sesamoid bone embedded in the flexor carpi ulnaris tendon."),
("10", "The anterior tibial projection where the patellar ligament inserts (Osgood-Schlatter site)."),
("11", "The sharp medial edge of the right angle of the orbital margin (frontal bone)."),
("12", "The beak-shaped scapular projection giving origin to coracobrachialis and short head of biceps."),
("13", "The medial shelf of the calcaneus that supports the talar neck."),
("14", "The lateral styloid base of 5th metatarsal; avulsed in ankle inversion."),
("15", "The posterior iliac dimple at S2 level used for sacroiliac injections."),
("16", "The femoral prominence where gluteus medius and minimus insert."),
("17", "The ridge on distal dorsal radius around which extensor pollicis longus wraps."),
("18", "The distal peg-like process of C2 that C1 rotates around."),
("19", "The inferior tip of the sternum used as a CPR landmark (at T9 level)."),
("20", "The sharp anterior tibia border covered only by skin — the 'shin'."),
]
test_data = [[
Paragraph("#", label_hdr),
Paragraph("CLUE", label_hdr),
Paragraph("YOUR ANSWER", label_hdr),
]]
for num, clue in test_qs:
bg = LIGHT_BG if int(num) % 2 == 1 else WHITE
test_data.append([
Paragraph(f"<b>{num}</b>", make_style(f"QNum{num}", fontSize=9, textColor=TEAL,
fontName="Helvetica-Bold", leading=12)),
Paragraph(clue, body_txt),
LabelBox(w=5.5*cm, h=1.1*cm),
])
test_tbl = Table(test_data, colWidths=[1*cm, 10.8*cm, 5.5*cm])
test_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), NAVY),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_BG, WHITE]),
("GRID", (0,0),(-1,-1), 0.4, colors.HexColor("#C5D5DC")),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 5),
]))
story.append(test_tbl)
story.append(PageBreak())
# ===========================================================================
# ANSWER KEY
# ===========================================================================
story += section_banner("ANSWER KEY (Self-Test, Page above)", colors.HexColor("#5D4037"))
answers = [
("1", "Pterion"),
("2", "Sella turcica"),
("3", "Olecranon"),
("4", "Radial (spiral) groove"),
("5", "Medial malleolus"),
("6", "Lateral malleolus (fibula)"),
("7", "Calcaneal tuberosity"),
("8", "Linea aspera"),
("9", "Pisiform"),
("10","Tibial tuberosity"),
("11","Supraorbital notch/foramen (medial)"),
("12","Coracoid process"),
("13","Sustentaculum tali"),
("14","Base of 5th metatarsal (styloid)"),
("15","PSIS (Posterior Superior Iliac Spine)"),
("16","Greater trochanter"),
("17","Lister's tubercle"),
("18","Dens (odontoid process)"),
("19","Xiphoid process"),
("20","Anterior crest of tibia (shin)"),
]
ans_data = [[
Paragraph("#", label_hdr),
Paragraph("ANSWER", label_hdr),
Paragraph("#", label_hdr),
Paragraph("ANSWER", label_hdr),
]]
for i in range(0, len(answers), 2):
row = [
Paragraph(f"<b>{answers[i][0]}</b>", body_txt),
Paragraph(answers[i][1], make_style(f"Ans{i}", fontSize=9, textColor=colors.HexColor("#2C5F2E"),
fontName="Helvetica-Bold", leading=12)),
]
if i + 1 < len(answers):
row += [
Paragraph(f"<b>{answers[i+1][0]}</b>", body_txt),
Paragraph(answers[i+1][1], make_style(f"Ans{i+1}", fontSize=9, textColor=colors.HexColor("#2C5F2E"),
fontName="Helvetica-Bold", leading=12)),
]
else:
row += [Paragraph("", body_txt), Paragraph("", body_txt)]
ans_data.append(row)
half = CONTENT_W / 2
ans_tbl = Table(ans_data, colWidths=[1*cm, half - 1*cm, 1*cm, half - 1*cm])
ans_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), colors.HexColor("#5D4037")),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[PALE_GOLD, WHITE]),
("GRID", (0,0),(-1,-1), 0.4, colors.HexColor("#C5B5A5")),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 5),
]))
story.append(ans_tbl)
story.append(Spacer(1, 0.5*cm))
story.append(Paragraph(
"Sourced from Gray's Anatomy for Students (9th ed.) and Netter's Atlas of Human Anatomy. "
"Use alongside your atlas for best results.",
footer_style))
# ── BUILD ────────────────────────────────────────────────────────────────────
doc.build(story, onFirstPage=on_first_page, onLaterPages=on_page)
print("PDF created:", OUTPUT)
cd /home/daytona/workspace/bone-landmarks-pdf && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/bone-landmarks-pdf/Bone_Landmarks_Study_Guide.pdf
Bone Landmarks Study Guide
PDF Document · PDF
| Section | Content |
|---|---|
| 1 | Skull & Facial Bones (10 landmarks) |
| 2 | Vertebral Column (10 landmarks) |
| 3 | Thoracic Cage - ribs & sternum (7 landmarks) |
| 4 | Pectoral Girdle - clavicle & scapula (10 landmarks) |
| 5 | Humerus (14 landmarks) |
| 6 | Radius & Ulna (10 landmarks) |
| 7 | Hand Bones - carpals, metacarpals, phalanges (7 landmarks + carpal mnemonic) |
| 8 | Pelvis & Hip Bone (12 landmarks) |
| 9 | Femur (15 landmarks) |
| 10 | Patella, Tibia & Fibula (12 landmarks) |
| 11 | Foot Bones (10 landmarks + arch anatomy) |
| 12 | Quick Reference - mnemonics + vertebral surface levels table |
| 13 | 20-question self-test with blank answer boxes + full answer key |