我正在学习如何使用 TikZ,并希望学习如何编写更简洁的 TikZ 代码。我觉得我使用的行数比其他人可能需要的要多得多,才能达到相同的结果。特别是,我想学习一种编写简洁代码的技巧或做法,以便我可以将其用于我的所有 TikZ 文档。
举例来说,请考虑以下图像:
... 这是使用以下代码创建的(提供间距是为了便于阅读)。请注意,您可能需要更新 TikZ 和 pgf 才能运行此代码,因为截至 2014 年 5 月,angles
和库都相对较新。quotes
\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}
答案1
有些缩短没有角度箭头。但angle
无论如何都可以用库来完成。可以更改角度。
\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}
答案2
这更简洁(并且可读性不低于大多数 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}
答案3
对于动画来说它还是太短了。
\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}