diff --git a/docs/notes.typ b/docs/notes.typ index 3b783eb..3c4b72e 100644 --- a/docs/notes.typ +++ b/docs/notes.typ @@ -5,13 +5,15 @@ /// - color (color): The note's color /// - shape (str): The note's shape (see @@SHAPES for accepted values) /// - aligned (bool): True if the note is aligned with another note, in which case `side` must be `"over"`, false otherwise +/// - allow-overlap (bool): If set to `false`, the note will try to reserve space in the column to avoid overlapping with neighboring participants. If set to `true`, the not will overlap other participants #let _note( side, content, pos: none, color: rgb("#FEFFDD"), shape: "default", - aligned: false + aligned: false, + allow-overlap: true ) = {} /// Accepted values for `shape` argument of @@_note() diff --git a/manual.pdf b/manual.pdf index 2875d03..8c067ce 100644 Binary files a/manual.pdf and b/manual.pdf differ diff --git a/src/core/renderer.typ b/src/core/renderer.typ index 1b5418c..fde03d0 100644 --- a/src/core/renderer.typ +++ b/src/core/renderer.typ @@ -82,12 +82,12 @@ let (p1, p2) = (none, none) let cell = none if note.side == "left" { - p1 = "[" + p1 = note.pos2 p2 = note.pos cell = get-note-box(note) } else if note.side == "right" { p1 = note.pos - p2 = "]" + p2 = note.pos2 cell = get-note-box(note) } else if note.side == "over" and note.aligned-with != none { let box1 = get-note-box(note) diff --git a/src/core/setup.typ b/src/core/setup.typ index 3d8f7fe..81b2a74 100644 --- a/src/core/setup.typ +++ b/src/core/setup.typ @@ -126,8 +126,8 @@ "linked", note.pos == none and note.side != "across" ) + let names = ctx.participants.map(p => p.name) if note.pos == none and note.side != "across" { - let names = ctx.participants.map(p => p.name) let i1 = names.position(n => n == ctx.last-seq.p1) let i2 = names.position(n => n == ctx.last-seq.p2) let pars = ( @@ -150,10 +150,26 @@ n.aligned-with = note ctx.elmts.at(ctx.last-note.i) = n } - if note.side == "left" { - ctx.linked.push("[") - } else if note.side == "right" { - ctx.linked.push("]") + + if note.side in ("left", "right") { + let i = names.position(n => n == note.pos) + let pos2 = note.pos + if note.side == "left" { + if i <= 0 or note.allow-overlap { + ctx.linked.push("[") + pos2 = "[" + } else { + pos2 = names.at(i - 1) + } + } else if note.side == "right" { + if i >= names.len() - 1 or note.allow-overlap { + ctx.linked.push("]") + pos2 = "]" + } else { + pos2 = names.at(i + 1) + } + } + note.insert("pos2", pos2) } let pars = none diff --git a/src/note.typ b/src/note.typ index 948b8d5..01e6b31 100644 --- a/src/note.typ +++ b/src/note.typ @@ -14,7 +14,15 @@ "hex" ) -#let _note(side, content, pos: none, color: COL-NOTE, shape: "default", aligned: false) = { +#let _note( + side, + content, + pos: none, + color: COL-NOTE, + shape: "default", + aligned: false, + allow-overlap: true +) = { if side == "over" { if pos == none { panic("Pos cannot be none with side 'over'") @@ -37,6 +45,7 @@ color: color, shape: shape, aligned: aligned, - aligned-with: none + aligned-with: none, + allow-overlap: allow-overlap ),) }