343 lines
11 KiB
Markdown
Executable File
343 lines
11 KiB
Markdown
Executable File
# Route 3: Academic & Scientific PDF via LaTeX
|
||
|
||
Produce publication-grade PDFs from `.tex` source files compiled with Tectonic. Suited for academic papers, theses, mathematical manuscripts, IEEE/ACM-format submissions, and any document where the user explicitly requests LaTeX.
|
||
|
||
**Guiding principle**: when someone asks for "a LaTeX PDF," they expect a polished, professional result — not a bare-minimum compilation.
|
||
|
||
---
|
||
|
||
## Environment Preparation
|
||
|
||
|
||
The binary of Tectonic lands at `scripts/tectonic`.
|
||
|
||
### Compilation — Always Use the Wrapper Script
|
||
|
||
All compilations **must** go through `scripts/pdf.py convert.latex`. It handles:
|
||
- Stripping noisy package-download logs
|
||
- Filtering progress chatter
|
||
- Surfacing genuine errors and warnings
|
||
- Reporting PDF statistics (file size, page count, word estimate, image tally)
|
||
|
||
**Do not invoke Tectonic directly.**
|
||
|
||
```bash
|
||
# One-pass build
|
||
python3 scripts/pdf.py convert.latex main.tex
|
||
|
||
# Two passes (resolves cross-references)
|
||
python3 scripts/pdf.py convert.latex main.tex --runs 2
|
||
|
||
# Verbose mode (retains full log output)
|
||
python3 scripts/pdf.py convert.latex main.tex --keep-logs
|
||
```
|
||
|
||
---
|
||
|
||
## Pre-Writing Planning
|
||
|
||
Before touching `.tex` code, determine the document's category and let that shape your approach.
|
||
|
||
### Recognising the Document Type
|
||
|
||
| Type | Typical outputs | Key concern |
|
||
|------|----------------|-------------|
|
||
| **Scholarly** | Journal articles, conference proceedings, regulatory specs | Rigorous adherence to academic conventions; bibliography accuracy |
|
||
| **Utilitarian** | Technical reports, reference manuals, product specs | Pack maximum information while preserving scannability |
|
||
| **Persuasive** | Funding proposals, pitch documents, project roadmaps | Clean professionalism throughout, with one or two visual high-points (title page, KPI dashboards) |
|
||
| **Expressive** | Design portfolios, brand guidebooks, showcases | Bold typographic and chromatic choices; deliberate rule-breaking that amplifies impact |
|
||
|
||
### Fallback Aesthetic (No Style Specified)
|
||
|
||
When the user gives no visual direction, apply a **measured, high-craft** system:
|
||
|
||
1. **Contrast** — clear figure-ground separation; headings visually distinct from running text
|
||
2. **Hierarchy** — establish reading order through deliberate variation in size, weight, and hue
|
||
3. **White space** — ample margins and leading to let the page breathe
|
||
4. **Coherence** — one typeface family, one accent colour, one spacing rhythm
|
||
|
||
#### Enrichment Elements (Add Proactively When Appropriate)
|
||
|
||
- **Decorative**: shaded callout boxes, sidebars, comparison panels → `tcolorbox`
|
||
- **Scholarly**: theorem / definition / proof environments → `amsthm` + `tcolorbox`; process diagrams → TikZ
|
||
- **Page furniture**: running headers and footers → `fancyhdr`; chapter openers → `titlesec`
|
||
|
||
Introduce these components on your own initiative whenever the content benefits — don't wait to be told.
|
||
|
||
---
|
||
|
||
## Mandatory Rules
|
||
|
||
### Rule 1 — Every Build Diagnostic Demands Attention
|
||
|
||
The wrapper classifies compiler output into three tiers:
|
||
|
||
| Tier | Impact | Required response |
|
||
|------|--------|-------------------|
|
||
| **Errors** | Build aborts | Resolve before anything else |
|
||
| **Layout defects** | Overfull / underfull boxes, unavailable font shapes, missing glyphs | Repair prior to delivery |
|
||
| **Advisories** | Remaining warnings | Assess individually; fix whenever feasible |
|
||
|
||
**Never acceptable**: shrugging off warnings with "they don't affect the final PDF." Every diagnostic merits investigation.
|
||
|
||
### Rule 2 — Modular Files for Larger Works
|
||
|
||
A single generation turn can comfortably handle roughly **500 lines** of TeX.
|
||
|
||
**When to split**:
|
||
- Anticipated output exceeds 5 pages, **or**
|
||
- Three or more heavyweight elements are present (wide tables, block equations, TikZ graphics)
|
||
|
||
Stitch modules together with `\input{chapter1}`, `\input{chapter2}`, etc.
|
||
|
||
### Rule 3 — Foundation Preamble
|
||
|
||
```latex
|
||
\documentclass{article}
|
||
|
||
% Essentials
|
||
\usepackage{graphicx}
|
||
\usepackage{xcolor}
|
||
\usepackage{geometry}
|
||
\usepackage{amsmath} % Load before hyperref
|
||
|
||
% hyperref — ALWAYS last among content packages
|
||
\usepackage[
|
||
colorlinks=true,
|
||
linkcolor=blue,
|
||
citecolor=darkgray,
|
||
urlcolor=blue,
|
||
bookmarks=true,
|
||
bookmarksnumbered=true,
|
||
unicode=true
|
||
]{hyperref}
|
||
|
||
% Page dimensions
|
||
\geometry{a4paper, top=2.5cm, bottom=2.5cm, left=3cm, right=2.5cm}
|
||
% CV variant: \geometry{a4paper, margin=1.5cm}
|
||
|
||
% Superscript citation numbers (scholarly convention)
|
||
\usepackage[numbers,super,sort&compress]{natbib}
|
||
\bibliographystyle{unsrtnat}
|
||
|
||
% Commonly needed extras
|
||
\usepackage{tcolorbox}
|
||
\usepackage{colortbl}
|
||
\usepackage{booktabs}
|
||
\usepackage{enumitem}
|
||
```
|
||
|
||
**hyperref positioning**: it must load after virtually every other package to avoid option clashes.
|
||
|
||
### Rule 4 — TeX Source Hygiene
|
||
|
||
**Prohibited patterns**:
|
||
- Emoji glyphs (no native LaTeX engine supports them)
|
||
- Markdown `*asterisk*` formatting (generates compile-time errors)
|
||
|
||
**Use instead**:
|
||
```latex
|
||
\textbf{bold text}
|
||
\emph{emphasised text}
|
||
```
|
||
|
||
These are frequent model-generation slips — catch them proactively.
|
||
|
||
### Rule 5 — Multi-Language & Font Handling
|
||
|
||
- `babel` and `polyglossia` are incompatible — load only one
|
||
- When using `polyglossia`, ensure `amsmath` appears earlier in the preamble
|
||
- Tectonic downloads standard LaTeX typefaces automatically (Latin Modern, etc.)
|
||
- To reference system-installed fonts via `\setmainfont{}`, first probe with `fc-list :lang=ar`
|
||
- Broadly available choices: DejaVu, Noto typeface families
|
||
|
||
### Rule 6 — Clickable Navigation Is Non-Negotiable
|
||
|
||
Interactive navigation is a baseline professional expectation.
|
||
|
||
#### 6.1 Table of Contents
|
||
```latex
|
||
\tableofcontents % Entries are auto-linked courtesy of hyperref
|
||
\listoffigures
|
||
\listoftables
|
||
```
|
||
|
||
#### 6.2 Internal Cross-References
|
||
|
||
**Attach labels** right after each numbered element:
|
||
```latex
|
||
\section{Background}\label{sec:bg}
|
||
|
||
\begin{figure}[htbp]
|
||
\includegraphics{...}
|
||
\caption{Overview diagram}\label{fig:overview}
|
||
\end{figure}
|
||
|
||
\begin{table}[htbp]
|
||
\caption{Benchmark results}\label{tab:bench}
|
||
...
|
||
\end{table}
|
||
|
||
\begin{equation}\label{eq:energy}
|
||
E = mc^2
|
||
\end{equation}
|
||
```
|
||
|
||
**Cite these labels** (each produces a live hyperlink):
|
||
```latex
|
||
As noted in Section~\ref{sec:bg}...
|
||
Figure~\ref{fig:overview} illustrates...
|
||
Table~\ref{tab:bench} summarises...
|
||
Equation~\eqref{eq:energy} yields... % \eqref auto-wraps in parentheses
|
||
See page~\pageref{sec:bg}...
|
||
```
|
||
|
||
**Good habits**:
|
||
- Place a non-breaking space `~` before `\ref` to avoid orphaned line breaks
|
||
- Prefer `\eqref{}` for equations (auto-wraps the number in parentheses)
|
||
- Adopt a consistent label-prefix convention: `sec:`, `fig:`, `tab:`, `eq:`, `lst:`
|
||
|
||
#### 6.3 Bibliography
|
||
|
||
**Superscript numerals (preferred academic style)**:
|
||
```latex
|
||
\usepackage[numbers,super,sort&compress]{natbib}
|
||
\bibliographystyle{unsrtnat}
|
||
|
||
Prior work\cite{smith2023} shows... % → shows^[1]
|
||
Several studies\cite{a,b,c} agree... % → agree^[1–3]
|
||
|
||
\bibliography{refs}
|
||
```
|
||
|
||
**Numeric bracket alternative**:
|
||
```latex
|
||
\usepackage[numbers]{natbib}
|
||
\bibliographystyle{plainnat}
|
||
|
||
\cite{smith2023} % [1]
|
||
\citep{smith2023} % (Smith, 2023)
|
||
\citet{smith2023} % Smith (2023)
|
||
```
|
||
|
||
**biblatex pathway**:
|
||
```latex
|
||
\usepackage[backend=biber,style=numeric-comp]{biblatex}
|
||
\addbibresource{refs.bib}
|
||
|
||
Per~\cite{smith2023}...
|
||
\printbibliography
|
||
```
|
||
|
||
#### 6.4 External Links
|
||
```latex
|
||
\url{https://example.com}
|
||
\href{https://example.com}{Visible label}
|
||
\href{mailto:a@b.com}{a@b.com}
|
||
```
|
||
|
||
#### 6.5 PDF Metadata & Outline
|
||
```latex
|
||
\hypersetup{
|
||
pdftitle={Document Title},
|
||
pdfauthor={Author Name},
|
||
pdfsubject={Topic},
|
||
pdfkeywords={keyword1, keyword2}
|
||
}
|
||
```
|
||
Bookmark trees are auto-generated from `\section` / `\chapter` hierarchy.
|
||
|
||
#### 6.6 Why Multiple Passes Matter
|
||
|
||
Label resolution requires at least two compilation passes:
|
||
```bash
|
||
# Resolve section / figure / table labels
|
||
python3 scripts/pdf.py convert.latex main.tex --runs 2
|
||
|
||
# Also resolves bibliography back-references
|
||
python3 scripts/pdf.py convert.latex main.tex --runs 3
|
||
```
|
||
|
||
If `??` placeholders persist after two passes, verify that every `\label` string has an exact `\ref` match.
|
||
|
||
#### 6.7 Navigation Troubleshooting
|
||
|
||
| Observation | Root cause | Resolution |
|
||
|-------------|-----------|------------|
|
||
| `??` in place of numbers | Only a single pass was run | Recompile with `--runs 2` |
|
||
| All links render in black | hyperref colour options omitted | Enable `colorlinks=true` |
|
||
| TOC items are not clickable | hyperref package missing | Load the package |
|
||
| `[?]` beside citations | `.bib` path incorrect or biber step skipped | Confirm path; rebuild |
|
||
| Bookmark pane empty | `bookmarks` option set to false | Switch to `bookmarks=true` |
|
||
|
||
---
|
||
|
||
## Package Catalogue
|
||
|
||
### Foundational
|
||
- `hyperref` (Rule 3)
|
||
- `geometry` (Rule 3)
|
||
- `listings` — `\lstset{basicstyle=\ttfamily\small, numbers=left, backgroundcolor=\color{gray!5}}`
|
||
- `enumitem` — `\setlist[itemize]{itemsep=0.3em, leftmargin=1.5em}`
|
||
|
||
### Tabular
|
||
`booktabs` · `longtable` · `multirow` · `array` · `colortbl`
|
||
|
||
### Visual & Charting
|
||
`tikz` · `pgfplots` · `float` · `wrapfig` · `subfig` / `subcaption`
|
||
|
||
### International & Typography
|
||
`fontspec` (XeLaTeX / LuaLaTeX) · `ctex`
|
||
|
||
### Mathematical
|
||
`amsmath` · `amssymb` · `amsthm` · `natbib` · `biblatex` · `siunitx`
|
||
|
||
### Algorithmic & Domain-Specific
|
||
`algorithm` + `algpseudocode` · `chemfig`
|
||
|
||
### Page Design
|
||
`tcolorbox` · `fancyhdr` · `titlesec` · `tocloft` · `multicol` · `setspace` · `microtype` · `parskip` · `adjustbox` · `marginnote`
|
||
|
||
### Code Listings
|
||
`listings` · `minted` (depends on Pygments)
|
||
|
||
---
|
||
|
||
## Scripts & Backends
|
||
|
||
| Script | Purpose |
|
||
|--------|---------|
|
||
| `pdf.py convert.latex` | Tectonic wrapper — log sanitisation, error highlighting, PDF metrics |
|
||
|
||
| Engine | Notes |
|
||
|--------|-------|
|
||
| Tectonic | Stand-alone LaTeX engine; packages are fetched transparently on demand |
|
||
|
||
---
|
||
|
||
## Operational Notes
|
||
|
||
### CJK Without Manual Font Setup
|
||
Tectonic resolves CJK font bundles on the fly — zero manual installation:
|
||
|
||
```latex
|
||
\usepackage{ctex} % Tectonic pulls the font files automatically
|
||
```
|
||
|
||
### Cold-Start Latency
|
||
The very first compilation of a new document triggers package downloads:
|
||
- Initial build: 1–5 min (depends on network speed)
|
||
- Repeat builds with warm cache: 10–30 s
|
||
|
||
### Working Without Internet
|
||
Previously fetched packages are stored under `~/.cache/Tectonic/`. When offline, only cached packages are available; attempting to use a new one will fail.
|
||
|
||
### Tectonic vs a Full TeX Live Installation
|
||
|
||
| Dimension | Tectonic | Traditional pdflatex |
|
||
|-----------|----------|---------------------|
|
||
| Package acquisition | On-demand, transparent | Manual via `tlmgr` |
|
||
| Multi-pass compilation | Handled by the engine | Explicit re-invocations required |
|
||
| Reference resolution | Automatic | Requires bibtex/biber cycles |
|
||
| Disk footprint | Single binary | Full TeX Live ≈ 4 GB |
|