modernize — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited modernize (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Most of these patterns still compile but produce subtle bugs (broken NFSS interactions, wrong math spacing, miscalibrated boxes). Replace conservatively.
| Deprecated | Modern | Why |
|---|---|---|
{\bf foo} | \textbf{foo} | \bf is a switch that resets shape; \textbf is NFSS-aware |
{\it foo} | \textit{foo} | same |
{\sl foo} | \textsl{foo} | same |
{\sc foo} | \textsc{foo} | same |
{\rm foo} | \textrm{foo} | same |
{\sf foo} | \textsf{foo} | same |
{\tt foo} | \texttt{foo} | same |
\bf (declaration form) | \bfseries | NFSS declaration; stacks correctly |
\it (declaration form) | \itshape | same |
\sl (declaration form) | \slshape | same |
\sc (declaration form) | \scshape | same |
\rm (declaration form) | \rmfamily | same |
\sf (declaration form) | \sffamily | same |
\tt (declaration form) | \ttfamily | same |
\bf\it foo (combined) | \textbf{\textit{foo}} | \bf resets shape; combining old commands silently fails |
\centerline{X} | \begin{center}X\end{center} (or {\centering X\par}) | \centerline is plain TeX, doesn't interact with \par |
\begin{eqnarray}...\end{eqnarray} | \begin{align}...\end{align} (from amsmath) | eqnarray miscalibrates math-relation column spacing; flagged obsolete |
\begin{eqnarray*}...\end{eqnarray*} | \begin{align*}...\end{align*} | same |
$$...$$ | \[...\] (or equation/align) | plain TeX $$ skips \everydisplay, breaks amsmath features |
\over (math) | \frac{a}{b} | \over is plain TeX, no semantic info |
{a \over b} | \frac{a}{b} | same |
\usepackage{epsfig} | \usepackage{graphicx} | epsfig is a thin wrapper for the deprecated graphics package |
\epsfig{file=X,...} | \includegraphics[...]{X} | same |
\usepackage[latin1]{inputenc} | drop (or switch source to UTF-8) | LaTeX 2018+ defaults to UTF-8 |
\usepackage[utf8]{inputenc} (LuaLaTeX/XeLaTeX) | drop entirely | both engines are natively Unicode |
\usepackage[T1]{fontenc} (LuaLaTeX/XeLaTeX) | drop entirely; use fontspec | T1 is for pdflatex's 8-bit font world |
\rm inside math | \mathrm{...} (text in math) or \operatorname{...} (operator name) | \rm in math is undefined behavior in modern LaTeX |
\fbox{\parbox{...}{...}} callouts | \fbox{\parbox{...}{...}} works, but for tunable callouts use tcolorbox | wider styling control |
Sources: TeX FAQ (https://texfaq.org/FAQ-2letterfontcmd); LaTeX2e for class/package writers (https://www.latex-project.org/help/documentation/usrguide.pdf); latexref.xyz/eqnarray.html.
grep -nE '\\(bf|it|sl|sc|rm|sf|tt)\b' main.tex
grep -nE '\\begin\{eqnarray\*?\}' main.tex
grep -nE '\\\$\\\$|\$\$.*\$\$' main.tex # naive — false positives possible
grep -nE '\\centerline\b' main.tex
grep -nE '\\epsfig\b|\\usepackage\{epsfig\}' main.tex
grep -nE '\\usepackage(\[[^\]]*\])?\{inputenc\}' main.tex
grep -nE '\\over\b' main.tex\textXX{...} over \XXshape ... \normalfont because the former auto-restores font state on }.&=& columns to &= (eqnarray has 3 columns, align has 2). Add \usepackage{amsmath} to preamble if absent. Preserve \nonumber and equation labels.fontspec.Before:
\begin{eqnarray}
a &=& b + c \\
&=& d \nonumber
\end{eqnarray}After:
\begin{align}
a &= b + c \\
&= d \nonumber
\end{align}Source: amsldoc PDF (amsmath documentation), §3.
{\bf ...} rewritingA naive regex rewrite of {\\bf (.+?)} is incorrect — nested braces aren't matched. Algorithm:
{\bf (or other declaration). The { opened the group.} closes the group.{\bf X} with \textbf{X}.\par or blank line), use the declaration form {\bfseries X} instead — \textbf doesn't allow paragraphs.If the document is large and a script is wanted, write a small Python preprocessor (call from scripts/):
# scripts/modernize_font_switches.py — illustrative
import re, sys
SHORT_TO_LONG = {'bf':'textbf','it':'textit','sl':'textsl','sc':'textsc',
'rm':'textrm','sf':'textsf','tt':'texttt'}
# Match {\bf ...} or {\it ...} balanced. Use the `regex` package (pip install regex)
# for recursive-pattern matching, or write a small stateful walker.(Don't run such a script on a paper without diffing the output. False positives in math mode or comments are common.)
/academic-latex:verify-visual with the original as reference. Spacing should be the same or slightly better; substantive layout shifts indicate an over-aggressive rewrite.For mappings not in the table above (e.g., obscure plain-TeX primitives, custom legacy macros, or deprecated package options), delegate to /academic-latex:docs-lookup. Cite the exact source for any non-trivial mapping you propose.
2026-05-09 — TeX FAQ, LaTeX2e usrguide, latexref.xyz, amsldoc.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.