- Questo topic ha 8 risposte, 5 partecipanti ed è stato aggiornato l'ultima volta 13 anni, 4 mesi fa da
Amedeo Giacovelli.
-
CreatoreTopic
-
7 Maggio 2013 alle 7:40 #85543::
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
-
CreatoreTopic
-
AutoreRisposte
-
-
7 Maggio 2013 alle 7:49 #85544
-
7 Maggio 2013 alle 8:18 #85545
-
7 Maggio 2013 alle 8:33 #85546::
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.
-
7 Maggio 2013 alle 8:53 #85547::
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
-
7 Maggio 2013 alle 10:00 #85548::
@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
-
7 Maggio 2013 alle 16:33 #85549
-
9 Maggio 2013 alle 21:00 #85550::
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
-
10 Maggio 2013 alle 8:07 #85551::
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}
`
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.