Difference between acute chronic and persistent diarrhoea according to Nelson textbook of paediatrics
Nelson textbook paediatrics acute chronic persistent diarrhea definition classification duration
| Type | Duration | Key Features |
|---|---|---|
| Acute | < 14 days | Sudden onset; usually self-limited |
| Persistent | 14-29 days (>14 days) | Prolonged acute episode; high-risk group |
| Chronic | ≥ 30 days (>30 days) | Insidious or persistent; often non-infectious |
"Acute diarrhea has a sudden onset and lasts no longer than 14 days... The majority of cases are self-limited infections caused by viruses and bacteria." - Yamada's Textbook of Gastroenterology / WHO classification
"Persistent diarrhea lasts > 14 days; it usually has an acute onset and is more common in children under 5 years of age." - Pediatría Integral 2024
"Acute diarrhea lasts ≤ 14 days; persistent diarrhea lasts > 14 days; and chronic diarrhea lasts > 30 days... As diarrhea persists, non-infectious etiologies become more prevalent." - Yamada's Textbook of Gastroenterology; Frameworks for Internal Medicine
| Feature | Acute | Persistent | Chronic |
|---|---|---|---|
| Most common cause | Viral/bacterial infection | Prolonged infection or post-infectious | Non-infectious (IBD, coeliac, etc.) |
| Spontaneous resolution | Common | Possible but requires evaluation | Unlikely without specific treatment |
| Nutritional impact | Mild/transient | Moderate - significant | Severe if untreated |
| Stool cultures useful? | Yes | Limited value | Rarely useful |
| Mortality risk in children | Low (if managed) | High (developing world) | Depends on underlying cause |
Composition of ringer lactate
| Electrolyte | Concentration |
|---|---|
| Sodium (Na⁺) | 130 mEq/L |
| Potassium (K⁺) | 4 mEq/L |
| Calcium (Ca²⁺) | 3 mEq/L |
| Chloride (Cl⁻) | 109 mEq/L |
| Lactate (HCO₃⁻ precursor) | 28 mEq/L |
"Lactated Ringer's: Sodium 130 mEq/L, potassium 4 mEq/L, calcium 3 mEq/L, chloride 109 mEq/L, lactate 28 mEq/L." - Tintinalli's Emergency Medicine, Table 12-6
| Property | Value |
|---|---|
| Osmolarity | ~273 mOsm/L (slightly hypotonic vs plasma) |
| pH | ~6.5 (range 6.0–7.5) |
| Tonicity | Near-isotonic / balanced |
| Component | Ringer's Lactate | Normal Saline (0.9%) | Human Plasma |
|---|---|---|---|
| Na⁺ (mEq/L) | 130 | 154 | 134-145 |
| K⁺ (mEq/L) | 4 | 0 | 3.4-5 |
| Ca²⁺ (mEq/L) | 3 | 0 | 4.5-5.5 |
| Cl⁻ (mEq/L) | 109 | 154 | 95-108 |
| Lactate (mEq/L) | 28 | 0 | 1-2 |
| Osmolarity (mOsm/L) | ~273 | ~308 | ~285-295 |
"Lactate can accept a proton and subsequently be metabolised to CO₂ and water by the liver... LR results in a buffering of the acidaemia that is advantageous over NS." - Tintinalli's Emergency Medicine
Create a comparison table of crystalloid solutions (RL, NS, Plasma-Lyte)
| Component | Normal Saline (0.9% NaCl) | Ringer's Lactate (LR) | Plasma-Lyte A | Human Plasma |
|---|---|---|---|---|
| Na⁺ (mEq/L) | 154 | 130 | 140 | 135-145 |
| K⁺ (mEq/L) | 0 | 4 | 5 | 3.4-5.0 |
| Ca²⁺ (mEq/L) | 0 | 2.7-3 | 0 | 2.2-2.6 |
| Mg²⁺ (mEq/L) | 0 | 0 | 1.5 | 0.8-1.0 |
| Cl⁻ (mEq/L) | 154 | 109 | 98 | 94-111 |
| Lactate (mEq/L) | 0 | 28 | 0 | 1-2 |
| Acetate (mEq/L) | 0 | 0 | 27 | 0 |
| Gluconate (mEq/L) | 0 | 0 | 23 | 0 |
| Bicarbonate (mEq/L) | 0 | 0 | 0 | 22-32 |
| Property | Normal Saline | Ringer's Lactate | Plasma-Lyte A | Human Plasma |
|---|---|---|---|---|
| pH | 5.0-5.4 | 6.5 | 7.4 | 7.35-7.45 |
| Osmolarity (mOsm/L) | 308 (hypertonic) | 273 (slightly hypotonic) | 294 (isotonic) | 280-295 |
| Strong Ion Difference (mEq/L) | 0 | 28 | 50 | ~42 |
| Buffer system | None | Lactate (→ HCO₃⁻) | Acetate + Gluconate | HCO₃⁻ |
| Contains calcium? | No | Yes | No | Yes |
| Contains magnesium? | No | No | Yes | Yes |
| Feature | Normal Saline | Ringer's Lactate | Plasma-Lyte A |
|---|---|---|---|
| Acid-base effect | Causes hyperchloraemic metabolic acidosis in large volumes (high Cl⁻, SID = 0) | Mildly alkalinising; lactate metabolised to HCO₃⁻ | Most physiologic; SID closest to plasma (~50) |
| Risk of acidosis | High with large volumes | Low | Very low |
| Risk of hyperkalaemia | None | Theoretical (small K⁺) | Theoretical (small K⁺) |
| Compatible with blood transfusion? | Yes | No - Ca²⁺ binds citrate in stored blood, risks clotting | Yes |
| Safe in raised ICP? | Yes (slightly hypertonic) | Caution - slightly hypotonic (273 mOsm/L), may worsen cerebral oedema | Yes (iso-osmolar) |
| Safe in renal failure? | Preferred if hyperkalaemia concern (no K⁺) | Caution (K⁺ present) | Caution (K⁺ + Mg²⁺) |
| Safe in liver failure? | Yes | Caution - lactate metabolism impaired → lactate may accumulate | Preferred (acetate metabolised in muscle, not liver) |
| Cost | Cheapest | ~Equal to NS | ~Equal to NS |
| Best use | Hyponatraemia, hypochloraemia, medication diluent, pre-blood transfusion | Surgical fluid replacement, burns (Parkland formula), sepsis, general resuscitation | Large-volume resuscitation, ICU, liver failure, neurosurgery |
"Patients who received balanced crystalloids (LR or Plasma-Lyte) had a lower rate of the composite outcome of death, new renal replacement therapy, and persistent renal dysfunction compared with patients who received normal saline." - Sabiston Textbook of Surgery (SMART/SALT-ED trial data)
"Balanced crystalloids yield better clinical outcomes compared to normal saline in both critically ill and non-critically ill patients from all causes, although the effect is small (NNT ≈ 90)." - Tintinalli's Emergency Medicine, Table 13-3
Composition of dns and half dns
| Name | Full Form | Also Written As |
|---|---|---|
| DNS | Dextrose Normal Saline | D5NS / D5 0.9% NaCl / 5% Dextrose in 0.9% NaCl |
| Half DNS | Dextrose Half Normal Saline | D5 1/2 NS / D5 0.45% NaCl / 5% Dextrose in 0.45% NaCl |
| Component | Amount per Litre |
|---|---|
| Dextrose (glucose) | 50 g/L (5 g per 100 mL) |
| Sodium (Na⁺) | 154 mEq/L |
| Chloride (Cl⁻) | 154 mEq/L |
| Water | Remainder |
| Caloric content | ~170 kcal/L (dextrose provides ~3.4 kcal/g) |
| pH | ~4.0-5.0 |
| Osmolarity | ~586 mOsm/L (hypertonic) |
| Tonicity | Hypertonic |
Note: Although NS alone has 308 mOsm/L and D5W has 278 mOsm/L, adding dextrose to NS gives a combined osmolarity of ~586 mOsm/L - making D5NS hypertonic relative to plasma. This is confirmed in Basic Medical Biochemistry (Lippincott, 6e), which uses D5 0.9% NaCl as a classic example of a hypertonic IV solution.
| Component | Amount per Litre |
|---|---|
| Dextrose (glucose) | 50 g/L (5 g per 100 mL) |
| Sodium (Na⁺) | 77 mEq/L |
| Chloride (Cl⁻) | 77 mEq/L |
| Water | Remainder |
| Caloric content | ~170 kcal/L |
| pH | ~4.0-5.0 |
| Osmolarity | ~432 mOsm/L (hypertonic) |
| Tonicity | Hypertonic (slightly less than DNS) |
| Property | DNS (D5NS) | Half DNS (D5 ½NS) | Normal Saline | Human Plasma |
|---|---|---|---|---|
| Dextrose | 50 g/L | 50 g/L | 0 | - |
| Na⁺ (mEq/L) | 154 | 77 | 154 | 135-145 |
| Cl⁻ (mEq/L) | 154 | 77 | 154 | 94-111 |
| Osmolarity (mOsm/L) | ~586 | ~432 | 308 | 280-295 |
| Tonicity | Hypertonic | Hypertonic | Isotonic | - |
| Calories | 170 kcal/L | 170 kcal/L | 0 | - |
| K⁺ | 0 | 0 | 0 | 3.4-5 |
| Buffer | None | None | None | HCO₃⁻ |
| Solution | Common Uses |
|---|---|
| DNS | Dehydration with hypoglycaemia; post-op fluid (short-term); hypothyroidism crisis (myxoedema coma); thyrotoxic crisis; adrenal insufficiency; DKA (when glucose <250 mg/dL - switched from NS to D5NS to allow continued insulin) |
| Half DNS | Paediatric maintenance fluids; hyperosmolar states; hypernatraemia correction; DKA (when glucose <250 mg/dL combined with 0.45% saline); free water replacement when some sodium is also needed |
"After initial volume expansion, continue replacement with either normal saline or 5% dextrose in 0.9% normal saline... dextrose-containing fluids help clear ketones in the patient who has not been eating or drinking." - Tintinalli's Emergency Medicine
"5% dextrose in 0.45% normal saline (NS) with 20 mEq/L of KCl" - standard paediatric maintenance fluid formulation. - Sabiston Textbook of Surgery
Create a quick reference PDF comparing all common IV fluids
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"
mkdir -p /home/daytona/workspace/iv-fluids-pdf && python3 -c "import reportlab; …
~/iv-fluids-pdf/generate_iv_fluids_pdf.py
#!/usr/bin/env python3
"""
Quick Reference PDF: Common IV Fluids
Uses ReportLab to generate a professional multi-page PDF
"""
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, Table, TableStyle, Paragraph, Spacer,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
from reportlab.platypus import PageBreak
# ── Output path ──────────────────────────────────────────────────────────────
OUTPUT = "/home/daytona/workspace/iv-fluids-pdf/IV_Fluids_Quick_Reference.pdf"
# ── Colour palette ───────────────────────────────────────────────────────────
NAVY = colors.HexColor("#1A3557")
TEAL = colors.HexColor("#1D7874")
LIGHT_BLUE = colors.HexColor("#D6EAF8")
MINT = colors.HexColor("#D5F5E3")
PEACH = colors.HexColor("#FDEBD0")
LAVENDER = colors.HexColor("#EAD7F5")
YELLOW = colors.HexColor("#FEF9E7")
RED_LIGHT = colors.HexColor("#FADBD8")
WHITE = colors.white
GREY_LIGHT = colors.HexColor("#F2F3F4")
GREY_MID = colors.HexColor("#AEB6BF")
DARK_TEXT = colors.HexColor("#1C2833")
TEAL_DARK = colors.HexColor("#0E6655")
# ── Page setup ───────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.5*cm,
leftMargin=1.5*cm,
topMargin=2*cm,
bottomMargin=2*cm,
title="IV Fluids Quick Reference",
author="Orris Medical",
subject="Intravenous Fluid Composition & Clinical Guide"
)
W, H = A4
styles = getSampleStyleSheet()
# ── Custom styles ─────────────────────────────────────────────────────────────
def make_style(name, parent="Normal", **kw):
return ParagraphStyle(name, parent=styles[parent], **kw)
title_style = make_style("DocTitle", fontSize=22, textColor=WHITE,
alignment=TA_CENTER, fontName="Helvetica-Bold", leading=28)
sub_style = make_style("DocSub", fontSize=11, textColor=colors.HexColor("#BDC3C7"),
alignment=TA_CENTER, fontName="Helvetica", leading=16)
section_style = make_style("Section", fontSize=13, textColor=WHITE,
alignment=TA_LEFT, fontName="Helvetica-Bold", leading=18,
leftIndent=6)
body_style = make_style("Body", fontSize=8.5, textColor=DARK_TEXT,
fontName="Helvetica", leading=12)
bold_style = make_style("Bold", fontSize=8.5, textColor=DARK_TEXT,
fontName="Helvetica-Bold", leading=12)
note_style = make_style("Note", fontSize=8, textColor=colors.HexColor("#5D6D7E"),
fontName="Helvetica-Oblique", leading=11)
cell_hdr = make_style("CellHdr", fontSize=8, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER, leading=10)
cell_body = make_style("CellBody", fontSize=7.8, textColor=DARK_TEXT,
fontName="Helvetica", alignment=TA_CENTER, leading=10)
cell_left = make_style("CellLeft", fontSize=7.8, textColor=DARK_TEXT,
fontName="Helvetica", alignment=TA_LEFT, leading=10)
cell_bold_l = make_style("CellBoldL", fontSize=7.8, textColor=DARK_TEXT,
fontName="Helvetica-Bold", alignment=TA_LEFT, leading=10)
warn_style = make_style("Warn", fontSize=8, textColor=colors.HexColor("#922B21"),
fontName="Helvetica-Bold", leading=11)
tip_style = make_style("Tip", fontSize=8, textColor=TEAL_DARK,
fontName="Helvetica", leading=11)
# ── Helper: section header banner ────────────────────────────────────────────
def section_banner(text, color=NAVY):
tbl = Table([[Paragraph(text, section_style)]], colWidths=[doc.width])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("ROWBACKGROUNDS",(0,0), (-1,-1), [color]),
]))
return tbl
# ── Helper: coloured info box ─────────────────────────────────────────────────
def info_box(rows, bg=LIGHT_BLUE, col_widths=None):
if col_widths is None:
col_widths = [doc.width]
tbl = Table(rows, colWidths=col_widths)
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("BOX", (0,0), (-1,-1), 0.5, GREY_MID),
]))
return tbl
# ═══════════════════════════════════════════════════════════════════════════════
# BUILD CONTENT
# ═══════════════════════════════════════════════════════════════════════════════
story = []
# ─── COVER HEADER ────────────────────────────────────────────────────────────
cover = Table(
[[Paragraph("Quick Reference: Common IV Fluids", title_style)],
[Paragraph("Composition · Tonicity · Electrolytes · Clinical Indications · Precautions", sub_style)]],
colWidths=[doc.width]
)
cover.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 14),
("BOTTOMPADDING", (0,0), (-1,-1), 14),
("ROUNDEDCORNERS",(0,0), (-1,-1), [4,4,4,4]),
]))
story.append(cover)
story.append(Spacer(1, 10))
story.append(Paragraph(
"Sources: Tintinalli's Emergency Medicine · Sabiston Textbook of Surgery · "
"Rosen's Emergency Medicine · Harrison's Principles · Yamada's Gastroenterology",
note_style
))
story.append(Spacer(1, 12))
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 1 — MASTER COMPOSITION TABLE
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_banner("1. Master Electrolyte Composition Table"))
story.append(Spacer(1, 6))
comp_headers = [
Paragraph("IV Fluid", cell_hdr),
Paragraph("Na⁺\n(mEq/L)", cell_hdr),
Paragraph("K⁺\n(mEq/L)", cell_hdr),
Paragraph("Ca²⁺\n(mEq/L)", cell_hdr),
Paragraph("Mg²⁺\n(mEq/L)", cell_hdr),
Paragraph("Cl⁻\n(mEq/L)", cell_hdr),
Paragraph("Buffer\n(mEq/L)", cell_hdr),
Paragraph("Dextrose\n(g/L)", cell_hdr),
Paragraph("Osm\n(mOsm/L)", cell_hdr),
Paragraph("pH", cell_hdr),
Paragraph("Tonicity", cell_hdr),
]
def r(fluid, na, k, ca, mg, cl, buf, dex, osm, ph, ton, row_bg):
return ([Paragraph(fluid, cell_bold_l),
Paragraph(na, cell_body), Paragraph(k, cell_body),
Paragraph(ca, cell_body), Paragraph(mg, cell_body),
Paragraph(cl, cell_body), Paragraph(buf, cell_body),
Paragraph(dex, cell_body), Paragraph(osm, cell_body),
Paragraph(ph, cell_body), Paragraph(ton, cell_body)],
row_bg)
fluid_rows = [
r("Human Plasma", "135–145","3.4–5","2.2–2.6","0.8–1.0","94–111","HCO₃⁻ 22–32","~1","280–295","7.35–7.45","Isotonic", colors.HexColor("#EAFAF1")),
r("Normal Saline\n(0.9% NaCl)", "154","0","0","0","154","None","0","308","5.0","Isotonic", GREY_LIGHT),
r("Ringer's Lactate (RL)", "130","4","2.7–3","0","109","Lactate 28","0","273","6.5","Slightly\nhypotonic", LIGHT_BLUE),
r("Plasma-Lyte A", "140","5","0","1.5","98","Acetate 27\nGluconate 23","0","294","7.4","Isotonic", MINT),
r("D5W\n(5% Dextrose Water)","0","0","0","0","0","None","50","278","4.0–5.0","Isotonic\n(hypotonic\nafter metabolism)", YELLOW),
r("DNS\n(D5 + 0.9% NaCl)", "154","0","0","0","154","None","50","~586","4.0–5.0","Hypertonic",PEACH),
r("Half DNS\n(D5 + 0.45% NaCl)","77","0","0","0","77","None","50","~432","4.0–5.0","Hypertonic",LAVENDER),
r("0.45% NaCl\n(Half Normal Saline)","77","0","0","0","77","None","0","154","5.0","Hypotonic", GREY_LIGHT),
r("3% NaCl\n(Hypertonic Saline)", "513","0","0","0","513","None","0","1026","5.0","Hypertonic", RED_LIGHT),
r("D5RL\n(D5 + RL)", "130","4","2.7–3","0","109","Lactate 28","50","~524","6.0","Hypertonic",colors.HexColor("#E8DAEF")),
r("Isolyte / Normosol-R", "140","5","0","3","98","Acetate 27\nGluconate 23","0","295","7.4","Isotonic", colors.HexColor("#D5EEF5")),
]
col_w = [3.8*cm, 1.3*cm, 1.0*cm, 1.3*cm, 1.2*cm, 1.2*cm, 2.2*cm, 1.3*cm, 1.3*cm, 1.5*cm, 1.5*cm]
comp_data = [comp_headers] + [row for row, _ in fluid_rows]
row_bgs = [NAVY] + [bg for _, bg in fluid_rows]
comp_table = Table(comp_data, colWidths=col_w, repeatRows=1)
ts = TableStyle([
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
("GRID", (0,0), (-1,-1), 0.4, GREY_MID),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ALIGN", (1,0), (-1,-1), "CENTER"),
("BACKGROUND", (0,0), (-1, 0), NAVY),
("ROWBACKGROUNDS",(0,1), (-1,-1), [bg for _, bg in fluid_rows]),
])
comp_table.setStyle(ts)
story.append(comp_table)
story.append(Spacer(1, 6))
story.append(Paragraph(
"★ Osm values for dextrose-containing fluids are calculated; effective tonicity drops once glucose is metabolised. "
"★ RL calcium (2.7–3 mEq/L) binds citrate in stored blood — do NOT co-administer with blood products.",
note_style
))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 2 — CRYSTALLOID DETAILED PROFILES
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_banner("2. Crystalloid Fluid Profiles", TEAL))
story.append(Spacer(1, 8))
profiles = [
{
"name": "Normal Saline (0.9% NaCl)",
"bg": GREY_LIGHT,
"composition": "Na⁺ 154 | Cl⁻ 154 | Osm 308 | pH 5.0 | No K⁺, Ca²⁺, Mg²⁺ | No buffer",
"indications": [
"• Hypovolaemia and resuscitation (first-line in many settings)",
"• Hyponatraemia correction (carefully)",
"• Hypochloraemic metabolic alkalosis (e.g. vomiting)",
"• Drug diluent / flush (compatible with most IV medications)",
"• Co-administration with blood products (Ca²⁺-free)",
"• Raised intracranial pressure (slightly hypertonic vs plasma)",
],
"precautions": [
"⚠ Hyperchloraemic metabolic acidosis with large-volume infusion",
"⚠ Contains NO K⁺ — monitor electrolytes in prolonged use",
"⚠ High Cl⁻ can worsen acidosis in critically ill patients",
],
},
{
"name": "Ringer's Lactate (RL / Lactated Ringer's / Hartmann's)",
"bg": LIGHT_BLUE,
"composition": "Na⁺ 130 | K⁺ 4 | Ca²⁺ 2.7–3 | Cl⁻ 109 | Lactate 28 | Osm 273 | pH 6.5",
"indications": [
"• Large-volume surgical / trauma resuscitation",
"• Burns — Parkland formula (4 mL/kg/% TBSA over 24 h)",
"• GI fluid losses (diarrhoea, fistulae, bowel obstruction)",
"• Sepsis and general fluid resuscitation",
"• DKA initial phase (before glucose falls <250 mg/dL)",
],
"precautions": [
"⚠ Do NOT run with blood — Ca²⁺ binds citrate → clotting risk",
"⚠ Avoid in severe liver failure (lactate not metabolised)",
"⚠ Slightly hypotonic (273 mOsm) — caution in raised ICP",
"⚠ Theoretical hyperkalaemia risk in anuric renal failure (K⁺ 4 mEq/L)",
],
},
{
"name": "Plasma-Lyte A",
"bg": MINT,
"composition": "Na⁺ 140 | K⁺ 5 | Mg²⁺ 1.5 | Cl⁻ 98 | Acetate 27 | Gluconate 23 | Osm 294 | pH 7.4",
"indications": [
"• Most physiologically balanced crystalloid (pH 7.4, SID ~50)",
"• Large-volume resuscitation in liver failure (acetate metabolised by muscle)",
"• Neurosurgery / head injury (iso-osmolar, no ICP concern)",
"• ICU resuscitation where acid-base balance is critical",
"• Post-renal transplant resuscitation",
],
"precautions": [
"⚠ Contains Mg²⁺ — caution in renal failure (Mg accumulation)",
"⚠ K⁺ 5 mEq/L — avoid in hyperkalaemia",
"⚠ Higher cost than NS or RL",
"⚠ Acetate may affect peripheral vascular resistance in large volumes",
],
},
{
"name": "0.45% NaCl (Half Normal Saline)",
"bg": GREY_LIGHT,
"composition": "Na⁺ 77 | Cl⁻ 77 | Osm 154 | pH 5.0 | Hypotonic",
"indications": [
"• Hypernatraemia correction (free water replacement)",
"• Hyperosmolar hyperglycaemic state (HHS) maintenance",
"• DKA — combined with dextrose when glucose <250 mg/dL",
"• Water replacement in diabetes insipidus",
],
"precautions": [
"⚠ Hypotonic — can cause dilutional hyponatraemia",
"⚠ May worsen cerebral oedema",
"⚠ Not for volume resuscitation",
],
},
{
"name": "3% NaCl (Hypertonic Saline)",
"bg": RED_LIGHT,
"composition": "Na⁺ 513 | Cl⁻ 513 | Osm 1026 | pH 5.0 | Strongly hypertonic",
"indications": [
"• Severe symptomatic hyponatraemia (seizures, coma)",
"• Raised intracranial pressure / cerebral oedema",
"• SIADH with neurological compromise",
],
"precautions": [
"⚠ Central line preferred (phlebitis in peripheral veins)",
"⚠ Risk of osmotic demyelination syndrome if Na corrected too rapidly",
"⚠ Correct Na at max 8–10 mEq/L per 24 h",
"⚠ Close monitoring of serum sodium mandatory",
],
},
]
for p in profiles:
rows = [
[Paragraph(f"<b>{p['name']}</b>", bold_style)],
[Paragraph(f"Composition: {p['composition']}", body_style)],
[Paragraph("<b>Indications:</b>", bold_style)],
] + [[Paragraph(i, tip_style)] for i in p["indications"]] + [
[Paragraph("<b>Precautions:</b>", bold_style)],
] + [[Paragraph(w, warn_style)] for w in p["precautions"]]
tbl = Table(rows, colWidths=[doc.width])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), p["bg"]),
("BACKGROUND", (0,0), (-1, 0), colors.HexColor("#2C3E50")),
("TEXTCOLOR", (0,0), (-1, 0), WHITE),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 8),
("BOX", (0,0), (-1,-1), 0.5, GREY_MID),
]))
story.append(KeepTogether([tbl, Spacer(1, 7)]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 3 — DEXTROSE-CONTAINING FLUIDS
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_banner("3. Dextrose-Containing Fluids", colors.HexColor("#7D3C98")))
story.append(Spacer(1, 8))
dex_data = [
[Paragraph("Fluid", cell_hdr),
Paragraph("Dextrose\n(g/L)", cell_hdr),
Paragraph("Na⁺\n(mEq/L)", cell_hdr),
Paragraph("Cl⁻\n(mEq/L)", cell_hdr),
Paragraph("Osm\n(mOsm/L)", cell_hdr),
Paragraph("Tonicity", cell_hdr),
Paragraph("Calories\n(kcal/L)", cell_hdr),
Paragraph("Primary Use", cell_hdr)],
[Paragraph("D5W\n(5% Dextrose in Water)", cell_bold_l),
Paragraph("50", cell_body), Paragraph("0", cell_body), Paragraph("0", cell_body),
Paragraph("278", cell_body), Paragraph("Isotonic*", cell_body),
Paragraph("170", cell_body),
Paragraph("Hypernatraemia correction, medication diluent, K⁺ free water", cell_left)],
[Paragraph("D10W\n(10% Dextrose in Water)", cell_bold_l),
Paragraph("100", cell_body), Paragraph("0", cell_body), Paragraph("0", cell_body),
Paragraph("505", cell_body), Paragraph("Hypertonic", cell_body),
Paragraph("340", cell_body),
Paragraph("Neonatal hypoglycaemia, TPN supplement, insulin infusion support", cell_left)],
[Paragraph("DNS\n(D5 + 0.9% NaCl)", cell_bold_l),
Paragraph("50", cell_body), Paragraph("154", cell_body), Paragraph("154", cell_body),
Paragraph("~586", cell_body), Paragraph("Hypertonic", cell_body),
Paragraph("170", cell_body),
Paragraph("Dehydration with hypoglycaemia; DKA (glucose <250); adrenal crisis; myxoedema coma", cell_left)],
[Paragraph("Half DNS\n(D5 + 0.45% NaCl)", cell_bold_l),
Paragraph("50", cell_body), Paragraph("77", cell_body), Paragraph("77", cell_body),
Paragraph("~432", cell_body), Paragraph("Hypertonic", cell_body),
Paragraph("170", cell_body),
Paragraph("Paediatric maintenance; DKA (glucose <250 + 0.45% saline protocol); hypernatraemia", cell_left)],
[Paragraph("D5RL\n(D5 + Ringer's Lactate)", cell_bold_l),
Paragraph("50", cell_body), Paragraph("130", cell_body), Paragraph("109", cell_body),
Paragraph("~524", cell_body), Paragraph("Hypertonic", cell_body),
Paragraph("170", cell_body),
Paragraph("Post-op maintenance; surgical resuscitation when caloric support also needed", cell_left)],
]
dex_col_w = [3.5*cm, 1.5*cm, 1.3*cm, 1.3*cm, 1.5*cm, 1.5*cm, 1.5*cm, 5.7*cm]
dex_table = Table(dex_data, colWidths=dex_col_w, repeatRows=1)
dex_bgs = [LAVENDER, YELLOW, PEACH, LAVENDER, MINT]
dex_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1, 0), colors.HexColor("#7D3C98")),
("ROWBACKGROUNDS",(0,1), (-1,-1), dex_bgs),
("GRID", (0,0), (-1,-1), 0.4, GREY_MID),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
]))
story.append(dex_table)
story.append(Spacer(1, 5))
story.append(Paragraph(
"* D5W is isotonic in the bag (278 mOsm/L) but acts as free water after glucose is metabolised — "
"effectively hypotonic once infused. All dextrose-containing fluids should be avoided in hyperglycaemia.",
note_style
))
story.append(Spacer(1, 12))
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 4 — CLINICAL DECISION GUIDE
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_banner("4. Clinical Decision Guide — Which Fluid to Choose?", colors.HexColor("#1A5276")))
story.append(Spacer(1, 8))
decision_data = [
[Paragraph("Clinical Scenario", cell_hdr),
Paragraph("Preferred Fluid(s)", cell_hdr),
Paragraph("Avoid / Caution", cell_hdr),
Paragraph("Notes", cell_hdr)],
[Paragraph("Hypovolaemia / Volume resuscitation", cell_bold_l),
Paragraph("RL or Plasma-Lyte A", cell_body),
Paragraph("Large-volume NS\n(acidosis risk)", cell_body),
Paragraph("Balanced crystalloids superior to NS in SMART/SALT-ED trials (NNT~90)", cell_left)],
[Paragraph("Burns — Parkland Formula", cell_bold_l),
Paragraph("Ringer's Lactate", cell_body),
Paragraph("Colloids in first 24 h", cell_body),
Paragraph("4 mL/kg/% TBSA over 24 h; half in first 8 h", cell_left)],
[Paragraph("Blood transfusion co-infusion", cell_bold_l),
Paragraph("Normal Saline", cell_body),
Paragraph("RL, D5RL (Ca²⁺ binds citrate)", cell_body),
Paragraph("NS is the only crystalloid compatible for same-line blood administration", cell_left)],
[Paragraph("DKA — Initial (BS >250 mg/dL)", cell_bold_l),
Paragraph("0.9% NaCl or RL", cell_body),
Paragraph("Dextrose-containing\nfluids initially", cell_body),
Paragraph("Switch to DNS or D5+0.45% NaCl when glucose drops below 250 mg/dL", cell_left)],
[Paragraph("DKA — Glucose <250 mg/dL", cell_bold_l),
Paragraph("DNS or\nD5 + 0.45% NaCl", cell_body),
Paragraph("NS alone", cell_body),
Paragraph("Add dextrose to allow continued insulin infusion without hypoglycaemia", cell_left)],
[Paragraph("Hypoglycaemia with dehydration", cell_bold_l),
Paragraph("DNS (D5NS)", cell_body),
Paragraph("NS alone", cell_body),
Paragraph("Provides glucose + sodium; switch to oral feeding as soon as possible", cell_left)],
[Paragraph("Severe symptomatic Hyponatraemia\n(seizures, coma)", cell_bold_l),
Paragraph("3% NaCl (100–150 mL bolus)", cell_body),
Paragraph("Hypotonic fluids", cell_body),
Paragraph("Correct Na by max 1–2 mEq/L/h acutely, then slow to 8–10 mEq/L/24 h", cell_left)],
[Paragraph("Hypernatraemia\n(Na >150 mEq/L)", cell_bold_l),
Paragraph("D5W or 0.45% NaCl", cell_body),
Paragraph("NS, DNS", cell_body),
Paragraph("Correct Na slowly: <10 mEq/L per 24 h to avoid cerebral oedema", cell_left)],
[Paragraph("Raised ICP / Neurosurgery", cell_bold_l),
Paragraph("NS or Plasma-Lyte A", cell_body),
Paragraph("RL (slightly hypotonic),\nD5W", cell_body),
Paragraph("Use iso/hypertonic fluids; hypertonic saline (3%) preferred for ICP crises", cell_left)],
[Paragraph("Liver Failure", cell_bold_l),
Paragraph("Plasma-Lyte A\n(acetate metabolised by muscle)", cell_body),
Paragraph("RL (impaired lactate\nmetabolism)", cell_body),
Paragraph("Avoid large-volume NS (acidosis risk); watch for hyponatraemia", cell_left)],
[Paragraph("Paediatric Maintenance Fluids", cell_bold_l),
Paragraph("D5 + 0.45% NaCl\n+ 20 mEq/L KCl", cell_body),
Paragraph("D5W alone\n(hyponatraemia risk)", cell_body),
Paragraph("Holliday-Segar formula for volume; isotonic solutions now preferred by many guidelines", cell_left)],
[Paragraph("Adrenal Crisis\n/ Addison's Disease", cell_bold_l),
Paragraph("0.9% NS, then switch\nto DNS if hypoglycaemic", cell_body),
Paragraph("Hypotonic fluids", cell_body),
Paragraph("Provide cortisol replacement; DNS used if hypoglycaemia accompanies crisis", cell_left)],
[Paragraph("Myxoedema Coma\n(Hypothyroidism crisis)", cell_bold_l),
Paragraph("DNS (D5NS)", cell_body),
Paragraph("Free water / hypotonic", cell_body),
Paragraph("Glucose support important; hyponatraemia common — avoid worsening with hypotonic fluids", cell_left)],
[Paragraph("Hypochloraemic Alkalosis\n(e.g. prolonged vomiting)", cell_bold_l),
Paragraph("Normal Saline", cell_body),
Paragraph("RL, Plasma-Lyte", cell_body),
Paragraph("High Cl⁻ in NS corrects the alkalosis; add KCl as needed", cell_left)],
]
dec_col_w = [3.8*cm, 3.0*cm, 3.2*cm, 7.6*cm]
dec_bgs = [GREY_LIGHT, LIGHT_BLUE, GREY_LIGHT, PEACH, PEACH, YELLOW, RED_LIGHT,
colors.HexColor("#D5F5E3"), RED_LIGHT, MINT, LAVENDER, PEACH,
YELLOW, GREY_LIGHT]
dec_table = Table(decision_data, colWidths=dec_col_w, repeatRows=1)
dec_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1, 0), colors.HexColor("#1A5276")),
("ROWBACKGROUNDS",(0,1), (-1,-1), dec_bgs),
("GRID", (0,0), (-1,-1), 0.4, GREY_MID),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
]))
story.append(dec_table)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 5 — TONICITY & ACID-BASE EFFECTS
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_banner("5. Tonicity & Acid-Base Effects", colors.HexColor("#117A65")))
story.append(Spacer(1, 8))
ton_rows = [
[Paragraph("Fluid", cell_hdr),
Paragraph("Tonicity\nCategory", cell_hdr),
Paragraph("Effect on Plasma\nOsmolarity", cell_hdr),
Paragraph("Effect on\nCell Volume", cell_hdr),
Paragraph("Acid-Base Effect", cell_hdr),
Paragraph("Strong Ion\nDifference (SID)", cell_hdr)],
[Paragraph("Normal Saline", cell_bold_l),
Paragraph("Isotonic", cell_body),
Paragraph("Slight increase", cell_body),
Paragraph("No change", cell_body),
Paragraph("↓ pH — hyperchloraemic\nmetabolic acidosis\n(large volumes)", cell_body),
Paragraph("0", cell_body)],
[Paragraph("Ringer's Lactate", cell_bold_l),
Paragraph("Slightly\nhypotonic", cell_body),
Paragraph("Slight decrease", cell_body),
Paragraph("Slight swelling", cell_body),
Paragraph("Mildly alkalinising\n(lactate → HCO₃⁻)", cell_body),
Paragraph("~28", cell_body)],
[Paragraph("Plasma-Lyte A", cell_bold_l),
Paragraph("Isotonic", cell_body),
Paragraph("No change", cell_body),
Paragraph("No change", cell_body),
Paragraph("Most alkalinising\n(acetate + gluconate)", cell_body),
Paragraph("~50", cell_body)],
[Paragraph("D5W", cell_bold_l),
Paragraph("Hypotonic\n(after metabolism)", cell_body),
Paragraph("Decrease (free water)", cell_body),
Paragraph("Swelling", cell_body),
Paragraph("Neutral", cell_body),
Paragraph("0", cell_body)],
[Paragraph("DNS (D5NS)", cell_bold_l),
Paragraph("Hypertonic", cell_body),
Paragraph("Increase", cell_body),
Paragraph("Shrinkage initially;\nswelling after\nglucose metabolised", cell_body),
Paragraph("Acidosis risk\n(high Cl⁻, no buffer)", cell_body),
Paragraph("0", cell_body)],
[Paragraph("3% NaCl", cell_bold_l),
Paragraph("Hypertonic", cell_body),
Paragraph("Large increase", cell_body),
Paragraph("Marked shrinkage\n(water leaves cells)", cell_body),
Paragraph("Hyperchloraemic\nacidosis", cell_body),
Paragraph("0", cell_body)],
]
ton_col_w = [3.2*cm, 2.2*cm, 2.8*cm, 3.0*cm, 4.0*cm, 2.4*cm]
ton_bgs = [GREY_LIGHT, LIGHT_BLUE, MINT, YELLOW, PEACH, RED_LIGHT]
ton_table = Table(ton_rows, colWidths=ton_col_w, repeatRows=1)
ton_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1, 0), colors.HexColor("#117A65")),
("ROWBACKGROUNDS",(0,1), (-1,-1), ton_bgs),
("GRID", (0,0), (-1,-1), 0.4, GREY_MID),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
]))
story.append(ton_table)
story.append(Spacer(1, 8))
# SID explanation box
sid_box = Table([[Paragraph(
"<b>Strong Ion Difference (SID) and Acid-Base:</b> "
"SID = [Na⁺ + K⁺ + Ca²⁺ + Mg²⁺] − [Cl⁻]. "
"A fluid SID of ~24 mEq/L is neutral for pH. "
"<b>SID < 24</b> → acidosis (e.g. NS, SID = 0). "
"<b>SID > 24</b> → alkalosis (e.g. Plasma-Lyte, SID ~50). "
"RL has SID ~28 — mildly alkalinising. "
"This Stewart model explains why large-volume NS causes metabolic acidosis even without lactate accumulation.",
body_style
)]], colWidths=[doc.width])
sid_box.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#EBF5FB")),
("BOX", (0,0), (-1,-1), 0.8, TEAL),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1),6),
("LEFTPADDING",(0,0), (-1,-1), 10),
]))
story.append(sid_box)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 6 — KEY CLINICAL PEARLS
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_banner("6. Key Clinical Pearls & Warnings", colors.HexColor("#922B21")))
story.append(Spacer(1, 8))
pearls = [
("🔴 RL + Blood Products", "NEVER run Ringer's Lactate in the same line as blood. Ca²⁺ (2.7–3 mEq/L) chelates citrate anticoagulant in stored blood, risking clot formation. Use Normal Saline for blood transfusion lines."),
("🔴 3% NaCl — Rate Control", "Correct Na⁺ at NO more than 8–10 mEq/L per 24 hours. Rapid correction of chronic hyponatraemia causes osmotic demyelination syndrome (central pontine myelinolysis) — irreversible neurological damage."),
("🔴 D5W in Hyponatraemia", "Do NOT use D5W in hyponatraemia. Once glucose is metabolised, it delivers free water, which worsens hyponatraemia."),
("🟡 RL in Liver Failure", "Lactate in RL requires hepatic metabolism to bicarbonate. In severe liver failure (cirrhosis, acute liver failure), lactate accumulates. Prefer Plasma-Lyte A (acetate metabolised in muscle/heart)."),
("🟡 NS in Large Volumes", "Normal saline given in volumes >2–3 L commonly causes hyperchloraemic metabolic acidosis. Balanced crystalloids (RL, Plasma-Lyte) are preferred for large-volume resuscitation per SMART and SALT-ED trials."),
("🟡 RL in Head Injury / Raised ICP", "RL is slightly hypotonic (273 mOsm/L vs plasma ~290). Large volumes can lower plasma osmolarity and worsen cerebral oedema. Use isotonic NS or Plasma-Lyte; use 3% NaCl for acute ICP crises."),
("🟢 Plasma-Lyte Advantage", "Plasma-Lyte A is the most physiologically balanced crystalloid (pH 7.4, SID ~50, iso-osmolar). It does not raise lactate (unlike RL) and does not cause acidosis (unlike NS). Ideal for large-volume ICU resuscitation."),
("🟢 DKA Fluid Protocol", "Phase 1 (glucose >250): 0.9% NS or RL for volume. Phase 2 (glucose <250): switch to DNS (D5+0.9% NaCl) or D5+0.45% NaCl to allow ongoing insulin infusion without hypoglycaemia."),
("🟢 Paediatric Maintenance", "Standard paediatric maintenance: D5 + 0.45% NaCl + 20 mEq/L KCl. Use Holliday-Segar formula (4 mL/kg/h for first 10 kg, 2 mL/kg/h for next 10 kg, 1 mL/kg/h thereafter). Many guidelines now favour isotonic solutions to prevent hyponatraemia."),
("🟢 Caloric Content of Dextrose Fluids", "5% dextrose provides ~170 kcal/L (dextrose = 3.4 kcal/g × 50 g/L). Adequate for short-term maintenance to prevent starvation ketosis, but insufficient for full nutritional support (use TPN/enteral feeds for prolonged NPO)."),
]
pearl_data = [[Paragraph(title, bold_style), Paragraph(text, body_style)] for title, text in pearls]
pearl_bgs = [RED_LIGHT, RED_LIGHT, RED_LIGHT, YELLOW, YELLOW, YELLOW, MINT, MINT, MINT, LIGHT_BLUE]
pearl_table = Table(pearl_data, colWidths=[4.5*cm, doc.width - 4.5*cm])
pearl_table.setStyle(TableStyle([
("ROWBACKGROUNDS",(0,0), (-1,-1), pearl_bgs),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
]))
story.append(pearl_table)
story.append(Spacer(1, 10))
# ── Footer note ───────────────────────────────────────────────────────────────
footer = Table([[Paragraph(
"Sources: Tintinalli's Emergency Medicine (Table 13-3, 12-6) · Sabiston Textbook of Surgery (Table 33.12) · "
"Rosen's Emergency Medicine (Table 113.1) · Harrison's Principles of Internal Medicine 22e · "
"Yamada's Textbook of Gastroenterology · Fischer's Mastery of Surgery (Table 3.2) · "
"Basic Medical Biochemistry Lippincott 6e · Morgan & Mikhail Clinical Anesthesiology | "
"For educational use only — verify doses and indications against current institutional guidelines.",
note_style
)]], colWidths=[doc.width])
footer.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("TEXTCOLOR", (0,0), (-1,-1), colors.HexColor("#AEB6BF")),
]))
story.append(footer)
# ── Build PDF ─────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /home/daytona/workspace/iv-fluids-pdf && python3 generate_iv_fluids_pdf.py 2>…
ls -lh /home/daytona/workspace/iv-fluids-pdf/IV_Fluids_Quick_Reference.pdf
IV Fluids Quick Reference
PDF Document · PDF