nuovo ambiente per matrici

  • Creatore
    Topic
  • #68294
    Up
    0
    Down
    ::


    Ciao
    vorrei realizzare un nuovo ambiente che mi permetta di scrivere una matrice passando gli elementi della matrice come parametri dell’ambiente stesso. Questo perchè devo scriverne + di una e sono molto grandi quindi mi verrebbe comodo definirla una volta per tutte. Inoltre così potrei copiare gli elementi direttamente come una stringa (di numeri) dai file MatLab.

    Ora, nell’arte ho letto che il limite di 9 parametri c’è per i \newcommand ma dato che non specifica niente sugli enviroment ho provato una cosa del genere:

    `
    \newenvironment{mia_matrice}[900] %30×30
    {\begin{displaymath}\begin{bmatrix}
    #1 & #2 … & #30\\
    %etc.
    ….#900
    \end{bmatrix}}
    {\end{diplaymath}}
    `

    Poi in compilazione mi da l’errore “You have already nine parameters”.

    Posso risolvere in qualche maniera?

    Ciao

Visualizzazione 10 filoni di risposte
  • Autore
    Risposte
    • #68295
      Up
      0
      Down
      ::

      DirkPitt” post=67280Ciao
      vorrei realizzare un nuovo ambiente che mi permetta di scrivere una matrice passando gli elementi della matrice come parametri dell’ambiente stesso. Questo perchè devo scriverne + di una e sono molto grandi quindi mi verrebbe comodo definirla una volta per tutte. Inoltre così potrei copiare gli elementi direttamente come una stringa (di numeri) dai file MatLab.

      Ora, nell’arte ho letto che il limite di 9 parametri c’è per i \newcommand ma dato che non specifica niente sugli enviroment ho provato una cosa del genere:

      `
      \newenvironment{mia_matrice}[900] %30×30
      {\begin{displaymath}\begin{bmatrix}
      #1 & #2 … & #30\\
      %etc.
      ….#900
      \end{bmatrix}}
      {\end{diplaymath}}
      `

      Poi in compilazione mi da l’errore “You have already nine parameters”.

      Posso risolvere in qualche maniera?

      Ciao

      TeX accetta al massimo nove parametri per una macro. E un ambiente è definito tramite macro, ovviamente. 🙂

      Se i tuoi dati sono scritti per bene, puoi provare così:
      `\documentclass{article}
      \usepackage{amsmath}
      \setcounter{MaxMatrixCols}{30}
      \makeatletter
      \newenvironment{bigmat}
      {\obeyspaces\obeylines\setup@bigmat\[\expandafter\bmatrix\@gobble}
      {\endbmatrix\]}
      \def\setup@bigmat{%
      \begingroup\lccode`~=` \lowercase{\endgroup\def~}{&}%
      \begingroup\lccode`~=`\^^M\lowercase{\endgroup\def~}{\\}%
      }
      \makeatother

      \begin{document}
      \begin{bigmat}
      1 2 3 4 5
      2 3 4 5 6
      3 4 5 6 7
      \end{bigmat}
      \end{document}`
      Ogni spazio denota un (attento che spazi multipli qui non diventano uno solo), ogni riga forma una riga della matrice.

      Ciao
      Enrico

    • #68296
      Up
      0
      Down
      ::


      Grazie , funziona bene apparte qualche problemino a cui sono abituato con i margini troppo ampi della matrice.

      Mi puoi segnalare da dove capire cosa hai fatto 🙂 (intendo una guida o un link di riferimento).

      Grazie, ciao!

    • #68297
      Up
      0
      Down
      ::

      DirkPitt” post=67288Grazie , funziona bene apparte qualche problemino a cui sono abituato con i margini troppo ampi della matrice.

      Mi puoi segnalare da dove capire cosa hai fatto 🙂 (intendo una guida o un link di riferimento).

      Grazie, ciao!

      Trucchi del mestiere. 🙂

      \obeylines dice a TeX che lo spazio diventa come se fosse un comando; \obeylines fa lo stesso con il carattere di fine riga. Le due misteriose righe con \begingroup nella definizione di \setup@bigmat danno a questi due comandi le definizioni opportune: lo spazio diventa &, mentre il carattere di fine riga diventa \\.

      L’altro misterioso \expandafter\bmatrix\@gobble serve per mangiare il primo fine riga (quello che segue \begin{bigmat}). Va da sé che l’input deve essere ben controllato.

      Ciao
      Enrico

    • #68298
      Up
      0
      Down
      ::


      Ok grazie per i chiarimenti.

      Non so se sto complicando eccessivamente, ma sarebbe possibile inserire l’ambiente bigmat appena definito in una qualche box lasciando però che il risultato visualizzato sia effettivamente una matrice? Infatti se provo semplicemente a inserirlo ad es. in una makebox il risultato è tutto su una riga (credo di sapere il perchè ma non so dove mettere le mani 🙂 )

      Grazie ancora

    • #68299
      Up
      0
      Down
      ::

      DirkPitt” post=67292Ok grazie per i chiarimenti.

      Non so se sto complicando eccessivamente, ma sarebbe possibile inserire l’ambiente bigmat appena definito in una qualche box lasciando però che il risultato visualizzato sia effettivamente una matrice? Infatti se provo semplicemente a inserirlo ad es. in una makebox il risultato è tutto su una riga (credo di sapere il perchè ma non so dove mettere le mani 🙂 )

      Grazie ancora

      Per scalare la tua matrice a `\textwidth` puoi definire un ambiente supplementare:
      `\newenvironment{bigmat*}
      {\setbox\z@=\hbox\bgroup$\obeyspaces\obeylines\setup@bigmat\expandafter\bmatrix\@gobble}
      {\endbmatrix$\egroup\[\resizebox{\textwidth}{!}{\usebox{0}}\]}`
      Ciao
      Enrico

    • #68300
      Up
      0
      Down
      ::


      Sarebbe proprio quello che mi serve 🙂 per caso c’è un refuso di sintassi nel codice che m hai scritto? perchè il compilatore mi da `! Undefined control sequence.
      \bigmat* ->\setbox \z
      @=\hbox \bgroup $\obeylines \setup @bigmat\expandafter…
      l.19 \begin{bigmat*}`

      Ciao

    • #68301
      Up
      0
      Down
      ::

      DirkPitt” post=67296Sarebbe proprio quello che mi serve 🙂 per caso c’è un refuso di sintassi nel codice che m hai scritto? perchè il compilatore mi da `! Undefined control sequence.
      \bigmat* ->\setbox \z
      @=\hbox \bgroup $\obeylines \setup @bigmat\expandafter…
      l.19 \begin{bigmat*}`

      Ciao

      Va anche quello tra \makeatletter e \makeatother. Scrivilo fra la definizione di bigmat e quella di \setup@bigmat.

      Ciao
      Enrico

    • #68302
      Up
      0
      Down
      ::


      La prima cosa l avevo fatta a ‘naso’; la seconda no. Ora funziona ma non interpreta più gli spazi, come mai?

    • #68303
      Up
      0
      Down
      ::


      Intendevo gli spazi fra gli elementi di una stessa riga, scusa la poca chiarezza.

    • #68304
      Up
      0
      Down
      ::

      DirkPitt” post=67299Intendevo gli spazi fra gli elementi di una stessa riga, scusa la poca chiarezza.

      Mancava un \obeyspaces, scusa. Correggo di sopra.

      Ciao
      Enrico

    • #68305
      Up
      0
      Down
      ::


      Ok grazie molte per l’aiuto.
      Ciao!

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

Go to top