2
1

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's gravatar image

Astrina
371101925
Akzeptiert-Rate: 50%

bearbeitet 04 Nov '16, 18:39


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 #1) bis zum größten Wert (also #2) ausgegeben werden sollen, kann man bei \foreach einfach die Pünktchenversion der Liste verwenden (siehe pfg-Anleitung, Abschnitt 83: »Repeating Things: The Foreach Statement«, ab »The dots notation«):

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 \IfArgIsEmpty{#1}{…}{…} machen:

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 pgf (siehe Teil VIII der pgf-Anleitung) beispielsweise so umsetzbar:

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}

alt text

Permanenter link

beantwortet 02 Nov '16, 08:16

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 04 Nov '16, 21:21

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

@Astrina: Siehe erweiterte Antwort.

(04 Nov '16, 21:10) saputello

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: »You have requested version `2015/08/29' of scrartcl but only version `…' is available«, in der log-Datei findest, dann ist dein KOMA-Script (und vermutlich die ganze LaTeX-Installation) stark veraltet. Ein Update sollte das lösen. Alternativ kannst du die Fallunterscheidung nach dem leeren Argument wie im dritten Beispiel machen. Ich würde aber das Update empfehlen.

(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 pgfplots nutzen:

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}

alt text

Analog zum Vorschlag von @saputello kann man auch hier unter Verwendung von \IfArgIsEmpty die Achsenmarkierung optional ändern und sogar einen leeren Zahlenstrahl zeichnen:

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}

alt text

Permanenter link

beantwortet 02 Nov '16, 09:38

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

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
1

@Astrina: pgfplots ist eine Erweiterung von pkg/tikz. Also ist das eine Lösung in tikz. Du kannst das daran erkenne, dass ebenfalls tikzpicture verwendet wird. Wenn du sie nachbauen willst, landest Du irgendwann beim Nachbau von pgfplots.

(04 Nov '16, 21:17) saputello
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×730
×3
×1

gestellte Frage: 01 Nov '16, 22:16

Frage wurde gesehen: 7,078 Mal

zuletzt geändert: 05 Nov '16, 13:42