Come viene creato il sommario.

  • Creatore
    Topic
  • #18672
    Up
    0
    Down
    ::


    Sto cercando di capire come effettivamente viene creato il sommario per poter poi nitervenire e modificare ciò che mi serve.

    alla chiamata di \tableofcontents nella classe che sto modificando (articoli delle Wiley per Phisica Status solidi A) corrisponde:
    `
    \\newcommand\tableofcontents{%
    \@starttoc{toc}\contentsname%
    }
    `
    che richiama il comando `\@starttoc ` passando due variabili toc e \contentsname.

    \contentsname è definito come
    `
    \newcommand\contentsname{Contents}
    `
    e quindi viene passato il valore “Contents”

    Veniamo quindi alla definizione di starttoc che è definito come:

    `
    \def\@starttoc#1#2{\begingroup
    \setTrue{#1}%
    \par\removelastskip\vskip\z@skip
    \@startsection{}{\@M}{\z@}{-3.5ex \@plus -1ex \@minus -.2ex}%
    {2.3ex \@plus.2ex}{\contentsnamefont}{#2}%
    \ifx\contentsname#2%
    \else \addcontentsline{toc}{section}{#2}\fi
    \makeatletter
    \@input{\jobname.#1}%
    \if@filesw
    \@xp\newwrite\csname tf@#1\endcsname
    \immediate\@xp\openout\csname tf@#1\endcsname \jobname.#1\relax
    \fi
    \global\@nobreakfalse \endgroup
    \addvspace{32\p@\@plus14\p@}%
    \let\tableofcontents\relax
    }
    `
    e qui cominciano le note dolenti.
    \starttoc richiede due variabili (toc e Contents)
    comincia con l’eseguire \setTrue{toc}
    e in base alla sua definizione

    `
    \newcommand{\setTrue}[1]{%
    \expandafter\let\csname ?@#1\endcsname\@True
    `
    crea il comando \@toctrue che può essere usato nelle condizioni \if \fi
    crea un nuovo paragrafo, rimuove gli ultimi skip (ciò rimuove eventuali glue presenti) e crea uno skip di \z (cioé 0 pt) è giusto?
    Richiama dunque il comando \@startsection con le sue 6 variabili (ci torniamo dopo).
    Poi abbiamo una scelta condizionale
    se il contenuto di \contentsname è uguale a quello dell’argomento #2 (come nel nostro caso) allora non far nulla altrimenti aggiungi una linea nel file toc.
    abilitiamo @ e inseriamo il file nome del file.toc
    il successivo \if mi è oscuro lo ammetto. 😳
    Chiude poi il gruppo, aggiunge uno spazio con la tolleranza e rende il comando \tableofcontents equivalente a \relax.

    Torniamo alla definizione di \@startsection che è definito come:

    `
    \def\@startsection#1#2#3#4#5#6{%
    \if@noskipsec \leavevmode \fi
    \par \@tempskipa #4\relax
    \@afterindenttrue
    \ifdim \@tempskipa <\z@ \@tempskipa -\@tempskipa \@afterindentfalse\fi \if@nobreak \everypar{}\else \addpenalty\@secpenalty\addvspace\@tempskipa\fi \@ifstar{\@dblarg{\@sect{#1}{\@m}{#3}{#4}{#5}{#6}}}% {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}% } ` E qui sono completamente perso. Capisco che il comando vuole 6 parametri... che sono {} \@M \z@ {-3.5ex \@plus -1ex \@minus -.2ex} {2.3ex \@plus.2ex}{\contentsnamefont} che vengono utilizzati dal comando ` \def\@sect#1#2#3#4#5#6[#7]#8{% \ifnum #2>\c@secnumdepth
    \let\@svsec\@empty
    \else
    \refstepcounter{#1}%
    \protected@edef\@svsec{\@seccntformat{#1}\relax}%
    \fi
    \@tempskipa #5\relax
    \ifdim \@tempskipa>\z@
    \begingroup
    #6{%
    \@hangfrom{\hskip #3\relax\@svsec}%
    \interlinepenalty \@M #8\@@par}%
    \endgroup
    \csname #1mark\endcsname{#7}%
    \addcontentsline{toc}{#1}{%
    \ifnum #2>\c@secnumdepth \else
    \if@trailingperiod
    \protect\numberline{\csname the#1\endcsname.}%
    \else
    \protect\numberline{\csname the#1\endcsname}%
    \fi
    \fi
    #8}%
    \else
    \def\@svsechd{%
    #6{\hskip #3\relax
    \@svsec #8}%
    \csname #1mark\endcsname{#7}%
    \addcontentsline{toc}{#1}{%
    \ifnum #2>\c@secnumdepth \else
    \if@trailingperiod
    \protect\numberline{\csname the#1\endcsname.}%
    \else
    \protect\numberline{\csname the#1\endcsname}%
    \fi
    \fi
    #8}}%
    \fi
    \@xsect{#5}}`
    Ma faccio fatica a seguire il funzionamento. Vorrei capire per poi poter cambiare la formattazione. (Ho bisogno di fare due indici con stili diversi, uno per l’interno della rivista e uno per la quarta di copertina).
    Vi ringrazio per l’aiuto. Tra qualche giorno vi sottoporrò una bozza della rivista.

Visualizzazione 4 filoni di risposte
  • Autore
    Risposte
    • #18673
      Up
      0
      Down
      ::

      Sto cercando di capire come effettivamente viene creato il sommario per poter poi nitervenire e modificare ciò che mi serve.

      alla chiamata di \tableofcontents nella classe che sto modificando (articoli delle Wiley per Phisica Status solidi A) corrisponde:
      `\\newcommand\tableofcontents{%
      \@starttoc{toc}\contentsname%
      }`
      che richiama il comando `\@starttoc ` passando due variabili toc e \contentsname.

      \contentsname è definito come
      `\newcommand\contentsname{Contents}
      `e quindi viene passato il valore “Contents”

      Veniamo quindi alla definizione di starttoc che è definito come:
      `\def\@starttoc#1#2{\begingroup
      \setTrue{#1}%
      \par\removelastskip\vskip\z@skip
      \@startsection{}{\@M}{\z@}{-3.5ex \@plus -1ex \@minus -.2ex}%
      {2.3ex \@plus.2ex}{\contentsnamefont}{#2}%
      \ifx\contentsname#2%
      \else \addcontentsline{toc}{section}{#2}\fi
      \makeatletter
      \@input{\jobname.#1}%
      \if@filesw
      \@xp\newwrite\csname tf@#1\endcsname
      \immediate\@xp\openout\csname tf@#1\endcsname \jobname.#1\relax
      \fi
      \global\@nobreakfalse \endgroup
      \addvspace{32\p@\@plus14\p@}%
      \let\tableofcontents\relax
      }`
      e qui cominciano le note dolenti.
      \starttoc richiede due variabili (toc e Contents)
      comincia con l’eseguire \setTrue{toc}
      e in base alla sua definizione
      `\newcommand{\setTrue}[1]{%
      \expandafter\let\csname ?@#1\endcsname\@True
      `crea il comando \@toctrue che può essere usato nelle condizioni \if \fi

      Non direi. Crea il comando \?@toc che vale \@True; il comando \?@toc non può essere usato direttamente, ma solo come \csname ?@toc\endcsname

      crea un nuovo paragrafo, rimuove gli ultimi skip (ciò rimuove eventuali glue presenti) e crea uno skip di \z (cioé 0 pt) è giusto?

      Rimuove l’ultimo spazio verticale; se si sono usati sempre comandi \addvspace, vengono rimossi tutti. Se ne crea uno nullo per creare un punto dove dividere le pagine.

      Richiama dunque il comando \@startsection con le sue 6 variabili (ci torniamo dopo).
      Poi abbiamo una scelta condizionale
      se il contenuto di \contentsname è uguale a quello dell’argomento #2 (come nel nostro caso) allora non far nulla altrimenti aggiungi una linea nel file toc.
      abilitiamo @ e inseriamo il file nome del file.toc
      il successivo \if mi è oscuro lo ammetto. 😳

      Serve per cominciare a scrivere il file .toc; lo switch è falso se si è dato il comando \nofiles.

      Chiude poi il gruppo, aggiunge uno spazio con la tolleranza e rende il comando \tableofcontents equivalente a \relax.

      Torniamo alla definizione di \@startsection che è definito come:
      `\def\@startsection#1#2#3#4#5#6{%

      }`
      E qui sono completamente perso. Capisco che il comando vuole 6 parametri… che sono {} \@M \z@ {-3.5ex \@plus -1ex \@minus -.2ex} {2.3ex \@plus.2ex}{\contentsnamefont}
      che vengono utilizzati dal comando
      `\def\@sect#1#2#3#4#5#6[#7]#8{%

      \@xsect{#5}}`
      Ma faccio fatica a seguire il funzionamento. Vorrei capire per poi poter cambiare la formattazione. (Ho bisogno di fare due indici con stili diversi, uno per l’interno della rivista e uno per la quarta di copertina).
      Vi ringrazio per l’aiuto. Tra qualche giorno vi sottoporrò una bozza della rivista.

      Lascia perdere di seguire l’espansione di \@startsection, l’importante è sapere che cosa se ne fa dei suoi argomenti.
      `\@startsection{nome}{livello}{rientro}{spazio prima}{spazio dopo}{stile}`
      “nome” è un contatore, nel nostro caso infatti è lasciato vuoto

      “livello” è il livello della sezione (1 per \section, 2 per \subsection, eccetera); loro lo impostano a 10000, in modo che non sia influenzabile da eventuali modifiche di secnumdepth o tocdepth da parte degli autori dei documenti: sarà sempre più di quello che a un autore possa venire in mente di fissare

      “rientro” è la distanza dell’intestazione dal margine sinistro

      “spazio prima” è lo spazio bianco che precede l’intestazione; se l’argomento passato è negativo, come in questo caso, il rientro è annullato nel primo capoverso che segue

      “spazio dopo” è lo spazio bianco che segue l’intestazione; però, se l’argomento è negativo, l’intestazione sarà “in corpo” e non su una riga a sé stante; non è questo il caso

      “stile” sono le istruzioni per la composizione del testo dell’intestazione, di solito comandi per la scelta di varianti del carattere da usare

      Quello che sembra un “settimo” argomento a \@startsection è in realtà l’argomento non opzionale per \@sect, per la precisione l’ottavo, che contiene l’intestazione vera e propria. Non serve sapere che cosa fa \@sect, solo che si occupa di comporre l’intestazione secondo le indicazioni fornite da \@startsection

      Ciò che ti conviene fare, secondo me, è definire un comando \generaltableofcontents, sulla linea di questo, con le opportune modifiche.

      Ciao
      Enrico

    • #18674
      Up
      0
      Down
      ::

      Ciò che ti conviene fare, secondo me, è definire un comando \generaltableofcontents, sulla linea di questo, con le opportune modifiche.

      E’ quello che ho iniziato a fare, ma non riesco esattamente a capire dove mettere le mani.
      Se volessi ad esempio modificare lo stile delle varie entry, devo agire su quello che sono definite \l@section \l@subsection ecc…?

    • #18675
      Up
      0
      Down
      ::


      Mi sono in parte risposto da solo.

      Ho visto che ci sono dei comandi che corrispondono alle diverse entry del file toc e sono definite nel seguente modo:
      `
      \newcommand*\l@section[2]{%
      \ifnum \c@tocdepth >\z@
      \addpenalty\@secpenalty
      \addvspace{0em \@plus\p@}%
      \setlength\@tempdima{1.5em}%
      \begingroup
      \parindent \z@ \rightskip \@pnumwidth
      \parfillskip -\@pnumwidth
      \leavevmode \bfseries
      \advance\leftskip\@tempdima
      \hskip -\leftskip
      #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
      \endgroup
      \fi}
      `
      e fin qui tutto ok. Pensavo dunque nel nuovo stile di procedere alla ridefinizione di questi comandi in modo che per il secondo toc mi utilizzi lo stile scelto.
      Il problema nasce dal fatto che mi genera un errore che non capisco.
      ho ridefinito il comando in questo modo all’interno del comando \tableofcontentsalternativa
      `
      \def\l@section#1#2{….}
      `
      ma compilando mi dà il seguente errore:

      ! Illegal parameter number in definition of \tableofcontentsalternativa

      il comando è definito adesos per semplicità:
      `
      \def\l@section#1#2{}
      \@starttoc{toc}\contentsname%
      `

    • #18676
      Up
      0
      Down
      ::

      Mi sono in parte risposto da solo.

      Ho visto che ci sono dei comandi che corrispondono alle diverse entry del file toc e sono definite nel seguente modo:
      `
      \newcommand*\l@section[2]{%
      \ifnum \c@tocdepth >\z@
      \addpenalty\@secpenalty
      \addvspace{0em \@plus\p@}%
      \setlength\@tempdima{1.5em}%
      \begingroup
      \parindent \z@ \rightskip \@pnumwidth
      \parfillskip -\@pnumwidth
      \leavevmode \bfseries
      \advance\leftskip\@tempdima
      \hskip -\leftskip
      #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
      \endgroup
      \fi}
      `
      e fin qui tutto ok. Pensavo dunque nel nuovo stile di procedere alla ridefinizione di questi comandi in modo che per il secondo toc mi utilizzi lo stile scelto.
      Il problema nasce dal fatto che mi genera un errore che non capisco.
      ho ridefinito il comando in questo modo all’interno del comando \tableofcontentsalternativa
      `
      \def\l@section#1#2{….}
      `
      ma compilando mi dà il seguente errore:

      ! Illegal parameter number in definition of \tableofcontentsalternativa

      il comando è definito adesos per semplicità:
      `\def\l@section#1#2{}
      \@starttoc{toc}\contentsname%`

      `\def\l@section##1##2{…}%`
      Quando scrivi una definizione all’interno di una definizione, i parametri vanno indicati raddoppiando i segni #; così è chiaro se ti riferisci ai parametri per quella macro o a quelli della macro “genitrice”.

      Meglio però se dai un’occhiata al pacchetto tocloft. Attento a racchiudere tutta la faccenda in un gruppo, se vuoi mantenere poi i valori originali dei vari comandi che ridefinisci.

      Ciao
      Enrico

    • #18677
      Up
      0
      Down
      ::


      Ottimo grazie!!!
      Avevo dato un’occhiata, ma volevo ridurre al minimo il numero di pacchetti e imparare a fare le cose con le mie mani…

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

Go to top