// Simple numbering for non-book documents #let equation-numbering = "(1)" #let callout-numbering = "1" #let subfloat-numbering(n-super, subfloat-idx) = { numbering("1a", n-super, subfloat-idx) } // Theorem configuration for theorion // Simple numbering for non-book documents (no heading inheritance) #let theorem-inherited-levels = 0 // Theorem numbering format (can be overridden by extensions for appendix support) // This function returns the numbering pattern to use #let theorem-numbering(loc) = "1.1" // Default theorem render function #let theorem-render(prefix: none, title: "", full-title: auto, body) = { if full-title != "" and full-title != auto and full-title != none { strong[#full-title.] h(0.5em) } body } // Some definitions presupposed by pandoc's typst output. #let content-to-string(content) = { if content.has("text") { content.text } else if content.has("children") { content.children.map(content-to-string).join("") } else if content.has("body") { content-to-string(content.body) } else if content == [ ] { " " } } #let horizontalrule = line(start: (25%,0%), end: (75%,0%)) #let endnote(num, contents) = [ #stack(dir: ltr, spacing: 3pt, super[#num], contents) ] #show terms.item: it => block(breakable: false)[ #text(weight: "bold")[#it.term] #block(inset: (left: 1.5em, top: -0.4em))[#it.description] ] // Some quarto-specific definitions. #show raw.where(block: true): set block( fill: luma(230), width: 100%, inset: 8pt, radius: 2pt ) #let block_with_new_content(old_block, new_content) = { let fields = old_block.fields() let _ = fields.remove("body") if fields.at("below", default: none) != none { // TODO: this is a hack because below is a "synthesized element" // according to the experts in the typst discord... fields.below = fields.below.abs } block.with(..fields)(new_content) } #let empty(v) = { if type(v) == str { // two dollar signs here because we're technically inside // a Pandoc template :grimace: v.matches(regex("^\\s*$")).at(0, default: none) != none } else if type(v) == content { if v.at("text", default: none) != none { return empty(v.text) } for child in v.at("children", default: ()) { if not empty(child) { return false } } return true } } // Subfloats // This is a technique that we adapted from https://github.com/tingerrr/subpar/ #let quartosubfloatcounter = counter("quartosubfloatcounter") #let quarto_super( kind: str, caption: none, label: none, supplement: str, position: none, subcapnumbering: "(a)", body, ) = { context { let figcounter = counter(figure.where(kind: kind)) let n-super = figcounter.get().first() + 1 set figure.caption(position: position) [#figure( kind: kind, supplement: supplement, caption: caption, { show figure.where(kind: kind): set figure(numbering: _ => { let subfloat-idx = quartosubfloatcounter.get().first() + 1 subfloat-numbering(n-super, subfloat-idx) }) show figure.where(kind: kind): set figure.caption(position: position) show figure: it => { let num = numbering(subcapnumbering, n-super, quartosubfloatcounter.get().first() + 1) show figure.caption: it => block({ num.slice(2) // I don't understand why the numbering contains output that it really shouldn't, but this fixes it shrug? [ ] it.body }) quartosubfloatcounter.step() it counter(figure.where(kind: it.kind)).update(n => n - 1) } quartosubfloatcounter.update(0) body } )#label] } } // callout rendering // this is a figure show rule because callouts are crossreferenceable #show figure: it => { if type(it.kind) != str { return it } let kind_match = it.kind.matches(regex("^quarto-callout-(.*)")).at(0, default: none) if kind_match == none { return it } let kind = kind_match.captures.at(0, default: "other") kind = upper(kind.first()) + kind.slice(1) // now we pull apart the callout and reassemble it with the crossref name and counter // when we cleanup pandoc's emitted code to avoid spaces this will have to change let old_callout = it.body.children.at(1).body.children.at(1) let old_title_block = old_callout.body.children.at(0) let children = old_title_block.body.body.children let old_title = if children.len() == 1 { children.at(0) // no icon: title at index 0 } else { children.at(1) // with icon: title at index 1 } // TODO use custom separator if available // Use the figure's counter display which handles chapter-based numbering // (when numbering is a function that includes the heading counter) let callout_num = it.counter.display(it.numbering) let new_title = if empty(old_title) { [#kind #callout_num] } else { [#kind #callout_num: #old_title] } let new_title_block = block_with_new_content( old_title_block, block_with_new_content( old_title_block.body, if children.len() == 1 { new_title // no icon: just the title } else { children.at(0) + new_title // with icon: preserve icon block + new title })) align(left, block_with_new_content(old_callout, block(below: 0pt, new_title_block) + old_callout.body.children.at(1))) } // 2023-10-09: #fa-icon("fa-info") is not working, so we'll eval "#fa-info()" instead #let callout(body: [], title: "Callout", background_color: rgb("#dddddd"), icon: none, icon_color: black, body_background_color: white) = { block( breakable: false, fill: background_color, stroke: (paint: icon_color, thickness: 0.5pt, cap: "round"), width: 100%, radius: 2pt, block( inset: 1pt, width: 100%, below: 0pt, block( fill: background_color, width: 100%, inset: 8pt)[#if icon != none [#text(icon_color, weight: 900)[#icon] ]#title]) + if(body != []){ block( inset: 1pt, width: 100%, block(fill: body_background_color, width: 100%, inset: 8pt, body)) } ) } // arxivai — Quarto Typst template partial. // Replaces Quarto's default `article()` with the arxivai preprint layout. // Both packages are importable from raw ```{=typst}``` blocks in the body: // #arxivai.operation-box(...) #arxivai.app-figure(...) #lettreai.badge(...) #import "lettreai.typ" as lettreai #import "arxivai.typ" as arxivai // --------------------------------------------------------------------------- // Re-theme Quarto's automatic callouts (same contract as lettreai: block // nesting kept structurally identical to Quarto's default so the crossref // figure show rule in definitions.typ keeps working). // --------------------------------------------------------------------------- #let callout( body: [], title: "Callout", background_color: rgb("#dddddd"), icon: none, icon_color: black, body_background_color: white, ) = { let accent = if icon_color == black { lettreai.colors.oxford-blue } else { icon_color } block( breakable: false, fill: lettreai.tint(accent, 0.94), stroke: (left: 3pt + accent, rest: 0.5pt + lettreai.tint(accent, 0.5)), width: 100%, radius: 3pt, block( inset: 1pt, width: 100%, below: 0pt, block( fill: lettreai.tint(accent, 0.84), width: 100%, inset: 8pt, )[#if icon != none [#text(accent, weight: 900)[#icon] ]#text(fill: lettreai.shade(accent, 0.25), weight: 700)[#title]]) + if (body != []) { block( inset: 1pt, width: 100%, block(fill: body_background_color, width: 100%, inset: 8pt, body)) } ) } // --------------------------------------------------------------------------- // arXiv preprint article — same signature contract as Quarto's default, // extended with keywords and running-title. // --------------------------------------------------------------------------- #let article( title: none, subtitle: none, authors: none, keywords: (), running-title: none, book: false, date: none, abstract-title: none, abstract: none, thanks: none, cols: 1, lang: "en", region: "US", font: none, fontsize: 10.5pt, title-size: 1.7em, subtitle-size: 1.15em, heading-family: none, heading-weight: "bold", heading-style: "normal", heading-color: black, heading-line-height: 0.65em, mathfont: none, codefont: none, linestretch: 1, sectionnumbering: none, linkcolor: none, citecolor: none, filecolor: none, toc: false, toc_title: none, toc_depth: none, toc_indent: 1.5em, doc, ) = { // PDF metadata. set document(title: title) set document( author: authors.map(a => lettreai.to-string(a.name)).join(", ", last: " & "), ) if authors != none and authors != () set document( keywords: keywords.map(k => lettreai.to-string(k)), ) if keywords != none and keywords != () set par(justify: true, leading: linestretch * 0.65em) set text(lang: lang, region: region, size: fontsize) show math.equation: set text(font: mathfont) if mathfont != none set heading(numbering: sectionnumbering) // Running header + footer; book mode gets chapter-aware heads and the // O'Reilly outer-margin geometry. let rt = if running-title != none { running-title } else if title != none { title } else { [] } set page( header: if book { arxivai.book-header() } else { arxivai.arxiv-header(rt) }, footer: if book { arxivai.book-footer() } else { arxivai.arxiv-footer() }, ) set page(margin: arxivai.book-margin) if book // Resolve fonts: explicit Quarto fonts win, else theme defaults. let resolved-font = if font != none { font } else { lettreai.body-font } let resolved-code = if codefont != none { codefont } else { lettreai.mono-font } let resolved-heading-color = if heading-color != black { heading-color } else { lettreai.colors.oxford-blue } let resolved-link = if linkcolor != none { rgb(lettreai.to-string(linkcolor)) } else { lettreai.colors.oxford-blue } // Paint everything with the shared theme, then the figure rules. show: lettreai.theme-rules.with( fonts: resolved-font, code-font: resolved-code, heading-color: resolved-heading-color, link-color: resolved-link, ) show: arxivai.arxiv-figure-rules // Book chapter rule is the innermost show, so it transforms level-1 // headings FIRST (inner rules apply first), replacing them with chapter // openers before the theme's h1 rule could wrap them in a container. // Synthetic non-outlined headings (e.g. the outline's own title) are // excluded inside book-heading-rules. show: doc2 => if book { arxivai.book-heading-rules(doc2) } else { doc2 } show ref: set text(fill: rgb(lettreai.to-string(citecolor))) if citecolor != none // Preprint front matter. arxivai.arxiv-title-block( title: title, subtitle: subtitle, authors: authors, date: date, ) if abstract != none { arxivai.arxiv-abstract( abstract, abstract-title: if abstract-title == none { [Abstract] } else { abstract-title }, ) } arxivai.arxiv-keywords(keywords) // Book mode: the front matter is a title page of its own. if book { pagebreak(weak: true) } // Optional table of contents (its own page in book mode). if toc { block(above: 0.5em, below: 2em, lettreai.lettreai-outline( title: if toc_title == none { auto } else { toc_title }, depth: toc_depth, indent: toc_indent, )) if book { pagebreak(weak: true) } } if cols > 1 { columns(cols, doc) } else { doc } } #import "@preview/fontawesome:0.5.0": * #let brand-color = (:) #let brand-color-background = (:) #let brand-logo = (:) #set page( paper: "a4", margin: (x: 2.4cm,y: 2.6cm,), numbering: "1", columns: 1, ) #show: doc => article( title: [The Cone Geometry of ObjID 126 (Delos): Latitude from the Engraved Network], subtitle: [A Geometrically Explicit Estimation with Stated Assumptions and Defendable Confidence Intervals], authors: ( ( name: [Gerd Graßhoff], affiliation: [Humboldt-Universität zu Berlin, Deutsches Museum], email: [gerd.grasshoff\@hu-berlin.de], orcid: [0000-0002-4450-357X] ), ), keywords: ([conic sundials],[3D photogrammetry],[Delos],[ObjID 126],[angular unit calibration],[epsilon-free latitude recovery],[profile likelihood],), running-title: [Cone Geometry of ObjID 126 (Delos)], abstract: [We analyse the high-resolution 3D photogrammetric surface model of the exceptionally well-preserved ancient Hellenistic conic sundial ObjID 126 from the Archaeological Museum of Delos. The artifact preserves eleven engraved hour lines, all three seasonal day-lines (equinox and both solstices), and 31 verified curve-to-curve intersections with day-circle fit residuals of $0.35$--$0.42 thin upright(m m)$ RMS. We demonstrate that the engraved hour network carries a uniform $+ 5.27 % plus.minus 0.34 %$ angular-unit scale distortion, which is isolated and calibrated against the theoretical equinoctial design invariant $H_E = 90^compose$. By pairing each solstitial day-circle's placement with its calibrated half-day hour arc, we recover the intended latitude independently of epoch obliquity. A joint measurement-level bootstrap and hierarchical profile-likelihood estimation over four independent construction witnesses (cone axis, upper front face, summer division, and winter division) yields a defended design latitude of $hat(phi) = 38.01^compose$ ($68 %$ CI $\[37.32^compose\,38.68^compose\]$, artisan spread $tau = 1.26^compose$), corresponding to $s = 46\;54$ for $g = 60$, matching the Delos ($37.40^compose$) and Athens ($37.97^compose$) climate band. ], abstract-title: "Abstract", font: ("Source Sans 3",), sectionnumbering: "1.1", toc: true, toc_title: [Table of contents], toc_depth: 3, doc, ) #block[ #callout( body: [ Supplement S6 to the Ancient Sundials repository (Berlin Sundial Collaboration, ancient-sundials.lettre.ai). This draft documents a worked example for the object page of ObjID 126 (Delos). It is a preprint draft and has not been peer reviewed. Where a figure in the repository differs from a figure here, the repository, which is rebuilt from the current database, is authoritative. The register's consensus latitude for ObjID 126 is 37.97 degrees and this paper gives 38.01 degrees; the two values have not been reconciled. Their difference of 0.04 degrees lies well inside the 68 % interval stated here. ] , title: [ Supplement S6 ] , background_color: rgb("#dae6fb") , icon_color: rgb("#0758E5") , icon: fa-info() , body_background_color: white ) ] = Introduction: The Exceptional Delos Conic Dial Among the corpus of surviving ancient Greek sundials, Dialface ObjID 126, preserved in the Archaeological Museum of Delos, represents a masterwork of Hellenistic stonecutting and mathematical design @rinner2013delos@gibbs1976. The artifact preserves all primary features intact: eleven hour lines, three seasonal day-line circles, dressed upper and lower front planes, and 31 curve-to-curve intersections. The photogrammetric mesh fits the day-circles to within $0.35$--$0.42 thin upright(m m)$ RMS across up to 322 groove centreline points per curve. #arxivai.concept-box(title: [The research objective for ObjID 126])[ Because measurement noise on ObjID 126 is negligible ($< 0.4 " mm"$), the investigation is not limited by scan resolution. The scientific question is purely how much design information the engraved stone carries, and how to deduce its intended construction proportions without distortion. ] = Functional Relations of the Nodus-on-Axis Model Following the analytical framework of the keystone geometry paper @grasshoff2026conic, the instrument's features obey four exact relations: + #strong[\(R1) Day-Circle Axial Placement:] A noon shadow ray from the nodus at declination $delta$ strikes the cone at axial distance: #math.equation(block: true, numbering: equation-numbering, [ $ z\(delta\)= frac(d, 1 - tan alpha thin tan delta) . $ ]) #emph[Reading.] The axial distance $z\(delta\)$ from the apex equals the scale $d$ divided by $1 - tan alpha tan delta$, giving $ell_E = d$, $ell_S = d\/\(1 - x\)$, and $ell_W = d\/\(1 + x\)$ with $x = tan alpha tan epsilon$. + #strong[\(R2) Cone Cavity Geometry:] Each day-line circle has radius $r = z tan alpha$. Direct unlabelled orthogonal distance regression over all 3,345 cavity points yields the cone half-angle $alpha = 34.30^compose plus.minus 0.08^compose$ (RMS $0.39 thin upright(m m)$). + #strong[\(R3) Hour Azimuths and Seasonal Hours:] Azimuths $theta_j$ about the polar axis are linear in the seasonal hour index $j$: #math.equation(block: true, numbering: equation-numbering, [ $ theta_j = theta_12 +\(j - 6\)thin frac(H\(delta\), 6)\,#h(2em) cos H\(delta\)= - tan phi thin tan delta . $ ]) #emph[Reading.] The azimuthal position of hour mark $j$ is linear in $\(j - 6\)$, with half-day span $H\(delta\)$ governed by $cos H = - tan phi tan delta$. + #strong[\(R4) The Equinoctial Design Invariant:] At the equinox ($delta = 0$), $H\(0\)= 90^compose$ at #emph[every] latitude $phi$. Because $H_E$ carries zero latitude information, it serves as an absolute calibration standard for the artisan's engraved angular unit. = The Engraved Hour Network and Unit Calibration Regressing measured hour-point azimuths against the hour index $j$ reveals strictly linear behavior across all three day-lines (#ref(, supplement: [Figure])). #figure([ #box(image("fig_hourangles.png", width: 85.0%)) ], caption: figure.caption( position: bottom, [ Hour-point azimuths versus seasonal hour index on ObjID 126. The slopes yield the half-day arcs $H\(delta\)$. ]), kind: "quarto-float-fig", supplement: "Figure", ) The raw measured half-day arcs are: - #strong[Equinox Day-Line:] $H_E = 94.74^compose plus.minus 0.31^compose$ (Nominal: $90^compose$). - #strong[Summer Solstice:] $H_S = 115.38^compose plus.minus 0.23^compose$. - #strong[Winter Solstice:] $H_W = 71.87^compose plus.minus 0.37^compose$. #arxivai.concept-box(title: [The 15-sigma angular unit distortion])[ The equinoctial arc $H_E$ exceeds its theoretical $90 degree$ design by $+5.27\% plus.minus 0.34\%$ ($15 sigma$). This is not noise: the entire network was engraved with an angular scale factor $c = 1.0527$. ] Taking the raw arcs at face value produces false latitude estimates: $H_S = 115.4^compose$ implies $phi = 44.3^compose$, while $H_W = 71.9^compose$ implies $phi = 35.3^compose$ --- a spurious $9^compose$ contradiction. Dividing all arcs by $c = H_E\/90^compose$ yields the calibrated arcs: $ tilde(H)_S = 109.60^compose plus.minus 0.41^compose\,#h(2em) tilde(H)_W = 68.27^compose plus.minus 0.41^compose . $ #figure([ #box(image("fig_division.png", width: 85.0%)) ], caption: figure.caption( position: bottom, [ Measured half-day arcs (dotted: raw; solid: unit-calibrated) compared against theoretical curves $H\(phi\)$. ]), kind: "quarto-float-fig", supplement: "Figure", ) = $epsilon$-Free Latitude Estimation Pairing each solstitial circle's radial placement $x = tan alpha tan delta'$ with its calibrated half-day arc $cos tilde(H) = - tan phi tan delta'$ cancels the effective declination $tan delta'$: #math.equation(block: true, numbering: equation-numbering, [ $ tan phi = tan alpha thin frac(\|cos tilde(H)\|, \|x\|) . $ ]) #emph[Reading.] The latitude is recovered per solstitial circle without assuming the epoch obliquity $epsilon$. This yields: - Summer witness: $phi_S = 36.49^compose plus.minus 0.62^compose$. - Winter witness: $phi_W = 37.07^compose plus.minus 0.85^compose$. #ref(, supplement: [Figure]) plots all four independent witnesses against the ancient klimata ruler. #figure([ #box(image("fig_witnesses.png", width: 95.0%)) ], caption: figure.caption( position: bottom, [ All four latitude witnesses for ObjID 126 against the Ptolemaic klimata ruler. Grey: uncalibrated arcs (spurious spread). Red: joint consensus. ]), kind: "quarto-float-fig", supplement: "Figure", ) = Joint Consensus and Profile Likelihood Combining the four witnesses (cone axis $39.66^compose$, upper front face $38.53^compose$, summer division $36.49^compose$, and winter division $37.07^compose$) via a joint measurement bootstrap ($B = 500$) and a random-effects hierarchical model ($W_i = phi + b_i + e_i$, with $e tilde.op cal(N)\(0\,hat(Sigma)\)$ and $b_i tilde.op cal(N)\(0\,tau^2\)$): $ hat(phi) = 38.01^compose\,quad 68 % med upright("CI ")\[37.32^compose\,38.68^compose\]\,quad 95 % med upright("CI ")\[36.34^compose\,39.61^compose\]\,quad tau = 1.26^compose . $ #emph[Reading.] In the shadow-table notation ($g = 60$), the consensus latitude is $s = 46\;54$ ($68 %$ range $45\;48$--$48\;01$). The $68 %$ confidence interval uniquely admits the historical entries for #strong[Delos] ($s = 45\;52\,phi = 37.40^compose$) and #strong[Athens] ($s = 46\;49\,phi = 37.97^compose$). #figure([ #box(image("fig_profile.png", width: 85.0%)) ], caption: figure.caption( position: bottom, [ Profile log-likelihood of the design latitude $phi$ with $68 %$ and $95 %$ intervals. ]), kind: "quarto-float-fig", supplement: "Figure", ) = Defended Construction Proportions #ref(, supplement: [Table]) provides the complete proportional fingerprint of ObjID 126. #figure([ #table( columns: (33.33%, 33.33%, 33.33%), align: (left,left,left,), table.header([Construction Attribute], [Defended Value / Proportion], [Ratio Compatibility Interval],), table.hline(), [#strong[Klima Ratio] $s : g$], [$46\;54 : 60$ ($68 %$ CI: $45\;48$--$48\;01$)], [Delos ($45\;52$) and Athens ($46\;49$)], [#strong[Tangent Latitude] $tan phi$], [$0.782 plus.minus 0.019$], [$\[upright(bold(7 : 9))\,upright(bold(11 : 14))\,upright(bold(10 : 13))\,upright(bold(4 : 5))\]$], [#strong[Cone Opening] $rho = tan alpha$], [$0.685 plus.minus 0.004$ ($alpha = 34.40^compose plus.minus 0.09^compose$)], [$\[upright(bold(11 : 16))\,9 : 13\]$\; distinct from nominal $2 : 3$], [#strong[Nodus Distance] $d$], [$101.3 plus.minus 0.4 thin upright(m m)$], [Scale unit], [#strong[Winter Noon Mark] $ell_W\/d$], [$0.750 plus.minus 0.008$], [$\[upright(bold(3 : 4))\]$ ($0.2 sigma$)], [#strong[Noon Mark Ratio]], [$ell_W : ell_E : ell_S = 0.750 : 1 : 1.453$], [Workshop series], [#strong[Workshop Rule] $x$], [$0.319 plus.minus 0.005$], [Near $1 : 3$ ($2.8 sigma$)], [#strong[Block Aspect Ratio]], [$226 thin upright(m m) : 229 thin upright(m m)$], [$\[upright(bold(1 : 1))\]$ (Square block)], [#strong[Upper Front Face]], [$tan\(90^compose - phi\)= 60 : 75.4$ ($s = 47\;46$)], [Built-in stone klima], ) ], caption: figure.caption( position: top, [ Complete defended proportional attributes for Dialface ObjID 126 (Delos). ]), kind: "quarto-float-tbl", supplement: "Table", ) = Conclusion Dialface ObjID 126 from Delos provides definitive material proof of Hellenistic proportional sundial construction. By identifying and correcting the $+ 5.27 %$ angular unit distortion through the equinoctial design invariant, and combining four independent construction witnesses into a rigorous profile-likelihood consensus, the dial is proven to have been designed specifically for the Delos/Athens klima band ($hat(phi) = 38.01^compose plus.minus 0.68^compose$). #heading(level: 1, numbering: none)[References] #bibliography(("references.bib"))