TikZ: Wie kann ich meinen Code prägnanter schreiben?

TikZ: Wie kann ich meinen Code prägnanter schreiben?

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:

Bildbeschreibung hier eingeben

… 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 anglesund 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 angleohnehin 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}

Bildbeschreibung hier eingeben

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}

Endergebnis

verwandte Informationen