TikZ: Como posso escrever meu código de forma mais concisa?

TikZ: Como posso escrever meu código de forma mais concisa?

Estou aprendendo como usar o TikZ e quero aprender maneiras de escrever um código TikZ mais conciso. Sinto que uso muito mais linhas do que outras pessoas precisam para obter os mesmos resultados. Em particular, quero aprender uma técnica ou prática para escrever código conciso que possa usar em todos os meus documentos TikZ.

Como exemplo, considere esta imagem:

insira a descrição da imagem aqui

… que foi criado com o código abaixo (o espaçamento é fornecido para facilitar a leitura). Observe que pode ser necessário atualizar o TikZ e o pgf para executar este código, já que as bibliotecas anglese quotessão relativamente novas em maio 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}

Responder1

Algum encurtamento sem a seta angular. Mas isso pode ser feito com anglea biblioteca de qualquer maneira. É possível alterar o â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}

insira a descrição da imagem aqui

Responder2

Isso é mais conciso (e não menos legível que a maioria dos 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}

Responder3

Ainda é muito curto em uma animação.

\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

informação relacionada