Titolo indice analitico non allineato con gli altri capitoli

  • Creatore
    Topic
  • #75728
    Up
    0
    Down
    ::


    Ciao a tutti,

    sto usando il pacchetto makeidx. E purtroppo finora non mi sono mai preoccupato del layout dell’indice analitico.
    Mi sono accorto che il titolo dell’indice analitico non è allineato agli altri titoli di capitolo, ma è più in alto, forse per avere più spazio per le voci.
    Lo si può vedere nell’esempio qua sotto.

    `% !TEX program = pdflatex

    \documentclass{book}

    \usepackage[showframe]{geometry}
    \usepackage{makeidx}
    \makeindex

    \begin{document}

    \mainmatter
    \chapter{TestTTTT}
    This \cite{Biccari_2008_proc} is a test\index{test}.

    \backmatter
    % bibliography
    \cleardoublepage
    \begin{thebibliography}{99}
    \bibitem{Biccari_2008_proc} \textsc{Biccari, F., Malerba, C., Mittiga, A.}, \textit{Metastability Effects in \textup{Cu$_2$O} Solar Cells}, in Proceedings of the 23rd European Photovoltaic Solar Energy Conference (2008), 583–587, doi: \texttt{10.4229/23rdEUPVSEC2008-1CV.2.54}.
    \end{thebibliography}

    % index
    \cleardoublepage
    \printindex

    \end{document}`

    Nel mio caso reale, ho ridefinito i titoli dei capitoli con titlesec in modo che numero e titolo siano sulla stessa riga e non ci sia alcun margine tra il titolo e il limite superiore della gabbia del testo. Purtroppo però il titolo dell’indice analitico finisce sopra la gabbia del testo!

    Siccome vorrei ottenere la parola “Index” esattamente come se fosse un titolo di capitolo normale, quello che chiedo è questo: c’è un modo semplice di risolvere la faccenda?

    Nel caso non si possa risolvere con titlesec, ho provato ad agire manualmente. Ho guardato dentro il file makeidx.sty ma non c’è molto,
    in pratica viene solo incluso il file .ind. Il resto sta nel file book.cls. (E già qui mi chiedo che senso allora ha il pacchetto makeidx…!)
    Il risultato è stato questo (ho messo un \vspace* per aggiustare le cose a occhio, il valore non va bene per l’esempio mostrato sopra):
    `\renewenvironment{theindex}
    {\if@twocolumn
    \@restonecolfalse
    \else
    \@restonecoltrue
    \fi
    \twocolumn[\vspace*{10\p@}\@makeschapterhead{\indexname}]%
    \@mkboth{\MakeUppercase\indexname}%
    {\MakeUppercase\indexname}%
    \thispagestyle{plain}\parindent\z@
    \parskip\z@ \@plus .3\p@\relax
    \columnseprule \z@
    \columnsep 35\p@
    \let\item\@idxitem}
    {\if@restonecol\onecolumn\else\clearpage\fi}`
    Fa quello che deve fare ma mi sembra veramente di stare esagerando…

    Grazie mille!

    Ciao ciao.
    Fra

Visualizzazione 6 filoni di risposte
  • Autore
    Risposte
    • #75729
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Il titolo dell’Indice analitico è composto con il comando \chapter*

        Gli altri titoli composti con \chapter* vengono bene?

        La tua configurazione di \titleformat{chapter} dovrebbe avere due campi una per le sezioni numerate e una per quelle non numerate; vedi se ti può servire.

      • #75730
        Up
        0
        Down
        ::


        Sì, gli altri capitoli creati con \chapter* vengono bene. Le due definizioni per i capitoli numerati e non-numerati le ho trovate solo nel pacchetto titletoc. Ma non titlesec.
        Questa è la sintassi del comando titleformat presa dalla documentazione di titlesec:
        `\titleformat{}[]{}{

        Comunque credo di aver capito dove sta il problema (difetto di LaTeX?). Guardate questo esempio minimo compilabile:

        `\documentclass{book}
        \usepackage{lipsum}
        \begin{document}
        \clearpage
        \makeatletter
        \@makeschapterhead{Pluto}
        \lipsum

        \twocolumn[\@makeschapterhead{Pippo}]
        \makeatother
        \lipsum
        \end{document}
        `

        Questo esempio minimo mostra che, dando il comando per stampare il titolo del capitolo all’interno dell’argomento opzionale di twocolum
        (cioè come avviene per l’indice analitico), viene mangiato da qualche parte dello spazio verticale che normalmente invece rimane.
        E questo crea la differenza di posizione del titolo del capitolo. Che ne pensate?

        Ciao ciao.
        Fra

      • #75731
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Sì, hai proprio messo il dito sulla piaga.

          Direi che il problema stia proprio nel fatto che con \twocolumn la parte che genera il titolo viene posta dentro un oggetto mobile che in qualche modo perde dello spazio verticale prima del titolo, per cui, quando l’oggetto a piena pagina viene inserito nella pagina a due colonne, mancando di quello spazio il titolo corrente appare più in alto.
          forse lo si può aggiustare modificando \@makeschapterhead, magari aggiungendogli solo un \hrule di altezza nulla prima degli spazi verticlali superiori. Domattina ci provo.

        • #75732
          Up
          0
          Down
          ::

          francesco.biccari” post=74865Sì, gli altri capitoli creati con \chapter* vengono bene. Le due definizioni per i capitoli numerati e non-numerati le ho trovate solo nel pacchetto titletoc. Ma non titlesec.
          Questa è la sintassi del comando titleformat presa dalla documentazione di titlesec:
          `\titleformat{}[]{}{

          Comunque credo di aver capito dove sta il problema (difetto di LaTeX?). Guardate questo esempio minimo compilabile:

          `\documentclass{book}
          \usepackage{lipsum}
          \begin{document}
          \clearpage
          \makeatletter
          \@makeschapterhead{Pluto}
          \lipsum

          \twocolumn[\@makeschapterhead{Pippo}]
          \makeatother
          \lipsum
          \end{document}
          `

          Questo esempio minimo mostra che, dando il comando per stampare il titolo del capitolo all’interno dell’argomento opzionale di twocolum
          (cioè come avviene per l’indice analitico), viene mangiato da qualche parte dello spazio verticale che normalmente invece rimane.
          E questo crea la differenza di posizione del titolo del capitolo. Che ne pensate?

          Ciao ciao.
          Fra

          È un problema noto. Se usi imakeidx non succede. 🙂

          Ciao
          Enrico

        • #75733
          Up
          0
          Down
          ::



          @Claudio
          . Sì, probabilmente un \null al posto giusto, metterebbe a posto le cose. Domani ci provo anch’io.


          @Enrico
          . Grazie per il suggerimento di imakeidx! Comunque se è un problema noto, perché non viene corretto? A scrivere un \null sono capace anch’io! 😀
          Se è per la retrocompatibilità perché non fanno come in mhchem, \documentclass[version2]{book}?

          Buonanotte!

          Ciao ciao.
          Fra

        • #75734
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::


            Non sono convinto che un \null sia sufficiente. Ho letto tutto il codice che sta dietro a \twocolumn[…]; di mezzo c’è un comando \@topnewpage che gioca molto con le scatole della lista dei float e con le altezze di queste scatole; temo che anche mettere un \null in più dentro \@makeschapterhead non serva a molto.
            Enrico mi ha preceduto a suggerirti imakeidx. Se non specifichi nessuna opzione né quando carichi il pacchetto nè quando usi il comando \makeindex, fa quasi esattamente quello che succede con la situazione preconfezionata da latex.ltx, book.cls, eccetera, ma è più flessibile nel caso di indici multipli e per il caso che si voglia usare uno file /ist diverso da quello di default. L’unica differenza è che compone direttamente l’indice analitico, senza dover ricorrere alla manfrina di eseguire pdflatex, poi eseguire makeindex, poi eseguire di nuovo pdflatex. Fa tutto da solo nella prima esecuzione di pdflatex.

            La differenza vera, e secondo me utilissima, è che si può specificare il numero di colonne (preimpostato a 2) ma le colonne sono ottenute con il pacchetto multicol che ha due pregi; non ricorre a \twocolumn e pareggia le colonne nell’ultima pagina. Te lo consiglio come pacchetto da preimpostare sempre in ogni classe; inizialmente non funzionava con la classe memoir, che ha i suoi sistemi per creare diversi indici analitici, ma Enrico è riuscito con un solo statement a far si che imakeidx funzioni anche con memoir.

          • #75735
            Up
            0
            Down
            ::


            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

        Visualizzazione 6 filoni di risposte
        • Devi essere connesso per rispondere a questo topic.

        Go to top