# Poster

> Use this skill whenever an academic / research / conference poster is involved — creating, designing, or laying out a poster for a paper, a lab, a thesis defense, or a symposium. Trigger whenever the user mentions "poster," "会议海报," "学术海报," a poster session, A0/A1 poster, a 36x48 poster, or wants to turn a paper (PDF) into a single large printable panel. A poster is NOT a slide deck: it is ONE giant canvas read at standing distance, organized into multi-column sections (Abstract / Method / Results / Conclusion). If the goal is a multi-slide .pptx presentation instead, use the pptx skill. If a single large poster panel needs to be designed or produced, use THIS skill.

- Skill: `wakeeys/poster` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add wakeeys/poster`
- Raw SKILL.md: https://api.skillmd.com/api/skills/wakeeys/poster/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Design & Media
- License: Proprietary. Inherits pptx LICENSE terms.
- Author: wakeeys (https://skillmd.com/u/wakeeys)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/wakeeys/poster

---


# Poster Skill

Build a single large-format academic poster — one giant canvas, read at standing
distance, organized into columns. This is fundamentally different from a slide
deck: no "one idea per page," no 16:9 frames. Everything below is tuned for that.

## Quick Reference

| Task | Guide |
|------|-------|
| Decide size & orientation | Ask the user first — see [Choosing the Canvas](#choosing-the-canvas) |
| Build the poster | Read [poster.md](poster.md) for the full pptxgenjs recipe (layout, type scale, sections) |
| Pull a figure/table from the paper PDF | `python ../pptx/scripts/crop_image.py` — measure with `--profile`, then cut (see [Figures](#figures-the-main-event)) |
| Read an existing poster's content | `python -m markitdown poster.pptx` |
| Render for QA / print | See [Rendering & QA](#rendering--qa) |

This skill **reuses the pptx skill's scripts by relative path** — `crop_image.py`
for figure cropping and `office/` for PDF conversion live in `../pptx/scripts/`.
No copies are kept here, so there's nothing to maintain twice. This assumes the
`poster` and `pptx` skills sit side by side in the same repo (the layout of this
collection); if you relocate this skill on its own, copy those scripts in or
adjust the paths.

---

## Workflow

1. **Choose the canvas** — ask the user for size + orientation (see below). Do not guess.
2. **Gather content** — get the paper (PDF), title, authors, affiliations, the key
   figures/tables, and the take-home message. A poster has a strict content budget;
   help the user cut, don't cram.
3. **Crop figures from the source PDF** at high DPI (see [Figures](#figures-the-main-event)).
4. **Build** with pptxgenjs on a custom-sized single page — read [poster.md](poster.md).
5. **Render → inspect → fix** with subagents (see [Rendering & QA](#rendering--qa)).
6. **Export print-ready PDF.**

---

## Choosing the Canvas

**Always ask the user for orientation and size before building** — it changes the
entire column layout, and conferences mandate specific dimensions. Don't assume.

Common standards (width × height):

| Name | Portrait | Landscape | Notes |
|------|----------|-----------|-------|
| **A0** | 841 × 1189 mm (33.1 × 46.8 in) | 1189 × 841 mm | ISO standard, common in EU/Asia |
| **A1** | 594 × 841 mm | 841 × 594 mm | Smaller; some travel-friendly sessions |
| **48×36 in** | 36 × 48 in | 48 × 36 in | Common in North America |
| **42×42 in** | square | square | Some ACM/IEEE venues |

pptxgenjs uses **inches**. Convert mm → in by ÷ 25.4. Set a custom layout:

```javascript
pres.defineLayout({ name: 'A0P', width: 33.1, height: 46.8 }); // A0 portrait
pres.layout = 'A0P';
```

**Portrait → typically 2 columns. Landscape → typically 3 columns** (sometimes 4).
This choice drives everything in [poster.md](poster.md).

---

## Figures: the Main Event

On a poster, figures and tables carry the message — readers scan visuals first and
read prose second. Pull them from the **original paper PDF at high resolution**, never
reuse a low-res screenshot.

Use the shared cropper. Full edge-measuring methodology lives in the pptx skill's
docs, but the essentials:

```bash
# 1. LOCATE — render the page to see where the figure sits (use 400+ DPI; posters
#    print large, so go higher than you would for slides).
python ../pptx/scripts/crop_image.py paper.pdf page5.png --page 5 --dpi 600

# 2. MEASURE the tight edge instead of eyeballing it (h = top/bottom row, v = left/right col):
python ../pptx/scripts/crop_image.py paper.pdf /dev/null --page 5 --dpi 600 \
    --profile h --region 0.05,0.21,0.49,0.28

# 3. CUT with the measured box. --trim cleans residual margin, --pad adds room.
#    Do NOT use --trim on tables/algorithm boxes — it shaves the bounding rules.
python ../pptx/scripts/crop_image.py paper.pdf fig3.png --page 5 --dpi 600 \
    --frac 0.05,0.075,0.49,0.251 --pad 16
```

Key reminders (the rest is in [poster.md](poster.md) and pptx docs):
- **Go higher DPI than slides** — 400–600. A figure that looks fine on screen can be
  visibly soft when printed at 1m+ across.
- The edge belongs in the **blank gap after** the content, not on the last inked line.
- **Always exclude the caption** ("Figure N:" / "Table N:") — you'll re-label it on the poster.
- After cropping, **Read the output** and check all four edges are intact.

---

## Rendering & QA

**Assume the first render is wrong.** Posters fail in ways slides don't: a column
overflows the page bottom, the reading order is ambiguous, body text is too small to
read at distance, a 600-DPI figure got placed at thumbnail size.

### Render to an image

```bash
python ../pptx/scripts/office/soffice.py --headless --convert-to pdf poster.pptx
pdftoppm -jpeg -r 100 poster.pdf poster   # one big poster-01.jpg
```

For a poster, also render a **high-res crop of each column** so text legibility is
actually checkable (a single downscaled full-page JPG hides small-text problems):

```bash
pdftoppm -jpeg -r 200 poster.pdf poster-hi
```

### Visual QA — USE A SUBAGENT with fresh eyes

```
Inspect this academic poster. Assume there are issues — find them.

Poster-specific checks:
- Is the READING ORDER unambiguous? (columns top-to-bottom, left-to-right — a reader
  shouldn't have to guess where to go next)
- Does any column overflow past the bottom margin, or end with a big empty gap?
- Is body text large enough to read at standing distance? (see type scale in poster.md)
- Are figures placed large enough to matter, and is every figure referenced/numbered?
- Title bar: title, all authors, affiliations, and conference/logo present and legible?
- Are the section blocks visually balanced across columns (no one column stuffed)?
- Standard slide checks too: overlap, low contrast, < 0.5in margins, cramped gaps.

Read these images: <paths>. Report ALL issues, even minor.
```

### Loop

Render → list issues → fix → **re-render affected area** → repeat until a full pass is
clean. Do not declare success until at least one fix-and-verify cycle is done.

### Content QA

```bash
python -m markitdown poster.pptx
python -m markitdown poster.pptx | grep -iE "xxxx|lorem|ipsum|placeholder|your name|affiliation"
```

Fix any placeholder leftovers before finishing.

---

## Dependencies

- `npm install -g pptxgenjs` — building the poster
- `pip install "markitdown[pptx]"` — reading content
- `pip install Pillow numpy` — figure cropping (`../pptx/scripts/crop_image.py`)
- LibreOffice (`soffice`) — PDF conversion (via `../pptx/scripts/office/soffice.py`)
- Poppler (`pdftoppm`) — PDF → image

