Create a 3 days study plan for me everyday has 3 study slots Morning afternoon and evening. My first annual exam which is held on 3/06/2026 so I want that give more time and revision session to those chapters which are imp. Organic Chemistry (Book) Here a chapter of organic chemistry Basic Chemistry (imp) Stereochemistry (imp) General preparation (Alkane,Alkene, Alkyne) (Past papers) Nucleophilic & electrophilic (Past papers) Orientation benzene Heterocyclic (imp) Reaction Mechanism (Most imp & Difficult) Intermediate & Free Radicals and Carbonium rearrangements & Carbanions rearrangements (most most imp). At the end create a image

Generating Image

A clean, colorful 3-day organic chemistry study plan poster for a student. The poster has a dark navy blue background with bright, readable text. Title at top: "Organic Chemistry β€” 3 Day Study Plan" with exam date "Exam: June 3, 2026" below it. Three columns for Day 1 (Saturday May 30), Day 2 (Sunday May 31), Day 3 (Monday June 1). Each column has 3 rows: Morning (sunrise icon, orange), Afternoon (sun icon, yellow), Evening (moon icon, purple). Day 1 Morning: Reaction Mechanism (Most Imp). Day 1 Afternoon: Basic Chemistry (Imp). Day 1 Evening: Stereochemistry (Imp). Day 2 Morning: Intermediates, Free Radicals & Rearrangements (Most Most Imp - highlighted in red). Day 2 Afternoon: Nucleophilic & Electrophilic (Past Papers). Day 2 Evening: Alkane, Alkene, Alkyne (Past Papers). Day 3 Morning: Orientation of Benzene. Day 3 Afternoon: Heterocyclic Chemistry (Imp). Day 3 Evening: FULL REVISION SESSION (star icon, gold). At the bottom a priority legend with colored dots: red = Most Most Imp, orange = Most Imp, yellow = Imp, green = Past Papers. Modern flat design, chemistry molecule graphics in corners.

Here's your visual study plan poster:
3-Day Organic Chemistry Study Plan

Key Tips for These 3 Days:

  1. Reaction Mechanism + Rearrangements = 40% of your effort. These are the hardest and most important - never skip writing them out by hand.
  2. Past paper chapters (Nucleophilic/Electrophilic, Alkane/Alkene/Alkyne) - don't just read, solve the actual past paper questions.
  3. Stereochemistry - common mistake area. Practice R/S assignments until they're automatic.
  4. Day 3 Full Revision is as important as Day 1 and 2 combined - don't exhaust yourself before it.
  5. Sleep at least 7 hours each night. Memory consolidation happens during sleep, especially for mechanism-heavy material.
Good luck on June 3! You've got this. πŸ’ͺ

Create a detailed quick-reference PDF for organic chemistry reactions and mechanisms

Reading File
Reading File
Running Command

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

Writing File

~/orgo-pdf/build_orgo_ref.py

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

OUTPUT = "/home/daytona/workspace/orgo-pdf/Organic_Chemistry_Quick_Reference.pdf"

# ── Color palette ──────────────────────────────────────────────────────────────
NAVY      = colors.HexColor("#0D1B2A")
TEAL      = colors.HexColor("#1B998B")
ORANGE    = colors.HexColor("#E84855")
GOLD      = colors.HexColor("#F7B731")
LAVENDER  = colors.HexColor("#7B68EE")
LT_GRAY   = colors.HexColor("#F4F6F9")
MID_GRAY  = colors.HexColor("#DDE3EC")
DARK_TEXT = colors.HexColor("#1A1A2E")
WHITE     = colors.white
GREEN     = colors.HexColor("#2ECC71")
PURPLE    = colors.HexColor("#9B59B6")
BLUE      = colors.HexColor("#3498DB")

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

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

COVER_TITLE = S("CoverTitle", fontSize=32, textColor=WHITE,
                fontName="Helvetica-Bold", alignment=TA_CENTER, spaceAfter=6)
COVER_SUB   = S("CoverSub",   fontSize=14, textColor=GOLD,
                fontName="Helvetica-BoldOblique", alignment=TA_CENTER, spaceAfter=4)
COVER_INFO  = S("CoverInfo",  fontSize=11, textColor=MID_GRAY,
                fontName="Helvetica", alignment=TA_CENTER)

H1 = S("H1", fontSize=18, textColor=WHITE, fontName="Helvetica-Bold",
        alignment=TA_CENTER, spaceAfter=4, spaceBefore=2)
H2 = S("H2", fontSize=13, textColor=NAVY, fontName="Helvetica-Bold",
        spaceAfter=3, spaceBefore=8)
H3 = S("H3", fontSize=11, textColor=TEAL, fontName="Helvetica-Bold",
        spaceAfter=2, spaceBefore=5)
BODY = S("BODY", fontSize=9.5, textColor=DARK_TEXT, fontName="Helvetica",
         leading=14, spaceAfter=3, alignment=TA_JUSTIFY)
BULLET = S("BULLET", fontSize=9, textColor=DARK_TEXT, fontName="Helvetica",
           leading=13, leftIndent=12, spaceAfter=2)
CODE  = S("CODE", fontSize=8.5, textColor=NAVY, fontName="Courier",
          leading=13, backColor=LT_GRAY, leftIndent=10, rightIndent=10,
          spaceAfter=2, spaceBefore=2)
NOTE  = S("NOTE", fontSize=8.5, textColor=colors.HexColor("#555555"),
          fontName="Helvetica-Oblique", leading=12, leftIndent=8, spaceAfter=3)
TAG_RED    = S("TagR", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold",
               backColor=ORANGE, alignment=TA_CENTER)
TAG_GREEN  = S("TagG", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold",
               backColor=GREEN,  alignment=TA_CENTER)
TAG_BLUE   = S("TagB", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold",
               backColor=BLUE,   alignment=TA_CENTER)
TAG_PURPLE = S("TagP", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold",
               backColor=PURPLE, alignment=TA_CENTER)
FOOTER_ST  = S("Footer", fontSize=7.5, textColor=colors.grey,
               fontName="Helvetica", alignment=TA_CENTER)

# ── Helper builders ─────────────────────────────────────────────────────────────
def section_banner(text, color=TEAL):
    data = [[Paragraph(text, H1)]]
    tbl = Table(data, colWidths=[170*mm])
    tbl.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), color),
        ("ROUNDEDCORNERS", [6]),
        ("TOPPADDING",    (0,0), (-1,-1), 7),
        ("BOTTOMPADDING", (0,0), (-1,-1), 7),
        ("LEFTPADDING",   (0,0), (-1,-1), 10),
    ]))
    return tbl

def info_box(rows, header=None, header_color=TEAL, col_widths=None):
    """rows = list of (label, value) or single-col strings."""
    if col_widths is None:
        col_widths = [55*mm, 115*mm]
    table_data = []
    if header:
        table_data.append([Paragraph(header, S("th", fontSize=9, textColor=WHITE,
                           fontName="Helvetica-Bold", alignment=TA_LEFT))])
    for r in rows:
        if isinstance(r, (list, tuple)):
            table_data.append([Paragraph(str(c), BULLET) for c in r])
        else:
            table_data.append([Paragraph(str(r), BULLET), ""])
    
    ncols = max(len(r) if isinstance(r,(list,tuple)) else 1 for r in rows)
    if header:
        cw = [sum(col_widths)]
    else:
        cw = col_widths[:ncols]

    tbl = Table(table_data, colWidths=cw if header else cw, repeatRows=0)
    style = [
        ("BACKGROUND", (0,0), (-1,0), header_color if header else LT_GRAY),
        ("BACKGROUND", (0,1 if header else 0), (-1,-1), LT_GRAY),
        ("ROWBACKGROUNDS", (0, 1 if header else 0), (-1,-1), [WHITE, LT_GRAY]),
        ("GRID", (0,0), (-1,-1), 0.4, MID_GRAY),
        ("TOPPADDING",    (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING",   (0,0), (-1,-1), 6),
        ("VALIGN", (0,0), (-1,-1), "TOP"),
    ]
    if header:
        style.append(("SPAN", (0,0), (-1,0)))
    tbl.setStyle(TableStyle(style))
    return tbl

def two_col_table(rows, col_widths=None, header_color=NAVY):
    if col_widths is None:
        col_widths = [60*mm, 110*mm]
    styled = []
    for i, row in enumerate(rows):
        if i == 0:
            styled.append([Paragraph(str(c), S("th2", fontSize=9, textColor=WHITE,
                           fontName="Helvetica-Bold")) for c in row])
        else:
            styled.append([Paragraph(str(c), BULLET) for c in row])
    tbl = Table(styled, colWidths=col_widths)
    tbl.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,0), header_color),
        ("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LT_GRAY]),
        ("GRID", (0,0), (-1,-1), 0.4, MID_GRAY),
        ("TOPPADDING",    (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING",   (0,0), (-1,-1), 6),
        ("VALIGN", (0,0), (-1,-1), "TOP"),
    ]))
    return tbl

def hr(color=MID_GRAY, thickness=0.8):
    return HRFlowable(width="100%", thickness=thickness, color=color, spaceAfter=4, spaceBefore=4)

def sp(h=4):
    return Spacer(1, h)

def p(text, style=BODY):
    return Paragraph(text, style)

def b(text):
    return Paragraph("β€’ " + text, BULLET)

# ── Header / Footer ─────────────────────────────────────────────────────────────
def on_page(canvas, doc):
    canvas.saveState()
    w, h = A4
    # top stripe
    canvas.setFillColor(NAVY)
    canvas.rect(0, h-18, w, 18, fill=1, stroke=0)
    canvas.setFont("Helvetica-Bold", 8)
    canvas.setFillColor(GOLD)
    canvas.drawString(15, h-12, "Organic Chemistry β€” Quick Reference")
    canvas.setFillColor(MID_GRAY)
    canvas.setFont("Helvetica", 7.5)
    canvas.drawRightString(w-15, h-12, f"Page {doc.page}")
    # bottom stripe
    canvas.setFillColor(NAVY)
    canvas.rect(0, 0, w, 14, fill=1, stroke=0)
    canvas.setFont("Helvetica-Oblique", 7)
    canvas.setFillColor(MID_GRAY)
    canvas.drawCentredString(w/2, 4, "Exam: 3 June 2026  |  For revision use only")
    canvas.restoreState()

def on_first_page(canvas, doc):
    canvas.saveState()
    w, h = A4
    # Full navy background
    canvas.setFillColor(NAVY)
    canvas.rect(0, 0, w, h, fill=1, stroke=0)
    # Teal top accent bar
    canvas.setFillColor(TEAL)
    canvas.rect(0, h-8, w, 8, fill=1, stroke=0)
    # Orange bottom accent bar
    canvas.setFillColor(ORANGE)
    canvas.rect(0, 0, w, 8, fill=1, stroke=0)
    canvas.restoreState()

# ── Build story ──────────────────────────────────────────────────────────────────
story = []

# ═══════════════════════════════════════════════════════════════════════
# COVER PAGE
# ═══════════════════════════════════════════════════════════════════════
story.append(sp(60))
story.append(p("ORGANIC CHEMISTRY", COVER_TITLE))
story.append(sp(4))
story.append(p("Quick Reference Guide", COVER_SUB))
story.append(sp(6))
story.append(p("Reactions Β· Mechanisms Β· Intermediates Β· Stereochemistry", COVER_INFO))
story.append(sp(8))
story.append(HRFlowable(width="60%", thickness=1.5, color=TEAL, spaceAfter=10, spaceBefore=4))

cover_tags = [
    ["Reaction Mechanisms", "Intermediates & Radicals", "Stereochemistry"],
    ["Nucleophilic / Electrophilic", "Alkanes Β· Alkenes Β· Alkynes", "Aromatic Reactions"],
    ["Heterocyclic Chemistry", "Rearrangements", "Basic Chemistry"],
]
for row in cover_tags:
    story.append(sp(4))
    story.append(p("   ".join(f"[ {t} ]" for t in row),
                   S("ctag", fontSize=8.5, textColor=GOLD, fontName="Helvetica",
                     alignment=TA_CENTER, leading=14)))

story.append(sp(50))
story.append(p("Annual Exam Reference  |  June 2026", COVER_INFO))
story.append(PageBreak())


# ═══════════════════════════════════════════════════════════════════════
# TABLE OF CONTENTS
# ═══════════════════════════════════════════════════════════════════════
story.append(sp(10))
story.append(section_banner("TABLE OF CONTENTS", NAVY))
story.append(sp(8))
toc_items = [
    ("1", "Basic Chemistry Concepts",              "3"),
    ("2", "Stereochemistry",                       "4"),
    ("3", "Reaction Mechanisms (SN1, SN2, E1, E2)","5"),
    ("4", "Intermediates β€” Carbocations & Carbanions","6"),
    ("5", "Free Radicals",                         "7"),
    ("6", "Carbonium & Carbanion Rearrangements",  "8"),
    ("7", "Alkanes β€” Preparation & Reactions",     "9"),
    ("8", "Alkenes β€” Preparation & Reactions",     "10"),
    ("9", "Alkynes β€” Preparation & Reactions",     "11"),
    ("10","Nucleophilic & Electrophilic Reactions", "12"),
    ("11","Orientation of Benzene Ring",            "13"),
    ("12","Heterocyclic Compounds",                 "14"),
    ("13","Key Reagents at a Glance",               "15"),
]
toc_data = [["#", "Section", "Page"]]
for no, title, pg in toc_items:
    toc_data.append([no, title, pg])
toc_table = Table(toc_data, colWidths=[12*mm, 138*mm, 20*mm])
toc_table.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), TEAL),
    ("TEXTCOLOR",  (0,0), (-1,0), WHITE),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9.5),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LT_GRAY]),
    ("GRID", (0,0), (-1,-1), 0.4, MID_GRAY),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING",   (0,0), (-1,-1), 8),
    ("ALIGN", (2,0), (2,-1), "CENTER"),
    ("ALIGN", (0,0), (0,-1), "CENTER"),
]))
story.append(toc_table)
story.append(PageBreak())


# ═══════════════════════════════════════════════════════════════════════
# 1. BASIC CHEMISTRY CONCEPTS
# ═══════════════════════════════════════════════════════════════════════
story.append(section_banner("1.  BASIC CHEMISTRY CONCEPTS  [IMP]", TEAL))
story.append(sp(6))

story.append(p("1.1  Hybridization", H2))
hyb_data = [
    ["Type", "Bond Angle", "Geometry", "Example"],
    ["sp",   "180Β°",       "Linear",   "Acetylene (C2H2)"],
    ["sp2",  "120Β°",       "Trigonal Planar", "Ethylene (C2H4), Benzene"],
    ["sp3",  "109.5Β°",     "Tetrahedral",    "Methane (CH4), Ethane"],
]
story.append(two_col_table(hyb_data, col_widths=[30*mm, 30*mm, 50*mm, 60*mm]))
story.append(sp(6))

story.append(p("1.2  Electronic Effects", H2))
effects = [
    ["Effect", "Description", "Example"],
    ["Inductive (+I)", "Electron-donating alkyl groups push electrons toward chain", "-CH3, -C2H5"],
    ["Inductive (-I)", "Electron-withdrawing groups pull electrons", "-NO2, -CN, -COOH, halogens"],
    ["Mesomeric (+M)", "Electron donation by conjugation / resonance", "-OH, -NH2, -OR"],
    ["Mesomeric (-M)", "Electron withdrawal by conjugation", "-CHO, -COR, -COOH, -NO2"],
    ["Hyperconjugation", "Delocalization of C-H sigma electrons into adjacent pi/empty orbital", "Stabilizes carbocations & radicals"],
]
story.append(two_col_table(effects, col_widths=[42*mm, 80*mm, 48*mm]))
story.append(sp(6))

story.append(p("1.3  Acidity & Basicity", H2))
story.append(b("<b>pKa order (acids):</b>  HI > HBr > HCl > RCOOH > H2CO3 > ArOH > ROH > H2O > RNH2 > RH"))
story.append(b("<b>Base strength:</b>  RO<super>-</super> > HO<super>-</super> > RNH2 > ArNH2 > RCOO<super>-</super>"))
story.append(b("<b>Resonance stabilization</b> of conjugate base increases acidity (e.g., phenol > cyclohexanol)"))
story.append(sp(6))

story.append(p("1.4  Types of Bond Fission", H2))
fission = [
    ["Type", "Description", "Produces"],
    ["Homolytic", "Each atom takes one electron from the shared pair", "Free radicals (neutral, odd-electron)"],
    ["Heterolytic", "One atom takes both electrons from shared pair", "Ions (carbocations or carbanions)"],
]
story.append(two_col_table(fission, col_widths=[35*mm, 85*mm, 50*mm]))
story.append(PageBreak())


# ═══════════════════════════════════════════════════════════════════════
# 2. STEREOCHEMISTRY
# ═══════════════════════════════════════════════════════════════════════
story.append(section_banner("2.  STEREOCHEMISTRY  [IMP]", LAVENDER))
story.append(sp(6))

story.append(p("2.1  Key Definitions", H2))
stereo_defs = [
    ["Term", "Definition"],
    ["Chirality", "Non-superimposable on its mirror image; possesses a chiral centre (sp3 C with 4 different groups)"],
    ["Enantiomers", "Non-superimposable mirror images; same connectivity, opposite configurations; identical physical properties except optical rotation"],
    ["Diastereomers", "Stereoisomers that are NOT mirror images; different physical properties; includes cis/trans isomers"],
    ["Meso compound", "Has chiral centres but is achiral overall due to internal plane of symmetry; optically inactive"],
    ["Racemic mixture", "50:50 mixture of two enantiomers; optically inactive (rotations cancel)"],
    ["Epimers", "Diastereomers differing in configuration at exactly ONE chiral centre"],
]
story.append(two_col_table(stereo_defs, col_widths=[40*mm, 130*mm]))
story.append(sp(6))

story.append(p("2.2  R/S Configuration (CIP Rules)", H2))
story.append(b("Step 1: Assign priorities 1–4 based on atomic number (highest = 1)"))
story.append(b("Step 2: If two atoms are same, go to next atom in chain"))
story.append(b("Step 3: Multiple bonds treated as duplicate atoms"))
story.append(b("Step 4: Orient so lowest priority (#4) points AWAY from you"))
story.append(b("Step 5: Trace 1β†’2β†’3: Clockwise = R (Rectus) | Anti-clockwise = S (Sinister)"))
story.append(b("<b>Tip:</b> If lowest priority is TOWARDS you, reverse the assignment"))
story.append(sp(6))

story.append(p("2.3  Fischer Projections", H2))
story.append(b("Horizontal bonds come TOWARDS the viewer"))
story.append(b("Vertical bonds go AWAY from the viewer"))
story.append(b("To assign R/S from Fischer: if lowest priority is on horizontal β€” reverse the final answer"))
story.append(sp(6))

story.append(p("2.4  E/Z (Geometric) Isomerism", H2))
story.append(b("Requires restricted rotation (C=C or ring) AND two different groups on each carbon"))
story.append(b("E (Entgegen): higher priority groups on OPPOSITE sides"))
story.append(b("Z (Zusammen): higher priority groups on SAME side"))
story.append(b("cis/trans: only valid when one group is H on each carbon; cis = same side, trans = opposite"))
story.append(PageBreak())


# ═══════════════════════════════════════════════════════════════════════
# 3. REACTION MECHANISMS
# ═══════════════════════════════════════════════════════════════════════
story.append(section_banner("3.  REACTION MECHANISMS  [MOST IMP & DIFFICULT]", ORANGE))
story.append(sp(6))

story.append(p("3.1  SN1 vs SN2 Comparison", H2))
sn_data = [
    ["Feature",        "SN1",                               "SN2"],
    ["Steps",          "2 (ionization, then attack)",        "1 (concerted)"],
    ["Rate law",       "Rate = k[RX]",                       "Rate = k[RX][Nu]"],
    ["Best substrate", "3Β° > 2Β° >> 1Β° (tertiary favoured)", "1Β° >> 2Β° (primary favoured; 3Β° blocked)"],
    ["Intermediate",   "Carbocation formed",                 "No intermediate (transition state only)"],
    ["Stereochemistry","Racemization (mixture of products)",  "Inversion of configuration (Walden inversion)"],
    ["Solvent",        "Polar protic (H2O, ROH) stabilize ions","Polar aprotic (DMSO, acetone) best"],
    ["Nucleophile",    "Weak Nu acceptable",                  "Strong, unhindered Nu required"],
    ["Leaving group",  "Good LG needed (I>Br>Cl>F)",         "Good LG needed (same order)"],
    ["Carbocation?",   "YES β€” rearrangements possible",       "NO β€” no rearrangements"],
]
story.append(two_col_table(sn_data, col_widths=[42*mm, 64*mm, 64*mm]))
story.append(sp(6))

story.append(p("3.2  E1 vs E2 Elimination", H2))
e_data = [
    ["Feature",        "E1",                                  "E2"],
    ["Steps",          "2 (carbocation first)",               "1 (concerted)"],
    ["Rate law",       "Rate = k[RX]",                        "Rate = k[RX][Base]"],
    ["Base required",  "Weak base acceptable",                "Strong bulky base (t-BuOK, NaOEt)"],
    ["Substrate",      "3Β° > 2Β°",                             "3Β° > 2Β° > 1Β°"],
    ["Stereochemistry","No specific requirement",              "Anti-periplanar geometry required (anti elimination)"],
    ["Regioselectivity","Zaitsev (more substituted alkene)",  "Zaitsev normally; Hofmann with bulky base"],
    ["Rearrangements", "Possible (via carbocation)",          "Not possible"],
]
story.append(two_col_table(e_data, col_widths=[42*mm, 64*mm, 64*mm]))
story.append(sp(6))

story.append(p("3.3  Competition: SN vs E", H2))
story.append(b("3Β° substrate + strong base/high temp β†’ favours E2"))
story.append(b("3Β° substrate + weak Nu/polar protic β†’ SN1 / E1 mixture"))
story.append(b("1Β° substrate + strong Nu β†’ SN2"))
story.append(b("Temperature increase β†’ favours elimination over substitution"))
story.append(sp(6))

story.append(p("3.4  Electrophilic Addition (to Alkenes)", H2))
ea_data = [
    ["Reaction", "Reagent", "Product / Rule"],
    ["Addition of HX", "HX (HBr, HCl)", "Markovnikov: H adds to C with MORE H (carbocation on more-substituted C)"],
    ["Anti-Markovnikov", "HBr + peroxides (ROOR)", "Radical mechanism β€” H adds to less-substituted C (anti-Markovnikov)"],
    ["Halogenation", "X2 (Br2, Cl2)", "Anti addition β€” trans dihalide product (via halonium ion)"],
    ["Hydration", "H2O / H+", "Markovnikov β€” alcohol on more-substituted C"],
    ["Oxymercuration", "Hg(OAc)2/H2O then NaBH4", "Markovnikov alcohol, no rearrangement"],
    ["Hydroboration", "BH3/THF then H2O2/OH-", "Anti-Markovnikov, syn addition β€” alcohol on less-substituted C"],
    ["Epoxidation", "mCPBA (peracid)", "Syn addition β€” epoxide"],
    ["Ozonolysis", "O3 then Zn/H2O (reductive)", "Cleaves C=C β†’ two carbonyl compounds"],
]
story.append(two_col_table(ea_data, col_widths=[38*mm, 45*mm, 87*mm]))
story.append(PageBreak())


# ═══════════════════════════════════════════════════════════════════════
# 4. INTERMEDIATES β€” CARBOCATIONS & CARBANIONS
# ═══════════════════════════════════════════════════════════════════════
story.append(section_banner("4.  INTERMEDIATES β€” CARBOCATIONS & CARBANIONS  [MOST MOST IMP]", ORANGE))
story.append(sp(6))

story.append(p("4.1  Carbocations (Carbonium Ions)", H2))
story.append(b("Structure: Carbon with only 6 electrons (positively charged, sp2 hybridized, planar)"))
story.append(b("<b>Stability order:</b> 3Β° > 2Β° > 1Β° > methyl (due to +I effect and hyperconjugation)"))
story.append(b("Allylic/benzylic carbocations β€” extra stability via resonance delocalization"))
story.append(b("<b>Generation:</b> Ionization of RX in SN1/E1, protonation of alkenes, Lewis acid catalysis"))
story.append(b("<b>Fate:</b> Attack by nucleophile (SN1) | Proton loss (E1) | Rearrangement (1,2-shift)"))
story.append(sp(4))

carbo_stab = [
    ["Type",              "Stability", "Reason"],
    ["Methyl (CH3+)",     "Weakest",   "No hyperconjugation, no +I"],
    ["1Β° carbocation",    "Low",       "1 alkyl group (hyperconjugation, 2 H)"],
    ["2Β° carbocation",    "Moderate",  "2 alkyl groups (better +I, hyperconjugation)"],
    ["3Β° carbocation",    "High",      "3 alkyl groups, maximum hyperconjugation"],
    ["Allylic/Benzylic",  "Very High", "Resonance delocalization over pi system"],
]
story.append(two_col_table(carbo_stab, col_widths=[42*mm, 28*mm, 100*mm]))
story.append(sp(6))

story.append(p("4.2  Carbanions", H2))
story.append(b("Structure: Carbon with 8 electrons (negatively charged, sp3 hybridized, pyramidal)"))
story.append(b("<b>Stability order:</b> methyl > 1Β° > 2Β° > 3Β° (OPPOSITE to carbocations β€” -I effect destabilizes)"))
story.append(b("Stabilized by: electron-withdrawing groups (EWG), resonance (allylic/benzylic), sp hybridization"))
story.append(b("<b>Hybridization effect:</b> sp carbanion (RC≑C<super>-</super>) > sp2 > sp3 (more s-character = more stable)"))
story.append(b("<b>Generation:</b> Strong base removes proton; metalation reactions (RLi, RMgX)"))
story.append(b("<b>Use:</b> Organolithium/Grignard reagents as nucleophiles in synthesis"))
story.append(sp(6))

story.append(p("4.3  Comparison: Carbocation vs Carbanion", H2))
comp_data = [
    ["Property",        "Carbocation",         "Carbanion"],
    ["Charge",          "Positive (+)",         "Negative (-)"],
    ["Electrons on C",  "6 (electron-deficient)","8 (electron-rich)"],
    ["Hybridization",   "sp2 (planar)",          "sp3 (pyramidal)"],
    ["Stability order", "3Β° > 2Β° > 1Β°",         "1Β° > 2Β° > 3Β° (or sp > sp2 > sp3)"],
    ["Stabilized by",   "EDG, hyperconjugation, resonance","EWG, resonance, higher s-character"],
    ["Acts as",         "Electrophile",          "Nucleophile / Base"],
    ["Generated in",    "SN1, E1, addition of H+","Deprotonation, organometallics"],
]
story.append(two_col_table(comp_data, col_widths=[42*mm, 64*mm, 64*mm]))
story.append(PageBreak())


# ═══════════════════════════════════════════════════════════════════════
# 5. FREE RADICALS
# ═══════════════════════════════════════════════════════════════════════
story.append(section_banner("5.  FREE RADICALS  [MOST MOST IMP]", ORANGE))
story.append(sp(6))

story.append(p("5.1  Nature of Free Radicals", H2))
story.append(b("Free radical: species with one unpaired electron; neutral; highly reactive"))
story.append(b("Formed by <b>homolytic fission</b> of a bond (heat or UV light)"))
story.append(b("<b>Stability order:</b> 3Β° > 2Β° > 1Β° > methyl radical (same as carbocations β€” hyperconjugation + +I)"))
story.append(b("Allylic / benzylic radicals stabilized by resonance (very stable)"))
story.append(b("Geometry: sp2 or sp3 (rapidly interconverts β€” racemization in radical reactions)"))
story.append(sp(6))

story.append(p("5.2  Free Radical Chain Mechanism β€” Halogenation of Alkanes", H2))
rad_steps = [
    ["Step", "Reaction", "Notes"],
    ["Initiation", "X2  β†’  2Xβ€’  (heat/hv)", "Homolysis of X-X bond; requires energy input"],
    ["Propagation 1", "Xβ€’  +  R-H  β†’  HX  +  Rβ€’", "H abstraction β€” rate-determining step for selectivity"],
    ["Propagation 2", "Rβ€’  +  X2  β†’  R-X  +  Xβ€’", "Radical regenerated β€” chain carries on"],
    ["Termination", "Rβ€’+Rβ€’, Rβ€’+Xβ€’, Xβ€’+Xβ€’ β†’ product", "Chain stopped; no radical regenerated"],
]
story.append(two_col_table(rad_steps, col_widths=[38*mm, 70*mm, 62*mm]))
story.append(sp(5))

story.append(p("5.3  Selectivity of Halogenation", H2))
story.append(b("<b>Cl2</b> less selective β€” reacts with any C-H (less discriminating, faster)"))
story.append(b("<b>Br2</b> more selective β€” preferentially attacks more stable (3Β°) C-H bonds"))
story.append(b("Reactivity of C-H bonds: 3Β° > 2Β° > 1Β° (more stable radical formed)"))
story.append(b("Relative rates with Br2: 3Β°:2Β°:1Β° β‰ˆ 1640 : 82 : 1"))
story.append(PageBreak())


# ═══════════════════════════════════════════════════════════════════════
# 6. REARRANGEMENTS
# ═══════════════════════════════════════════════════════════════════════
story.append(section_banner("6.  CARBONIUM & CARBANION REARRANGEMENTS  [MOST MOST IMP]", ORANGE))
story.append(sp(6))

story.append(p("6.1  Carbonium Ion (Carbocation) Rearrangements β€” 1,2-Shifts", H2))
story.append(b("Occur when a less-stable carbocation can rearrange to a more-stable one"))
story.append(b("Migrating groups: H (hydride shift) or alkyl/aryl group (methyl or aryl shift)"))
story.append(b("Migration involves the bonding pair of electrons moving WITH the group"))
story.append(sp(4))

rearr_data = [
    ["Rearrangement",      "What Migrates",       "Result"],
    ["1,2-Hydride shift",  "H atom (with e- pair)","2Β° β†’ 3Β° carbocation (or 1Β° β†’ 2Β°)"],
    ["1,2-Methyl (alkyl) shift","Alkyl group",      "Same β€” less stable β†’ more stable cation"],
    ["1,2-Aryl shift",     "Aryl group",            "Less stable β†’ more stable cation; aryl is better migrator than alkyl"],
    ["Wagner-Meerwein",    "C-C bond in ring",      "Ring expansion or contraction to give more stable ion"],
    ["Pinacol rearrangement","Alkyl/H from adjacent OH-bearing C","Diol β†’ carbonyl compound via 1,2-shift after protonation"],
]
story.append(two_col_table(rearr_data, col_widths=[45*mm, 45*mm, 80*mm]))
story.append(sp(5))

story.append(p("6.2  Migrating Aptitude", H2))
story.append(b("<b>Migratory aptitude (aryl > alkyl > H):</b> p-anisyl > p-tolyl > phenyl > p-Cl-phenyl > cyclopropyl > methyl > ethyl > H"))
story.append(b("Note: in some systems H migrates preferentially if it leads to greater stabilization"))
story.append(sp(5))

story.append(p("6.3  Carbanion Rearrangements", H2))
story.append(b("Less common than carbocation rearrangements (carbanions do NOT rearrange as readily)"))
story.append(b("<b>1,2-Shifts in carbanions:</b> only if migration gives a more stable carbanion β€” rare"))
story.append(b("<b>Stevens rearrangement:</b> [1,2]-shift in quaternary ammonium ylides β€” carbanion attacks adjacent C bearing a leaving group"))
story.append(b("<b>Sommelet-Hauser:</b> [2,3]-sigmatropic rearrangement of ammonium ylides bearing a benzylic group"))
story.append(b("<b>Favorskii rearrangement:</b> alpha-haloketone + base β†’ cyclopropanone intermediate β†’ ring opens to ester/acid (involves carbanion/enolate)"))
story.append(sp(5))

story.append(p("6.4  How to Identify a Rearrangement in an Exam Question", H2))
story.append(b("Product has a different carbon skeleton than the starting material"))
story.append(b("A 3Β° product forms from what should give a 2Β° product by direct pathway"))
story.append(b("Look for neopentyl, isobutyl, or beta-substituted systems β€” these are classic rearrangement substrates"))
story.append(b("Ring expansion (5 β†’ 6 membered) or ring contraction (6 β†’ 5) is a giveaway"))
story.append(PageBreak())


# ═══════════════════════════════════════════════════════════════════════
# 7. ALKANES
# ═══════════════════════════════════════════════════════════════════════
story.append(section_banner("7.  ALKANES β€” PREPARATION & REACTIONS  [PAST PAPERS]", BLUE))
story.append(sp(6))

story.append(p("7.1  Preparation of Alkanes", H2))
alk_prep = [
    ["Method",                  "Reagents / Conditions",               "Notes"],
    ["Wurtz reaction",          "2 RX + 2Na β†’ R-R + 2NaX",            "Best for symmetric alkanes; works only with primary RX"],
    ["Kolbe electrolysis",      "RCOONa β†’ R-R (electrolysis)",         "Decarboxylation at anode; gives symmetric alkane"],
    ["Corey-House synthesis",   "R-Li + CuI β†’ R2CuLi; then R2CuLi + R'X β†’ R-R'","For unsymmetrical alkanes"],
    ["Grignard + H2O",          "RMgX + H2O β†’ RH",                    "Hydrolysis of Grignard reagent"],
    ["Reduction of alkyl halide","RX + Zn/HCl or LiAlH4 β†’ RH",        "Simple dehalogenation"],
    ["Hydrogenation",           "Alkene + H2 / Pd,Pt,Ni β†’ Alkane",    "Catalytic hydrogenation"],
    ["Sabatier-Senderens",      "CO + 3H2 / Ni,300Β°C β†’ CH4 + H2O",   "Industrial methane synthesis"],
]
story.append(two_col_table(alk_prep, col_widths=[42*mm, 62*mm, 66*mm]))
story.append(sp(6))

story.append(p("7.2  Reactions of Alkanes", H2))
alk_rxn = [
    ["Reaction",       "Conditions",                "Products"],
    ["Halogenation",   "X2 / hv (radical chain)",   "Alkyl halide β€” selectivity: F2 > Cl2 > Br2 > I2 (reactivity); Br2 most selective"],
    ["Combustion",     "O2 / heat",                  "CO2 + H2O (complete); CO + H2O (incomplete)"],
    ["Pyrolysis/Cracking","High temp, no O2",        "Smaller alkanes + alkenes"],
    ["Nitration",      "HNO3 / 400Β°C (vapour phase)","Nitroalkanes (RNO2)"],
    ["Sulfonation",    "SO3 / heat (gas phase)",     "Alkyl sulfonic acids"],
    ["Isomerization",  "AlCl3 / HCl / heat",        "Branched isomers (industrial)"],
]
story.append(two_col_table(alk_rxn, col_widths=[35*mm, 55*mm, 80*mm]))
story.append(PageBreak())


# ═══════════════════════════════════════════════════════════════════════
# 8. ALKENES
# ═══════════════════════════════════════════════════════════════════════
story.append(section_banner("8.  ALKENES β€” PREPARATION & REACTIONS  [PAST PAPERS]", BLUE))
story.append(sp(6))

story.append(p("8.1  Preparation of Alkenes", H2))
alkene_prep = [
    ["Method",                      "Reagents",                        "Notes"],
    ["Dehydration of alcohol",      "conc H2SO4 / 170Β°C  or  Al2O3/heat","Zaitsev rule β€” more substituted alkene major"],
    ["Dehydrohalogenation",         "RCH2CHX + KOH/alc β†’ RC=CH2",      "E2 mechanism; anti-periplanar; Zaitsev product"],
    ["Dehalogenation",              "RCHX-CHXR + Zn/EtOH",             "Vicinal dihalide β†’ alkene"],
    ["Wittig reaction",             "Aldehyde/Ketone + Ph3P=CR2",       "Forms specific alkene without migration"],
    ["Pyrolysis of esters/xanthates","Heat",                            "Cis elimination; syn product"],
    ["Reduction of alkynes",        "H2/Lindlar (partial)",             "Cis alkene; Na/liq NH3 β†’ trans alkene"],
]
story.append(two_col_table(alkene_prep, col_widths=[48*mm, 55*mm, 67*mm]))
story.append(sp(6))

story.append(p("8.2  Reactions of Alkenes", H2))
alkene_rxn = [
    ["Reaction",           "Reagent",              "Product / Selectivity"],
    ["Hydrogenation",      "H2/Ni or Pd",           "Alkane (syn addition)"],
    ["HX addition",        "HX",                    "Alkyl halide β€” Markovnikov"],
    ["H2O addition",       "H2O/H+",                "Alcohol β€” Markovnikov"],
    ["Halogenation",       "X2/CCl4",               "Vicinal dihalide β€” anti addition"],
    ["Halohydrin",         "X2/H2O",                "Halohydrin β€” anti, Markovnikov OH"],
    ["Epoxidation",        "mCPBA or RCO3H",        "Epoxide (syn)"],
    ["Dihydroxylation",    "OsO4 or KMnO4 cold",   "syn-diol"],
    ["Ozonolysis",         "O3 then Zn/H2O",        "Aldehydes/Ketones (reductive cleavage)"],
    ["Hydroboration-ox.",  "BH3; H2O2/OH-",         "Anti-Markovnikov, syn-alcohol"],
    ["Polymerization",     "Catalyst (Ziegler-Natta)","Polymer"],
]
story.append(two_col_table(alkene_rxn, col_widths=[38*mm, 42*mm, 90*mm]))
story.append(PageBreak())


# ═══════════════════════════════════════════════════════════════════════
# 9. ALKYNES
# ═══════════════════════════════════════════════════════════════════════
story.append(section_banner("9.  ALKYNES β€” PREPARATION & REACTIONS  [PAST PAPERS]", BLUE))
story.append(sp(6))

story.append(p("9.1  Preparation of Alkynes", H2))
alkyne_prep = [
    ["Method",                    "Reagents",                       "Notes"],
    ["Dehydrohalogenation x2",    "RCHBr-CHBrR + 2KOH/alc",        "Vicinal dihalide β†’ alkyne (double E2)"],
    ["Dehalogenation of tetrahalide","RCCX2-CX2R + Zn",            "Removes 2 X2 to give triple bond"],
    ["Acetylide + RX (alkylation)","HC≑C-Na + RX β†’ RC≑CH",         "SN2 on primary RX; terminal alkyne extension"],
    ["From calcium carbide",      "CaC2 + H2O β†’ HC≑CH",            "Industrial acetylene"],
]
story.append(two_col_table(alkyne_prep, col_widths=[48*mm, 55*mm, 67*mm]))
story.append(sp(6))

story.append(p("9.2  Reactions of Alkynes", H2))
alkyne_rxn = [
    ["Reaction",             "Reagent",               "Product / Notes"],
    ["Hydrogenation (full)", "H2 excess/Ni",           "Alkane"],
    ["Hydrogenation (partial)","H2/Lindlar catalyst",  "cis-alkene"],
    ["Hydrogenation (partial)","Na/liq NH3",           "trans-alkene (Birch-like)"],
    ["HX addition (1 mol)",  "HX",                     "Vinyl halide β€” Markovnikov"],
    ["HX addition (2 mol)",  "2HX",                    "Geminal dihalide"],
    ["X2 addition (1 mol)",  "X2",                     "trans-dihalide"],
    ["Hydration",            "H2O/H2SO4/HgSO4",        "Ketone (Markovnikov) via enol"],
    ["Hydroboration",        "Disiamylborane; H2O2/OH-","Aldehyde (anti-Markovnikov)"],
    ["Acidic H (terminal)",  "Na or NaNH2",            "Metal acetylide (sp C-H, pKa ~25)"],
    ["Ozonolysis",           "O3 then H2O",            "Carboxylic acids"],
]
story.append(two_col_table(alkyne_rxn, col_widths=[42*mm, 42*mm, 86*mm]))
story.append(PageBreak())


# ═══════════════════════════════════════════════════════════════════════
# 10. NUCLEOPHILIC & ELECTROPHILIC REACTIONS
# ═══════════════════════════════════════════════════════════════════════
story.append(section_banner("10.  NUCLEOPHILIC & ELECTROPHILIC REACTIONS  [PAST PAPERS]", TEAL))
story.append(sp(6))

story.append(p("10.1  Nucleophiles vs Electrophiles β€” Quick ID", H2))
nu_el = [
    ["Type", "Nature", "Examples"],
    ["Nucleophile (Nu:)", "Electron-RICH; attacks electron-poor C; has lone pair or pi bond",
     "OH-, CN-, Br-, I-, NH3, RNH2, H2O, RO-, RS-, RCOO-, enolates, Grignard (RMgX), organolithium, alkenes"],
    ["Electrophile (E+)", "Electron-POOR; attacked by Nu; positive or partial positive charge",
     "H+, X+ (halogen), NO2+, SO3, BF3, AlCl3, R+, RCHO, R2CO, CO2, RCOCl, activated alkenes (Michael acceptors)"],
]
story.append(two_col_table(nu_el, col_widths=[35*mm, 55*mm, 80*mm]))
story.append(sp(5))

story.append(p("10.2  Nucleophilic Acyl Substitution (NAS)", H2))
story.append(b("Mechanism: Nu: attacks carbonyl C β†’ tetrahedral intermediate β†’ leaving group expelled"))
story.append(b("Reactivity order (electrophilicity of carbonyl): RCOCl > RCOOCOR > RCOOR > RCOOH > RCONH2"))
story.append(b("Can do: ester hydrolysis, amide bond formation, transesterification, Claisen condensation"))
story.append(sp(5))

story.append(p("10.3  Electrophilic Aromatic Substitution (EAS)", H2))
story.append(b("Mechanism: E+ attacks pi system β†’ arenium ion (Wheland intermediate) β†’ proton loss restores aromaticity"))
story.append(b("Rate-determining step: attack of electrophile (step 1)"))
eas_rxns = [
    ["EAS Reaction",    "Electrophile Generated",          "Reagents"],
    ["Nitration",       "NO2+ (nitronium ion)",             "HNO3 + H2SO4 (mixed acid)"],
    ["Sulfonation",     "SO3 (or HSO3+)",                   "Fuming H2SO4 (oleum) or SO3"],
    ["Halogenation",    "X+ (via X2 + Lewis acid)",         "Cl2 or Br2 + AlCl3 or FeBr3"],
    ["Friedel-Crafts Alkylation","R+ (carbocation)",        "RX + AlCl3 (rearrangements possible)"],
    ["Friedel-Crafts Acylation","RCO+ (acylium ion)",       "RCOCl + AlCl3 (no rearrangement)"],
]
story.append(two_col_table(eas_rxns, col_widths=[42*mm, 52*mm, 76*mm]))
story.append(PageBreak())


# ═══════════════════════════════════════════════════════════════════════
# 11. ORIENTATION OF BENZENE
# ═══════════════════════════════════════════════════════════════════════
story.append(section_banner("11.  ORIENTATION OF BENZENE RING", GREEN))
story.append(sp(6))

story.append(p("11.1  Directing Effects of Substituents", H2))
dir_data = [
    ["Director Type", "Effect on Ring", "Position of Substitution", "Examples"],
    ["ortho/para director (activating)", "Activates ring (EDG β€” electron-donating groups)", "ortho AND para positions",
     "-OH, -OR, -NH2, -NR2, -NHCOR, -R (alkyl), -Ar"],
    ["ortho/para director (deactivating)","Deactivates ring (halogen β€” special case: -I via induction, +M via resonance)",
     "ortho AND para (halogen gives mainly para due to steric hindrance at ortho)",
     "-F, -Cl, -Br, -I"],
    ["meta director (deactivating)","Strongly deactivates ring (EWG)","meta position ONLY",
     "-NO2, -CN, -CHO, -COR, -COOH, -COOR, -SO3H, -NR3+, -CF3"],
]
story.append(two_col_table(dir_data, col_widths=[40*mm, 48*mm, 40*mm, 42*mm]))
story.append(sp(5))

story.append(p("11.2  Rules for Disubstituted Benzene", H2))
story.append(b("If both groups direct to the same position β†’ product is that position"))
story.append(b("If groups direct to different positions β†’ stronger activator wins"))
story.append(b("Strongly activating group overrides deactivating group in determining orientation"))
story.append(b("<b>Steric factor:</b> bulky groups favour para over ortho even for o/p directors"))
story.append(sp(5))

story.append(p("11.3  Mechanism: ortho/para vs meta", H2))
story.append(b("o/p directors stabilize the arenium ion intermediate via resonance when attack is at o or p"))
story.append(b("With EDG at ortho/para positions: the positive charge in arenium ion falls on substituted C β€” stabilized by lone pair donation"))
story.append(b("With EWG: attack at ortho/para places positive charge adjacent to EWG β€” DESTABILIZED β†’ meta attack is less destabilized β†’ meta preferred"))
story.append(PageBreak())


# ═══════════════════════════════════════════════════════════════════════
# 12. HETEROCYCLIC CHEMISTRY
# ═══════════════════════════════════════════════════════════════════════
story.append(section_banner("12.  HETEROCYCLIC CHEMISTRY  [IMP]", PURPLE))
story.append(sp(6))

story.append(p("12.1  5-Membered Aromatic Heterocycles", H2))
five_mem = [
    ["Compound", "Heteroatom", "Aromaticity", "Reactivity", "EAS Position"],
    ["Pyrrole",   "N (lone pair in ring)", "Huckel 6pi (N lone pair contributes)", "Very reactive in EAS (electron-rich N donates to ring)", "C-2 (alpha)"],
    ["Furan",     "O (lone pair in ring)", "Aromatic (weaker, less stable)", "Reactive; can also act as diene in Diels-Alder", "C-2 (alpha)"],
    ["Thiophene", "S (lone pair in ring)", "Aromatic (stable, like benzene)", "Moderate reactivity, benzene-like stability", "C-2 (alpha)"],
    ["Imidazole", "Two N: 1 pyrrole-type + 1 pyridine-type", "6pi aromatic", "Amphoteric; EAS at C-4/5", "C-4 or C-5"],
]
story.append(two_col_table(five_mem, col_widths=[26*mm, 35*mm, 38*mm, 48*mm, 23*mm]))
story.append(sp(6))

story.append(p("12.2  6-Membered Aromatic Heterocycles", H2))
six_mem = [
    ["Compound",   "Heteroatom",     "Reactivity",                          "EAS / NAS Position"],
    ["Pyridine",   "N (sp2, pyridine-type)", "EAS difficult (N withdraws electrons, ring deactivated); NAS (nucleophilic) at C-2 or C-4",
     "C-3 for EAS; C-2 & C-4 for NAS"],
    ["Pyrimidine", "2 N atoms",      "More deactivated than pyridine; NAS at C-2, C-4, C-6", "C-5 for EAS"],
    ["Quinoline",  "Benzo + pyridine","EAS in benzene ring; NAS in pyridine ring","C-5 & C-8 for EAS"],
    ["Isoquinoline","Benzo + pyridine (N at C-2)","Similar to quinoline","C-5 & C-8 for EAS"],
]
story.append(two_col_table(six_mem, col_widths=[28*mm, 32*mm, 68*mm, 42*mm]))
story.append(sp(6))

story.append(p("12.3  Key Points to Remember", H2))
story.append(b("Pyrrole N lone pair is part of aromatic ring β†’ NOT basic (pKa of conjugate acid ~ 0.4)"))
story.append(b("Pyridine N lone pair is NOT in ring β†’ IS basic (pKa ~ 5.2) and a nucleophile"))
story.append(b("Furan is least stable 5-membered (weakest aromaticity due to electronegativity of O)"))
story.append(b("Thiophene most stable 5-membered (S d-orbitals contribute extra stabilization)"))
story.append(b("Pyridine undergoes nucleophilic substitution (Chichibabin reaction: NH2 group at C-2 with NaNH2)"))
story.append(PageBreak())


# ═══════════════════════════════════════════════════════════════════════
# 13. KEY REAGENTS AT A GLANCE
# ═══════════════════════════════════════════════════════════════════════
story.append(section_banner("13.  KEY REAGENTS AT A GLANCE", NAVY))
story.append(sp(6))

reagents = [
    ["Reagent",               "Use / Reaction"],
    ["LiAlH4 (LAH)",          "Strong reducing agent: reduces RCOOH β†’ RCH2OH, RCOOR β†’ RCH2OH, RCHO β†’ RCH2OH, R2CO β†’ R2CHOH, RCOCl β†’ RCHO"],
    ["NaBH4",                 "Mild reducing agent: reduces ketones/aldehydes only (not acids/esters)"],
    ["BH3Β·THF",               "Hydroboration: anti-Markovnikov, syn addition to alkenes β†’ primary alcohol after oxidation"],
    ["mCPBA",                 "Peracid: epoxidizes alkenes (syn addition)"],
    ["OsO4",                  "Syn-dihydroxylation of alkenes β†’ syn-diol"],
    ["O3 then Zn/H2O",        "Ozonolysis: cleaves C=C β†’ aldehydes/ketones (reductive workup)"],
    ["O3 then H2O2",          "Ozonolysis: oxidative workup β†’ carboxylic acids from terminal alkenes"],
    ["PCC (pyridinium chlorochromate)","Oxidizes 1Β° alcohol β†’ aldehyde (stops at aldehyde, no overoxidation)"],
    ["K2Cr2O7 / H2SO4",       "Oxidizes 1Β° alcohol β†’ carboxylic acid; 2Β° alcohol β†’ ketone"],
    ["Tollens' reagent",       "Ag(NH3)2+ β€” distinguishes aldehyde (silver mirror) from ketone"],
    ["Fehling's solution",     "Cu2+ complex β€” detects reducing sugars / aliphatic aldehydes"],
    ["NaNH2 (sodamide)",       "Very strong base: deprotonates terminal alkynes; Chichibabin amination of pyridine"],
    ["AlCl3",                 "Lewis acid catalyst: Friedel-Crafts; generates carbocations / acylium ions"],
    ["Lindlar catalyst",       "Pd/CaCO3 + Pb β€” partial hydrogenation of alkyne β†’ cis-alkene only"],
    ["Na / liq NH3",          "Birch reduction / partial reduction of alkyne β†’ trans-alkene"],
    ["HNO3 + H2SO4",          "Nitrating mixture β€” generates NO2+ for aromatic nitration"],
    ["Conc H2SO4 / 170Β°C",    "Dehydration of alcohol β†’ alkene (intramolecular); >100Β°C β†’ ether (intermolecular)"],
    ["KMnO4 (cold, dilute)",  "Syn-dihydroxylation; oxidizes alkenes to diols; turns purple to brown"],
    ["KMnO4 (hot, conc)",     "Oxidative cleavage of alkenes: terminal CH2= β†’ CO2; internal =CHR β†’ RCOOH"],
    ["Grignard (RMgX)",       "Organometallic nucleophile: adds to aldehydes, ketones, CO2, esters β†’ C-C bond formation"],
]
story.append(two_col_table(reagents, col_widths=[52*mm, 118*mm]))
story.append(sp(8))

story.append(hr(color=TEAL, thickness=1.5))
story.append(sp(4))
story.append(p("<b>End of Quick Reference β€” Good luck on 3 June 2026!</b>",
               S("end", fontSize=11, textColor=TEAL, fontName="Helvetica-Bold", alignment=TA_CENTER)))
story.append(sp(4))
story.append(p("Focus: Mechanisms β†’ Rearrangements β†’ Stereochemistry β†’ Nucleophilic/Electrophilic β†’ Heterocyclic",
               S("endsub", fontSize=9, textColor=colors.grey, fontName="Helvetica-Oblique", alignment=TA_CENTER)))


# ── Build PDF ───────────────────────────────────────────────────────────────────
doc = BaseDocTemplate(
    OUTPUT,
    pagesize=A4,
    leftMargin=20*mm,
    rightMargin=20*mm,
    topMargin=25*mm,
    bottomMargin=20*mm,
)

frame_normal = Frame(
    doc.leftMargin, doc.bottomMargin,
    doc.width, doc.height,
    id="normal"
)

first_page_template = PageTemplate(id="FirstPage", frames=[frame_normal], onPage=on_first_page)
later_pages_template = PageTemplate(id="LaterPages", frames=[frame_normal], onPage=on_page)

doc.addPageTemplates([first_page_template, later_pages_template])

from reportlab.platypus import NextPageTemplate
story.insert(0, NextPageTemplate("LaterPages"))
# Cover uses first page template
story.insert(0, NextPageTemplate("FirstPage"))

# After cover page (PageBreak), switch template
# Find first PageBreak and insert NextPageTemplate before it
for i, item in enumerate(story):
    if isinstance(item, PageBreak) and i > 3:
        story.insert(i, NextPageTemplate("LaterPages"))
        break

doc.build(story)
print("PDF built successfully:", OUTPUT)
Running Command

cd /home/daytona/workspace/orgo-pdf && python build_orgo_ref.py 2>&1

Running Command

ls -lh /home/daytona/workspace/orgo-pdf/Organic_Chemistry_Quick_Reference.pdf

Your PDF is ready! Download it here:

Organic Chemistry Quick Reference

PDF Document Β· PDF


Here's what's packed inside the 15-page PDF:
PageSectionPriority
CoverTitle page with all chapter tags-
2Table of Contents-
3Basic Chemistry (hybridization, effects, acidity, bond fission)🟠 IMP
4Stereochemistry (R/S, E/Z, Fischer, definitions)🟠 IMP
5Reaction Mechanisms β€” SN1 vs SN2 vs E1 vs E2 full comparison tablesπŸ”΄ MOST IMP
6Carbocations & Carbanions (structure, stability orders, comparison)πŸ”΄πŸ”΄ MOST MOST IMP
7Free Radicals (chain mechanism, halogenation selectivity)πŸ”΄πŸ”΄ MOST MOST IMP
8Carbonium & Carbanion Rearrangements (1,2-shifts, Wagner-Meerwein, Stevens, Favorskii)πŸ”΄πŸ”΄ MOST MOST IMP
9Alkanes β€” Wurtz, Kolbe, Corey-House + all reactions🟑 Past Papers
10Alkenes β€” Preparation + full reaction table with Markovnikov/anti rules🟑 Past Papers
11Alkynes β€” Preparation + reactions (Lindlar, Na/NH3, hydration, etc.)🟑 Past Papers
12Nucleophilic & Electrophilic (Nu vs E identification, NAS, EAS table)🟑 Past Papers
13Benzene Orientation (directing effects, mechanism explanation, disubstitution rules)🟒
14Heterocyclic Chemistry (pyrrole, furan, thiophene, pyridine, quinoline)🟠 IMP
1520 Key Reagents at a Glance (LAH, NaBH4, PCC, OsO4, Grignard, etc.)-
This is a shared conversation. Sign in to Orris to start your own chat.