suftesi+sctitles, listings e babel

  • Creatore
    Topic
  • #65608
    Up
    0
    Down
    ::


    Provate a compilare questo codice:
    `
    \documentclass[sctitles]{suftesi}
    %\usepackage[italian]{babel}
    %\usepackage{listings}
    \usepackage{lipsum}

    \begin{document}
    \chapter{Lorem ipsum}
    \lipsum
    \end{document}`
    Il risultato sarà corretto: titoli e testatine in maiuscoletto spaziato.
    Ora provate a compilare decommentando entrambe le righe commentate. La compilazione si blocca.
    Se però si commenta o uno o l’altro dei pacchetti, non ci sono problemi.

    Il problema è nelle definizioni dei marcatori usati per le testatine, all’interno dei quali si usano diversi condizionali. Ho provato e riprovato, ma niente.
    È la parte di codice più “sporca” di tutte. A forza di aggiungere opzioni è diventata una giungla. Ma non saprei che approccio usare.

    Idee?

    Ciao
    Ivan

Visualizzazione 9 filoni di risposte
  • Autore
    Risposte
    • #65609
      Up
      0
      Down
      ::


      Ho provato a indagare e sembra che abbia trovato una soluzione, anche se non ho compreso pienamente la causa.

      Da quel che ho capito, tra babel e listings si fanno due cose che in qualche modo cozzano: ridefinire markboth e cambiare il significato del carattere attivo ~. Quando tu fai:
      `
      \ifsuftesi@elements
      \renewcommand{\chaptermark}[1]{\markboth{#1}{#1}}
      \else
      \renewcommand{\chaptermark}[1]{\markboth{\chaptertitlename~\thechapter}{#1}}
      \fi`
      il carattere ~ sembra ancora un carattere attivo, ma non definito (così almeno compare se lo precedi con uno \show).

      Una soluzione banale è sostituirlo con il più semplice “\ “, tanto è praticamente impossibile che lì avvenga una cesura.

      Ripeto: non sono ben conscio del problema, ma questa sembra essere una soluzione.

      Ciao,
      Antonio

    • #65610
      Up
      0
      Down
      ::

      antonio.macrì” post=64713Ho provato a indagare e sembra che abbia trovato una soluzione, anche se non ho compreso pienamente la causa.

      Da quel che ho capito, tra babel e listings si fanno due cose che in qualche modo cozzano: ridefinire markboth e cambiare il significato del carattere attivo ~. Quando tu fai:
      `
      \ifsuftesi@elements
      \renewcommand{\chaptermark}[1]{\markboth{#1}{#1}}
      \else
      \renewcommand{\chaptermark}[1]{\markboth{\chaptertitlename~\thechapter}{#1}}
      \fi`
      il carattere ~ sembra ancora un carattere attivo, ma non definito (così almeno compare se lo precedi con uno \show).

      Una soluzione banale è sostituirlo con il più semplice “\ “, tanto è praticamente impossibile che lì avvenga una cesura.

      Certo, in quel punto non ci possono essere cesure

      antonio.macrì” post=64713
      Ripeto: non sono ben conscio del problema, ma questa sembra essere una soluzione.

      Io meno di te 😯

      Ciao
      Ivan

    • #65611
      Up
      0
      Down
      ::

      antonio.macrì” post=64713Ho provato a indagare e sembra che abbia trovato una soluzione, anche se non ho compreso pienamente la causa.

      Da quel che ho capito, tra babel e listings si fanno due cose che in qualche modo cozzano: ridefinire markboth e cambiare il significato del carattere attivo ~. Quando tu fai:
      `
      \ifsuftesi@elements
      \renewcommand{\chaptermark}[1]{\markboth{#1}{#1}}
      \else
      \renewcommand{\chaptermark}[1]{\markboth{\chaptertitlename~\thechapter}{#1}}
      \fi`
      il carattere ~ sembra ancora un carattere attivo, ma non definito (così almeno compare se lo precedi con uno \show).

      Una soluzione banale è sostituirlo con il più semplice “\ “, tanto è praticamente impossibile che lì avvenga una cesura.

      Certo, in quel punto non ci possono essere cesure

      antonio.macrì” post=64713
      Ripeto: non sono ben conscio del problema, ma questa sembra essere una soluzione.

      Io meno di te 😯

      Grazie

      Ciao
      Ivan

    • #65612
      Up
      0
      Down
      ::


      Quanto all’approccio da usare, ti suggerirei l’idea di annidare le definizioni nei condizionali \ifsuftesi@<...>, e non viceversa, tanto tutte le condizioni di questo tipo non cambiano nelle diverse invocazioni dei comandi. Così sveltisci la compilazione. Anziché
      `
      \def\sufthepage{\ifsuftesi@sctitles\sufsc{\thepage}\else\thepage\fi}
      `
      farei:
      `
      \ifsuftesi@sctitles
      \def\sufthepage{\sufsc{\thepage}}
      \else
      \let\sufthepage\thepage
      \fi`

      Un po’ più difficile è riscrivere:
      `
      \def\sufrightmark{\ifsuftesi@sctitles\sufsc{\ifsuftesi@authortitle\@title\else\rightmark\fi}% article mode
      \else\ifsuftesi@authortitle\nouppercase\@title\else\nouppercase\rightmark\fi\fi}
      \def\sufleftmark{\ifsuftesi@sctitles\sufsc{\ifsuftesi@authortitle\@author\else\ivanleftmark\fi}% book mode
      \else\ifsuftesi@authortitle\nouppercase\@author\else\nouppercase\ivanleftmark\fi\fi}
      `
      Si può provare:
      `
      \begingroup
      \ifsuftesi@sctitles
      \def\cmd{\sufsc}
      \else
      \def\cmd{\nouppercase}
      \fi
      \ifsuftesi@authortitle
      \def\right{\@title}
      \def\left{\@author}
      \else
      \def\right{\rightmark}
      \def\left{\ivanleftmark}
      \fi
      \expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\sufrightmark
      \expandafter\expandafter\expandafter{\expandafter\cmd\right}
      \expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\sufleftmark
      \expandafter\expandafter\expandafter{\expandafter\cmd\left}
      \endgroup
      `

      A parte la caterva di \expandafter, forse mi pare un po’ più leggibile :shock::shock:
      Comunque è più flessibile in caso modifichi o ci metti altre opzioni (ma so che non vuoi farlo :)), basta cambiare \cmd, \left e \right.

      Gli expandafter servono anche a evitare di conservare variabili temporanee. Un’altra cosa che mi sento di consigliarti è usare prefissi come suf@ per i comandi che non dovranno essere usati dall’utente (come per esempio \ivanleftmark, credo).

      Comunque sarebbe bene sentire l’opinione di qualche luminare, sicuramente. Io sono solo uno interessato (molto) a queste cose e che si diletta ogni tanto: se vengo smentito imparo qualcosa. 🙂

      Ciao,
      A.

    • #65613
      Up
      0
      Down
      ::

      antonio.macrì” post=64723Quanto all’approccio da usare, ti suggerirei l’idea di annidare le definizioni nei condizionali \ifsuftesi@<...>, e non viceversa, tanto tutte le condizioni di questo tipo non cambiano nelle diverse invocazioni dei comandi. Così sveltisci la compilazione. Anziché
      `
      \def\sufthepage{\ifsuftesi@sctitles\sufsc{\thepage}\else\thepage\fi}
      `
      farei:
      `
      \ifsuftesi@sctitles
      \def\sufthepage{\sufsc{\thepage}}
      \else
      \let\sufthepage\thepage
      \fi`

      Un po’ più difficile è riscrivere:
      `
      \def\sufrightmark{\ifsuftesi@sctitles\sufsc{\ifsuftesi@authortitle\@title\else\rightmark\fi}% article mode
      \else\ifsuftesi@authortitle\nouppercase\@title\else\nouppercase\rightmark\fi\fi}
      \def\sufleftmark{\ifsuftesi@sctitles\sufsc{\ifsuftesi@authortitle\@author\else\ivanleftmark\fi}% book mode
      \else\ifsuftesi@authortitle\nouppercase\@author\else\nouppercase\ivanleftmark\fi\fi}
      `
      Si può provare:
      `
      \begingroup
      \ifsuftesi@sctitles
      \def\cmd{\sufsc}
      \else
      \def\cmd{\nouppercase}
      \fi
      \ifsuftesi@authortitle
      \def\right{\@title}
      \def\left{\@author}
      \else
      \def\right{\rightmark}
      \def\left{\ivanleftmark}
      \fi
      \expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\sufrightmark
      \expandafter\expandafter\expandafter{\expandafter\cmd\right}
      \expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\sufleftmark
      \expandafter\expandafter\expandafter{\expandafter\cmd\left}
      \endgroup
      `

      A parte la caterva di \expandafter, forse mi pare un po’ più leggibile :shock::shock:
      Comunque è più flessibile in caso modifichi o ci metti altre opzioni (ma so che non vuoi farlo :)), basta cambiare \cmd, \left e \right.

      Gli expandafter servono anche a evitare di conservare variabili temporanee. Un’altra cosa che mi sento di consigliarti è usare prefissi come suf@ per i comandi che non dovranno essere usati dall’utente (come per esempio \ivanleftmark, credo).

      Comunque sarebbe bene sentire l’opinione di qualche luminare, sicuramente. Io sono solo uno interessato (molto) a queste cose e che si diletta ogni tanto: se vengo smentito imparo qualcosa. 🙂

      Ciao,
      A.

      L’idea di usare \left e \right non è proprio buonissima. 🙂

      Nelle definizioni del tipo analizzato il valore dei condizionali è già stato stabilito, quindi
      `\def\sufthepage{\ifsuftesi@sctitles\sufsc{\thepage}\else\thepage\fi}`
      è sbagliato:
      `
      \ifsuftesi@sctitles
      \def\sufthepage{\sufsc{\thepage}}
      \else
      \def\sufthepage{\thepage}
      \fi`
      Non \let, perché abbiamo bisogno della rappresentazione del numero di pagina valida al momento in cui si usa \sufthepage (e potrebbe essere in cifre romane, per esempio). Analogamente per \sufrightmark:
      `\ifsuftesi@sctitles
      \ifsuftesi@authortitle
      \def\sufrightmark{\sufsc{\@title}}
      \else
      \def\sufrightmark{\sufsc{\rightmark}}
      \fi
      \else
      \ifsuftesi@authortitle
      \def\sufrightmark{\nouppercase{\@title}}
      \else
      \def\sufrightmark{\nouppercase{\rightmark}}
      \fi
      \fi`
      Vero che il codice ha un po’ di duplicazioni, ma è molto più leggibile.

      Versione senza duplicazioni:
      `\ifsuftesi@sctitles\def\@tempa{\noexpand\sufsc}\else\def\@tempa{\noexpand\nouppercase}\fi
      \ifsuftesi@authortitle\def\@tempb{\noexpand\@title}\else\def\@tempb{\noexpand\rightmark}\fi
      \begingroup\edef\x{\endgroup
      \def\noexpand\sufrightmark{\@tempa{\@tempb}}}\x`
      Nemmeno un \expandafter. 🙂

      Quanto al problema iniziale è certamente dovuto a listings, che gioca con i codici di categoria, ma poi non rimette le cose a posto al tempo giusto. In ogni caso ~ nella definizione è inutile, come già osservato.

      Ciao
      Enrico

    • #65614
      Up
      0
      Down
      ::


      Grazie Enrico, serviva un intervento come il tuo. 😉

      egreg9″ post=64725L’idea di usare \left e \right non è proprio buonissima. 🙂

      Per evitare confusione coi comandi definiti (credo) da amsmath?


      Non \let, perché abbiamo bisogno della rappresentazione del numero di pagina valida al momento in cui si usa \sufthepage (e potrebbe essere in cifre romane, per esempio).

      Oops! Verissimo!


      Versione senza duplicazioni:
      `\ifsuftesi@sctitles\def\@tempa{\noexpand\sufsc}\else\def\@tempa{\noexpand\nouppercase}\fi
      \ifsuftesi@authortitle\def\@tempb{\noexpand\@title}\else\def\@tempb{\noexpand\rightmark}\fi
      \begingroup\edef\x{\endgroup
      \def\noexpand\sufrightmark{\@tempa{\@tempb}}}\x`
      Nemmeno un \expandafter. 🙂

      Il gioco con \edef e \noexpand, giusto! Era un po’ più complicato 🙂
      Me lo segno!

      Ciao,
      Antonio

    • #65615
      Up
      0
      Down
      ::

      antonio.macrì” post=64742
      Il gioco con \edef e \noexpand, giusto! Era un po’ più complicato 🙂
      Me lo segno!

      Io passo… 🙂

      L’approccio con i condizionali esterni effettivamente l’avevo preso in considerazione. Anzi avevo usato quel codice proprio nel tentativo di eliminare il conflitto con listings. Pensavo che fosse lì. Non avendolo risolto sono tornato indietro, con quel codice contorto che avevo scritto.
      Il problema era proprio nel simbolo ~. Tra l’altro c’era anche un’altra occorrenza che avrebbe potuto dare dei problemi. Ora è tutto risolto.

      Il codice senza ripetizioni (e senza \expandafter!) alla fine non l’ho usato, forse per timore reverenziale…
      Quando riuscirò a capire almeno un decimo di quello che c’è scritto lo userò.

      Grazie ancora ad Antonio ed Enrico

      Ciao
      Ivan

    • #65616
      Up
      0
      Down
      ::

      ivan” post=64768

      Il codice senza ripetizioni (e senza \expandafter!) alla fine non l’ho usato, forse per timore reverenziale…
      Quando riuscirò a capire almeno un decimo di quello che c’è scritto lo userò.

      Lezioni private?

      Ciao
      Enrico

    • #65617
      Up
      0
      Down
      ::

      antonio.macrì” post=64742

      L’idea di usare \left e \right non è proprio buonissima. 🙂

      Per evitare confusione coi comandi definiti (credo) da amsmath?

      Sono comandi primitivi. E anche piuttosto importanti.

      Ciao
      Enrico

    • #65618
      Up
      0
      Down
      ::

      egreg9″ post=64769

      [quote=”antonio.macrì” post=64742]Il codice senza ripetizioni (e senza \expandafter!) alla fine non l’ho usato, forse per timore reverenziale…
      Quando riuscirò a capire almeno un decimo di quello che c’è scritto lo userò.

      Lezioni private?

      Ci conto!

      Ciao
      Ivan

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

Go to top