Erstellen eines neuen Befehls zum Zeichnen von Zehnerblöcken

Erstellen eines neuen Befehls zum Zeichnen von Zehnerblöcken

Ignasihabe tollen Code für Zehnerblöcke geschrieben und habe versucht, ihn für die automatische Generierung von Darstellungen zweistelliger Zahlen zu verwenden.

%%Base 10 Blocks
\tikzset {
    node distance=.1cm,
    hundred/.style={
        draw,
        minimum size=1cm,
        inner sep=0pt
        },
    tenv/.style={
        line width=0.1mm,
        fill=red,
        draw,
        minimum height=1cm,
        minimum width=0.1cm,
        inner sep=0pt,
    },
    tenthh/.style={
        draw,
        minimum height=0.1cm,
        minimum width=1cm,
        inner sep=0pt,
    },
    unitone/.style={
         line width=0.1mm,
        draw,
        minimum size=0.1cm,
        inner sep=0pt,
    },
   base graph/.pic={
        \node[hundred] (00) {};
        \node[hundred, below=of 00] (10) {};
        \node[tenthh, below=of 10] (20) {};
        \foreach \i [count=\xi, remember=\xi as \lasti (initially 0)] in {1,2,3,4} 
          \node[tenv, right=of 0\lasti] (0\xi) {};         
        \path (00.north west) -- (20.south west) node[midway, left] {2.1} ;
        \path (00.north west) -- (04.north east) node[midway, above] {1.4} ;
        }
    }

Hier ist ein Code, den ich geschrieben habe, um die Zahl 37 zu generieren

 \begin{center} \begin{tikzpicture}[transform canvas={scale=3}]
 \foreach \y in {-0.95,-0.85,...,-0.35}{
 \node[unitone] at (0.1,\y){};}
 \foreach \x in {-0.5,-0.3,...,-0.1}{
 \node[tenv] at (\x,-0.5){};}
 \end{tikzpicture}\end{center}

Es sieht so aus ...

Bildbeschreibung hier eingeben

War allerdings sehr knifflig und in Excel erstellt.

Ich hätte gern einen solchen Code, \basetenpic{7}{3}der automatisch ein ähnliches Bild erstellt. (Wobei der Einerwert zuerst kommt, um mehr Stellenwertpositionen zu ermöglichen. So \basetenpic{2}{0}{3}würde etwa ein Bild mit 3 Hundertern gefolgt von 2 Einer entstehen ...)

Bildbeschreibung hier eingeben

Hat jemand eine Idee?

Antwort1

Anpassungen

  • definierte Längen \unitsizeund\unitsep
  • foreachzum Zeichnen von Knoten verwenden
  • verwenden \ifnumgreater{\tens}{0}{}{}usw., um zu überprüfen, ob welche Blöcke gezeichnet werden sollen
  • Ich habe auch darüber nachgedacht, nur die Zahl als einen Parameter zu verwenden, als Erweiterung, aber dann habe ich gesehen, dass dies in Jaspers Antwort bereits getan wird. Also habe ich einfach eine Wrapper-Funktion hinzugefügt \basetenpicx{<number>}.

Ergebnis

Bildbeschreibung hier eingeben

Code

\documentclass{article}

\usepackage{etoolbox}
\usepackage{tikz}

\newlength{\unitsize}
\setlength{\unitsize}{3mm}

\newlength{\unitsep}
\setlength{\unitsep}{3mm}

% Base 10 Blocks
\tikzset {
    node distance=\unitsep,
    hundred/.style={
        draw,
        fill=yellow,
        anchor=south west,
        minimum size=10*\unitsize,
        inner sep=0pt
    },
    tenv/.style={
        anchor=south west,
        line width=0.1mm,
        fill=red,
        draw,
        minimum height=10*\unitsize,
        minimum width=\unitsize,
        inner sep=0pt,
    },
    tenthh/.style={
        anchor=south west,
        draw,
        minimum height=\unitsize,
        minimum width=10*\unitsize,
        inner sep=0pt,
    },
    unitone/.style={
        anchor=south west,
        line width=0.1mm,
        draw,
        minimum size=\unitsize,
        inner sep=0pt,
    },
}

\newcommand{\basetenpic}[3]{
    \edef\ones{#1}
    \edef\tens{#2}
    \edef\hundreds{#3}
    \begin{tikzpicture}
        % uncomment this to have the same height
        %\node[inner sep=0pt] at (0,10*\unitsize) {};
        % one
        \ifnumgreater{\ones}{0}{
            \foreach \i in {1, ..., \ones}{
                \node[unitone] at ({\hundreds*(10*\unitsize+\unitsep) + \tens*(\unitsize+\unitsep)}, {(\i-1)*\unitsize}) {};
            }
        }{}
        % ten
        \ifnumgreater{\tens}{0}{
            \foreach \i in {1, ..., \tens}{
                \node[tenv] at ({\hundreds*(10*\unitsize+\unitsep) + (\i-1)*(\unitsize+\unitsep)}, 0) {};
            }
        }{}
        % hundret
        \ifnumgreater{\hundreds}{0}{
            \foreach \i in {1, ..., \hundreds}{
                \node[hundred] at ({(\i-1)*(10*\unitsize+\unitsep)}, 0) {};
            }
        }{}
    \end{tikzpicture}   
}

\newcommand{\basetenpicx}[1]{
    \pgfmathtruncatemacro{\ones}{mod(#1, 10)}
    \pgfmathtruncatemacro{\tens}{mod(#1 - \ones, 100)/10}
    \pgfmathtruncatemacro{\hundreds}{mod(#1 - \tens - \ones, 1000)/100}
    \basetenpic{\ones}{\tens}{\hundreds}
}

\begin{document}

\obeylines
\verb|\basetenpic{7}{0}{0}|:
\basetenpic{7}{0}{0}

\verb|\basetenpic{7}{3}{0}|:
\basetenpic{7}{3}{0}

\verb|\basetenpicx{203}|:
\basetenpicx{203}

\verb|\basetenpicx{60}|:
\basetenpicx{60}

\end{document}

Antwort2

Ich denke, ein noch besserer Ansatz als ein Makro, das ein, zwei oder drei Argumente akzeptiert, wäre es, die Berechnung einfach PGF zu überlassen. Auf diese Weise geben Sie einfach beliebige Zahlen zwischen 1 und 999 in das einzige Argument des Makros ein \basetenpicund die Anzahl der Felder wird automatisch berechnet.

Ich würde wahrscheinlich auch die Größe der Kästchen und Lücken so anpassen, dass 10 kleinere Kästchen (einschließlich der Lücken) die gleiche Breite oder Höhe wie ein größeres Kästchen haben. (Natürlich ist es, wie @dexteritas anmerkte, nicht möglich, die Flächen der verschiedenen Kästchen und die Werte, die sie darstellen, anzupassen, während gleichzeitig 10 Einser-Kästchen einschließlich der Lücken der Höhe eines Zehner-Kästchens entsprechen.)

Im Folgenden werden solche Boxen ausgegeben. Sie können die verschiedenen Boxen nach Ihrem Geschmack gestalten, sie beispielsweise gelb oder anders füllen. Das Makro nimmt ein optionales Argument zum Hinzufügen benutzerdefinierter Optionen zur tikzpictureGestaltung an:

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}

\tikzset{
    basetenpic/.style={
        node distance=0.05cm,
        every node/.style={
            draw,
            line width=0.01cm,
            inner sep=0pt,
        },
        hundreds/.style={
            % = 10 x height of boxes + 9 x line width + 9 x gap
            % = 10 x 0.1cm + 9 x 0.01cm + 9 x 0.05cm
            minimum size=1.54cm,
        },
        tens/.style={
            minimum height=1.54cm,
            minimum width=0.1cm,
        },
        ones/.style={
            minimum size=0.1cm,
        }
    }
}

\newcounter{boxcount}
\newcommand{\basetenpic}[2][]{
    \pgfmathtruncatemacro{\ones}{mod(#2, 10)}
    \pgfmathtruncatemacro{\tens}{mod(#2 - \ones, 100)/10}
    \pgfmathtruncatemacro{\hundreds}{mod(#2 - \tens - \ones, 1000)/100}
    \setcounter{boxcount}{0}
    \begin{tikzpicture}[basetenpic, #1]
        \coordinate (n0) at (0,0);
        \ifnum\hundreds>0\relax
            \foreach \i [evaluate={\theboxcount as \lastboxcount}] in {1,...,\hundreds} {
                \stepcounter{boxcount}
                \node[right=of n\lastboxcount, hundreds] (n\theboxcount) {};
            }
        \fi
        \ifnum\tens>0\relax
            \foreach \i [evaluate={\theboxcount as \lastboxcount}] in {1,...,\tens} {
                \stepcounter{boxcount}
                \node[right=of n\lastboxcount, tens] (n\theboxcount) {};
            }
        \fi
        \ifnum\ones>0\relax
            \foreach \i [evaluate={\theboxcount as \lastboxcount}] in {1,...,\ones} {
                \stepcounter{boxcount}
                \ifnum\i=1\relax
                    \node[right=of n\lastboxcount.south east, anchor=south west, ones] (n\theboxcount) {};
                \else
                    \node[above=of n\lastboxcount, ones] (n\theboxcount) {};
                \fi
            }
        \fi
    \end{tikzpicture}
}

\begin{document}
    
\basetenpic{26}

\basetenpic{302}

\basetenpic[hundreds/.append style={fill=yellow}]{137}

\end{document}

Bildbeschreibung hier eingeben

Die ursprüngliche Antwort, auf die Sie verlinken, erstellt ein pic, während diese Lösung ein vollständiges ausgibt tikzpicture. Es ist jedoch nicht zu kompliziert, das eine in das andere umzuwandeln.


Wenn Sie die Lücken entfernen, haben die Flächen der Kästchen das exakte Verhältnis zueinander (das heißt, das Kästchen für die Zehner hat dann die 10-fache Fläche eines kleinen Kästchens usw.). Ich würde jedoch der Konsistenz halber die Lücken ganz entfernen. Sie können den \tikzsetTeil des obigen MWE folgendermaßen ändern:

\tikzset{
    basetenpic/.style={
        % = minus half the line width    
        node distance=-0.005cm,
        every node/.style={
            draw,
            line width=0.01cm,
            inner sep=0pt,
        },
        hundreds/.style={
            minimum size=1cm,
        },
        tens/.style={
            minimum height=1cm,
            minimum width=0.1cm,
        },
        ones/.style={
            minimum size=0.1cm,
        }
    }
}

Beispielergebnis:

Bildbeschreibung hier eingeben

verwandte Informationen