Provando a mettere un \null all’inizio della \vbox usata dentro \@topnewpage
e poi un altro prima dello spazio verticale di \@makeschapterhead sono riuscito nell’intento! 😀
Ovviamente sono andato per tentativi, non ho capito perché funziona…
Ecco un ECM:
`% !TEX program = pdflatex
\documentclass{book}
\makeatletter
\long\def \@topnewpage [#1]{%
\@nodocument
\@next\@currbox\@freelist{}{}%
\global \setbox\@currbox
\color@vbox
\normalcolor
\vbox {%
\null
\hsize\textwidth
\@parboxrestore
\col@number \@ne
#1%
\vskip -\dbltextfloatsep
}%
\color@endbox
\ifdim \ht\@currbox>\textheight
\ht\@currbox \textheight
\fi
\global \count\@currbox \tw@
\@tempdima -\ht\@currbox
\advance \@tempdima -\dbltextfloatsep
\global \advance \@colht \@tempdima
\ifx \@dbltoplist \@empty
\else
\@latexerr{Float(s) lost}\@ehb
\let \@dbltoplist \@empty
\fi
\@cons \@dbltoplist \@currbox
\global \@dbltopnum \m@ne
\ifdim \@colht<2.5\baselineskip
\@latex@warning@no@line {Optional argument of \noexpand\twocolumn
too tall on page \thepage}%
\@emptycol
\if@firstcolumn
\else
\@emptycol
\fi
\else
\global \vsize \@colht
\global \@colroom \@colht
\@floatplacement
\fi
}
\def\@makeschapterhead#1{%
\null
\vspace*{50\p@}%
{\parindent \z@ \raggedright
\normalfont
\interlinepenalty\@M
\Huge \bfseries #1\par\nobreak
\vskip 40\p@
}}
\makeatother
\usepackage{lipsum}
\begin{document}
\clearpage
\makeatletter
\@makeschapterhead{Pluto}
\lipsum
\twocolumn[\@makeschapterhead{Pippo}]
\makeatother
\lipsum
\end{document}`
In ogni caso userò imakeidx è indubbiamente la soluzione più semplice!
Ciao ciao.
Fra