[CONCORSONE] Campi si ma più intelligenti

  • Creatore
    Topic
  • #95775
    robitex
    Amministratore del forum
      Up
      0
      Down
      ::


      Ciao,
      in un file di classe definisco due comandi \set e \get per gestire dei valori che poi verranno caricati da un file (contenente in comandi \set).
      Eccoli `\newcommand{\set}[2]{\expandafter\def\csname robitex@#1\endcsname{#2}}
      \newcommand{\get}[1]{\csname robitex@#1\endcsname}`

      Vorrei però migliorare la situazione con questi due desiderata:
      1 – vorrei che \get sollevasse un errore di classe se il campo non è definito
      2 – vorrei un’opzione da dare al comando \get se volessi colorare lo sfondo di questi campi per farli risaltare nel pdf.

      Un ultima cosa, fate presto a passarmi il codice…
      Nel senso che lo dovete fare voi ed io mi ritrovo il lavoro gratis 🙂
      Ringrazio anticipatamente
      R.

    Visualizzazione 8 filoni di risposte
    • Autore
      Risposte
      • #95776
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::


          Che fate? Battete la fiacca?
          R.

        • #95777
          franen
          Partecipante
            Up
            0
            Down
            ::


            Dovresti mettere CONCORSONE nel titolo, oppure “offro cassa di birra”, forse i tempi si stringerebbero 😀
            Intanto la parte 1:
            `\begin{filecontents}{robyclass.cls}
            \NeedsTeXFormat{LaTeX2e}[2005/12/01]
            \ProvidesClass{robyclass}[2014/08/01 v. 0.1 Classe per le prove di Roberto]
            \DeclareOption*{\PassOptionsToClass{\CurrentOption}{book}}
            \ProcessOptions\relax
            \LoadClass[a4paper]{book}
            \RequirePackage{etoolbox}
            \newcommand{\set}[2]{\expandafter\def\csname robitex@#1\endcsname{#2}}
            \newcommand{\get}[1]{%
            \ifcsdef{robitex@#1}%
            {\csname robitex@#1\endcsname}%
            {\ClassError{robyclass}{Attento, il comando robitex@#1 non è definito!}{}}}
            \end{filecontents}
            \documentclass{robyclass}
            \begin{document}
            \set{Prova}{Ciao!}
            \get{Prova}
            \get{prova}
            \end{document}`

          • #95778
            robitex
            Amministratore del forum
              Up
              0
              Down
              ::

              franen” post=95397Dovresti mettere CONCORSONE nel titolo, oppure “offro cassa di birra”, forse i tempi si stringerebbero 😀
              Intanto la parte 1

              Ah ecco così mi piaci. Ma non posso fare il copia ed incolla del codice adesso perché devo andare in spiaggia…
              Mica devo sempre lavorare.

              Aspetto la seconda parte del codice. Comunque sia, se il filone diventasse un concorsone — non temete questa volta premi davvero grandi — tu entreresti automaticamente tra i candidati.
              Scherzi a parte… grazie ed a presto.
              R.

            • #95779
              robitex
              Amministratore del forum
                Up
                0
                Down
                ::


                Ok. Questo è un concorsone.
                I partecipanti devono postare qui la loro soluzione entro la mezzanotte di domenica 3 agosto 2014.
                I premi saranno stabiliti dopo…
                Che volete, adesso devo proprio andare al mare.
                Grazie.

              • #95780
                franen
                Partecipante
                  Up
                  0
                  Down
                  ::


                  `\RequirePackage{filecontents}
                  \begin{filecontents*}{robyclass.cls}
                  \NeedsTeXFormat{LaTeX2e}[2005/12/01]
                  \ProvidesClass{robyclass}[2014/08/01 v. 0.1 Classe per le prove di Roberto]
                  \DeclareOption*{\PassOptionsToClass{\CurrentOption}{book}}
                  \ProcessOptions\relax
                  \LoadClass[a4paper]{book}
                  \RequirePackage{etoolbox, xcolor}
                  \newcommand{\set}[2]{\expandafter\def\csname robitex@#1\endcsname{#2}}
                  \newcommand{\get}[1]{%
                  \ifcsdef{robitex@#1}%
                  {\sottolinea{\csname robitex@#1\endcsname}}%
                  {\ClassError{robyclass}{Attento, il comando #1 non è definito!}{}}}
                  \newcommand{\sottolinea}[1]{\colorbox{green}{#1}}
                  \end{filecontents*}
                  \documentclass{robyclass}
                  \begin{document}
                  \set{prova}{re!}
                  \get{prova}
                  \end{document}`

                • #95781
                  franen
                  Partecipante
                    Up
                    0
                    Down
                    ::


                    Tanto per far sparire quell’\expandafter che mi spaventa ancora dopo tanti anni 😀
                    Poi dici se ti interessa poter spezzare le righe nel testo sottolineato, che in caso bisogna pensare a altri modi…
                    `\RequirePackage{filecontents}
                    \begin{filecontents*}{robyclass.cls}
                    \NeedsTeXFormat{LaTeX2e}[2005/12/01]
                    \ProvidesClass{robyclass}[2014/08/01 v. 0.1 Classe per le prove di Roberto]
                    \DeclareOption*{\PassOptionsToClass{\CurrentOption}{book}}
                    \ProcessOptions\relax
                    \LoadClass[a4paper]{book}
                    \RequirePackage{xparse, xcolor}
                    \ExplSyntaxOn
                    \DeclareDocumentCommand { \set }{ m m }
                    {
                    \cs_new_protected:cn {robitex@#1:} {#2}
                    }
                    \DeclareDocumentCommand { \get }{ m }
                    {
                    \cs_if_exist:cTF {robitex@#1:}
                    {\colorbox{green}{\use:c {robitex@#1:}}}
                    {\msg_error:nn {robyclass} {Sei~ certo~ che~ questo~ comando~ esista~ davvero?}}
                    }
                    \ExplSyntaxOff
                    \end{filecontents*}

                    \documentclass{robyclass}
                    \usepackage{lipsum}
                    \begin{document}
                    \lipsum

                    \set{prova}{Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura che la diritta via era smarrita}
                    \get{prova}
                    \end{document}`

                  • #95782
                    Up
                    0
                    Down
                    ::

                    robitex” post=95394Ciao,
                    in un file di classe definisco due comandi \set e \get per gestire dei valori che poi verranno caricati da un file (contenente in comandi \set).
                    Eccoli `\newcommand{\set}[2]{\expandafter\def\csname robitex@#1\endcsname{#2}}
                    \newcommand{\get}[1]{\csname robitex@#1\endcsname}`

                    Vorrei però migliorare la situazione con questi due desiderata:
                    1 – vorrei che \get sollevasse un errore di classe se il campo non è definito
                    2 – vorrei un’opzione da dare al comando \get se volessi colorare lo sfondo di questi campi per farli risaltare nel pdf.

                    Un ultima cosa, fate presto a passarmi il codice…
                    Nel senso che lo dovete fare voi ed io mi ritrovo il lavoro gratis 🙂
                    Ringrazio anticipatamente
                    R.

                    Senza alcun pacchetto in più. 😉
                    `\makeatletter
                    \newcommand{\set}[2]{\global\@namedef{robitex@#1}{#2}} % oppure senza \global se vuoi che i campi siano solo locali
                    \newcommand{\get}[1]{%
                    \@ifundefined{robitex@#1}
                    {\PackageError{robitex}{Undefined field #1}{The field you used has not yet been defined}}
                    {\@nameuse{robitex@#1}}%
                    }
                    \makeatother`
                    Ciao
                    Enrico

                  • #95783
                    Up
                    0
                    Down
                    ::


                    Diciamo che il mio è fuori concorso, perché ho preso il codice di @egreg e gli ho solo aggiunto il comando opzionale che desideravi. 😆

                    `
                    \documentclass{article}

                    \usepackage{xcolor}

                    \makeatletter
                    \newcommand{\set}[2]{\global\@namedef{robitex@#1}{#2}}
                    \newcommand{\get}[2][]{%
                    \edef\robitex@temp{\if!#1!%
                    \else
                    \unexpanded{\colorbox{#1}}%
                    \fi}%
                    \@ifundefined{robitex@#2}
                    {\PackageError{robitex}{Undefined field #2}{The field you used has not yet been defined}}
                    {\robitex@temp{\@nameuse{robitex@#2}}}}%
                    \makeatother
                    \begin{document}
                    \set{my}{Ciao a tutti}
                    \get[blue]{my}
                    \get[red]{my}
                    \get{my}
                    \end{document}`

                  • #95784
                    robitex
                    Amministratore del forum
                      Up
                      0
                      Down
                      ::


                      Grazie a tutti!
                      Avete fatto un buon lavoro ma purtroppo la conclusione è che non posso fare altro che assegnare il premio… a me stesso.
                      Del resto il premio era…

                      Ecco la soluzione vincente, veramente originale, che non modifica le specifiche di concorso, giunta in tempo utile:
                      `\documentclass{article}

                      \usepackage{xcolor}
                      \makeatletter
                      \def\robitex@render#1{#1}
                      \newcommand{\lightfield}[1][lime]{%
                      \def\robitex@render##1{%
                      \fcolorbox{gray}{#1}{##1}}%
                      }
                      \newcommand{\set}[2]{\global\@namedef{robitex@#1}{#2}}
                      \newcommand{\get}[1]{%
                      \@ifundefined{robitex@#1}
                      {\PackageError{robitex}{Undefined field `#1`}{The field you used has not yet been defined}}
                      {\robitex@render{\@nameuse{robitex@#1}}}%
                      }%
                      \makeatother

                      \begin{document}
                      \set{my}{Ciao a tutti}
                      \get{my}
                      \get{my}
                      \lightfield
                      \get{my}
                      \end{document}`

                      Come vedete un comando dal nome azzeccato — \lightfield — fa in modo che tutti i capi di li in poi vengano evidenziati.
                      Non aveva molto senso dare l’opzione di evidenziatura ad ogni singolo \get.
                      Il colore “lime” è molto elegante sul mio nuovo schermo led 28″…
                      Ciao.
                      R.

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

                  Go to top