Tex: macro per tabular environment

  • Creatore
    Topic
  • #9924
    Up
    0
    Down
    ::


    Ciao a tutti!

    E’ il mio primo post su questa lista e vi faccio i complimenti per il forum! Ho esperienza di Latex ma quasi nessuna di Tex e vorrei creare una macro da poter richiamare all’interno del tabular environment per ripetere N volte un pattern composto di stringa + caratteri di controllo. Ho studiato un po’ di documentazione su Tex e ho scritto:

    \begin{tabular}{|ccccc|}}
    \hline
    \multicolumn{5}{|c|}{Titolo}\\
    \hline
    \duplicate{& str1 & str2}{2}\\ %^
    \hline
    \end{tabular}

    ^Quello che vorrei ottenere e’: & str1 & str2 & str1 & str2 \\

    La macro \duplicate che ho scritto e’:

    \newcommand{\duplicate}[2]
    {
    \count255 = #2
    \loop
    #1
    \ifnum\count255 > 1
    \advance\count255 by -1
    \repeat
    }

    Ma ovviamente (!) da errore perche’ i caratteri di tabulazione (&) all’interno della macro vengono interpretati come caratteri di controllo:

    […]
    ! Misplaced alignment tab character &.
    \iterate ->&
    str1 & str2 \ifnum \count 255 > 1 \advance \count 255 by -1 \re…
    l.26 \duplicate{& cms0 & cms1}{24}
    \\

    Ho visto che esiste il comando ‘\catcode per fare in modo che cio’ non accada, ma non sono riuscito ad utilizzarlo con successo. Qualcuno puo’ suggerirmi come risolvere il problema e/o qualche riferimento per approfondire il problema?

    Grazie mille!

    Federico.

Visualizzazione 3 filoni di risposte
  • Autore
    Risposte
    • #9925
      Up
      0
      Down
      ::

      E’ il mio primo post su questa lista e vi faccio i complimenti per il forum! Ho esperienza di Latex ma quasi nessuna di Tex e vorrei creare una macro da poter richiamare all’interno del tabular environment per ripetere N volte un pattern composto di stringa + caratteri di controllo. Ho studiato un po’ di documentazione su Tex e ho scritto:
      `\begin{tabular}{|ccccc|}}
      \hline
      \multicolumn{5}{|c|}{Titolo}\\
      \hline
      \duplicate{& str1 & str2}{2}\\ %^
      \hline
      \end{tabular}`
      Quello che vorrei ottenere e’: & str1 & str2 & str1 & str2 \\

      La macro \duplicate che ho scritto e’:
      `\newcommand{\duplicate}[2]
      {
      \count255 = #2
      \loop
      #1
      \ifnum\count255 > 1
      \advance\count255 by -1
      \repeat
      }`
      Ma ovviamente (!) dà errore…

      Si è parlato di un problema simile tempo fa qui sul forum. Il problema non è tanto nel catcode di &, quanto nel momento dell’espansione di \duplicate.

      Puoi fare così:
      `\newtoks\duptok
      \newcommand{\duplica}[2]{%
      \duptok={#1}%
      \count255=#2%
      \loop
      \advance\count255 -1
      \ifnum\count255 > 0
      \duptok=\expandafter{\the\duptok & #1}%
      \repeat}`

      In questo modo basta fare così:
      `\begin{tabular}{cccc}
      a & b & c & d\\
      \duplicate{aa&bb}
      \end{tabular}

      \begin{tabular}{cccccc}
      a & b & \duplicate{cc&dd}{2}
      \end{tabular}
      `
      Attento però che \duplicate deve stare subito dopo \\ o &. Se ci metti qualcosa prima non funzionerà.

      Si scrive LaTeX e TeX, mi raccomando. 😀

      Ciao
      Enrico

    • #9926
      Up
      0
      Down
      ::

      Si è parlato di un problema simile tempo fa qui sul forum. Il problema non è tanto nel catcode di &, quanto nel momento dell’espansione di \duplicate.

      Puoi fare così:
      `\newtoks\duptok
      \newcommand{\duplica}[2]{%
      \duptok={#1}%
      \count255=#2%
      \loop
      \advance\count255 -1
      \ifnum\count255 > 0
      \duptok=\expandafter{\the\duptok & #1}%
      \repeat}`

      In questo modo basta fare così:
      `\begin{tabular}{cccc}
      a & b & c & d\\
      \duplicate{aa&bb}
      \end{tabular}

      \begin{tabular}{cccccc}
      a & b & \duplicate{cc&dd}{2}
      \end{tabular}
      `
      Attento però che \duplicate deve stare subito dopo \\ o &. Se ci metti qualcosa prima non funzionerà.

      Si scrive LaTeX e TeX, mi raccomando. 😀

      Ciao
      Enrico

      Grazie mille Enrico! Non conoscevo la funzione del registro \newtoks di TeX! Ho provato il tuo codice ma non mi funziona, nel senso che non da errore (c’e’ un mismatch da correggere tra i nomi delle funzioni e da aggiungere \\) ma non stampa niente. L’unica cosa che fa e’ di inserire un carattere di tabulazione… 🙁

      Provo un po’ ad approfondire…

    • #9927
      Up
      0
      Down
      ::

      Grazie mille Enrico! Non conoscevo la funzione del registro \newtoks di TeX! Ho provato il tuo codice ma non mi funziona, nel senso che non da errore (c’e’ un mismatch da correggere tra i nomi delle funzioni e da aggiungere \\) ma non stampa niente. L’unica cosa che fa e’ di inserire un carattere di tabulazione… 🙁

      Provo un po’ ad approfondire…

      E certo che non va 🙄 Ho incollato il codice sbagliato 🙄
      `\newcommand{\duplicate}[2]
      {\duptok={#1}%
      \count255 = #2
      \loop
      \advance\count255 by -1
      \ifnum\count255 > 0
      \duptok=\expandafter{\the\duptok & #1}%
      \repeat
      \the\duptok}`
      Ciao
      Enrico

    • #9928
      Up
      0
      Down
      ::


      C’e’ l’ho fatta!!!! Magnifico TeX!
      Grazie ancora per gli hints!

      Federico.

      \newcounter{cnt}
      \newtoks\duptok
      \newcommand\duplicate[2]{
      \setcounter{cnt}{#2}
      \duptok={#1}
      \loop \ifnum\value{cnt}>0 \duptok=\expandafter{\the\duptok #1}
      \addtocounter{cnt}{-1} \repeat
      \the\duptok}

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

Go to top