Giusta larghezza tabella con paragrafo iniziale

  • Creatore
    Topic
  • #23652
    robitex
    Amministratore del forum
      Up
      0
      Down
      ::


      `
      \newenvironment{liquidb}[1]{%apertura soluzione 'b'
      \begin{center}\sffamily
      \rowcolors{2}{}{gray!15}
      \begin{tabular}{clr}
      \multicolumn{3}{r}{\parbox[c]{12cm}{#1}}\smallskip\\\midrule
      &Descrizione voce&\euro\\\midrule
      }{%chiusura
      \bottomrule
      \end{tabular}
      \end{center}
      }

      \newcommand\rigab[3]{#1&#2&#3\\}

      \newcommand\sommab[2]{\midrule\rowcolor{gray!15}%
      &\textbf{#1}&\textbf{#2}\\
      }
      `

      Questa è un nuovo ambiente per gestire più agevolmente una tabella (scusate il codice poco leggibile), che contiene una frase d’intestazione che prende tutte e tre le colonne.

      Funziona, ma …
      vorrei che non fosse necessario specificare la larghezza di 12cm nel comando \parbox.
      Vorrei invece che la larghezza del paragrafo d’intestazione assumesse la naturale larghezza della tabella.

      Ho fatto vari tentativi non riusciti.
      In pratica il problema è definire un ambiente che produca una tabella di giusta larghezza con un paragrafo iniziale passato come parametro, della stessa larghezza.

      Un po come impaginare un testo non conoscendone immediatamente la giustezza, ma SOLO DOPO aver composto la tabella seguente.

      Un rompicapo di autodefinizione?

      Occorrerebbe PRIMA calcolare la larghezza della tabella, passarla al comando \parbox, comporre quindi il testo e poi comporre la tabella stessa.

      LaTeX può risolvere questo problema?

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

        `
        \newenvironment{liquidb}[1]{%apertura soluzione 'b'
        \begin{center}\sffamily
        \rowcolors{2}{}{gray!15}
        \begin{tabular}{clr}
        \multicolumn{3}{r}{\parbox[c]{12cm}{#1}}\smallskip\\\midrule
        &Descrizione voce&\euro\\\midrule
        }{%chiusura
        \bottomrule
        \end{tabular}
        \end{center}
        }

        \newcommand\rigab[3]{#1&#2&#3\\}

        \newcommand\sommab[2]{\midrule\rowcolor{gray!15}%
        &\textbf{#1}&\textbf{#2}\\
        }
        `

        Questa è un nuovo ambiente per gestire più agevolmente una tabella (scusate il codice poco leggibile), che contiene una frase d’intestazione che prende tutte e tre le colonne.

        Funziona, ma …
        vorrei che non fosse necessario specificare la larghezza di 12cm nel comando \parbox.
        Vorrei invece che la larghezza del paragrafo d’intestazione assumesse la naturale larghezza della tabella.

        Ho fatto vari tentativi non riusciti.
        In pratica il problema è definire un ambiente che produca una tabella di giusta larghezza con un paragrafo iniziale passato come parametro, della stessa larghezza.

        Un po come impaginare un testo non conoscendone immediatamente la giustezza, ma SOLO DOPO aver composto la tabella seguente.

        Un rompicapo di autodefinizione?

        Occorrerebbe PRIMA calcolare la larghezza della tabella, passarla al comando \parbox, comporre quindi il testo e poi comporre la tabella stessa.

        LaTeX può risolvere questo problema?

        `\newsavebox{\partabbox}
        \newenvironment{partab}[1]
        {\def\firstlines{#1}%
        \begin{lrbox}{\partabbox}
        \begin{tabular}{@{}clr@{}}}
        {\end{tabular}\end{lrbox}\parbox{\wd\partabbox}{
        \firstlines\par
        \usebox{\partabbox}}}

        \begin{partab}{Oggi la giornata \`e cominciata malissimo ed \`e finita
        peggio che peggio non si pu\`o}
        aiodew dewoij & kdopew ijoije & oijoij csojo iieee\\
        aiodew dewoij & kdopew ijoije & oijoij csojo iieee\\
        aiodew dewoij & kdopew ijoije & oijoij csojo iieee\\
        aiodew dewoij & kdopew ijoije & oijoij csojo iieee\\
        \end{partab}`
        Fa’ tu gli aggiustamenti necessari.

        Ciao
        Enrico

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


          Veramente brillante.

          Avevo intuito che si poteva usare un savedbox ma non sapevo ne come gestirne la creazione in un ambiente, ne come calcolarne la larghezza, ne come creare un LR box in un ambiente (non conoscevo lrbox).

          Grazie.

          Mi studierò un po’ più con calma il codice.
          PS. Spero che la giornata sia migliore col giungere della sera (la mia lo è brillantemente diventata).
          😉

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


            PS. Ho definito il comando in cui “salvare” il testo dell’intestazione con \newcommand\firstlines anzichè con \def.

            Mi aspettavo che con più di un ambiente partab nel documento LaTeX avrebbe lamentato la definizione di un comando già definito, invece non ha fatto una grinza.

            E’ perché la definizione del comando si trova all’interno di un gruppo e cessa di esistere subito dopo (escludo tranquillamente l’ipotesi che LaTeX sovrascriva i comandi con lo stesso nome altrimenti si potrebbero verificare errori e d’altro canto non esisterebbe il \renewcommand)?

            PS. Il nuovo ambiente funziona p e r f e t t a m e n t e.

          • #23656
            Up
            0
            Down
            ::

            PS. Ho definito il comando in cui “salvare” il testo dell’intestazione con \newcommand\firstlines anzichè con \def.

            Mi aspettavo che con più di un ambiente partab nel documento LaTeX avrebbe lamentato la definizione di un comando già definito, invece non ha fatto una grinza.

            E’ perché la definizione del comando si trova all’interno di un gruppo e cessa di esistere subito dopo (escludo tranquillamente l’ipotesi che LaTeX sovrascriva i comandi con lo stesso nome altrimenti si potrebbero verificare errori e d’altro canto non esisterebbe il \renewcommand)?

            PS. Il nuovo ambiente funziona p e r f e t t a m e n t e.

            Che tu dia \newcommand o \def è quasi lo stesso: come hai immaginato, la definizione è data nel gruppo implicitamente aperto dall’ambiente partab e quindi sparisce quando l’ambiente viene chiuso.

            Con \def non puoi scrivere più capoversi come introduzione, perché TeX si lamenterebbe. Con \newcommand (che usa \long\def) la cosa cambia.

            L’idea è semplice: immagazzino il testo da scrivere in cima in una macro; poi comincio a raccogliere il testo dell’ambiente dentro una lrbox e un tabular; alla fine chiudo il tabulare e la lrbox; con \wd\partabbox ho a disposizione l’ampiezza della box.

            Ciao
            Enrico

            PS: la giornata, tutto sommato, non è affatto male.

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

        Go to top