Install to Claude Code
npx -y skills add https://github.com/dbosk/claude-skills --skill latex-writingDescription
latex writing
SKILL.md
---
name: latex-writing
description: |
Guide LaTeX document authoring following best practices and proper semantic markup.
Use proactively when: (1) writing or editing .tex files, (2) writing or editing .nw literate programming files,
(3) literate-programming skill is active and working with .nw files, (4) user mentions LaTeX, BibTeX, Mentipy
in a Beamer/article/PythonTeX context, interactive slide questions in LaTeX, or document formatting,
(5) reviewing LaTeX code quality. Ensures proper use of semantic environments (description vs itemize), csquotes (\enquote{} not
``...''), and cleveref (\cref{} not \S\ref{}).
---
# LaTeX Writing Best Practices
This skill guides the creation of well-structured, semantically correct LaTeX documents following established best practices.
## Core Principle: Semantic Markup
Use LaTeX environments that match the semantic meaning of the content, not just the visual appearance.
## List Environments: When to Use What
### Use `description` for Term-Definition Pairs
When you have labels followed by explanations, definitions, or descriptions, use the `description` environment:
```latex
\begin{description}
\item[Term] Definition or explanation of the term
\item[Label] Content associated with the label
\item[Property] Description of the property
\end{description}
```
**NEVER do this:**
```latex
\begin{itemize}
\item \textbf{Term:} Definition or explanation
\item \textbf{Label:} Content associated with label
\end{itemize}
```
### Common Use Cases for `description`
- **API parameters**: `\item[username] The user's login name`
- **Configuration options**: `\item[timeout] Maximum wait time in seconds`
- **Glossary entries**: `\item[LaTeX] A document preparation system`
- **Passes/Fails examples**: `\item[Passes] Correct implementation...`
- **Feature descriptions**: `\item[Auto-save] Automatically saves every 5 minutes`
### Exception: Pedagogical Meta-Commentary
Do not use a visible `description` list for instructor-facing pedagogical
annotations such as \enquote{What varies}, \enquote{What stays invariant},
or sequencing rationale in educational materials. Those belong in
`\ltnote{...}` via the `didactic-notes` skill. Use `description` only
when the labeled content is part of the student-facing document itself.
### Use `itemize` for Simple Lists
Use `itemize` when items are uniform list elements without labels:
```latex
\begin{itemize}
\item First uniform item
\item Second uniform item
\item Third uniform item
\end{itemize}
```
### Use `enumerate` for Numbered Steps or Rankings
Use `enumerate` when order matters:
```latex
\begin{enumerate}
\item First step in the process
\item Second step in the process
\item Third step in the process
\end{enumerate}
```
## Recognition Patterns
When reviewing or writing LaTeX, look for these patterns that indicate `description` should be used:
- `\item \textbf{SomeLabel:}` → Should use `\item[SomeLabel]`
- `\item \emph{SomeLabel:}` → Should use `\item[SomeLabel]`
- `\item SomeLabel ---` → Should use `\item[SomeLabel]`
- Lists where every item starts with bold/emphasized text
## Fixing Common Anti-Patterns
### Anti-Pattern: Bold Labels in Itemize
```latex
% INCORRECT
\begin{itemize}
\item \textbf{Passes:} \verb|\documentclass{article}|
\item \textbf{Fails:} No documentclass declaration
\end{itemize}
```
### Correct: Description Environment
```latex
% CORRECT
\begin{description}
\item[Passes] \verb|\documentclass{article}|
\item[Fails] No documentclass declaration
\end{description}
```
### Anti-Pattern: Manual Formatting Instead of Semantic Structure
```latex
% INCORRECT
\noindent\textbf{Configuration:} Set timeout to 30 seconds.\\
\textbf{Performance:} Optimized for large datasets.
```
### Correct: Semantic Description
```latex
% CORRECT
\begin{description}
\item[Configuration] Set timeout to 30 seconds
\item[Performance] Optimized for large datasets
\end{description}
```
## Literate Programming (.nw files)
**CRITICAL**: When writing LaTeX in literate programming files (.nw), use noweb's `[[code]]` notation for quoting code, not `\texttt` with manual escaping.
### Use `[[code]]` Notation, Not `\texttt{...\_...}`
The noweb literate programming system provides special notation for code references that automatically handles special characters like underscores.
**Anti-pattern**: Manual underscore escaping with `\texttt`
```latex
% INCORRECT - in .nw files
The \texttt{get\_submission()} method calls \texttt{\_\_getattribute\_\_}.
We store \texttt{\_original\_get\_submission} in the closure.
The \texttt{NOREFRESH\_GRADES} constant defines final grades.
```
**Correct**: Use `[[code]]` notation
```latex
% CORRECT - in .nw files
The [[get_submission()]] method calls [[__getattribute__]].
We store [[_original_get_submission]] in the closure.
The [[NOREFRESH_GRADES]] constant defines final grades.
```
**Why this matters**:
- Automatically escapes special characters (underscores, backslashes, etc.)
- Makes source code more readable (no manual escaping)
- Follows literate programming conventions
- Prevents LaTeX errors from forgotten escapes
- Clearly distinguishes code from prose
### When to Use `[[code]]` vs `\texttt`
**Use `[[code]]`** in .nw files for:
- Function and method names: `[[get_submissions()]]`, `[[__init__]]`
- Variable names: `[[_includes]]`, `[[user_id]]`
- Class names: `[[LazySubmission]]`, `[[Assignment]]`
- Constants: `[[NOREFRESH_GRADES]]`, `[[MAX_RETRIES]]`
- Module names: `[[pickle]]`, `[[Canvas]]`
- Any identifier with underscores or special characters
**Use `\texttt`** in .nw files for:
- Short non-code technical terms without special characters
- File extensions: `\texttt{.py}`, `\texttt{.nw}`
- Simple commands without underscores
**In regular .tex files** (not literate programs):
- Use `\texttt` with proper escaping as `[[...]]` is not available
- Or use packages like `minted` or `listings` for code
### Recognition Pattern for Review
When reviewing .nw files, look for these anti-patterns:
- `\texttt{..._...}` → Should use `[[...]]`
- `\texttt{...__...}` → Should use `[[...]]`
- `\item[SOME\_CONSTANT behavior]` → Either rephrase the label and put
`[[SOME_CONSTANT]]` in the body, or wrap the constant in `[[...]]`
inside the label — `\item[ [[SOME_CONSTANT]] behavior]`. If you take
the second option, separate the `]]` from the closing `]` with at
least one character (usually a space) so you do not produce three
brackets in a row, which triggers a runaway-argument error.
### Examples from Real Code
**Documenting methods:**
```latex
% INCORRECT
The \texttt{\_\_getstate\_\_} method excludes \texttt{\_original\_get\_submission}.
% CORRECT
The [[__getstate__]] method excludes [[_original_get_submission]].
```
**Documenting constants:**
```latex
% INCORRECT
\item[NOREFRESH\_GRADES behavior] Submissions with final grades...
% CORRECT
\item[Final grade policy] Submissions with final grades (A, P, P+, complete)
are never refreshed, maintaining the [[NOREFRESH_GRADES]] policy.
```
**Documenting attributes:**
```latex
% INCORRECT
The decorator adds a \texttt{\_\_cache} dictionary and \texttt{\_\_all\_fetched} flag.
% CORRECT
The decorator adds a [[__cache]] dictionary and [[__all_fetched]] flag.
```
## Additional Best Practices
### Cross-References
- **Always** use `\cref{...}` (cleveref package) for all cross-references
- **Never** use `\S\ref{...}` or manually type section/figure prefixes
- Use descriptive labels: `\label{sec:introduction}` not `\label{s1}`
- Examples:
- Sections: `\cref{sec:background}` → "Section 2.1"
- Figures: `\cref{fig:diagram}` → "Figure 3"
- Tables: `\cref{tab:results}` → "Table 1"
- Multiple: `\cref{sec:intro,sec:conclusion}` → "Sections 1 and 4"
**Anti-pattern**: Manual prefixes
```latex
% INCORRECT
Section~\ref{sec:intro} shows...
\S\ref{sec:background} discusses...
Figure~\ref{fig:plot} demonstrates...
% CORRECT
\cref{sec:intro} shows...
\cref{sec:background} discusses...
\cref{fig:plot} demonstrates...
```
**Why**: The cleveref package automatically adds the correct prefix (Section, Figure, etc.) and handles pluralization, ranges, and language-specific formatting.
### Citations
- Use proper citation commands (`\cite`, `\citep`, `\citet`) not manual references
- Never write `[1]` or `(Smith 2020)` manually
### Quotations (csquotes package)
- **Always** use `\enquote{...}` for quotes, never manual quote marks
- Handles nested quotes automatically: `\enquote{outer \enquote{inner} quote}`
- Language-aware: Swedish uses »...« or "...", English uses "..." or '...'
- For block quotes, use `\begin{displayquote}...\end{displayquote}`
**Anti-pattern**: Manual quotes
```latex
% INCORRECT
"This is a quote"
``This is a quote''
'single quotes'
```
**Correct**: Use csquotes
```latex
% CORRECT
\enquote{This is a quote}
\enquote{outer \enquote{inner} quote}
```
**Why**: Manual quote marks don't adapt to language settings and can cause typographical inconsistencies. The csquotes package handles all quote styling correctly based on document language.
### Emphasis
- **Never** use ALL CAPITALS for emphasis in running text
- Use `\emph{...}` to emphasize words or phrases
- For strong emphasis, use `\textbf{...}` or nested `\emph{\emph{...}}`
- Let LaTeX handle the typographic styling
**Anti-pattern**: ALL CAPITALS for emphasis
```latex
% INCORRECT
This is VERY important to understand.
We must do this NOW before moving forward.
The BENEFITS of classes are clear.
```
**Correct**: Semantic emphasis
```latex
% CORRECT
This is \emph{very} important to understand.
We must do this \emph{now} before moving forward.
The \emph{benefits} of classes are clear.
```
**Why**: ALL CAPITALS in running text is considered shouting and poor typography. It's harder to read and looks unprofessional. Use `\emph{...}` to provide semantic emphasis, and LaTeX will render it appropriately (typically as italics, but this can be configured based on context and document style).
**Exception**: Acronyms and proper names that are conventionally written in capitals (e.g., NASA, USA, PDF) are fine and should not be emphasized.
### Floats: Figures and Tables
**Core principle**: An image is not a figure, but a figure can contain an image. Use proper figure and table environments with captions and labels.
#### Using sidecaption (memoir class)
When using the memoir document class, prefer `sidecaption` over traditional `\caption` for better layout and accessibility:
**For figures:**
```latex
\begin{figure}
\begin{sidecaption}{Clear description of image content}[fig:label]
\includegraphics[width=0.7\textwidth]{path/to/image}
\end{sidecaption}
\end{figure}
```
**For tables:**
```latex
\begin{table}
\begin{sidecaption}{Description of table content}[tab:label]
\begin{tabular}{lcc}
\toprule
Header1 & Header2 & Header3 \\
\midrule
Data1 & Data2 & Data3 \\
\bottomrule
\end{tabular}
\end{sidecaption}
\end{table}
```
**Key features of sidecaption:**
- **Caption placement**: Caption appears alongside the content (figure/table), not above or below
- **Space efficiency**: Better use of page width, especially for narrow images/tables
- **Improved readability**: Caption and content are visually connected
- **Accessibility**: Clear semantic separation between caption text and content
- **Consistent labeling**: Label goes in optional second argument `[fig:label]`
**When to use sidecaption:**
- Medium-sized figures/tables that don't need full text width
- Educational materials where caption-content proximity aids understanding
- Documents using memoir class (Beamer presentations with memoir features)
**Traditional caption alternative:**
```latex
\begin{figure}
\centering
\includegraphics[width=0.7\textwidth]{path/to/image}
\caption{Description of image content}
\label{fig:label}
\end{figure}
```
Use traditional `\caption` + `\label` when:
- Not using memoir class
- Figure/table spans full text width
- Caption naturally belongs below content (e.g., wide tables)
#### Referencing figures and tables
Always use `\cref{fig:label}` (cleveref package) to reference figures and tables:
```latex
As shown in \cref{fig:memory-hierarchy}, secondary memory is slower but non-volatile.
The results in \cref{tab:benchmark} demonstrate...
```
**Never** hard-code references like "Figure 1", "Table 3.2", or use manual prefixes like `Figure~\ref{fig:label}`—let cleveref handle both numbering and prefixes automatically.
### Verbatim and Code
- Use `minted` (preferred, syntax-highlighted; needs `-shell-escape`) or
`listings` for code blocks
- Use `\verb` or `\mintinline` for inline code snippets
- Never paste code as normal text
- **minted v3 (TeX Live 2024+) gotchas** — see
`references/minted-v3-and-floats.md` (search: `outputdir`, `Pygments lexer`):
the `[outputdir=...]` package option is removed (now an error; load plain
`\usepackage{minted}`), and a `minted`/`\mintinline` **language argument split
across a line break** fails with `Pygments lexer " python" is unknown`. Keep
each minted invocation's arguments on one line; wrap prose between
`\mintinline{...}{...}` calls, never inside one.
### Debugging `! LaTeX Error: Float(s) lost.`
This fatal, location-less error (reported at `\end{document}`) in a dual
beamer/article didactic+memoir build is typically a citation/footnote inside a
**slide-only `\begin{frame}<presentation>` frame** (it suppresses output but
still executes the body, so the margin footnote gets orphaned) — *not* citations
in ordinary frames, which are fine. Run a bare `pdflatex -halt-on-error` pass to
see the real error past latexmk/biber noise, and diagnose by minimal
reproduction. Fix: wrap the slide-only frame in `\mode<presentation>{...}` (or
filter the citation with `\only<presentation>{...}`). Full diagnosis:
`references/minted-v3-and-floats.md` and the **didactic-notes** skill's
`references/footnotes-and-citations.md`.
### Encoding and Fonts (engine-dependent)
Unicode/font build failures have **opposite fixes on pdfLaTeX vs
XeLaTeX/LuaLaTeX**, so identify the engine first (`grep 'This is' file.log`).
Full guidance in `references/unicode-and-fonts.md` (search:
`DeclareUnicodeCharacter`, `iftex`, `newunicodechar`, `fontenc`, `pdffonts`):
- **pdfLaTeX — `! LaTeX Error: Unicode character … (U+XXXX) not set up`** — a
non-ASCII byte with no mapping (reversed quotes, dash variants, `≈`,
box-drawing). Fix in the **preamble** with `\usepackage[utf8]{inputenc}`
*then* `\DeclareUnicodeCharacter{XXXX}{...}`, not by editing the source.
(`inputenc` is what defines `\DeclareUnicodeCharacter` portably; without it
you may get `Undefined control sequence`.)
- **XeLaTeX/LuaLaTeX** — the "not set up" error does not occur (native UTF-8),
and `\DeclareUnicodeCharacter` is **undefined** there (`inputenc` is
ignored). Guard pdfLaTeX-only mappings with `\ifpdftex … \fi` (iftex
package); remap a glyph with `\newunicodechar` instead.
- **pdfLaTeX — code renders as proportional serif** (underscores extract as
`˙`, quotes turn curly) — a T1-only monospace font (e.g. Bera Mono) cannot
select without `\usepackage[T1]{fontenc}`. Load it (inside the `\ifpdftex`
branch).
- **Build systems switch engines.** `latexmk -pdf` vs `-xelatex`, and Makefile
rules may be tangled from a `.nw`, so a `make`/submodule update can flip the
engine — re-check the `.log` banner, don't assume.
- **Diagnose, do not guess:** `pdffonts -f N -l N file.pdf` shows which fonts a
page embeds; `pdftotext -f N -l N` reveals the encoding via glyph→Unicode
mapping.
### Paths
- Always use forward slashes in paths: `figures/diagram.pdf` not `figures\diagram.pdf`
- Use platform-independent path specifications
## Workflow for Writing LaTeX
When writing or editing LaTeX content:
1. **Check file type**: Are you in a .nw literate programming file? If yes, use `[[code]]` notation, not `\texttt{...\_...}`
2. **Identify content structure**: Is this a list of uniform items or term-definition pairs?
3. **Choose semantic environment**: Match the environment to the content meaning
4. **Use proper commands**: Leverage LaTeX's semantic commands rather than manual formatting
5. **Verify cross-references**: Ensure labels and references are descriptive and correct
6. **Check for anti-patterns**: Review for `\textbf{Label:}` in itemize, `\texttt{..._...}` in .nw files
## When Reviewing LaTeX Code
Check for these common issues:
- [ ] Lists using `\textbf{Label:}` instead of `description` environment
- [ ] Hard-coded numbers instead of `\ref`
- [ ] Manual cross-reference prefixes (`\S\ref`, `Section~\ref`, `Figure~\ref`) instead of `\cref`
- [ ] Manual citation formatting instead of `\cite` commands
- [ ] Manual quotes (`"..."`, `'...'`, `` `...` ``) instead of `\enquote{...}`
- [ ] Images without `figure` environment
- [ ] Code without proper formatting (listings/verbatim)
- [ ] Windows-style backslashes in paths
- [ ] Engine-specific Unicode/font setup not guarded by `iftex` — e.g.
`\DeclareUnicodeCharacter` (pdfLaTeX-only) used unconditionally, which
errors under XeLaTeX/LuaLaTeX (see `references/unicode-and-fonts.md`)
- [ ] pdfLaTeX: non-ASCII characters without a `\DeclareUnicodeCharacter`
mapping, or `\DeclareUnicodeCharacter` used without `\usepackage[utf8]{inputenc}`
- [ ] pdfLaTeX: monospace/code rendering as proportional serif — missing
`\usepackage[T1]{fontenc}` for a T1-only font such as Bera Mono
**Additional checks for .nw literate programming files:**
- [ ] `\texttt{..._...}` or `\texttt{...__...}` → Should use `[[...]]` notation
- [ ] Description labels with underscores `\item[FOO\_BAR behavior]` → Use better label + `[[FOO_BAR]]` in text
- [ ] Any manually escaped underscores in code references → Use `[[...]]` instead
## Beamer: Presentation vs Article Mode
When creating Beamer presentations that also generate article versions, use `\mode<presentation>` and `\mode<article>` to provide appropriate content for each format.
### When to Split Content
**Verbose text environments**: Semantic environments (definition, remark, example, block) with more than 2-3 lines of prose are too verbose for slides.
**Solution**: Provide concise versions for presentations and full explanations for articles:
```latex
\begin{frame}
\mode<presentation>{%
\begin{remark}[Key Point]
\begin{itemize}
\item Concise point 1
\item Concise point 2
\item Concise point 3
\end{itemize}
\end{remark}
}
\mode<article>{%
\begin{remark}[Key Point]
Full explanatory paragraph with detailed reasoning and context
that would overwhelm a slide but provides value in written form.
Additional paragraphs can elaborate on nuances and implications.
\end{remark}
}
\end{frame}
```
### Visual Elements
**Side-by-side layouts** using `\textbytext`:
- Presentation: `\textbytext` (non-starred, column width, works in beamer frames)
- Article: `\textbytext*` (starred, fullwidth, better for printed documents)
```latex
\begin{frame}
\mode<presentation>{%
\textbytext{Left content}{Right content}
}
\mode<article>{%
\textbytext*{Left content}{Right content}
}
\end{frame}
```
### Principle
Slides need **visual clarity** and **conciseness** (bullets, short phrases). Articles can provide **depth** and **explanation** (full sentences, paragraphs). Design content appropriate for each medium.
### Interactive Questions with Mentipy
For slide decks or educational articles that should embed live polls, use
`mentipy.latex` from a PythonTeX block or another Python block. Prefer
`mc`, `open_text`, `scale`, and `word_cloud` for student-facing questions,
then run `mentipy serve` to publish the poll and recompile after URL changes
so refreshed QR codes are embedded. Use `layout="slide"` for Beamer slides
and `layout="article"` or `layout="article+qr"` for handouts.
## Standard Preamble
For new LaTeX documents, use the standard preamble from `references/preamble.tex`. Copy it verbatim to your project's `doc/preamble.tex` and include it with `\input{preamble}` after `\documentclass`.
**Document structure:**
```latex
\documentclass[a4paper,oneside]{memoir}
\input{preamble}
\title{Document Title}
\author{Author Name}
\date{\today}
\begin{document}
\frontmatter
\maketitle
\tableofcontents
\mainmatter
% Content here
\backmatter
\end{document}
```
**The standard preamble provides:**
- Language support, bibliography, mathematics, and quotations
- Code highlighting and noweb support
- Cross-references and tables
- Common utilities such as `enumitem`, `acro`, and `siunitx`
This ensures consistent formatting across all documents and projects.
## Remember
LaTeX is a **document preparation system** based on **semantic markup**, not a word processor. The goal is to describe what content *is*, not how it should *look*. Let LaTeX handle the formatting based on the semantic structure you provide.
