Enforces semantic LaTeX markup so your documents mean what they say, not just look right. Catches the classic antipattern of bold labels in itemize lists and pushes you toward proper description environments. Also handles cleveref for cross-references and csquotes for quotations. The real win is the literate programming support: in .nw files it enforces noweb's double-bracket notation for code identifiers instead of manually escaping underscores in texttt. Saves you from a lot of tedious backslashing and makes the source readable. Activates automatically when you're editing .tex or .nw files, or when you mention LaTeX tooling like BibTeX or PythonTeX.
npx -y skills add dbosk/claude-skills --skill latex-writing --agent claude-codeInstalls into .claude/skills of the current project.
This skill guides the creation of well-structured, semantically correct LaTeX documents following established best practices.
Use LaTeX environments that match the semantic meaning of the content, not just the visual appearance.
description for Term-Definition PairsWhen you have labels followed by explanations, definitions, or descriptions, use the description environment:
\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:
\begin{itemize}
\item \textbf{Term:} Definition or explanation
\item \textbf{Label:} Content associated with label
\end{itemize}
description\item[username] The user's login name\item[timeout] Maximum wait time in seconds\item[LaTeX] A document preparation system\item[Passes] Correct implementation...\item[Auto-save] Automatically saves every 5 minutesDo 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.
itemize for Simple ListsUse itemize when items are uniform list elements without labels:
\begin{itemize}
\item First uniform item
\item Second uniform item
\item Third uniform item
\end{itemize}
enumerate for Numbered Steps or RankingsUse enumerate when order matters:
\begin{enumerate}
\item First step in the process
\item Second step in the process
\item Third step in the process
\end{enumerate}
resume)When enumerated items (survey/quiz questions, requirements, exam tasks) each
need explanatory commentary, keep the \item text bare and put the
commentary as prose between single-item environments, resuming the
numbering with enumitem:
\begin{enumerate}
\item \enquote{Have you programmed before this course?}
\end{enumerate}
Commentary motivating the question, referencing what it serves.
\begin{enumerate}[resume]
\item \enquote{How do you plan to study in this course?}
\end{enumerate}
More commentary...
\usepackage{enumitem}; in dual beamer/article builds load it in
the article driver only (enumitem conflicts with beamer's list
internals) and keep such lists in article-mode prose, which \mode*
skips in the slides job.\item after the
question text — the question and its rationale then blur together.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]% INCORRECT
\begin{itemize}
\item \textbf{Passes:} \verb|\documentclass{article}|
\item \textbf{Fails:} No documentclass declaration
\end{itemize}
% CORRECT
\begin{description}
\item[Passes] \verb|\documentclass{article}|
\item[Fails] No documentclass declaration
\end{description}
% INCORRECT
\noindent\textbf{Configuration:} Set timeout to 30 seconds.\\
\textbf{Performance:} Optimized for large datasets.
% CORRECT
\begin{description}
\item[Configuration] Set timeout to 30 seconds
\item[Performance] Optimized for large datasets
\end{description}
CRITICAL: When writing LaTeX in literate programming files (.nw), use noweb's [[code]] notation for quoting code, not \texttt with manual escaping.
[[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
% 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
% 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:
[[code]] vs \textttUse [[code]] in .nw files for:
[[get_submissions()]], [[__init__]][[_includes]], [[user_id]][[LazySubmission]], [[Assignment]][[NOREFRESH_GRADES]], [[MAX_RETRIES]][[pickle]], [[Canvas]]Use \texttt in .nw files for:
\texttt{.py}, \texttt{.nw}In regular .tex files (not literate programs):
\texttt with proper escaping as [[...]] is not availableminted or listings for codeWhen 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.Documenting methods:
% INCORRECT
The \texttt{\_\_getstate\_\_} method excludes \texttt{\_original\_get\_submission}.
% CORRECT
The [[__getstate__]] method excludes [[_original_get_submission]].
Documenting constants:
% 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:
% INCORRECT
The decorator adds a \texttt{\_\_cache} dictionary and \texttt{\_\_all\_fetched} flag.
% CORRECT
The decorator adds a [[__cache]] dictionary and [[__all_fetched]] flag.
\cref{...} (cleveref package) for all cross-references\S\ref{...} or manually type section/figure prefixes\label{sec:introduction} not \label{s1}\cref{sec:background} → "Section 2.1"\cref{fig:diagram} → "Figure 3"\cref{tab:results} → "Table 1"\cref{sec:intro,sec:conclusion} → "Sections 1 and 4"Anti-pattern: Manual prefixes
% 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.
\cite, \citep, \citet) not manual references[1] or (Smith 2020) manually\enquote{...} for quotes, never manual quote marks\enquote{outer \enquote{inner} quote}\begin{displayquote}...\end{displayquote}Anti-pattern: Manual quotes
% INCORRECT
"This is a quote"
``This is a quote''
'single quotes'
Correct: Use csquotes
% 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.
The command depends on whether the text is verbatim from the source:
\enquote{...} plus a detached \cite/\autocite:
\textcquote[⟨prenote⟩][⟨postnote⟩]{key}{text} — inline\blockcquote[⟨postnote⟩]{key}{text} — block (long quotes)\textcite/\autocite, and keep any
reported words in plain \enquote.\enquote{...} otherwise: scare quotes, words-as-mention, and
back-references to an already-cited quotation.% INCORRECT — verbatim source text as \enquote + detached citation
The study reports \enquote{much higher (63\%)} results \autocite[p.~167]{NCOL}.
% CORRECT — verbatim quotation carries its own citation
The study reports \textcquote[p.~167]{NCOL}{much higher (63\%)} results.
% CORRECT — a paraphrased/recounted example is attributed, NOT \textcquote'd
\Textcite[pp.~24--25]{NCOL} reports a study in which a child answers
\enquote{five} for one hand and \enquote{ten} for the other.
Crucial caveat: \textcquote/\blockcquote assert the braced text is
verbatim from the source. Verify the words actually appear there before
wrapping them; do not use these commands for paraphrase, reconstructed dialogue,
or words-as-mention — attribute those with \textcite/\autocite instead. (See
the backing-claims skill — read the source and verify before you cite.)
\emph{...} to emphasize words or phrases\textbf{...} or nested \emph{\emph{...}}Anti-pattern: ALL CAPITALS for emphasis
% INCORRECT
This is VERY important to understand.
We must do this NOW before moving forward.
The BENEFITS of classes are clear.
Correct: Semantic emphasis
% 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.
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.
When using the memoir document class, prefer sidecaption over traditional \caption for better layout and accessibility:
For figures:
\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:
\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:
[fig:label]When to use sidecaption:
Traditional caption alternative:
\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:
Always use \cref{fig:label} (cleveref package) to reference figures and tables:
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.
minted (preferred, syntax-highlighted; needs -shell-escape) or
listings for code blocks\verb or \mintinline for inline code snippetsreferences/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.! 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>{...}). Caveat: the
\mode<presentation>{...} wrap cannot be used on a [fragile] frame — the
group's closing } falls outside the verbatim .vrb scan and the slides
build then fails with ! Extra }, or forgotten \endgroup. For a fragile
slide-only frame, drop [fragile] if it is not actually needed (no
verbatim/minted/listings inside), otherwise keep
\begin{frame}<presentation>[fragile] and guard each citation with
\only<presentation>{\autocite{...}}. Full diagnosis:
references/minted-v3-and-floats.md and the didactic-notes skill's
references/footnotes-and-citations.md.
For papers compiled twice from the same content files (memoir +
beamerarticle article AND a beamer slide deck, content files starting with
\mode*), follow references/dual-beamer-article.md (search: pyblock frame, ProvideSemanticEnv, restatable, biber root). The four rules,
in brief:
pyblock goes inside a \begin{frame}[fragile] that
renders in both modes — out-of-frame pyblocks are skipped by the slides
job, desynchronising the shared PythonTeX session data (symptoms: swapped
outputs, ?? PythonTeX ??).question; declare e.g. hypothesis via
\ProvideSemanticEnv after \DeclareTranslation), stated inside
\begin{restatable}{question}{tag} (thm-restate) and restated with
\tag* — with a beamer shim in the shared preamble; reference via
\cref{rq:*}, never literal "RQ1"/"H2".\mode<presentation>{...} wrap (fragile caveat
above); article-only prose sits outside frames; don't let slide bullet
lists duplicate adjacent article prose.biber ltxobj/<jobname>),
never from inside the output directory.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):
! 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.)\DeclareUnicodeCharacter is undefined there (inputenc is
ignored). Guard pdfLaTeX-only mappings with \ifpdftex … \fi (iftex
package); remap a glyph with \newunicodechar instead.˙, quotes turn curly) — a T1-only monospace font (e.g. Bera Mono) cannot
select without \usepackage[T1]{fontenc}. Load it (inside the \ifpdftex
branch).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.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.figures/diagram.pdf not figures\diagram.pdfWhen writing or editing LaTeX content:
[[code]] notation, not \texttt{...\_...}\textbf{Label:} in itemize, \texttt{..._...} in .nw filesCheck for these common issues:
\textbf{Label:} instead of description environment\ref\S\ref, Section~\ref, Figure~\ref) instead of \cref\cite commands"...", '...', `...`) instead of \enquote{...}\enquote{...} + a detached \cite/\autocite instead of \textcquote/\blockcquote (and, conversely, \textcquote/\blockcquote wrapping paraphrase that is not verbatim)figure environmentiftex — e.g.
\DeclareUnicodeCharacter (pdfLaTeX-only) used unconditionally, which
errors under XeLaTeX/LuaLaTeX (see references/unicode-and-fonts.md)\DeclareUnicodeCharacter
mapping, or \DeclareUnicodeCharacter used without \usepackage[utf8]{inputenc}\usepackage[T1]{fontenc} for a T1-only font such as Bera Monopyblock outside a both-modes
\begin{frame}[fragile] (desynchronises PythonTeX sessions), or
literal "RQ1"/"H2" in prose instead of \cref to a semantic
question/hypothesis environment (see
references/dual-beamer-article.md)Additional checks for .nw literate programming files:
\texttt{..._...} or \texttt{...__...} → Should use [[...]] notation\item[FOO\_BAR behavior] → Use better label + [[FOO_BAR]] in text[[...]] insteadWhen creating Beamer presentations that also generate article versions, use \mode<presentation> and \mode<article> to provide appropriate content for each format.
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:
\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}
Side-by-side layouts using \textbytext:
\textbytext (non-starred, column width, works in beamer frames)\textbytext* (starred, fullwidth, better for printed documents)\begin{frame}
\mode<presentation>{%
\textbytext{Left content}{Right content}
}
\mode<article>{%
\textbytext*{Left content}{Right content}
}
\end{frame}
Slides need visual clarity and conciseness (bullets, short phrases). Articles can provide depth and explanation (full sentences, paragraphs). Design content appropriate for each medium.
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.
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:
\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:
enumitem, acro, and siunitxThis ensures consistent formatting across all documents and projects.
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.
supercent-io/skills-template
supercent-io/skills-template
huangjia2019/claude-code-engineering
reactjs/react.dev
reactjs/react.dev