Re: tabella pitagorica

#38228
Up
0
Down
::

La soluzione di Enrico si basa su TeX e pertanto richiede particolare abilità e conoscenza del linguaggio di Knuth, sicché non è facile e immediato ricavarla.
Rimane certamente come esempio di studio per chi come me dovrebbe cominciare a studiare seriamente TeX e colmare questa vasta lacuna di utilizzatore di LaTeX.
Tuttavia propongo qui un’altra soluzione basata sul pacchetto grafico PGF che offre un linguaggio la cui “filosofia” mi è particolarmente congeniale.

Disegno della griglia:
Per disegnare la griglia della tabella pitagorica utilizziamo il comando \draw specificando un quadrato di 10 di lato (se non si specificano unità PGF intenderà i centimetri):`\draw (0,0) grid (10,10);`

Riempimento della tabella:
Basta scrivere due cicli foreach nidificati che eseguono il disegno di un nodo con la comoda opzione shift. Ho copiato, questo si, il codice di Enrico in TeX per calcolare il risultato dell’espressione x * ()-y che da il valore del prodotto in tabellina, poiché PGF esegue risolve eventuali espressioni solo se si tratta di coordinate mentre per il testo da associare al nodo non effettua alcun parsing:
`\foreach \x in {1,2,3,…,10}
\foreach \y in {1,2,3,…,10}
\draw[shift={(-.5,-.5)}] (\x ,\y) node {\number\numexpr\x*(11-\y)\relax};`

Mettendo insieme il codice ecco il primo risultato che da la tabellina pitagorica corretta in una griglia di 1cm x 1cm:`\documentclass[a4paper]{article}

\usepackage{tikz}
\pagestyle{empty}

\begin{document}

\begin{tikzpicture}
% grid definition
\draw (0,0) grid (10,10);

% fill numbers
\foreach \x in {1,2,3,…,10}
\foreach \y in {1,2,3,…,10}
\draw[shift={(-.5,-.5)}] (\x ,\y) node {\number\numexpr\x*(11-\y)\relax};
\end{tikzpicture}

\end{document}`

Completando e raffinando un po’ il codice, si ottiene il seguente listato, dove la cosa più importante è l’aggiunta dell’opzione scale all’ambiente tikzpicture che scala tutto tranne che il testo assegnato agli oggetti nodo, pertanto modificando un unico parametro si può regolare le dimensione della tabella.

`\documentclass[a4paper]{article}

\usepackage{tikz}
\pagestyle{empty}

\begin{document}

\begin{tikzpicture}[scale=0.675]
% grid definition
\draw (-1,0) grid (10,10);
\draw (0,10) grid (10,11);
\draw[line width=1pt, color=blue] (0,0) rectangle (10,10);

% fill numbers
\foreach \x in {1,2,3,…,10}
\foreach \y in {1,2,3,…,10}
\draw[shift={(-.5,-.5)}] (\x ,\y) node {\number\numexpr\x*(11-\y)\relax};

% fill first row
\foreach \x in {1,2,3,…,10}
\draw[shift={(-.5,-.5)}] (\x , 11) node {\x};

% fill first column
\foreach \y in {1,2,3,…,10}
\draw[shift={(-.5,-.5)}] (0, 11-\y) node {\y};
\end{tikzpicture}

\end{document}`

Ringrazio chi ha avuto la pazienza di seguire fino quì e naturalmente anche Enrico.
Firmato un impenitente non utilizzatore di TeX.

Molto carina. Ieri sera cercavo di risolvere il problema in treno, con un paio di idee che non funzionavano. Fra stazione e casa mi è venuto in mente \makebox(0,0) per centrare il numero nel quadrato e il resto era già in via di rifinitura. Va da sé che \makebox(0.0) ha richiamato l’uso dell’ambiente picture: quel tipo di oggetto non è una tabella, ma un oggetto grafico. Chiaro che con tikz, a saperlo usare :(, si può fare.

Vediamo di commentare un po’ quel codice misterioso. Il nucleo fondamentale è costruire il quadrato di base: uso \fbox inserendo una \vrule invisibile alta mezzo centimetro e profonda altrettanto, in modo che il numero inserito tra due spazi orizzontali di mezzo centimetro sia perfettamente al centro.

La macro \riga è solo un’abbreviazione per inserire le undici caselle senza dover fare i conti.

A quel punto mi serve un opportuno preambolo per un \halign che inserisco in una \vbox dove azzero lo spazio interlinea (\offinterlineskip) e anche lo spazio che LaTeX aggiunge fra il bordo e il contenuto della \box (\fboxsep=0pt). Il preambolo, cioè lo schema per definire le colonne dell’allineamento è
`&\mybox{#}\kern-\fboxrule\cr`
che significa: ripeti quante volte serve il codice indicato fra & e \cr, sostituendo a # il contenuto effettivo della cella. Quindi il numero che compare diventa l’argomento di \mybox e una volta inserito il quadrato si torna indietro di \fboxrule, in modo che il bordo del quadrato successivo si sovrapponga al precedente.

Con \omit evito di inserire il quadrato nell’angolo in alto a sinistra, e scrivo la prima riga
(in realtà mi accorgo che ci sono dei \mybox in più :(). Alla fine della riga inserisco una spaziatura verticale negativa perché il bordo della riga si sovrapponga a quello della successiva (\noalign{\kern-\fboxrule}).

\halign è molto più flessibile di \tabular, ma anche più difficile. 🙂

Ciao
Enrico

Go to top