Variabili dinamiche

  • Creatore
    Topic
  • #85543
    Up
    0
    Down
    ::


    Ciao a tutti,

    ho bisogno di definire varibili dinamiche ovvero il cui nome dipende dal valore di altre variabili. Con un linguaggio di programmazione tradizionale, utilizzerei dei vettori posizionali
    `
    pos = 1
    dim[ pos ] = 5
    descr[ pos ] = “Compositore”
    `
    o associativi
    `
    dim[ “Giuseppe Verdi” ] = 5
    descr[ “Giuseppe Verdi” ] = “Compositore”
    `
    o variabili dinamiche
    `
    pos = 1
    eval dim$pos = 5 % pos1 = 5
    eval descr$pos = “Compositore” % descr1 = “Compositore”
    `
    E con LaTeX?

    a

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


        Ciao,
        puoi usare le sequence di LaTeX3. Sono a tutti gli effetti array associativi.
        Trovi spiegazioni ed esempi negli articoli di Enrico sui due numeri di ArsTeXnica 2012, scaricabili dal sito.
        Saluti.
        R.

      • #85545
        Up
        0
        Down
        ::


        Grazie Robitex. L’articolo del numero 13 l’ho scaricato. Quello del numero 14 è disponibile ai soli associati. In ogni caso consulerò la documentazione LaTeX3 per la parte relativa alle sequence. Ho trovato anche riferimenti al package etoolbox e alle sue macro \csdef e \csuse.

        a

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

          Amedeo” post=84997Grazie Robitex. L’articolo del numero 13 l’ho scaricato. Quello del numero 14 è disponibile ai soli associati. In ogni caso consulerò la documentazione LaTeX3 per la parte relativa alle sequence. Ho trovato anche riferimenti al package etoolbox e alle sue macro \csdef e \csuse.

          a

          Prego,
          ottimo punto di partenza.
          Può darsi che per le tue esigenze sia più che sufficiente usare esclusivamente TeX.
          Per esempio il comando seguente salva un testo in una macro, ed il successivo recupera il testo argomento:
          `
          \def\set#1#2{%
          \expandafter\def\csname #1\endcsname{#2}}

          \def\get#1{%
          \csname #1 \endcsname
          }
          `
          Uso spesso questa semplice tecnica e so che LaTeX base mette a dsiposizione delle macro giò pronte per esempio \name@def.
          R.

        • #85547
          Up
          0
          Down
          ::

          Amedeo” post=84994Ciao a tutti,

          ho bisogno di definire varibili dinamiche ovvero il cui nome dipende dal valore di altre variabili. Con un linguaggio di programmazione tradizionale, utilizzerei dei vettori posizionali
          `
          pos = 1
          dim[ pos ] = 5
          descr[ pos ] = “Compositore”
          `
          o associativi
          `
          dim[ “Giuseppe Verdi” ] = 5
          descr[ “Giuseppe Verdi” ] = “Compositore”
          `
          o variabili dinamiche
          `
          pos = 1
          eval dim$pos = 5 % pos1 = 5
          eval descr$pos = “Compositore” % descr1 = “Compositore”
          `
          E con LaTeX?

          Meglio se fai un esempio di qualcosa più “LaTeX”. Mi vengono in mente le variabili “property list” (associative) o “sequence” (indicizzate).

          Ciao
          Enrico

        • #85548
          Up
          0
          Down
          ::



          @Enrico
          : L’idea che avevo era di generalizzare uno schema che mi avevi suggerito tu per costruire una tabella a 5 colonne, indicando, in pratica, il numero di colonne tra i parametri della funzione:
          `
          \begin{McsTabGen}{
          testata=Intestazione tabella,
          ncol=5,
          cpos=1, cont=Teta, dim={.2}, %prima colonna con intestazione “Teta” e dimensione .2
          cpos=2, cont=Alfa, dim={.2}, %seconda colonna con intestazione “Alfa” e dimensione .2
          cpos=3, cont=Beta, dim={.2}, %terza colonna con intestazione “Beta” e dimensione .2
          cpos=4, cont=Gamma, dim={.2}, %quarta colonna con intestazione “Gamma” e dimensione .2
          cpos=5, cont=Omega, dim={.2}, %quinta colonna con intestazione “Omega” e dimensione .2
          }
          \McsRigaTabGen{aaa}{bbb}{ccc}{ddd}{eee}
          \McsRigaTabGen{fff}{ggg}{hhh}{iii}{jjj}
          \end{McsTabGen}
          `
          a

        • #85549
          Up
          0
          Down
          ::


          Un’altra idea: e il pacchetto datatool? In fondo si potrebbe vedere il problema come una tabella di un database…

          Ciao
          Claudio

        • #85550
          Up
          0
          Down
          ::

          Amedeo” post=84994Ciao a tutti,

          ho bisogno di definire varibili dinamiche ovvero il cui nome dipende dal valore di altre variabili. Con un linguaggio di programmazione tradizionale, utilizzerei dei vettori posizionali
          `
          pos = 1
          dim[ pos ] = 5
          descr[ pos ] = “Compositore”
          `
          o associativi
          `
          dim[ “Giuseppe Verdi” ] = 5
          descr[ “Giuseppe Verdi” ] = “Compositore”
          `
          o variabili dinamiche
          `
          pos = 1
          eval dim$pos = 5 % pos1 = 5
          eval descr$pos = “Compositore” % descr1 = “Compositore”
          `
          E con LaTeX?

          a

          I nomi delle macro in TeX sono usati come chiavi di un grande array associativo che contiene i valori delle macro stesse. In sostanza, puoi definire macro che si chiamano come vuoi tu (non ci sono i vincoli stringenti sui nomi di variabili tipici di altri linguaggi di programmazione).

          `\documentclass{article}

          \makeatletter
          \newcommand\getValue[1]{\@nameuse{value@#1}}
          \newcommand\setValue[1]{\@namedef{value@#1}}
          \newcommand\getDim[1]{\@nameuse{dim@#1}}
          \newcommand\setDim[1]{\@namedef{dim@#1}}
          \newcommand\getDescr[1]{\@nameuse{descr@#1}}
          \newcommand\setDescr[1]{\@namedef{descr@#1}}
          \makeatother

          \begin{document}

          \def\pos{1}

          \setDim{\pos}{5}
          \setDescr{\pos}{Compositore}

          \getDim{\pos}, \getDescr{\pos}

          \setDim{Giuseppe Verdi}{5}
          \setDescr{Giuseppe Verdi}{Compositore}

          \getDim{Giuseppe Verdi}, \getDescr{Giuseppe Verdi}

          \def\pos{1}

          \setValue{dim\pos}{5}
          \setValue{descr\pos}{Compositore}

          \getValue{dim1}, \getValue{descr1}

          \end{document}`

          Ciao,
          Antonio

        • #85551
          Up
          0
          Down
          ::


          Grazie. A beneficio di tutti riporto di seguito il codice che ho tratto dai vari suggerimenti e che risolve il mio obiettivo (tabelle con numero variabile di colonne e testata opzionale).
          `
          \documentclass{article}
          \usepackage[utf8]{inputenc}
          \usepackage[italian]{babel}
          \usepackage{calc}
          \usepackage{tabularx}
          \usepackage{booktabs}
          \usepackage{xparse}
          \usepackage{xcolor,colortbl}
          \usepackage{soulutf8,color}
          \usepackage{lipsum}
          \usepackage{longtable}

          \newcommand\McsTcw[1]{#1\textwidth-2\tabcolsep}
          \newcommand\McsTh[2][McsColTestTbl]{\cellcolor{#1}\textbf{\textit{#2}}}
          \definecolor{McsColTestTbl}{rgb}{.8,.8,.8}

          \ExplSyntaxOn
          \keys_define:nn { McsTabDefs } {%
          testata .tl_set:N = \l_McsTab_Testata_tl,
          col1 .tl_set:N = \l_McsTab_HColA_tl,
          col2 .tl_set:N = \l_McsTab_HColB_tl,
          col3 .tl_set:N = \l_McsTab_HColC_tl,
          col4 .tl_set:N = \l_McsTab_HColD_tl,
          col5 .tl_set:N = \l_McsTab_HColE_tl,
          dim1 .tl_set:N = \l_McsTab_DimColA_tl,
          dim2 .tl_set:N = \l_McsTab_DimColB_tl,
          dim3 .tl_set:N = \l_McsTab_DimColC_tl,
          dim4 .tl_set:N = \l_McsTab_DimColD_tl,
          dim5 .tl_set:N = \l_McsTab_DimColE_tl,
          }
          \tl_new:N \l_McsTab_TabContens_tl
          \tl_new:N \l_McsTab_TabColDefs_tl
          \int_new:N \l_McsTab_NumCols_tl
          \NewDocumentEnvironment{ McsTabGen } { mm } {%
          \int_set:Nn \l_McsTab_NumCols_tl { #1 }
          \keys_set:nn { McsTabDefs } { #2 }
          \begin{center}
          \small
          \tl_put_right:No \l_McsTab_TabContens_tl {%
          \begin{tabular} {
          p{ \l_McsTab_DimColA_tl }
          p{ \l_McsTab_DimColB_tl }
          p{ \l_McsTab_DimColC_tl }
          p{ \l_McsTab_DimColD_tl }
          p{ \l_McsTab_DimColE_tl }
          }
          }
          \tl_put_right:Nn \l_McsTab_TabContens_tl {%
          \toprule
          \tl_if_empty:NTF \l_McsTab_Testata_tl {} {
          \multicolumn{\l_McsTab_NumCols_tl}{c}{\McsTh{\l_McsTab_Testata_tl}} \\
          \midrule }
          \McsTh{\l_McsTab_HColA_tl} &
          \McsTh{\l_McsTab_HColB_tl}
          }
          \int_compare:nTF { \l_McsTab_NumCols_tl > 2 } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { & \McsTh{\l_McsTab_HColC_tl} }}{}
          \int_compare:nTF { \l_McsTab_NumCols_tl > 3 } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { & \McsTh{\l_McsTab_HColD_tl} }}{}
          \int_compare:nTF { \l_McsTab_NumCols_tl > 4 } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { & \McsTh{\l_McsTab_HColE_tl} }}{}
          \tl_put_right:Nn \l_McsTab_TabContens_tl { \\ }
          }{
          \tl_use:N \l_McsTab_TabContens_tl
          \bottomrule
          \end{tabular}
          \end{center}
          }
          \NewDocumentEnvironment{ McsTabFive } { m } {\begin{McsTabGen} {5} {#1} }{ \end{McsTabGen} }
          \NewDocumentEnvironment{ McsTabFour } { m } {\begin{McsTabGen} {4} {#1} }{ \end{McsTabGen} }
          \NewDocumentEnvironment{ McsTabThree } { m } {\begin{McsTabGen} {3} {#1} }{ \end{McsTabGen} }
          \NewDocumentEnvironment{ McsTabTwo } { m } { \begin{McsTabGen} {2} {#1} }{ \end{McsTabGen} }

          \NewDocumentCommand{\McsRigaTabFive} { mmmmm } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { \midrule #1 & #2 & #3 & #4 & #5 \\ }
          }
          \NewDocumentCommand{\McsRigaTabFour} { mmmm } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { \midrule #1 & #2 & #3 & #4 \\ }
          }
          \NewDocumentCommand{\McsRigaTabThree} { mmm } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { \midrule #1 & #2 & #3 \\ }
          }
          \NewDocumentCommand{\McsRigaTabTwo} { mm } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { \midrule #1 & #2 \\ }
          }

          \NewDocumentEnvironment{McsLongTabGen} { mm } {%
          \int_set:Nn \l_McsTab_NumCols_tl { #1 }
          \keys_set:nn { McsTabDefs } { #2 }
          \vspace*{-\baselineskip}
          \begin{center}
          \small
          \tl_put_right:No \l_McsTab_TabContens_tl {%
          \begin{longtable} {
          p{ \l_McsTab_DimColA_tl }
          p{ \l_McsTab_DimColB_tl }
          p{ \l_McsTab_DimColC_tl }
          p{ \l_McsTab_DimColD_tl }
          p{ \l_McsTab_DimColE_tl }
          }
          }
          % intestazione iniziale
          \tl_put_right:Nn \l_McsTab_TabContens_tl {%
          \toprule
          \tl_if_empty:NTF \l_McsTab_Testata_tl {} {
          \multicolumn{\l_McsTab_NumCols_tl}{c}{\McsTh{\l_McsTab_Testata_tl}} \\
          \midrule }
          \McsTh{\l_McsTab_HColA_tl} &
          \McsTh{\l_McsTab_HColB_tl}
          }
          \int_compare:nTF { \l_McsTab_NumCols_tl > 2 } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { & \McsTh{\l_McsTab_HColC_tl} }}{}
          \int_compare:nTF { \l_McsTab_NumCols_tl > 3 } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { & \McsTh{\l_McsTab_HColD_tl} }}{}
          \int_compare:nTF { \l_McsTab_NumCols_tl > 4 } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { & \McsTh{\l_McsTab_HColE_tl} }}{}
          \tl_put_right:Nn \l_McsTab_TabContens_tl { \\ \endfirsthead }
          % intestazione inizio nuova pagina
          \tl_put_right:Nn \l_McsTab_TabContens_tl {%
          \multicolumn{\l_McsTab_NumCols_tl}{l}
          {\begin{footnotesize}\textit{continua~dalla~pagina~precedente}\end{footnotesize}} \\
          \toprule
          \tl_if_empty:NTF \l_McsTab_Testata_tl {} {
          \multicolumn{\l_McsTab_NumCols_tl}{c}{\McsTh{\l_McsTab_Testata_tl}} \\
          \midrule }
          \McsTh{\l_McsTab_HColA_tl} &
          \McsTh{\l_McsTab_HColB_tl}
          }
          \int_compare:nTF { \l_McsTab_NumCols_tl > 2 } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { & \McsTh{\l_McsTab_HColC_tl} }}{}
          \int_compare:nTF { \l_McsTab_NumCols_tl > 3 } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { & \McsTh{\l_McsTab_HColD_tl} }}{}
          \int_compare:nTF { \l_McsTab_NumCols_tl > 4 } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { & \McsTh{\l_McsTab_HColE_tl} }}{}
          \tl_put_right:Nn \l_McsTab_TabContens_tl { \\ \midrule \endhead }
          % piede verso nuova pagina
          \tl_put_right:Nn \l_McsTab_TabContens_tl {%
          \multicolumn{\l_McsTab_NumCols_tl}{r}
          {\begin{footnotesize}\textit{continua~nella~prossima~pagina}\end{footnotesize}} \\
          \endfoot
          }
          % piede finale
          \tl_put_right:Nn \l_McsTab_TabContens_tl {%
          \bottomrule
          \multicolumn{\l_McsTab_NumCols_tl}{r}
          {\begin{footnotesize}\textit{si~conclude~dalla~pagina~precedente}\end{footnotesize}} \\
          \endlastfoot
          }
          }{%
          \tl_use:N \l_McsTab_TabContens_tl
          \end{longtable}
          \end{center}
          }
          \NewDocumentEnvironment{ McsLongTabFive } { m } { \begin{McsLongTabGen} {5} {#1} }{ \end{McsLongTabGen} }
          \NewDocumentEnvironment{ McsLongTabFour } { m } { \begin{McsLongTabGen} {4} {#1} }{ \end{McsLongTabGen} }
          \NewDocumentEnvironment{ McsLongTabThree } { m } { \begin{McsLongTabGen} {3} {#1} }{ \end{McsLongTabGen} }
          \NewDocumentEnvironment{ McsLongTabTwo } { m } { \begin{McsLongTabGen} {2} {#1} }{ \end{McsLongTabGen} }
          \NewDocumentCommand{\McsRigaLongTabFive} { mmmmm } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { \midrule #1 & #2 & #3 & #4 & #5 \\ }
          }
          \NewDocumentCommand{\McsRigaLongTabFour} { mmmm } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { \midrule #1 & #2 & #3 & #4 \\ }
          }
          \NewDocumentCommand{\McsRigaLongTabThree} { mmm } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { \midrule #1 & #2 & #3 \\ }
          }
          \NewDocumentCommand{\McsRigaLongTabTwo} { mm } {%
          \tl_put_right:Nn \l_McsTab_TabContens_tl { \midrule #1 & #2 \\ }
          }

          \ExplSyntaxOff

          \begin{document}

          \lipsum[1]

          \begin{McsTabFive}{
          testata=Profili autorizzativi,
          col1=Account, dim1=\McsTcw{.15},
          col2=Certificatore, dim2=\McsTcw{.25},
          col3=Dt. rilascio, dim3=\McsTcw{.2},
          col4=Validità, dim4=\McsTcw{.2},
          col5=Note, dim5=\McsTcw{.2}
          }
          \McsRigaTabFive{uuuu}{aaaaa aaaa aaaaaa}{xxx}{XX anni}{xxx}
          \end{McsTabFive}

          \lipsum[2]

          \begin{McsTabFour}{
          col1=Alfa, dim1=\McsTcw{.2},
          col2=Beta, dim2=\McsTcw{.15},
          col3=Gamma, dim3=\McsTcw{.2},
          col4=Delta, dim4=\McsTcw{.3}
          }
          \McsRigaTabFour{aaa}{bbb}{ccc}{ddd}
          \McsRigaTabFour{fff}{ggg}{hhh}{iii}
          \end{McsTabFour}

          \lipsum[3]

          \begin{McsTabThree}{
          testata=Nuova testata,
          col1=Teta, dim1=\McsTcw{.33},
          col2=Micro, dim2=\McsTcw{.33},
          col3=Macro, dim3=\McsTcw{.33}
          }
          \McsRigaTabThree{kkk}{lll}{mmm}
          \McsRigaTabThree{ppp}{qqq}{rrr}
          \end{McsTabThree}

          \lipsum[4]

          \begin{McsLongTabFive}{
          testata=Tabella Lunga con cinque colonne,
          col1=Account, dim1=\McsTcw{.2},
          col2=Certificatore, dim2=\McsTcw{.2},
          col3=Dt. rilascio, dim3=\McsTcw{.2},
          col4=Validità, dim4=\McsTcw{.2},
          col5=Note, dim5=\McsTcw{.2}
          }
          \McsRigaLongTabFive
          {There are three ways to define new functions. All classes define a function to expand to the substitution text. Within the substitution text the actual parameters are substituted for the formal parameters}
          {Sets function to expand to code as replacement text. Within the code , the parameters}
          {Configurazione degli apparati informatici per l'esecuzione di controlli automatizzati}
          {Sessioni di collaudo e certificazione delle soluzioni di ripristino}
          {h sdhg jg ashdg hjshghds ghsdh ghds ghasdhg}
          \McsRigaLongTabFive
          {There are three ways to define new functions. All classes define a function to expand to the substitution text. Within the substitution text the actual parameters are substituted for the formal parameters}
          {Sets function to expand to code as replacement text. Within the code , the parameters}
          {Configurazione degli apparati informatici per l'esecuzione di controlli automatizzati}
          {Sessioni di collaudo e certificazione delle soluzioni di ripristino}
          {h sdhg jg ashdg hjshghds ghsdh ghds ghasdhg}
          \McsRigaLongTabFive
          {There are three ways to define new functions. All classes define a function to expand to the substitution text. Within the substitution text the actual parameters are substituted for the formal parameters}
          {Sets function to expand to code as replacement text. Within the code , the parameters}
          {Configurazione degli apparati informatici per l'esecuzione di controlli automatizzati}
          {Sessioni di collaudo e certificazione delle soluzioni di ripristino}
          {h sdhg jg ashdg hjshghds ghsdh ghds ghasdhg}
          \McsRigaLongTabFive
          {There are three ways to define new functions. All classes define a function to expand to the substitution text. Within the substitution text the actual parameters are substituted for the formal parameters}
          {Sets function to expand to code as replacement text. Within the code , the parameters}
          {Configurazione degli apparati informatici per l'esecuzione di controlli automatizzati}
          {Sessioni di collaudo e certificazione delle soluzioni di ripristino}
          {h sdhg jg ashdg hjshghds ghsdh ghds ghasdhg}
          \McsRigaLongTabFive
          {There are three ways to define new functions. All classes define a function to expand to the substitution text. Within the substitution text the actual parameters are substituted for the formal parameters}
          {Sets function to expand to code as replacement text. Within the code , the parameters}
          {Configurazione degli apparati informatici per l'esecuzione di controlli automatizzati}
          {Sessioni di collaudo e certificazione delle soluzioni di ripristino}
          {h sdhg jg ashdg hjshghds ghsdh ghds ghasdhg}
          \McsRigaLongTabFive
          {There are three ways to define new functions. All classes define a function to expand to the substitution text. Within the substitution text the actual parameters are substituted for the formal parameters}
          {Sets function to expand to code as replacement text. Within the code , the parameters}
          {Configurazione degli apparati informatici per l'esecuzione di controlli automatizzati}
          {Sessioni di collaudo e certificazione delle soluzioni di ripristino}
          {h sdhg jg ashdg hjshghds ghsdh ghds ghasdhg}
          \McsRigaLongTabFive
          {There are three ways to define new functions. All classes define a function to expand to the substitution text. Within the substitution text the actual parameters are substituted for the formal parameters}
          {Sets function to expand to code as replacement text. Within the code , the parameters}
          {Configurazione degli apparati informatici per l'esecuzione di controlli automatizzati}
          {Sessioni di collaudo e certificazione delle soluzioni di ripristino}
          {h sdhg jg ashdg hjshghds ghsdh ghds ghasdhg}
          \McsRigaLongTabFive
          {There are three ways to define new functions. All classes define a function to expand to the substitution text. Within the substitution text the actual parameters are substituted for the formal parameters}
          {Sets function to expand to code as replacement text. Within the code , the parameters}
          {Configurazione degli apparati informatici per l'esecuzione di controlli automatizzati}
          {Sessioni di collaudo e certificazione delle soluzioni di ripristino}
          {h sdhg jg ashdg hjshghds ghsdh ghds ghasdhg}
          \end{McsLongTabFive}

          \lipsum[1]

          \end{document}
          `

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

      Go to top