Ich habe folgende Lösung für einen neudefinierten Befehl für einen Zahlenstrahl gebaut: Open in Online-Editor
\documentclass[]{scrartcl} \usepackage{tikz} \newcommand{\kos}[2]{ \draw [color=gray!50] [step=5mm] (#1-1,-1) grid (#2+1,1); %Raster zeichnen \draw[->,thick] (#1-0.5,0) -- (#2+0.5,0) node[right] {$x$}; \foreach \x in {#1,-1,0,1,#2} \draw (\x,-.1) -- (\x,.1) node[below=4pt] {$\scriptstyle\x$}; % x-Achse beschriften } \begin{document} \begin{tikzpicture} \kos{-4}{4} \end{tikzpicture} \end{document} Wie kann ich erreichen, dass auf dem Strahl nur bestimmte Werte auftauchen? Um das genauer zu formulieren: die 0, 1 und die Fünferschritte danach (5,10....) plus ihre negativen Kollegen, sollen angezeigt werden, aber nur innerhalb dem vorgegebenen Minimal und Maximalwert (meine zwei Werte dich ich mitgeb) Im Moment zeigt er mir -1,0 und 1 an plus den minimalen und maximalen Wert. gefragt 01 Nov '16, 22:16 Astrina |
Du musst natürlich irgendwie bestimmen, welche Werte auftauchen sollen. Im einfachsten Fall, dass im Abstand von 1 alle Werte von dem kleinsten Wert (also Open in Online-Editor
\documentclass[]{scrartcl} \usepackage{tikz} \newcommand{\kos}[2]{ \draw [color=gray!50] [step=5mm] (#1-1,-1) grid (#2+1,1); %Raster zeichnen \draw[->,thick] (#1-0.5,0) -- (#2+0.5,0) node[right] {$x$}; \foreach \x in {#1,...,#2} \draw (\x,-.1) -- (\x,.1) node[below=4pt] {$\scriptstyle\x$}; % x-Achse beschriften } \begin{document} \begin{tikzpicture} \kos{-4}{4} \end{tikzpicture} \end{document} Will man mehr Kontrolle über die Liste, bietet es sich an, über ein weiteres Argument die Liste direkt zu beeinflussen. Hier ein Beispiel mit einem optionalen Argument: Open in Online-Editor
\documentclass[]{scrartcl} \usepackage{tikz} \newcommand{\kos}[3][-1,...,1]{ \draw [color=gray!50] [step=5mm] (#2-1,-1) grid (#3+1,1); %Raster zeichnen \draw[->,thick] (#2-0.5,0) -- (#3+0.5,0) node[right] {$x$}; \foreach \x in {#1} \draw (\x,-.1) -- (\x,.1) node[below=4pt] {$\scriptstyle\x$}; % x-Achse beschriften } \begin{document} \begin{tikzpicture} \kos[-4,-2,-1,0,1,2,4]{-4}{4} \end{tikzpicture} \end{document} Wenn es einen Algorithmus gibt, nach dem bei der Nummerierung vorgegangen werden kann, so kann natürlich auch dieser wieder in TeX gegossen werden. Lautet der Algorithmus beispielsweise, dass vom kleinsten bis zum größten Wert in einer-Schritten Markierungen gesetzt werden sollen, solange nicht explizit etwas anderes angegeben ist, so ginge das u. a. so: Open in Online-Editor
\documentclass[]{scrartcl} \usepackage{tikz} \newcommand{\kos}[3][]{ \if\relax\detokenize{#1}\relax% Wenn das optionale Argument leer ist \def\werteloop{\foreach \x in {#2,...,#3}}% in Einerschritten markieren \else% sonst \def\werteloop{\foreach \x in {#1}}% in der angegebenen Weise markieren. \fi \draw [color=gray!50] [step=5mm] (#2-1,-1) grid (#3+1,1); %Raster zeichnen \draw[->,thick] (#2-0.5,0) -- (#3+0.5,0) node[right] {$x$}; \werteloop \draw (\x,-.1) -- (\x,.1) node[below=4pt] {$\scriptstyle\x$}; % x-Achse beschriften } \begin{document} \begin{tikzpicture} \kos{-4}{4} \end{tikzpicture} \begin{tikzpicture} \kos[-4,-2,-1,0,1,2,4]{-4}{4} \end{tikzpicture} \end{document} oder ganz ohne Hilfsmakro dafür aber mit teilweiser Code-Verdoppelung: Open in Online-Editor
\documentclass{scrartcl} \usepackage{tikz} \newcommand{\kos}[3][]{% #1 = Raster (optional), #2 = Startwert, #3 = Endwert \draw [color=gray!50] [step=5mm] (#2-1,-1) grid (#3+1,1); %Raster zeichnen \draw[->,thick] (#2-0.5,0) -- (#3+0.5,0) node[right] {$x$}; \if\relax\detokenize{#1}\relax% Wenn das optionale Argument leer ist \foreach \x in {#2,...,#3}% das Standardraster verwenden \draw (\x,-.1) -- (\x,.1) node[below=4pt] {$\scriptstyle\x$}; % x-Achse beschriften \else% sonst \foreach \x in {#1}% das explizit angegebene Raster verwenden \draw (\x,-.1) -- (\x,.1) node[below=4pt] {$\scriptstyle\x$}; % x-Achse beschriften \fi } \begin{document} \begin{tikzpicture} \kos{-4}{4} \end{tikzpicture} \begin{tikzpicture} \kos[-4,-2,-1,0,1,2,4]{-4}{4} \end{tikzpicture} \end{document} Übrigens: Mit einer aktuelleren Version von KOMA-Script als Overleaf (der Online-Editor) derzeit bietet, kann man den Test auf das leere optionale Argument auch einfach mit Open in Online-Editor
\documentclass{scrartcl}[2015/08/29]% Benötigt min. KOMA-Script 3.19 \usepackage{tikz} \newcommand{\kos}[3][]{% #1 = Raster (optional), #2 = Startwert, #3 = Endwert \draw [color=gray!50] [step=5mm] (#2-1,-1) grid (#3+1,1); %Raster zeichnen \draw[->,thick] (#2-0.5,0) -- (#3+0.5,0) node[right] {$x$}; \IfArgIsEmpty{#1}{% Wenn das optionale Argument leer ist \foreach \x in {#2,...,#3}% das Standardraster verwenden }{% sonst \foreach \x in {#1}% das explizit angegebene Raster verwenden }% \draw (\x,-.1) -- (\x,.1) node[below=4pt] {$\scriptstyle\x$}; % x-Achse beschriften } \begin{document} \begin{tikzpicture} \kos{-4}{4} \end{tikzpicture} \begin{tikzpicture} \kos[-4,-2,-1,0,1,2,4]{-4}{4} \end{tikzpicture} \end{document} Der von Dir ergänzte Algorithmus aus der Frage: alle Zahlen von der kleinsten bis zur größten durch 5 teilbaren Zahl im Intervall und zusätzlich -1, 0 und 1, wäre mit Hilfe der mathematischen Funktionen von Open in Online-Editor
\documentclass{scrartcl}[2015/08/29]% Benötigt min. KOMA-Script 3.19 \usepackage{tikz} \newcommand{\kos}[3][]{% #1 = Raster (optional), #2 = Startwert, #3 = Endwert \draw [color=gray!50] [step=5mm] (#2-1,-1) grid (#3+1,1); %Raster zeichnen \draw[->,thick] (#2-0.5,0) -- (#3+0.5,0) node[right] {$x$}; \IfArgIsEmpty{#1}{% Wenn das optionale Argument leer ist \pgfmathsetmacro{\minfive}{int(div(#2,5)*5)}% kleinste durch 5 teilbare Zahl \pgfmathsetmacro{\nextfive}{int(\minfive+5)}% nächst größere durch 5 teilbare Zahl \pgfmathsetmacro{\maxfive}{int(div(#3,5)*5)}% größte durch 5 teilbare Zahl \ifnum\nextfive>\maxfive\else \foreach \x in {\minfive,\nextfive,...,\maxfive} \draw (\x,-.1) -- (\x,.1) node[below=4pt] {$\scriptstyle\x$}; \fi \foreach \x in {-1,0,1}% das Standardraster verwenden }{% sonst \foreach \x in {#1}% das explizit angegebene Raster verwenden }% \draw (\x,-.1) -- (\x,.1) node[below=4pt] {$\scriptstyle\x$}; % x-Achse beschriften } \begin{document} \begin{tikzpicture} \kos{-4}{4} \end{tikzpicture} \begin{tikzpicture} \kos{-6}{4} \end{tikzpicture} \begin{tikzpicture} \kos{-6}{10} \end{tikzpicture} \begin{tikzpicture} \kos[-4,-2,-1,0,1,2,4]{-4}{4} \end{tikzpicture} \end{document} beantwortet 02 Nov '16, 08:16 saputello Deine Lösung mit dem optionalen Argument tut zwar das was ich will, aber ich würde mir eine Lösung ohne optionales Argument wünschen. Ich habe meine Frage mal aktualisiert, hoffentlich kommt dann klarer heraus, nach welchem Algorithmus ich meine Zahlen gesetzt haben will.
(04 Nov '16, 18:36)
Astrina
dein letztes Beispiel sieht genauso aus, wie ich es mir vorgestellt habe. Leider läuft es bei mir aber nicht. ! Undefined control sequence.\kos ...+0.5,0) node[right] {$x$}; IfArgIsEmpty{#1}{pgfmathsetmacro {mi... kos{-4}{4} in Zeile 24. Hat das was mit Koma zu tun?
(05 Nov '16, 12:32)
Astrina
@Astrina: Kann ich aus dem unformatierten Code der Fehlermeldung in Deinem Kommentar nicht ablesen. Wenn du gleichzeitig eine Warnung der Art: »
(05 Nov '16, 13:40)
saputello
|
Mir ist das Ziel der Frage auch nicht ganz klar. Wenn Du die Achseinteilung fest vorgeben möchtest, aber sicher gehen willst, dass keine Zahlen außerhalb Deines Bereiches markiert werden, dann könnte man auch Open in Online-Editor
\documentclass[]{scrartcl} \usepackage{pgfplots} \pgfplotsset{compat=newest} \newcommand{\kos}[2]{ \draw[color=gray!50]({#1-1},-1)grid[step=.5cm]({#2+1},1); \begin{axis}[ axis x line=middle, x axis line style={thick,->}, axis y line=none, anchor=left of origin, xshift=#1cm-.5cm, xlabel=$x$, xlabel style={anchor=west}, x=1cm, xmin=#1,xmax=#2, enlarge x limits={abs=5mm}, xtickmin=#1,xtickmax=#2, xtick={-5,-2,-1,0,1,2,5}, xtick style={black,thin}, tickwidth=2mm, y=1cm, ymin=-.5,ymax=.5, ] \end{axis} } \begin{document} \begin{tikzpicture} \kos{-4}{4} \end{tikzpicture} \bigskip \begin{tikzpicture} \kos{-6}{1.5} \end{tikzpicture} \end{document} Analog zum Vorschlag von @saputello kann man auch hier unter Verwendung von Open in Online-Editor
\documentclass{scrartcl}[29/08/15]% mindestens Version 3.19 \usepackage{pgfplots} \pgfplotsset{compat=newest} \newcommand{\kos}[3][]{ \draw[color=gray!50]({#2-1},-1)grid[step=.5cm]({#3+1},1); \IfArgIsEmpty{#1}{ \pgfplotsset{xtick={-5,-2,-1,0,1,2,5}} }{ \pgfplotsset{xtick={#1}} } \begin{axis}[ axis x line=middle, x axis line style={thick,->}, axis y line=none, anchor=left of origin, xshift=#2cm-.5cm, xlabel=$x$, xlabel style={anchor=west}, x=1cm, xmin=#2,xmax=#3, enlarge x limits={abs=5mm}, xtickmin=#2,xtickmax=#3, xtick style={black,thin}, tickwidth=2mm, y=1cm, ymin=-.5,ymax=.5, ] \end{axis} } \begin{document} \begin{tikzpicture} \kos{-4}{4} \end{tikzpicture} \bigskip \begin{tikzpicture} \kos{-6}{1.5} \end{tikzpicture} \bigskip \begin{tikzpicture} \kos[-6,...,6]{-6}{1.5} \end{tikzpicture} \bigskip \begin{tikzpicture} \kos[\empty]{-6}{1.5} \end{tikzpicture} \end{document} beantwortet 02 Nov '16, 09:38 esdd Das x-tick das bei pgfplots verwendet werden kann, ist genau das was ich mir wünsche. Kann man diese Lösung auch in Tikz nachbauen?
(04 Nov '16, 18:40)
Astrina
|