xkeyval: croce e delizia

  • Questo topic ha 5 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 14 anni fa da egreg9.
  • Creatore
    Topic
  • #78301
    Up
    0
    Down
    ::


    Ciao a tutti!

    Su consiglio di Claudio, vorrei sistemare il codice di suftesi usando il pacchetto xkeyval.
    Tale pacchetto promette miracoli, e leggendo la documentazione pare che ciò sia vero.
    Il problema è che tale documentazione è totalmente astratta, e non riesco a trovare la chiave di volta,
    se non per situazioni semplicissime.
    Veniamo a un problema specifico. Poniamo di voler creare una classe molto semplice basata su book
    e che questa classe abbia una sola opzione (oltre a tutte quelle di book).
    Tale opzione dovrebbe permettere di scegliere due formati diversi per gli elenchi puntati: stile1 e stile2,
    da usare così:
    `\documentclass[elenchi=stile1]{testxkeyval}`

    Tali formati, poi, vanno definiti con il pacchetto enumitem.
    Poniamo di definirli così:
    `\RequirePackage{enumitem}
    %stile1
    \setlist[itemize]{leftmargin=\parindent}

    %stile2
    \setlist[itemize]{leftmargin=2\parindent}
    `

    A questo punto come si scrive il file di classe?
    Ho capito che xkeyval permette diversi approcci, più o meno “puri”.
    Qual è quello migliore?

    Sono riuscito a creare un’opzione simile con un codice della doc di xkeyval, e precisamente questo:
    `\NeedsTeXFormat{LaTeX2e}[2005/12/01]
    \ProvidesClass{testxkeyval}
    [A test class]
    \RequirePackage{xkeyval}

    \define@choicekey *{testxkeyval.cls}{align}[\val\nr]{left,center,right}{%
    \ifcase\nr\relax
    \raggedright \or
    \centering \or
    \raggedleft \fi}

    \DeclareOptionX {defaultparindent}[1.5em]{\setlength\parindent{#1}}
    \ExecuteOptionsX{defaultparindent=1em,align=center}
    \ProcessOptionsX\relax

    \LoadClass{book}

    \endinput
    `

    L’opzione align accetta tre valori: left, center, right.
    La classe esegue di default align=center. Il valore align=right, per esempio, può essere dato con la sintassi seguente:
    `\documentclass[align=right]{textxkeyval}`
    C’è poi un’altra opzione che permette di cambiare il valore di \parindent.
    L’opzione è anche più complessa di quello che serve a me, perché permette di impostare valori arbitrari come:
    `\documentclass[defaultparindent=5cm]{textxkeyval}`
    Non ho ancora capito come renderla più semplice, in modo che
    defaultparindent non accetti valori e semplicemente imposti \parindent a 1.5 em.
    Ma è tardi e comincio a non connettere più 🙄

    Grazie in anticipo a tutti.

    Ciao
    Ivan

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


      `\DeclareOptionX{defaultparindent}[1.5em]{\AtBeginDocument{\setlength{\parindent}{#1}}
      \ExecuteOptionsX{defaultparindent}`

      Ricordati che l’argomento facoltativo di [tt]\ProvidesClass[/tt] deve cominciare con una data (del tipo 2012/09/10).

      Quanto a stile1, direi

      `\RequirePackage{enumitem}
      \DeclareOptionX{stile1}{\setlist[itemize]{\leftmargin=\parindent}}
      \DeclareOptionX{stile2}{\setlist[itemize]{\leftmargin=2\parindent}}`

      Ciao
      Enrico

    • #78303
      Up
      0
      Down
      ::

      egreg9″ post=77406`\DeclareOptionX{defaultparindent}[1.5em]{\AtBeginDocument{\setlength{\parindent}{#1}}
      \ExecuteOptionsX{defaultparindent}`

      Ricordati che l’argomento facoltativo di [tt]\ProvidesClass[/tt] deve cominciare con una data (del tipo 2012/09/10).

      Scusa, l’ho concellato all’ultimo momento senza pensarci.
      Poi mi sono accorto che non compilava

      egreg9″ post=77406
      Quanto a stile1, direi

      `\RequirePackage{enumitem}
      \DeclareOptionX{stile1}{\setlist[itemize]{\leftmargin=\parindent}}
      \DeclareOptionX{stile2}{\setlist[itemize]{\leftmargin=2\parindent}}`

      Ciao
      Enrico

      H provato con questo:
      `\NeedsTeXFormat{LaTeX2e}[2005/12/01]
      \ProvidesClass{test}
      [2012/08/31 v0.9a A test class]
      \RequirePackage{xkeyval}

      \DeclareOptionX{stile1}{\setlist[itemize]{\leftmargin=\parindent}}
      \DeclareOptionX{stile2}{\setlist[itemize]{\leftmargin=2\parindent}}
      \ProcessOptionsX\relax

      \LoadClass{book}

      \RequirePackage{enumitem}

      \endinput
      `
      Ma naturalmente ottengo un errore 😥
      Temo poi che la cosa sarà un po’ più complessa.
      La funzione che stile1 esegue è in realtà più “lunga”.
      Si potrebbe mettere in una macro, ma come? e dove?
      Per curiosità ho dato un’occhiata a quanti file di classe usano xkeyval
      e non ne ho trovati tanti. Conseguenza del fatto che
      non si riescono a recuperare esempi utilizzabili?

      Se hai visto l’ultima suftesi, avrai notato il proliferare di opzioni.
      In effetti mi farebbe comodo un sistema che mi permetta di gestirle
      in maniera più sicura.
      Dalla versione precedente ho semplificato molto, ma non nego
      che tutte quelle opzioni siano difficili da gestire.

      È due giorni che mi ostino a capire come funziona xkeyval
      ma brancolo ancora nel buoi più profondo 🙁

      Mi chiedo: ne vale la pena?

      Ciao
      Ivan

    • #78304
      Up
      0
      Down
      ::


      Caricare enumitem prima di definire l’opzione?

      Ciao
      Enrico

    • #78305
      Up
      0
      Down
      ::

      egreg9″ post=77417Caricare enumitem prima di definire l’opzione?

      Ciao
      Enrico

      Niente da fare. Mi dà errore.
      Per il momento metto in letargo la questione.
      Mi farò vivo prossimamente.
      Chissà che con la musica giusta e la sfera di cristallo che hai in studio
      riesca a capirne qualcosa 😉

      Ciao
      Ivan

    • #78306
      Up
      0
      Down
      ::

      ivan” post=77447

      Caricare enumitem prima di definire l’opzione?

      Ciao
      Enrico

      Niente da fare. Mi dà errore.
      Per il momento metto in letargo la questione.
      Mi farò vivo prossimamente.
      Chissà che con la musica giusta e la sfera di cristallo che hai in studio
      riesca a capirne qualcosa 😉

      Ciao
      Ivan

      È una questione di tempi: non si può caricare enumitem prima della classe (che definisce gli ambienti poi modificati dal pacchetto). Quindi

      `\NeedsTeXFormat{LaTeX2e}[2005/12/01]
      \ProvidesClass{ivantest}
      [2012/08/31 v0.9a A test class]
      \RequirePackage{xkeyval}

      \AtEndOfClass{\RequirePackage{enumitem}}
      \DeclareOptionX{stile1}{\AtEndOfClass{\setlist[itemize]{leftmargin=\parindent}}}
      \DeclareOptionX{stile2}{\AtEndOfClass{\setlist[itemize]{leftmargin=2\parindent}}}
      \ProcessOptionsX\relax

      \LoadClass{book}

      \endinput`
      Ciao
      Enrico

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

Go to top