From 1a1e8618e0759f39d57a19bdada703f19d9a8077 Mon Sep 17 00:00:00 2001 From: Nikolay Malkovsky Date: Thu, 2 Jul 2026 19:41:10 +0300 Subject: [PATCH 1/2] Description of pixie rmq --- academic/AGENTS.md | 26 +- .../acm/ACM-Reference-Format.bst | 3081 ------- .../quarto-journals/acm/_extension.yml | 44 - .../acm/acm-sigchi-proceedings.csl | 186 - .../quarto-journals/acm/acmart.cls | 3219 ------- .../quarto-journals/acm/acmart.dtx | 7990 ----------------- .../quarto-journals/acm/acmauthoryear.bbx | 900 -- .../quarto-journals/acm/acmauthoryear.cbx | 219 - .../quarto-journals/acm/acmdatamodel.dbx | 33 - .../quarto-journals/acm/acmnumeric.bbx | 885 -- .../quarto-journals/acm/acmnumeric.cbx | 5 - .../quarto-journals/acm/add-bibliography.lua | 95 - .../_extensions/quarto-journals/acm/aft.cls | 644 -- .../association-for-computing-machinery.csl | 204 - .../quarto-journals/acm/build-acm-authors.lua | 0 .../quarto-journals/acm/color-text.lua | 46 - .../quarto-journals/acm/custom.scss | 7 - .../quarto-journals/acm/fancy-figure.lua | 74 - .../quarto-journals/acm/sample-franklin.png | Bin 95030 -> 0 bytes .../quarto-journals/acm/shortcodes.lua | 17 - .../_extensions/quarto-journals/acm/te.bst | 1518 ---- academic/_quarto.yml | 23 - academic/index.qmd | 30 - academic/notes/rmq/.gitignore | 2 + academic/notes/rmq/images/CartesianTree.png | Bin 0 -> 10762 bytes .../rmq/images/cartesian_tree_8_example.svg | 166 + .../images/cartesian_tree_8_example_bp.svg | 312 + .../prefix_suffix_mask_optimization.svg | 203 + .../rmq/images/rmq_hybrid_random_queries.png | Bin 0 -> 112843 bytes .../rmq_hybrid_random_queries_smoke.png | Bin 0 -> 112843 bytes .../rmq/images/sparse_table_rmq_demo.svg | 253 + ...ulative_covering_interval_optimization.svg | 166 + academic/notes/rmq/images/title_page.svg | 96 + .../notes/rmq/images/wide_segment_tree.svg | 193 + academic/notes/rmq/index.qmd | 643 ++ include/pixie/rmq/cartesian_hybrid_btree.h | 166 +- include/pixie/rmq/cartesian_rmm.h | 21 +- src/benchmarks/bench_rmq.cpp | 47 + src/tests/rmq_tests.cpp | 13 + 39 files changed, 2251 insertions(+), 19276 deletions(-) delete mode 100644 academic/_extensions/quarto-journals/acm/ACM-Reference-Format.bst delete mode 100644 academic/_extensions/quarto-journals/acm/_extension.yml delete mode 100644 academic/_extensions/quarto-journals/acm/acm-sigchi-proceedings.csl delete mode 100644 academic/_extensions/quarto-journals/acm/acmart.cls delete mode 100644 academic/_extensions/quarto-journals/acm/acmart.dtx delete mode 100644 academic/_extensions/quarto-journals/acm/acmauthoryear.bbx delete mode 100644 academic/_extensions/quarto-journals/acm/acmauthoryear.cbx delete mode 100644 academic/_extensions/quarto-journals/acm/acmdatamodel.dbx delete mode 100644 academic/_extensions/quarto-journals/acm/acmnumeric.bbx delete mode 100644 academic/_extensions/quarto-journals/acm/acmnumeric.cbx delete mode 100644 academic/_extensions/quarto-journals/acm/add-bibliography.lua delete mode 100644 academic/_extensions/quarto-journals/acm/aft.cls delete mode 100644 academic/_extensions/quarto-journals/acm/association-for-computing-machinery.csl delete mode 100644 academic/_extensions/quarto-journals/acm/build-acm-authors.lua delete mode 100644 academic/_extensions/quarto-journals/acm/color-text.lua delete mode 100644 academic/_extensions/quarto-journals/acm/custom.scss delete mode 100644 academic/_extensions/quarto-journals/acm/fancy-figure.lua delete mode 100644 academic/_extensions/quarto-journals/acm/sample-franklin.png delete mode 100644 academic/_extensions/quarto-journals/acm/shortcodes.lua delete mode 100644 academic/_extensions/quarto-journals/acm/te.bst delete mode 100644 academic/_quarto.yml delete mode 100644 academic/index.qmd create mode 100644 academic/notes/rmq/.gitignore create mode 100644 academic/notes/rmq/images/CartesianTree.png create mode 100644 academic/notes/rmq/images/cartesian_tree_8_example.svg create mode 100644 academic/notes/rmq/images/cartesian_tree_8_example_bp.svg create mode 100644 academic/notes/rmq/images/prefix_suffix_mask_optimization.svg create mode 100644 academic/notes/rmq/images/rmq_hybrid_random_queries.png create mode 100644 academic/notes/rmq/images/rmq_hybrid_random_queries_smoke.png create mode 100644 academic/notes/rmq/images/sparse_table_rmq_demo.svg create mode 100644 academic/notes/rmq/images/speculative_covering_interval_optimization.svg create mode 100644 academic/notes/rmq/images/title_page.svg create mode 100644 academic/notes/rmq/images/wide_segment_tree.svg create mode 100644 academic/notes/rmq/index.qmd diff --git a/academic/AGENTS.md b/academic/AGENTS.md index fd3257c..200c8ff 100644 --- a/academic/AGENTS.md +++ b/academic/AGENTS.md @@ -10,8 +10,6 @@ Materials are authored in [Quarto](https://quarto.org) for rich rendering (math, ``` academic/ -├── _quarto.yml # Book project (reports, presentations, notes) -├── index.qmd # Project landing page ├── _extensions/ # Shared Quarto extensions (ACM journal format) │ └── quarto-journals/acm/ # ACM acm-pdf extension ├── papers/ # Research papers (standalone Quarto projects) @@ -30,14 +28,14 @@ academic/ ## Architecture -### Two Quarto Project Types +Academic materials are standalone documents or standalone Quarto projects. +There is intentionally no root `academic/_quarto.yml` book project and no global +academic landing page. Render each note, report, presentation, or paper from its +own directory. The shared bibliography lives at `academic/bibliography/references.bib`. -The `academic/` directory contains **two kinds** of Quarto projects: - -1. **Book project** (`academic/_quarto.yml`, `type: book`): Covers reports, presentations, and notes. Rendered from the `academic/` root. -2. **Standalone paper projects** (`papers//_quarto.yml`, `type: default`): Each paper is its own Quarto project. Rendered from the paper's directory. - -Papers are standalone because Quarto book projects cannot resolve journal extensions (like `quarto-journals/acm`). Each paper directory has its own `_quarto.yml` and symlinks `_extensions/` to the shared extensions at `academic/_extensions/`. +Each paper directory has its own `_quarto.yml` and may symlink `_extensions/` to +the shared extension directory at `academic/_extensions/` when it needs the ACM +format. ### ACM Extension @@ -69,12 +67,12 @@ quarto render # Produces paper.pdf + paper.tex quarto preview # Live preview with reload ``` -### Book (reports, presentations, notes) +### Notes, Reports, and Presentations ```bash -cd academic/ -quarto render # Produces _book/ directory -quarto preview # Live preview +cd notes/rmq/ +quarto render index.qmd --to pdf +quarto preview index.qmd ``` ## Conventions @@ -130,5 +128,5 @@ The following works are foundational to Pixie's design: - Use `@AuthorYear` citation syntax in `.qmd` files - LaTeX code blocks should use `{cpp}` or `{latex}` language tags - Do not commit large binary files (>10MB) without explicit approval; consider using Git LFS -- Render papers from their own directory, NOT from the `academic/` book project root +- Render each material from its own directory, not from the `academic/` root - Do NOT put `@` symbols in BibTeX comments — BibTeX tries to parse them as entries diff --git a/academic/_extensions/quarto-journals/acm/ACM-Reference-Format.bst b/academic/_extensions/quarto-journals/acm/ACM-Reference-Format.bst deleted file mode 100644 index 7984639..0000000 --- a/academic/_extensions/quarto-journals/acm/ACM-Reference-Format.bst +++ /dev/null @@ -1,3081 +0,0 @@ -%%% -*-BibTeX-*- -%%% ==================================================================== -%%% @BibTeX-style-file{ -%%% author = "Nelson H. F. Beebe, Boris Veytsman and Gerald Murray", -%%% version = "2.1", -%%% acmart-version = "1.79", -%%% date = "14 June 2017", -%%% filename = "ACM-Reference-Format.bst", -%%% email = "borisv@lk.net, boris@varphi.com", -%%% codetable = "ISO/ASCII", -%%% keywords = "ACM Transactions bibliography style; BibTeX", -%%% license = "public domain", -%%% supported = "yes", -%%% abstract = "", -%%% } -%%% ==================================================================== - -%%% Revision history: see source in git - -ENTRY - { address - advisor - archiveprefix - author - booktitle - chapter - city - date - edition - editor - eprint - eprinttype - eprintclass - howpublished - institution - journal - key - location - month - note - number - organization - pages - primaryclass - publisher - school - series - title - type - volume - year - % New keys recognized - issue % UTAH: used in, e.g., ACM SIGSAM Bulletin and ACM Communications in Computer Algebra - articleno - eid - day % UTAH: needed for newspapers, weeklies, bi-weeklies - doi % UTAH - url % UTAH - bookpages % UTAH - numpages - lastaccessed % UTAH: used only for @Misc{...} - coden % UTAH - isbn % UTAH - isbn-13 % UTAH - issn % UTAH - lccn % UTAH - distinctURL % whether to print url if doi is present - } - {} - { label.year extra.label sort.year sort.label basic.label.year} - -INTEGERS { output.state before.all mid.sentence after.sentence after.block } - -INTEGERS { show-isbn-10-and-13 } % initialized below in begin.bib - -INTEGERS { nameptr namesleft numnames } - -INTEGERS { multiresult } - -INTEGERS { len } - -INTEGERS { last.extra.num } - -STRINGS { s t t.org u } - -STRINGS { last.label next.extra } - -STRINGS { p1 p2 p3 page.count } - - -FUNCTION { not } -{ - { #0 } - { #1 } - if$ -} - -FUNCTION { and } -{ - 'skip$ - { pop$ #0 } - if$ -} - -FUNCTION { or } -{ - { pop$ #1 } - 'skip$ - if$ -} - - -FUNCTION { dump.stack.1 } -{ - duplicate$ "STACK[top] = [" swap$ * "]" * warning$ -} - -FUNCTION { dump.stack.2 } -{ - duplicate$ "STACK[top ] = [" swap$ * "]" * warning$ - swap$ - duplicate$ "STACK[top-1] = [" swap$ * "]" * warning$ - swap$ -} - -FUNCTION { empty.or.unknown } -{ - %% Examine the top stack entry, and push 1 if it is empty, or - %% consists only of whitespace, or is a string beginning with two - %% queries (??), and otherwise, push 0. - %% - %% This function provides a replacement for empty$, with the - %% convenient feature that unknown values marked by two leading - %% queries are treated the same as missing values, and thus, do not - %% appear in the output .bbl file, and yet, their presence in .bib - %% file(s) serves to mark values which are temporarily missing, but - %% are expected to be filled in eventually once more data is - %% obtained. The TeX User Group and BibNet bibliography archives - %% make extensive use of this practice. - %% - %% An empty string cannot serve the same purpose, because just as in - %% statistics data processing, an unknown value is not the same as an - %% empty value. - %% - %% At entry: stack = ... top:[string] - %% At exit: stack = ... top:[0 or 1] - - duplicate$ empty$ - { pop$ #1 } - { #1 #2 substring$ "??" = } - if$ -} - -FUNCTION { empty.or.zero } -{ - %% Examine the top entry and push 1 if it is empty, or is zero - duplicate$ empty$ - { pop$ #1 } - { "0" = } - if$ -} - - -FUNCTION { writeln } -{ - %% In BibTeX style files, the sequences - %% - %% ... "one" "two" output - %% ... "one" "two" output.xxx - %% - %% ship "one" to the output file, possibly following by punctuation, - %% leaving the stack with - %% - %% ... "two" - %% - %% There is thus a one-string lag in output processing that must be - %% carefully handled to avoid duplicating a string in the output - %% file. Unless otherwise noted, all output.xxx functions leave - %% just one new string on the stack, and that model should be born - %% in mind when reading or writing function code. - %% - %% BibTeX's asynchronous buffering of output from strings from the - %% stack is confusing because newline$ bypasses the buffer. It - %% would have been so much easier for newline to be a character - %% rather than a state of the output-in-progress. - %% - %% The documentation in btxhak.dvi is WRONG: it says - %% - %% newline$ Writes onto the bbl file what's accumulated in the - %% output buffer. It writes a blank line if and only - %% if the output buffer is empty. Since write$ does - %% reasonable line breaking, you should use this - %% function only when you want a blank line or an - %% explicit line break. - %% - %% write$ Pops the top (string) literal and writes it on the - %% output buffer (which will result in stuff being - %% written onto the bbl file when the buffer fills - %% up). - %% - %% Examination of the BibTeX source code shows that write$ does - %% indeed behave as claimed, but newline$ sends a newline character - %% directly to the output file, leaving the stack unchanged. The - %% first line "Writes onto ... buffer." is therefore wrong. - %% - %% The original BibTeX style files almost always use "write$ newline$" - %% in that order, so it makes sense to hide that pair in a private - %% function like this one, named after a statement in Pascal, - %% the programming language embedded in the BibTeX Web program. - - write$ % output top-of-stack string - newline$ % immediate write of newline (not via stack) -} - -FUNCTION { init.state.consts } -{ - #0 'before.all := - #1 'mid.sentence := - #2 'after.sentence := - #3 'after.block := -} - -FUNCTION { output.nonnull } -{ % Stack in: ... R S T Stack out: ... R T File out: S - 's := - output.state mid.sentence = - { - ", " * write$ - } - { - output.state after.block = - { - add.period$ writeln - "\newblock " write$ - } - { - output.state before.all = - { - write$ - } - { - add.period$ " " * write$ - } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} - -FUNCTION { output.nonnull.dot.space } -{ % Stack in: ... R S T Stack out: ... R T File out: S - 's := - output.state mid.sentence = % { ". " * write$ } - { - ". " * write$ - } - { - output.state after.block = - { - add.period$ writeln "\newblock " write$ - } - { - output.state before.all = - { - write$ - } - { - add.period$ " " * write$ - } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} - -FUNCTION { output.nonnull.remove } -{ % Stack in: ... R S T Stack out: ... R T File out: S - 's := - output.state mid.sentence = - { - " " * write$ - } - { - output.state after.block = - { - add.period$ writeln "\newblock " write$ - } - { - output.state before.all = - { - write$ - } - { - add.period$ " " * write$ - } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} - -FUNCTION { output.nonnull.removenospace } -{ % Stack in: ... R S T Stack out: ... R T File out: S - 's := - output.state mid.sentence = - { - "" * write$ - } - { - output.state after.block = - { - add.period$ writeln "\newblock " write$ - } - { - output.state before.all = - { - write$ - } - { - add.period$ " " * write$ - } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} - -FUNCTION { output } -{ % discard top token if empty, else like output.nonnull - duplicate$ empty.or.unknown - 'pop$ - 'output.nonnull - if$ -} - -FUNCTION { output.dot.space } -{ % discard top token if empty, else like output.nonnull.dot.space - duplicate$ empty.or.unknown - 'pop$ - 'output.nonnull.dot.space - if$ -} - -FUNCTION { output.removenospace } -{ % discard top token if empty, else like output.nonnull.removenospace - duplicate$ empty.or.unknown - 'pop$ - 'output.nonnull.removenospace - if$ -} - -FUNCTION { output.check } -{ % like output, but warn if key name on top-of-stack is not set - 't := - duplicate$ empty.or.unknown - { pop$ "empty " t * " in " * cite$ * warning$ } - 'output.nonnull - if$ -} - -FUNCTION { bibinfo.output.check } -{ % like output.check, adding bibinfo field - 't := - duplicate$ empty.or.unknown - { pop$ "empty " t * " in " * cite$ * warning$ } - { "\bibinfo{" t "}{" * * swap$ * "}" * - output.nonnull } - if$ -} - -FUNCTION { output.check.dot.space } -{ % like output.dot.space, but warn if key name on top-of-stack is not set - 't := - duplicate$ empty.or.unknown - { pop$ "empty " t * " in " * cite$ * warning$ } - 'output.nonnull.dot.space - if$ -} - -FUNCTION { fin.block } -{ % functionally, but not logically, identical to fin.entry - add.period$ - writeln -} - -FUNCTION { fin.entry } -{ - add.period$ - writeln -} - -FUNCTION { new.sentence } -{ % update sentence state, with neither output nor stack change - output.state after.block = - 'skip$ - { - output.state before.all = - 'skip$ - { after.sentence 'output.state := } - if$ - } - if$ -} - -FUNCTION { fin.sentence } -{ - add.period$ - write$ - new.sentence - "" -} - -FUNCTION { new.block } -{ - output.state before.all = - 'skip$ - { after.block 'output.state := } - if$ -} - -FUNCTION { output.coden } % UTAH -{ % output non-empty CODEN as one-line sentence (stack untouched) - coden empty.or.unknown - { } - { "\showCODEN{" coden * "}" * writeln } - if$ -} - -% -% Sometimes articleno starts with the word 'Article' or 'Paper. -% (this is a bug of acmdl, sigh) -% We strip them. We assume eid or articleno is already on stack -% - -FUNCTION { strip.articleno.or.eid } -{ - 't := - t #1 #7 substring$ "Article" = - {t #8 t text.length$ substring$ 't :=} - { } - if$ - t #1 #7 substring$ "article" = - {t #8 t text.length$ substring$ 't :=} - { } - if$ - t #1 #5 substring$ "Paper" = - {t #6 t text.length$ substring$ 't :=} - { } - if$ - t #1 #5 substring$ "paper" = - {t #6 t text.length$ substring$ 't :=} - { } - if$ - % Strip any left trailing space or ~ - t #1 #1 substring$ " " = - {t #2 t text.length$ substring$ 't :=} - { } - if$ - t #1 #1 substring$ "~" = - {t #2 t text.length$ substring$ 't :=} - { } - if$ - t -} - - -FUNCTION { format.articleno } -{ - articleno empty.or.unknown not eid empty.or.unknown not and - { "Both articleno and eid are defined for " cite$ * warning$ } - 'skip$ - if$ - articleno empty.or.unknown eid empty.or.unknown and - { "" } - { - numpages empty.or.unknown - { "articleno or eid field, but no numpages field, in " - cite$ * warning$ } - { } - if$ - eid empty.or.unknown - { "Article \bibinfo{articleno}{" articleno strip.articleno.or.eid * "}" * } - { "Article \bibinfo{articleno}{" eid strip.articleno.or.eid * "}" * } - if$ - } - if$ -} - -FUNCTION { format.year } -{ % push year string or "[n.\,d.]" onto output stack - %% Because year is a mandatory field, we always force SOMETHING - %% to be output - "\bibinfo{year}{" - year empty.or.unknown - { "[n.\,d.]" } - { year } - if$ - * "}" * -} - -FUNCTION { format.day.month } -{ % push "day month " or "month " or "" onto output stack - day empty.or.unknown - { - month empty.or.unknown - { "" } - { "\bibinfo{date}{" month * "} " *} - if$ - } - { - month empty.or.unknown - { "" } - { "\bibinfo{date}{" day * " " * month * "} " *} - if$ - } - if$ -} - -FUNCTION { format.day.month.year } % UTAH -{ % if month is empty, push "" else push "(MON.)" or "(DD MON.)" - % Needed for frequent periodicals: 2008. ... New York Times C-1, C-2, C-17 (23 Oct.) - % acm-*.bst addition: prefix parenthesized date string with - % ", Article nnn " - articleno empty.or.unknown eid empty.or.unknown and - { "" } - { output.state after.block = - {", " format.articleno * } - { format.articleno } - if$ - } - if$ - " (" * format.day.month * format.year * ")" * -} - -FUNCTION { output.day.month.year } % UTAH -{ % if month is empty value, do nothing; else output stack top and - % leave with new top string "(MON.)" or "(DD MON.)" - % Needed for frequent periodicals: 2008. ... New York Times C-1, C-2, C-17 (23 Oct.) - format.day.month.year - output.nonnull.remove -} - -FUNCTION { strip.doi } % UTAH -{ % Strip any Web address prefix to recover the bare DOI, leaving the - % result on the output stack, as recommended by CrossRef DOI - % documentation. - % For example, reduce "http://doi.acm.org/10.1145/1534530.1534545" to - % "10.1145/1534530.1534545". A suitable URL is later typeset and - % displayed as the LAST item in the reference list entry. Publisher Web - % sites wrap this with a suitable link to a real URL to resolve the DOI, - % and the master https://doi.org/ address is preferred, since publisher- - % specific URLs can disappear in response to economic events. All - % journals are encouraged by the DOI authorities to use that typeset - % format and link procedures for uniformity across all publications that - % include DOIs in reference lists. - % The numeric prefix is guaranteed to start with "10.", so we use - % that as a test. - % 2017-02-04 Added stripping of https:// (Boris) - doi #1 #3 substring$ "10." = - { doi } - { - doi 't := % get modifiable copy of DOI - - % Change https:// to http:// to strip both prefixes (BV) - - t #1 #8 substring$ "https://" = - { "http://" t #9 t text.length$ #8 - substring$ * 't := } - { } - if$ - - t #1 #7 substring$ "http://" = - { - t #8 t text.length$ #7 - substring$ 't := - - "INTERNAL STYLE-FILE ERROR" 's := - - % search for next "/" and assign its suffix to s - - { t text.length$ } - { - t #1 #1 substring$ "/" = - { - % save rest of string as true DOI (should be 10.xxxx/yyyy) - t #2 t text.length$ #1 - substring$ 's := - "" 't := % empty string t terminates the loop - } - { - % discard first character and continue loop: t <= substring(t,2,last) - t #2 t text.length$ #1 - substring$ 't := - } - if$ - } - while$ - - % check for valid DOI (should be 10.xxxx/yyyy) - s #1 #3 substring$ "10." = - { } - { "unrecognized DOI substring " s * " in DOI value [" * doi * "]" * warning$ } - if$ - - s % push the stripped DOI on the output stack - - } - { - "unrecognized DOI value [" doi * "]" * warning$ - doi % push the unrecognized original DOI on the output stack - } - if$ - } - if$ -} - -% -% Change by BV: added standard prefix to URL -% -FUNCTION { output.doi } % UTAH -{ % output non-empty DOI as one-line sentence (stack untouched) - doi empty.or.unknown - { } - { - %% Use \urldef here for the same reason it is used in output.url, - %% see output.url for further discussion. - "\urldef\tempurl%" writeln - "\url{https://doi.org/" strip.doi * "}" * writeln - "\showDOI{\tempurl}" writeln - } - if$ -} - -FUNCTION { output.isbn } % UTAH -{ % output non-empty ISBN-10 and/or ISBN-13 as one-line sentences (stack untouched) - show-isbn-10-and-13 - { - %% show both 10- and 13-digit ISBNs - isbn empty.or.unknown - { } - { - "\showISBNx{" isbn * "}" * writeln - } - if$ - isbn-13 empty.or.unknown - { } - { - "\showISBNxiii{" isbn-13 * "}" * writeln - } - if$ - } - { - %% show 10-digit ISBNs only if 13-digit ISBNs not available - isbn-13 empty.or.unknown - { - isbn empty.or.unknown - { } - { - "\showISBNx{" isbn * "}" * writeln - } - if$ - } - { - "\showISBNxiii{" isbn-13 * "}" * writeln - } - if$ - } - if$ -} - -FUNCTION { output.issn } % UTAH -{ % output non-empty ISSN as one-line sentence (stack untouched) - issn empty.or.unknown - { } - { "\showISSN{" issn * "}" * writeln } - if$ -} - -FUNCTION { output.issue } -{ % output non-empty issue number as a one-line sentence (stack untouched) - issue empty.or.unknown - { } - { "Issue " issue * "." * writeln } - if$ -} - -FUNCTION { output.lccn } % UTAH -{ % return with stack untouched - lccn empty.or.unknown - { } - { "\showLCCN{" lccn * "}" * writeln } - if$ -} - -FUNCTION { output.note } % UTAH -{ % return with stack empty - note empty.or.unknown - { } - { "\shownote{" note * "}" add.period$ * writeln } - if$ -} - -FUNCTION { output.note.check } % UTAH -{ % return with stack empty - note empty.or.unknown - { "empty note in " cite$ * warning$ } - { "\shownote{" note * "}" add.period$ * writeln } - if$ -} - -FUNCTION { output.eprint } % -{ % return with stack empty - eprint empty.or.unknown - { } - { "\showeprint" - archiveprefix empty.or.unknown - { eprinttype empty.or.unknown - { } - { "[" eprinttype "]" * * * } - if$ - } - { "[" archiveprefix "l" change.case$ "]" * * * } - if$ - "{" eprint "}" * * * - primaryclass empty.or.unknown - { eprintclass empty.or.unknown - { } - { "~[" eprintclass "]" * * * } - if$ - } - { "~[" primaryclass "]" * * * } - if$ - writeln - } - if$ -} - - -% -% Changes by BV 2011/04/15. Do not output -% url if doi is defined -% -% -% Changes by BV 2021/11/26. Output url even if doi is defined -% if distinctURL is not zero. -% -FUNCTION { output.url } % UTAH -{ % return with stack untouched - % output URL and associated lastaccessed fields - doi empty.or.unknown distinctURL empty.or.zero not or - { - url empty.or.unknown - { } - { - %% Use \urldef, outside \showURL, so that %nn, #, etc in URLs work - %% correctly. Put the actual URL on its own line to reduce the - %% likelihood of BibTeX's nasty line wrapping after column 79. - %% \url{} can undo this, but if that doesn't work for some reason - %% the .bbl file would have to be repaired manually. - "\urldef\tempurl%" writeln - "\url{" url * "}" * writeln - - "\showURL{%" writeln - lastaccessed empty.or.unknown - { "" } - { "Retrieved " lastaccessed * " from " * } - if$ - "\tempurl}" * writeln - } - if$ - } - { } - if$ -} - -FUNCTION { output.year.check } -{ % warn if year empty, output top string and leave " YEAR