
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 .cls
Datei 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:
- Die Linienarten sind immer „sehr dick, blau“
- Ich zeichne immer Hilfslinien, die durch die oben genannten Werte angegeben sind.
- Kreise (weiß oder blau gefüllt) sind üblich
- 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.
Antwort1
Sie können \tikzset
und verwenden, \newcommand
um den allgemeinen Code zu erstellen, der in Ihre .cls
Datei eingefügt werden soll.
Ich habe beispielsweise Folgendes erstellt:
- ein
myblue
Stil, den Sie anstelle von „sehr dick, blau“ verwenden können - ein
myhelp
Befehl für die Hilfslinien - a
whitepoint
undbluepoint
pic
s für die Kreise (weiß oder blau ausgefüllt, Sie können auch ein Unikatpic
mit einem Parameter erstellen, um die Farboption zu übergeben) - ein
mylabels
Befehl 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:
Falls es nützlich sein könnte, ist dies die Version mit einer parametrischen Option für die Farbe der Pfeilspitze, mit blue
folgendem 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, \pgfkeys
verschiedene 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 MyGraph
ist der „Inhalt“ der Umgebung das Material, das für Ihr Diagramm spezifisch ist.
Die MyGraph
Umgebung würde die tikzpicture
Umgebung ö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 \Gval
Makro, 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 tikzpicture
Umgebung: Dadurch werden dicke blaue Linien als Standard für den \draw
Befehl 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,
\tikzset
einen 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 \tikzset
ist 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 MyGraph
Umgebung 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:
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 .tex
Datei verwende ich die worksheet.cls
Klasse, 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:
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 \foreach
on 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, \foreach
ohne 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 \closedpics
Befehl wäre ähnlich.
Antwort4
Möglicherweise möchten Sie das pgfplots
Paket für Ihren Zweck in Betracht ziehen. Es folgt ein vollständiges Beispiel.
% 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}