TikZ: ¿Cómo puedo escribir mi código de manera más concisa?

TikZ: ¿Cómo puedo escribir mi código de manera más concisa?

Estoy aprendiendo a usar TikZ y quiero aprender formas de escribir código TikZ más conciso. Siento que uso muchas más líneas de las que otros pueden necesitar para lograr los mismos resultados. En particular, quiero aprender una técnica o práctica para escribir código conciso que pueda usar para todos mis documentos TikZ.

Como ejemplo, considere esta imagen:

ingrese la descripción de la imagen aquí

… que se creó con el siguiente código (el espacio se proporciona para facilitar la lectura). Tenga en cuenta que es posible que deba actualizar TikZ y pgf para ejecutar este código, ya que las bibliotecas anglesy quotesson relativamente nuevas en mayo de 2014.


\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}

Respuesta1

Algunos acortamientos sin la flecha del ángulo. Pero eso se puede hacer con anglela biblioteca de todos modos. Es posible cambiar el ángulo.

\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}

ingrese la descripción de la imagen aquí

Respuesta2

Esto es más conciso (y no menos legible que la mayoría de los códigos tikz :-)

\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}

Respuesta3

Todavía es demasiado corto en una animación.

\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}

Resultado final

información relacionada