Scapula bone anatomy

Reading File
Finding Sources
Searching Images

scapula bone anatomy

Reading File
Finding Sources
Reading File
Finding Sources
Reading File
Loading Image
Finding Sources
Finding Sources
Finding Sources
Reading File
Finding Sources
I now have comprehensive information from Gray's Anatomy for Students. Let me compile the full answer.

Scapula — Bone Anatomy

Scapula — Posterior, Anterior (Costal), and Lateral Views
Fig. 7.21 Right Scapula — Posterior (A), Anterior/Costal (B), and Lateral (C) views — Gray's Anatomy for Students

Overview

The scapula is a large, flat, triangular bone that lies on the posterolateral thorax between ribs 2–7. It is entirely surrounded by muscles and has no direct bony articulation with the thorax. It connects the upper limb to the axial skeleton via the clavicle.

Basic Components

CategoryComponents
AnglesLateral (glenoid), Superior, Inferior
BordersSuperior, Lateral (axillary), Medial (vertebral)
SurfacesPosterior (dorsal), Costal (anterior/ventral)
ProcessesSpine, Acromion, Coracoid process

Surfaces

Posterior Surface

The posterior surface is divided by the spine of the scapula into two fossae:
  • Supraspinous fossa — small, superior; lodges the supraspinatus muscle
  • Infraspinous fossa — larger, inferior; lodges the infraspinatus muscle
  • The region between the lateral angle and the spine attachment is the greater scapular notch (spinoglenoid notch)

Costal (Anterior) Surface

  • Features a large, shallow concave subscapular fossa over most of its extent
  • Lodges the subscapularis muscle
  • The costal surface and subscapularis glide freely over the thoracic wall (scapulothoracic "joint")

Borders

BorderFeatures
Lateral (axillary)Thick and strong; provides muscle attachment (teres major, teres minor)
Medial (vertebral)Thin and sharp; runs parallel to the spine; attachment for serratus anterior
SuperiorThin and sharp; bears the suprascapular notch medial to the coracoid process root

Angles

AngleFeatures
Lateral angleBears the glenoid cavity — shallow, comma-shaped; articulates with the humeral head at the glenohumeral joint
Superior angleLocated at junction of medial and superior borders
Inferior angleLocated at junction of medial and lateral borders; important palpation landmark; moves forward and laterally when the arm is raised

Processes

Spine

  • Prominent horizontal ridge on the posterior surface dividing it into supra- and infraspinous fossae
  • Begins as a low ridge near the medial border and rises to the acromion laterally

Acromion

  • Anterolateral projection of the spine, arching over the glenohumeral joint
  • Has a small oval articular facet on its distal end for the acromioclavicular joint with the clavicle
  • Easily palpated as the bony prominence at the tip of the shoulder

Coracoid Process

  • A hook-like structure projecting anterolaterally from the superior border
  • Positioned directly inferior to the lateral clavicle
  • Attachment for:
    • Pectoralis minor (tip)
    • Short head of biceps brachii (tip)
    • Coracobrachialis (tip)
    • Coracohumeral ligament, coracoacromial ligament, coracoclavicular ligament
  • Palpable through the deltopectoral groove

Tubercles and Notches

StructureLocationSignificance
Supraglenoid tubercleSuperior to glenoid cavityOrigin of long head of biceps brachii
Infraglenoid tubercleInferior to glenoid cavityOrigin of long head of triceps brachii
Suprascapular notchSuperior border, medial to coracoid rootSuprascapular nerve passes through it (under transverse scapular ligament); suprascapular artery passes over the ligament
Spinoglenoid notchBetween spine and lateral angleSuprascapular nerve passes through here to enter the infraspinous fossa

Articulations

  1. Glenohumeral joint — glenoid cavity with head of humerus (ball-and-socket)
  2. Acromioclavicular joint — acromion with lateral clavicle (plane synovial joint)
  3. Scapulothoracic "joint" — physiological gliding joint between the costal surface/subscapularis and the thoracic wall (not a true synovial joint)

Muscle Attachments Summary

MuscleAttachment Site on Scapula
SupraspinatusSupraspinous fossa
InfraspinatusInfraspinous fossa
SubscapularisSubscapular fossa
Teres minorLateral border (upper)
Teres majorLateral border (lower) / inferior angle
Serratus anteriorMedial border and inferior angle (costal surface)
RhomboidsMedial border
TrapeziusSpine and acromion
Levator scapulaeSuperior angle and medial border
Pectoralis minorCoracoid process
Biceps brachii (short head)Coracoid process
Biceps brachii (long head)Supraglenoid tubercle
Triceps brachii (long head)Infraglenoid tubercle
CoracobrachialisCoracoid process
OmohyoidSuperior border, medial to suprascapular notch

Clinical Correlates

Winged Scapula

Paralysis of serratus anterior (due to damage to the long thoracic nerve, C5–C7) causes the medial border and inferior angle to protrude posteriorly — the classic "wing." It also limits arm abduction beyond 90°. The long thoracic nerve is vulnerable during axillary dissection (e.g., mastectomy), "rucksack paralysis," or penetrating trauma.

Suprascapular Nerve Entrapment

The suprascapular nerve can be compressed at the suprascapular notch (affecting supraspinatus and infraspinatus) or at the spinoglenoid notch (affecting infraspinatus only), causing shoulder pain and weakness.

Scapular Fractures

Rare due to heavy muscular protection; require significant force. The body and neck are most commonly fractured.

Source: Gray's Anatomy for Students, p. 821–822

Convert it in a pdf format and colorful and mind type

Reading File
Running Command

ls /home/daytona/workspace/

Running Command

mkdir -p /home/daytona/workspace/scapula-pdf && ls /home/daytona/workspace/

Writing File

~/scapula-pdf/generate_pdf.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import BaseDocTemplate, PageTemplate, Frame
from reportlab.lib.colors import HexColor
import urllib.request
from reportlab.platypus import Image as RLImage
import io

# ── Colour Palette ────────────────────────────────────────────────
TEAL       = HexColor("#0097A7")
DEEP_TEAL  = HexColor("#006064")
ORANGE     = HexColor("#FF6F00")
AMBER      = HexColor("#FFA000")
PURPLE     = HexColor("#6A1B9A")
INDIGO     = HexColor("#283593")
GREEN      = HexColor("#2E7D32")
RED        = HexColor("#C62828")
LIGHT_TEAL = HexColor("#E0F7FA")
LIGHT_AMBER= HexColor("#FFF8E1")
LIGHT_PURPLE=HexColor("#F3E5F5")
LIGHT_GREEN= HexColor("#E8F5E9")
LIGHT_RED  = HexColor("#FFEBEE")
LIGHT_INDIGO=HexColor("#E8EAF6")
WHITE      = colors.white
DARK_GREY  = HexColor("#212121")
MID_GREY   = HexColor("#546E7A")

# ── Document setup ────────────────────────────────────────────────
OUTPUT = "/home/daytona/workspace/scapula-pdf/Scapula_Anatomy.pdf"
doc = SimpleDocTemplate(
    OUTPUT, pagesize=A4,
    leftMargin=1.8*cm, rightMargin=1.8*cm,
    topMargin=2*cm, bottomMargin=2*cm
)

# ── Styles ────────────────────────────────────────────────────────
styles = getSampleStyleSheet()

def S(name, **kw):
    return ParagraphStyle(name, **kw)

cover_title = S("CoverTitle",
    fontName="Helvetica-Bold", fontSize=36,
    textColor=WHITE, alignment=TA_CENTER,
    spaceAfter=6, leading=42)

cover_sub = S("CoverSub",
    fontName="Helvetica", fontSize=15,
    textColor=HexColor("#B2EBF2"), alignment=TA_CENTER,
    spaceAfter=4, leading=20)

cover_note = S("CoverNote",
    fontName="Helvetica-Oblique", fontSize=10,
    textColor=HexColor("#80DEEA"), alignment=TA_CENTER)

h1 = S("H1",
    fontName="Helvetica-Bold", fontSize=18,
    textColor=WHITE, alignment=TA_LEFT,
    spaceBefore=14, spaceAfter=6, leading=22,
    backColor=TEAL, leftIndent=-4, rightIndent=-4,
    borderPad=6)

h2 = S("H2",
    fontName="Helvetica-Bold", fontSize=13,
    textColor=DEEP_TEAL, alignment=TA_LEFT,
    spaceBefore=10, spaceAfter=4, leading=17,
    borderPad=3)

body = S("Body",
    fontName="Helvetica", fontSize=10.5,
    textColor=DARK_GREY, alignment=TA_JUSTIFY,
    spaceAfter=5, leading=15)

bullet = S("Bullet",
    fontName="Helvetica", fontSize=10.5,
    textColor=DARK_GREY, leftIndent=16, spaceAfter=3,
    leading=14, bulletIndent=6)

note_style = S("Note",
    fontName="Helvetica-Oblique", fontSize=9,
    textColor=MID_GREY, alignment=TA_CENTER, spaceAfter=4)

caption = S("Caption",
    fontName="Helvetica-Oblique", fontSize=8.5,
    textColor=MID_GREY, alignment=TA_CENTER, spaceAfter=6)

table_header = S("TH",
    fontName="Helvetica-Bold", fontSize=10,
    textColor=WHITE, alignment=TA_CENTER)

table_cell = S("TC",
    fontName="Helvetica", fontSize=9.5,
    textColor=DARK_GREY, alignment=TA_LEFT, leading=13)

table_cell_c = S("TCC",
    fontName="Helvetica", fontSize=9.5,
    textColor=DARK_GREY, alignment=TA_CENTER, leading=13)

clinical_title = S("ClinTitle",
    fontName="Helvetica-Bold", fontSize=11,
    textColor=RED, spaceAfter=2, leading=14)

# ── Helper: coloured section header box ──────────────────────────
def section_header(text, bg=TEAL):
    data = [[Paragraph(f"<font color='white'><b>{text}</b></font>",
                       S("SH", fontName="Helvetica-Bold", fontSize=13,
                         textColor=WHITE, leading=17, alignment=TA_LEFT))]]
    t = Table(data, colWidths=[doc.width])
    t.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), bg),
        ("TOPPADDING",   (0,0), (-1,-1), 7),
        ("BOTTOMPADDING",(0,0), (-1,-1), 7),
        ("LEFTPADDING",  (0,0), (-1,-1), 10),
        ("RIGHTPADDING", (0,0), (-1,-1), 8),
        ("ROUNDEDCORNERS", [5]),
    ]))
    return t

# ── Helper: two-col info card ─────────────────────────────────────
def info_card(label, value, bg=LIGHT_TEAL, fg=DEEP_TEAL):
    data = [[
        Paragraph(f"<b>{label}</b>",
                  S("LC", fontName="Helvetica-Bold", fontSize=10,
                    textColor=fg, leading=13, alignment=TA_LEFT)),
        Paragraph(value,
                  S("VC", fontName="Helvetica", fontSize=10,
                    textColor=DARK_GREY, leading=13, alignment=TA_LEFT))
    ]]
    t = Table(data, colWidths=[5*cm, doc.width - 5*cm])
    t.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (0,0), bg),
        ("BACKGROUND", (1,0), (1,0), WHITE),
        ("TOPPADDING",    (0,0),(-1,-1), 5),
        ("BOTTOMPADDING", (0,0),(-1,-1), 5),
        ("LEFTPADDING",   (0,0),(-1,-1), 8),
        ("GRID",          (0,0),(-1,-1), 0.4, HexColor("#B0BEC5")),
    ]))
    return t

# ── Helper: styled table ──────────────────────────────────────────
def make_table(headers, rows, col_widths, header_bg=TEAL):
    header_row = [Paragraph(f"<b>{h}</b>",
                            S("TH2", fontName="Helvetica-Bold", fontSize=10,
                              textColor=WHITE, alignment=TA_CENTER, leading=13))
                  for h in headers]
    data = [header_row]
    for i, row in enumerate(rows):
        data.append([Paragraph(str(c),
                               S(f"TC{i}", fontName="Helvetica", fontSize=9.5,
                                 textColor=DARK_GREY, alignment=TA_LEFT, leading=13))
                     for c in row])
    t = Table(data, colWidths=col_widths, repeatRows=1)
    style = [
        ("BACKGROUND",    (0,0), (-1,0), header_bg),
        ("TEXTCOLOR",     (0,0), (-1,0), WHITE),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [HexColor("#F5F5F5"), WHITE]),
        ("GRID",          (0,0), (-1,-1), 0.4, HexColor("#B0BEC5")),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 7),
        ("RIGHTPADDING",  (0,0), (-1,-1), 7),
        ("VALIGN",        (0,0), (-1,-1), "MIDDLE"),
    ]
    t.setStyle(TableStyle(style))
    return t

# ── Fetch scapula image ───────────────────────────────────────────
IMG_URL = ("https://cdn.orris.care/cdss_images/"
           "9c6f7e6b8e97815a99e6d1f5590f84e3915f18b32de3e3745408422c93284ce0.png")
try:
    with urllib.request.urlopen(IMG_URL, timeout=15) as r:
        img_data = io.BytesIO(r.read())
    scapula_img = RLImage(img_data, width=14*cm, height=10*cm)
    scapula_img.hAlign = "CENTER"
    has_image = True
except Exception as e:
    print(f"Image download failed: {e}")
    has_image = False

# ══════════════════════════════════════════════════════════════════
# STORY
# ══════════════════════════════════════════════════════════════════
story = []
W = doc.width

# ── COVER PAGE ────────────────────────────────────────────────────
# Gradient-like cover block using a table
cover_data = [[
    Paragraph("🦴 SCAPULA", cover_title),
], [
    Paragraph("Bone Anatomy — Complete Reference", cover_sub),
], [
    Paragraph("Angles · Borders · Surfaces · Processes · Muscle Attachments · Clinical Correlates",
              cover_note),
], [
    Paragraph("Source: Gray's Anatomy for Students", cover_note),
]]
cover_tbl = Table(cover_data, colWidths=[W])
cover_tbl.setStyle(TableStyle([
    ("BACKGROUND",    (0,0), (-1,-1), DEEP_TEAL),
    ("TOPPADDING",    (0,0), (-1,-1), 14),
    ("BOTTOMPADDING", (0,0), (-1,-1), 14),
    ("LEFTPADDING",   (0,0), (-1,-1), 20),
    ("RIGHTPADDING",  (0,0), (-1,-1), 20),
    ("ROUNDEDCORNERS",[8]),
]))
story.append(cover_tbl)
story.append(Spacer(1, 0.5*cm))

# ── OVERVIEW ──────────────────────────────────────────────────────
story.append(section_header("📌  Overview", DEEP_TEAL))
story.append(Spacer(1, 3*mm))
story.append(Paragraph(
    "The scapula is a large, flat, <b>triangular bone</b> lying on the posterolateral thorax "
    "between ribs 2–7. It is entirely surrounded by muscles and has no direct bony articulation "
    "with the thorax. It connects the upper limb to the axial skeleton via the clavicle.",
    body))

# Quick-reference cards
story.append(Spacer(1, 3*mm))
overview_rows = [
    ("Bone Type", "Flat, triangular"),
    ("Location", "Posterolateral thorax — ribs 2 to 7"),
    ("Angles (3)", "Lateral (glenoid) · Superior · Inferior"),
    ("Borders (3)", "Superior · Lateral (axillary) · Medial (vertebral)"),
    ("Surfaces (2)", "Posterior (dorsal) · Costal (anterior/ventral)"),
    ("Processes (3)", "Spine · Acromion · Coracoid process"),
    ("Articulations", "Glenohumeral · Acromioclavicular · Scapulothoracic"),
]
for lbl, val in overview_rows:
    story.append(info_card(lbl, val))
story.append(Spacer(1, 5*mm))

# ── IMAGE ─────────────────────────────────────────────────────────
if has_image:
    story.append(section_header("🖼️  Anatomical Views", INDIGO))
    story.append(Spacer(1, 4*mm))
    story.append(scapula_img)
    story.append(Paragraph(
        "Fig. 7.21  Right Scapula — (A) Posterior view  (B) Anterior/Costal view  (C) Lateral view",
        caption))
    story.append(Spacer(1, 4*mm))

# ── SURFACES ─────────────────────────────────────────────────────
story.append(section_header("🔵  Surfaces", TEAL))
story.append(Spacer(1, 3*mm))

story.append(Paragraph("<b>Posterior Surface</b>", h2))
surf_data = [
    ("Supraspinous fossa", "Small, superior compartment above the spine — lodges <b>supraspinatus</b>"),
    ("Infraspinous fossa", "Larger, inferior compartment below the spine — lodges <b>infraspinatus</b>"),
    ("Spinoglenoid notch\n(greater scapular notch)", "Region between lateral angle and spine attachment; suprascapular nerve passes through here"),
]
story.append(make_table(["Structure", "Details"],
                        surf_data,
                        [5.5*cm, W-5.5*cm], TEAL))
story.append(Spacer(1, 4*mm))

story.append(Paragraph("<b>Costal (Anterior) Surface</b>", h2))
story.append(Paragraph(
    "Features a large, shallow concave <b>subscapular fossa</b> over most of its extent, "
    "lodging the <i>subscapularis</i> muscle. The costal surface and subscapularis glide "
    "freely over the thoracic wall (scapulothoracic 'joint').",
    body))
story.append(Spacer(1, 4*mm))

# ── BORDERS ──────────────────────────────────────────────────────
story.append(section_header("🟠  Borders", ORANGE))
story.append(Spacer(1, 3*mm))
border_rows = [
    ("Lateral (Axillary)", "Thick and strong", "Teres major, Teres minor"),
    ("Medial (Vertebral)", "Thin and sharp; parallel to spine", "Serratus anterior, Rhomboids"),
    ("Superior", "Thin and sharp; bears suprascapular notch", "Omohyoid (medial part)"),
]
story.append(make_table(
    ["Border", "Character", "Key Muscle Attachments"],
    border_rows,
    [4*cm, 5.5*cm, W-9.5*cm], ORANGE))
story.append(Spacer(1, 5*mm))

# ── ANGLES ────────────────────────────────────────────────────────
story.append(section_header("🟣  Angles", PURPLE))
story.append(Spacer(1, 3*mm))
angle_rows = [
    ("Lateral angle",  "Bears the glenoid cavity — shallow, comma-shaped articular surface",
     "Glenohumeral joint with humeral head"),
    ("Superior angle", "Junction of medial and superior borders",
     "Levator scapulae"),
    ("Inferior angle", "Junction of medial and lateral borders; palpable landmark; moves anterolaterally on arm elevation",
     "Teres major, lower serratus anterior"),
]
story.append(make_table(
    ["Angle", "Features", "Significance"],
    angle_rows,
    [3.5*cm, 7*cm, W-10.5*cm], PURPLE))
story.append(Spacer(1, 5*mm))

# ── PROCESSES ────────────────────────────────────────────────────
story.append(section_header("🟢  Processes", GREEN))
story.append(Spacer(1, 3*mm))

proc_rows = [
    ("Spine",
     "Prominent horizontal ridge on posterior surface, subdividing it into supra- and infraspinous fossae; rises laterally into acromion",
     "Trapezius (insertion)"),
    ("Acromion",
     "Anterolateral projection of spine; arches over glenohumeral joint; distal oval facet → acromioclavicular joint; easily palpated at shoulder tip",
     "Deltoid (origin); Trapezius (insertion)"),
    ("Coracoid process",
     "Hook-like structure projecting anterolaterally from superior border; lies inferior to lateral clavicle; palpable through deltopectoral groove",
     "Pectoralis minor; Short head biceps; Coracobrachialis; Coracoacromial / coracohumeral / coracoclavicular ligaments"),
]
story.append(make_table(
    ["Process", "Description", "Attachments"],
    proc_rows,
    [3.5*cm, 7*cm, W-10.5*cm], GREEN))
story.append(Spacer(1, 5*mm))

# ── TUBERCLES & NOTCHES ───────────────────────────────────────────
story.append(section_header("🔴  Tubercles & Notches", RED))
story.append(Spacer(1, 3*mm))
tn_rows = [
    ("Supraglenoid tubercle",   "Superior to glenoid cavity",           "Origin — long head of biceps brachii"),
    ("Infraglenoid tubercle",   "Inferior to glenoid cavity",           "Origin — long head of triceps brachii"),
    ("Suprascapular notch",     "Superior border, medial to coracoid root",
     "Suprascapular nerve passes through (under transverse scapular lig.); artery passes over"),
    ("Spinoglenoid notch",      "Between spine and lateral angle",      "Suprascapular nerve enters infraspinous fossa"),
]
story.append(make_table(
    ["Structure", "Location", "Clinical / Functional Significance"],
    tn_rows,
    [4.5*cm, 4.5*cm, W-9*cm], RED))
story.append(Spacer(1, 5*mm))

# ── MUSCLE ATTACHMENTS ────────────────────────────────────────────
story.append(section_header("💪  Muscle Attachments", INDIGO))
story.append(Spacer(1, 3*mm))
muscle_rows = [
    ("Supraspinatus",           "Supraspinous fossa",                  "Rotator cuff — abduction"),
    ("Infraspinatus",           "Infraspinous fossa",                  "Rotator cuff — external rotation"),
    ("Subscapularis",           "Subscapular fossa (costal surface)",  "Rotator cuff — internal rotation"),
    ("Teres minor",             "Lateral border (upper)",              "Rotator cuff — external rotation"),
    ("Teres major",             "Lateral border (lower) / inf. angle", "Adduction & internal rotation"),
    ("Serratus anterior",       "Medial border + inferior angle",      "Protraction; holds scapula against chest wall"),
    ("Rhomboids major & minor", "Medial border",                       "Retraction; elevation of medial border"),
    ("Trapezius",               "Spine and acromion",                  "Elevation, retraction, depression of scapula"),
    ("Levator scapulae",        "Superior angle + medial border",      "Elevation of scapula"),
    ("Pectoralis minor",        "Coracoid process (tip)",              "Protraction; depression of scapula"),
    ("Biceps brachii (short)",  "Coracoid process (tip)",              "Forearm flexion / supination"),
    ("Biceps brachii (long)",   "Supraglenoid tubercle",               "Forearm flexion / supination"),
    ("Triceps brachii (long)",  "Infraglenoid tubercle",               "Elbow extension"),
    ("Coracobrachialis",        "Coracoid process (tip)",              "Arm flexion / adduction"),
    ("Omohyoid (inf. belly)",   "Superior border (medial notch)",      "Depression of hyoid bone"),
]
story.append(make_table(
    ["Muscle", "Attachment Site", "Action"],
    muscle_rows,
    [5*cm, 6*cm, W-11*cm], INDIGO))
story.append(Spacer(1, 5*mm))

# ── ARTICULATIONS ─────────────────────────────────────────────────
story.append(section_header("🔗  Articulations", AMBER))
story.append(Spacer(1, 3*mm))
art_rows = [
    ("Glenohumeral joint",       "Glenoid cavity × head of humerus",  "Ball-and-socket (multiaxial); most mobile joint in body"),
    ("Acromioclavicular joint",  "Acromion × lateral clavicle",       "Plane synovial joint; stabilised by AC & CC ligaments"),
    ("Scapulothoracic 'joint'",  "Costal surface × thoracic wall",    "Physiological gliding interface (not true synovial); serratus anterior essential"),
]
story.append(make_table(
    ["Joint", "Articulating Surfaces", "Type / Notes"],
    art_rows,
    [5*cm, 5.5*cm, W-10.5*cm], AMBER))
story.append(Spacer(1, 5*mm))

# ── CLINICAL CORRELATES ───────────────────────────────────────────
story.append(section_header("🏥  Clinical Correlates", RED))
story.append(Spacer(1, 3*mm))

clinicals = [
    ("⚡ Winged Scapula",
     LIGHT_RED, RED,
     "Paralysis of <b>serratus anterior</b> due to damage of the <b>long thoracic nerve (C5–C7)</b> "
     "causes the medial border and inferior angle to protrude posteriorly. The 'wing' is accentuated "
     "on forward arm elevation. Arm abduction is limited beyond 90°.<br/>"
     "<i>Vulnerable during:</i> axillary dissection (mastectomy), rucksack/backpack compression, "
     "penetrating trauma."),
    ("⚡ Suprascapular Nerve Entrapment",
     LIGHT_AMBER, ORANGE,
     "Compression at the <b>suprascapular notch</b> (affects supraspinatus AND infraspinatus — "
     "weak abduction + external rotation) or at the <b>spinoglenoid notch</b> (affects infraspinatus "
     "only — weak external rotation). Presents as deep, poorly localised posterior shoulder pain."),
    ("⚡ Scapular Fractures",
     LIGHT_INDIGO, INDIGO,
     "Rare (<1% of all fractures) due to heavy muscular protection. Requires significant force "
     "(high-velocity trauma). The <b>body and neck</b> are most commonly fractured. Always evaluate "
     "for associated neurovascular injuries and pneumothorax."),
    ("⚡ Suprascapular Notch Variation",
     LIGHT_GREEN, GREEN,
     "The notch may be partially or completely ossified (forming a foramen), increasing risk of "
     "suprascapular nerve entrapment. Important consideration before surgical decompression."),
]

for title_text, bg_col, fg_col, content in clinicals:
    card_data = [[
        Paragraph(title_text,
                  S("CT", fontName="Helvetica-Bold", fontSize=11,
                    textColor=fg_col, leading=15)),
    ],[
        Paragraph(content,
                  S("CB", fontName="Helvetica", fontSize=10,
                    textColor=DARK_GREY, leading=14, alignment=TA_JUSTIFY)),
    ]]
    card = Table(card_data, colWidths=[W])
    card.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), bg_col),
        ("BACKGROUND",    (0,1), (-1,1), WHITE),
        ("LEFTPADDING",   (0,0), (-1,-1), 10),
        ("RIGHTPADDING",  (0,0), (-1,-1), 10),
        ("TOPPADDING",    (0,0), (-1,-1), 6),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
        ("BOX",           (0,0), (-1,-1), 0.8, fg_col),
        ("LINEBELOW",     (0,0), (-1,0), 0.5, fg_col),
    ]))
    story.append(KeepTogether([card, Spacer(1, 4*mm)]))

# ── FOOTER NOTE ───────────────────────────────────────────────────
story.append(HRFlowable(width="100%", thickness=1, color=TEAL))
story.append(Spacer(1, 2*mm))
story.append(Paragraph(
    "<i>Source: Gray's Anatomy for Students, p. 821–822 · Generated by Orris Medical AI</i>",
    note_style))

# ── BUILD ─────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to {OUTPUT}")
Running Command

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

Running Command

ls -lh /home/daytona/workspace/scapula-pdf/Scapula_Anatomy.pdf

Your colorful mind-map style PDF is ready (2.1 MB)!

Scapula Anatomy

PDF Document · PDF

What's inside:
SectionColor Theme
🎨 Cover bannerDeep teal gradient
📌 Overview cardsTeal info cards
🖼️ Anatomical diagramPosterior / Anterior / Lateral views
🔵 SurfacesTeal table
🟠 BordersOrange table
🟣 AnglesPurple table
🟢 ProcessesGreen table
🔴 Tubercles & NotchesRed table
💪 Muscle AttachmentsIndigo table
🔗 ArticulationsAmber table
🏥 Clinical CorrelatesColor-coded cards (winged scapula, nerve entrapment, fractures)

Create mind map

Running Command

python3 -c "import matplotlib; import matplotlib.pyplot; print('matplotlib ok')" 2>&1

You've run out of free credits. Sign up for a free account to continue using Orris.
This is a shared conversation. Sign in to Orris to start your own chat.