inserimento di una stessa tabella in capitoli diversi

  • Creatore
    Topic
  • #53829
    Up
    0
    Down
    ::


    Ho necessità di inserire una stessa tabella in due parti differenti del testo (capitolo 1 e capitolo5).
    Per comodità, ho creato un file tabRisultato.tex in cui è presente il codice della tabella (che, appunto, devo riportare sia nel cap1 che nel cap2). Per richiamarlo, utilizzo il seguente comando all’interno del testo relativo al cap.1:

    \input{capitoli/tabelle/tabRisultato}

    Tutto va a buon fine.
    Quando però decido di riportare la stessa tabella nel capitolo 5, ripeto lo stesso codice nel testo del capitolo 5:

    \input{capitoli/tabelle/tabRisultato}

    ottenendo una visualizzazione corretta della tabella, ma con il seguente messaggio di “warnings”:

    Latex Warning: There were multiply-defined table

    Che posso fare? Potrei anche ignorare il messaggio di errore, visto che la tabella è riportate correttamente! Ma immagino ci sia un approccio migliore!
    Grazie in anticipo

    dom

Visualizzazione 7 filoni di risposte
  • Autore
    Risposte
    • #53830
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Che cosa contiene il file tabRisultato.tex?

      • #53831
        Up
        0
        Down
        ::

        Che cosa contiene il file tabRisultato.tex?

        Questo è il codice (non ho riportato i valori numerici in corrispondenza del testo sottolineato):

        \begin{table}[!htb] \footnotesize
        \caption{Risultati ottenuti}
        \center
        \label{tab:tbRis}
        \resizebox{\columnwidth}{!}{
        \begin{tabular}{l c c c c c c c c c c c c c c c c }
        \hline
        $(i,j)$ & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 \\
        %qui ci sono i dati che non ho copiato
        \hline
        \end{tabular}
        }
        \end{table}

      • #53832
        Up
        0
        Down
        ::

        Che cosa contiene il file tabRisultato.tex?

        Questo è il codice (non ho riportato i valori numerici in corrispondenza del testo sottolineato):

        \begin{table}[!htb] \footnotesize
        \caption{Risultati ottenuti}
        \center
        \label{tab:tbRis}
        \resizebox{\columnwidth}{!}{
        \begin{tabular}{l c c c c c c c c c c c c c c c c }
        \hline
        $(i,j)$ & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 \\
        [u]%qui ci sono i dati che non ho copiato[/u]
        \hline
        \end{tabular}
        }
        \end{table}

        Se usi \input, LaTeX legge due volte il comando \label{tab:tbRis} e quindi emette il messaggio di cui ti lamenti.

        Metti nel file solo la tabella effettiva, cioè quello che va da \resizebox{ alla graffa chiusa corrispondente. Scriverai allora
        `\begin{table}[!htbp]
        \caption{Risultati ottenuti}\label{tab:tbRis}
        \centering\footnotesize
        \input{capitoli/tabelle/tabRisultato}
        \end{table}`
        cambiando l’etichetta nelle due occasioni.

        Occhio che non è \center il comando da usare, ma \centering.

        Ciao
        Enrico

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


          Non sarebbe più comodo definire un comando?

          `
          \newcommand{\tbris}[1][]{% l'argomento opzionale è l'etichetta
          \begin{table}[!htbp]
          \caption{Risultati ottenuti}\label{tab:tbRis#1}
          \centering\footnotesize
          \input{capitoli/tabelle/tabRisultato}
          \end{table}
          }`

          e poi nel testo dire semplicemente:
          `…
          \tbris[Prima]
          …`
          ed in un altro punto del sorgente quando l’inserisco per la seconda volta:
          `…
          \tbris[Seconda]
          …`

          in questo modo posso riferirmi alla stessa tabella ma nel punto in cui l’ho sistemata:
          \ref{tab:tbRisPrima}
          Bye

        • #53834
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::


            Sì, è più comodo, ma si corre un rischio, cioè quello di dimenticarsi l’inserimento dell’etichetta opzionale, cosicché si ha di nuovo il messaggio di label duplicato.
            Inoltre mettere un prefisso al label fornito come argomento, implica che a distanza di tempo non ci ricordi più qual’era il prefisso e non si sa più cosa mettere come argomento di \ref o di \pageref. Per essere più sicuri converrebbe lasciare l’etichetta obbligatoria, invece che facoltativa e inserire un test per vedere se si è effettivamente specificato qualche cosa. ed emettere un messaggio di errore “greve” se l’etichetta non fosse stata specificata.
            Tu @robitex lo sai fare di sicuro; sarà altrettanto capace l’amico @statadat?

            Per @statadat: non mettere mai nell’apertura di un ambiente flottante una cosa come
            `
            \begin{table}[!htb]
            `
            Il punto esclamativo è la parte che non va. È rarissimo che sia necessario servirsene, e in ogni caso le tabelle di una certa dimensione stanno meglio in testa o al piede della pagina; in mezzo al testo sono “lecite” figure o tabelle piccole. Credo che i parametri di default di LaTeX consentano una percentuale massima di spazio per oggetti flottanti in mezzo al testo solo del 30% dell’altezza del blocco del testo. Mettere quel punto esclamativo consentirebbe di mettere in mezzo al testo oggetti grandini o grandi con il rischio di lasciare due righe di testo sopra e due righe di testo sotto, troppo poche per riconoscerle come testo.

          • #53835
            Up
            0
            Down
            ::


            Grazie per le riposte, ho risolto con i vostri suggerimenti!!!!!!

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

              Grazie per le riposte, ho risolto con i vostri suggerimenti!!!!!!

              Ecco il codice che giustamente tratta l’etichetta come argomento obbligatorio. Ho aggiunto anche i controlli (spero che l’implementazione non sia troppo grezza (è un po’ di tempo che non scrivo codice TeX e mi sono arrugginito un po’)).
              I codici di posizionamento possono essere passati facoltativamente:

              uso:
              \tbris{tab:mylabel}

              oppure con codici di pos:
              \tbris[tbh]{tab:mylabel}

              `
              \makeatletter
              \newcommand{\tbris}[2][tbp]{% l'argomento obbligatorio è l'etichetta
              % check sull'etichetta vuota
              \def\@tmp{#2}
              \ifx\@tmp\empty
              \GenericError{\space\space\space\@spaces\@spaces\@spaces}{%
              Etichetta obbligatoria non specificata (argomento vuoto)}{%
              La macro \string\tbris\space ha ricevuto un argomento vuoto}{%
              La macro \string\tbris\space ha ricevuto un argomento vuoto}
              \fi
              \ifx\@tmp\space
              \GenericError{\space\space\space\@spaces\@spaces\@spaces}{%
              Etichetta obbligatoria non specificata (argomento con spazi)}{%
              La macro \string\tbris\space ha ricevuto caratteri spazio}{%
              La macro \string\tbris\space ha ricevuto caratteri spazio}
              \fi
              \begin{table}[#1]
              \caption{Risultati ottenuti}\label{#2}
              \centering\footnotesize
              \input{capitoli/tabelle/tabRisultato}
              \end{table}
              }
              \makeatother`

              Dimenticavo,
              a questo punto il codice della tabella potrebbe rientrare nel sorgente principale senza scomodare un altro file.
              Bye

            • #53837
              OldClaudio
              Partecipante
                Up
                0
                Down
                ::


                Io scriverei così:
                `
                \makeatletter
                \newcommand{\tbris}[2][tbp]{% l'argomento obbligatorio è l'etichetta
                % check sull'etichetta vuota
                \def\@tmp{#2}
                \ifx\@tmp\empty
                \GenericError{\space\space\space\@spaces\@spaces\@spaces}{%
                Etichetta obbligatoria non specificata (argomento vuoto)}{%
                La macro \string\tbris\space ha ricevuto un argomento vuoto}{%
                La macro \string\tbris\space ha ricevuto un argomento vuoto}
                \else
                % check sull'etichetta composta da un solo spazio
                \ifx\@tmp\space
                \GenericError{\space\space\space\@spaces\@spaces\@spaces}{%
                Etichetta obbligatoria non specificata (argomento con spazi)}{%
                La macro \string\tbris\space ha ricevuto caratteri spazio}{%
                La macro \string\tbris\space ha ricevuto caratteri spazio}
                \else
                \begin{table}[#1]
                \caption{Risultati ottenuti}\label{#2}
                \centering\footnotesize
                \input{capitoli/tabelle/tabRisultato}
                \end{table}
                \fi\fi
                }
                \makeatother
                `
                Direi che così la macro non sia infallibile, ma protegga abbastanza dalle omissioni dell’etichetta. Non protegge dall’errore di specificare nelle due chiamate la stessa etichetta. Potrebbe essere migliorata in modo da evitare di eseguire un dei due test inutilmente, ma insomma ci si può accontentare.

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

            Go to top