[Risolto] “secnumdepth” al posto dei “supersezionamenti”

  • Creatore
    Topic
  • #110503
    MatteoF
    Partecipante
      Up
      0
      Down
      ::


      In questi giorni mi sto concentrando sullo stile di pagina del mio documento latex…

      Riguardo le testatine, tramite il pacchetto ‘titlesec’ ho creato due diversi stili di pagina: uno per i capitoli non numerati, l’altro per quelli numerati (al fine di evitare il problema del fatidico “Capitolo 0”). Ho posto i relativi comandi \pagestyle in concomitanza ai comandi di “supersezionamento” propri della classe ‘book’ (\frontmatter \mainmatter \backmatter)

      Di seguito un emc funzionante:
      `% !TEX encoding = UTF-8 Unicode
      % !TEX TS-program = lualatex

      \documentclass[a4paper,11pt]{book}
      \usepackage{fontspec}
      \usepackage{polyglossia}
      \setmainlanguage[babelshorthands]{italian}
      \usepackage{microtype}
      \usepackage[pagestyles,clearempty]{titlesec}
      \usepackage{lipsum} % testo lorem ipsum

      % impostazioni stile di pagina
      \assignpagestyle{\chapter}{empty}

      \newpagestyle{frontback}[\scshape]%
      {\sethead[\thepage][][\chaptertitle]{\chaptertitle}{}{\thepage}}
      \newpagestyle{main}[\scshape]%
      {\sethead[\thepage][][\chaptername\,\thechapter\quad\chaptertitle]%
      {\thesection\quad\sectiontitle}{}{\thepage}}

      \begin{document}

      \frontmatter
      \pagestyle{frontback}

      \tableofcontents

      \chapter{Sommario}
      \lipsum[1]

      \chapter{Introduzione}
      \lipsum[1-4]

      \subsubsection{La correttezza delle implicazioni}
      \lipsum[1-6]

      \mainmatter
      \pagestyle{main}

      \chapter{Considerazioni generali}
      \lipsum[1]

      \section{La teoria A}
      \lipsum[1]

      \section{La teoria B}
      \lipsum[1]

      \section{La teoria C}
      \lipsum[1]

      \subsection{Particolarità della teoria C}
      \lipsum[1]

      \subsection{Limiti della teoria C}
      \lipsum[1]

      \section{La teoria D}
      \lipsum[1]

      \chapter{Considerazioni particolari}
      \lipsum[1-2]

      \section{La teoria E}
      \lipsum[1]

      \section{La teoria F}
      \lipsum[1]

      \subsection{Limiti della teoria F}
      \lipsum[1]

      \section{La teoria G}
      \lipsum[1]

      \backmatter
      \pagestyle{frontback}

      \chapter{Conclusioni}
      \lipsum[1-11]

      \end{document}`

      Poiché non mi piace tanto l’impostazione, un po’ datata, dei numeri romani nei capitoli introduttivi, ho messo in pratica quanto suggerito nella Guida GuIT a pag. 636 (§ 29.3 Suddivisione del testo e indici), agendo sul contatore ‘secnumdepth’.

      Dunque, ho sostituito i comandi di “supersezionamento” nel modo seguente:
      `% !TEX encoding = UTF-8 Unicode
      % !TEX TS-program = lualatex

      \documentclass[a4paper,11pt]{book}
      \usepackage{fontspec}
      \usepackage{polyglossia}
      \setmainlanguage[babelshorthands]{italian}
      \usepackage{microtype}
      \usepackage[pagestyles,clearempty]{titlesec}
      \usepackage{lipsum} % testo lorem ipsum

      % impostazioni stile di pagina
      \assignpagestyle{\chapter}{empty}

      \newpagestyle{frontback}[\scshape]%
      {\sethead[\thepage][][\chaptertitle]{\chaptertitle}{}{\thepage}}
      \newpagestyle{main}[\scshape]%
      {\sethead[\thepage][][\chaptername\,\thechapter\quad\chaptertitle]%
      {\thesection\quad\sectiontitle}{}{\thepage}}

      \begin{document}
      %\pagestyle{main} % impostazione del solo stile `main'

      \setcounter{secnumdepth}{-2}
      \pagestyle{frontback}

      \tableofcontents

      \chapter{Sommario}
      \lipsum[1]

      \chapter{Introduzione}
      \lipsum[1-4]

      \subsubsection{La correttezza delle implicazioni}
      \lipsum[1-6]

      \setcounter{secnumdepth}{2}
      \pagestyle{main}

      \chapter{Considerazioni generali}
      \lipsum[1]

      \section{La teoria A}
      \lipsum[1]

      \section{La teoria B}
      \lipsum[1]

      \section{La teoria C}
      \lipsum[1]

      \subsection{Particolarità della teoria C}
      \lipsum[1]

      \subsection{Limiti della teoria C}
      \lipsum[1]

      \section{La teoria D}
      \lipsum[1]

      \chapter{Considerazioni particolari}
      \lipsum[1-2]

      \section{La teoria E}
      \lipsum[1]

      \section{La teoria F}
      \lipsum[1]

      \subsection{Limiti della teoria F}
      \lipsum[1]

      \section{La teoria G}
      \lipsum[1]

      \setcounter{secnumdepth}{-2}
      \pagestyle{frontback}

      \chapter{Conclusioni}
      \lipsum[1-11]

      \end{document}`

      ma così facendo i marcatori delle testatine agiscono in modo anomalo e non vengono seguite le impostazioni di stile definite nel preambolo.

      Ho fatto diverse prove:
      – modificando l’ordine di chiamata dei comandi ‘setcounter’ e ‘pagestyle’ il risultato non cambia;
      – impostando un solo stile di pagina all’inizio del documento i marcatori agiscono in modo ancora diverso (si provi a decommentare \pagestyle{main} posto dopo \begin{document});
      – caricando ‘fancyhdr’ (dunque utilizzando i comandi \leftmark e \rightmark) e impostando un solo stile di pagina all’inizio del documento funziona tutto correttamente, ma se creo diversi stili e li richiamo all’interno del documento (come vorrei fare con ‘titlesec’) anche in questo caso il funzionamento dei marcatori non è quello atteso;
      – nessun problema se si utilizza lo stile predefinito della classe in uso (dunque se non si effettua alcuna personalizzazione).

      Forse ho inteso male io l’utilizzo del contatore ‘secnumdepth’ come sostituto dei “supersezionamenti”?

      Grazie
      Matteo

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


          Matteo, l’approccio, in teoria è giusto, in pratica è sbagliato.

          Devi solo ridefinire \frontmatter, togliendo \pagenumberng{roman} e \mainmatter togliendo \pagenumbering{arabic}.
          Il discorso testatine e indici è gestito da quelle due macro semplicemente controllando lo swithch \if@mainmatter.

          Vado a controllare quanto c’è scritto nella guida, ma temo che si sia omesso di precisare che quanto suggerito vale solo per le classi che non hanno le definizioni dei supersezionamenti; o forse c’è scritto, ma non è abbastanza in evidenza.
          Claudio

        • #110505
          MatteoF
          Partecipante
            Up
            0
            Down
            ::

            OldClaudio” post=110716Devi solo ridefinire \frontmatter, togliendo \pagenumberng{roman} e \mainmatter togliendo \pagenumbering{arabic}.
            Il discorso testatine e indici è gestito da quelle due macro semplicemente controllando lo swithch \if@mainmatter.

            Riguardo l’opportunità di ridefinire i comandi (qualunque essi siano), al fine di modificarne il comportamento in base alle proprie esigenze, nulla da eccepire… Il problema è saperlo fare 😀 speravo di cavarmela con una sola riga di codice…

            Ma a questo punto, volendo provare a “sporcarsi le mani”, come faccio a conoscere il codice delle macro dei vari comandi di latex?

            OldClaudio” post=110716Vado a controllare quanto c’è scritto nella guida, ma temo che si sia omesso di precisare che quanto suggerito vale solo per le classi che non hanno le definizioni dei supersezionamenti; o forse c’è scritto, ma non è abbastanza in evidenza.

            La Guida suggerisce di agire sul contatore secnumdepth al fine di replicare il funzionamento dei “supersezionamenti”, qualora questi comandi non siano disponibili (in base, quindi, alla classe utilizzata). La mia “interpretazione estensiva” è stata quella di considerare non solo la possibilità, bensì la volontà di utilizzare tali comandi, a maggior ragione considerando che non ho avuto problemi ad utilizzare secnumdepth pur utilizzando la classe book, fintanto che non abbia modificato lo stile di pagina.
            Nella mia ignoranza, sembrerebbe un problema di interazione con la personalizzazione degli stili di pagina…

          • #110506
            OldClaudio
            Partecipante
              Up
              0
              Down
              ::


              Non è difficile scoprire che cosa modificare e come.

              Quale classe sto usando? book. Allora cerco il file book.cls nella mia installazione del sistema TeX.
              Lo trovo in …/texmf-dist/tex/latex/base/

              Lo apro e vedo come sono definite le macro da modificare; avendole trovate, le copio e le incollo nel mio preambolo.
              Vediamo: `\newcommand\frontmatter{%
              \cleardoublepage
              \@mainmatterfalse
              \pagenumbering{roman}}
              \newcommand\mainmatter{%
              \cleardoublepage
              \@mainmattertrue
              \pagenumbering{arabic}}
              \newcommand\backmatter{%
              \if@openright
              \cleardoublepage
              \else
              \clearpage
              \fi
              \@mainmatterfalse}`Ah, perbacco, \frontmatter contiene \pagenumbering{roman}; lo tolgo semplicemente commentandolo; faccio attenzioe alle graffe chiuse in mdod da non commentare “troppo”. \mainmatter contiene \pagenumbering{arabic}, tolgo anche questo commentandolo e facendo attenzione alle parentesi chiuse. \backmatter non contiene nessun \pagenumbering; bene lo lascio stare e lo togo dal mio preambolo. Noto che mainmattertrue or …false sono preceduti dal segno @; bene ci metto in \makeatletter. Il codice diventa quindi:`\makeatletter
              \renewcommand\frontmatter{%
              \cleardoublepage
              \@mainmatterfalse
              %\pagenumbering{roman}
              }
              \renewcommand\mainmatter{%
              \cleardoublepage
              \@mainmattertrue
              %\pagenumbering{arabic}
              }` Non mi preoccupo di inserire in coda \makeatother, perché tanto ci pensa il comando \begin{document}.

              Fatto: oh, perbacco, funziona. Voglio saperne di più: vado a scoprire perché prima non funzionava; vado a cercare nella classe o in uno die file .clo caricati dalla classe a seconda del corpo normale scelto per vedere come è definito \chapter.
              |la definizione (in book.cls) è piuttosto scarna e rimanda al comando \secdef; questo a sua volta chiama due diversi comandi \@chapter e \@schapter; non sarà mica perché i seocndo è da chiamanre quando uso lo “starred chapter”? Già, appunto, non carica el testaine né l’indice, è prorpio il comando che si occupa dei capitorili asteriscati. Ma l’altro comando? Prima controlla il contatore \c@secnumdepth, perché il capitolo è da numerare (eventualmente) solo se quel contatore contiene un valoe maggiore di -1 (\m@one –> minus one), perché in caso contrario solo le parti potrebbero essere numerate (il captolo è al livello 0, la sezione al livello 1, eccetera); segue poi il test sullo switch @mainmatter; se è vero fa certe cose, se è falso ne fa altre; ciò, andando nei dettagli incrementa il numero del capitolo, mette nella console il messaggio che ha cominciato a comporre il capitolo, poi ne aggiunge alcune informazioni per l’indice generale, compreso ill numero del capitiolo. Atrimenti aggiunge solo it titolo; e via di questo passo…

              Noti che appena un poco più avanti viene impostato anche il \chaptermark con il titolo, in modo che anche la testatina opportuna contenga (nelle pagine successive alla prima del capitolo) proprio il tiolo del capitolo. Noti anceh che l’argomento #1 è il titolo breve, mentee il titolo lungo è l’argomento #2.

              Capisco che fare queste cose non è adatto al principiante assoluto, ma ritengo che non ci sia nulla di difficile nell’interpretare questi pochi comando, avendo già un po’ di esperienza alle spalle. Non garantisco che sia sempre così semplice; ma io ci provo sempre e quindi ora non mi spavento più e mettere il naso nelle parti nascoste} del mark up LaTeX 😉

            • #110507
              MatteoF
              Partecipante
                Up
                0
                Down
                ::

                OldClaudio” post=110734Il codice diventa quindi:`\makeatletter
                \newcommand\frontmatter{%
                \cleardoublepage
                \@mainmatterfalse
                %\pagenumbering{roman}
                }
                \newcommand\mainmatter{%
                \cleardoublepage
                \@mainmattertrue
                %\pagenumbering{arabic}
                }` Non mi preoccupo di inserire in coda \makeatother, perché tanto ci pensa il comando \begin{document}.

                Fatto: oh, perbacco, funziona.

                … ovviamente sostituendo \newcommand con \renewcommand 😉

                Grazie Claudio per l’aiuto e la disponibilità… Proverò a pasticciare un po’ con il markup di latex, vediamo se ne esce qualcosa di buono 😛

              • #110508
                OldClaudio
                Partecipante
                  Up
                  0
                  Down
                  ::


                  Certo, con \renewcommand al posto di \newcommand; grazie di aver corretto la mia svista.

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

              Go to top