
Soy algo nuevo en TikZ (esta es mi segunda foto de TikZ hasta ahora :))
Se ve más o menos como quiero que se vea, pero supongo que el código podría optimizarse. Tengo que dibujar bastantes curvas de voltaje similares, así que sería bueno si pudieras ayudarme a optimizarlas.
Tenga en cuenta: ¡La diferencia entre los tics de tiempo y la apariencia visual de la curva es intencionada!
¡Gracias!
\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}
Respuesta1
Puede que el siguiente código ayude. Reduce todo el trazado de líneas de voltaje a un foreach
bucle donde cada elemento consta de cuatro valores x coordinate/y coordinate/time label/segment label
. Las coordenadas del punto inicial sonocultoparámetro interno 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}
Respuesta2
No estoy muy seguro de cómo se ve una curva de voltaje en general, pero parece que es necesario especificar algunas (t,U)
coordenadas, etiquetas para el t
eje y los subíndices para las regiones. Usaría un \foreach
bucle y arrojaría todo en una macro que acepte el voltaje inicial y una lista separada por comas de las "coordenadas" para la curva de voltaje como esta:
\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}
Aquí está el resultado de mi MWE:
Algunas palabras de explicación:
- las barras diagonales separan las variables en el
\foreach
bucle - las variables
\tt
y\UU
"recuerdan" los valores anteriores de\t
y\U
, respectivamente \Umax
recuerda el valor máximo de\U
para dibujar el\U
eje- Se supone que las
\t
coordenadas son crecientes. - el primer argumento opcional proporciona el voltaje inicial (predeterminado 1)
- se supone que la primera
\t
etiqueta es0
- para colocar la
t_<sub>
etiqueta utilizo\usetikzlibrary{calc}
para determinar el punto medio entre\tt
yt
usando($ (\tt,1)!0.5!(\t,1) $)
. Podría ser mejor establecer la altura de estas etiquetas al voltaje inicial reemplazándola con($ (\tt,#1)!0.5!(\t,#1) $)
.