i need to study the anatomy like for the full bones and full muscle and joints and tell me the notes for studying

Reading File
Finding Sources
Searching the Web

human anatomy study notes bones muscles joints complete overview

Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Finding Sources
Reading File
Finding Sources
Reading File
Reading File
I now have rich content from Gray's Anatomy for Students covering bones, joints, and muscles. Let me compile the complete study notes.

Complete Anatomy Study Notes: Bones, Muscles & Joints

Sourced from Gray's Anatomy for Students (9780323934237)

PART 1 - THE SKELETAL SYSTEM (BONES)

What is Bone?

Bone is a calcified, living connective tissue that forms the majority of the skeleton. It has an intercellular calcified matrix containing collagen fibers and several types of cells.

Functions of Bones

  1. Support - structural framework for the body
  2. Protection - shields vital organs (e.g., skull protects brain, ribs protect lungs/heart)
  3. Mineral reservoir - stores calcium and phosphorus
  4. Movement - acts as levers on which muscles act
  5. Hematopoiesis - contains blood-producing cells (red marrow)

Types of Bone Tissue

TypeDescription
Compact (cortical)Dense bone forming the outer shell of ALL bones
Spongy (trabecular/cancellous)Spicules of bone enclosing cavities containing marrow

Classification of Bones by Shape

TypeDescriptionExamples
Long bonesTubular; longer than wideHumerus, femur, tibia, fibula, radius, ulna
Short bonesCuboidal; roughly equal dimensionsCarpals (wrist), tarsals (ankle)
Flat bonesTwo compact plates + spongy bone betweenSkull, scapula, sternum, ribs
Irregular bonesVarious shapes; don't fit other categoriesVertebrae, facial bones
Sesamoid bonesRound/oval; develop inside tendonsPatella (kneecap), sesamoids of thumb/big toe

Bone Vasculature & Periosteum

  • Every bone has a nutrient artery (usually one) entering the internal cavity, supplying marrow, spongy bone, and inner compact bone
  • All bones are covered externally by the periosteum (fibrous connective tissue membrane) - EXCEPT at articular surfaces
  • The periosteum is highly sensitive and can form new bone
  • A bone stripped of its periosteum will not survive

The 206 Bones: Axial vs. Appendicular Skeleton

Axial Skeleton (80 bones):
  • Skull (cranium + facial bones) - 22 bones
  • Vertebral column - 26 vertebrae (7 cervical, 12 thoracic, 5 lumbar, 1 sacrum, 1 coccyx)
  • Thoracic cage - 12 pairs of ribs + sternum
Appendicular Skeleton (126 bones):
  • Pectoral girdle: clavicle + scapula (x2)
  • Upper limbs: humerus, radius, ulna, 8 carpals, 5 metacarpals, 14 phalanges (each side)
  • Pelvic girdle: 2 hip bones (ilium + ischium + pubis fused)
  • Lower limbs: femur, patella, tibia, fibula, 7 tarsals, 5 metatarsals, 14 phalanges (each side)

Bone Development & Healing

  • Ossification centers: bones develop from cartilage models
  • Growth plates (epiphyseal plates): between head and shaft of long bones; active in children aged 7-10 and puberty
  • Fracture healing sequence: blood clot → granulation tissue with new vessels → callus formation → calcification by osteoblasts → remodeling

Key Clinical Notes on Bones

  • Avascular necrosis: bone death from loss of blood supply (classic site: femoral head after neck fracture in elderly)
  • Epiphyseal fractures: injure growth plates in children; must be treated carefully to avoid asymmetrical growth
  • Sesamoid/accessory bones: normal variants; must not be mistaken for fractures on imaging

PART 2 - JOINTS (ARTHROLOGY)

"The sites where two skeletal elements come together are termed joints." - Gray's Anatomy for Students

The Two Major Categories of Joints


A. SYNOVIAL JOINTS (have a cavity)

The most common and most mobile type.
Components of a synovial joint:
  • Articular cartilage - hyaline cartilage covering bone ends (no periosteum here)
  • Joint capsule - fibrous outer layer + inner synovial membrane
  • Synovial membrane - lines the inner capsule and produces synovial fluid
  • Synovial fluid - lubricates and nourishes cartilage
  • Ligaments - reinforce the capsule; limit excess movement
  • Bursae - fluid-filled sacs that reduce friction near joints
Types of Synovial Joints:
TypeMovementExample
Plane (gliding)Gliding/sliding in one planeIntercarpal, intertarsal joints
HingeFlexion/extension only (1 axis)Elbow (humeroulnar), interphalangeal joints
PivotRotation around longitudinal axis (1 axis)Atlantoaxial joint (C1-C2), proximal radioulnar
BicondylarMostly 1 axis + limited rotationKnee joint, temporomandibular joint
Condylar (ellipsoid)2 axes at right angles; flex/ext + abd/add + circumductionWrist (radiocarpal) joint
Saddle2 axes; saddle-shaped surfaces; flex/ext + abd/add + circumductionCarpometacarpal joint of the thumb
Ball-and-socketMultiple axes; full ROM including rotationHip joint, shoulder (glenohumeral) joint
Movements possible at synovial joints:
  • Flexion / Extension
  • Abduction / Adduction
  • Circumduction
  • Rotation (medial/lateral)
  • Pronation / Supination (forearm)
  • Inversion / Eversion (foot)
  • Protraction / Retraction (jaw, shoulder)
  • Elevation / Depression

B. SOLID JOINTS (no cavity)

1. Fibrous Joints (connected by fibrous connective tissue)

TypeDescriptionExample
SuturesOnly in skull; thin sutural ligamentCoronal, sagittal, lambdoid sutures
GomphosesTooth in bony socket; periodontal ligamentTeeth in alveoli
SyndesmosesTwo bones linked by a ligamentLigamentum flavum (vertebrae), interosseous membrane (radius-ulna)

2. Cartilaginous Joints (connected by cartilage)

TypeDescriptionExample
SynchondrosesTwo ossification centers separated by cartilage; eventually ossifyEpiphyseal growth plates
SymphysesTwo bones connected by fibrocartilage; mostly midlinePubic symphysis, intervertebral discs

Key Joints to Know for Exams

JointTypeKey Features
Shoulder (glenohumeral)Ball-and-socketMost mobile joint; least stable; reinforced by rotator cuff
ElbowHinge (+ pivot)Humeroulnar + humeroradial + proximal radioulnar
Wrist (radiocarpal)Condylar/ellipsoidFlexion, extension, radial/ulnar deviation
HipBall-and-socketVery stable; acetabulum + femoral head; reinforced by strong ligaments
KneeBicondylar (modified hinge)Largest joint; ACL/PCL + medial/lateral menisci + collateral ligaments
Ankle (talocrural)HingeTibia + fibula + talus; dorsiflexion + plantarflexion
Atlantoaxial (C1-C2)PivotHead rotation (nodding = atlantooccipital; rotation = atlantoaxial)

PART 3 - THE MUSCULAR SYSTEM

Three Types of Muscle Tissue

TypeAppearanceControlLocation
Skeletal muscleStriated (striped)Voluntary (somatic motor nerves)Body wall, limbs, head/neck
Cardiac muscleStriated + branchingInvoluntaryHeart wall + large proximal vessels
Smooth muscleNon-striatedInvoluntary (autonomic)Viscera, blood vessels, skin (arrector pili)

Skeletal Muscle - Key Facts

  • Consists of parallel bundles of long, multinucleated fibers
  • Capable of powerful contractions
  • Named by: shape (rhomboid), attachments (sternohyoid), function (flexor pollicis longus), position (palmar interosseous), or fiber orientation (external oblique)

How Muscles are Named (Memory Aid)

  1. Shape: deltoid (triangle), rhomboid, teres (round), gracilis (slender)
  2. Location: tibialis anterior, gluteus medius
  3. Action: flexor, extensor, abductor, adductor, rotator
  4. Attachments: sternocleidomastoid (sternum + clavicle + mastoid)
  5. Fiber direction: rectus (straight), oblique, transverse
  6. Number of heads: biceps (2), triceps (3), quadriceps (4)
  7. Size: maximus, minimus, longus, brevis

Muscle Anatomy Terms

TermMeaning
OriginFixed proximal attachment point
InsertionMoving distal attachment point
BellyThe main contractile body of the muscle
TendonDense connective tissue connecting muscle to bone
AponeurosisFlat, sheet-like tendon
FasciaConnective tissue surrounding muscles; forms compartments
BursaFluid-filled sac reducing friction at tendons/joints
RetinaculumThickened fascia near joints; holds tendons in place

Major Muscle Groups by Region

Head & Neck:
  • Muscles of facial expression (CN VII)
  • Muscles of mastication: Masseter, temporalis, medial/lateral pterygoids (CN V3)
  • Sternocleidomastoid (SCM) - head rotation to opposite side
  • Scalenes - neck flexion + rib elevation (breathing)
Trunk / Thorax:
  • Pectoralis major/minor (chest)
  • Serratus anterior ("boxer's muscle")
  • Intercostals (internal, external) - breathing
  • Diaphragm - primary muscle of inspiration
Abdomen:
  • Rectus abdominis (anterior wall)
  • External oblique, internal oblique, transversus abdominis (lateral walls)
Back:
  • Trapezius (superficial; scapular movement)
  • Latissimus dorsi (shoulder extension/adduction)
  • Erector spinae (deep; spinal extension)
  • Rhomboids (retract scapula)
Upper Limb:
  • Shoulder: Deltoid, rotator cuff (SITS = Supraspinatus, Infraspinatus, Teres minor, Subscapularis)
  • Arm: Biceps brachii (flexion + supination), Triceps brachii (extension)
  • Forearm: Flexors (anterior compartment), Extensors (posterior compartment)
  • Hand: Thenar muscles (thumb), Hypothenar muscles (little finger), Lumbricals, Interossei
Lower Limb:
  • Gluteal region: Gluteus maximus (extension), medius/minimus (abduction), piriformis
  • Thigh - Anterior: Quadriceps femoris (rectus femoris + vastus lateralis/medialis/intermedius) - knee extension
  • Thigh - Posterior: Hamstrings (biceps femoris, semitendinosus, semimembranosus) - knee flexion/hip extension
  • Thigh - Medial: Adductors (longus, brevis, magnus), Gracilis
  • Leg - Anterior: Tibialis anterior (dorsiflexion), Extensor hallucis longus
  • Leg - Posterior: Gastrocnemius + soleus (plantarflexion = "calf muscles")
  • Leg - Lateral: Fibularis (peroneus) longus/brevis (eversion)

Fascia - Clinical Importance

  • Deep fascia forms intermuscular septa that compartmentalize muscles with similar functions
  • Compartment syndrome: raised pressure within a fascial compartment can cut off blood supply
  • Retinacula: thickenings of deep fascia near joints that hold tendons in position
  • Fascia limits spread of infection (e.g., psoas abscess tracked by psoas fascia from spinal TB to groin)

PART 4 - STUDY STRATEGY & TIPS

How to Approach Anatomy Study

1. Learn in regions, not systems Study region by region (upper limb, lower limb, thorax, abdomen, head/neck). Within each region, learn bones → joints → muscles → vessels → nerves.
2. Use the "OONIF" framework for every muscle:
  • Origin
  • Insertion
  • Nerve supply
  • Action
  • Function/clinical relevance
3. For joints, always learn:
  • Type (synovial vs. solid; sub-type)
  • Bones involved
  • Ligaments and their roles
  • Movements possible
  • Related muscles
  • Common injuries/pathologies
4. For bones, always learn:
  • Name + classification
  • Major landmarks (processes, epicondyles, foramina, facets)
  • Articulations (which bones it connects to)
  • Muscle attachment sites
5. Active recall techniques:
  • Draw bones from memory, then label landmarks
  • Cover the muscle table and recite actions
  • Use Netter's Atlas to match labeled structures to your notes
  • Practice on 3D anatomy apps (Visible Body, Complete Anatomy)

Recommended Study Order

  1. Osteology (bones + landmarks) first - it's the map
  2. Arthrology (joints) second - connections between bones
  3. Myology (muscles) third - what moves across the joints
  4. Neurovascular supply last - what controls and feeds everything

High-Yield Exam Topics

  • Rotator cuff muscles (SITS) and their individual tears
  • Knee joint ligaments (ACL, PCL, MCL, LCL) and injuries
  • Carpal tunnel syndrome (median nerve compression)
  • Hip joint stability vs. shoulder joint mobility comparison
  • Brachial plexus and nerve injury patterns
  • Femoral triangle contents
  • Compartment syndrome and fasciotomy

Quick Reference: Joints Overview

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)

All anatomical content sourced from Gray's Anatomy for Students and Netter's Atlas of Human Anatomy. For visual learning, Netter's Atlas is the gold standard for labeled diagrams.
Here's a helpful video overview of the skeleton:

These notes cover the full scope of musculoskeletal anatomy. The best approach is to go region by region, always tying bones → joints → muscles together so everything makes functional sense. Let me know if you want me to go deeper on any specific region (e.g., upper limb, lower limb, spine) or a specific topic like the brachial plexus, knee ligaments, or muscle compartments.

Create a study guide PDF with bone landmarks you can print and label

Reading File
Running Command

mkdir -p /home/daytona/workspace/bone-landmarks-pdf && ls /home/daytona/workspac…

Writing File

~/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 &amp; 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)
Running Command

cd /home/daytona/workspace/bone-landmarks-pdf && python generate_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/bone-landmarks-pdf/Bone_Landmarks_Study_Guide.pdf

Your PDF is ready! Download it here:

Bone Landmarks Study Guide

PDF Document · PDF


Here's what's inside the 13-section, A4 print-ready guide:
SectionContent
1Skull & Facial Bones (10 landmarks)
2Vertebral Column (10 landmarks)
3Thoracic Cage - ribs & sternum (7 landmarks)
4Pectoral Girdle - clavicle & scapula (10 landmarks)
5Humerus (14 landmarks)
6Radius & Ulna (10 landmarks)
7Hand Bones - carpals, metacarpals, phalanges (7 landmarks + carpal mnemonic)
8Pelvis & Hip Bone (12 landmarks)
9Femur (15 landmarks)
10Patella, Tibia & Fibula (12 landmarks)
11Foot Bones (10 landmarks + arch anatomy)
12Quick Reference - mnemonics + vertebral surface levels table
1320-question self-test with blank answer boxes + full answer key
How to use it for study:
  1. Print double-sided on A4
  2. Read each landmark's description, then cover the landmark name column and write it in the blank box from memory
  3. Use the self-test page (section 13) as a timed quiz
  4. Check your answers on the final page
Each landmark also includes a clinical note (e.g. which nerve is at risk, which fracture happens there) so you're learning anatomy with context, not just names.
This is a shared conversation. Sign in to Orris to start your own chat.