Tabella personalizzata

  • Creatore
    Topic
  • #117035
    Up
    0
    Down
    ::


    Buonasera a tutti, sto cercando di realizzare questa tabella ma non riesco. Qualcuno riesce a ad aiutarmi?
    Grazie in anticipo!

    Attachments:
    You must be logged in to view attached files.
Visualizzazione 4 filoni di risposte
  • Autore
    Risposte
    • #117036
      robitex
      Amministratore del forum
        Up
        0
        Down
        ::

        fox96″ post=117461Buonasera a tutti, sto cercando di realizzare questa tabella ma non riesco. Qualcuno riesce a ad aiutarmi?
        Grazie in anticipo!

        Ciao e Benvenuto sul forum!
        Se vuoi il mio parere quella tabella la farei con TikZ.
        Si tratta di un pacchetto per il disegno programmato molto noto tra gli utenti TeX.
        Un codice minimo è il seguente:
        `% !TeX program = pdflatex

        \documentclass{article}
        \usepackage{tikz}

        \begin{document}
        \begin{tikzpicture}

        \draw (0mm, 10mm) rectangle (80mm, 20mm);
        \node at (40mm, 15mm) {RM};

        \draw (0mm, 0mm) rectangle (20mm, 10mm);
        \node at (10mm, 5mm) {UL};

        \end{tikzpicture}
        \end{document}`

        Ogni cella è composta da un comando che disegna il rettangolo di contorno e dal comando nodo che stampa l’etichetta al centro.
        Sono possibili usi molto più sofisticati di TikZ ma chiaramente è meglio partire dalle basi.

        Con l’ausilio di un po’ di codice si può anche definire una macro:
        `% !TeX program = pdflatex

        \documentclass{article}
        \usepackage{tikz}

        \newdimen\xi
        \newdimen\xii
        \newdimen\yi
        \newdimen\yii
        \newdimen\x
        \newdimen\y

        \newcommand{\cell}[5]{
        \xi=#1 mm
        \yi=#2 mm
        \xii=#3 mm
        \yii=#4 mm
        \x=\xi
        \advance\x by \xii
        \divide\x by 2
        \y=\yi
        \advance\y by \yii
        \divide\y by 2
        \draw (\xi, \yi) rectangle (\xii, \yii);
        \node at (\x, \y) {#5};
        }

        \begin{document}
        \begin{tikzpicture}

        \cell{0}{10}{80}{20}{RM}
        \cell{20}{5}{40}{10}{TY}
        \cell{0}{0}{20}{10}{UL}

        \end{tikzpicture}
        \end{document}`
        La macro \cell prende 5 argomenti:
        `\cell{x1}{y1}{x2}{y2}{Testo}`
        Dove (x1, y1) e (x2,y2) sono i punti specificati in coordinate in millimetri rispettivamente del vertice in basso a sinistra e in alto a destra del rettangolo di cella.
        Il codice non fa altro che calcolare in sintassi TeX le coordinate del centro del rettangolo.

        Ogni cella corrisponde a un comando \cell.

        Ti consiglio infine di realizzare la figura usando la classe standalone, realizzando cioè il PDF già ritagliato a parte e inserirlo poi con un \includegraphics.
        In questo caso ti occorre specificare nel preambolo del file che produce la figura le stesse opzioni per i font che usi nel documento principale così da garantire coerenza tipografica.
        Devi quindi usare una buona struttura di directory.

        Per esempio:
        `% !TeX program = pdflatex

        \documentclass[tikz]{standalone}

        % qui imposti i font per esempio
        \usepackage{lmodern}

        \newdimen\xi
        \newdimen\xii
        \newdimen\yi
        \newdimen\yii
        \newdimen\x
        \newdimen\y

        \newcommand{\cell}[5]{
        \xi=#1 mm
        \yi=#2 mm
        \xii=#3 mm
        \yii=#4 mm
        \x=\xi
        \advance\x by \xii
        \divide\x by 2
        \y=\yi
        \advance\y by \yii
        \divide\y by 2
        \draw (\xi, \yi) rectangle (\xii, \yii);
        \node at (\x, \y) {#5};
        }

        \begin{document}
        \begin{tikzpicture}

        \cell{0}{10}{80}{20}{RM}
        \cell{20}{5}{40}{10}{TY}
        \cell{0}{0}{20}{10}{UL}

        \end{tikzpicture}
        \end{document}
        `

        Alla prossima.
        R.

      • #117037
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Il suggerimento di @robitex è molto bello e articolato. Seguilo con attenzione. Infatti @robitex ha detto una cosa importante: quella non è una tabella,ma un disegno. E quando si tratta di fare disegni LaTeX da solo o con l’aiuto di pacchetti esterni è capacissimo di farne molto bene e senza dover ricorrere all’importazione di tali disegni dall’esterno. Non parlo di importare quel disegno composto a parte con LaTeX con la classe standalone; quello è un asso nela manica di \LaTeX; Parlo di disegni simil-tabella scaricati da altri testi o dalla rete.

          Vorrei commentare sul fatto che spesso si abusa di TikZ.
          TikZ è un bellissimo pacchetto e fa cose egregie, tantissime ed è un pacchetto molto complicato, con un manuale di centinaia di pagine; Per un disegno così semplice @robitex ha usato qualche macro semplicissima mettendoci dentro dei comandi base di \TikZ. Ottimo.

          Ma LaTeX è già capace di fare quei rettangoli con una scritta al centro da solo. Come? con il suo ambiente picture, disponibile nel nucleo di LaTeX stesso, senza bisogno di ricorrere a nient’altro. Siccome questo ambiente è disponibile da quando esiste LaTeX (1985 è la data della pubblicazione della prima guida di Leslie Lamport, il creatore di LaTeX) è considerato un rudere da non prendere nemmeno in considerazione. La parte di questa guida che riguarda l’ambiente picture ammonta ad una manciata di pagine che puoi contare sulle dita delle mani. Lamport ha poi scritto la sua seconda edizione nel 1994 dove ha spiegato che certe limitazioni del suo “vecchio” ambiente picture potevano essere rimosse; questa rimozione ha avuto luogo nel 2003. Come vedi ti sto parlando di cose disponibili da parecchi anni, ma considerate archeologia informatica da molti.

          Allora senza fare ulteriore filosofia tu puoi fare quella tabella nell’ambiente picrure usando semplicemente due comandi: \put e \framebox, qualcosa come questo:`
          \begin{figure}
          \unitlength=0.01\textwidth
          \begin{picture}(100,50)
          \put(0,0){\framebox(100,50){}} % per il rettangolo esterno
          \put(0,45){\framebox(100,5){Ottica del mercato}} % per la scatola con il tiolo
          % eccetera per le altre scatole
          \end{picture}
          \caption{Tabella}\label{fig:tabella}
          \end{figure}
          `Si tratta solo di un esempio che puoi ulteriormente personalizzare, completare, e lasciare all’inteno del tuo file sorgente, senza bisogno di usare standalone, anche se non guasta certamente farne uso; ma per disegnare quelle 15 scatole ti servono solo 15 righe di codice.

          Se vuoi saperne di più nella sezione documentazione di questo forum, c’è la guida Il LaTeX Reference Manual commentato che è una libera traduzione in italiano del secondo manuale di Lamport, commentato con l’indicazione di molti aggiornamenti e con molti esempi. La parte relativa all’ambiente picture ammonta ad una ventina di pagine, per lo più occupate da esempi, e che descrive anche le estensioni del 2003, di cui, per il tuo semplice disegno, non occorre fare uso; in sostanza ti basta leggere una mezza dozzina di paginette.

          Ovviamente non sei obbligato a seguire queste indicazioni. Quanto ti ha detto @robitex va benissimo e può essere per te una introduzione all’uso di TikZ, che ti potrà servire in futuro per eseguire disegni più complessi.

        • #117038
          Up
          0
          Down
          ::


          Ringrazio ad entrambi!
          Ho trovato più comodo usare il secondo metodo suggerito, quello di OldClaudio perché più intuitivo e meccanico.

          Ho una domanda a riguardo, siccome delle linee mi si sovrappongono creando uno spessore più marcato, c’è la possibilità di rendere lo spessore omogeneo?

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

            fox96″ post=117464Ringrazio ad entrambi!
            Ho trovato più comodo usare il secondo metodo suggerito, quello di OldClaudio perché più intuitivo e meccanico.

            Ho una domanda a riguardo, siccome delle linee mi si sovrappongono creando uno spessore più marcato, c’è la possibilità di rendere lo spessore omogeneo?

            Ciao.
            La sovrapposizione di due linee di spessore uguale non comporta particolari problemi certamente in stampa.
            A video il visualizzatore potrebbe presentare artefatti specie a bassi valori di zoom per via di come vengono calcolate le dimensioni per il codice di basso livello pdfliteral.
            Se tu impostassi per il pdf un compressed level pari a 0 e leggissi direttamente il codice te ne renderesti conto.
            Ogni pacchetto grafico deve decidere la precisione prima o poi. Io ho esperienza per esempio che METAPOST è più preciso di TikZ.
            Quindi a meno di errori nel tuo codice, non dovresti preoccupartene troppo.
            Anche a livello di quantità d’informazione (il codice grafico pdfliteral) la sovrapposizione lo rende più compatto.
            Alla prossima.
            R.

          • #117040
            OldClaudio
            Partecipante
              Up
              0
              Down
              ::

              fox96″ post=117464Ringrazio ad entrambi!
              Ho trovato più comodo usare il secondo metodo suggerito, quello di OldClaudio perché più intuitivo e meccanico.

              Ho una domanda a riguardo, siccome delle linee mi si sovrappongono creando uno spessore più marcato, c’è la possibilità di rendere lo spessore omogeneo?

              Scusa, ma “Ringrazio ad entrambi” ti pare corretto? L’uso del “dativo” è dialettale. Con i verbi trransitivi non si usa mai la preposizione “a” o “ad” (nemmeno articolata) quando si scrive in italiano. Scusa se te lo faccio osservare, ma di solito qui nel forum, non solo io, segnaliamo questo genere di errori.

              Veniamo al tuo caso: si, hai ragione; mettendo tante \frambox adiacenti, il loro bordi non si allineano perché ho letto il codice nel nucleo di LaTeX e il modo che viene usato per mettere il bordo non tiene conto del suo spessore. Il codice che ti metto qui sotto evita l’errore, ma bisogna caricare anche il pacchetto pict2e e definire la macro \Bordo, oltre che ad aggiungere a mano il bordo stesso; Volendo si potrebbe creare una macro, \CellaConBordo, in modo da non dover ripetere alcuni degli stessi dati due volte, bisognerebbe ricorrere a una definizione con gli argomenti delimitati, che certamente non fa parte delle conoscenze di un utente “normale”. Oppure bisognerebbe eseguire una definizione normale con tutti gli argomenti racchiusi fra graffe, e verrebbe a mancare la distinzione fra le coordinate dei punti e dello spigolo superiore destro, con la possibilità di confondere la loro posizione e quindi di commettere continuamente degli errori, dimenticando un argomento o dimenticando delle graffe. Comunque, ecco il codice:`\documentclass[12pt]{article}

              \usepackage{pict2e}
              \newcommand\Bordo[2]{{\linethickness{1pt}\polygon(0,0)(#1,0)(#1,#2,)(0,#2)}}

              \begin{document}

              \begin{figure}
              \unitlength=0.01\textwidth
              %\fboxrule=1.6pt
              \begin{picture}(100,50)
              %\linethickness{1pt}
              \put(0,0){\makebox(100,50){}}\put(0,0){\Bordo{100}{50}} % per il rettangolo esterno
              \put(0,43){\makebox(100,7){\bfseries OTTICA DEL MERCATO}}\put(0,43){\Bordo{100}{7}} % per la scatola con il titolo
              \put(0,0){\makebox(15,43){RO}}\put(0,0){\Bordo{15}{43}}
              \put(15,26){\makebox(19,17){AMI}}\put(15,26){\Bordo{19}{17}}
              \put(15,14){\makebox(19,12){AMT}}\put(15,14){\Bordo{19}{12}}
              \put(15,7){\makebox(19,7){ACC}}\put(15,7){\Bordo{19}{7}}
              \put(15,0){\makebox(32,7){RON}}\put(15,0){\Bordo{32}{7}}
              \put(34,7){\makebox(13,13){PF}}\put(34,7){\Bordo{13}{13}}
              \put(47,0){\makebox(10,20){RAN}}\put(47,0){\Bordo{10}{20}}
              \put(57,17){\makebox(13,3){OF}}\put(57,17){\Bordo{13}{3}}
              \put(57,0){\makebox(13,17){RR}}\put(57,0){\Bordo{13}{17}}
              \put(70,10){\makebox(15,7){RB}}\put(70,10){\Bordo{15}{7}}
              \put(70,0){\makebox(15,10){RI}}\put(70,0){\Bordo{15}{10}}
              \put(85,6){\makebox(15,4){OT}}\put(85,6){\Bordo{15}{4}}
              \put(85,0){\makebox(15,6){RE}}\put(85,0){\Bordo{15}{6}}
              \end{picture}
              \caption{Tabella}\label{fig:tabella}
              \end{figure}

              \end{document}`Per creare una macro con argomenti delimitati bisognerebbe definire`\def\CellaConBordo(#1,#2)(#3,#4)#5{%
              \put(#1,#2){\makebox(#3,#4){#5}\put(#1,#2){\polygon(0,0)(#3,0)(#3,#4)(0,#4)}}}`da usarsi, per esempio, così
              `\CellaConBordo(70,10)(15,10){RI}`È vero, non si tratta di una macro complicatissima, ma non ne trovi la sintassi, se non nel TeXbook. Inoltre non permette di specificare i parametri di allineamento per il contenuto della scatola indicato con l’argomento #5. Per una soluzione valida sempre e magari utile per sostituire la definizione di \framebox del nucleo di LaTeX, bisognerebbe ricorrere alle definizioni avanzate del pacchetto xparse. Ma qui esuliamo dal tuo problema e finiremmo con il costruire qualcosa che renderebbe il tuo problema più complicato rispetto a quello che puoi ottenere con TikZ.

              Però, se compili l’esempio minimo che ti ho dato, vedi che i bordi delle scatole sono davvero tutti uguali; se non ti sembrano tali nel visualizzatore PDF del file compilato, questo dipende dalla risoluzione relativamente bassa dello schermo, come ti ha spiegato @robitex. Ma se ingrandisci l’immagine della schermata di tre o quattro volte, vedi benissimo che i bordi delle scatole sono davvero tutti uguali. Gli schermi hanno una densità di pixel che va da una settantina a un centinaio di pixel al pollice, ciò da 3 a 4 pixel al millimetro: sembrano abbastanza densi per leggere o per vedere delle immagini a colori sfumati, ma non lo sono quando devi mostrare della grafica al tratto; tieni presente che le linee sottili (di default, o specificate con \thinlines) sono larghe 0,4pt, poco più di un decimo di millimetro, eppure stampate su carta l’occhio le vede benissimo; in uno schermo potrebbero non vedersi affatto.

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

          Go to top