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
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.

Create a detailed quick-reference PDF for organic chemistry reactions and mechanisms
mkdir -p /home/daytona/workspace/orgo-pdf && ls /home/daytona/workspace/orgo-pdf/
~/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)
cd /home/daytona/workspace/orgo-pdf && python build_orgo_ref.py 2>&1
ls -lh /home/daytona/workspace/orgo-pdf/Organic_Chemistry_Quick_Reference.pdf
Organic Chemistry Quick Reference
PDF Document Β· PDF
| Page | Section | Priority |
|---|---|---|
| Cover | Title page with all chapter tags | - |
| 2 | Table of Contents | - |
| 3 | Basic Chemistry (hybridization, effects, acidity, bond fission) | π IMP |
| 4 | Stereochemistry (R/S, E/Z, Fischer, definitions) | π IMP |
| 5 | Reaction Mechanisms β SN1 vs SN2 vs E1 vs E2 full comparison tables | π΄ MOST IMP |
| 6 | Carbocations & Carbanions (structure, stability orders, comparison) | π΄π΄ MOST MOST IMP |
| 7 | Free Radicals (chain mechanism, halogenation selectivity) | π΄π΄ MOST MOST IMP |
| 8 | Carbonium & Carbanion Rearrangements (1,2-shifts, Wagner-Meerwein, Stevens, Favorskii) | π΄π΄ MOST MOST IMP |
| 9 | Alkanes β Wurtz, Kolbe, Corey-House + all reactions | π‘ Past Papers |
| 10 | Alkenes β Preparation + full reaction table with Markovnikov/anti rules | π‘ Past Papers |
| 11 | Alkynes β Preparation + reactions (Lindlar, Na/NH3, hydration, etc.) | π‘ Past Papers |
| 12 | Nucleophilic & Electrophilic (Nu vs E identification, NAS, EAS table) | π‘ Past Papers |
| 13 | Benzene Orientation (directing effects, mechanism explanation, disubstitution rules) | π’ |
| 14 | Heterocyclic Chemistry (pyrrole, furan, thiophene, pyridine, quinoline) | π IMP |
| 15 | 20 Key Reagents at a Glance (LAH, NaBH4, PCC, OsO4, Grignard, etc.) | - |