Erstellen einer wiederverwendbaren Tikz-Diagrammvorlage

Erstellen einer wiederverwendbaren Tikz-Diagrammvorlage

Ich erstelle häufig Diagramme für meine Kurse und stelle fest, dass ich ständig Code kopiere und einfüge. Ich möchte das Ganze beschleunigen. Ich verwende meine eigene .clsDatei für meinen Code. Vielleicht könnte ich einige dieser häufig verwendeten Einstellungen dort speichern?

Hier ist meinaktuellCode für ein typisches Diagramm:

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[scale=.9]
  \def \xmin {-3}
  \def \xmax {3}
  \def \ymin {-2}
  \def \ymax {3}
  \draw[help lines] (\xmin, \ymin) grid (\xmax, \ymax);
  \draw [<->] (\xmin-.3,0) -- (\xmax+.3,0);
  \draw [<->] (0,\ymin-.3) -- (0,\ymax+.3);
  \node at (0,\ymax + .6) {$g(x)$};
  \node at (\xmax + .6,0) {$x$};
  \node at (-2, 1.5) {$y = g(x)$};
  \draw[domain=-1.828:1, blue, very thick, smooth] plot
    ({\x}, {-0.5*(\x-1)^2 + 2});
  \draw[domain=1:2.732, blue, very thick, smooth] plot
      ({\x}, {-1*(\x-1)^2 + 1});
  \draw[very thick, blue, fill] (1,1) circle [radius=.08];
  \draw[very thick, blue, fill=white] (1,2) circle [radius = .08];
  \foreach \x in {1} \draw (0,\x)node[right]{\x};
  \foreach \x in {1} \draw (\x,0)node[below]{\x};
\end{tikzpicture}
\end{document}

Dinge, die sich wiederholen:

  1. Die Linienarten sind immer „sehr dick, blau“
  2. Ich zeichne immer Hilfslinien, die durch die oben genannten Werte angegeben sind.
  3. Kreise (weiß oder blau gefüllt) sind üblich
  4. Die letzten beiden Befehle verwende ich zum Hinzufügen von Beschriftungen.

Manche Dinge lassen sich nicht gut skalieren. Wenn ich den Maßstab beispielsweise auf 0,5 einstelle, sehen die Pfeile nicht richtig aus und der Text bewegt sich. Ich frage mich, ob ich die Position der Pfeile und die Beschriftungen auf den Achsen basierend auf dem Skalierungsfaktor ändern kann.

Wenn Sie dazu irgendwelche Gedanken haben, wäre ich Ihnen sehr dankbar. Ich glaube, ich bin sowohl bei Tikz- als auch bei Klassendateien überfordert.

So sieht das Endergebnis im Allgemeinen aus

Antwort1

Sie können \tikzsetund verwenden, \newcommandum den allgemeinen Code zu erstellen, der in Ihre .clsDatei eingefügt werden soll.

Ich habe beispielsweise Folgendes erstellt:

  • ein myblueStil, den Sie anstelle von „sehr dick, blau“ verwenden können
  • ein myhelpBefehl für die Hilfslinien
  • a whitepointund bluepoint pics für die Kreise (weiß oder blau ausgefüllt, Sie können auch ein Unikat picmit einem Parameter erstellen, um die Farboption zu übergeben)
  • ein mylabelsBefehl zum Hinzufügen der Beschriftungen.

Um zu erfahren, wie man sie verwendet, sehen Sie sich den Code an:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric,shapes.symbols,positioning,decorations.pathmorphing}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% you may put a code like this in your .cls file
\tikzset{%
    myblue/.style={blue, very thick},
    pics/bluepoint/.style={code={%          
        \draw[very thick, blue, fill] (0,0) circle [radius=.08];
    }},
    pics/whitepoint/.style={code={%         
        \draw[very thick, blue, fill=white] (0,0) circle [radius = .08];
    }},
    }
\newcommand{\myhelp}{\draw[help lines] (\xmin, \ymin) grid (\xmax, \ymax);}
\newcommand{\mylabels}{%
    \foreach \x in {1} \draw (0,\x)node[right]{\x};
    \foreach \x in {1} \draw (\x,0)node[below]{\x};}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}
\begin{tikzpicture}[scale=.9]
  \def \xmin {-3}
  \def \xmax {3}
  \def \ymin {-2}
  \def \ymax {3}
  \myhelp  
  \draw [<->] (\xmin-.3,0) -- (\xmax+.3,0);
  \draw [<->] (0,\ymin-.3) -- (0,\ymax+.3);
  \node at (0,\ymax + .6) {$g(x)$};
  \node at (\xmax + .6,0) {$x$};
  \node at (-2, 1.5) {$y = g(x)$};
  \draw[domain=-1.828:1, myblue, smooth] plot
    ({\x}, {-0.5*(\x-1)^2 + 2});
  \draw[domain=1:2.732, myblue, smooth] plot
      ({\x}, {-1*(\x-1)^2 + 1});
  \pic at (1,1) {bluepoint};
  \pic at (1,2) {whitepoint};
  \mylabels
\end{tikzpicture}
\end{document}

Natürlich ist die Ausgabe genau dieselbe:

Bildbeschreibung hier eingeben

Falls es nützlich sein könnte, ist dies die Version mit einer parametrischen Option für die Farbe der Pfeilspitze, mit bluefolgendem Standard:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric,shapes.symbols,positioning,decorations.pathmorphing}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% you may put a code like this in your .cls file
\tikzset{%
    myblue/.style={blue, very thick},
    pics/mypoint/.style={code={%          
            \draw[very thick, blue, fill=#1] (0,0) circle [radius=.08];
    }},
    pics/mypoint/.default=blue
}
\newcommand{\myhelp}{\draw[help lines] (\xmin, \ymin) grid (\xmax, \ymax);}
\newcommand{\mylabels}{%
    \foreach \x in {1} \draw (0,\x)node[right]{\x};
    \foreach \x in {1} \draw (\x,0)node[below]{\x};}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}
    \begin{tikzpicture}[scale=.9]
    \def \xmin {-3}
    \def \xmax {3}
    \def \ymin {-2}
    \def \ymax {3}
    \myhelp  
    \draw [<->] (\xmin-.3,0) -- (\xmax+.3,0);
    \draw [<->] (0,\ymin-.3) -- (0,\ymax+.3);
    \node at (0,\ymax + .6) {$g(x)$};
    \node at (\xmax + .6,0) {$x$};
    \node at (-2, 1.5) {$y = g(x)$};
    \draw[domain=-1.828:1, myblue, smooth] plot
    ({\x}, {-0.5*(\x-1)^2 + 2});
    \draw[domain=1:2.732, myblue, smooth] plot
    ({\x}, {-1*(\x-1)^2 + 1});
    \pic at (1,1) {mypoint};
    \pic at (1,2) {mypoint=white};
    \mylabels
    \end{tikzpicture}
\end{document}

Antwort2

Ein Ansatz besteht darin, \pgfkeysverschiedene Standardeinstellungen für Ihre Diagramme zu speichern und dann alles in eine benutzerdefinierte Umgebung einzubinden, wobei neue Einstellungen über Schlüssel-Wert-Paare bereitgestellt werden. Beispielsweise der Code

\pgfkeys{/mygraph/.is family, /mygraph,
  xmin/.initial = -3, % defaults for xmin, xmax, ymin,ymax
  xmax/.initial =  3,
  ymin/.initial = -3,
  ymax/.initial =  3,
  ylabel/.initial = f(x),% default function name
  scale/.initial = 0.9,  % tikzpicture scale
  xtics/.initial = {1}, % list of marked coordinates on x-axis
  ytics/.initial = {1},  % list of marked coordinates on y-axis
}

legt die Anfangswerte (oder Standardwerte) für die maximalen und minimalen x- und y-Werte, die Beschriftung für die y-Achse und die Skala fest. Sie können dann eine Umgebung definieren, die beispielsweise ein optionales Argument annimmt, das an via MyGraphübergeben wird, um diese Einstellungen zu ändern. Dies würde verwendet werden als\pgfkeys\pgfkeys{/mygraph, #1}

\begin{MyGraph}[ylabel=g(x)]
    \draw[domain=-1.828:1, smooth,-{Circle[blue]}] plot ({\x}, {-0.5*(\x-1)^2 + 2});
    \draw[domain=1:2.732, smooth, {Circle[open, fill=white]}-] plot ({\x}, {-1*(\x-1)^2 + 1});
\end{MyGraph}

Dadurch wird das Diagramm in der Frage gezeichnet! Beachten Sie insbesondere, dass \usetikzlibrary{arrows.meta}kreisförmige „Pfeilspitzen“ bereitgestellt werden. Im Allgemeinen MyGraphist der „Inhalt“ der Umgebung das Material, das für Ihr Diagramm spezifisch ist.

Die MyGraphUmgebung würde die tikzpictureUmgebung öffnen und den „Anfangscode“ zeichnen. Hier ist eine mögliche Definition:

\newenvironment{Mygraph}[1][]%
   {\pgfkeys{/mygraph, #1}% process settings
    \begin{tikzpicture}[scale=\Gval{scale},
                        draw/.append style={very thick, blue}]
      \draw[help lines](\Gval{xmin},\Gval{ymin}) grid (\Gval{xmax},\Gval{ymax});
      \draw[thin, black] [<->] (\Gval{xmin}-0.3,0) -- (\Gval{xmax}+0.3,0);
      \draw[thin, black] [<->] (0,\Gval{ymin}-0.3) -- (0,\Gval{ymax}+0.3);
      \node at (0,\Gval{ymax} + .6) {$\Gval{ylabel}$};
      \node at (\Gval{xmax} + .6,0) {$x$};
      \node at (-2, 1.5) {$y = \Gval{ylabel}$};
    }
    {\end{tikzpicture}}

(Das \GvalMakro, das eine Abkürzung zu ist \pgfkeysvalueof{/mygraph/#1}, extrahiert den Wert des entsprechenden Schlüssels.)

Beachten Sie das draw/.append style={very thick, blue}am Anfang der tikzpictureUmgebung: Dadurch werden dicke blaue Linien als Standard für den \drawBefehl festgelegt. Diese Vorgehensweise hat einen kleinen Nachteil, da nun \draw[black]....Beschriftungen für die x- und y-Achse geschrieben werden müssen. Eine andere Möglichkeit besteht darin, \tikzseteinen Stil zu definieren:

\tikzset{% define styles for commonly used elements
  myline/.style={very thick, blue}
}

Danach verwenden Sie, \draw[myline]...wenn Sie dicke blaue Linien möchten. Die Verwendung \tikzsetist expliziter und daher wahrscheinlich besser, aber wenn Sie möchten, dass „fast alle“ Zeichenbefehle dicke blaue Linien erzeugen, sparen Sie hiermit einige Tipparbeit.

Hier ist ein vollständiges MWE, das die MyGraphUmgebung verwendet, um zwei „verschiedene“ Diagramme zu zeichnen:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}

% Using pgfkeys makes it easier to use key-value settings for the graph
\pgfkeys{/mygraph/.is family, /mygraph,
  xmin/.initial = -3,    % defaults for xmin, xmax, ymin,ymax
  xmax/.initial =  3,
  ymin/.initial = -3,
  ymax/.initial =  3,
  ylabel/.initial = f(x),% default function name
  scale/.initial = 0.9,  % tikzpicture scale
  xtics/.initial = {1},  % list of marked coordinates on x-axis
  ytics/.initial = {1},   % list of marked coordinates on y-axis
}

% shortcut to access values of /mygraph
\newcommand\Gval[1]{\pgfkeysvalueof{/mygraph/#1}}

% graph environment with optional argument for changing defaults
\newenvironment{Mygraph}[1][]%
   {\pgfkeys{/mygraph, #1}% process settings
    \begin{tikzpicture}[scale=\Gval{scale},
                        draw/.append style={very thick, blue}]
      \draw[help lines](\Gval{xmin},\Gval{ymin}) grid (\Gval{xmax},\Gval{ymax});
      \draw[thin, black] [<->] (\Gval{xmin}-0.3,0) -- (\Gval{xmax}+0.3,0);
      \draw[thin, black] [<->] (0,\Gval{ymin}-0.3) -- (0,\Gval{ymax}+0.3);
      \node at (0,\Gval{ymax} + .6) {$\Gval{ylabel}$};
      \node at (\Gval{xmax} + .6,0) {$x$};
      \node at (-2, 1.5) {$y = \Gval{ylabel}$};
      \xdef\xtics{\Gval{xtics}}% for reasons unknown can't use this directly
      \foreach \x in \xtics { \draw[black](\x,0)node[below]{\small$\x$}; }
      \xdef\ytics{\Gval{ytics}}
      \foreach \y in \ytics { \draw[black](0,\y)node[left]{\small$\y$}; }
    }
    {\end{tikzpicture}}

\begin{document}

  \begin{Mygraph}
    \draw[domain=-1.828:1, smooth,-{Circle[blue]}] plot ({\x}, {-0.5*(\x-1)^2 + 2});
    \draw[domain=1:2.732, smooth, -{Circle[open, fill=white]}] plot ({\x}, {-1*(\x-1)^2 + 1});
  \end{Mygraph}

  \begin{Mygraph}[ylabel=g(x), xmin=-4, xmax=4, scale=0.5, xtics={1,2,3}, ytics={1,3}]
    \draw[domain=-1.828:1, smooth,-{Circle[blue]}] plot ({\x}, {-0.5*(\x-1)^2 + 2});
    \draw[domain=1:2.732, smooth, {Circle[open,fill=white]}-] plot ({\x}, {-1*(\x-1)^2 + 1});
  \end{Mygraph}

\end{document}

Hier ist die Ausgabe:

Bildbeschreibung hier eingeben

Sie können natürlich weitere Einstellungen hinzufügen, um \pgfkeys{/mygraph/,...}Ihre Diagramme weiter anzupassen. Sie möchten dies beispielsweise wahrscheinlich für die beschrifteten x- und y-Werte auf den Achsen und die Platzierung der y=g(x)Beschriftung usw. tun. Es gibt auch viele andere Dinge, die Sie tun können \pgfkeys- siehe dietikzWeitere Informationen finden Sie im Handbuch.

Antwort3

Die obigen Antworten von @andrew und @CarLaTeX sind konstruktiv und lehrreich. Ich habe Teile ihrer beiden Antworten übernommen, um den folgenden Code zu erstellen.

In meiner Klassendatei habe ichhinzugefügtFolgendes zu einer bereits beträchtlichen Menge an (unabhängigem) Code. Ich möchte hier nicht das Ganze posten, daher sind die relevanten Teile:

% This is the setup for the wcgraph environment below
\tikzset{%
    myblue/.style={blue, very thick},
    pics/closed/.style={code={%
            \draw[very thick, blue, fill] (0,0) circle [radius=.08];
    }},
    pics/open/.style={code={%
            \draw[very thick, blue, fill=white] (0,0) circle [radius=.08];
    }},
    pics/mypoint/.default=blue,
    draw/.append style={very thick, blue},
    >=latex,
    >=stealth,
}

% This is the setup for the wcgraph environment below
\pgfkeys{/mygraph/.is family, /mygraph,
  xmin/.initial = -3,         % defaults for xmin, xmax, ymin,ymax
  xmax/.initial =  3,
  ymin/.initial = -3,
  ymax/.initial =  3,
  ylabel/.initial = f(x),     % default function name
  xlabel/.initial = x,        % default independent variable
  scale/.initial = 0.9,       % tikzpicture scale
  xtics/.initial = {1},       % list of marked coordinates on x-axis
  ytics/.initial = {1},       % list of marked coordinates on y-axis
  xticsloc/.initial = below,  % default location for tick labels
  yticsloc/.initial = left,
  helplines/.initial = draw,  % Default to draw the help lines
}

% A new command to grab values from pgfkeys above
\newcommand\getVal[1]{\pgfkeysvalueof{/mygraph/#1}}

% A command to draw helplines. To not draw them, pass the option "hide"
\newcommand{\helplines}[1]{
  \ifthenelse{\equal{#1}{draw}}{
    \draw[help lines] (\getVal{xmin},\getVal{ymin}) grid (\getVal{xmax},\getVal{ymax});
  }{}
}

% The graph environment with optional arguments for changing defaults
\newenvironment{wcgraph}[1][]%
   {\pgfkeys{/mygraph, #1}% process settings
    \begin{tikzpicture}[scale=\getVal{scale}]
      \helplines{\getVal{helplines}}
      \draw[thin, black] [->] (\getVal{xmin}-0.3,0) -- (\getVal{xmax}+0.3,0);
      \draw[thin, black] [->] (0,\getVal{ymin}-0.3) -- (0,\getVal{ymax}+0.3);
      \node at (0,\getVal{ymax} + .6) {$\getVal{ylabel}$};
      \node at (\getVal{xmax} + .6,0) {$\getVal{xlabel}$};
      \xdef\xtics{\getVal{xtics}} % Can't use this directly for some reason
      \foreach \x in \xtics {
        \draw[black](\x,0)node[\getVal{xticsloc}]{\small$\x$};
      }
      \foreach \x in {\getVal{xmin},...,\getVal{xmax}}{
        \draw[black, thin, shift={(\x,0)}] (0pt,1pt) -- (0pt,-1pt);
      }
      \xdef\ytics{\getVal{ytics}}
      \foreach \y in \ytics {
        \draw[black](0,\y)node[left]{\small$\y$};
      }
      \foreach \y in {\getVal{ymin},...,\getVal{ymax}}{
        \draw[black, thin, shift={(0,\y)}] (1pt,0pt) -- (-1pt,0pt);
      }
    }
    {\end{tikzpicture}}

In meiner .texDatei verwende ich die worksheet.clsKlasse, die (wie oben erwähnt) viele andere Dinge enthält als das, was ich direkt darüber gepostet habe. Ein MWE ist:

\documentclass{worksheet}

\begin{document}

  \begin{wcgraph}[xmin=-2, ymin=-2]
    \draw[domain=-1.828:1, smooth] plot ({\x}, {-0.5*(\x-1)^2 + 2});
    \draw[domain=1:2.732, smooth] plot ({\x}, {-1*(\x-1)^2 + 1});
    \pic at (1,2) {open};
    \pic at (1,1) {closed};
  \end{wcgraph}

  \begin{wcgraph}[helplines=hide, xmin=-2, ymin=-2, scale=1.8]
    \draw[domain=-1.828:1, smooth] plot ({\x}, {-0.5*(\x-1)^2 + 2});
    \draw[domain=1:2.732, smooth] plot ({\x}, {-1*(\x-1)^2 + 1});
    \pic at (1,2) {open};
    \pic at (1,1) {closed};
  \end{wcgraph}

\end{document}

Dadurch werden die folgenden Grafiken erstellt:

Zwei Grafiken

Vielleicht ist dies nicht der richtige Ort, um eine Folgefrage zu stellen (und ich werde dies gerne bearbeiten und eine weitere Frage stellen, wenn jemand das vorschlägt), aber ich würde die Dinge gerne etwas erweitern. Ich glaube, dies ist für die ursprüngliche Frage sehr relevant, daher die Folgefrage. Ich möchte einen Befehl hinzufügen, um alle benötigten „offenen“ Knoten durch Angabe von Koordinaten zu zeichnen. Ich habe Probleme, im neuen Befehl eine „Liste“ von Koordinaten zu übergeben. Ich möchte \foreachon verwenden #1, das Argument meines neuen Befehls. Dies funktioniert nicht wie erwartet und wird nicht als Koordinaten analysiert. Ich habe den PGF-Leitfaden und viele Beiträge zu gelesen, \foreachohne Erfolg.

Um das oben Gesagte grafisch darzustellen, möchte ich den folgenden Code verwenden:

  \begin{wcgraph}[helplines=hide, xmin=-2, ymin=-2, scale=1.8]
    \draw[domain=-1.828:1, smooth] plot ({\x}, {-0.5*(\x-1)^2 + 2});
    \draw[domain=1:2.732, smooth] plot ({\x}, {-1*(\x-1)^2 + 1});
    \openpics{(1,2)};
    \closedpics{(1,1)};
  \end{wcgraph}

was ein großer Vorteil wäre, wenn ich komplexere Grafiken hätte.

Meine beste Vermutung zu diesem neuen Befehl (der meiner Datei hinzugefügt werden soll .cls):

% A new command to draw all open pics I need.
\newcommand{\openpics}[1]{
  \foreach \coord in {#1}{
    \pic at \coord {open};
  }
}

Und der \closedpicsBefehl wäre ähnlich.

Antwort4

Möglicherweise möchten Sie das pgfplotsPaket für Ihren Zweck in Betracht ziehen. Es folgt ein vollständiges Beispiel.

Bildbeschreibung hier eingeben

% arara: pdflatex
\documentclass{standalone}
\usepackage{pgfplots}

\pgfplotsset{every axis/.append style={
                    axis x line=middle,
                    axis y line=middle,
                    axis line style={<->},
                    xlabel={$x$},
                    ylabel={$y$},
                    line width=1pt,},
                    % line style
                    gnatplot/.style={color=blue,mark=none},
                    soldot/.style={color=blue,only marks,mark=*},
                    holdot/.style={color=blue,fill=white,only marks,mark=*},
                    }

% arrows
\tikzset{>=stealth}

\begin{document}
\begin{tikzpicture}
    \begin{axis}[
            xmin=-3,xmax=3,
            ymin=-2,ymax=3,
            grid=both,
        ]
        \addplot[gnatplot,domain=-1.828:1]{-0.5*(x-1)^2 + 2};
        \addplot[gnatplot,domain=1:2.732]{-1*(x-1)^2 + 1};
        \addplot[soldot]coordinates{(1,1)};
        \addplot[holdot]coordinates{(1,2)};
    \end{axis}
\end{tikzpicture}
\end{document}

verwandte Informationen