Animated Infographics

Six real lecture slides, rebuilt in ::: draw

This is a psi-slides lecture: one Markdown source becomes the projected slides, a speaker cockpit, a reading document, and a handout with the spoken notes. The psi-slides tutorial lecture introduces the system itself.

Every figure in this lecture is written in the lecture source, laid out at build time, and stepped with the same key that advances a reveal.

principle

None of this is in the 1.0.0 release

::: draw was added after the 1.0.0 release, so the archive on the releases page does not have it and a lecture that uses it will not build against that download.

What you need instead is the repository: a clone, or Download ZIP from the project page. The figure language may still change before it is tagged, so a figure you write today may need an edit. The editor is experimental too.

Memory safety

Types of memory unsafety

Temporal object Use After Free Double free free(ptr);*ptr; Spatial object Buffer Overflow Buffer Overread char buf[16];buf[42];

Two families, one shape. flush left at the end of a placement keeps each below chain level at its left edge, though the upper listing runs to two lines and the lower one is a different width; same as gives each pair boxes of one size. The statement align x middle tobj, sobj is a different thing: it hands one coordinate from the first element named to the rest, and it is needed here because the two small boxes hang beside words of different lengths. The two steps name @temporal and @spatial instead of listing eight names.

Your first buffer overflow a made-up example

int main(void) {
  int  myvalue = 0x42;
  char mystring[16];

  scanf("%s", mystring);

  if (myvalue == 0xdeadbeef)
    printf("Success!\n");
  else
    printf("%x\n", myvalue);
}
writing direction:towards higheraddresses Local variable: mystring(char[], 16 bytes) Local variable: myvalue(integer, 4 bytes) Stored base pointer Return addressReturn address (attacker's) SP BP

An ordinary Markdown code block on the left, a diagram on the right. ::: side puts the two beside each other, and the diagram needs to know nothing about it. Inside, same as and gap 0 hold the four frames together as one stack, and the brace spans all four and writes the direction of writing beside them.

Block ciphers

Cipher Block Chaining, decryption

Rand. IV c0 c1 c2 Dec Dec Dec k k k + + + m0 m1 m2

Each step is one press of the forward key. The chaining arrows carry one waypoint each (via), which is as much routing as these figures ever need.

Counter mode, encryption

IV 0 IV 1 IV 2 Enc Enc Enc k k k s0 s1 s2 + + + m0 m1 m2 c0 c1 c2

The split boxes are two boxes with gap 0. IV and counter carry different tones and sit flush against each other; between iv0,n0 offset 0,1.35 puts the Enc box under the middle of the pair instead of guessing it against one of the two. The twelve arrows in the lower half carry neither @tag nor show: an edge is only as visible as its two ends, so each arrives by itself in the step where its second endpoint does.

Identity and authentication

Identity lifecycle

Signup Login Creation Usage Termination Registration identity Provisioning issue credentials andprovide them to user Authorization granting of rightsby the authority Identification claim identity withunique name Authentication prove identity claimwith credentials Access Control granting of accessby the system Self-services

Without align y middle the two columns drift apart. They are separate below chains, and the captions run to one line or to two; three align lines hold the rows level.

Message authentication it is not about confidentiality

M, T M, T replay forgery MF, TF Alice Eve Bob k k defense? T = MACk(M) "authentication tag" Verifyk(M, T) T' = MACk(M)T' equals T ? e.g. Security goals: integrityand authenticity butnot non-repudiation

The avatars are vector drawings and follow the theme. image alice avatar-alice finds the file in assets/ exactly as ![](fig-id) does; an SVG file is spliced in as a nested <svg> and inherits --ink and --paper. The two attack arrows start at eve.right:0.28 and :0.72: the fraction after the colon slides the attachment point along that side, so the two run parallel instead of on top of each other.

The vocabulary

The pieces

encrypted recoded Sender Mix Receiver + a free label, placedwherever it reads best

box, dot, text, image, edge, brace, container, bars, grid, plot, table, lanes, sequence, align, spread, default, step – seventeen statements, and no more. -- x on a text draws a short line to what it is about: a leader, not an arrow. An arrow claims a connection, a leader only says what the note refers to.

Everything in it is measured in grid units, including what carries no label. The dot in the middle has no r and so has a radius of 0.18 units – 0.36 across – rather than a fixed number of pixels. The difference shows the moment a block changes its unit=: a pixel figure would stay where it was while every box around it grew.

Alignment

from outside one a much longer label two middling first fourth a considerably wider one third

The two rows show two different kinds of even. In the top row the gaps between edges are equal, which a chain of right of … gap n already gives you. In the bottom row the distances between centres are equal: spread x distributes the inner elements between the first and the last, and because the second box is much wider than its neighbours the gaps either side of it are visibly smaller. The arrow at the top left has an endpoint with no object behind it – a coordinate instead of an invisible anchor.

Containers and braces

Creation Signup the whole thing Registration Provisioning Authorization

A container lays itself around its members and re-fits when they move. A brace spans a subset and hangs its label outside. Both measure their distance to their contents with the same word, pad – the brace is given 0.62 here so that it comes to lie outside the container's 0.42.

Swimlanes are not a container, and that is why. A container measures itself against what it holds, so three lanes holding different numbers of things come out different lengths at both ends. A swimlane diagram says the opposite: the bands are equal, and only what happens inside them differs. lanes is for that – bands of equal width that want to know nothing about their contents. The figure is further down, under Three roles, one incident.

.turn applies to every label, not only to a box's. The left brace reads bottom to top, and the same class does the same thing on a container caption and on an edge label – at all four places, that is, where a label is set at all.

The look of a thing

paper tone-1 tone-2 tone-3 tone-4 clear fill sans mono serif hand family normal emph dim ghost prominence a label that is too long a label that is too long short no shrink fit type meetsits box hex chevron left turn outline, andreading direction emph normal dim ghost !dim prominence

The editor's sidebar shows exactly these rows. It is experimental and made for a desktop-sized screen: heavily covered by automated tests, not yet widely tried by people. The classes are a closed list rather than free colours – every fill is mixed from --emph and --ink over --paper, so it survives all seven themes.

.paper in the top row looks inert and is not. It is a box's default, but under a default box {.tone-3} a box without the class cannot find its way back, and a free text gets no background at all without it – that background is what knocks a line out behind a label.

The bottom row is the five outlines that are not rectangles, plus .turn. They share a slot with .round and .sharp – a group from which only one class can hold at a time – because a hexagon has no corner radius to argue about. The same four numbers are drawn as for a rectangle, joined into a different path. .turn reads the label bottom to top: a tall narrow box has room for a word only along its length, and the alternative is one letter per line.

A .cross with no w of its own comes out square, block default or not. A plus with arms of two different lengths is not a plus. Without the exception the cross would take the minimum width one line of type needs and arrive at 66 by 37 pixels, a stretched shape instead of a sign. The row's default box … w 0.62 applies to the rectangles in it, and a cross is not one, so it passes by – the same exception bars makes for outlines. A w written on the element's own line still wins, that being a statement about this one element.

.diamond is the one outline that eats both axes. The widest room a diamond offers is a strip half its width by half its height through the middle, so the build sizes it at twice what a rectangle would need for the same string, in both directions. A sentence in a diamond therefore takes four times the area of the boxes beside it and swallows the figure; two or three words is the measure, and the explanation belongs in a note next to it. The diamond in this row carries no label for the same reason – the labelled one is in the flowchart further down. .hex also says a question is asked here; the diamond says on top of that that it goes on in two ways, which a room has been trained on since school.

Which way an outline aims is the point option, not the class name. {.chevron} point left rather than a class .chevron-left: a chevron aimed up is the same shape aimed differently, and a word for every shape times every direction would quadruple the closed list. point applies to .chevron and .wedge; on a shape with no point the build refuses it instead of reading past it.

The last row is the one channel the language spells in three places, and spells the same way in all three. .emph, .dim and .ghost are classes on an element's own line; they are the verbs a step has for them (dim a, b); and on a bars line the same three words name column numbers. Learn one form and you have all three. The fourth state – ordinary prominence – deliberately has no name: {!dim} takes the class off instead of adding a fourth, and that holds for every class and in every tail.

p5 carries @prom, and so the default default box @prom {.dim} – and {!dim} beside it. Without that mark there is no way back: a style step could only ever add a class, and many slots spell their base state as the absence of every member, so a beat could leave such a state and never reach it again.

What is written on the line is in the handout; what is written in a step is not. That is the whole rule, and it reads off the source: prominence on an element's own line describes the drawing, prominence in a beat is an act performed in the talk. Print therefore takes it from the opening beat rather than the last.

When type and box do not match, there are three answers. With no w the box grows to the type. With a fixed w, .shrink shrinks the type until it fits and .fit fills the box in both directions, bounded to 0.6–1.5× the base size. Text width is estimated at build time – there is no browser – so the size chosen comes out a shade too small, which is the safe direction.

The first box overflows on purpose, and the build says so: box g1 is 1.2 units wide but its label needs about 1.64. That is the answer nobody wants: a fixed w too small for the label, and neither .shrink nor .fit. It is the one warning this lecture builds with.

Steps that move

on the path HTTP Client Server Proxy the box walks,the arrows follow

move shifts an element, and everything hanging off it goes too. The proxy gets move px to between cl,sv, and because the layout is worked out again at every step, the two dashed arrows still hang off it, the short line on the label still points at it, and the container suddenly holds a row instead of two. hide direct takes the direct arrow away. to names a position and by shifts by an amount – and the build refuses move @tag to …, which would stack the whole set on one point; for a set, by is what is meant.

A beat can also take a class off, and {!class} is the only word for it. A style step could once only add, and because many slots spell their base state as the absence of every member – ordinary prominence, a solid stroke, the normal type size – a beat could leave such a state and never reach it again. The last beat here takes .dim and .emph off and gives the figure its opening weighting back. The mark removes the exact name written, not the slot: {!dim} clears no .ghost, and a later beat may set .dim again.

Anything hanging off something invisible stays invisible. So neither the container nor the dashed arrows nor the handwritten label needs a show of its own: an arrow is only as visible as its ends, a container only as visible as its members, and a text with a leader only as visible as what it points at. The first step says show px and nothing else – the two dashed arrows arrive with the proxy.

Naming an element overrides that rule, in both directions. hide direct takes the direct arrow away though both its ends are still there; a written show does the reverse and brings something on screen whose source is still missing – an outline, say, that should stand around its whole set before the set is assembled (the figure for that is the tree under Leaves first, and the brackets follow). Both hold from the beat they are written in onwards. Write one only where the rule says the wrong thing. Write a show on every element and you have a figure that stays incomplete the next time one is added: the element is in the block, no step names it, and it never appears.

Where the words sit

side top side bottom topleft top topright left centred right bottomleft bottom bottomright free, left free, right

left and right say where a line of words sits, top and bottom where the block of lines sits. Both are measured against the padding rather than the border: left means as far left as this box allows. Without one of the four the label sits centred, which is right for almost every box; the words are there for the rest, above all for a tall box with a short label.

With more than one line the whole block of lines moves, not the single line, so on two lines bottom puts the last one on the inner edge rather than the first. turn beats both: a turned label reads bottom to top and is centred on its point whichever way round it goes.

The nine boxes above are two independent channels; the two lines around them are one. A box label sits somewhere in a rectangle of space, so there are three answers across and three down. An edge label lies on one side of its line or the other, and that is all. The same four words for both meant {.top .left} was writable on an edge, which has only one side to pick. On an edge it is therefore side <word>, the pattern point follows on the outlines: a closed word list as an option instead of a class per word. Which pair can choose at all is settled only once the line is routed, so naming the other one draws a warning.

Six statements that expand

Bin 1 Bin 2 Bin 3 8 × 6

Six statements expand at parse time into ordinary elements. bars becomes a box per column (f-0f-11), a baseline and – where a second string is written – a text per label; grid a cell per field (g-<column>-<row>); plot a frame with gridlines and axes; table a box per cell; lanes a band per lane; sequence a head, a lifeline, a message and a note per entry. Everything downstream treats the result like any other element: the brace spans three columns because three columns are three ordinary boxes, and a style step tints three cells because they are boxes. What makes that work is that a coordinate may be another element's – every cell is placed against an edge of the frame the same statement lays. The other four are further on: plot two figures later, table, lanes and sequence under Four arrangements.

An edge is one of the things a coordinate can be read off. w1.cx, w1.cy, above w1 gap 0.2 – what is read is the wire's bounding box. That counts as soon as a sentence describes the wire rather than one of its ends. Pinned to a box, such a sentence keeps its distance from the box and loses it from the line the moment a fraction or a height changes, with no warning. An edge has no name until you give it one, and the name goes in front, as it does on every other statement: in the slot before the first endpoint, edge w1 mix -> log. Staying anonymous costs nothing, the slot being optional. Place in a circle – an element against an edge that itself hangs off it – and you get placement cycle with the line number.

cell counts in the height of a grid unit on both axes, exactly as pad does. A grid cell is meant to be square, and a number meaning the unit's width across and its height down would give squares only where the unit is itself square.

The spacing inside these statements is space, not gap. A placement stands on the same line, and there gap means the distance to another element. The distance between two columns is a different thing and takes a different word.

A second run of columns

Q1 Q2 Q3 Q4 side by side Q1 Q2 Q3 Q4 stacked 2023 2024

series of a means: the same columns, a second run. The second bars line gets no frame, no baseline and no strip of category names – all three belong to the frame it joins, and writing one anyway is an error. It refuses a placement for the same reason. What it brings is its values, its classes and, like any other bars line, the two words that single columns out from the opening picture onwards.

One word separates the two figures, and it changes the scale. Without stacked the second run stands beside the first and a column's cell is shared between them; with stacked it stands on it, and the scale is no longer the tallest single value but the tallest stack. The same numbers are therefore flatter on the right than on the left, though no value changed. Which reading you want is a question about the content: side by side compares the years, stacked adds them up.

emph 3 dim 0 stands on the statement, not in a step. Q4 is what this is about and Q1 was only counted from February onwards; both hold the moment the figure is on screen. Written as a step, the first thing the room would see is four equal quarters, and the point would arrive on a keypress. All three prominence words – emph, dim, ghost – take column numbers here, counted from 0, and a number with no column behind it is refused. They are the same three that are classes on an element's line and verbs in a beat.

Columns laid flat the same six numbers, twice

1 2 3 4 5 6 the names go elsewhere Phishing Ransomware Credential stuffing DNS cache poisoning Supply-chain compromise Insider misuse the names are the axis

horizontal turns the columns on their side: the bars run right, the categories stack downwards. It stands as a single word on the bars line, exactly as stacked does. The strip of category names becomes a right-aligned column in the left margin, each word set by its own measured width so the right edges form a line, and the baseline stands vertically on the left instead of lying under the bars. The numbers are made up.

Flat, the proportions are easier to read. Every bar starts at the same vertical edge, and the eye compares lengths from one shared start line more reliably than heights over a shared floor: on the left you have to visit the tops of the columns in turn, on the right you read the ranking at a glance. A run of bars sorted downwards also looks like a ranking by itself.

And only flat is there room for the names at all. A category called “DNS cache poisoning” cannot be written under an upright column, so the left-hand figure carries numbers and the room looks them up in a legend that does not exist here. The second string is what makes it possible: a | in it splits on that instead of on spaces, so a label may be as many words as it needs. | already separates the cells of a table row and the names in a lanes list.

A frame to draw in

weaker 0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1 False positive rate True positive rate chance the one you want

A plot is a frame to draw in, not a chart library. It lays down gridlines, axis labels and the two axis titles, plus a conversion, so that roc@0.35 names a value in the plot's own units. That is resolved into an ordinary roc.left+n only once the block has been read, so a point may name a plot written further down.

w and h are counted in grid units, and a grid cell is not square. That is the trap. At unit=150x58 a plot … w 1.9 h 1.5 comes out 285 by 87 pixels: the two numbers are a quarter apart, the picture more than three times. aspect W:H states the proportion the reader actually sees and lets the build work the missing number out. This ROC curve is therefore written aspect 1:1 and comes out square, as two axes carrying the same unit should – the chance diagonal runs at 45 degrees, the only slope at which it says what it is called. 4:3, 1:1 or a single number (that many wide to one tall) are all allowed; w, h and aspect together is an error, because two of the three can contradict each other. The same word and the same rule apply on bars.

The curves are ordinary edges. .smooth draws the same waypoints as a curve running through them instead of as straight segments – an interpolating spline, so a waypoint stays exactly where it was written. The skew warning stays quiet here, its premise not holding: on a curve two nearly level points are the shape rather than two ends that missed each other.

“weaker” is an edge label beside the line, and the ground travels with it. A fill class on an edge draws a ground behind the label; without a side top, side bottom, side left or side right it stays on the line and knocks it out, which is what the flowchart further down does with “yes” and “no”. With one of them it moves clear and takes the ground along. For the name of a curve that is the only choice: on the line it would knock out exactly what it names. The ground still has work to do, because the diagonal and two gridlines run under the curve.

The word is short, and that is not a matter of taste here. The label is moved clear along the normal at the middle of the curve, but the curve goes on climbing, so a long label runs back into its own line at both ends instead of staying beside it. Beside a horizontal or vertical edge the question does not arise, and there a label may be as long as it needs to be.

One size, two frames two plots that can be compared

0 2 4 6 8 0 2 4 6 8 week alerts, site A 0 2 4 6 8 0 2 4 6 8 week alerts, site B

same as on a plot or bars line copies the whole frame. The right-hand plot writes no size of its own but points at the left one, so the two figures match to the pixel. Two figures meant to be compared have to be ones the eye can lay over each other; two frames a hair apart cannot do that.

The copy happens as the line is read, not at layout time – unlike a box's. Gridlines, axis labels and columns are placed from w and h the moment the line is read, so a size arriving later would move the frame and leave everything in it standing. The statement being copied from has to stand above the one copying it, and the build names what went wrong: a name that appears further down, one pointing at something other than a plot or bars, or one that is not in the block at all. same as beside w, h or aspect is an error, and so is same as on a series of line, a series drawing in a frame it does not lay.

Frames of one size are not yet one scale. x and y stand on each plot line for themselves, and nothing checks that two frames carry the same ranges – above they are written out twice, and that is the place to re-read before handing the slide over. bars has no range to write at all: every bars statement scales to its own highest value, so two frames of one size can hold columns that cannot be compared.

A raster does not follow the theme

a raster keeps its own coloursin every theme

Cycle the themes with A and the raster image stays as it is, while boxes, arrows and vector drawings re-colour. Pixels cost that; a vector drawing does not.

Four arrangements

The road straight down a flowchart

no yes yes no Packet arrives Known flow? Rule permits? Forward Forward,no rule check Drop state table,per five-tuple

The diamond is the outline a room needs no explanation for. It learned it at school: a question is asked here, and it goes on in two ways. What that costs is room. The widest strip a diamond offers is half its width by half its height, so the build sizes it at twice what a rectangle would need – two or three words, with the explanation in a note beside it, as on the left here. A whole sentence in a diamond would take four times the area of the boxes around it and become the figure.

The four labels sit on the line, and each one says so on its own tail. A fill class on an edge draws a ground behind the label; with no side top, side bottom, side left or side right beside it, the label stays on the line and knocks it out behind itself. That is the right form for a word that names the line – “yes”, “no”, a port number, a message type – the way a street sign belongs to the street and the street runs past it either side. A sentence describing what travels along the line belongs beside it: the swimlanes next door do that, and the ROC curves above take the ground along when they do. Mixing the two in one figure means the room has to sort each label before it can read any of them, so everything here is on the line.

Three roles, one incident a swimlane

same sender User SOC IT ops Phishing mailreported Triage Who elsegot it? Sender blocked

The bands are equal, their contents are not, and that is why they are no container. A container measures itself against what it holds, so three bands with different numbers of boxes would come out different lengths at both ends – the one thing a swimlane diagram must not say. lanes lays the frame, divides it into bands of equal height and writes the names turned on end in front of the left edge; the bands are .clear so that everything in them reads over them. It needs no time axis: the reading direction is the axis.

Every hand-off changes band, and .elbow is the routing for it. The class draws two waypoints itself – a rail halfway across the gap, on the axis the two ends are further apart on – instead of the same double bend written out by hand on every edge. A straight line would do something else: it would run diagonally through a band it never enters, and the room reads that as involvement.

The one edge label sits beside the line, not on it. “same sender” describes what travels along the line, and a sentence with a rule through the middle of it is read as two fragments before it is read as a sentence. side top lifts it over the line; on a vertical edge it would be side left and side right, and which pair applies is known only once the edge has been routed – so the wrong pair is a warning at build time rather than an error at parse time. The label is moved clear by what it measures across the line: beside a horizontal edge its height, beside a vertical one its width, there with a margin, because a gap across a line of type needs more air than one above it. This label needs no ground: there is nothing but band under it. What a ground does, and how large it may be, is at the ROC curves above.

Leaves first, and the brackets follow a tree

what A is answerable for www.example.org mail.example.org shop.example.com vpn.example.com Issuing CA A Issuing CA B Root CA

A tree is built from the leaves. They are the fixed points, and every level above stands between its own children with an offset upwards. Written the other way round the compiler copes – it reads the whole block and resolves the dependencies in whatever order works out, not in line order – but the tool you then reach for does not: align x middle rt, i1, i2 hands the first named element's coordinate to the rest, so it would not put the root over its children but stack both children on the root's centre line.

The brackets are the same word six times. .elbow leaves one end on the axis the two are further apart on, runs a rail halfway across the gap and arrives on the same axis; both attachment points are forced onto that axis, whatever the automatic choice would otherwise have taken. The rail is measured between the two elements' facing edges, not between their centres, so it lies on one line for both children of an issuer and the pair reads as one bracket rather than as two connectors. By hand that would be twelve waypoints, recomputed every time a level changes its spacing. Put the rail somewhere else with via; both on one line is an error. .elbow shares a slot with .smooth: how a line is drawn is a question with exactly one answer.

The dashed box stands around the whole set before the set is assembled. It is written into the same beat as the issuers (show @issuers, scope), though its other two members arrive a beat later. Without the written show the usual rule applies: an outline is only as visible as its members and fits itself to the ones you can see, so it would first have grown around the issuer alone and then opened downwards. Naming it gets you both the visibility and the full extent. That is what the exception is for, and it is expressly not for the ordinary case.

One line per row a table

Attack Layer Countermeasure ARP spoofing 2 Dynamic ARP Inspection SYN flooding 4 SYN cookies DNS spoofing 7 DNSSEC TLS stripping 7 HSTS

Five rows by three columns is fifteen boxes, each with its own name, width and placement, and a below chain to re-aim whenever a row is inserted. table writes them: the heading is one string split on |, the data rows are the bare strings under it, col gives a width per column and row the height of one row. The attribute tail {.clear .bare .left} lands on the cells and not on the frame, which is what makes a table here a text block rather than a grid of little boxes. The rule under the heading is an ordinary edge between two coordinates, each half from the frame and half from the first cell.

Every cell carries two generated tags, @t-row-N and @t-col-N. So a row is one beat and a column is one beat, one line of source each – where otherwise every beat would carry three cell names to keep in step with the table by hand. Row 0 is the heading, so count from 1 when you mean data.

The last beat is the one that reaches the handout. A figure that lights one row after another and then stops comes out of the printer with its last row glowing, reporting a moment in the talk rather than the table. A fourth beat here takes the emphasis off again and tints the countermeasures column instead – the picture that says something without a talk around it. That it costs a beat is why the prominence verbs need no such thing: prominence a step sets is an act in the talk, and print takes its prominence from the opening beat. Prominence on an element's own line describes the drawing, and reaches the handout.

A protocol down the page a sequence

on the device, over CTAP click "Create passkey" request registration options registration options CTAP authenticatorMakeCredential prompt: PIN or biometric user verified locally attestation object attestationObject + clientDataJSON verify signature · check origin User Browser Authenticator Relying Party 1 2 3 challenge · rp.id · user.id · algs 4 clientDataHash · rp.id · user · algs CTAP runs over USB, NFC or BLE 5 6 generate key pairbind to SHA-256(rp.id)store privately · emit publicly 7 authData (public key, cred ID) · signature 8 clientDataJSON carries challenge · origin 9 the challenge is the freshness

A protocol is the drawing a lecture asks for again and again, and the one that is hardest to change written out by hand. Written out, every message carries its own y coordinate: inserting one in the middle means moving everything under it, renumbering all of them and re-guessing how far each lifeline runs – counted on this very figure, thirteen written lines for one inserted message. And a note box taller than the guessed spacing cuts silently into the label beneath it.

sequence therefore owns exactly one thing: the vertical rhythm. Every entry states how tall it is – a message as tall as its label, a note as tall as its text – and the statement stacks them. A box pushes down what stands under it, and an inserted line is an inserted line. Across, the statement measures itself the same way: all heads are as wide as the widest label, so a row of equal participants does not stand there ragged. w, header and space are overrides nobody normally writes.

A message may also name itself, and the name goes in front. tunnel c -- s "…" – in exactly the slot an edge carries its name in, before the first endpoint. It is worth doing on the lines something else points at: a generated name like x-4 counts messages and moves the moment one is added above it, where a written name stays put. Staying anonymous costs nothing, and most messages do.

Everything else it answers by keeping a name on every part, not by adding words. Each head keeps the name its actor line gives it; each lifeline is <actor>-life, each message wa-N (counted from 0, so the number drawn is N+1), its number wa-n-N, its smaller second line wa-sub-N, each note wa-note-N. Plus tags for the sets: @wa-msg-N for one message with its number and second line, @wa-msgs for all of them, @au-msgs for all that touch the authenticator, @wa-notes, @wa-actors, @wa-lives. The brace and the handwritten annotation above are therefore ordinary lines hung off wa-3 and wa-2, and the statement knows nothing about either.

There is no alt / else. Enclosing a group of messages and naming it is what container … pad n already draws, and two of the nine figures in the measured corpus wanted it. A word that freezes with the first release deserves more cases than that.

What else a message can be

this is the payload CONNECT server:443 TCP handshake note the destination 200 Connection established encrypted tunnel, end to end Client Proxy Server host, time, byte counts the proxy forwards bytesand reads none of them

Four tokens, and none of them is an arrow style of its own. -> and <- are the same message written from the sender's end and from the receiver's: write the reply as c <- p and both lines name the client first, so the source reads as a column instead of zig-zagging. -- is a line with no head, a relation with no direction, and <-> carries one at each end – a there-and-back caught in one line. There is no word for “dashed”; {.dashed} does that, a message line's attribute tail being an edge's, because a message is an edge.

The token states the head, not a class. Each of the four sets exactly one of the three states – no head, one, one at each end – so the same thing is never said twice on one line: {.no-head} beside a -> is an error rather than a silent contradiction. Inside a beat the reverse holds, and there the class is the only spelling, because a token cannot be run again.

A self-message is the usual way to put a local action into the sequence, and it loops out of the lifeline and back in. Its label stands beside the loop, its second line under it. A note between two names sits midway between their lifelines and is as wide as its own text – not as wide as the span, or three words become a banner. It breaks at \n, so a three-line note stays a note.

space on an entry line is the air above that one band. The tunnel at the bottom carries space 0.9 and stands visibly apart from the setup above it; two or three such gaps break a long exchange into phases a room can hold. A blank line in the source does not do this: the statement reads through blank lines, so the source may be grouped however it reads best. On an actor line space is an error, there being no band above the heads.

Every message label brings its own ground. A lifeline crosses every label in the figure, so the ground is drawn from the start and the dashed line is knocked out behind the words. {.clear} takes it away, {.tone-2} colours it. The smaller second line gets the same ground; the numbers on the left get none, standing outside the frame and crossing nothing.

unnumbered takes the column of numbers away. It is there otherwise because renumbering by hand is exactly the work the statement removes, and because the number drawn and the index in the tag are the same number: @x-msg-3 is the arrow the room reads as 4. Where an exchange is short enough that nobody points at a number, the column is just paper.

A figure that plays itself autoplay and cycle

request fingerprint Crawler Web site DetectorDetected

autoplay=1400 walks this figure's beats by itself, and cycle starts again at the end. One delay in milliseconds, the same for every beat. A cover figure moving while the room settles is the case it was built for; it stands on an ordinary slide here, because nothing about it is tied to a cover.

It calls the same advance the space bar does. A counter of its own would have let the drawing and the beat counter drift apart, and the next keypress would have jumped. Because it is the counter, the speaker window follows through the ordinary sync and the freeze gate applies. cycle rewinds through the same counter, so the speaker window follows the rewind too.

The first keypress, click or scroll stops it for good. Whoever has touched the deck has taken over, and a timer running on underneath them is worse than none. For the same reason it does not start at all on a slide that is already half revealed: half revealed means somebody left it that way.

Between 200 ms and 60 s, and outside that refused rather than clamped. Under 200 ms the room reads no beat; over a minute a “moving” figure is a still one that changes while nobody is watching. A clamped number is a number nobody wrote.