Questo è l’esempio minimo che genera l’errore.
`
\documentclass[a4paper]{article}
\makeatletter
\def\contenutotoc{%
\begingroup
\makeatletter
\@input{\jobname.abc}%
\if@filesw
\expandafter\newwrite\csname tf@abc\endcsname
\immediate\openout \csname tf@abc\endcsname \jobname.abc\relax
\fi
\@nobreakfalse
\endgroup}
\def\chiudiscrittura{\closeout\csname tf@abc\endcsname}
\def\cambiasezionetoc{
\def\oldesection{\relax}
\let\oldsection=\section
\def\seziones##1{\oldsection*{##1}}
\def\sezione##1{\oldsection{##1}
\relax
\immediate\write \csname tf@abc\endcsname{\hskip 7pt \thesection. ##1\hfill \thepage\mbox{\quad}\par
}}
\def\section{\@ifstar\seziones\sezione}
\def\oldsubsection{\relax}
\let\oldsubsection=\subsection
\def\subsection##1{\oldsubsection{##1}
\immediate\write \csname tf@abc\endcsname{\hskip 13pt \thesubsection. ##1\hfill\thepage\mbox{\quad}\par}
}
}
\def\ripristinasezione{
\let\section=\oldsection%
\let\subsection=\oldsubsection%
}
\def\minisommario{
\cambiasezionetoc
\hrule
\vskip 5pt
\textsc{Table of Contents}\par
\contenutotoc\par
\vskip 7pt
\hrule
\vskip 15pt plus 5pt minus 3pt
}
\makeatother
\newcommand*\envname[1]{\textsf{#1}}
\begin{document}
\minisommario
\section{\envname{Prova}}
\section{prova ancora}
\end{document}`
Se elimino \immediate funziona, ma sbaglia i numeri delle sezioni