Gestione dei parametri dei comandi

  • Creatore
    Topic
  • #5767
    ev
    Partecipante
      Up
      0
      Down
      ::


      Ciao,

      Ieri ho passato un po’ di tempo a cercare di imparare alcune cose su come si definiscono i comandi in “stile” ConTeXt. Spulciando nel codice (syst-gen.tex) e nello wiki credo di essere giunto ad un buon punto, ma ho ancora qualche perplessità.

      Inizio dalla gestione degli argomenti “semplici”. Oltre alle varie macro \dosingleempty, \dodoubleempty, etc., ci sono anche \dosingleargument, \dodoubleargument, etc. per i casi nei quali non si vogliono argomenti opzionali, ma l’implementazione di queste macro usa le corrispondenti \do*empty, rendendole di fatto superflue (non fidandomi completamente della mia comprensione del codice, ho effettivamente provato ad usare \dosingleargument al posto di \dosingleempty, a non fornire alcun argomento all’atto dell’utilizzo della nuova macro ed a “tracciarne” l’esecuzione: non fa una piega). Mi chiedo se mi son perso in un bicchiere d’acqua oppure se nelle versioni successive di ConTeXt sia cambiato qualche cosa che ignoro.

      Passando a \definestartstop, il secondo argomento può contenere le keyword before, after, style e commands, ma, consideratane l’implementazione (che usa \getparameters) anche qualunque altra cosa venga in mente all’utente. La manipolazione di questa lista di coppie chiave-valore usa un prefisso “strano” (\??be ) con uno spazio finale, che complica un po’ le cose, ma come ho fatto nell’esempio seguente, si può aggirare in qualche modo l’ostacolo (per ora ignoro l’esistenza di qualche cosa di simile a \@nameuse di LaTeX, quindi mi sono arrangiato nel modo tradizionale):

      `\unprotect
      \definestartstop[esperimento]
      [saluto={Ciao a tutti}, commands=\MyEsperimento]
      \def\MyEsperimento{%
      \csname\??be esperimentosaluto\endcsname\crlf}
      \protect

      \startesperimento Tutti\unknown\stopesperimento

      \setupstartstop[esperimento][saluto={Non saluto nessuno}]
      \startesperimento Tutti\unknown\stopesperimento`

      Il codice precedente, però, non permette di specificare argomenti opzionali/obbligatori per il blocco start/stop. Per quanto ho potuto vedere, Hagen ha scritto (quasi?) tutti i blocchi start/stop di ConTeXt che hanno argomenti “un pezzo alla volta”:

      `\def\startbho{\bgroup\bho}
      \def\bho{\dosingleargument\dobho}
      \def\dobho[#1]{%
      %…
      }
      \def\stopbho{\egroup}`

      Anche in questo caso ho il dubbio di essermi perso in un bicchiere d’acqua…

    Visualizzazione 2 filoni di risposte
    • Autore
      Risposte
      • #5768
        Up
        0
        Down
        ::


        \dosingleempty in syst.gen.tex

        Ciao,
        Inizio dalla gestione degli argomenti “semplici”. Oltre alle varie macro \dosingleempty, \dodoubleempty,

        Hai ragione, le due macro sono praticamente uguali.
        E’ probabile che nel corso del tempo \dosingleempty sia diventata importante, e non si sia voluto riscrivere il codice contenente \dosingleargument.
        Dal mio punto vista, sarebbe stato meglio attivare il warning con \doshowargumenterror;
        ho provato qualche veloce hack con \let, ma niente di buono.

        \definestartstop in core-sys.tex
        Guarda come si espande \??be con \tracingmacros
        `
        \starttext
        \tracingmacros=2
        \startesperimento Tutti\unknown\stopesperimento\tracingmacros=0
        \stoptext
        `
        `
        \getvalue #1->\csname #1\endcsname
        #1<-\??be esperimento\c!before \??be ->@@be

        \c!before ->\c!internal! before

        \@@beesperimentobefore ->
        `
        Lo spazio ci vuole perche’ \??be e’ una macro.

        Il codice precedente, però, non permette di specificare argomenti opzionali/obbligatori per il blocco start/stop.

        Non mi e’ molto chiaro cosa si intende in ConTeXt con opzionali/obbligatori ;
        per intenderci,
        \framed[PIPPO={CANE}]{\TeX}
        e’ perfettamente lecito, e chiaramente PIPPO e’ arbitrario.

        luigi

        PS
        Mi fa piacere dopo anni discutere in italiano di queste cose !

      • #5769
        ev
        Partecipante
          Up
          0
          Down
          ::

          Dal mio punto vista, sarebbe stato meglio attivare il warning con \doshowargumenterror;
          ho provato qualche veloce hack con \let, ma niente di buono.

          Concordo sul warning; purtroppo, a meno di non ridefinirle una per una, quelle macro non produrranno mai alcun warning perché usano \do*empty che sono definite più o meno così (commenti e tutto il resto):
          `\def\dosingleempty#1%
          {\noshowargumenterror % \relax % prevents lookahead, brr
          \doifnextcharelse[%
          {\firstargumenttrue#1}
          {\dosinglefakeempty#1}}`

          Non mi e’ molto chiaro cosa si intende in ConTeXt con opzionali/obbligatori ;

          Intendevo dire che con una definizione come questa
          `\unprotect
          \definestartstop[esperimento]
          [saluto={Ciao a tutti}, commands=\MyEsperimento]
          \def\MyEsperimento{%
          \csname\??be esperimentosaluto\endcsname\crlf}
          \protect `
          non posso scrivere
          `
          \startesperimento[saluto={Non funziona}]
          %…
          \stopesperimento`
          ma devo necessariamente utilizzare \setupstartstop. Per ottenere il comportamento richiesto, ho trovato come unica soluzione quella che ho proposto al termine del mio primo messaggio: costruire il blocco “a mano” :).

        • #5770
          Up
          0
          Down
          ::

          comportamento richiesto, ho trovato come unica soluzione quella che ho proposto al termine del mio primo messaggio: costruire il blocco “a mano” :).

          Si, il codice mi sembra giusto, ma non credo interpreti lo “spirito” di \definestartstop.
          In s-grk-00.tex c’e un esempio :
          `
          \definestartstop
          [greek]
          [commands=\directsetup{cbgreek}]
          :
          \startgreek
          a b c d e f g h i j k l m n o p q r s t u v w x y z \par
          A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
          \stopgreek`
          In syst-gen.tex ‘\definestartstop sembra avere con #2 un hook per una futura estensione, o per permettere codice come il tuo.
          Probabilmente \defineframedtext ,\setupframedtext,\star|\stopframedtext in core-rul.tex puo’ essere un altro esempio, come (l’inutile ?) \definestartstopcommand in syst-gen.tex
          Ovviamente si puo’ sempre definire qualcosa del tipo
          `
          \long\def\startesperimento[#1]#2\stopesperimento{%
          \begingroup
          \getparameter[ESP][saluto={Hello},commands=,#1]
          %% do something with #1 and #2
          \endgroup%
          }%
          `

          In \start|stopesperimento forse bisogna chiarire il compito di “commands”: sembra una specifica per una o piu’ macro, ma non e’ chiaro il contesto su cui dovrebbe(ro) agire.
          Se si vede \setuphead si nota che le opzioni sono sia “label”, sia macro senza argomenti
          (tipicamente per gli spazi) sia macro con 1 o piu’ argomenti
          `
          \setuphead[…][..,..=..,..]
          … section
          :number yes no
          ownnumber yes no
          before command
          inbetween command
          after command
          :
          command \command#1#2
          numbercommand \command#1
          textcommand \command#1
          :
          `
          ed e’ chiaro con un poco di esperimenti a cosa si riferiscono gli argomenti delle macro.

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

      Go to top