Definire un comando con numerosi parametri

  • Questo topic ha 17 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 16 anni fa da Stemby.
  • Creatore
    Topic
  • #48851
    Stemby
    Partecipante
      Up
      0
      Down
      ::


      Buongiorno,
      ho bisogno di definire un comando con una sintassi di questo tipo:
      `
      \nomecomando{par1}{par2}[par3][par4]{testo}
      `

      In pratica, con numerosi parametri di cui alcuni opzionali ed altri no. Non son riuscito a capire se la cosa sia possibile usando \newcommand; altrimenti come fare?

      Grazie!
      Carlo

    Visualizzazione 16 filoni di risposte
    • Autore
      Risposte
      • #48852
        Up
        0
        Down
        ::

        Buongiorno,
        ho bisogno di definire un comando con una sintassi di questo tipo:
        `
        \nomecomando{par1}{par2}[par3][par4]{testo}
        `

        In pratica, con numerosi parametri di cui alcuni opzionali ed altri no. Non son riuscito a capire se la cosa sia possibile usando \newcommand; altrimenti come fare?

        Non è semplicissimo, ma nemmeno terribile. Dovresti essere più preciso, soprattutto riguardo all’assenza di uno degli argomenti opzionali: che dovrebbe succedere specificando uno solo dei due opzionali, per esempio?

        Ciao
        Enrico

      • #48853
        Stemby
        Partecipante
          Up
          0
          Down
          ::


          Ciao Enrico,
          che piacere risentirti.

          Dovresti essere più preciso, soprattutto riguardo all’assenza di uno degli argomenti opzionali: che dovrebbe succedere specificando uno solo dei due opzionali, per esempio?

          In realtà non lo so esattamente, dovrei provare. Comunque quei 2 paramentri opzionali sono [ampiezza] e [c|l|r|s] del comando \makebox (il mio comando dovrà passare quei 2 paramentri direttamente al comando \makebox), quindi… quel che succede col comando \makebox.

          Su IRC mi hanno suggerito:
          * http://www.texdev.net/2010/05/23/from-newcommand-to-newdocumentcommand/
          * http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=keycommand

          Sicuramente tu hai esperienze in merito, e quindi saprai consigliarmi la strada migliore.

          Grazie!

        • #48854
          Up
          0
          Down
          ::

          Ciao Enrico,
          che piacere risentirti.

          Dovresti essere più preciso, soprattutto riguardo all’assenza di uno degli argomenti opzionali: che dovrebbe succedere specificando uno solo dei due opzionali, per esempio?

          In realtà non lo so esattamente, dovrei provare. Comunque quei 2 paramentri opzionali sono [ampiezza] e [c|l|r|s] del comando \makebox (il mio comando dovrà passare quei 2 paramentri direttamente al comando \makebox), quindi… quel che succede col comando \makebox.

          Su IRC mi hanno suggerito:
          * http://www.texdev.net/2010/05/23/from-newcommand-to-newdocumentcommand/
          * http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=keycommand

          Sicuramente tu hai esperienze in merito, e quindi saprai consigliarmi la strada migliore.

          Il primo suggerimento è molto interessante, ma si tratta di usare la nuova sintassi di LaTeX3. Il secondo pacchetto permette di definire comandi che passano gli argomenti nella forma “chiave=valore”: piiù facili da usare per l’utente finale; se solo Chervet scrivesse decentemente le sue documentazioni! 🙁
          `\newkeycommand{\mymakebox}[width=\width,align=c][1]{%
          \makebox[\commandkey{width}][\commandkey{align}]{#1}}`
          definisce essenzialmente la stessa cosa di \makebox, ma con sintassi diversa: per esempio
          `\mymakebox[width=10cm,align=s]{x y z}`
          equivale a \makebox[10cm]{x y z].

          Ciao
          Enrico

        • #48855
          Stemby
          Partecipante
            Up
            0
            Down
            ::

            Il primo suggerimento è molto interessante, ma si tratta di usare la nuova sintassi di LaTeX3.

            mmm, è un problema? Per l’utente finale, per il programmatore o per entrambi? (LaTeX3 lo conosco solo di nome…)

            `\newkeycommand{\mymakebox}[width=\width,align=c][1]{%
            \makebox[\commandkey{width}][\commandkey{align}]{#1}}`
            definisce essenzialmente la stessa cosa di \makebox, ma con sintassi diversa: per esempio
            `\mymakebox[width=10cm,align=s]{x y z}`
            equivale a \makebox[10cm]{x y z].

            Ok, grazie. Non è esattamente quello che speravo, ma al limite me lo faccio andare bene. Forse allora al posto di quel pacchetto potrei usare xkeyval, che devo già caricare per altri motivi.

            Mi sembra di capire che l’unico modo per arrivare al comando che pensavo è usando comandi TeX per definire il tutto, giusto?

            Ciao!
            Carlo

          • #48856
            Up
            0
            Down
            ::

            Il primo suggerimento è molto interessante, ma si tratta di usare la nuova sintassi di LaTeX3.

            mmm, è un problema? Per l’utente finale, per il programmatore o per entrambi? (LaTeX3 lo conosco solo di nome…)

            La documentazione di xparse è difficilina, ma non incomprensibile.

            `\newkeycommand{\mymakebox}[width=\width,align=c][1]{%
            \makebox[\commandkey{width}][\commandkey{align}]{#1}}`
            definisce essenzialmente la stessa cosa di \makebox, ma con sintassi diversa: per esempio
            `\mymakebox[width=10cm,align=s]{x y z}`
            equivale a \makebox[10cm][s]{x y z].

            Ok, grazie. Non è esattamente quello che speravo, ma al limite me lo faccio andare bene.

            Mi sembra di capire che l’alternativa è usare comandi TeX per definire il tutto, giusto?

            Se non spieghi che cosa vuoi fare, che pretendi? 🙂

            Ciao
            Enrico

          • #48857
            Stemby
            Partecipante
              Up
              0
              Down
              ::

              Se non spieghi che cosa vuoi fare, che pretendi? 🙂

              Va bene… non si riescono a mantenere segreti, in questo forum 🙄

              😀

              In pratica vorrei avere a disposizione questi 2 comandi:
              `
              \makecolorbox{colore}[ampiezza][c|l|r|s]{testo}

              \framecolorbox{colore_cornice}{colore_sfondo}[ampiezza][c|l|r|s]{testo}
              `
              Ho scelto una sintassi che sia la più simile possibile a quella degli altri *box esistenti.

            • #48858
              Up
              0
              Down
              ::

              Se non spieghi che cosa vuoi fare, che pretendi? 🙂

              Va bene… non si riescono a mantenere segreti, in questo forum 🙄

              😀

              In pratica vorrei avere a disposizione questi 2 comandi:
              `
              \makecolorbox{colore}[ampiezza][c|l|r|s]{testo}

              \framecolorbox{colore_cornice}{colore_sfondo}[ampiezza][c|l|r|s]{testo}
              `
              Ho scelto una sintassi che sia la più simile possibile a quella degli altri *box esistenti.

              Ecco come si può fare con xparse:
              `\documentclass[a4paper]{article}
              \usepackage{color,xparse}
              \DeclareDocumentCommand\makecolorbox{o m O{\width} O{c} m}{%
              \IfNoValueTF{#1}{\colorbox{#2}}{\colorbox[#1]{#2}}%
              {\makebox[#3][#4]{#5}}}

              \DeclareDocumentCommand\framecolorbox{o m m O{\width} O{c} m}{%
              \IfNoValueTF{#1}{\fcolorbox{#2}{#3}}{\fcolorbox[#1]{#2}{#3}}%
              {\makebox[#4][#5]{#6}}}

              \begin{document}
              \makecolorbox{green}{Abc}

              \makecolorbox{green}[3cm]{Abc}

              \makecolorbox{green}[3cm][l]{Abc}

              \makecolorbox[rgb]{0,0,1}{Abc}

              \makecolorbox[rgb]{0,0,1}[3cm]{Abc}

              \makecolorbox[rgb]{0,0,1}[3cm][l]{Abc}

              \framecolorbox{green}{red}{Abc}

              \framecolorbox{green}{red}[3cm]{Abc}

              \framecolorbox{green}{red}[3cm][l]{Abc}

              \framecolorbox[rgb]{0,0,1}{1,0,0}{Abc}

              \framecolorbox[rgb]{0,0,1}{1,0,0}[3cm]{Abc}

              \framecolorbox[rgb]{0,0,1}{1,0,0}[3cm][l]{Abc}

              \end{document}`
              Davvero potente.

              Ciao
              Enrico

            • #48859
              Stemby
              Partecipante
                Up
                0
                Down
                ::


                Grazie!

                Non è però normale, questo risultato, vero?

              • #48860
                Up
                0
                Down
                ::

                Grazie!

                Non è però normale, questo risultato, vero?

                No, a me viene come previsto. Controlla di aver copiato correttamente.

                Ciao
                Enrico

              • #48861
                Stemby
                Partecipante
                  Up
                  0
                  Down
                  ::


                  Sì, funziona.

                  Grazie mille!!! Fantastico come sempre.

                  Ti va di proporlo come patch all’autore di color? Questi 2 comandi sono mooolto comodi.

                  Ciao ciao!
                  Carlo

                • #48862
                  Stemby
                  Partecipante
                    Up
                    0
                    Down
                    ::


                    Solo una cosina: al comando \framecolorbox bisogna con ogni probabilità togliere 2 volte \fboxrule come larghezza, e ad entrambi i comandi 2*\fboxsep.

                    [EDIT]
                    Ecco il codice patchato:
                    `
                    \RequirePackage{color,xparse,calc}
                    \DeclareDocumentCommand\makecolorbox{o m O{\width} O{c} m}{%
                    \IfNoValueTF{#1}{\colorbox{#2}}{\colorbox[#1]{#2}}%
                    {\makebox[#3-2\fboxsep][#4]{#5}}}
                    \DeclareDocumentCommand\framecolorbox{o m m O{\width} O{c} m}{%
                    \IfNoValueTF{#1}{\fcolorbox{#2}{#3}}{\fcolorbox[#1]{#2}{#3}}%
                    {\makebox[#4-2\fboxsep-2\fboxrule][#5]{#6}}}
                    `

                    Grazie ancora!

                  • #48863
                    Up
                    0
                    Down
                    ::

                    Solo una cosina: al comando \framecolorbox bisogna con ogni probabilità togliere 2 volte \fboxrule come larghezza, e ad entrambi i comandi 2*\fboxsep.

                    Se dai \framecolorbox{green}{red}{Abc} e \fcolorbox{green}{red}{Abc} ottieni lo stesso risultato.

                    Ciao
                    Enrico

                  • #48864
                    Stemby
                    Partecipante
                      Up
                      0
                      Down
                      ::


                      Prova
                      `
                      \framecolorbox{black}{red}[\columnwidth]{prova}
                      \\
                      \makecolorbox{red}[\columnwidth]{prova}
                      `
                      col codice patchato che ho postato poco sopra, e vedrai che viene giusto al pixel.

                      Ciao!

                    • #48865
                      Up
                      0
                      Down
                      ::

                      Prova
                      `
                      \framecolorbox{black}{red}[\columnwidth]{prova}
                      \\
                      \makecolorbox{red}[\columnwidth]{prova}
                      `
                      col codice patchato che ho postato poco sopra, e vedrai che viene giusto al pixel.

                      Avresti lo stesso problema con \framebox[\columnwidth]{abc}; si sa che \framebox (come \fcolorbox) aggiunge i bordi all’esterno. Quegli aggiustamenti vanno fatti nella dimensione passata come argomento; naturalmente puoi definirti i comandi come vuoi, ma in generale è meglio se comandi simili hanno comportamenti simili.

                      Ciao
                      Enrico

                    • #48866
                      Stemby
                      Partecipante
                        Up
                        0
                        Down
                        ::

                        Avresti lo stesso problema con \framebox[\columnwidth]{abc}

                        No

                        Questo è il codice (con i comandi ridefiniti da me):
                        `
                        \framecolorbox{black}{red}[\columnwidth]{prova}
                        \\
                        \makecolorbox{red}[\columnwidth]{prova}
                        \\
                        \framebox[\columnwidth]{abc}
                        `

                      • #48867
                        Up
                        0
                        Down
                        ::

                        Avresti lo stesso problema con \framebox[\columnwidth]{abc}

                        No

                        Questo è il codice (con i comandi ridefiniti da me):
                        `
                        \framecolorbox{black}{red}[\columnwidth]{prova}
                        \\
                        \makecolorbox{red}[\columnwidth]{prova}
                        \\
                        \framebox[\columnwidth]{abc}
                        `

                        Come risulta dalla documentazione di color (grfguide.pdf), \colorbox aggiunge \fboxsep alle dimensioni (sopra, sotto, a destra e a sinistra). E ci sono ottimi motivi per farlo. Poi decidi tu.

                        Ciao
                        Enrico

                      • #48868
                        Stemby
                        Partecipante
                          Up
                          0
                          Down
                          ::

                          Come risulta dalla documentazione di color (grfguide.pdf), \colorbox aggiunge \fboxsep alle dimensioni (sopra, sotto, a destra e a sinistra). E ci sono ottimi motivi per farlo.

                          Hai ragione. Mi sono convinto anch’io che effettivamente sia meglio come avevi scritto tu.

                          Ciao!

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

                      Go to top