[Risolto] Uso di \longtabu (o \longtable) con \multirow

  • Creatore
    Topic
  • #84346
    Up
    0
    Down
    ::


    Salve a tutti,
    ho un problema nell’utilizzo dell’ambiente \longtabu (che fonde le caratteristiche di longtable e tabularx) con \multirow.
    Ho definito, con il comando \InsertCoin, le entrate di una tabella in modo che siano alte tre normali righe:

    `
    \newcommand{\InsertCoin}[6]{
    \multirow{3}*{\parbox{\cutwidth}{\rule{0pt}{20pt}\centering #1}} & \multirow{3}*{\parbox{\imgwidth}{\rule{0pt}{52.5pt}\centering\includegraphics[width=\imgwidth]{#2}}} & \emph{Materiale} & \ac{#3} & \multirow{3}*{\parbox{\yearwidth}{\rule{0pt}{15pt}\centering #6}} \\*
    \cmidrule(lr){3-4} \nopagebreak
    & & \emph{\diameter [mm]} & $ #4 $ & \\*
    \cmidrule(lr){3-4} \nopagebreak
    & & \emph{Peso [g]} & $ #5 $ & \\*
    }
    `

    Queste entrate le utilizzo poi all’interno di un nuovo ambiente, che ho chiamato cointable, definito come segue:

    `
    \newenvironment{cointable}
    {\begin{longtabu}[c]{TIDVA}
    \toprule
    \textbf{Taglio} & \textbf{Immagine} & \multicolumn{2}{c}{\textbf{Caratteristiche}} & \textbf{Anni} \\
    \midrule
    \endfirsthead
    %
    \multicolumn{5}{l}{\itshape\footnotesize (Continua da pag. precendente)}\\
    \toprule
    \endhead
    %
    \multicolumn{5}{r}{\itshape\footnotesize (Continua a pag. successiva)}\\
    \endfoot
    %
    \bottomrule
    \endlastfoot}
    {\end{longtabu}}
    `

    Le varie lunghezze (cutwidth, imgwidth, ecc.) e gli specificatori di colonna che ho utilizzato in longtabu (T,I,D,V,A) li ho definiti io e funzionano correttamente.
    Il problema nasce quando la dimensione della tabella supera una pagina; in quel caso può accadere che l’entrata definita da \InsertCoin venga spezzata su due pagine, cosa che vorrei chiaramente evitare. Incollo di seguito un codice di esempio:

    `
    \begin{document}

    \tableofcontents

    \begin{cointable}
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    \midrule
    \InsertCoin{$5$ Pence}{Gibilterra-5pence[01]}{CuNi}{18}{3.25}{1991}
    % … e così via, finché non esce dalla pagina
    \end{cointable}

    \end{document}
    `

    Ho provato ad inserire dei \nopagebreak nella definizione del comando \InsertCoin, con scarsi risultati; l’unica soluzione che ho trovato cercando in giro inserire un \pagebreak prima dell’entrata che mi dà il problema in modo da farla andare tutta nella pagina successiva.
    A questo punto vorrei che fosse il comando stesso (\InsertCoin) ad inserire subito un \pagebreak nel caso in cui lo spazio rimanente nella pagina non fosse sufficiente a contenere tutta l’entrata. Esiste un modo per poter fare questa cosa?

    Grazie mille in anticipo della disponibilità.

    Davide

Visualizzazione 4 filoni di risposte
  • Autore
    Risposte
    • #84347
      Up
      0
      Down
      ::

      d.fenucci” post=83663Salve a tutti,
      ho un problema nell’utilizzo dell’ambiente \longtabu (che fonde le caratteristiche di longtable e tabularx) con \multirow.
      Ho definito, con il comando \InsertCoin, le entrate di una tabella in modo che siano alte tre normali righe:
      […]

      Per favore, rendi quel codice un esempio minimo compilabile. Che sono le colonne TIDVA?

      Fa’ un favore anche a te: non usare mai TAB nei tuoi documenti LaTeX.

      Ciao
      Enrico

    • #84348
      Up
      0
      Down
      ::


      Hai ragione, scusa, credevo fosse sufficiente la spiegazione. Incollo subito quello che manca.

      Il documento è di classe scrrprt:
      `
      \documentclass[11pt, a4paper, oneside,openany, cleardoublepage=empty]{scrreprt}
      \usepackage[italian]{babel}
      \usepackage[T1]{fontenc}
      \usepackage[utf8]{inputenc}
      \usepackage[colorlinks=false]{hyperref}
      \usepackage{amsmath, amssymb}
      \usepackage{wasysym} % Comando \diameter
      \usepackage{tabularx, longtable, tabu, array, booktabs, multirow}
      \usepackage[printonlyused]{acronym} % Comando \ac
      `

      Le lunghezze e i tipi di tabella che ho definito sono i seguenti:

      `
      \newlength{\cutwidth}
      \setlength{\cutwidth}{0.11\textwidth}\newlength{\imgwidth}
      \setlength{\imgwidth}{0.23\textwidth}
      \newlength{\descwidth}
      \setlength{\descwidth}{0.11\textwidth}
      \newlength{\valwidth}
      \setlength{\valwidth}{0.13\textwidth}
      \newlength{\yearwidth}
      \setlength{\yearwidth}{\dimexpr(\textwidth -\cutwidth -\imgwidth -\descwidth -\valwidth -(10\tabcolsep))
      \relax }

      \newcolumntype{T}{>{\centering\arraybackslash\hspace{0pt}}m{\cutwidth}}
      \newcolumntype{I}{>{\centering\arraybackslash\hspace{0pt}}m{\imgwidth}}
      \newcolumntype{D}{>{\raggedright\arraybackslash\hspace{0pt}}m{\descwidth}}
      \newcolumntype{V}{>{\raggedleft\arraybackslash\hspace{0pt}}m{\valwidth}}
      \newcolumntype{A}{>{\centering\arraybackslash\hspace{0pt}}X}
      `

      Come immagine nell’esempio (il nome è “Gibilterra-5pence[01]”) va bene una qualsiasi immagine che sia larga il doppio di quanto è alta, una 100×50 ad esempio. Gli acronimi non appariranno, ma li ho definiti in un file a parte che poi includerò nel testo finale, questo è solamente di prova.

      I TAB li uso semplicemente per vedere meglio quello che scrivo negli ambienti, perché scrivendo tutto allineato a sinistra non ci capisco niente. E’ meglio utilizzare degli spazi invece del tab?

    • #84349
      Up
      0
      Down
      ::

      d.fenucci” post=83668Hai ragione, scusa, credevo fosse sufficiente la spiegazione. Incollo subito quello che manca.

      `Package array Warning: Column V is already defined on input line 28.

      (./cointable.aux)
      (/usr/local/texlive/2012/texmf-dist/tex/context/base/supp-pdf.mkii
      [Loading MPS to PDF converter (version 2006.09.02).]
      ) (/usr/local/texlive/2012/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty
      (/usr/local/texlive/2012/texmf-dist/tex/generic/oberdiek/ifluatex.sty)
      (/usr/local/texlive/2012/texmf-dist/tex/generic/oberdiek/ifpdf.sty))
      (/usr/local/texlive/2012/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty
      (/usr/local/texlive/2012/texmf-dist/tex/latex/oberdiek/grfext.sty
      (/usr/local/texlive/2012/texmf-dist/tex/generic/oberdiek/kvdefinekeys.sty))
      (/usr/local/texlive/2012/texmf-dist/tex/latex/oberdiek/kvoptions.sty
      (/usr/local/texlive/2012/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty
      (/usr/local/texlive/2012/texmf-dist/tex/generic/oberdiek/etexcmds.sty)))
      (/usr/local/texlive/2012/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg))
      Overfull \vbox (59.20003pt too high) detected at line 98
      ! Undefined control sequence.
      \InsertCoin … ]{#2}}} & \emph {Materiale} & \ac
      {#3} & \multirow {3}*{\par…
      l.98 \end{cointable}

      ?
      ! Undefined control sequence.
      \diameter

      l.98 \end{cointable}

      ? `
      Ah, e ho dovuto tirare a indovinare i pacchetti necessari. Dobbiamo fare la caccia al tesoro?

      Fa’ così: cambia tutti i tuoi [tt]\midrule[/tt] in [tt]\Midrule[/tt] e aggiungi
      `\newcommand{\Midrule}{\midrule\noalign{\penalty -100 \vfil}}`

      Se poi eviti [tt]\multirow[/tt] fai un piacere a te e a chi dovrà leggere la tabella. Non c’è alcun motivo di spostare in giù quelle due parti.

      Ciao
      Enrico

    • #84350
      Up
      0
      Down
      ::


      E questo mi sembra molto più semplice:

      `\documentclass[11pt, a4paper, oneside,openany, cleardoublepage=empty]{scrreprt}
      \usepackage{longtable,array,booktabs}
      \usepackage{graphicx}

      %%% Non ho idea di come li definisci
      \newcommand\ac[1]{#1}
      \newcommand\diameter[1][xy]{#1}

      \newlength{\imgwidth}
      \setlength{\imgwidth}{0.23\textwidth}

      \newcommand{\InsertCoin}[6]{%
      #1 &
      \raisebox{\dimexpr-\height+\ht\strutbox\relax}[0pt][0pt]{\includegraphics[width=\imgwidth]{#2}} &
      \emph{Materiale} & \ac{#3} & #6 \\*
      \cmidrule(lr){3-4} \nopagebreak
      & & \diameter [mm] & $ #4 $ & \\*
      \cmidrule(lr){3-4} \nopagebreak
      & & \emph{Peso} (g) & $ #5 $ & \\*
      }

      \newcommand{\Midrule}{\midrule\noalign{\penalty-100 \vfil}}

      \newenvironment{cointable}
      {\begin{longtable}[c]{lllll}
      \toprule
      \textbf{Taglio} & \textbf{Immagine} & \multicolumn{2}{c}{\textbf{Caratteristiche}} & \textbf{Anni} \\
      \midrule
      \endfirsthead
      \multicolumn{5}{l}{\itshape\footnotesize (Continua da pag. precendente)}\\
      \toprule
      \textbf{Taglio} & \textbf{Immagine} & \multicolumn{2}{c}{\textbf{Caratteristiche}} & \textbf{Anni} \\
      \midrule
      \endhead
      \multicolumn{5}{r}{\itshape\footnotesize (Continua a pag. successiva)}\\
      \endfoot
      \bottomrule
      \endlastfoot}
      {\end{longtable}}
      \begin{document}
      …`
      Nota che le unità di misura vanno sempre in carattere tondo e non tra parentesi quadre.

      Se proprio vuoi avere la tua tabella larga quanto la pagina, usa colonne X a sinistra e a destra (in tal caso ti occorre longtabu).

      Ciao
      Enrico

    • #84351
      Up
      0
      Down
      ::


      Hai perfettamente ragione e ti prego di scusarmi ancora; ho editato il precedente post aggiungendo, per completezza, i pacchetti che ho utilizzato.

      Grazie infinite della soluzione, era esattamente quella che mi serviva.

      Ciao,
      Davide

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

Go to top