
Ich bin relativ neu bei TikZ (das ist bisher mein zweites TikZ-Bild :))
Es sieht ziemlich genau so aus, wie ich es mir vorstelle, aber ich denke, der Code könnte optimiert werden. Ich muss ziemlich viele ähnliche Spannungskurven zeichnen, daher wäre es nett, wenn Sie mir bei der Optimierung helfen könnten!
Bitte beachten: Die Differenz zwischen den Zeitangaben und der optischen Darstellung der Kurve ist beabsichtigt!
Danke!
\documentclass{article}
\usepackage{tikz}
\usepackage{verbatim}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{10pt}
\begin{document}
\begin{tikzpicture}
% horizontal axis
\draw[->] (0,0) -- (6.5,0) node (xaxis) [anchor=north] {t};
% vertical axis
\draw[->] (0,0) -- (0,2.5) node (yaxis) [anchor=east] {U};
% line
\draw[dotted] (1,0) coordinate (a) -- (1,1);
\draw[dotted] (2,0) -- (2,2)
(4,0) -- (4,2)
(5,0) -- (5,1)
(6,0) -- (6,1);
% labels time
\draw (0.5,1) node[anchor=north] {$t_0$}
(1.5,1) node[anchor=north] {$t_r$}
(3,1) node[anchor=north] {$t_1$}
(4.5,1) node[anchor=north] {$t_f$}
(5.5,1) node[anchor=north] {$t_2$};
%labels timestep
\draw (0,0) node[anchor=north] {0}
(1,0) node[anchor=north] {1}
(2,0) node[anchor=north] {4}
(4,0) node[anchor=north] {10}
(5,0) node[anchor=north] {11}
(6,0) node[anchor=north] {13};
%labels voltage
\draw (-0.5,1) node {$U_1$}
(-0.5,2) node {$U_2$};
% Us
\draw[thick] (0,1) -- (1,1) -- (2,2) -- (4,2) -- (5,1) -- (6,1);
%\draw[thick] (6,1) sin (7,0) cos (8,1);
\end{tikzpicture}
\end{document}
Antwort1
Vielleicht hilft der folgende Code. Er reduziert die gesamte Spannungslinienzeichnung auf eine foreach
Schleife, in der jedes Element aus vier Werten besteht x coordinate/y coordinate/time label/segment label
. Die Koordinaten der Anfangspunkte sindverstecktInnenparameter initially
.
\documentclass[tikz,border=10pt]{standalone}
\begin{document}
\begin{tikzpicture}
% horizontal axis
\draw[->] (0,0) -- (6.5,0) node (xaxis) [anchor=north] {t};
% vertical axis
\draw[->] (0,0) node[below]{0} -- (0,2.5) node (yaxis) [anchor=east] {U};
\foreach \x/\y/\t/\l [remember=\x as \lastx (initially 0),
remember=\y as \lasty (initially 1)] in
{1/1/1/$t_0$,2/2/4/$t_r$,4/2/10/$t_1$,5/1/11/$t_f$,6/1/13/$t_2$}{
% voltage line
\draw (\lastx,\lasty)--(\x,\y);
% vertical reference
\draw[dotted] (\x,\y)--(\x,0) node[below] {\t};
% time label
\path (\lastx,1)--node[below] {\l} (\x,1);
}
\path (0,1) node[left] {$U_1$};
\path (0,2) node[left] {$U_2$};
\end{tikzpicture}
\end{document}
Antwort2
Ich bin mir nicht ganz sicher, wie eine Spannungskurve im Allgemeinen aussieht, aber es scheint, dass Sie einige (t,U)
-Koordinaten, Beschriftungen für die t
-Achse und die Indizes für die Regionen angeben müssen. Ich würde eine Schleife verwenden \foreach
und alles in ein Makro werfen, das die Anfangsspannung und eine durch Kommas getrennte Liste der „Koordinaten“ für die Spannungskurve akzeptiert, wie folgt:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{verbatim}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{10pt}
% \VoltageCurve[#1]{#2}
% #1 = optional initial voltage (default 1)
% #2 = comma separated list of t/U/t-label/t-subscript
\newcommand\VoltageCurve[2][1]{%
\begin{tikzpicture}
\draw (0,0) node[anchor=north] {0};
\def\Umax{#1}
\foreach \t/\U/\tlab/\tsub [remember=\t as \tt (initially 0),
remember=\U as \UU (initially #1)] in {#2} {
\draw (\t,0) node[anchor=north] {\tlab};
\draw[dotted](\t,0)--(\t,\U);
\draw[thick](\tt,\UU)--(\t,\U);
\node[anchor=north] at ($ (\tt,1)!0.5!(\t,1) $) {$t_\tsub$};
\ifnum\U>\Umax\xdef\Umax{\U}\fi% Umax = max{y}
}
% axes
\draw[thin,->] (0,0) -- (\tt+0.5,0) node [anchor=north] {t};
\draw[thin,->] (0,0) -- (0,\Umax+0.5) node[anchor=east] {U};
% labels
\node at (-0.5, #1) {$U_1$};
\node at (-0.5, \Umax) {$U_2$};
\end{tikzpicture}%
}
\begin{document}
\VoltageCurve{1/1/1/0, 2/2/4/r, 4/2/10/1, 5/1/11/f, 6/1/13/2}
\VoltageCurve[2]{1/1/1/0, 2/2/4/r, 5/3/10/1, 7/1/11/f, 8/3/13/2, 9/1/16/z}
\end{document}
Hier ist die Ausgabe meines MWE:
Ein paar erklärende Worte:
- die (Vorwärts-)Schrägstriche trennen die Variablen in der
\foreach
Schleife - Die Variablen
\tt
und\UU
„merken“ sich die vorherigen Werte von\t
bzw.\U
\Umax
merkt sich den Maximalwert\U
für das Zeichnen der\U
Achse- Die
\t
Koordinaten werden als zunehmend angenommen - das optionale erste Argument gibt die Anfangsspannung an (Standard 1)
- Das erste
\t
-Label wird als0
- um das
t_<sub>
Etikett, das ich\usetikzlibrary{calc}
zur Bestimmung des Punktes verwende, auf halbem Weg zwischen\tt
undt
zu platzieren($ (\tt,1)!0.5!(\t,1) $)
. Es wäre vielleicht besser, die Höhe dieser Etiketten auf die Anfangsspannung einzustellen, indem man dies durch ersetzt($ (\tt,#1)!0.5!(\t,#1) $)
.