Come si usa il pachetto xkeyval

  • Questo topic ha 7 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 18 anni, 6 mesi fa da DMW.
  • Creatore
    Topic
  • #22134
    DMW
      Up
      0
      Down
      ::


      Voglio imparare ad usare il pacchetto xkeyval. Mettiamo che io abbia questo ambiente un po’ stupido:
      `
      \usepackage{xkeyval,xcolor}
      \newenvironment{scatola}[2][black]{\par\color{#1}\hrule\vskip3pt\textcolor{#2}\bgroup}{\egroup\vskip3pt\hrule\par}
      \begin{document}
      \begin{scatola}[blue]{red}
      testo
      \end{scatola}
      \end{document} `

      Io con xkeyval voglio poter scrivere
      `
      \begin{scatola}[colorrule=black,colortext=green]
      testo
      \end{scatola}
      `

      per avere i rulli neri e il testo verde, o
      `
      \begin{scatola}
      testo
      \end{scatola}`

      per avere, di default, i rulli blu e il testo rosso.

      Così il codice è più comprensibile. Ho letto la documentazione di xkeyval ma non ci ho capito un tubo. Ho visto anche il topic
      http://www.guit.sssup.it/phpbb/viewtopic.php?t=3316&highlight=longmedal
      dell’ambiente di Agostino, ma per ora è un po’ troppo complesso per me.

      Grazie

      Andrea

    Visualizzazione 6 filoni di risposte
    • Autore
      Risposte
      • #22135
        Up
        0
        Down
        ::

        Voglio imparare ad usare il pacchetto xkeyval. Mettiamo che io abbia questo ambiente un po’ stupido:
        `
        \usepackage{xkeyval,xcolor}
        \newenvironment{scatola}[2][black]{\par\color{#1}\hrule\vskip3pt\textcolor{#2}\bgroup}{\egroup\vskip3pt\hrule\par}
        \begin{document}
        \begin{scatola}[blue]{red}
        testo
        \end{scatola}
        \end{document} `

        Io con xkeyval voglio poter scrivere
        `
        \begin{scatola}[colorrule=black,colortext=green]
        testo
        \end{scatola}
        `

        per avere i rulli neri e il testo verde, o
        `
        \begin{scatola}
        testo
        \end{scatola}`

        per avere, di default, i rulli blu e il testo rosso.

        Così il codice è più comprensibile. Ho letto la documentazione di xkeyval ma non ci ho capito un tubo. Ho visto anche il topic
        http://www.guit.sssup.it/phpbb/viewtopic.php?t=3316&highlight=longmedal
        dell’ambiente di Agostino, ma per ora è un po’ troppo complesso per me.

        `\makeatletter
        \newenvironment{scatola}[1][]
        {\setkeys{scatola}{#1}%
        \par\scatola@rulecolor%
        \hrule\vskip3pt\begingroup\scatola@textcolor}
        {\endgroup\vskip3pt\hrule}
        \define@key{scatola}{rulecolor}{\def\scatola@rulecolor{\color{#1}}}
        \define@key{scatola}{textcolor}{\def\scatola@textcolor{\color{#1}}}
        \def\scatola@rulecolor{\color{black}}
        \def\scatola@textcolor{\color{black}}
        \makeatother`
        Vediamo una prova:
        `\begin{scatola}
        testo nero righe nere
        \end{scatola}
        \medskip
        \begin{scatola}[textcolor=green]
        testo verde righe nere
        \end{scatola}
        \medskip
        \begin{scatola}[rulecolor=red]
        testo nero righe rosse
        \end{scatola}
        \medskip
        \begin{scatola}[textcolor=blue,rulecolor=red]
        testo blu righe rosse
        \end{scatola}`
        Passi l’argomento opzionale, dove stabilisci i valori, a \setkeys; il primo argomento serve per poter avere chiavi con lo stesso nome anche con impieghi diversi.

        Con \define@key dici come usare il valore. Siccome ci sono questioni di gruppi, do anche un valore di default ai comandi usati per i colori, in modo che questi comandi abbiano sempre una definizione.

        Ciao
        Enrico

      • #22136
        DMW
          Up
          0
          Down
          ::


          Era cosi facile?

          Devo essere proprio rimbecillito. Comunque al posto di
          `\def\scatola@rulecolor{\color{black}}
          \def\scatola@textcolor{\color{black}}`
          ho messo
          `
          \setkeys{scatola}{textcolor=black,rulecolor=black}`

          Ora mi puoi spiegare brevemente l’ambito di utilizzo della command key, sez. 3.2
          ` \define@cmdkey[]{}[]{}[]{} `

          Ciao e grazie

          Andrea

        • #22137
          Up
          0
          Down
          ::

          Ora mi puoi spiegare brevemente l’ambito di utilizzo della command key, sez. 3.2
          ` \define@cmdkey[]{}[]{}[]{} `

          Molto spesso l’uso di \define@key si riduce a
          `\define@key{famiglia}{chiave}{\def\famiglia@chiave{#1}}`
          Se questo accade per tutte le chiavi, puoi usare
          `\define@cmdkey{famiglia}{chiave}`
          e questo equivale a
          `\define@key{famiglia}{chiave}{\def\cmdKV@famiglia@chiave{#1}}`
          Basta quindi sostituire \cmdKV@famiglia@chiave al comando \famiglia@chiave e si ha un piccolo risparmio di token. Ma la lista di “chiavi=valore” va passata a \define@cmdkeys invece che a \setkeys.

          Poi ci sono gli argomenti opzionali che talvolta possono diventare utili.

          Almeno così è come lo capisco io. Nell’esempio “scatola” non si può usare, perché il valore va dato come argomento a \color.

          Ciao
          Enrico

        • #22138
          DMW
            Up
            0
            Down
            ::


            Sì, però per poter utilizzare quelle chiavi si deve usare
            `\setkeys[prefisso]{famiglia}{…}`

            o sempre
            `\setkeys{famiglia}{…}`
            in caso di assenza del prefisso.

            Grazie per la spiegazione.

            Andrea

          • #22139
            DMW
              Up
              0
              Down
              ::


              Prof scusa se ti rompo le scatole amche di domenica,

              dato
              ` \define@key[]{}{}[]{}`

              Ho provato a scrivere
              `\define@key{scatola}{rulecolor}[black]{\def\scatola@rulecolor{\color{#1}}}
              \define@key{scatola}{textcolor}[black]{\def\scatola@textcolor{\color{#1}}}`

              al posto di
              `\define@key{scatola}{rulecolor}{\def\scatola@rulecolor{\color{#1}}}
              \define@key{scatola}{textcolor}{\def\scatola@textcolor{\color{#1}}}
              \setkeys{scatola}{textcolor=black,rulecolor=black}%al posto delle due successive
              %\def\scatola@rulecolor{\color{black}}
              %\def\scatola@textcolor{\color{black}}`

              ma dà errore. Quale è il ruolo di []? Serve a tutt’altro?

              Nel manuale c’è scritto

              \define@key{family}{key}{The input is: #1}
              xkeyval will generate an error when the user omits =valuefor a key in the options list of \setkeys(see section 4). To avoid this, the optional argument can be used to specify a default value.
              \define@key{family}{key}[none]{The input is: #1}

              Ciao

              Andrea

            • #22140
              Up
              0
              Down
              ::

              Prof scusa se ti rompo le scatole amche di domenica,

              dato
              ` \define@key[]{}{}[]{}`

              Ho provato a scrivere
              `\define@key{scatola}{rulecolor}[black]{\def\scatola@rulecolor{\color{#1}}}
              \define@key{scatola}{textcolor}[black]{\def\scatola@textcolor{\color{#1}}}`

              al posto di
              `\define@key{scatola}{rulecolor}{\def\scatola@rulecolor{\color{#1}}}
              \define@key{scatola}{textcolor}{\def\scatola@textcolor{\color{#1}}}
              \setkeys{scatola}{textcolor=black,rulecolor=black}%al posto delle due successive
              %\def\scatola@rulecolor{\color{black}}
              %\def\scatola@textcolor{\color{black}}`

              ma dà errore. Quale è il ruolo di []? Serve a tutt’altro?

              Serve ad assegnare un valore se si specifica solo la chiave senza il valore. Di solito si usa con true e false, ma non solo. Quindi puoi scrivere
              `\newenvironment{scatola}[1][]
              {\setkeys{scatola}{textcolor,rulecolor,#1}%
              \par\scatola@rulecolor%
              \hrule\vskip3pt\begingroup\scatola@textcolor}
              {\endgroup\vskip3pt\hrule}
              \define@key{scatola}{rulecolor}[black]{\def\scatola@rulecolor{\color{#1}}}
              \define@key{scatola}{textcolor}[black]{\def\scatola@textcolor{\color{#1}}}`
              che ti dà il vantaggio di avere il default in un posto ben determinato.

              Ciao
              Enrico

            • #22141
              DMW
                Up
                0
                Down
                ::


                Io pensavo che bastasse omettere “chiave=valore” dall’argomento dell’ambiente in fase di chiamata, invece va tolto solo “=valore” sotto setkeys. Grazie ancora.

                Ciao

                Andrea

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

            Go to top