calcoliamo la colonne

  • Creatore
    Topic
  • #122252
    claudio
    Partecipante
      Up
      0
      Down
      ::


      Buon anno
      esiste una formula empirica per calcolare quante colonne può avere una tabella formata da numeri interi?
      `
      \documentclass{article}
      \usepackage

      {geometry}
      \usepackage{longtable}
      \usepackage{booktabs}
      \begin{document}
      \begin{longtable}{*{15}{c}}
      \caption{Numeri primi}\label{tab:Numeri primi}
      \endhead
      \toprule
      9613 & 9619 & 9623 & 9629 & 9631 & 9643 & 9649 & 9661 & 9677 & 9679 & 9689 & 9697 & 9719 & 9721 & 9733\\
      9739 & 9743 & 9749 & 9767 & 9769 & 9781 & 9787 & 9791 & 9803 & 9811 & 9817 & 9829 & 9833 & 9839 & 9851\\
      9857 & 9859 & 9871 & 9883 & 9887 & 9901 & 9907 & 9923 & 9929 & 9931 & 9941 & 9949 & 9967 & 9973 & \\
      \bottomrule
      \end{longtable}
      \end{document}
      `
      sono alcuni numeri primi minori di 10000.
      La tabella è generata automaticamente e come vedete entra giusta giusta nella pagina.
      Se passo a numeri a cinque cifre per farla entrare devo diminuire, ovviamente, il numero di colonne

      `
      \documentclass{article}
      \usepackage

      {geometry}
      \usepackage{longtable}
      \usepackage{booktabs}
      \begin{document}
      \begin{longtable}{*{12}{c}}
      \caption{Numeri primi}\label{tab:Numeri primi}
      \endhead
      \toprule

      99563 & 99571 & 99577 & 99581 & 99607 & 99611 & 99623 & 99643 & 99661 & 99667 & 99679 & 99689\\
      99707 & 99709 & 99713 & 99719 & 99721 & 99733 & 99761 & 99767 & 99787 & 99793 & 99809 & 99817\\
      99823 & 99829 & 99833 & 99839 & 99859 & 99871 & 99877 & 99881 & 99901 & 99907 & 99923 & 99929\\
      99961 & 99971 & 99989 & 99991 & & & & & & & & \\
      \bottomrule
      \end{longtable}
      \end{document}
      `
      La domanda è questa esiste una formula, un algoritmo qualcosa che permetta di decidere quante colonne debba avere una tabella in modo che non debordi?
      saluti
      claudio

    Visualizzazione 2 filoni di risposte
    • Autore
      Risposte
      • #122253
        mcl1962
        Partecipante
          Up
          0
          Down
          ::


          Io ho fatto il ragionamento seguente, ma probabilmente chi conosce TeX a un livello più profondo del mio potrà darti una risposta più precisa.

          Se $n$ è il numero massimo di cifre di un numero in una cella, $N$ il numero massimo di caratteri che stanno in una riga e $c$ è il numero di colonne allora, ammettendo che lo spazio tra due colonne sia di due caratteri e che prima dei margini della pagina c’è almeno un carattere, puoi assumere che
          \[
          c = \frac{N – 2 \cdot (c-1) – 2}{n}
          \]
          da cui
          \[
          c = \frac{N-2}{n+2}
          \]
          (naturalmente si prende la parte intera di $c$).
          Negli esempi da te proposti è $N = 97$, da cui:
          – per $n=4 si ottiene $c \approx 15.8$, che concorda con la tua tabella;
          – per $n=5$ si ottiene $c \approx 13.57$, che va bene (tu hai costruito una tabella con 12 colonne, ma vanno bene anche 13 colonne)

          Ho provato anche con $n=6$ e ho ottenuto $c \approx 11.9$: 11 colonne vanno bene, 12 no!

          Buon anno.

          Claudio

        • #122254
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::


            Caro omonimo JoungClaudio, il tuo messaggio e la risposta che hai già ricevuto mi fa capire cose che non si inisce mai di scoprire cose che non si conoscono e che finalmente si imparano. Ringrazio @mcl1962 che ti ha già risposto e la cui seconda formula ti fornisce la regola empirica che ti mancava.
            In realtà può costruirti una macro che ti da la risposta esatta e non approssimata, perché i magico numero di 97 può andar bene per quella classe e per il corpo normale che che hai specificato alla classe. Quello che a te serve, è sapere quanto sia larga una colonna di Numeri interi con 4, o 5, o 6.

            Ottieni questa larghezza eseguendo il calcolo [tt] \settowidth{\cinqueinteri}{$00000$}[/tt] da inserire dentro un gruppo dove sia specificato il corpo che vuoi usare; analogamente per quattro interi o sei interi. Invece di [tt]\cinqueinteri[/tt] potresti usare un registro dimensionale con un nome generico come, per esempio, [tt]\Linteri[/tt]. Dopo di che ovviamente la larghezza deve stare dentro la larghezza \textwidt che dipende dalla classe che usi. Per cui il numero di colonne che puoi usare è il massimo intero inferiore o uguale alla \textwidth diviso per la \Linteri aumentata dello spazio totale intercolonna; lo puoi calcolare con la formula
            `
            \newlength\Linteri %%% nel preambolo

            \settowidth{\Linteri}{$0000$}
            \fpeval{floor(\textwidth/(\Linteri+2\tabcolsep),0)}
            `
            La funzione LaTeX 3 \fpeval e l’operatore floor fanno parte del nucleo di LaTeX, quindi non devi caricare nessun pacchetto particolare.

            Il numero ottenuto è quello che devi usare nell’apertura dell’ambiente longtable. Come vedi le forule usate contengono variabili che possono avere qualunque valore e variano in base alla classe e al corpo normale senza dover fare nessuna stima di quanti caratteri ci siano in una riga.

          • #122255
            Up
            0
            Down
            ::


            Assumendo che i numeri siano in ordine crescente, possiamo misurare l’ultimo, aggiungere lo spazio normale tra le colonne ed eseguire la divisione troncando. Questo dà il numero di colonne. Poi è in discesa. 😀

            `
            \documentclass{article}
            \usepackage{booktabs,longtable}

            \ExplSyntaxOn
            \NewDocumentCommand{\printprimes}{mm}
            {% #1 = caption, #2 = list of primes
            \group_begin:
            % riempiamo una sequence
            \seq_set_from_clist:Nn \l_tmpa_seq {#2}
            % calcoliamo la larghezza dell'ultimo elemento
            \hbox_set:Nn \l_tmpa_box { \seq_item:Nn \l_tmpa_seq {-1} \hspace{2\tabcolsep} }
            % calcoliamo il numero di colonne
            \int_set:Nn \l_tmpa_int { \int_div_truncate:nn { \textwidth } { \box_wd:N \l_tmpa_box} }
            % aggiungiamo elementi vuoti alla sequence finché non si ottiene un multiplo
            % del numero di colonne
            \bool_until_do:nn
            { \int_compare_p:n { \int_mod:nn { \seq_count:N \l_tmpa_seq } { \l_tmpa_int } == 0 } }
            { \seq_put_right:Nn \l_tmpa_seq {} }
            % ora stampiamo!
            \begin{longtable}{*{\l_tmpa_int}{r}}
            \caption{#1}\endhead
            \toprule
            \seq_map_indexed_function:NN \l_tmpa_seq \__claudio_prime:nn
            \bottomrule
            \end{longtable}
            \group_end:
            }
            \cs_new_protected:Nn \__claudio_prime:nn
            {% se l'indice è un multiplo del numero di colonne \\, altrimenti &
            #2 \int_compare:nTF { \int_mod:nn { #1 } { \l_tmpa_int } == 0 } { \\ } { & }
            }
            \ExplSyntaxOff

            \begin{document}

            \printprimes{Alcuni numeri primi}{
            9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733,
            9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851,
            9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973
            }

            \printprimes{Altri numeri primi}{
            99563, 99571, 99577, 99581, 99607, 99611, 99623, 99643, 99661, 99667, 99679, 99689,
            99707, 99709, 99713, 99719, 99721, 99733, 99761, 99767, 99787, 99793, 99809, 99817,
            99823, 99829, 99833, 99839, 99859, 99871, 99877, 99881, 99901, 99907, 99923, 99929,
            99961, 99971, 99989, 99991
            }

            \printprimes{Tutti insieme}{
            9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733,
            9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851,
            9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973,
            99563, 99571, 99577, 99581, 99607, 99611, 99623, 99643, 99661, 99667, 99679, 99689,
            99707, 99709, 99713, 99719, 99721, 99733, 99761, 99767, 99787, 99793, 99809, 99817,
            99823, 99829, 99833, 99839, 99859, 99871, 99877, 99881, 99901, 99907, 99923, 99929,
            99961, 99971, 99989, 99991
            }

            \end{document}
            `

            [attachment=2821]Screenshot2025-01-06at17.34.56.png[/attachment]

            Ti serve davvero [tt]longtable[/tt]?

            Ciao
            Enrico

            Attachments:
            You must be logged in to view attached files.
        Visualizzazione 2 filoni di risposte
        • Devi essere connesso per rispondere a questo topic.

        Go to top