problema con \@startsection

  • Creatore
    Topic
  • #53337
    Up
    0
    Down
    ::


    per strutturare un certo testo ho scritto questo codice, ripreso dalle pagine 27 e segg. del TLC2 (riporto l’intero codice di test):

    `
    \documentclass{article}
    \usepackage{lipsum}

    \setcounter{secnumdepth}{2}
    \makeatletter
    \newcounter{capo}
    \renewcommand{\thecapo}{\arabic{capo}}
    \newcommand{\capo}{\@startsection{capo}{1}{1em}{\baselineskip}{-2em}{\normalfont\normalsize\bfseries}}
    \newcounter{punto}
    \renewcommand{\thepunto}{\thecapo.\arabic{punto}}
    \newcommand{\punto}{\@startsection{punto}{2}{1em}{0pt}{-1em}{\normalfont\normalsize\itshape}}
    \makeatother

    \begin{document}
    \capo{premessa}\lipsum[1]
    \punto{antefatto}\lipsum[2]
    \punto{fatto}\lipsum[3]
    \punto{postfatto}\lipsum[4]
    \capo{analisi}\lipsum[2]
    \capo{sintesi}\lipsum[3]
    \end{document}
    `

    ovviamente la parte di codice in questione è quella compresa tra \makeatletter e \makeatother. Il problema è che il testo dei capi e dei punti risulta ripetuto, più o meno così:

    1 premessapremessa Lorem ipsum dolor sit amet…
    1.1 antefattoantefatto Nam dui ligula…
    1.2 fattofatto Nulla malesuada…

    se invece uso la starred form le intestazioni non sono più ripetute, ma scompaiono i numeri:
    `

    \capo*{premessa}\lipsum[1]
    \punto*{antefatto}\lipsum[2]
    \punto*{fatto}\lipsum[3]
    \punto*{postfatto}\lipsum[4]

    `

    premessa Lorem ipsum …
    antefatto Nam dui ligula…
    fatto Nulla malesuada…

    io vorrei sia i numeri che le intestazioni riportate IL GIUSTO NUMERO di volte.

    idee? suggerimenti?

    grazie, ciao.

Visualizzazione 4 filoni di risposte
  • Autore
    Risposte
    • #53338
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Non ti basterebbe rendere \capo equivalente a \section e \punto equivalente a \subsection?
        `
        \let\capo\section
        \let\punto\subsection
        `

        Capisco che non fanno la stessa cosa, ma le definizioni originali nel file article.cls sono
        `
        \newcommand\section{\@startsection {section}{1}{\z@}%
        {-3.5ex \@plus -1ex \@minus -.2ex}%
        {2.3ex \@plus.2ex}%
        {\normalfont\Large\bfseries}}
        \newcommand\subsection{\@startsection{subsection}{2}{\z@}%
        {-3.25ex\@plus -1ex \@minus -.2ex}%
        {1.5ex \@plus .2ex}%
        {\normalfont\large\bfseries}}
        `

        Caso mai, io copierei queste due definizioni aggiustando i valori, ma non lo \z@, e cambiando i segni. Suppongo che tu voglia una spaziatura verticale prima ci \capo e di \unto, ma tu voglia continuare il testo del capo e del punto sulla stessa riga.
        Confronta i valori degli spazi nella classe article.cls per i successivi comandi di sezionamento; lo \z@ serve per stabilire la rientranza del titolino, ed è giusto che normalmente sia nulla. In article.cls solo il \subparagraph ha una rientranza di \parindent. ma per le due gomme successive il segno negativo per la prima vuol dire di lasciare uno spazio sopra, e un segno positivo nella seconda vuol dire di lasciare uno spazio verticale sotto al titolino. per la seconda un valore positivo indica di continuare sulla stessa riga lasciando uno spazio orizzontale.

        Dopo di che gli altri comandi che hai usato tu per caratterizzare il font del titolino vanno bene

      • #53339
        Up
        0
        Down
        ::

        per strutturare un certo testo ho scritto questo codice, ripreso dalle pagine 27 e segg. del TLC2 (riporto l’intero codice di test):

        `
        \documentclass{article}
        \usepackage{lipsum}

        \setcounter{secnumdepth}{2}
        \makeatletter
        \newcounter{capo}
        \renewcommand{\thecapo}{\arabic{capo}}
        \newcommand{\capo}{\@startsection{capo}{1}{1em}{\baselineskip}{-2em}{\normalfont\normalsize\bfseries}}
        \newcounter{punto}
        \renewcommand{\thepunto}{\thecapo.\arabic{punto}}
        \newcommand{\punto}{\@startsection{punto}{2}{1em}{0pt}{-1em}{\normalfont\normalsize\itshape}}
        \makeatother

        \begin{document}
        \capo{premessa}\lipsum[1]
        \punto{antefatto}\lipsum[2]
        \punto{fatto}\lipsum[3]
        \punto{postfatto}\lipsum[4]
        \capo{analisi}\lipsum[2]
        \capo{sintesi}\lipsum[3]
        \end{document}
        `

        ovviamente la parte di codice in questione è quella compresa tra \makeatletter e \makeatother. Il problema è che il testo dei capi e dei punti risulta ripetuto, più o meno così:

        1 premessapremessa Lorem ipsum dolor sit amet…
        1.1 antefattoantefatto Nam dui ligula…
        1.2 fattofatto Nulla malesuada…

        se invece uso la starred form le intestazioni non sono più ripetute, ma scompaiono i numeri:
        `

        \capo*{premessa}\lipsum[1]
        \punto*{antefatto}\lipsum[2]
        \punto*{fatto}\lipsum[3]
        \punto*{postfatto}\lipsum[4]

        `

        premessa Lorem ipsum …
        antefatto Nam dui ligula…
        fatto Nulla malesuada…

        io vorrei sia i numeri che le intestazioni riportate IL GIUSTO NUMERO di volte.

        idee? suggerimenti?

        grazie, ciao.

        Devi definire anche \capomark e \puntomark; aggiungi prima di \makeatother la magia
        `\let\capomark\@gobble \let\puntomark\@gobble`
        Ma perché non usare titlesec e modificare \section e \subsection?

        Ciao
        Enrico

      • #53340
        Up
        0
        Down
        ::


        OldClaudio ha scritto

        Non ti basterebbe rendere \capo equivalente a \section e \punto equivalente a \subsection?

        egreg9 ha scritto:

        Ma perché non usare titlesec e modificare \section e \subsection?

        si, forse è una soluzione più praticabile per un neofita. ci farò delle prove. grazie.

        egreg9 ha scritto:

        … aggiungi prima di \makeatother la magia …

        la magia funziona. potresti dirmi in due parole cosa fa il comando \@gobble ? googlando non sono riuscito a trovare nulla di immediatamente esplicativo. Grazie.

      • #53341
        Up
        0
        Down
        ::

        OldClaudio ha scritto

        Non ti basterebbe rendere \capo equivalente a \section e \punto equivalente a \subsection?

        egreg9 ha scritto:

        Ma perché non usare titlesec e modificare \section e \subsection?

        si, forse è una soluzione più praticabile per un neofita. ci farò delle prove. grazie.

        egreg9 ha scritto:

        … aggiungi prima di \makeatother la magia …

        la magia funziona. potresti dirmi in due parole cosa fa il comando \@gobble ? googlando non sono riuscito a trovare nulla di immediatamente esplicativo. Grazie.

        Fra i suoi vari compiti il comando \@startsection ha la responsabilità di passare il titolo a un’altra macro in modo che questo titolo possa essere usato per la testatina. Lo fa eseguendo l’istruzione
        `\csname mark\endcsname{}`
        dove è quello che passi come primo argomento a \@startsection e è l’argomento (apparente) al comando che stai definendo tramite \@startsection. Vediamolo nel caso di \capo: la chiamata \capo{Premessa} diventa
        `\@startsection{capo}{1}{1em}{\baselineskip}{-2em}{\normalfont\normalsize\bfseries}{Premessa}`
        e quindi, fra le altre cose, viene eseguito
        `\csname capomark\endcsname{Premessa}`
        La costruzione \csname capomark\endcsname è equivalente a \capomark se questo comando è definito, a \relax se \capomark non è definito. Per questo trovavi il “raddoppiamento”: nel tuo codice non c’era alcuna definizione di \capomark.

        La soluzione di scrivere \let\capomark\@gobble è quasi equivalente a
        `\newcommand{\capomark}[1]{}`
        cioè \capomark semplicemente butta via il suo argomento. Infatti la definizione di \@gobble è
        `\newcommand{\@gobble}[1]{}`
        Con \let invece di \newcommand si risparmia un po’ di memoria.

        Nel nucleo di LaTeX si trova infatti
        `\let\sectionmark\@gobble
        \let\subsectionmark\@gobble
        \let\subsubsectionmark\@gobble
        \let\paragraphmark\@gobble
        \let\subparagraphmark\@gobble`
        Sono poi le classi a definire come preferiscono i comandi \sectionmark e così via. La classe article definisce solo \sectionmark.

        Ciao
        Enrico

      • #53342
        Up
        0
        Down
        ::

        Grazie!. Enrico, sei di una cortesia e di una disponibilità disarmante. A buon rendere.

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

    Go to top