Directory graphics/pgf/contrib/tikzphysics
tikzphysics
Draw mechanics, contact surfaces, fluid schematics, differential elements, and optics diagrams using ordinary TikZ nodes, paths, pics, and anchors. The main names are block, spring, pulley, and wedge. No special command namespace is needed.
Version 1.8.0 · 2026-10-11
Start here
- Install the package files in your TeX tree. For Overleaf, upload the generated single file
output/overleaf/tikzphysics.stybeside your document. - Load
\usepackage{tikzphysics}. - Compile with pdfLaTeX. The package itself needs neither shell escape nor external programs.
Build or refresh the Overleaf file from the package root with:
python3 scripts/build_overleaf_bundle.py
The normal CTAN installation remains modular; the generated Overleaf copy inlines the catalog, core, surface, ramps, mechanics, elements, fluids, and optics, waves, thermodynamics, and thermal physics modules.
\documentclass[tikz,border=5mm]{standalone} \usepackage{tikzphysics} \begin{document} \begin{tikzpicture} \node[block] (B) at (3,0) {$m$}; \draw[spring] (0,0) -- node[above] {$k$} (B.west); \end{tikzpicture} \end{document}
Here block chooses an object, (B) names it, and (B.west) is its left attachment point. spring decorates the connection between two coordinates. You can also position a spring as a named node:
\node[spring,minimum width=3cm,rotate=30] (S) {}; \draw (A) -- (S.start); \draw (S.end) -- (B.west);
Both forms share the same coil settings and every spring hook. Nodes also provide coil-start, coil-end, center, and axis-0..100 anchors, with show anchors and show keys for inspection. axis-* follows the straight spring axis. See the spring guide and its rendered gallery.
Choose what to learn
| I want to… | Start with… |
|---|---|
| Build a spring–block–pulley system | Complete example below |
| Find every feature and its keys | Feature reference |
| See keys and anchors while drawing | Debug explorer |
Compare show anchors and show keys across object types |
Debug overlay guide and complete feature tour |
| Understand dimensions and percentage anchors | Extended guide |
| Browse rendered diagrams and detailed explanations | PDF manual |
| Copy a complete document | Example directory and learning routes |
The default block is 1 cm × 1 cm, and the default pulley diameter is 1 cm.
Physical nodes and arrows use native TikZ stroke widths and >=latex arrow tips. No module-specific thickness is imposed; use ordinary TikZ styles in your document to customize them. Diagram defaults remain black and white.
See the package visual review for the module audit and native style examples for inherited fonts, wave attachments, solid patterns and native stroke overrides.
Differential elements
See the complete element guide for projected rim percentage coordinates, centroid geometry and visual examples.
The tikzphysics.elements module provides reusable nodes for polar area and mass elements. It is loaded automatically by \usepackage{tikzphysics}:
\begin{tikzpicture} \node[polar element, element inner radius=18mm, element radial thickness=2mm, element start angle=30, element delta angle=30, show dimensions] (dA) at (0,0) {}; \end{tikzpicture}
Use differential sector for a zero-inner-radius sector and differential ring for a complete thin annulus. The combined teaching pic keeps the original circular body, its annular element, centre mark, and opened strip in one named construction:
\pic (D) {differential ring diagram={ element inner radius=1cm, element radial thickness=2mm }}; % Components: (D-ring), (D-strip); body anchors: (D-body-east), etc.
Use unwrapped ring,source element=R when the strip should be positioned independently. Its differential approximation has width $2pi r$, using the inner reference radius, and height $d!r$.
The same module includes solid and sheet constructions. Each named pic keeps the body and highlighted integration element together:
\pic (S) {sphere shell diagram}; % (S-body), (S-shell) \pic (C) at (6,0) {cylinder slice diagram}; % (C-body), (C-slice) \pic (A) at (12,0) {sheet element diagram}; % (A-body), (A-element)
Available teaching pics are sphere shell diagram, sphere slice diagram, hollow sphere diagram, cylinder shell diagram, cylinder slice diagram, cone slice diagram, and sheet element diagram. Standalone element nodes include spherical shell, hollow sphere, rectangular element, rectangular strip, and rectangular sheet.
The default labels use ordinary LaTeX $d\!r$, $d\!x$, $d\!y$, and $d\!\theta$, while formula labels use the corresponding shell or slice expression. No notation package is required. Use show anchors or show keys on any element node to inspect its complete API.
Element labels and dimension arrows inherit the surrounding or per-node font. Native TikZ styles remain available on every element node: use, for example, pattern=dots, pattern=north east lines, pattern=horizontal lines,dashed, or pattern=none,fill=gray!20. In a solid pic, apply these keys through every solid element/.append style={...}. Projected solid diagrams use every solid hidden edge for dashed rear curves.
Set your defaults once
\tikzset{ every block/.style={minimum width=1cm,minimum height=1cm,fill=white}, every spring/.style={pre length=3mm,post length=3mm,amplitude=2mm}, every pulley/.style={minimum size=1cm} }
Then continue using \node[block] and \draw[spring]. For one exception, put options after the object name:
\node[block,minimum width=2cm] (B) {$m$};
Node and path styles apply built-in settings, every physics object or every physics connection, and the object-specific hook, in that order. Later local options win. Inside a scope these customisations stay local. spring/.append style={...} is also ordinary supported TikZ.
Use explicit units with native minimum width, minimum height, and minimum size. Convenience keys such as block width=1.2 interpret bare numbers as centimetres. Spring leads accept zero.
Spring, block and pulley on a wedge
Copy this complete document:
\documentclass[tikz,border=6mm]{standalone} \usepackage{tikzphysics} \tikzset{ every block/.style={minimum width=1cm,minimum height=1cm,fill=white}, every pulley/.style={minimum size=1cm,fill=white}, every spring/.style={pre length=3mm,post length=3mm, amplitude=2mm,segment length=2mm} } \begin{document} \begin{tikzpicture} \node[ground,ground width=8.6cm,ground depth=3mm, anchor=top-left] (G) at (-0.6,0) {}; \node[wedge,pulley edge,wedge width=7cm,wedge angle=30] (W) {}; % The contact anchors select the actual incline in every wedge mode. \path (W.tangent-before-50) -- (W.tangent-after-50) node[midway,sloped,block,anchor=south] (B) {$m_1$}; \edef\InclineAngle{\geometryvalue{W}{slope angle}} \draw[thick] (W.surface-start) -- ++({\InclineAngle+90}:10mm); \coordinate (S) at ($(W.surface-start)+({\InclineAngle+90}:5mm)$); \draw[spring] (S) -- node[above=3mm,sloped] {$k$} (B.west); \node[pulley] (P) at (W.pulley-center) {}; \node[block,anchor=north] (H) at ($(P.east)+(0,-2.5cm)$) {$m_2$}; \draw[rope] (B.east) to[over pulley=P] (H.north); \end{tikzpicture} \end{document}
The wedge is 7 cm wide at 30 degrees, so its resolved height is about 4.04 cm. With the hanging block's north anchor 2.5 cm below the pulley centreline, the full default 1 cm block clears the ground by about 5.4 mm.
The block height matches the pulley diameter, keeping the incoming string parallel to the incline for this placement. The string follows exact tangent points and the pulley arc. If you change these sizes independently, that alignment is no longer guaranteed.
The older \physicsstringoverpulley{B.east}{P}{H.north} command is still supported. Both forms respect scoped string route settings.
Continuous pulley edges
pulley edge adds the familiar tapered textbook support to a platform without assembling separate shapes. The horizontal surface still reaches the fixed tip, the wall begins 5 mm inward and 5 mm lower, and the complete hatched body is one closed path. The preset matches the default 1 cm pulley:
\node[platform-right, pulley edge, platform width=5cm] (S) {}; \node[pulley] (P) at (S.pulley-center) {};
The same preset works with platform-left. Use platform, pulley edges for both sides, or left pulley edge and right pulley edge independently. Set wall inset and wall drop directly for other proportions; the corresponding left/right keys configure a two-wall platform asymmetrically. Both dimensions default to zero, preserving the ordinary sharp platform corner. Upward walls require zero inset and drop to keep the floor outline simple. platform depth continues to set the wall length measured from the new wall root, so the preset extends the total support 5 mm farther downward.
For platform, platform-left, platform-right, ground, ceiling, and wall-left/wall-right, use (S.surface-25) to select a percentage of the usable contact face. It runs left to right on horizontal faces and bottom to top on freestanding walls. surface-50 is the midpoint. The other boundaries have their own percentage families: bottom, left, and right for a platform's floor; wall-surface, wall-back, wall-base, and wall-tip for its attached wall. A two-wall platform prefixes these with left- or right-. Use show anchors with physics debug/anchor families=all and physics debug/anchor samples={0,50,100} to inspect them in the picture. The surface-anchor guide maps every family and includes copy-ready show anchors examples for ground, ceiling, both walls, and all three platforms. Its visual gallery shows every boundary at 0, 50, and 100, including upward platform corners.
On a wedge, the same pulley edge name produces the longer textbook nose used in the complete example above:
\node[wedge,pulley edge,wedge width=7cm,wedge angle=30] (W) {}; \node[pulley] (P) at (W.pulley-center) {};
The wedge preset uses wedge top inset=5mm and wedge top drop=10mm. Ordinary wedges keep both values at zero. The top and pulley-center anchors coincide at the fixed tip; wall-root, transition-mid, and transition-0..100 expose the added boundary. The preset supports wedge right angle at=br and its mirrored bl form. The wedge-anchor guide maps all three right-angle modes and both pulley-edge orientations. Its visual gallery uses show anchors to check the contact and boundary points.
Straight and curved ramps also have percentage anchors for each drawn boundary. The ramp-anchor guide maps the floor, incline or arc, wall, base, and end edges; its visual gallery checks both directions.
Explore inside TikZ
Add show anchors or show keys to a node. A name is optional when you only want the overlay; keep a name when you also want to refer to its anchors later:
\begin{tikzpicture} \node[wedge,show anchors,show keys] (W) {}; \end{tikzpicture}
show keys displays the feature reference: defaults, size aliases, named anchors, and percentage families, not the live values of this particular node. To display a reference without creating an object (including path styles and pics):
\begin{tikzpicture} \physicshelp{spring} \end{tikzpicture}
For a larger object, select the anchors you want to inspect:
\node[wedge,show anchors, physics debug/anchor list={bl,br,top}, physics debug/anchor families={surface}, physics debug/anchor samples={0,25,50,75,100}] (W) {};
anchor list=auto lists every named anchor in a table. Each distinct position has one numbered marker; anchors at the same point share its number in the table. Families list their entire 0..100 range in the reference; samples choose points to plot. Native ranges such as anchor samples={0,1,...,100} work; anchor families=all selects every family. Use show anchors=false or show keys=false for local overrides. Reference panels and legends can be moved using the debug x/y shift keys described in the manual.
These overlays work on every native physics node, including all eight fluid nodes, including spring nodes. For paths and pics, use \physicshelp{spring} or \physicshelp{fluid tank diagram} for their reference cards. See the debug overlay guide for copy-ready examples covering platforms, wedges, ramps, fluids, elements, optics, paths, and pics.
What can I draw?
| Kind | Features |
|---|---|
| Contact surfaces | Platforms, ground, walls, ceilings, wedges, straight and circular ramps |
| Mechanics nodes | Blocks, pulleys, particles, disks, rings |
| Differential elements | Polar regions, rings, sphere/cylinder shells and slices, cone slices, and Cartesian sheet elements |
| Fluid mechanics | Eight native fluid nodes plus fourteen editable teaching assemblies |
| Connections and vectors | Springs, ropes, rods, force, velocity, acceleration, torque |
Named assemblies (pic) |
Pin supports, roller supports, pendulums |
| Optics | Plane/curved mirrors, symmetric/plano/meniscus lenses, slabs, prisms |
Named assemblies use normal TikZ syntax:
\pic (A) {pin-support}; \pic (B) at (4,0) {roller-support}; \draw[rod] (A-pivot) -- (B-pivot); \draw[force] (2,1) -- (2,0);
This is a diagram library: forces, trajectories, and optical rays are specified by you. It does not solve dynamics or ray tracing automatically.
Fluid mechanics and typography
The separate tikzphysics.fluids module adds eight native fluid nodes and fourteen teaching assemblies. Start individual objects with ordinary node syntax such as \node[fluid tank] (T) {};. Use explicit pic names such as fluid tank diagram when the complete labeled teaching assembly is useful. The original short pic names remain compatibility aliases.
Liquid defaults to dots. Users can set native pattern, pattern color, fill, and dashed directly; pattern=north east lines is a standard alternative. See the fluid guide, the native-node gallery, the assembly gallery, and reference compositions. Scoped fluid={...} keys, collision-safe physics fluid ... aliases, and named anchors or coordinates are supported. Element labels inherit document, picture, and node fonts; dimension arrows use native >=latex tips and inherit the document line width. For example, \node[fluid tank,show anchors,show keys] (F) {}; shows the native tank's attachment points and documented settings.
Optics percentage anchors
Optics defaults to black-and-white rendering; document-level TikZ color overrides remain available. Optics also includes plane-mirror, plano-convex-lens, plano-concave-lens, positive-meniscus-lens, and negative-meniscus-lens. Use mirror height / mirror thickness for the plane mirror, and lens height / lens thickness / lens front radius / lens back radius for the new lens variants. See the variant gallery.
All optical shapes accept surface-0 through surface-100 on their primary face. Lenses and slabs use the front face; prisms use the left (entry) face. Mirrors use the reflecting face.
Lenses and mirrors also expose top-0..100 and bottom-0..100 end caps. Prisms provide entry-0..100 and exit-0..100 aliases for left and right. Existing families and numeric shorthand keep their original directions. See directions and examples.
Compatibility and precise attachments
Ramps and optical shapes retain their numeric shorthand. Prefer explicit anchors such as (W.surface-50) and (L.front-50): (L.30) is a percentage on optical shapes, while (P.30) on a pulley is an angle in degrees.
Use physical anchors for contact with irregular shapes. Their inherited rectangular automatic borders have not been replaced in this release. Standard block and circular-body borders retain normal TikZ behaviour. Use tangent anchors with sloped for rotated objects; nonuniform scaling does not preserve circles or perpendicular normals.
Native component extensions
New black-and-white nodes include beams and rigid pendulums, dampers and stepped pulleys; piston cylinders, capillaries, nozzles, Venturis and layered tanks; projected solid and shell nodes; connected, circular and loop tracks; and transverse, standing and longitudinal waves with open/closed pipe modes. All expose documented integer percentage families and per-node geometry. See the complete guide, the gallery, and composed examples.
Development
python3 scripts/generate_reference.py --check l3build check l3build doc python3 scripts/build_overleaf_bundle.py --check python3 scripts/verify_components.py
The manual uses Fourier and minted, and therefore needs their dependencies and shell escape when rebuilding. This does not apply to ordinary package use. Run the generator without --check after editing feature reference declarations.
Licensed under LPPL 1.3c or later.
For predictable percentages on fluid and mechanics nodes, see the anchor direction guide and complete visual example.
Thermodynamics
The tikzphysics.thermodynamics module adds reservoirs, gas chambers, thermal walls, piston-cylinder systems, heat engines and refrigerators; five pressure-volume processes; rectangular and Carnot cycles; shared PV axes; and complete energy-flow pics. All default to black and white. See the thermodynamics guide for all keys, equations, anchor directions, examples and limits. The single-file Overleaf runtime includes this module.
Thermodynamics supports shared-frame process comparisons with pv diagram and pv show axes=false, plus pressure/volume projections of process endpoints and cycle states. The composition gallery includes compression, heat pumps, automatic circular connections, and transformed diagrams.
The shared piston cylinder node also loads with thermodynamics alone. Use piston cylinder diagram for a gas label and configurable input/output heat and work arrows. Gas, piston-face, rod and flow anchors support integer percentages; the piston gallery covers expansion, compression, adiabatic compression and transformed composition.
Thermal physics and heat transfer
The tikzphysics.thermalphysics module adds conduction slabs, composite walls, convection surfaces, cooling fins, radiating bodies, thermometers, calorimeters and expansion rods. It uses native named nodes, integer percentage families, black-and-white defaults, and latex heat-transfer arrowheads. See the complete guide for parameters, directions, physical conventions and composition examples. The tikzphysics.heattransfer selective loader is an alias of this library. Both families are included in the single-file Overleaf runtime.
Overleaf memory verification
Use the current generated output/overleaf/tikzphysics.sty or output/overleaf/tikzphysics-overleaf.zip for direct upload. Percentage families share their geometry formulas instead of duplicating them 101 times; this retains all integer anchors and reduces package-loading memory substantially. A TeX capacity exceeded [main memory size=5000000] error during Carnot or later shape declaration can occur with older generated copies. Replace the project-local .sty, then use Overleaf's Recompile from scratch.
Run python3 scripts/verify_overleaf.py to compile the minimal Carnot probe, a deterministic memory-pressure preamble, and every shipped Overleaf example. Each test fixes pdfLaTeX's main memory to 5,000,000 words, disables extra top/ bottom memory, and records that only the local single-file runtime was loaded. This is local compatibility verification; it does not claim a hosted Overleaf project was opened or tested.
Download the contents of this package in one zip archive (2.2M).
TikZphysics – TikZ-native shapes and anchors for classical physics diagrams
The package extends TikZ with reusable shapes, styles, keys, and geometric anchors for physics diagrams. It provides mechanics, contact surfaces and tracks, polar and Cartesian differential elements, solid shell and slice constructions, fluid mechanics, optical mirrors and lenses, waves, thermodynamics, and thermal physics/heat transfer apparatus. Features use ordinary TikZ node, path, and pic syntax with reusable default styles. Integer percentage anchors compose larger diagrams, and reference cards expose keys and anchors. Diagrams default to black and white and inherit native TikZ stroke widths.
| Package | TikZphysics |
| Version | 1.8.0 2026-10-11 |
| Licenses | The LaTeX Project Public License 1.3c |
| Copyright | 2026 Vaibhav Blayer |
| Maintainer | Vaibhav Blayer |
| Contained in | TeX Live as tikzphysics MiKTeX as tikzphysics |
| Topics | PGF TikZ Graphics in TeX Physics Diagrams Tagged PDF – fully compatible |