
Ich lerne gerade, wie man TikZ benutzt, und möchte lernen, wie man prägnanteren TikZ-Code schreibt. Ich habe das Gefühl, dass ich viel mehr Zeilen verwende, als andere brauchen, um dieselben Ergebnisse zu erzielen. Insbesondere möchte ich eine Technik oder Übung zum Schreiben von prägnantem Code lernen, die ich für alle meine TikZ-Dokumente verwenden kann.
Betrachten Sie als Beispiel dieses Bild:
… das mit dem untenstehenden Code erstellt wurde (die Leerzeichen dienen der Lesbarkeit). Beachten Sie, dass Sie möglicherweise TikZ und pgf aktualisieren müssen, um diesen Code auszuführen, da die angles
und quotes
-Bibliotheken seit Mai 2014 relativ neu sind.
\documentclass[tikz]{standalone}%
\usetikzlibrary{calc}
\usetikzlibrary{intersections}
\usetikzlibrary{angles}
\usetikzlibrary{quotes}
\begin{document}
\begin{tikzpicture}
\coordinate (A) at (0, 0);
\coordinate (B) at (3, 0);
\coordinate (C) at (3, 2);
\draw[name path = tri] (A) -- (B) -- (C) -- cycle pic["$\alpha$", -stealth,
draw, angle radius = 1cm, angle eccentricity = 1.25] {angle = B--A--C};
\path[name path = line] (0, 1.4) -- +(2.9, 0);
\path[name intersections = {of = line and tri, by = P1}];
\path (P1) -- ($(P1)!.25cm!-90:(A)$) coordinate (cylinder);
\path[name path = line2] (cylinder) -- +(1.05, 0);
\path[name intersections = {of = line2 and tri}];
\draw (cylinder) circle[radius = 0.25cm];
\draw[dashed, gray] (cylinder) -- (intersection-1);
\draw[stealth-stealth] (3.15, 2) -- ($(intersection-1) + (.15, 0)$);
\draw (3.1, 2) -- (3.2, 2);
\draw ($(intersection-1) + (.1, 0)$) -- +(.1, 0);
\draw (cylinder) -- +(45:.25);
\pgfmathsetmacro{\angle}{atan(2/3)};
\pgfmathsetmacro{\ppi}{\angle + 180}
\begin{scope}[rotate = \angle]
\clip ($(cylinder) + (0, .4)$) rectangle ($(cylinder) + (-.4, 0)$);
\draw[name path global = rotation] (cylinder) circle[radius = .395cm];
\end{scope}
\path[name path = line3] (cylinder) -- +(\ppi:.4);
\path[name intersections = {of = line3 and rotation, by = P2}];
\end{tikzpicture}
\end{document}
Antwort1
Einige Kürzungen ohne Winkelpfeil. Aber das geht angle
ohnehin mit der Bibliothek. Eine Winkeländerung ist möglich.
\documentclass[tikz]{standalone}%
\begin{document}
\begin{tikzpicture}
\def\myang{35}
\draw (0,0) coordinate(o) --+(\myang:1cm) +(1,0)arc (0:\myang:1cm)
node[right,midway]{$\alpha$}--(\myang:3cm) coordinate (a)
node[minimum size=5mm,circle,draw,pos=0.4,anchor={-90+\myang}] (b) {}--(o-|a)
(b.center)--(b.\myang) (b.210)++(210:1mm) arc (210:120:3.5mm);
\draw[dashed] (b.center) -- (a|-b);
\draw[>=latex,|<->|] ([xshift=2mm]a|-b) -- ([xshift=2mm]a);
\end{tikzpicture}
\end{document}
Antwort2
Dies ist prägnanter (und nicht weniger lesbar als der meiste Tikz-Code:-)
\documentclass[tikz]{standalone}\usetikzlibrary{calc,intersections,
angles,quotes}\def\c{\coordinate}\def\d{\draw}\def\p{\path}
\def\pp#1#2#3#4#5{\p[name path=#1](#2)--+(#3);\p[name intersections={of=#1
and #4,#5}];}\let\q\pgfmathsetmacro
\begin{document}\def\z#1#2#3#4#5#6#7#8{\begin{tikzpicture}
\c(A)at(0,0);\c(B)at(3,0);\c(C)at(3,2);\d[name path=#7](A#6(B#6(C#6cycle
pic["$\alpha$",-#3,draw,#1 #4=1cm,#1 eccen#7city=1.25]{#1=B--A--C};\pp
{#8}{0,1.4}{2.9,0}{#7}{by=P1}\p(P1#6($(P1)!.25cm!-90:(A)$)coordinate(#2);
\pp{#82}{#2}{1.05,0}{#7}{}\d(#2)circle[#4=0.25cm];\d[dashed,gray](#2#6(#5-1);
\d[#3-#3](3.15,2#6($(#5-1)+(.15,0)$);\d(3.1,2#6(3.2,2);\d($(#5-1)+(.1,0)$#6+
(.1,0);\d(#2#6+(45:.25);\q{\angle}{atan(2/3)};\q{\ppi}{\angle+180}\begin
{scope}[rotate=\angle]\clip($(#2)+(0,.4)$)rect#1($(#2)+(-.4,0)$);
\d[name path global=rotation](#2)circle[#4=.395cm];\end{scope}\pp{#83}{#2}
{\ppi:.4}{rotation}{by=P2}\end{tikzpicture}}\z{angle}{cylinder}{stealth}
{radius}{intersection}{)--}{tri}{line}\end{document}
Antwort3
Für eine Animation ist es immer noch zu kurz.
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-eucl}
\psset
{
CurveType=polygon,
PointName=none,
PointSymbol=none,
LabelSep=.5,
MarkAngleRadius=1,
}
\begin{document}
\multido{\n=3.14+.10}{50}{%
\begin{pspicture}(8,6)
\pstGeonode{A}(7,0){B}(7,6){C}
\pstMarkAngle[arrows=->]{B}{A}{C}{$\alpha$}
\pnode([offset=.5,nodesep=\n]{C}A){P}
\pscircle(P){.5}
\rput{(C)}(P){\psarc(P){.6}{90}{180}\psline(P)([nodesep=.5,angle={!\n\space 4 mul Pi add 2 div neg RadtoDeg}]P)}
\pcline[offset=.5]{|*-|*}(C)(C|P)
\pcline[linestyle=dashed,nodesepB=-.5](P)(C|P)
\end{pspicture}}
\end{document}