Refer all Anesthesia textbooks and give 10 marks answer for Nutrition in ICU and 10marks answer for TOtal parenteral nutrition
| Phase | Features |
|---|---|
| Acute (ebb) phase | Hypoperfusion, reduced metabolic rate, catabolism |
| Flow (catabolic) phase | Hypermetabolism, protein breakdown, gluconeogenesis, insulin resistance |
| Anabolic/rehabilitation phase | Restoration of body composition, recovery |
"One noncontroversial issue is the avoidance of overfeeding. It should be a goal of all to avoid provision of excessive amounts of nutrients by any route in the early phase of critical illness." - Mulholland & Greenfield's Surgery 7e, p. 135
| Nutrient | Rationale | Evidence |
|---|---|---|
| Glutamine | Gut enterocyte fuel; improves mucosal integrity | Strongest evidence; especially in burns and trauma |
| Arginine | Enhances T-cell function and wound healing | Evidence mainly in surgical patients |
| Omega-3 fatty acids (EPA/DHA) | Anti-inflammatory | Not supported by current SCCM guidelines |
| Selenium, Zinc, Vitamins A, C, E | Antioxidants; generally safe | Low-quality evidence; interpreted with caution |
"The principal indications for PN are malnutrition, sepsis, or surgical or traumatic injury in seriously ill patients for whom use of the gastrointestinal tract for feedings is not possible." - Schwartz's Surgery 11e
| Route | Comment |
|---|---|
| Subclavian vein | Most common; tunneled preferred for >8 weeks |
| PICC (Peripherally Inserted Central Catheter) | Good for short-to-medium duration; not for >6 months |
| Internal jugular vein | Less desirable; patient discomfort |
| Femoral vein | Last resort; increased infection risk |
| Feature | TPN / CPN | PPN |
|---|---|---|
| Dextrose concentration | 15-25% | 5-10% |
| Protein concentration | 3-5% | 3% |
| Osmolarity | >1500 mOsm/L | ~600-900 mOsm/L |
| Access | Central vein (SVC) | Peripheral vein |
| Duration | Long-term | Short-term (<2 weeks) |
| Calorie delivery | Complete | Partial |
| Use in severe malnutrition | Yes | Not appropriate |
| Parameter | Frequency |
|---|---|
| Urine/capillary glucose | Every 6 hours |
| Serum glucose | Daily (first few days), then every 2-3 days |
| Electrolytes (Na, K, Cl, CO2) | Daily until stable, then every 2-3 days |
| Blood urea nitrogen, LFTs | At least weekly |
| Phosphate, magnesium | Weekly |
| Serum triglycerides | At least once during lipid infusion |
| Body weight, urine output | Daily/regularly |
| Complication | Cause | Management |
|---|---|---|
| Hyperglycemia | Excess dextrose, insulin resistance | Insulin infusion; target glucose ≤180 mg/dL |
| Hypoglycemia | Abrupt cessation of TPN | Taper TPN gradually; D10W if needed |
| Hypertriglyceridemia | Excess/rapid lipid infusion | Reduce lipid rate; hold if TG >400 mg/dL |
| Hepatic steatosis / cholestasis | Overfeeding, lack of EN stimulation, excess glucose | Reduce caloric load; introduce small-volume EN |
| Refeeding syndrome | Excess carbohydrate load in malnourished patients | Correct electrolytes before feeding; start low, go slow |
| Essential fatty acid deficiency | Fat-free TPN | Provide at least 10-15% calories as fat emulsion |
| Electrolyte disturbances | Inadequate replacement | Close monitoring and adjustment |
| Complication | Notes |
|---|---|
| CRBSI (Catheter-Related Bloodstream Infection) | Most serious; Staphylococcus epidermidis most common. Meticulous aseptic technique essential. |
| Pneumothorax | Subclavian/IJ line insertion complication |
| Air embolism | During insertion or line changes |
| Venous thrombosis | Thrombophlebitis at catheter tip |
| Catheter occlusion | Fibrin sheath formation |
| Parameter | Recommendation |
|---|---|
| Energy | 12-25 kcal/kg/day; hypocaloric (<20 kcal/kg) in first ICU week |
| Protein | 1.2-2.0 g/kg/day |
| Dextrose | 15-25% concentration; 3.4 kcal/g; min 150 g/day |
| Lipids | 20-30% of total calories; max 1.0 kcal/kg/h |
| Glucose target | ≤180 mg/dL |
| Vitamin K | Weekly supplementation (not in standard IV vitamins) |
| When to start PN | When EN fails to meet >60% needs after 7-10 days |
| Calorie:Nitrogen ratio | 100-150 kcal per gram nitrogen |
| Central access | Subclavian (preferred), PICC, IJ |
Convert the above contentinto ultra-realistic handwritten study notes, just like a topper’s notebook. Use blue gel pen for explanations and step-by-step points. Use bold red marker for headings, chapter names, theorems, laws, and definitions. Use yellow highlighter for important keywords, formulas, dates, and final answers. Draw rough circles or underlines around very important points. Write in short bullet points with proper spacing like a real notebook. Add hand-drawn diagrams, graphs, maps, or flowcharts on the center or right side, clearly labeled with arrows. Mark exam-important points and add small notes like “Exam Tip”, “Common Mistake”, or “Memory Trick”. Add small, cute doodles in the margins. Keep natural handwriting imperfections so it doesn’t look robotic. Keep everything 100% accurate to the PDF. Don’t skip important topics and don’t add extra information. Final output should look like scanned handwritten pages, perfect for revision and take as many pages as you want and give it systematically and neatly into pdf
ls /home/daytona/workspace/ && python3 -c "import reportlab; print('reportlab ok…
python3 -c "from PIL import ImageFont; f = ImageFont.truetype('/usr/share/fonts/…
find /usr/share/fonts -name "*.ttf" 2>/dev/null | head -40
mkdir -p /home/daytona/workspace/icu-notes && cd /home/daytona/workspace/icu-not…
~/icu-notes/make_notes.py
#!/usr/bin/env python3
"""
Ultra-realistic handwritten study notes generator
Nutrition in ICU + Total Parenteral Nutrition
"""
from PIL import Image, ImageDraw, ImageFont
import random
import math
import os
# ── fonts ──────────────────────────────────────────────────────────────────
BASE = "/home/daytona/workspace/icu-notes"
FONT_REG = "/usr/share/fonts/truetype/quicksand/Quicksand-Regular.ttf"
FONT_BOLD = "/usr/share/fonts/truetype/quicksand/Quicksand-Bold.ttf"
FONT_MONO = "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf"
FONT_ITALIC = "/usr/share/fonts/truetype/liberation/LiberationSans-Italic.ttf"
# Page size (A4 at 150 dpi)
PW, PH = 1240, 1754
# ── colors ──────────────────────────────────────────────────────────────────
PAPER = (255, 253, 240) # cream notebook paper
LINE_COLOR = (180, 200, 220) # blue ruled lines
MARGIN_LINE = (220, 160, 160) # pink margin line
BLUE_PEN = (15, 40, 160) # blue gel pen
RED_MARKER = (200, 20, 20) # red marker headings
YELLOW_HL = (255, 240, 60, 160) # yellow highlighter (RGBA)
GREEN_HL = (100, 220, 100, 140) # green highlighter
ORANGE_PEN = (200, 80, 0) # orange for exam tips
PENCIL = (100, 100, 120) # pencil gray for diagrams
DARK_BLUE = (10, 20, 100)
rng = random.Random(42)
def jitter(x, y, a=1.5):
return (x + rng.uniform(-a, a), y + rng.uniform(-a, a))
def load_font(path, size):
try:
return ImageFont.truetype(path, size)
except:
return ImageFont.load_default()
# font sizes
F_TITLE = load_font(FONT_BOLD, 52)
F_HEAD = load_font(FONT_BOLD, 38)
F_SUBH = load_font(FONT_BOLD, 30)
F_BODY = load_font(FONT_REG, 25)
F_SMALL = load_font(FONT_REG, 21)
F_TINY = load_font(FONT_REG, 18)
F_MONO = load_font(FONT_MONO, 22)
F_ITALIC = load_font(FONT_ITALIC, 23)
# ── helpers ─────────────────────────────────────────────────────────────────
def new_page():
img = Image.new("RGB", (PW, PH), PAPER)
d = ImageDraw.Draw(img, "RGBA")
# ruled lines every 38px, start at y=120
for y in range(120, PH - 40, 38):
d.line([(80, y), (PW - 40, y)], fill=LINE_COLOR, width=1)
# margin line at x=115
d.line([(115, 0), (115, PH)], fill=MARGIN_LINE, width=2)
# subtle page texture - random very light dots
for _ in range(300):
x, y = rng.randint(0, PW), rng.randint(0, PH)
d.point((x, y), fill=(220, 215, 200))
return img, d
def highlight(d, x, y, text, font, color=YELLOW_HL, pad=3):
"""Draw yellow (or color) highlight behind text"""
bbox = font.getbbox(text)
w, h = bbox[2] - bbox[0], bbox[3] - bbox[1]
# Draw slightly wobbly highlight rect
rx1, ry1 = x - pad, y - pad + rng.uniform(-2, 2)
rx2, ry2 = x + w + pad, y + h + pad + rng.uniform(-2, 2)
d.rectangle([rx1, ry1, rx2, ry2], fill=color)
def underline_squiggle(d, x, y, text, font, color=RED_MARKER, thick=2):
"""Wobbly underline"""
bbox = font.getbbox(text)
w = bbox[2] - bbox[0]
pts = []
steps = max(int(w / 6), 4)
for i in range(steps + 1):
px = x + (w * i / steps)
py = y + (bbox[3] - bbox[1]) + 3 + rng.uniform(-2, 2)
pts.append((px, py))
if len(pts) >= 2:
for i in range(len(pts) - 1):
d.line([pts[i], pts[i+1]], fill=color, width=thick)
def circle_around(d, x, y, text, font, color=RED_MARKER):
"""Rough hand-drawn circle/oval around text"""
bbox = font.getbbox(text)
w, h = bbox[2] - bbox[0], bbox[3] - bbox[1]
cx, cy = x + w/2, y + h/2
rx, ry = w/2 + 8, h/2 + 8
# draw ~40 points approximating a wobbly ellipse
pts = []
for i in range(45):
angle = 2 * math.pi * i / 44
ex = cx + (rx + rng.uniform(-3, 3)) * math.cos(angle)
ey = cy + (ry + rng.uniform(-2, 2)) * math.sin(angle)
pts.append((ex, ey))
pts.append(pts[0])
for i in range(len(pts)-1):
d.line([pts[i], pts[i+1]], fill=color, width=2)
def box_highlight(d, x1, y1, x2, y2, color=(255, 230, 50, 80)):
d.rectangle([x1-4, y1-4, x2+4, y2+4], fill=color)
def write_line(d, x, y, text, font, color=BLUE_PEN, rot=0):
"""Write text with slight rotation jitter for realism"""
d.text(jitter(x, y, 0.8), text, font=font, fill=color)
def arrow(d, x1, y1, x2, y2, color=PENCIL, width=2):
d.line([(x1,y1),(x2,y2)], fill=color, width=width)
# arrowhead
angle = math.atan2(y2-y1, x2-x1)
for da in [0.4, -0.4]:
ax = x2 - 12*math.cos(angle-da)
ay = y2 - 12*math.sin(angle-da)
d.line([(x2,y2),(ax,ay)], fill=color, width=width)
def star_doodle(d, cx, cy, r=10, color=(255, 130, 0)):
pts = []
for i in range(5):
a = math.pi/2 + 2*math.pi*i/5
pts.append((cx + r*math.cos(a), cy + r*math.sin(a)))
a2 = a + math.pi/5
pts.append((cx + r*0.4*math.cos(a2), cy + r*0.4*math.sin(a2)))
for i in range(len(pts)):
d.line([pts[i], pts[(i+1)%len(pts)]], fill=color, width=2)
def flower_doodle(d, cx, cy, r=12, color=(180, 50, 180)):
for i in range(6):
a = 2*math.pi*i/6
ex, ey = cx + r*math.cos(a), cy + r*math.sin(a)
d.ellipse([ex-6, ey-6, ex+6, ey+6], outline=color, width=2)
d.ellipse([cx-5, cy-5, cx+5, cy+5], fill=color)
def heart_doodle(d, cx, cy, s=10, color=(220, 50, 80)):
# simple heart via two arcs + lines
pts = []
for i in range(20):
t = -math.pi + 2*math.pi*i/19
x = s * 16 * math.sin(t)**3 / 16
y = -s * (13*math.cos(t) - 5*math.cos(2*t) - 2*math.cos(3*t) - math.cos(4*t)) / 16
pts.append((cx+x, cy+y))
for i in range(len(pts)-1):
d.line([pts[i], pts[i+1]], fill=color, width=2)
def lightning_doodle(d, cx, cy, s=14, color=(255, 180, 0)):
pts = [(cx, cy-s), (cx-s*0.3, cy+s*0.1), (cx+s*0.1, cy+s*0.1), (cx-s*0.2, cy+s)]
for i in range(len(pts)-1):
d.line([pts[i], pts[i+1]], fill=color, width=2)
def exam_tip_box(d, x, y, text, w=320):
"""Orange exam tip box"""
lines = []
words = text.split()
cur = ""
for word in words:
test = cur + (" " if cur else "") + word
if F_TINY.getbbox(test)[2] < w - 20:
cur = test
else:
lines.append(cur)
cur = word
if cur:
lines.append(cur)
h = len(lines)*22 + 20
# rough box
d.rectangle([x, y, x+w, y+h], fill=(255, 245, 220), outline=(200, 100, 0), width=2)
d.text((x+8, y+4), "★ EXAM TIP", font=F_TINY, fill=(200, 80, 0))
for i, line in enumerate(lines):
d.text((x+8, y+22+i*22), line, font=F_TINY, fill=(150, 50, 0))
return h
def memory_trick_box(d, x, y, text, w=300):
"""Green memory trick box"""
lines = []
words = text.split()
cur = ""
for word in words:
test = cur + (" " if cur else "") + word
if F_TINY.getbbox(test)[2] < w - 20:
cur = test
else:
lines.append(cur)
cur = word
if cur:
lines.append(cur)
h = len(lines)*22 + 20
d.rectangle([x, y, x+w, y+h], fill=(230, 255, 230), outline=(0, 150, 50), width=2)
d.text((x+8, y+4), "✎ MEMORY TRICK", font=F_TINY, fill=(0, 130, 50))
for i, line in enumerate(lines):
d.text((x+8, y+22+i*22), line, font=F_TINY, fill=(0, 100, 30))
return h
def wrap_text(text, font, max_width):
"""Word-wrap text to list of lines."""
words = text.split()
lines = []
current = ""
for word in words:
test = (current + " " + word).strip()
if font.getbbox(test)[2] <= max_width:
current = test
else:
if current:
lines.append(current)
current = word
if current:
lines.append(current)
return lines
def section_header(d, x, y, text, font=F_HEAD, color=RED_MARKER, underline=True):
"""Red bold section header with optional underline"""
d.text(jitter(x, y), text, font=font, fill=color)
if underline:
bbox = font.getbbox(text)
w = bbox[2]
# Double underline (marker style)
uy = y + bbox[3] + 2
for j in range(2):
pts = []
for i in range(int(w/5)+1):
px = x + i*5
py = uy + j*3 + rng.uniform(-1, 1)
pts.append((px, py))
for i in range(len(pts)-1):
d.line([pts[i], pts[i+1]], fill=color, width=2)
# ══════════════════════════════════════════════════════════════════════════
# PAGE GENERATION FUNCTIONS
# ══════════════════════════════════════════════════════════════════════════
def page_cover():
img, d = new_page()
# Top decorative strip
for i in range(5):
d.rectangle([0, i*4, PW, i*4+3], fill=(200+i*10, 220-i*10, 255-i*5))
# Subject tag
d.rectangle([80, 60, 500, 100], fill=(220, 235, 255), outline=BLUE_PEN, width=2)
d.text((90, 68), "ANESTHESIA | CRITICAL CARE | NUTRITION", font=F_SMALL, fill=BLUE_PEN)
# Main title
section_header(d, 80, 130, "NUTRITION IN ICU", font=F_TITLE, underline=True)
section_header(d, 80, 210, "& TOTAL PARENTERAL NUTRITION", font=F_HEAD, underline=True)
d.line([(80, 275), (PW-80, 275)], fill=RED_MARKER, width=3)
y = 310
d.text((120, y), "Sources:", font=F_SUBH, fill=RED_MARKER)
y += 45
sources = [
"◆ Barash's Clinical Anesthesia, 9e",
"◆ Miller's Anesthesia, 10e",
"◆ Morgan & Mikhail's Clinical Anesthesiology, 7e",
"◆ Schwartz's Principles of Surgery, 11e",
"◆ Harrison's Principles of Internal Medicine, 22e",
"◆ Washington Manual of Medical Therapeutics",
"◆ Mulholland & Greenfield's Surgery, 7e",
]
for s in sources:
d.text(jitter(140, y), s, font=F_BODY, fill=BLUE_PEN)
y += 38
y += 30
d.line([(80, y), (PW-80, y)], fill=BLUE_PEN, width=1)
y += 20
d.text((120, y), "10 MARK EXAM ANSWERS", font=F_SUBH, fill=(200, 20, 20))
highlight(d, 120, y, "10 MARK EXAM ANSWERS", F_SUBH, color=YELLOW_HL)
# Decorative right side diagrams
# Notebook spiral holes
for i in range(20):
hy = 80 + i*82
d.ellipse([PW-55, hy, PW-20, hy+40], outline=(180,180,200), width=2)
d.ellipse([PW-50, hy+5, PW-25, hy+35], fill=(240,240,250), outline=(180,180,200), width=1)
# Cute doodles in margin
star_doodle(d, 60, 350, r=14, color=(255, 130, 0))
flower_doodle(d, 62, 500, r=12, color=(180, 50, 180))
heart_doodle(d, 60, 650, s=11, color=(220, 50, 80))
star_doodle(d, 60, 800, r=10, color=(0, 150, 200))
lightning_doodle(d, 62, 950, s=14, color=(255, 180, 0))
flower_doodle(d, 60, 1100, r=10, color=(50, 180, 80))
# Bottom note
d.text((120, PH-80), "✎ Study notes compiled for exam preparation", font=F_TINY, fill=(120,120,180))
d.text((120, PH-55), " All data accurate to textbooks listed above", font=F_TINY, fill=(120,120,180))
return img
def page_nutrition_1():
"""Nutrition in ICU - Introduction, Metabolic Response, Assessment"""
img, d = new_page()
MARGIN_X = 130
RHS = 860 # right panel start
MAX_W = 700
# page number + date
d.text((PW-160, 30), "Page 1", font=F_TINY, fill=(150,150,180))
d.text((130, 30), "TOPIC 1: NUTRITION IN ICU", font=F_TINY, fill=(150,150,180))
# Spiral holes
for i in range(22):
hy = 60 + i*76
d.ellipse([PW-52, hy, PW-22, hy+36], outline=(180,180,200), width=2)
y = 65
section_header(d, MARGIN_X, y, "NUTRITION IN THE ICU", font=F_TITLE, color=RED_MARKER)
y += 75
# ── 1. Introduction ──────────────────────────────────────────────────
section_header(d, MARGIN_X, y, "1. INTRODUCTION", font=F_HEAD)
y += 50
intro_pts = [
"• Critical illness → hypermetabolic state + accelerated catabolism",
"• If nutrition delayed/inadequate → MALNUTRITION (↑ mortality & morbidity)",
"• Poor nutrition → ↑ infectious complications, longer ICU stay, prolonged MV",
"• Adequate nutrition = STANDARD OF CARE in ICU",
]
for pt in intro_pts:
lines = wrap_text(pt, F_BODY, MAX_W)
for i, ln in enumerate(lines):
xi = MARGIN_X + (30 if i>0 else 0)
write_line(d, xi, y, ln, F_BODY)
y += 34
# highlight key phrase
highlight(d, MARGIN_X+10, y-34*4+34, "STANDARD OF CARE", F_BODY)
y += 15
d.line([(MARGIN_X, y), (820, y)], fill=LINE_COLOR, width=1)
y += 15
# ── 2. Metabolic Response ────────────────────────────────────────────
section_header(d, MARGIN_X, y, "2. METABOLIC RESPONSE TO CRITICAL ILLNESS", font=F_HEAD)
y += 52
# Table-style phases
phases = [
("Acute (Ebb) Phase", "Hypoperfusion, ↓ metabolic rate, catabolism, vasoconstriction"),
("Flow (Catabolic) Phase", "↑ Metabolism, protein breakdown, gluconeogenesis, insulin resistance"),
("Anabolic/Rehab Phase", "Restoration of body composition, recovery, ↑ protein synthesis"),
]
# Draw table header
d.rectangle([MARGIN_X, y, 820, y+32], fill=(220, 230, 255))
d.text((MARGIN_X+8, y+6), "Phase", font=F_SMALL, fill=DARK_BLUE)
d.text((MARGIN_X+230, y+6), "Features", font=F_SMALL, fill=DARK_BLUE)
y += 32
for i, (ph, feat) in enumerate(phases):
bg = (245, 248, 255) if i%2==0 else (255, 252, 245)
feat_lines = wrap_text(feat, F_TINY, 500)
row_h = max(32, len(feat_lines)*22 + 10)
d.rectangle([MARGIN_X, y, 820, y+row_h], fill=bg, outline=LINE_COLOR, width=1)
d.text((MARGIN_X+8, y+6), ph, font=F_TINY, fill=RED_MARKER)
for j, fl in enumerate(feat_lines):
d.text((MARGIN_X+230, y+6+j*22), fl, font=F_TINY, fill=BLUE_PEN)
y += row_h
y += 18
# key numbers
kw_line = "↑ Energy demand: 20–50% above basal | Urine nitrogen loss: 15–20 g/day"
highlight(d, MARGIN_X, y, kw_line, F_SMALL, color=YELLOW_HL)
write_line(d, MARGIN_X, y, kw_line, F_SMALL, color=BLUE_PEN)
y += 34
write_line(d, MARGIN_X, y, "• Gut mucosal barrier → compromised → bacterial translocation risk", F_BODY)
y += 38
# Doodles in left margin
star_doodle(d, 62, 200, r=12)
flower_doodle(d, 62, 450, r=11, color=(180,50,180))
heart_doodle(d, 62, 700, s=10)
# ── 3. Nutritional Assessment ─────────────────────────────────────────
section_header(d, MARGIN_X, y, "3. NUTRITIONAL ASSESSMENT", font=F_HEAD)
y += 50
assess_pts = [
("NUTRIC Score", "NRS of Critically Ill | includes: age, APACHE II, SOFA, comorbidities, days before ICU"),
("NRS-2002", "Nutrition Risk Screening | evaluates nutritional status + disease severity"),
("Indirect Calorimetry", "GOLD STANDARD | measures VO₂ & VCO₂ → actual REE"),
]
for tool, desc in assess_pts:
d.text(jitter(MARGIN_X+10, y), f"→ {tool}:", font=F_SUBH, fill=RED_MARKER)
tw = F_SUBH.getbbox(f"→ {tool}:")[2]
desc_lines = wrap_text(desc, F_BODY, MAX_W - tw - 15)
write_line(d, MARGIN_X+tw+15, y+4, desc_lines[0], F_BODY)
for ln in desc_lines[1:]:
y += 30
write_line(d, MARGIN_X+tw+50, y+4, ln, F_BODY)
y += 38
# highlight GOLD STANDARD
highlight(d, MARGIN_X+10, y-38*3+12, "GOLD STANDARD", F_BODY)
y += 10
# Formula box
d.rectangle([MARGIN_X, y, 680, y+52], fill=(240,255,240), outline=(0,150,50), width=2)
d.text((MARGIN_X+10, y+6), "Caloric target: 12 – 25 kcal/kg/day (ASPEN/SCCM)", font=F_SMALL, fill=(0,120,40))
d.text((MARGIN_X+10, y+30), "Protein target: 1.2 – 2.0 g/kg/day (actual body wt)", font=F_SMALL, fill=(0,120,40))
y += 58
# NUTRIC ≥5 circle
circle_text = "NUTRIC ≥ 5 = HIGH RISK"
d.text(jitter(MARGIN_X+20, y), circle_text, font=F_SUBH, fill=RED_MARKER)
circle_around(d, MARGIN_X+20, y, circle_text, F_SUBH)
y += 48
# Exam tip
eh = exam_tip_box(d, MARGIN_X, y,
"Indirect calorimetry is gold standard for REE - always mention in 10-mark answer!", w=500)
y += eh + 15
# Bottom margin doodles
lightning_doodle(d, 62, 1000)
star_doodle(d, 62, 1200, r=13, color=(0,150,200))
return img
def page_nutrition_2():
"""Nutrition in ICU - Route, Timing, Caloric Targets, Glycemic Control"""
img, d = new_page()
MARGIN_X = 130
MAX_W = 700
d.text((PW-160, 30), "Page 2", font=F_TINY, fill=(150,150,180))
d.text((130, 30), "TOPIC 1: NUTRITION IN ICU (contd.)", font=F_TINY, fill=(150,150,180))
for i in range(22):
hy = 60 + i*76
d.ellipse([PW-52, hy, PW-22, hy+36], outline=(180,180,200), width=2)
y = 65
# ── 4. Route of Nutrition ──────────────────────────────────────────────
section_header(d, MARGIN_X, y, "4. ROUTE OF NUTRITION: EN vs PN", font=F_HEAD)
y += 52
# EN vs PN comparison box
d.rectangle([MARGIN_X, y, 820, y+30], fill=(200,220,255))
d.text((MARGIN_X+30, y+5), "ENTERAL (EN) ← ALWAYS PREFERRED OVER PARENTERAL (PN)", font=F_SMALL, fill=DARK_BLUE)
highlight(d, MARGIN_X+30, y+5, "ALWAYS PREFERRED", F_SMALL)
y += 36
en_pts = [
"◆ Maintains gut mucosal integrity → prevents villous atrophy",
"◆ Reduces bacterial translocation & infectious complications",
"◆ Preserves GALT (Gut-Associated Lymphoid Tissue)",
"◆ More physiological + cost-effective",
"◆ Fewer catheter-related bloodstream infections",
]
for pt in en_pts:
write_line(d, MARGIN_X+20, y, pt, F_BODY)
y += 35
y += 10
# Timing box - important
timing_text = "⏰ EN should be initiated within 24 – 48 hours of ICU admission"
highlight(d, MARGIN_X, y, timing_text, F_SUBH, color=YELLOW_HL)
write_line(d, MARGIN_X, y, timing_text, F_SUBH, color=RED_MARKER)
circle_around(d, MARGIN_X, y, timing_text, F_SUBH, color=RED_MARKER)
y += 50
# Gastric vs post-pyloric
section_header(d, MARGIN_X, y, "Gastric vs Post-Pyloric Feeding:", font=F_SUBH, color=BLUE_PEN, underline=False)
y += 38
gpp = [
"→ Most patients: GASTRIC feeding is safe (start here)",
"→ Gastric intolerance: try PROKINETICS first (metoclopramide / erythromycin)",
"→ If prokinetics fail → NASOJEJUNAL tube (post-pyloric)",
"→ Routine monitoring of GRV (Gastric Residual Volume) = NOT recommended",
"→ Post-pyloric ≠ reduce pneumonia/ICU LOS/mortality vs gastric feeding",
]
for pt in gpp:
write_line(d, MARGIN_X+20, y, pt, F_BODY)
y += 35
# Important note
note_text = "GRV monitoring NO longer recommended"
highlight(d, MARGIN_X+30, y-35*2, note_text, F_BODY)
y += 10
d.line([(MARGIN_X, y), (820, y)], fill=LINE_COLOR, width=1)
y += 18
# ── 5. Caloric Targets ────────────────────────────────────────────────
section_header(d, MARGIN_X, y, "5. CALORIC TARGETS & PROTEIN REQUIREMENTS", font=F_HEAD)
y += 52
cal_data = [
("Total calories", "12 – 25 kcal/kg/day (permissive underfeeding in early phase)"),
("Hypocaloric strategy", "< 20 kcal/kg/day OR < 80% estimated needs (first ICU week)"),
("Protein requirement", "1.2 – 2.0 g/kg/day actual body wt (↑ in burns/polytrauma)"),
("Protein % of calories", "15 – 20% of total caloric needs"),
("Calorie:Nitrogen ratio", "At least 100 – 150 kcal per gram of nitrogen"),
]
for param, val in cal_data:
d.text(jitter(MARGIN_X+10, y), f" {param}:", font=F_SMALL, fill=RED_MARKER)
pw_ = F_SMALL.getbbox(f" {param}:")[2]
val_lines = wrap_text(val, F_BODY, MAX_W - pw_)
write_line(d, MARGIN_X+10+pw_+10, y, val_lines[0], F_BODY)
for ln in val_lines[1:]:
y += 30
write_line(d, MARGIN_X+10+pw_+40, y, ln, F_BODY)
y += 34
# highlight key numbers
highlight(d, MARGIN_X+10, y-34*3, "1.2 – 2.0 g/kg/day", F_BODY)
y += 5
# Important quote box
d.rectangle([MARGIN_X, y, 800, y+60], fill=(255,245,225), outline=(180,120,0), width=2)
d.text((MARGIN_X+10, y+6), '"Avoid overfeeding in early phase of critical illness', font=F_SMALL, fill=(150,80,0))
d.text((MARGIN_X+10, y+30), ' — this is the one NON-CONTROVERSIAL issue"', font=F_SMALL, fill=(150,80,0))
y += 70
# ── 6. Glycemic Control ───────────────────────────────────────────────
section_header(d, MARGIN_X, y, "6. GLYCEMIC CONTROL IN ICU", font=F_HEAD)
y += 50
d.text(jitter(MARGIN_X+10, y), "TARGET Blood Glucose: ≤ 180 mg/dL", font=F_SUBH, fill=RED_MARKER)
highlight(d, MARGIN_X+10, y, "≤ 180 mg/dL", F_SUBH)
circle_around(d, MARGIN_X+10, y, "TARGET Blood Glucose: ≤ 180 mg/dL", F_SUBH)
y += 48
glyc_pts = [
"• Van den Berghe study → tight control (80-110) showed benefit in surgical ICU",
"• NICE-SUGAR trial → tight control → ↑ mortality (hypoglycemic episodes!)",
"• Current guideline: target ≤ 180 mg/dL (NOT tight control)",
"• Hyperglycemia → ↑ infections, impaired wound healing, immune suppression",
"• Both EN & PN can cause hyperglycemia → monitor + use insulin infusion",
]
for pt in glyc_pts:
write_line(d, MARGIN_X+20, y, pt, F_BODY)
y += 35
highlight(d, MARGIN_X+20, y-35*3, "NICE-SUGAR trial", F_BODY)
# Memory trick
mh = memory_trick_box(d, MARGIN_X, y,
"NICE-SUGAR = Tight glucose control KILLS! Target ≤ 180 only.", w=480)
y += mh + 10
# Doodles
star_doodle(d, 62, 200, r=13, color=(255,130,0))
flower_doodle(d, 62, 500, r=12)
heart_doodle(d, 62, 800, s=11)
lightning_doodle(d, 62, 1100)
star_doodle(d, 62, 1400, r=10, color=(0,150,200))
return img
def page_nutrition_3():
"""Nutrition in ICU - Immunonutrition, Vasopressors, Refeeding, ASPEN bundle"""
img, d = new_page()
MARGIN_X = 130
MAX_W = 700
d.text((PW-160, 30), "Page 3", font=F_TINY, fill=(150,150,180))
d.text((130, 30), "TOPIC 1: NUTRITION IN ICU (contd.)", font=F_TINY, fill=(150,150,180))
for i in range(22):
hy = 60 + i*76
d.ellipse([PW-52, hy, PW-22, hy+36], outline=(180,180,200), width=2)
y = 65
# ── 7. Immunonutrition ────────────────────────────────────────────────
section_header(d, MARGIN_X, y, "7. IMMUNONUTRITION & SPECIAL FORMULATIONS", font=F_HEAD)
y += 52
d.text(jitter(MARGIN_X, y), "Definition: Enteral formulas enriched with pharmacologically active nutrients", font=F_BODY, fill=BLUE_PEN)
y += 38
# Immunonutrition table
imm_data = [
("Glutamine", "Gut enterocyte fuel; improves mucosal integrity", "STRONGEST evidence (burns/trauma)"),
("Arginine", "Enhances T-cell function + wound healing", "Evidence in surgical pts"),
("Omega-3 FA (EPA/DHA)", "Anti-inflammatory effects", "NOT supported by SCCM guidelines"),
("Se, Zn, Vit A/C/E", "Antioxidants; generally safe", "Low-quality evidence; use with caution"),
]
d.rectangle([MARGIN_X, y, 830, y+28], fill=(220,235,255))
d.text((MARGIN_X+8, y+5), "Nutrient", font=F_TINY, fill=DARK_BLUE)
d.text((MARGIN_X+160, y+5), "Mechanism", font=F_TINY, fill=DARK_BLUE)
d.text((MARGIN_X+520, y+5), "Evidence", font=F_TINY, fill=DARK_BLUE)
y += 28
for i, (nut, mech, evid) in enumerate(imm_data):
bg = (248,250,255) if i%2==0 else (255,252,248)
mech_lines = wrap_text(mech, F_TINY, 340)
evid_lines = wrap_text(evid, F_TINY, 260)
rh = max(28, max(len(mech_lines),len(evid_lines))*22+8)
d.rectangle([MARGIN_X, y, 830, y+rh], fill=bg, outline=LINE_COLOR)
d.text((MARGIN_X+8, y+5), nut, font=F_TINY, fill=RED_MARKER)
for j,ml in enumerate(mech_lines):
d.text((MARGIN_X+160, y+5+j*22), ml, font=F_TINY, fill=BLUE_PEN)
for j,el in enumerate(evid_lines):
d.text((MARGIN_X+520, y+5+j*22), el, font=F_TINY, fill=(0,120,50))
y += rh
y += 15
highlight(d, MARGIN_X, y, " Glutamine has STRONGEST evidence — especially in BURNS & TRAUMA ", F_SMALL)
write_line(d, MARGIN_X, y, " Glutamine has STRONGEST evidence — especially in BURNS & TRAUMA ", F_SMALL, color=RED_MARKER)
y += 40
d.line([(MARGIN_X, y), (820, y)], fill=LINE_COLOR, width=1)
y += 15
# ── 8. Vasopressor Feeding ────────────────────────────────────────────
section_header(d, MARGIN_X, y, "8. EN DURING VASOPRESSOR SUPPORT", font=F_HEAD)
y += 50
vaso_pts = [
"• One RCT: EN vs PN in vasopressor-requiring patients",
"• Result: No ↓ mortality or secondary infections with EN",
"• BUT: ↑ GI complications incl. INTESTINAL ISCHEMIA in EN group",
"• Recommendation: Use EN cautiously at HIGH vasopressor doses",
"• Small-volume 'trophic' feeds may be appropriate",
]
for pt in vaso_pts:
write_line(d, MARGIN_X+20, y, pt, F_BODY)
y += 35
highlight(d, MARGIN_X+20, y-35*3, "INTESTINAL ISCHEMIA", F_BODY)
y += 10
d.line([(MARGIN_X, y), (820, y)], fill=LINE_COLOR, width=1)
y += 15
# ── 9. Refeeding Syndrome ─────────────────────────────────────────────
section_header(d, MARGIN_X, y, "9. REFEEDING SYNDROME", font=F_HEAD)
y += 50
d.text(jitter(MARGIN_X, y), "Definition: Metabolic complications on re-initiating nutrition in malnourished pts", font=F_BODY, fill=BLUE_PEN)
y += 38
ref_pts = [
"• Pathophysiology: CHO load → ↑ insulin → rapid cellular uptake of PO₄, K⁺, Mg²⁺",
"• Hallmark: SEVERE HYPOPHOSPHATEMIA ← most important",
"• Complications: Cardiac arrhythmias, resp. failure, hemolysis, rhabdomyolysis",
"• Prevention:",
" ‣ Correct electrolytes BEFORE starting feeds",
" ‣ Supplement THIAMINE before refeeding",
" ‣ Start feeds LOW: 10 kcal/kg/day → increase over 5–7 days",
]
for pt in ref_pts:
write_line(d, MARGIN_X+20, y, pt, F_BODY)
y += 35
highlight(d, MARGIN_X+20, y-35*6, "SEVERE HYPOPHOSPHATEMIA", F_BODY)
highlight(d, MARGIN_X+20+4*35, y-35*3, "THIAMINE", F_BODY)
y += 5
mh = memory_trick_box(d, MARGIN_X, y,
"Refeeding = 'PHKMT' → Phos, K, Mg go INTO cells → serum levels drop!", w=500)
y += mh + 10
# ── 10. ASPEN/SCCM Bundle ─────────────────────────────────────────────
section_header(d, MARGIN_X, y, "10. SCCM/ASPEN BUNDLE RECOMMENDATIONS", font=F_HEAD)
y += 48
bundle = [
"1. Assess ALL ICU patients for nutrition risk on admission",
"2. Calculate energy + protein requirements to set goals",
"3. Start EN within 24–48 hrs of ICU admission",
"4. Use EN preferentially over PN whenever possible",
"5. Use prokinetics to reduce aspiration risk (not routine GRV monitoring)",
"6. If EN cannot meet >60% needs after 7–10 days → add PN supplement",
"7. Maintain blood glucose ≤ 180 mg/dL",
"8. Provide 1.2–2.0 g/kg/day protein",
"9. Avoid overfeeding — especially early in critical illness",
"10. Monitor via NUTRIC / NRS-2002 + indirect calorimetry when available",
]
for pt in bundle:
write_line(d, MARGIN_X+20, y, pt, F_SMALL)
y += 32
# Box around key point
box_highlight(d, MARGIN_X+20, y-32*8, MARGIN_X+700, y-32*8+32)
# Exam tip at bottom
eh = exam_tip_box(d, MARGIN_X, y,
"In 10-mark Q: cover all 10 bundle points + glycemic control + refeeding syndrome!", w=600)
# Doodles
flower_doodle(d, 62, 200, r=12, color=(180,50,180))
star_doodle(d, 62, 500, r=11, color=(255,130,0))
heart_doodle(d, 62, 800, s=10)
lightning_doodle(d, 62, 1100)
star_doodle(d, 62, 1400, r=12, color=(0,150,200))
return img
def draw_tpn_flowchart(d, x, y, w=360, h=320):
"""Hand-drawn TPN flowchart diagram"""
# Title
d.text((x, y), "TPN Composition", font=F_SMALL, fill=RED_MARKER)
underline_squiggle(d, x, y, "TPN Composition", F_SMALL)
y += 30
# Central box
cx = x + w//2
d.rectangle([cx-60, y, cx+60, y+36], fill=(220,235,255), outline=BLUE_PEN, width=2)
d.text((cx-45, y+8), "TPN Solution", font=F_TINY, fill=DARK_BLUE)
# Three branches
branch_y = y + 80
branches = [
(x+20, "Dextrose\n(CHO)\n15-25%\n3.4 kcal/g"),
(x+w//2-45, "Amino Acids\n(Protein)\n3-5%\n1.2-2g/kg"),
(x+w-110, "Lipid\nEmulsion\n20-30%\n1-2 kcal/mL"),
]
arrow(d, cx, y+36, x+60, branch_y-5, color=PENCIL)
arrow(d, cx, y+36, cx, branch_y-5, color=PENCIL)
arrow(d, cx, y+36, x+w-70, branch_y-5, color=PENCIL)
for bx, btxt in branches:
lines = btxt.split('\n')
bh = len(lines)*18+10
d.rectangle([bx, branch_y, bx+90, branch_y+bh], fill=(245,255,245), outline=(0,150,50), width=2)
for j, ln in enumerate(lines):
d.text((bx+5, branch_y+5+j*18), ln, font=F_TINY, fill=BLUE_PEN)
# Add-ons box
add_y = branch_y + 100
d.rectangle([x, add_y, x+w, add_y+60], fill=(255,250,220), outline=(180,120,0), width=2)
d.text((x+10, add_y+5), "+ Electrolytes + Vitamins + Trace minerals", font=F_TINY, fill=(150,80,0))
d.text((x+10, add_y+27), " Vit K weekly (NOT in commercial IV vitamins!)", font=F_TINY, fill=RED_MARKER)
return add_y + 70
def page_tpn_1():
"""TPN - Definition, Indications, Access, Composition"""
img, d = new_page()
MARGIN_X = 130
MAX_W = 700
d.text((PW-160, 30), "Page 4", font=F_TINY, fill=(150,150,180))
d.text((130, 30), "TOPIC 2: TOTAL PARENTERAL NUTRITION (TPN)", font=F_TINY, fill=(150,150,180))
for i in range(22):
hy = 60 + i*76
d.ellipse([PW-52, hy, PW-22, hy+36], outline=(180,180,200), width=2)
y = 65
section_header(d, MARGIN_X, y, "TOTAL PARENTERAL NUTRITION (TPN)", font=F_TITLE, color=RED_MARKER)
y += 75
# ── 1. Definition ─────────────────────────────────────────────────────
section_header(d, MARGIN_X, y, "1. DEFINITION", font=F_HEAD)
y += 50
def_text = "Continuous IV infusion of a HYPERTONIC solution containing ALL macronutrients (CHO, protein, fat) + micronutrients (electrolytes, vitamins, trace elements) — bypassing the GI tract entirely."
highlight(d, MARGIN_X, y, "HYPERTONIC", F_BODY)
lines = wrap_text(def_text, F_BODY, MAX_W)
for ln in lines:
write_line(d, MARGIN_X+20, y, ln, F_BODY)
y += 34
y += 5
d.text(jitter(MARGIN_X+20, y), "◆ Osmolarity > 1500 mOsm/L → MUST use central vein (large bore)", font=F_BODY, fill=BLUE_PEN)
highlight(d, MARGIN_X+20, y, "MUST use central vein", F_BODY)
y += 38
d.text(jitter(MARGIN_X+20, y), "◆ Dextrose content: 15 – 25% (too concentrated for peripheral veins)", font=F_BODY, fill=BLUE_PEN)
y += 42
d.line([(MARGIN_X, y), (820, y)], fill=LINE_COLOR, width=1)
y += 15
# ── 2. Indications ────────────────────────────────────────────────────
section_header(d, MARGIN_X, y, "2. INDICATIONS", font=F_HEAD)
y += 50
ind_primary = [
"◆ Malnutrition when EN is not possible",
"◆ Intestinal failure (short bowel syndrome, high-output fistulas, obstruction)",
"◆ Prolonged ileus",
"◆ Severe inflammatory bowel disease (Crohn's)",
"◆ Intractable vomiting",
"◆ Severe pancreatitis (when EN not tolerated)",
]
d.text(jitter(MARGIN_X, y), "Primary indications:", font=F_SUBH, fill=RED_MARKER)
y += 38
for pt in ind_primary:
write_line(d, MARGIN_X+30, y, pt, F_BODY)
y += 33
y += 10
d.text(jitter(MARGIN_X, y), "As SUPPLEMENT to EN:", font=F_SUBH, fill=RED_MARKER)
y += 38
supp_text = "→ EN fails to meet > 60% of energy + protein needs after 7 – 10 days"
highlight(d, MARGIN_X+30, y, supp_text, F_BODY, color=YELLOW_HL)
write_line(d, MARGIN_X+30, y, supp_text, F_BODY)
y += 38
y += 5
d.line([(MARGIN_X, y), (820, y)], fill=LINE_COLOR, width=1)
y += 15
# ── 3. Central Venous Access ──────────────────────────────────────────
section_header(d, MARGIN_X, y, "3. CENTRAL VENOUS ACCESS", font=F_HEAD)
y += 50
access_data = [
("Subclavian vein", "MOST COMMON; tunneled preferred if > 8 weeks"),
("PICC", "Peripherally Inserted Central Catheter; good for short-medium term; NOT > 6 months"),
("Internal jugular", "Less desirable — discomfort + sterility issues"),
("Femoral vein", "Last resort only — ↑ infection risk"),
]
for route, comment in access_data:
d.text(jitter(MARGIN_X+10, y), f" {route}:", font=F_SMALL, fill=RED_MARKER)
pw_ = F_SMALL.getbbox(f" {route}:")[2]
c_lines = wrap_text(comment, F_BODY, MAX_W - pw_)
write_line(d, MARGIN_X+pw_+20, y, c_lines[0], F_BODY)
for ln in c_lines[1:]:
y += 30
write_line(d, MARGIN_X+pw_+50, y, ln, F_BODY)
y += 35
highlight(d, MARGIN_X+10, y-35*4, "MOST COMMON", F_SMALL)
highlight(d, MARGIN_X+10, y-35*1, "NOT > 6 months", F_BODY)
y += 5
d.text(jitter(MARGIN_X+10, y), "★ Tunneled catheters preferred for duration > 8 weeks", font=F_SUBH, fill=RED_MARKER)
circle_around(d, MARGIN_X+10, y, "★ Tunneled catheters preferred for duration > 8 weeks", F_SUBH)
y += 50
# Draw TPN flowchart on right side
fc_x = PW - 430
fc_y = 380
draw_tpn_flowchart(d, fc_x, fc_y)
# Doodles
star_doodle(d, 62, 200, r=13, color=(255,130,0))
flower_doodle(d, 62, 500, r=12, color=(180,50,180))
heart_doodle(d, 62, 750, s=10)
lightning_doodle(d, 62, 1000)
star_doodle(d, 62, 1300, r=11, color=(0,150,200))
# Exam tip
eh = exam_tip_box(d, MARGIN_X, y,
"Remember: TPN ≠ PN. TPN = TOTAL (all needs met centrally). PN = any IV nutrition.", w=560)
return img
def page_tpn_2():
"""TPN - Macronutrients, Micronutrients, PPN vs TPN, Monitoring"""
img, d = new_page()
MARGIN_X = 130
MAX_W = 700
d.text((PW-160, 30), "Page 5", font=F_TINY, fill=(150,150,180))
d.text((130, 30), "TOPIC 2: TPN (contd.)", font=F_TINY, fill=(150,150,180))
for i in range(22):
hy = 60 + i*76
d.ellipse([PW-52, hy, PW-22, hy+36], outline=(180,180,200), width=2)
y = 65
# ── 4. Composition - Macronutrients ───────────────────────────────────
section_header(d, MARGIN_X, y, "4. COMPOSITION OF TPN", font=F_HEAD)
y += 52
# A. Dextrose
section_header(d, MARGIN_X, y, "A. CARBOHYDRATES (Dextrose)", font=F_SUBH, color=BLUE_PEN, underline=True)
y += 38
dex_pts = [
"• IV dextrose = monohydrate → provides 3.4 kcal/g (NOT 4 kcal/g!)",
"• Concentration in TPN: 15 – 25%",
"• Minimum 150 g/day → maximizes protein-sparing effect",
"• Excess glucose → hyperglycemia, hepatic steatosis, ↑ CO₂ (↑ VCO₂)",
]
for pt in dex_pts:
write_line(d, MARGIN_X+20, y, pt, F_BODY)
y += 34
highlight(d, MARGIN_X+20, y-34*4, "3.4 kcal/g", F_BODY)
highlight(d, MARGIN_X+20, y-34*3, "150 g/day", F_BODY)
y += 5
# B. Amino Acids
section_header(d, MARGIN_X, y, "B. PROTEINS (Amino Acids)", font=F_SUBH, color=BLUE_PEN, underline=True)
y += 38
aa_pts = [
"• Crystalline amino acid solutions: 40–50% essential + 50–60% non-essential",
"• Standard conc: 3 – 5% | Dose: 1.2 – 2.0 g/kg/day",
"• 1 g amino acid → ≈ 4 kcal",
"• Modified formulas:",
" ‣ BCAA-enriched → hepatic encephalopathy",
" ‣ Essential AA only → renal insufficiency",
]
for pt in aa_pts:
write_line(d, MARGIN_X+20, y, pt, F_BODY)
y += 33
highlight(d, MARGIN_X+20+33*3, y-33*3, "hepatic encephalopathy", F_BODY)
highlight(d, MARGIN_X+20+33*3, y-33*2, "renal insufficiency", F_BODY)
y += 5
# C. Lipids
section_header(d, MARGIN_X, y, "C. LIPID EMULSIONS", font=F_SUBH, color=BLUE_PEN, underline=True)
y += 38
lip_pts = [
"• 10% solution = 1.1 kcal/mL | 20% solution = 2.0 kcal/mL",
"• Provide energy + ESSENTIAL FATTY ACIDS",
"• Optimal: 20 – 30% of total calories",
"• Max infusion rate: 1.0 kcal/kg/h (0.11 g/kg/h) — do NOT exceed!",
"• Standard rate: 0.03 – 0.05 g/kg/h",
"• CONTRAINDICATED if serum TG > 400 mg/dL",
"• Fat-free TPN → essential FA deficiency → dry scaly skin, hair loss",
"• Prevention: periodic fat infusion = 10–15% of total calories",
]
for pt in lip_pts:
write_line(d, MARGIN_X+20, y, pt, F_BODY)
y += 31
highlight(d, MARGIN_X+20, y-31*3, "ESSENTIAL FATTY ACIDS", F_BODY)
highlight(d, MARGIN_X+20, y-31*3, "TG > 400 mg/dL", F_BODY)
circle_around(d, MARGIN_X+20, y-31*6, "Max infusion rate: 1.0 kcal/kg/h", F_BODY)
y += 10
# ── 4D. Micronutrients ────────────────────────────────────────────────
section_header(d, MARGIN_X, y, "D. MICRONUTRIENTS", font=F_SUBH, color=BLUE_PEN, underline=True)
y += 38
micro_data = [
("Vitamin K", "NOT in commercial IV vitamins → supplement WEEKLY"),
("Zinc defic.", "Eczematoid rash at intertriginous areas + generalized dry scaly skin"),
("Copper defic.", "Microcytic anemia"),
("Chromium def.","Glucose intolerance"),
("Selenium def.", "Cardiomyopathy, myopathy"),
]
for mn, detail in micro_data:
d.text(jitter(MARGIN_X+10, y), f"★ {mn}:", font=F_SMALL, fill=RED_MARKER)
pw_ = F_SMALL.getbbox(f"★ {mn}:")[2]
d_lines = wrap_text(detail, F_BODY, MAX_W-pw_)
write_line(d, MARGIN_X+pw_+20, y, d_lines[0], F_BODY)
for ln in d_lines[1:]:
y += 28
write_line(d, MARGIN_X+pw_+50, y, ln, F_BODY)
y += 32
highlight(d, MARGIN_X+10, y-32*5, "NOT in commercial IV vitamins", F_BODY)
highlight(d, MARGIN_X+10+32*1, y-32*4, "WEEKLY", F_SMALL)
y += 5
# Calorie:N ratio box
d.rectangle([MARGIN_X, y, 640, y+42], fill=(240,255,240), outline=(0,150,50), width=2)
d.text((MARGIN_X+10, y+8), "Calorie : Nitrogen ratio = 100 – 150 kcal per 1 g Nitrogen", font=F_SMALL, fill=(0,120,40))
highlight(d, MARGIN_X+10, y+8, "100 – 150 kcal per 1 g Nitrogen", F_SMALL)
y += 52
# Memory trick
mh = memory_trick_box(d, MARGIN_X, y,
"Vit K is a LONER - not included in IV multivitamins. Give weekly!", w=480)
y += mh
# Doodles
star_doodle(d, 62, 200, r=13)
flower_doodle(d, 62, 500, r=12, color=(50,180,80))
heart_doodle(d, 62, 800, s=11)
lightning_doodle(d, 62, 1100)
star_doodle(d, 62, 1400, r=10, color=(200,0,100))
return img
def draw_complications_diagram(d, x, y, w=380):
"""Spiderweb complications diagram"""
d.text((x, y), "TPN Complications Map", font=F_SMALL, fill=RED_MARKER)
underline_squiggle(d, x, y, "TPN Complications Map", F_SMALL)
y += 30
cx, cy = x + w//2, y + 120
# central circle
d.ellipse([cx-45, cy-20, cx+45, cy+20], fill=(255,220,220), outline=RED_MARKER, width=2)
d.text((cx-30, cy-8), "TPN", font=F_SMALL, fill=RED_MARKER)
# surrounding items
items = [
(0, -100, "Hyperglycemia"),
(80, -70, "CRBSI"),
(110, 30, "Cholestasis"),
(70, 110, "Refeeding Syn."),
(-70, 110, "Hyperlipidemia"),
(-110, 30, "Thrombosis"),
(-80, -70, "Pneumothorax"),
]
for ox, oy, label in items:
lx, ly = cx+ox, cy+oy
arrow(d, cx, cy, lx, ly, color=PENCIL)
bbox = F_TINY.getbbox(label)
lw = bbox[2]
d.rectangle([lx-4, ly-2, lx+lw+4, ly+20], fill=(255,255,220), outline=(180,120,0))
d.text((lx, ly), label, font=F_TINY, fill=(150,50,0))
return y + 260
def page_tpn_3():
"""TPN - TPN vs PPN, Initiation Protocol, Monitoring, Complications, Timing"""
img, d = new_page()
MARGIN_X = 130
MAX_W = 700
d.text((PW-160, 30), "Page 6", font=F_TINY, fill=(150,150,180))
d.text((130, 30), "TOPIC 2: TPN (contd.)", font=F_TINY, fill=(150,150,180))
for i in range(22):
hy = 60 + i*76
d.ellipse([PW-52, hy, PW-22, hy+36], outline=(180,180,200), width=2)
y = 65
# ── 5. TPN vs PPN ─────────────────────────────────────────────────────
section_header(d, MARGIN_X, y, "5. TPN vs PERIPHERAL PN (PPN)", font=F_HEAD)
y += 50
d.rectangle([MARGIN_X, y, 820, y+28], fill=(220,230,255))
d.text((MARGIN_X+8, y+5), "Feature", font=F_TINY, fill=DARK_BLUE)
d.text((MARGIN_X+220, y+5), "TPN (Central)", font=F_TINY, fill=DARK_BLUE)
d.text((MARGIN_X+500, y+5), "PPN (Peripheral)", font=F_TINY, fill=DARK_BLUE)
y += 28
comp_rows = [
("Dextrose conc.", "15 – 25%", "5 – 10%"),
("Protein conc.", "3 – 5%", "3%"),
("Osmolarity", "> 1500 mOsm/L", "~600–900 mOsm/L"),
("Access", "Central vein (SVC)", "Peripheral vein"),
("Duration", "Long-term (weeks–months)", "Short-term (< 2 weeks)"),
("Calorie delivery", "COMPLETE", "Partial only"),
("Severe malnutrition", "YES", "NOT appropriate"),
]
for i, (feat, tpn_val, ppn_val) in enumerate(comp_rows):
bg = (248,250,255) if i%2==0 else (255,252,248)
d.rectangle([MARGIN_X, y, 820, y+28], fill=bg, outline=LINE_COLOR)
d.text((MARGIN_X+8, y+6), feat, font=F_TINY, fill=RED_MARKER)
d.text((MARGIN_X+220, y+6), tpn_val, font=F_TINY, fill=BLUE_PEN)
d.text((MARGIN_X+500, y+6), ppn_val, font=F_TINY, fill=(0,120,50))
y += 28
y += 5
note = "PPN > 2 weeks → convert to TPN"
highlight(d, MARGIN_X, y, note, F_SUBH, color=YELLOW_HL)
write_line(d, MARGIN_X, y, note, F_SUBH, color=RED_MARKER)
circle_around(d, MARGIN_X, y, note, F_SUBH)
y += 50
d.line([(MARGIN_X, y), (820, y)], fill=LINE_COLOR, width=1)
y += 15
# ── 6. Initiation Protocol ────────────────────────────────────────────
section_header(d, MARGIN_X, y, "6. INITIATION & MONITORING OF TPN", font=F_HEAD)
y += 50
init_pts = [
"• Start at LOW rate → increase over 2 – 3 days to target",
"• Hypocaloric TPN in critically ill (first ICU week):",
" → < 20 kcal/kg/day OR < 80% of estimated caloric needs",
" → Protein: > 1.2 g/kg/day",
"• Prepare in pharmacy under LAMINAR FLOW HOODS (sterile)",
"• Insulin supplemented as needed → target glucose ≤ 180 mg/dL",
]
for pt in init_pts:
write_line(d, MARGIN_X+20, y, pt, F_BODY)
y += 34
y += 10
# Monitoring Table
d.text(jitter(MARGIN_X, y), "Monitoring Parameters:", font=F_SUBH, fill=RED_MARKER)
y += 38
mon_data = [
("Capillary / urine glucose", "Every 6 hours"),
("Serum glucose", "Daily (first few days), then every 2–3 days"),
("Electrolytes (Na, K, Cl)", "Daily until stable → every 2–3 days"),
("BUN, LFTs", "At least WEEKLY"),
("Phosphate, Magnesium", "Weekly"),
("Serum triglycerides", "At least once during lipid infusion"),
("Body weight, urine output", "Daily"),
]
d.rectangle([MARGIN_X, y, 820, y+26], fill=(200,220,255))
d.text((MARGIN_X+8, y+4), "Parameter", font=F_TINY, fill=DARK_BLUE)
d.text((MARGIN_X+420, y+4), "Frequency", font=F_TINY, fill=DARK_BLUE)
y += 26
for i, (par, freq) in enumerate(mon_data):
bg = (248,252,255) if i%2==0 else (255,252,248)
d.rectangle([MARGIN_X, y, 820, y+26], fill=bg, outline=LINE_COLOR)
d.text((MARGIN_X+8, y+5), par, font=F_TINY, fill=BLUE_PEN)
d.text((MARGIN_X+420, y+5), freq, font=F_TINY, fill=RED_MARKER)
y += 26
y += 15
# Draw complication diagram on right
diag_x = PW - 420
diag_y = 400
draw_complications_diagram(d, diag_x, diag_y)
# ── 7. Timing of TPN in ICU ───────────────────────────────────────────
section_header(d, MARGIN_X, y, "7. TIMING OF TPN IN ICU", font=F_HEAD)
y += 50
timing_pts = [
"• EARLY TPN (< 7 days): NOT beneficial in low-risk ICU pts → ↑ infections",
"• DELAYED initiation (Day 7 – 10):",
" ✓ Fewer infections",
" ✓ Shorter mechanical ventilation",
" ✓ Less renal replacement therapy",
" ✓ Cost savings",
"• Exception: HIGH nutritional risk (NUTRIC ≥ 5) + EN not possible → early PN",
]
for pt in timing_pts:
write_line(d, MARGIN_X+20, y, pt, F_BODY)
y += 33
highlight(d, MARGIN_X+20, y-33*6, "Day 7 – 10", F_BODY)
highlight(d, MARGIN_X+20, y-33*1, "HIGH nutritional risk", F_BODY)
y += 10
eh = exam_tip_box(d, MARGIN_X, y,
"PEPaNIC trial: TPN on Day 8 better than early TPN in PICU! Apply same principle in adults.", w=600)
# Doodles
flower_doodle(d, 62, 200, r=11, color=(50,150,200))
star_doodle(d, 62, 500, r=12, color=(255,100,0))
heart_doodle(d, 62, 800, s=10)
lightning_doodle(d, 62, 1100)
star_doodle(d, 62, 1400, r=11, color=(180,0,180))
return img
def page_tpn_4():
"""TPN - Complications (detailed), Discontinuation, Summary table"""
img, d = new_page()
MARGIN_X = 130
MAX_W = 700
d.text((PW-160, 30), "Page 7", font=F_TINY, fill=(150,150,180))
d.text((130, 30), "TOPIC 2: TPN (contd.) — COMPLICATIONS", font=F_TINY, fill=(150,150,180))
for i in range(22):
hy = 60 + i*76
d.ellipse([PW-52, hy, PW-22, hy+36], outline=(180,180,200), width=2)
y = 65
# ── 8. Complications ──────────────────────────────────────────────────
section_header(d, MARGIN_X, y, "8. COMPLICATIONS OF TPN", font=F_HEAD)
y += 52
# 8A - Metabolic
section_header(d, MARGIN_X, y, "A. METABOLIC COMPLICATIONS", font=F_SUBH, color=BLUE_PEN, underline=True)
y += 38
met_comp = [
("Hyperglycemia", "Excess dextrose / insulin resistance", "Insulin infusion; target ≤ 180 mg/dL"),
("Hypoglycemia", "ABRUPT cessation of TPN", "Taper TPN; give D10W if needed"),
("Hypertriglyceridemia", "Excess/rapid lipid infusion", "↓ Lipid rate; hold if TG > 400 mg/dL"),
("Hepatic steatosis", "Overfeeding, excess glucose", "↓ Caloric load; introduce small EN"),
("Cholestasis", "Lack of EN stimulation (↓ CCK)", "Introduce small-volume EN ASAP"),
("Refeeding syndrome", "Rapid CHO refeeding in malnourished", "Correct electrolytes; start low, go slow"),
("EFA deficiency", "Fat-free TPN", "10–15% calories as fat emulsion"),
]
d.rectangle([MARGIN_X, y, 830, y+26], fill=(220,230,255))
d.text((MARGIN_X+8, y+4), "Complication", font=F_TINY, fill=DARK_BLUE)
d.text((MARGIN_X+270, y+4), "Cause", font=F_TINY, fill=DARK_BLUE)
d.text((MARGIN_X+570, y+4), "Management", font=F_TINY, fill=DARK_BLUE)
y += 26
for i, (comp, cause, mgmt) in enumerate(met_comp):
bg = (248,252,255) if i%2==0 else (255,252,245)
cause_lines = wrap_text(cause, F_TINY, 270)
mgmt_lines = wrap_text(mgmt, F_TINY, 240)
rh = max(26, max(len(cause_lines),len(mgmt_lines))*19+8)
d.rectangle([MARGIN_X, y, 830, y+rh], fill=bg, outline=LINE_COLOR)
d.text((MARGIN_X+8, y+5), comp, font=F_TINY, fill=RED_MARKER)
for j,cl in enumerate(cause_lines):
d.text((MARGIN_X+270, y+5+j*19), cl, font=F_TINY, fill=BLUE_PEN)
for j,ml in enumerate(mgmt_lines):
d.text((MARGIN_X+570, y+5+j*19), ml, font=F_TINY, fill=(0,100,40))
y += rh
y += 15
# 8B - Catheter
section_header(d, MARGIN_X, y, "B. CATHETER-RELATED COMPLICATIONS", font=F_SUBH, color=BLUE_PEN, underline=True)
y += 38
cath_comp = [
("CRBSI", "Most serious; Staph epidermidis common; meticulous asepsis essential"),
("Pneumothorax", "Subclavian/IJ line insertion complication — check CXR post-insertion"),
("Air embolism", "During insertion or line changes — use Trendelenburg position"),
("Venous thrombosis","Thrombophlebitis at catheter tip"),
("Catheter occlusion","Fibrin sheath formation"),
]
for comp, detail in cath_comp:
d.text(jitter(MARGIN_X+10, y), f"◆ {comp}:", font=F_SMALL, fill=RED_MARKER)
pw_ = F_SMALL.getbbox(f"◆ {comp}:")[2]
d_lines = wrap_text(detail, F_BODY, MAX_W-pw_)
write_line(d, MARGIN_X+pw_+20, y, d_lines[0], F_BODY)
for ln in d_lines[1:]:
y += 28
write_line(d, MARGIN_X+pw_+50, y, ln, F_BODY)
y += 34
highlight(d, MARGIN_X+10, y-34*5, "CRBSI", F_SMALL)
highlight(d, MARGIN_X+10, y-34*5, "Staph epidermidis", F_BODY)
y += 5
imp_note = "★ PN mortality risk ← EXCESSIVE CALORIC DELIVERY, not PN per se!"
highlight(d, MARGIN_X, y, imp_note, F_SUBH, color=YELLOW_HL)
write_line(d, MARGIN_X, y, imp_note, F_SUBH, color=RED_MARKER)
circle_around(d, MARGIN_X, y, imp_note, F_SUBH)
y += 52
d.line([(MARGIN_X, y), (820, y)], fill=LINE_COLOR, width=1)
y += 15
# ── 9. Discontinuation ────────────────────────────────────────────────
section_header(d, MARGIN_X, y, "9. DISCONTINUATION OF TPN", font=F_HEAD)
y += 48
disc_pts = [
"• TAPER TPN gradually over 1–2 days (avoid rebound hypoglycemia)",
"• Check blood glucose 30–60 min after stopping TPN",
"• Discontinue when EN meets > 60% of nutritional requirements",
"• Reason for hypoglycemia risk: endogenous insulin levels remain elevated",
]
for pt in disc_pts:
write_line(d, MARGIN_X+20, y, pt, F_BODY)
y += 35
highlight(d, MARGIN_X+20, y-35*4, "TAPER TPN gradually", F_BODY)
highlight(d, MARGIN_X+20, y-35*3, "30–60 min", F_BODY)
y += 10
mh = memory_trick_box(d, MARGIN_X, y,
"Stop TPN suddenly → Hypoglycemia! Insulin still high but glucose gone. TAPER!", w=500)
y += mh + 10
# Doodles
star_doodle(d, 62, 200, r=13, color=(255,130,0))
flower_doodle(d, 62, 500, r=12)
heart_doodle(d, 62, 800, s=11)
lightning_doodle(d, 62, 1100)
star_doodle(d, 62, 1400, r=10, color=(0,150,200))
return img
def page_summary():
"""Final summary / quick revision page"""
img, d = new_page()
MARGIN_X = 130
MAX_W = 700
d.text((PW-160, 30), "Page 8", font=F_TINY, fill=(150,150,180))
d.text((130, 30), "QUICK REVISION SUMMARY", font=F_TINY, fill=(150,150,180))
for i in range(22):
hy = 60 + i*76
d.ellipse([PW-52, hy, PW-22, hy+36], outline=(180,180,200), width=2)
y = 65
section_header(d, MARGIN_X, y, "MASTER SUMMARY TABLE", font=F_TITLE, color=RED_MARKER)
y += 75
# Large summary table
d.rectangle([MARGIN_X, y, 820, y+30], fill=(200,220,255))
d.text((MARGIN_X+8, y+6), "Parameter", font=F_SMALL, fill=DARK_BLUE)
d.text((MARGIN_X+310, y+6), "Recommendation", font=F_SMALL, fill=DARK_BLUE)
y += 30
summary_rows = [
("Total energy (ICU)", "12 – 25 kcal/kg/day"),
("Hypocaloric (first week)", "< 20 kcal/kg/day OR < 80% estimated needs"),
("Protein", "1.2 – 2.0 g/kg/day (actual body wt)"),
("EN timing", "Within 24 – 48 hrs of ICU admission"),
("Start PN", "When EN < 60% needs after 7 – 10 days"),
("TPN dextrose", "15 – 25% | 3.4 kcal/g | min 150 g/day"),
("TPN lipids", "20 – 30% total cal | max 1.0 kcal/kg/h | hold TG > 400"),
("Calorie : N ratio", "100 – 150 kcal per gram of nitrogen"),
("Blood glucose target", "≤ 180 mg/dL (NOT tight control)"),
("Vitamin K in TPN", "Weekly supplement (NOT in IV multivitamins)"),
("Central access preferred", "Subclavian (tunneled if > 8 wks) | PICC (< 6 mths)"),
("PPN duration", "< 2 weeks only; NOT for severe malnutrition"),
("Refeeding hallmark", "Severe HYPOPHOSPHATEMIA — correct before feeding"),
("Stop TPN", "TAPER over 1-2 days; check BG 30-60 min after stopping"),
]
for i, (param, rec) in enumerate(summary_rows):
bg = (248,252,255) if i%2==0 else (255,252,245)
rec_lines = wrap_text(rec, F_BODY, 460)
rh = max(30, len(rec_lines)*26+8)
d.rectangle([MARGIN_X, y, 820, y+rh], fill=bg, outline=LINE_COLOR)
d.text((MARGIN_X+8, y+6), param, font=F_SMALL, fill=RED_MARKER)
for j, rl in enumerate(rec_lines):
d.text((MARGIN_X+310, y+6+j*26), rl, font=F_SMALL, fill=BLUE_PEN)
y += rh
# Highlight top key values
y += 20
d.rectangle([MARGIN_X, y, 820, y+3], fill=RED_MARKER)
y += 10
d.text(jitter(MARGIN_X, y), "KEY NUMBERS TO REMEMBER:", font=F_SUBH, fill=RED_MARKER)
y += 42
key_nums = [
"EN within 24–48h | PN if EN fails after 7–10d | BG ≤ 180 mg/dL",
"Protein 1.2–2.0 g/kg | Energy 12–25 kcal/kg | Cal:N = 100–150:1",
"Dextrose 3.4 kcal/g | Lipid max 1.0 kcal/kg/h | Hold lipid if TG >400",
"Vit K WEEKLY | NUTRIC ≥5 = high risk | Taper TPN over 1-2 days",
]
for kn in key_nums:
highlight(d, MARGIN_X+20, y, kn, F_BODY, color=YELLOW_HL)
write_line(d, MARGIN_X+20, y, kn, F_BODY, color=DARK_BLUE)
y += 36
y += 15
# References box
d.rectangle([MARGIN_X, y, 820, y+170], fill=(250,250,255), outline=(150,150,200), width=2)
d.text((MARGIN_X+10, y+8), "REFERENCES:", font=F_SMALL, fill=RED_MARKER)
refs = [
"◆ Barash's Clinical Anesthesia, 9e — pp. 4855–4856",
"◆ Miller's Anesthesia, 10e — Pediatric ICU Nutrition; GI System",
"◆ Schwartz's Principles of Surgery, 11e — pp. 99–100",
"◆ Washington Manual of Medical Therapeutics — pp. 63–64",
"◆ Harrison's Principles of Internal Medicine, 22e — p. 2341",
"◆ Mulholland & Greenfield's Surgery, 7e — pp. 133–136",
]
for j, ref in enumerate(refs):
d.text((MARGIN_X+15, y+30+j*22), ref, font=F_TINY, fill=BLUE_PEN)
y += 175
# Final exam tip
eh = exam_tip_box(d, MARGIN_X, y,
"10-mark answer structure: Intro → Metabolic response → Assessment → EN vs PN → Caloric targets → Glycemic control → Immunonutrition → Refeeding → Summary table. Always mention SCCM/ASPEN guidelines!", w=700)
# Doodles
star_doodle(d, 62, 200, r=13, color=(255,130,0))
flower_doodle(d, 62, 500, r=12, color=(180,50,180))
heart_doodle(d, 62, 750, s=10)
lightning_doodle(d, 62, 1000)
star_doodle(d, 62, 1300, r=11, color=(0,150,200))
return img
# ══════════════════════════════════════════════════════════════════════════
# COMPILE ALL PAGES INTO PDF
# ══════════════════════════════════════════════════════════════════════════
print("Generating pages...")
pages = [
page_cover(),
page_nutrition_1(),
page_nutrition_2(),
page_nutrition_3(),
page_tpn_1(),
page_tpn_2(),
page_tpn_3(),
page_tpn_4(),
page_summary(),
]
print(f"Generated {len(pages)} pages. Saving to PDF...")
output_path = os.path.join(BASE, "ICU_Nutrition_Handwritten_Notes.pdf")
pages[0].save(
output_path,
save_all=True,
append_images=pages[1:],
format="PDF",
resolution=150,
)
print(f"PDF saved: {output_path}")
print(f"File size: {os.path.getsize(output_path) / 1024:.1f} KB")
cd /home/daytona/workspace/icu-notes && python3 make_notes.py 2>&1
python3 -c " from pypdf import PdfReader r = PdfReader('/home/daytona/workspace/…
ICU Nutrition Handwritten Notes
PDF Document · PDF
| Page | Content |
|---|---|
| Page 1 (Cover) | Title page with all 7 source textbooks listed, decorative spiral binding, margin doodles |
| Page 2 | Nutrition in ICU - Introduction, Metabolic Response (3-phase table), Nutritional Assessment (NUTRIC/NRS-2002/Indirect Calorimetry) |
| Page 3 | Route (EN vs PN), Timing (24-48h), Gastric vs Post-pyloric, Caloric Targets, Glycemic Control |
| Page 4 | Immunonutrition table, Vasopressor feeding, Refeeding Syndrome, SCCM/ASPEN 10-point Bundle |
| Page 5 | TPN - Definition, Indications, Central Venous Access, TPN Composition Flowchart diagram |
| Page 6 | Macronutrients (Dextrose/AA/Lipids), Micronutrients, Vitamin K, Trace element deficiencies |
| Page 7 | TPN vs PPN comparison table, Initiation Protocol, Monitoring table, Timing of TPN (PEPaNIC trial), Complications spiderweb diagram |
| Page 8 | Detailed Complications (Metabolic + Catheter-related), Discontinuation protocol |
| Page 9 | Master Summary Table, Key Numbers, Full References, Final Exam Tip |