summaryrefslogtreecommitdiff
path: root/Master
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2022-03-09 21:08:49 +0000
committerKarl Berry <karl@freefriends.org>2022-03-09 21:08:49 +0000
commitc113e0685a4fe0cc77ed6e4519f70bffe4d368d5 (patch)
tree0469dbe90e40ae70c447b9acd69938982d917931 /Master
parent46b43a5877ba706d0246b85af0942b58ead2d78f (diff)
liftarm (9mar22)
git-svn-id: svn://tug.org/texlive/trunk@62547 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rw-r--r--Master/texmf-dist/doc/latex/liftarm/README.md9
-rw-r--r--Master/texmf-dist/doc/latex/liftarm/liftarm.pdfbin0 -> 4095932 bytes
-rw-r--r--Master/texmf-dist/doc/latex/liftarm/liftarm.tex559
-rw-r--r--Master/texmf-dist/tex/latex/liftarm/liftarm.sty256
-rwxr-xr-xMaster/tlpkg/bin/tlpkg-ctan-check2
-rw-r--r--Master/tlpkg/tlpsrc/collection-pictures.tlpsrc1
-rw-r--r--Master/tlpkg/tlpsrc/liftarm.tlpsrc0
7 files changed, 826 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/latex/liftarm/README.md b/Master/texmf-dist/doc/latex/liftarm/README.md
new file mode 100644
index 00000000000..fc982a486fa
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/liftarm/README.md
@@ -0,0 +1,9 @@
+# liftarm
+
+Draw liftarms with TikZ
+
+(c) Matthias Floré
+
+This package is based on the package TikZ and can be used to draw liftarms with TikZ. It provides several options for the appearance of the liftarms, a command which connects two liftarms and an environment to describe a construction.
+
+This program can be redistributed and/or modified under the terms of the LaTeX Project Public License Distributed from CTAN archives on http://www.latex-project.org/lppl.txt. \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/liftarm/liftarm.pdf b/Master/texmf-dist/doc/latex/liftarm/liftarm.pdf
new file mode 100644
index 00000000000..73b4628baf4
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/liftarm/liftarm.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/liftarm/liftarm.tex b/Master/texmf-dist/doc/latex/liftarm/liftarm.tex
new file mode 100644
index 00000000000..8619b58f2d1
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/liftarm/liftarm.tex
@@ -0,0 +1,559 @@
+%Documentation for the liftarm package
+%Draw liftarms with TikZ
+%(c) Matthias Floré
+%This program can be redistributed and/or modified under the terms of the LaTeX Project Public License Distributed from CTAN archives on http://www.latex-project.org/lppl.txt.
+\documentclass[a4paper,english,dvipsnames]{ltxdoc}
+\usepackage[english]{babel}
+\usepackage{graphicx}
+\usepackage[a4paper,left=2.25cm,right=2.25cm,top=2.5cm,bottom=2.5cm,nohead]{geometry}
+\usepackage{parskip}
+\usepackage[T1]{fontenc}
+\usepackage[utf8]{inputenc}
+\usepackage{mathtools}
+\usepackage{amssymb}
+\allowdisplaybreaks
+\usepackage{multicol}
+\usepackage{animate}
+\usepackage{liftarm}
+\input{pgfmanual-en-macros.tex}
+\usepackage[page]{totalcount}
+\usepackage{fancyhdr}
+\pagestyle{fancy}
+\renewcommand{\headrulewidth}{0pt}
+\cfoot{\iftotalpages\begin{tikzpicture}\liftarm[mark holes=\thepage-1]{0,0}{\totalpages-2}{0}\end{tikzpicture}\fi}%\liftarm{0,0}{\thepage}{0}
+\fancyhead{}
+\usepackage{imakeidx}
+\makeindex[program=makeindex,columns=2,intoc=true]
+\indexsetup{othercode={\thispagestyle{fancy}}}
+\usepackage[linktoc=all,pdfstartview=FitH,colorlinks=true,linkcolor=Mahogany,citecolor=ForestGreen,urlcolor=MidnightBlue,bookmarksnumbered=true]{hyperref}
+\hypersetup{pdftitle={The liftarm package},pdfauthor={Matthias Flor\'e},pdfsubject={Manual},pdfkeywords={liftarm}}
+\setcounter{tocdepth}{2}
+\setcounter{secnumdepth}{2}
+\DeclareMathOperator{\atan}{atan}
+\title{The \texttt{liftarm} package\\[12pt]\large Draw liftarms with \tikzname}
+\author{Matthias Flor\'e}
+\date{2022-03-08}
+\begin{document}
+\maketitle
+\thispagestyle{fancy}
+\begin{abstract}
+\noindent This package is based on the package |tikz| (see \cite{TtTaPGFp}) and can be used to draw liftarms with \tikzname. It provides several options for the appearance of the liftarms, a command which connects two liftarms and an environment to describe a construction. This is the manual for version 1.0.
+\end{abstract}
+\tableofcontents
+\section{Usage}
+The package |liftarm| can be used by putting
+
+|\usepackage{liftarm}|
+
+in the preamble.
+
+The package |liftarm| loads the packages |etoolbox|, |xcolor| with the option |dvipsnames|, |tikz| and the \tikzname{} library |calc|. Since |xcolor| is loaded with the option |dvipsnames|, packages such as |pgfplots| and |tcolorbox| must be loaded \emph{after} |liftarm|.
+\section{Drawing liftarms}
+\begin{command}{\liftarm\opt{\oarg{options}}\marg{point}\marg{length}\marg{angle}}
+This command can be placed inside a |tikzpicture| environment. It draws a liftarm of \meta{length} starting at \meta{point}. The angle between the liftarm and the $x$-axis can be specified by \meta{angle} in degrees. The distance between the holes is $1$.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarm{1,2}{3}{20}
+\end{tikzpicture}
+\end{codeexample}
+Note that the number of holes is $\meta{length}+1$. The \meta{options} can be given with the following keys.
+\begin{key}{/liftarm/axle holes=\marg{values}}
+This key defines the holes in the liftarm where axle holes will be drawn.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarm[axle holes={0,4}]{0,1}{4}{0}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{key}{/liftarm/brick=\opt{\meta{boolean}} (default true, initially false)}
+If true, a brick will be drawn instead of a liftarm.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarm[brick]{0,1}{2}{0}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{key}{/liftarm/color=\marg{name}}
+This key defines the color of the liftarm. The color can also be specified without key.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarm[color=Green]{0,1}{4}{0}
+\liftarm[Blue]{0,2}{3}{0}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{key}{/liftarm/color 0=\marg{name} (initially Gray)}
+\end{key}
+\begin{key}{/liftarm/color 1=\marg{name} (initially darkgray)}
+\end{key}
+\begin{key}{/liftarm/color 2=\marg{name} (initially Yellow)}
+\end{key}
+\begin{key}{/liftarm/color 3=\marg{name} (initially Orange)}
+\end{key}
+\begin{key}{/liftarm/color 4=\marg{name} (initially Red)}
+\end{key}
+\begin{key}{/liftarm/color 5=\marg{name} (initially Green)}
+\end{key}
+\begin{key}{/liftarm/color 6=\marg{name} (initially Blue)}
+\end{key}
+\begin{key}{/liftarm/color 7=\marg{name} (initially Brown)}
+These keys define the colors of the liftarms which have as their length the number following |color|.
+\end{key}
+\begin{key}{/liftarm/color modulo=\marg{number} (initially 8)}
+The default colors of the liftarms are determined by computing the length of the liftarm modulo the value of this key and selecting the color from the previous keys.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}[scale=0.5]
+\foreach\n in {0,...,16}{
+ \liftarm{0,-\n}{\n}{0}
+}
+\end{tikzpicture}
+\end{codeexample}
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}[scale=0.5]
+\pgfkeys{
+ /liftarm,
+ color 0=Yellow,
+ color 1=Red,
+ color 2=Green,
+ color 3=Blue,
+ color modulo=4
+}
+\foreach\n in {0,...,8}{
+ \liftarm{0,-\n}{\n}{0}
+}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{key}{/liftarm/contour=\opt{\meta{boolean}} (default true, initially false)}
+If true, a contour will be drawn around the liftarm.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarm[contour]{0,1}{4}{0}
+\liftarm[brick,contour]{1,2}{2}{0}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{key}{/liftarm/coordinate=\marg{number 1/name 1}\dots}
+This key defines coordinates with name \meta{name i} at hole \meta{number i} of the liftarm.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarm[
+ coordinate={1/A,3/B}
+]{0,1}{6}{40}
+\liftarm{A}{3}{0}
+\liftarm{B}{2}{180}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{key}{/liftarm/hole radius=\marg{value} (initially 0.3)}
+The \meta{value} of this key, multiplied with the \meta{value} of the key |scalefactor| defines the radius of the holes.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarm[hole radius=0.1]{0,0}{5}{0}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{key}{/liftarm/liftarm thickness=\marg{value} (initially 0.92)}
+The \meta{value} of this key, multiplied with the \meta{value} of the key |scalefactor| defines the thickness of the liftarm.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarm[
+ hole radius=0.1,
+ liftarm thickness=0.3
+]{0,0}{5}{0}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{key}{/liftarm/mark color=\marg{name} (initially Black)}
+\end{key}
+\begin{key}{/liftarm/mark holes=\marg{values}}
+The key |mark holes| defines the holes in the liftarm which will be marked. The key |mark color| defines the color of these marks.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarm[
+ mark holes={0,1,3}
+]{0,0}{5}{0}
+\liftarm[
+ mark holes={1,2,4},
+ mark color=Blue
+]{0,1}{4}{0}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{key}{/liftarm/origin=\marg{number} (initially 0)}
+This key defines the number of the hole which will be placed at the coordinate given as argument to the liftarm.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarm{-2,0}{4}{0}
+\liftarm[origin=1]{0,0}{6}{30}
+\liftarm[origin=2]{0,0}{5}{60}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{key}{/liftarm/scalefactor=\marg{value} (initially 0.5)}
+The \meta{value} of this key defines the factor which scales the thickness of the liftarm and the radius of the holes.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarm[scalefactor=1]{0,0}{4}{0}
+\liftarm[brick,scalefactor=1]{1,2}{2}{0}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{key}{/liftarm/screw color=\marg{name} (initially Black)}
+\end{key}
+\begin{key}{/liftarm/screw holes=\marg{values}}
+\end{key}
+\begin{key}{/liftarm/screw holes angle=\marg{angle} (initially 45)}
+The key |screw holes| defines the holes in the liftarm where a screw will be drawn. The key |screw color| defines the color of these screws. The key |screw holes angle| defines the angle in degrees around which the screws are drawn.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarm[
+ screw holes={0,1,3}
+]{0,0}{5}{0}
+\liftarm[
+ screw holes={1,2,4},
+ screw color=Blue,
+ screw holes angle=0
+]{0,1}{4}{0}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\end{command}
+\section{Connecting liftarms}
+\begin{command}{\liftarmconnect\opt{\oarg{options}}\marg{point1}\marg{length1}\marg{point2}\marg{length2}}
+This command can be placed inside a |tikzpicture| environment. It draws a liftarm of \meta{length1} starting at \meta{point1} and a liftarm of \meta{length2} starting at \meta{point2} in such a way that their last holes have the same coordinate in case that such a point exists. If such a point does not exist then nothing is drawn. In case that there exist 2 such points then this point is chosen counterclockwise. In that case, the other configuration of the 2 liftarms can be obtained by simply swapping \marg{point1}\marg{length1} and \marg{point2}\marg{length2}. The keys for the command |\liftarm| can be given to the \meta{options}. In this case these keys will be passed to both liftarms.
+\begin{codeexample}[width=9cm]
+\begin{tikzpicture}
+\coordinate (A) at (0,0);
+\coordinate (B) at (4,2);
+\coordinate (C) at (1,-3);
+\coordinate (D) at (5,-1);
+\liftarmconnect[Yellow]{A}{2}{B}{3}
+\liftarmconnect[Red]{B}{3}{A}{2}
+\liftarmconnect[Green]{C}{3}{D}{2}
+\liftarmconnect[Blue]{D}{2}{C}{3}
+\foreach\coord in {A,B,C,D}{
+ \node at (\coord) {{\small $\coord$}};
+}
+\end{tikzpicture}
+\end{codeexample}
+Additionally, the \meta{options} can be given with the following keys.
+\begin{key}{/liftarm/connect coordinate=\marg{name}}
+This key defines a coordinate with name \meta{name} at the connection point of both liftarms.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarm{-3,0}{5}{0}
+\liftarmconnect[
+ connect coordinate=A
+]{2,0}{2}{-2,0}{3}
+\liftarm{A}{4}{180}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{key}{/liftarm/connect reverse=\opt{\meta{boolean}} (default true, initially false)}
+If true, the first liftarm of |\liftarmconnect| will be drawn second and the second liftarm will be drawn first. This option can be used to change the appearance at the connection point of both liftarms.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarmconnect{2,0}{1}{0,0}{2}
+\liftarmconnect[
+ connect reverse
+]{5,0}{1}{3,0}{2}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\begin{stylekey}{/liftarm/liftarm 1=\marg{options} (initially \normalfont empty)}
+\end{stylekey}
+\begin{stylekey}{/liftarm/liftarm 2=\marg{options} (initially \normalfont empty)}
+These keys accept a list of keys which will be applied to the first respectively second liftarm. These lists of keys accept the same options as the command |\liftarm|. Additionally, the key |connect| below can be given.
+\begin{key}{/liftarm/connect=\marg{number}}
+This key defines the number of the hole which will be connected to the matching liftarm. If this key is not given then the last hole of the liftarm is taken as the connecting point.
+\begin{codeexample}[width=10cm]
+\begin{tikzpicture}
+\liftarm{0,-7}{10}{90}
+\liftarmconnect[
+ connect coordinate=A,
+ liftarm 1={
+ origin=1,
+ connect=5
+ },
+ liftarm 2={
+ origin=2,
+ connect=6
+ }
+]{0,2}{6}{0,0}{7}
+\liftarmconnect[
+ liftarm 1={
+ origin=2,
+ connect=8
+ },
+ liftarm 2={
+ origin=1,
+ connect=5,
+ coordinate=4/B
+ }
+]{A}{9}{0,-6}{6}
+\liftarm[origin=1]{B}{4}{70}
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+\end{stylekey}
+\end{command}
+\section{Describing a construction}
+If a construction involves many liftarms then it is convenient to describe this construction in separate steps and |tikzpicture|s. Then the content of previous |tikzpicture|s would need to be copied in each new |tikzpicture|. This process can be automated by using the |liftarmconstruction| environment and the command |\liftarmconstruct| below.
+\begin{environment}{{liftarmconstruction}\opt{\oarg{options}}}
+This environment is in fact an |enumerate| environment with the addition that it resets the content of the |tikzpicture| which is displayed by the command |\liftarmconstruct| below. Thus in particular, |\item| can be used inside the |liftarmconstruction| environment. The \meta{options} will be passed to each |tikzpicture| drawn by the command |\liftarmconstruct| inside this environment. The following command can be used inside this environment.
+\begin{command}{\liftarmconstruct\opt{\oarg{options}}\marg{text}\marg{commands}}
+This command starts an |\item| and shows \meta{text}. Then it displays a |tikzpicture| containing \meta{commands} and also the \meta{commands} of previous |\liftarmconstruct| commands inside the same |liftarmconstruction| environment. The \meta{options} will be added to this |tikzpicture| but \emph{only} in the current step.
+
+As an example, we describe below the construction of a regular pentagon from \cite{Tmm1}.
+\begin{codeexample}[width=10cm]
+\begin{minipage}{0.5\linewidth}%only for
+%usage in this manual%\linewidth-6pt
+%\begin{multicols}{2}%only for
+%usage in this manual
+\begin{liftarmconstruction}[scale=0.75]
+\liftarmconstruct[
+ {\node[left,align=left]
+ at (-0.5,-1.3)
+ {Rectangular triangle.\\
+ This text is only\\
+ visible in this step.};}
+]{
+ We start with 3 liftarms to form
+ a rectangular triangle.
+}{
+\liftarm{-3,0}{4}{0}
+\liftarmconnect[
+ liftarm 1={
+ origin=2,
+ mark holes={2,6}
+ },
+ liftarm 2={
+ mark holes=0
+ }
+]{0,0}{6}{-3,0}{5}}
+\item An |\item| can be added since this
+ is an |enumerate| environment.
+\liftarmconstruct{
+ Now we add 2 liftarms of length $3$.
+}{\liftarmconnect[
+ connect coordinate=A,
+ liftarm 1={
+ mark holes={0,3}
+ },
+ liftarm 2={
+ mark holes=0
+ }
+]{0,-2}{3}{0,2}{3}}
+\liftarmconstruct{
+ In this step we construct the first
+ side of the regular pentagon.
+}{\liftarmconnect[
+ connect coordinate=B,
+ liftarm 2={
+ mark holes={0,2}
+ }
+]{A}{2}{1,0}{2}}
+\liftarmconstruct{
+ Now we finish the construction
+ of the regular pentagon.
+}{\liftarmconnect[
+ liftarm 2={
+ mark holes={0,2}
+ }
+]{B}{2}{-1,0}{2}
+\liftarmconnect[
+ liftarm 1={
+ mark holes=2
+ }
+]{-1,0}{2}{A}{2}}
+\end{liftarmconstruction}
+%\end{multicols}
+\end{minipage}
+\end{codeexample}
+\end{command}
+\end{environment}
+\section{Additional examples}
+The following example shows a regular hexagon.
+\begin{codeexample}[width=9cm]
+\begin{tikzpicture}
+\def\r{3}
+\foreach\n in {1,...,6}{
+ \liftarmconnect{0,0}{\r}{\n*60:\r}{\r}
+}
+\end{tikzpicture}
+\end{codeexample}
+The following example illustrates that $2\atan(\frac{1}{2})=\atan(\frac{4}{3})$.
+\begin{codeexample}[width=9cm]
+\begin{tikzpicture}
+\liftarm{0,0}{3}{0}
+\liftarm{0,0}{5}{atan(4/3)}
+\liftarm{3,0}{4}{90}
+\liftarm{2,0}{1}{90}
+\liftarm{2,1}{1}{0}
+\liftarm{2,1}{1}{90+atan(4/3)}
+\end{tikzpicture}
+\end{codeexample}
+Below is an example of an angled liftarm.
+\begin{codeexample}[width=9cm]
+\begin{tikzpicture}
+\pgfkeys{
+ /liftarm,
+ scalefactor=1,
+ Blue
+}
+\liftarm[axle holes=0]{0,0}{3}{0}
+\liftarm[axle holes=5]{3,0}{5}{atan(4/3)}
+\end{tikzpicture}
+\end{codeexample}
+The following example illustrates an angle bisection.
+\begin{codeexample}[width=9cm]
+\begin{tikzpicture}
+\def\ang{40}
+\def\r{3}
+\liftarm[mark holes={0,\r}]{0,0}{2*\r}{0}
+\liftarm[mark holes=\r]{0,0}{2*\r}{\ang}
+\liftarm[
+ mark holes=\r,
+ mark color=Red
+]{\r,0}{\r}{\ang}
+\liftarm{\ang:\r}{\r}{0}
+\end{tikzpicture}
+\end{codeexample}
+The following example illustrates that $7^{2}+4^{2}=8^{2}+1^{2}$.
+\begin{codeexample}[width=9cm]
+\begin{tikzpicture}[scale=0.75]
+\def\a{4}
+\def\b{7}
+\def\c{1}
+\def\d{8}
+%\liftarm{0,0}{\b}{0}
+%\liftarm{\b,0}{\a}{90}
+\liftarmconnect{0,0}{\b}{\b,\a}{\a}
+%\liftarm{\b,\a}{1}{atan(\a/\b)+atan(\c/\d)+90}
+%\liftarm{0,0}{\d}{atan(\a/\b)+atan(\c/\d)}
+\liftarmconnect{\b,\a}{\c}{0,0}{\d}
+\end{tikzpicture}
+\end{codeexample}
+Below is an animation of the Peaucellier-Lipkin linkage, see e.g.~\cite{Koagmopermbl}.
+\begin{codeexample}[width=9cm]
+\newcommand{\PLlinkage}[1]{
+\begin{tikzpicture}[scale=0.75]
+\def\a{3}
+\def\b{4}
+\def\c{9}
+\pgfmathsetmacro{\x}{
+ 2*\a+((\c^2-\b^2-(2*\a)^2)/(2*\a))
+}
+\useasboundingbox (-0.23,-6) rectangle
+ ({\x+0.23},6);
+\draw (\x,-5)--(\x,5);
+\liftarm{0,0}{\a}{0}
+\liftarm[coordinate=\a/A]{\a,0}{\a}{#1}
+\liftarmconnect[
+ connect coordinate=B,
+ connect reverse
+]{A}{\b}{0,0}{\c}
+\liftarmconnect[
+ connect coordinate=C
+]{0,0}{\c}{A}{\b}
+\liftarmconnect{C}{\b}{B}{\b}
+\end{tikzpicture}
+}
+\begin{animateinline}[
+ autoplay,
+ controls,
+ loop
+]{30}
+\multiframe{80}{rXmax=-40+1}{
+ \PLlinkage{\rXmax}
+}
+\newframe
+\multiframe{80}{rXmax=-40+1}{
+ \PLlinkage{-\rXmax}
+}
+\end{animateinline}
+\end{codeexample}
+Below is an animation of Kempe's trisector, as shown in \cite{Tmm3}.
+\begin{codeexample}[]
+\newcommand{\trisector}[1]{
+\begin{tikzpicture}[scale=0.33]
+\useasboundingbox (-27.3,-0.5) rectangle (21.2,37);
+\liftarm[coordinate=8/A]{0,0}{27}{180}
+\liftarm[coordinate=12/B]{0,0}{27}{180-(#1)}
+\liftarm[coordinate=18/C]{0,0}{27}{180-2*(#1)}
+\liftarm[coordinate=27/D]{0,0}{27}{180-3*(#1)}
+\liftarmconnect{C}{27}{D}{18}
+\liftarmconnect[liftarm 2={connect=8}]{A}{12}{B}{18}
+\end{tikzpicture}
+}
+\begin{animateinline}[autoplay,controls,loop]{5}
+\multiframe{20}{rXmax=0+1}{
+\trisector{15+\rXmax}
+}
+\newframe
+\multiframe{20}{rXmax=0+1}{
+\trisector{35-\rXmax}
+}
+\end{animateinline}
+\end{codeexample}
+Below is an animation of Chebyshev's Lambda Mechanism.
+\begin{codeexample}[width=10cm]
+\newcommand{\CL}[1]{
+\begin{tikzpicture}[scale=0.8]
+\def\r{1}
+\useasboundingbox (-2*\r-0.5,-2*\r-0.5)
+ rectangle (10*\r-0.5,10*\r+0.5);
+\liftarm{0,0}{4*\r}{0}
+\liftarm[
+ mark holes={0,2*\r}
+]{0,0}{2*\r}{#1}
+\liftarmconnect[
+ liftarm 1={mark holes={0,5*\r}},
+ liftarm 2={
+ connect=5*\r,
+ mark holes=10*\r,
+ mark color=Red
+ }
+]{4*\r,0}{5*\r}{#1:2*\r}{10*\r}
+\end{tikzpicture}
+}
+\begin{animateinline}[
+ autoplay,
+ controls,
+ loop
+]{60}
+\multiframe{360}{rXmax=0+1}{
+ \CL{\rXmax}
+}
+\end{animateinline}
+\end{codeexample}
+\begin{thebibliography}{9}
+\bibitem{Tmm1}
+Gerard 't Hooft,
+\emph{Meccano Math I},\\
+\url{https://webspace.science.uu.nl/~hooft101/lectures/meccano.pdf},
+2006.
+\bibitem{Tmm2}
+Gerard 't Hooft,
+\emph{Meccano Math II},\\
+\url{https://webspace.science.uu.nl/~hooft101/lectures/meccano2.pdf},
+2008.
+\bibitem{Tmm3}
+Gerard 't Hooft,
+\emph{Meccano Math III},\\
+\url{https://webspace.science.uu.nl/~hooft101/lectures/meccano3.pdf},
+2014.
+\bibitem{Koagmopermbl}
+Alfred Bray Kempe,
+\emph{On a general method of producing exact rectilinear motion by linkwork},
+1875.
+\bibitem{TtTaPGFp}
+Till Tantau,
+\emph{The \tikzname{} and {\upshape\pgfname} Packages},
+Manual for version 3.1.9a,
+\url{https://www.ctan.org/pkg/pgf},
+2021.
+\end{thebibliography}
+\printindex
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/liftarm/liftarm.sty b/Master/texmf-dist/tex/latex/liftarm/liftarm.sty
new file mode 100644
index 00000000000..9cd8660f8e5
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/liftarm/liftarm.sty
@@ -0,0 +1,256 @@
+%liftarm package
+%Draw liftarms with TikZ
+%(c) Matthias Floré
+%This program can be redistributed and/or modified under the terms of the LaTeX Project Public License Distributed from CTAN archives on http://www.latex-project.org/lppl.txt.
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{liftarm}[2022/03/06 v1.0 Draw liftarms with TikZ]
+\RequirePackage{etoolbox}
+\RequirePackage[dvipsnames]{xcolor}
+\RequirePackage{tikz}
+\usetikzlibrary{calc}
+\newif\ifliftarm@brick
+\newif\ifliftarm@contour
+\newif\ifliftarm@connectreverse
+\pgfkeys{
+/liftarm/.is family,
+/liftarm/.unknown/.code={\edef\liftarm@colorkey{\pgfkeyscurrentname}},
+/liftarm,
+color/.store in=\liftarm@colorkey,
+color 0/.initial=Gray,
+color 1/.initial=darkgray,
+color 2/.initial=Yellow,
+color 3/.initial=Orange,
+color 4/.initial=Red,
+color 5/.initial=Green,
+color 6/.initial=Blue,
+color 7/.initial=Brown,
+color modulo/.initial=8,
+brick/.is if=liftarm@brick,
+axle holes/.store in=\liftarm@axleholes,
+mark holes/.store in=\liftarm@markholes,
+mark color/.initial=Black,
+screw holes/.store in=\liftarm@screwholes,
+screw holes angle/.initial=45,
+screw color/.initial=Black,
+scalefactor/.initial=0.5,
+contour/.is if=liftarm@contour,
+coordinate/.store in=\liftarm@coordinate,
+connect coordinate/.store in=\liftarm@connectcoordinate,
+connect/.store in=\liftarm@connect,
+globalize/.code n args={2}{\xdef#1{#2}},
+liftarm 1 options/.style={},
+liftarm 1/.style={liftarm 1 options/.style={#1}},
+liftarm 2 options/.style={},
+liftarm 2/.style={liftarm 2 options/.style={#1}},
+origin/.initial=0,
+connect reverse/.is if=liftarm@connectreverse,
+hole radius/.initial=0.3,
+liftarm thickness/.initial=0.92,
+}
+\pgfmathsetmacro{\liftarm@axleholeangle}{14}%2*\liftarm@axleholeradius*sin(\liftarm@axleholeangle)=1.78/8
+\pgfmathsetmacro{\liftarm@screwholestartangle}{10}
+\newcommand{\liftarm}[4][]{
+\pgfmathsetmacro{\liftarm@length}{#3}
+\ifdim \liftarm@length pt<0 pt
+\PackageWarning{liftarm}{The length (\liftarm@length) of the liftarm is smaller than 0.}
+\else
+\pgfmathsetmacro{\liftarm@ang}{#4}
+\begin{scope}[shift={(#2)},rotate=\liftarm@ang]
+\pgfkeys{/liftarm,#1}
+\pgfmathsetmacro{\liftarm@origin}{\pgfkeysvalueof{/liftarm/origin}}
+\begin{scope}[shift={(-\liftarm@origin,0)}]
+\pgfmathsetmacro{\liftarm@halfthickness}{0.5*\pgfkeysvalueof{/liftarm/scalefactor}*\pgfkeysvalueof{/liftarm/liftarm thickness}}
+\pgfmathsetmacro{\liftarm@holeradius}{\pgfkeysvalueof{/liftarm/scalefactor}*\pgfkeysvalueof{/liftarm/hole radius}}
+\pgfmathsetmacro{\liftarm@halfstudwidth}{\pgfkeysvalueof{/liftarm/scalefactor}*0.3}
+\pgfmathsetmacro{\liftarm@studheight}{\pgfkeysvalueof{/liftarm/scalefactor}*0.2}
+\pgfmathsetmacro{\liftarm@halfplateheight}{\pgfkeysvalueof{/liftarm/scalefactor}*0.2}
+\pgfmathsetmacro{\liftarm@halfplatewidth}{\pgfkeysvalueof{/liftarm/scalefactor}*0.5}
+\pgfmathsetmacro{\liftarm@axleholeradius}{\liftarm@halfthickness}
+\pgfmathsetmacro{\liftarm@screwholeradius}{0.8*\liftarm@holeradius}
+\colorlet{liftarm@markcolor}{\pgfkeysvalueof{/liftarm/mark color}}
+\colorlet{liftarm@screwcolor}{\pgfkeysvalueof{/liftarm/screw color}}
+\pgfmathsetmacro{\liftarm@screwholesangle}{\pgfkeysvalueof{/liftarm/screw holes angle}}
+\ifcsname liftarm@colorkey\endcsname
+\colorlet{liftarm@color}{\liftarm@colorkey}
+\else
+\pgfmathsetmacro{\liftarm@colornumber}{int(mod(\liftarm@length,\pgfkeysvalueof{/liftarm/color modulo}))}
+\colorlet{liftarm@color}{\pgfkeysvalueof{/liftarm/color \liftarm@colornumber}}
+\fi
+\ifliftarm@brick
+\def\liftarm@shape{(-1,{-\liftarm@halfplatewidth-\liftarm@halfplateheight})--(-1,\liftarm@halfplatewidth)
+\foreach\liftarm@n in {-1,...,\liftarm@length}{
+--({\liftarm@n+0.5-\liftarm@halfstudwidth},\liftarm@halfplatewidth)--({\liftarm@n+0.5-\liftarm@halfstudwidth},{\liftarm@halfplatewidth+\liftarm@studheight})--({\liftarm@n+0.5+\liftarm@halfstudwidth},{\liftarm@halfplatewidth+\liftarm@studheight})--({\liftarm@n+0.5+\liftarm@halfstudwidth},\liftarm@halfplatewidth)--({\liftarm@n+1},\liftarm@halfplatewidth)
+}
+--({\liftarm@length+1},{-\liftarm@halfplatewidth-\liftarm@halfplateheight})--cycle}
+\else
+\def\liftarm@shape{(0,\liftarm@halfthickness) arc (90:270:\liftarm@halfthickness)--(\liftarm@length,-\liftarm@halfthickness) arc (-90:90:\liftarm@halfthickness)--cycle}
+\fi
+\fill[liftarm@color,even odd rule] \liftarm@shape
+\foreach\liftarm@n in {0,...,\liftarm@length}{
+(\liftarm@n,0) circle[radius=\liftarm@holeradius]
+};
+\ifliftarm@contour
+%\ifliftarm@brick
+%\else
+\draw[liftarm@color!75!Black,ultra thick] \liftarm@shape;
+%\fi
+\fi
+\ifcsname liftarm@axleholes\endcsname
+\foreach\liftarm@n in \liftarm@axleholes{
+\pgfmathsetmacro{\liftarm@axlehole}{\liftarm@n}
+\ifdim \liftarm@axlehole pt<0 pt
+\else
+\ifdim \liftarm@axlehole pt>\liftarm@length pt
+\else
+\foreach\liftarm@angle in {0,90,180,270}{
+\begin{scope}[shift={(\liftarm@axlehole,0)},rotate=\liftarm@angle]
+\fill[liftarm@color] (\liftarm@axleholeangle:\liftarm@axleholeradius) arc (\liftarm@axleholeangle:{90-\liftarm@axleholeangle}:\liftarm@axleholeradius)--({\liftarm@axleholeradius*sin(\liftarm@axleholeangle)},{\liftarm@axleholeradius*sin(\liftarm@axleholeangle)})--cycle;
+\end{scope}
+}
+\fi
+\fi
+}
+\fi
+\ifcsname liftarm@markholes\endcsname
+\foreach\liftarm@n in \liftarm@markholes{
+\pgfmathsetmacro{\liftarm@markhole}{\liftarm@n}
+\ifdim \liftarm@markhole pt<0 pt
+\else
+\ifdim \liftarm@markhole pt>\liftarm@length pt
+\else
+\fill[liftarm@markcolor] (\liftarm@markhole,0) circle[radius=\liftarm@holeradius];
+\fi
+\fi
+}
+\fi
+\ifcsname liftarm@screwholes\endcsname
+\foreach\liftarm@n in \liftarm@screwholes{
+\pgfmathsetmacro{\liftarm@screwhole}{\liftarm@n}
+\ifdim \liftarm@screwhole pt<0 pt
+\else
+\ifdim \liftarm@screwhole pt>\liftarm@length pt
+\else
+\begin{scope}[shift={(\liftarm@screwhole,0)},rotate=\liftarm@screwholesangle]
+\foreach\liftarm@n in {-1,1}{
+\fill[liftarm@screwcolor] ({\liftarm@screwholeradius*cos(\liftarm@screwholestartangle)},{\liftarm@n*\liftarm@screwholeradius*sin(\liftarm@screwholestartangle)}) arc ({\liftarm@n*\liftarm@screwholestartangle}:{\liftarm@n*(180-\liftarm@screwholestartangle)}:\liftarm@screwholeradius);
+}
+\end{scope}
+\fi
+\fi
+}
+\fi
+\ifcsname liftarm@coordinate\endcsname
+\foreach\liftarm@n/\liftarm@name in \liftarm@coordinate{
+\pgfmathsetmacro{\liftarm@value}{\liftarm@n}
+\coordinate (\liftarm@name) at (\liftarm@value,0);
+}
+\fi
+\end{scope}
+\end{scope}
+\fi
+}
+\newcommand{\liftarmconnect}[5][]{
+\begin{scope}
+\pgfkeys{/liftarm,#1}
+\coordinate (liftarm@A) at (#2);
+\coordinate (liftarm@B) at (#4);
+\begin{scope}
+\pgfkeys{/liftarm,liftarm 1 options}
+\ifcsname liftarm@connect\endcsname
+\pgfmathsetmacro{\liftarm@connectlengthAtemp}{\liftarm@connect-\pgfkeysvalueof{/liftarm/origin}}
+\else
+\pgfmathsetmacro{\liftarm@connectlengthAtemp}{#3-\pgfkeysvalueof{/liftarm/origin}}
+\fi
+\xdef\liftarm@connectlengthA{\liftarm@connectlengthAtemp}
+\ifdim \liftarm@connectlengthA pt=0 pt
+\PackageWarning{liftarm}{The length of the first liftarm is 0.}
+\fi
+\end{scope}
+\begin{scope}
+\pgfkeys{/liftarm,liftarm 2 options}
+\ifcsname liftarm@connect\endcsname
+\pgfmathsetmacro{\liftarm@connectlengthBtemp}{\liftarm@connect-\pgfkeysvalueof{/liftarm/origin}}
+\else
+\pgfmathsetmacro{\liftarm@connectlengthBtemp}{#5-\pgfkeysvalueof{/liftarm/origin}}
+\fi
+\xdef\liftarm@connectlengthB{\liftarm@connectlengthBtemp}
+\ifdim \liftarm@connectlengthB pt=0 pt
+\PackageWarning{liftarm}{The length of the second liftarm is 0.}
+\fi
+\end{scope}
+\path
+let
+\p1=(liftarm@A),
+\p2=(liftarm@B),
+\n1={\x1/\pgf@xx},
+\n2={\y1/\pgf@yy},
+\n3={\x2/\pgf@xx},
+\n4={\y2/\pgf@yy}
+in
+[
+/liftarm/globalize={\liftarm@connectxalet}{\n3},
+/liftarm/globalize={\liftarm@connectyalet}{\n4},
+/liftarm/globalize={\liftarm@connectxblet}{\n1},
+/liftarm/globalize={\liftarm@connectyblet}{\n2}
+]
+;
+\pgfmathsetmacro{\liftarm@connectxa}{\liftarm@connectxalet};
+\pgfmathsetmacro{\liftarm@connectya}{\liftarm@connectyalet};
+\pgfmathsetmacro{\liftarm@connectxb}{\liftarm@connectxblet};
+\pgfmathsetmacro{\liftarm@connectyb}{\liftarm@connectyblet};
+\pgfmathsetmacro{\liftarm@absdiff}{abs(\liftarm@connectxa-\liftarm@connectxb)};
+\ifdim \liftarm@absdiff pt<0.001 pt
+\pgfmathsetmacro{\liftarm@connectanglegamma}{90}
+\ifdim \liftarm@connectya pt<\liftarm@connectyb pt
+\pgfmathsetmacro{\liftarm@connectangleshift}{0}
+\else
+\pgfmathsetmacro{\liftarm@connectangleshift}{180}
+\fi
+\else
+\pgfmathsetmacro{\liftarm@connectanglegamma}{atan((\liftarm@connectyb-\liftarm@connectya)/(\liftarm@connectxb-\liftarm@connectxa))}
+\ifdim \liftarm@connectxa pt<\liftarm@connectxb pt
+\pgfmathsetmacro{\liftarm@connectangleshift}{0}
+\else
+\pgfmathsetmacro{\liftarm@connectangleshift}{180}
+\fi
+\fi
+\pgfmathsetmacro{\liftarm@connectlength}{sqrt((\liftarm@connectyb-\liftarm@connectya)^2+(\liftarm@connectxb-\liftarm@connectxa)^2)}
+\ifdim \liftarm@connectlength pt=0 pt
+\PackageWarning{liftarm}{The length between the origins of the liftarms is 0.}
+\fi
+\pgfmathsetmacro{\liftarm@connectabsconnectlengthAminusconnectlengthB}{abs(\liftarm@connectlengthA-\liftarm@connectlengthB)}
+\ifdim \liftarm@connectabsconnectlengthAminusconnectlengthB pt>\liftarm@connectlength pt
+\PackageWarning{liftarm}{The liftarms can not be connected.}
+\fi
+\pgfmathsetmacro{\liftarm@connectconnectlengthAplusconnectlengthB}{\liftarm@connectlengthA+\liftarm@connectlengthB}
+\ifdim \liftarm@connectconnectlengthAplusconnectlengthB pt<\liftarm@connectlength pt
+\PackageWarning{liftarm}{The liftarms can not be connected.}
+\fi
+\pgfmathsetmacro{\liftarm@connectanglealpha}{acos(((\liftarm@connectlengthB)^2+(\liftarm@connectlength)^2-(\liftarm@connectlengthA)^2)/(2*(\liftarm@connectlength)*(\liftarm@connectlengthB)))}
+\pgfmathsetmacro{\liftarm@connectanglebeta}{acos(((\liftarm@connectlength)^2+(\liftarm@connectlengthA)^2-(\liftarm@connectlengthB)^2)/(2*\liftarm@connectlength*(\liftarm@connectlengthA)))}
+\pgfmathsetmacro{\liftarm@connectangledelta}{\liftarm@connectangleshift+180+\liftarm@connectanglegamma-\liftarm@connectanglebeta}
+\def\liftarm@liftarmA{\liftarm[liftarm 1 options]{#2}{#3}{\liftarm@connectangledelta}}
+\def\liftarm@liftarmB{\liftarm[liftarm 2 options]{#4}{#5}{\liftarm@connectangleshift+\liftarm@connectanglegamma+\liftarm@connectanglealpha}}
+\ifliftarm@connectreverse
+\liftarm@liftarmB
+\liftarm@liftarmA
+\else
+\liftarm@liftarmA
+\liftarm@liftarmB
+\fi
+\ifcsname liftarm@connectcoordinate\endcsname
+\coordinate (\liftarm@connectcoordinate) at ($(#2)+(\liftarm@connectangledelta:\liftarm@connectlengthA)$);
+\fi
+\end{scope}
+}
+\newcommand{\liftarm@construction}[2][]{\begin{tikzpicture}[#1]
+\liftarm@constructfigure
+#2
+\end{tikzpicture}}
+\newcommand{\liftarmconstruct}[3][]{\item #2\nopagebreak
+
+\gappto\liftarm@constructfigure{#3}
+\expandafter\liftarm@construction\expandafter[\liftarm@constructoptions]{#1}
+}
+\newenvironment{liftarmconstruction}[1][]{\def\liftarm@constructoptions{#1}\def\liftarm@constructfigure{}\begin{enumerate}}{\end{enumerate}}
+\endinput \ No newline at end of file
diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check
index 7403d80d2f1..ef8b6fb19c4 100755
--- a/Master/tlpkg/bin/tlpkg-ctan-check
+++ b/Master/tlpkg/bin/tlpkg-ctan-check
@@ -473,7 +473,7 @@ my @TLP_working = qw(
libertine libertinegc libertinus
libertinus-fonts libertinus-otf libertinus-type1 libertinust1math
libgreek librarian librebaskerville librebodoni librecaslon librefranklin
- libris lie-hasse light-latex-make lilyglyphs limap limecv
+ libris lie-hasse liftarm light-latex-make lilyglyphs limap limecv
linearA linebreaker linegoal
lineno linenoamsmath ling-macros linguex linguisticspro linop
lion-msc lipsum lisp-on-tex
diff --git a/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc b/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc
index 8a78106eedb..137140a9b48 100644
--- a/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc
+++ b/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc
@@ -82,6 +82,7 @@ depend knittingpattern
depend ladder
depend lapdf
depend latex-make
+depend liftarm
depend lpic
depend lroundrect
depend luamesh
diff --git a/Master/tlpkg/tlpsrc/liftarm.tlpsrc b/Master/tlpkg/tlpsrc/liftarm.tlpsrc
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/Master/tlpkg/tlpsrc/liftarm.tlpsrc