Corrispondenza tocloft/memoir

  • Creatore
    Topic
  • #66812
    Up
    0
    Down
    ::


    Sulla base di quanto detto da Claudio (@OldClaudio), sto provando a scrivere classicthesis.cls usando anche memoir. Ho aggiunto infatti (almeno per ora) un’opzione per usare memoir come classe “base”. Buona parte del codice originale di CT riguarda tocloft e i comandi \cft<...>, cioè righe del tipo:
    `\setlength{\cftbeforechapskip}{.1em}
    \addtolength{\cftchapnumwidth}{\newchnumberwidth}
    \renewcommand{\cftchappresnum}{\scshape\MakeTextLowercase}`
    Memoir implementa tutti i comandi di tocloft, però (secondo una scelta che non mi sembra azzeccatissima) li ridenomina sostituendo “sec” con “section” e “chap” con “chapter”. Io dovrei quindi fare
    `\ifcth@memoir
    \setlength{\cftbeforechapterskip}{.1em}
    \addtolength{\cftsectionnumwidth}{\newchnumberwidth}
    \renewcommand{\cftsubsectionpresnum}{\scshape\MakeTextLowercase}
    \else
    \setlength{\cftbeforechapskip}{.1em}
    \addtolength{\cftsecnumwidth}{\newchnumberwidth}
    \renewcommand{\cftsubsecpresnum}{\scshape\MakeTextLowercase}
    \fi`
    ma vorrei evitarlo perché raddoppierei le linee di codice (già innumerevoli) e aggiungerei ridondanza aumentando il rischio di errori. Ho pensato di fare:
    `
    \def\cth@invoke#1#2{%
    \def\@tempa{#1}%
    \expandafter\@tempa\expandafter{\csname#2\endcsname}}
    \ifcth@memoir
    \def\cth@chap{chapter}
    \def\cth@sec{section}
    \else
    \def\cth@chap{chap}
    \def\cth@sec{sec}
    \fi
    \cth@invoke\setlength{cftbefore\cth@chap skip}{.1em}
    \cth@invoke\addtolength{cft\cth@sec numwidth}{\newchnumberwidth}
    \cth@invoke\renewcommand{cftsub\cth@sec presnum}{\scshape\MakeTextLowercase}`

    Può andar bene? Esistono soluzioni migliori? Ho scoperto il pacchetto interfaces, ma non mi pare che risolva questi problemi (è fatto per il tocloft originale e non per memoir).

    Un’ulteriore domanda: alla fine della classe, sarebbe bene liberare un po’ di memoria cancellando quei comandi? Intendo qualcosa come:
    `
    \let\cth@chap\undefined
    \let\cth@sec\undefined
    \let\cth@invoke\undefined
    `
    È utile? Ne vale la pena?

    Grazie,
    Antonio

Visualizzazione 8 filoni di risposte
  • Autore
    Risposte
    • #66813
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Leggi nella documentazione di memoir: mi pare di aver letto che si possano disabilitare (alcuni de)i pacchetti simulati, come, per esempio tocloft, e caricarli espressamente. In quel caso, se vuoi usare sempre i comandi di tocloft non hai bisogno di eseguire quella “interfaccia” per renderli compatibili a seconda di quale classe usi come classe di base.

      • #66814
        Up
        0
        Down
        ::

        OldClaudio” post=65750Leggi nella documentazione di memoir: mi pare di aver letto che si possano disabilitare (alcuni de)i pacchetti simulati, come, per esempio tocloft, e caricarli espressamente. In quel caso, se vuoi usare sempre i comandi di tocloft non hai bisogno di eseguire quella “interfaccia” per renderli compatibili a seconda di quale classe usi come classe di base.

        Ciao, Claudio, grazie.

        Sì, ho visto il comando \DisemulatePackage, ma preferirei usare i comandi “nativi” di memoir, per avere maggiore coerenza (sempre che, lo verificherò, il risultato sia effettivamente lo stesso).

        Cosa mi consigli sul liberare la memoria? (La richiesta deriva anche da una mia “deformazione professionale” che mi suggerisce il principio dell’information hiding: nascondere (cancellare) i comandi usati internamente, principio che il LaTeX è piuttosto blando.)

      • #66815
        Up
        0
        Down
        ::

        antonio.macrì” post=65753Cosa mi consigli sul liberare la memoria? (La richiesta deriva anche da una mia “deformazione professionale” che mi suggerisce il principio dell’information hiding: nascondere (cancellare) i comandi usati internamente, principio che il LaTeX è piuttosto blando.)

        Non mi preoccuperei; la quantità di memoria a disposizione con le distribuzioni moderne mette al sicuro da rischi: non sono una trentina di comandi che danno fastidio.

        In ogni caso, la strategia migliore è quella di scegliere una delle due sintassi e lavorare con quella; supponiamo tu voglia quella di tocloft:
        `\ifcth@memoir
        \let\cftbeforechapskip\cftbeforechapterskip

        \fi`
        In altre parole definisci una tabella di equivalenze e lavori con i comandi di tocloft. Occupazione di memoria minima e sintassi invariata. Puoi anche ideare facilmente una “metatabella”.

        Ciao
        Enrico

      • #66816
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::

          antonio.macrì” post=65753
          Ciao, Claudio, grazie.

          Sì, ho visto il comando \DisemulatePackage, ma preferirei usare i comandi “nativi” di memoir, per avere maggiore coerenza (sempre che, lo verificherò, il risultato sia effettivamente lo stesso).

          Dipenda da come imposti la scelta della classe di supporto; se il test \ifcth@memoir è definito prima di caricare la classe di supporto, allora nella parte “true” dove carichi memoir, puoi aggiungere anche il comando \DisemulatePackage e poi dopo la chiusura del test puoi caricare tocloft vhe verrà usato da entrambe le classi, memoir e quall’altra.

          antonio.macrì” post=65753
          Cosa mi consigli sul liberare la memoria? (La richiesta deriva anche da una mia “deformazione professionale” che mi suggerisce il principio dell’information hiding: nascondere (cancellare) i comandi usati internamente, principio che il LaTeX è piuttosto blando.)

          LaTeX è blando sulla liberazione della memoria che non serve più, è vero; certo fare un po’ di housekeeping e di pulizia non guasta, ma data la capacità di memoria interna delle versioni moderne del sistema TeX (non lavoriamo più su vecchi IBM AT con 20MiB di disco e 2MiB di RAM come avevo io negli anni ’80) la necessità di liberare memoria si è fortemente ridotta; certo non guasta; non solo, ma vista la mancanza di una regola condivisa per gli spacename, direi che la pulizia è opportuna anche per minimizzare conflitti con altri pacchetti e con \newcommand che affermano non potersi eseguire perché il comando esiste già.

          Una alternativa sarebbe quella di usare variabili locali dentro gruppi e buttare fuori dal gruppo solo le cose che servono permanentemente; chiudendo il gruppo tutte le variabili locali vengono ripristinate a quel che erano prima, magari vengono ripristinate a \undefined se prima non erano definite; solo che così la programmazione diventa un po’ pesante.

          Ciao
          Claudio

        • #66817
          Up
          0
          Down
          ::


          Grazie.

          egreg9″ post=65756In ogni caso, la strategia migliore è quella di scegliere una delle due sintassi e lavorare con quella; supponiamo tu voglia quella di tocloft:
          `\ifcth@memoir
          \let\cftbeforechapskip\cftbeforechapterskip

          \fi`
          In altre parole definisci una tabella di equivalenze e lavori con i comandi di tocloft. Occupazione di memoria minima e sintassi invariata. Puoi anche ideare facilmente una “metatabella”.

          Ciao
          Enrico

          Credo di non aver capito. Se faccio
          `
          \ifcth@memoir
          \let\cftbeforechapskip\cftbeforechapterskip
          \let\cftsecnumwidth\cftsectionnumwidth
          \let\cftsubsecpresnum\cftsubsectionpresnum

          \fi
          \setlength{\cftbeforechapskip}{.1em}
          \addtolength{\cftsecnumwidth}{\newchnumberwidth}
          \renewcommand{\cftsubsecpresnum}{\scshape\MakeTextLowercase}

          `
          le istruzioni con \setlength e \addtolength funzionano, ma i \renewcommand no (e ce ne sono tanti, sono anzi i più numerosi). Dovrei fare:
          `
          \ifcth@memoir
          \let\cftbeforechapskip\cftbeforechapterskip
          \let\cftsecnumwidth\cftsectionnumwidth
          \let\cftsubsecpresnum\cftsubsectionpresnum
          … % quelli per \setlength, \addtolength e \renewcommand
          \fi
          \setlength{\cftbeforechapskip}{.1em}
          \addtolength{\cftsecnumwidth}{\newchnumberwidth}
          \renewcommand{\cftsubsecpresnum}{\scshape\MakeTextLowercase}

          \ifcth@memoir
          \let\cftsubsectionpresnum\cftsubsecpresnum
          … % solo quelli per \renewcommand (invertiti)
          \fi
          `
          ma mi pare prolisso. 😕

          Che metatabella intendi?

        • #66818
          Up
          0
          Down
          ::

          antonio.macrì” post=65783Grazie.

          In ogni caso, la strategia migliore è quella di scegliere una delle due sintassi e lavorare con quella; supponiamo tu voglia quella di tocloft:
          `\ifcth@memoir
          \let\cftbeforechapskip\cftbeforechapterskip

          \fi`
          In altre parole definisci una tabella di equivalenze e lavori con i comandi di tocloft. Occupazione di memoria minima e sintassi invariata. Puoi anche ideare facilmente una “metatabella”.

          Ciao
          Enrico

          Credo di non aver capito. Se faccio
          `
          \ifcth@memoir
          \let\cftbeforechapskip\cftbeforechapterskip
          \let\cftsecnumwidth\cftsectionnumwidth
          \let\cftsubsecpresnum\cftsubsectionpresnum

          \fi
          \setlength{\cftbeforechapskip}{.1em}
          \addtolength{\cftsecnumwidth}{\newchnumberwidth}
          \renewcommand{\cftsubsecpresnum}{\scshape\MakeTextLowercase}

          `
          le istruzioni con \setlength e \addtolength funzionano, ma i \renewcommand no (e ce ne sono tanti, sono anzi i più numerosi). Dovrei fare:
          `
          \ifcth@memoir
          \let\cftbeforechapskip\cftbeforechapterskip
          \let\cftsecnumwidth\cftsectionnumwidth
          \let\cftsubsecpresnum\cftsubsectionpresnum
          … % quelli per \setlength, \addtolength e \renewcommand
          \fi
          \setlength{\cftbeforechapskip}{.1em}
          \addtolength{\cftsecnumwidth}{\newchnumberwidth}
          \renewcommand{\cftsubsecpresnum}{\scshape\MakeTextLowercase}

          \ifcth@memoir
          \let\cftsubsectionpresnum\cftsubsecpresnum
          … % solo quelli per \renewcommand (invertiti)
          \fi
          `
          ma mi pare prolisso. 😕

          Che metatabella intendi?

          Già, con i \renewcommand non funziona: infatti per questi devi dire
          `\let\cftsubsecpresnum\cftsubsectionpresnum
          \def\cftsubsectionpresnum{\cftsubsecpresnum}`
          A questo punto anche \renewcommand{\cftsubsecpresnum}{\scshape\MakeTextLowercase} funzionerà.

          La “metatabella” consiste nel definire
          `\def\convertmemoirtotocloft#1#2{%
          \expandafter\let\csname cftbefore#2skip\expandafter\endcsname\csname cftbefore#1skip\endcsname

          \expandafter\let\csname cft#2presnum\expandafter\endcsname\csname cft#1presnum\endcsname
          \expandafter\def\csname cft#1presnum\expandafter\endcsname\expandafter{\csname cft#2presnum\endcsname}

          }`
          da chiamare come
          `\convertmemoirtotocloft{chapter}{chap}`
          Si può lievemente migliorare accorgendosi che la struttura è molto simile:
          `\def\convertmemoirtotocloftlet#1#2#3#4{%
          \expandafter\let\csname cft#1#4#2\expandafter\endcsname\csname cft#1#3#2\endcsname}
          \def\convertmemoirtotocloftdef#1#2#3#4{%
          \convertmemoirtotocloftlet{#1}{#2}{#3}{#4}%
          \expandafter\def\csname cft#1#3#2\expandafter\endcsname\expandafter{\csname cft#1#4#2\endcsname}`
          e il codice di prima diventerebbe
          `\def\convertmemoirtotocloft#1#2{%
          \convertmemoirtotocloftlet{before}{skip}{#1}{#2}

          \convertmemoirtotocloftdef{}{presnum}{#1}{#2}

          }`
          Al posto dei puntini metti tutti i comandi necessari e ti basterà dire
          `\ifcth@memoir
          \convertmemoirtotocloft{chapter}{chap}
          \convertmemoirtotocloft{section}{sec}

          \fi`

          Ciao
          Enrico

        • #66819
          Up
          0
          Down
          ::

          egreg9″ post=65786La “metatabella” consiste nel definire

          Grazie, alla fine ho fatto così.

          Un paio di domandine:

          1. I commenti che metti alla fine di alcune righe sono solo per scrupolo, giusto? Quei comandi li uso solamente nel preambolo.
          2. Diverse volte Miede ridefinisce le lunghezze:
            `\renewcommand{\cftsecindent}{0em}`
            È concettualmente sbagliato, giusto? Ci metterei:
            `\setlength{\cftsecindent}{\z@} % già che ci sono ottimizzo un po'`
            Altrimenti il registro dimensionale che conteneva il valore di \cftsecindent rimane inutilizzato, vero?

          Grazie ancora!

        • #66820
          Up
          0
          Down
          ::

          antonio.macrì” post=65787

          La “metatabella” consiste nel definire

          Grazie, alla fine ho fatto così.

          Un paio di domandine:
          [ol]
          [li]I commenti che metti alla fine di alcune righe sono solo per scrupolo, giusto? Quei comandi li uso solamente nel preambolo.[/li]
          [li]Diverse volte Miede ridefinisce le lunghezze:
          `\renewcommand{\cftsecindent}{0em}`
          È concettualmente sbagliato, giusto? Ci metterei:
          `\setlength{\cftsecindent}{\z@} % già che ci sono ottimizzo un po'`
          Altrimenti il registro dimensionale che conteneva il valore di \cftsecindent rimane inutilizzato, vero?
          [/li]
          [/ol]

          Grazie ancora!

          Sì, metto % per abitudine. Ovviamente, se \cftsecindent è un registro dimensionale, è una sciocchezza usare \renewcommand.

          Ciao
          Enrico

        • #66821
          Up
          0
          Down
          ::


          Molte grazie a entrambi, Claudio ed Enrico.

          Ciao,
          Antonio

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

      Go to top