diff --git a/.github/workflows/paper.yml b/.github/workflows/paper.yml new file mode 100644 index 0000000..10bd00b --- /dev/null +++ b/.github/workflows/paper.yml @@ -0,0 +1,18 @@ +name: "Paper" +on: + push: +jobs: + paper: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: cachix/install-nix-action@v27 + with: + github_access_token: ${{ secrets.GITHUB_TOKEN }} + - run: | + cd reports/iwsds2025 + make + - uses: actions/upload-artifact@v4 + with: + name: paper.pdf + path: reports/iwsds2025/iwsds2025.pdf diff --git a/.gitignore b/.gitignore index 43cc609..8ff282b 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,312 @@ dist-ssr # Azure credentials src/azure.ts + + +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +# *.pdf + +## Generated if empty string is given at "Please type another file name for output:" +.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bbl-SAVE-ERROR +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync +*.rubbercache +rubber.cache + +## Build tool directories for auxiliary files +# latexrun +latex.out/ + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# comment +*.cut + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs +*.lzo +*.lzs +*.slg +*.slo +*.sls + +# uncomment this for glossaries-extra (will ignore makeindex's style files!) +# *.ist + +# gnuplot +*.gnuplot +*.table + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.glog +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hypdoc +*.hd + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files +# *.tikz +*-tikzDictionary + +# listings +*.lol + +# luatexja-ruby +*.ltjruby + +# makeidx +*.idx +*.ilg +*.ind + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# newpax +*.newpax + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# svg +svg-inkscape/ + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# tcolorbox +*.listing + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# titletoc +*.ptc + +# todonotes +*.tdo + +# vhistory +*.hst +*.ver + +# easy-todo +*.lod + +# xcolor +*.xcp + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices and outlines +*.xyc +*.xyd + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# LyX +*.lyx~ + +# Kile +*.backup + +# gummi +.*.swp + +# KBibTeX +*~[0-9]* + +# TeXnicCenter +*.tps + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta + +# Makeindex log files +*.lpz + +# xwatermark package +*.xwm + +# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib +# option is specified. Footnotes are the stored in a file with suffix Notes.bib. +# Uncomment the next line to have this generated file ignored. +#*Notes.bib diff --git a/reports/iwsds2025/Makefile b/reports/iwsds2025/Makefile new file mode 100644 index 0000000..cae2b27 --- /dev/null +++ b/reports/iwsds2025/Makefile @@ -0,0 +1,11 @@ +default: + nix develop --ignore-environment -c bash -c "make iwsds2025.pdf" + +clean: + nix develop -c bash -c "latexmk -c iwsds2025.tex" + +%.pdf: %.tex + latexmk -pdflatex --shell-escape $< + +%.tex: %.org + emacs --eval="(load \"${MYEMACSLOAD}\")" --batch $< -f org-latex-export-to-latex --kill diff --git a/reports/iwsds2025/acl.sty b/reports/iwsds2025/acl.sty new file mode 100644 index 0000000..5a6421c --- /dev/null +++ b/reports/iwsds2025/acl.sty @@ -0,0 +1,311 @@ +% This is the LaTex style file for *ACL. +% The official sources can be found at +% +% https://github.com/acl-org/acl-style-files/ +% +% This package is activated by adding +% +% \usepackage{acl} +% +% to your LaTeX file. When submitting your paper for review, add the "review" option: +% +% \usepackage[review]{acl} + +\newif\ifacl@finalcopy +\newif\ifacl@anonymize +\newif\ifacl@linenumbers +\newif\ifacl@pagenumbers +\DeclareOption{final}{\acl@finalcopytrue\acl@anonymizefalse\acl@linenumbersfalse\acl@pagenumbersfalse} +\DeclareOption{review}{\acl@finalcopyfalse\acl@anonymizetrue\acl@linenumberstrue\acl@pagenumberstrue} +\DeclareOption{preprint}{\acl@finalcopytrue\acl@anonymizefalse\acl@linenumbersfalse\acl@pagenumberstrue} +\ExecuteOptions{final} % final copy is the default + +% include hyperref, unless user specifies nohyperref option like this: +% \usepackage[nohyperref]{acl} +\newif\ifacl@hyperref +\DeclareOption{hyperref}{\acl@hyperreftrue} +\DeclareOption{nohyperref}{\acl@hyperreffalse} +\ExecuteOptions{hyperref} % default is to use hyperref +\ProcessOptions\relax + +\typeout{Conference Style for ACL} + +\usepackage{xcolor} + +\ifacl@linenumbers + % Add draft line numbering via the lineno package + % https://texblog.org/2012/02/08/adding-line-numbers-to-documents/ + \usepackage[switch,mathlines]{lineno} + + % Line numbers in gray Helvetica 8pt + \font\aclhv = phvb at 8pt + \renewcommand\linenumberfont{\aclhv\color{lightgray}} + + % Zero-fill line numbers + % NUMBER with left flushed zeros \fillzeros[] + \newcount\cv@tmpc@ \newcount\cv@tmpc + \def\fillzeros[#1]#2{\cv@tmpc@=#2\relax\ifnum\cv@tmpc@<0\cv@tmpc@=-\cv@tmpc@\fi + \cv@tmpc=1 % + \loop\ifnum\cv@tmpc@<10 \else \divide\cv@tmpc@ by 10 \advance\cv@tmpc by 1 \fi + \ifnum\cv@tmpc@=10\relax\cv@tmpc@=11\relax\fi \ifnum\cv@tmpc@>10 \repeat + \ifnum#2<0\advance\cv@tmpc1\relax-\fi + \loop\ifnum\cv@tmpc<#1\relax0\advance\cv@tmpc1\relax\fi \ifnum\cv@tmpc<#1 \repeat + \cv@tmpc@=#2\relax\ifnum\cv@tmpc@<0\cv@tmpc@=-\cv@tmpc@\fi \relax\the\cv@tmpc@}% + \renewcommand\thelinenumber{\fillzeros[3]{\arabic{linenumber}}} + \linenumbers + + \setlength{\linenumbersep}{1.6cm} + + % Bug: An equation with $$ ... $$ isn't numbered, nor is the previous line. + + % Patch amsmath commands so that the previous line and the equation itself + % are numbered. Bug: multline has an extra line number. + % https://tex.stackexchange.com/questions/461186/how-to-use-lineno-with-amsmath-align + \usepackage{etoolbox} %% <- for \pretocmd, \apptocmd and \patchcmd + + \newcommand*\linenomathpatch[1]{% + \expandafter\pretocmd\csname #1\endcsname {\linenomath}{}{}% + \expandafter\pretocmd\csname #1*\endcsname {\linenomath}{}{}% + \expandafter\apptocmd\csname end#1\endcsname {\endlinenomath}{}{}% + \expandafter\apptocmd\csname end#1*\endcsname {\endlinenomath}{}{}% + } + \newcommand*\linenomathpatchAMS[1]{% + \expandafter\pretocmd\csname #1\endcsname {\linenomathAMS}{}{}% + \expandafter\pretocmd\csname #1*\endcsname {\linenomathAMS}{}{}% + \expandafter\apptocmd\csname end#1\endcsname {\endlinenomath}{}{}% + \expandafter\apptocmd\csname end#1*\endcsname {\endlinenomath}{}{}% + } + + %% Definition of \linenomathAMS depends on whether the mathlines option is provided + \expandafter\ifx\linenomath\linenomathWithnumbers + \let\linenomathAMS\linenomathWithnumbers + %% The following line gets rid of an extra line numbers at the bottom: + \patchcmd\linenomathAMS{\advance\postdisplaypenalty\linenopenalty}{}{}{} + \else + \let\linenomathAMS\linenomathNonumbers + \fi + + \AtBeginDocument{% + \linenomathpatch{equation}% + \linenomathpatchAMS{gather}% + \linenomathpatchAMS{multline}% + \linenomathpatchAMS{align}% + \linenomathpatchAMS{alignat}% + \linenomathpatchAMS{flalign}% + } +\else + % Hack to ignore these commands, which review mode puts into the .aux file. + \newcommand{\@LN@col}[1]{} + \newcommand{\@LN}[2]{} + \newcommand{\nolinenumbers}{} +\fi + +\PassOptionsToPackage{a4paper,margin=2.5cm,heightrounded=true}{geometry} +\RequirePackage{geometry} + +\setlength\columnsep{0.6cm} +\newlength\titlebox +\setlength\titlebox{11\baselineskip} +% \titlebox should be a multiple of \baselineskip so that +% column height remaining fits an exact number of lines of text + +\flushbottom \twocolumn \sloppy + +% We're never going to need a table of contents, so just flush it to +% save space --- suggested by drstrip@sandia-2 +\def\addcontentsline#1#2#3{} + +\ifacl@pagenumbers + \pagenumbering{arabic} +\else + \thispagestyle{empty} + \pagestyle{empty} +\fi + +%% Title and Authors %% + +\let\Thanks\thanks % \Thanks and \thanks used to be different, but keep this for backwards compatibility. + +\newcommand\outauthor{% + \begin{tabular}[t]{c} + \ifacl@anonymize + \bfseries Anonymous ACL submission + \else + \bfseries\@author + \fi + \end{tabular}} + +% Mostly taken from deproc. +\AtBeginDocument{ +\def\maketitle{\par + \begingroup + \def\thefootnote{\fnsymbol{footnote}} + \twocolumn[\@maketitle] + \@thanks + \endgroup + \setcounter{footnote}{0} + \let\maketitle\relax + \let\@maketitle\relax + \gdef\@thanks{}\gdef\@author{}\gdef\@title{}\let\thanks\relax} +\def\@maketitle{\vbox to \titlebox{\hsize\textwidth + \linewidth\hsize \vskip 0.125in minus 0.125in \centering + {\Large\bfseries \@title \par} \vskip 0.2in plus 1fil minus 0.1in + {\def\and{\unskip\enspace{\rmfamily and}\enspace}% + \def\And{\end{tabular}\hss \egroup \hskip 1in plus 2fil + \hbox to 0pt\bgroup\hss \begin{tabular}[t]{c}\bfseries}% + \def\AND{\end{tabular}\hss\egroup \hfil\hfil\egroup + \vskip 0.25in plus 1fil minus 0.125in + \hbox to \linewidth\bgroup\large \hfil\hfil + \hbox to 0pt\bgroup\hss \begin{tabular}[t]{c}\bfseries} + \hbox to \linewidth\bgroup\large \hfil\hfil + \hbox to 0pt\bgroup\hss + \outauthor + \hss\egroup + \hfil\hfil\egroup} + \vskip 0.3in plus 2fil minus 0.1in +}} +} + +% margins and font size for abstract +\renewenvironment{abstract}% + {\begin{center}\large\textbf{\abstractname}\end{center}% + \begin{list}{}% + {\setlength{\rightmargin}{0.6cm}% + \setlength{\leftmargin}{0.6cm}}% + \item[]\ignorespaces% + \@setsize\normalsize{12pt}\xpt\@xpt + }% + {\unskip\end{list}} + +% Resizing figure and table captions - SL +% Support for interacting with the caption, subfigure, and subcaption packages - SL +\RequirePackage{caption} +\DeclareCaptionFont{10pt}{\fontsize{10pt}{12pt}\selectfont} +\captionsetup{font=10pt} + +\RequirePackage{natbib} +% for citation commands in the .tex, authors can use: +% \citep, \citet, and \citeyearpar for compatibility with natbib, or +% \cite, \newcite, and \shortcite for compatibility with older ACL .sty files +\renewcommand\cite{\citep} % to get "(Author Year)" with natbib +\newcommand\shortcite{\citeyearpar}% to get "(Year)" with natbib +\newcommand\newcite{\citet} % to get "Author (Year)" with natbib +\newcommand{\citeposs}[1]{\citeauthor{#1}'s (\citeyear{#1})} % to get "Author's (Year)" + + +% Bibliography + +% Don't put a label in the bibliography at all. Just use the unlabeled format +% instead. +\def\thebibliography#1{\vskip\parskip% +\vskip\baselineskip% +\def\baselinestretch{1}% +\ifx\@currsize\normalsize\@normalsize\else\@currsize\fi% +\vskip-\parskip% +\vskip-\baselineskip% +\section*{References\@mkboth + {References}{References}}\list + {}{\setlength{\labelwidth}{0pt}\setlength{\leftmargin}{\parindent} + \setlength{\itemindent}{-\parindent}} + \def\newblock{\hskip .11em plus .33em minus -.07em} + \sloppy\clubpenalty4000\widowpenalty4000 + \sfcode`\.=1000\relax} +\let\endthebibliography=\endlist + + +% Allow for a bibliography of sources of attested examples +\def\thesourcebibliography#1{\vskip\parskip% +\vskip\baselineskip% +\def\baselinestretch{1}% +\ifx\@currsize\normalsize\@normalsize\else\@currsize\fi% +\vskip-\parskip% +\vskip-\baselineskip% +\section*{Sources of Attested Examples\@mkboth + {Sources of Attested Examples}{Sources of Attested Examples}}\list + {}{\setlength{\labelwidth}{0pt}\setlength{\leftmargin}{\parindent} + \setlength{\itemindent}{-\parindent}} + \def\newblock{\hskip .11em plus .33em minus -.07em} + \sloppy\clubpenalty4000\widowpenalty4000 + \sfcode`\.=1000\relax} +\let\endthesourcebibliography=\endlist + +% sections with less space +\def\section{\@startsection {section}{1}{\z@}{-2.0ex plus + -0.5ex minus -.2ex}{1.5ex plus 0.3ex minus .2ex}{\large\bfseries\raggedright}} +\def\subsection{\@startsection{subsection}{2}{\z@}{-1.8ex plus + -0.5ex minus -.2ex}{0.8ex plus .2ex}{\normalsize\bfseries\raggedright}} +%% changed by KO to - values to get the initial parindent right +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}{-1.5ex plus + -0.5ex minus -.2ex}{0.5ex plus .2ex}{\normalsize\bfseries\raggedright}} +\def\paragraph{\@startsection{paragraph}{4}{\z@}{1.5ex plus + 0.5ex minus .2ex}{-1em}{\normalsize\bfseries}} +\def\subparagraph{\@startsection{subparagraph}{5}{\parindent}{1.5ex plus + 0.5ex minus .2ex}{-1em}{\normalsize\bfseries}} + +% Footnotes +\footnotesep 6.65pt % +\skip\footins 9pt plus 4pt minus 2pt +\def\footnoterule{\kern-3pt \hrule width 5pc \kern 2.6pt } +\setcounter{footnote}{0} + +% Lists and paragraphs +\parindent 1em +\topsep 4pt plus 1pt minus 2pt +\partopsep 1pt plus 0.5pt minus 0.5pt +\itemsep 2pt plus 1pt minus 0.5pt +\parsep 2pt plus 1pt minus 0.5pt + +\leftmargin 2em \leftmargini\leftmargin \leftmarginii 2em +\leftmarginiii 1.5em \leftmarginiv 1.0em \leftmarginv .5em \leftmarginvi .5em +\labelwidth\leftmargini\advance\labelwidth-\labelsep \labelsep 5pt + +\def\@listi{\leftmargin\leftmargini} +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth-\labelsep + \topsep 2pt plus 1pt minus 0.5pt + \parsep 1pt plus 0.5pt minus 0.5pt + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii\advance\labelwidth-\labelsep + \topsep 1pt plus 0.5pt minus 0.5pt + \parsep \z@ \partopsep 0.5pt plus 0pt minus 0.5pt + \itemsep \topsep} +\def\@listiv{\leftmargin\leftmarginiv + \labelwidth\leftmarginiv\advance\labelwidth-\labelsep} +\def\@listv{\leftmargin\leftmarginv + \labelwidth\leftmarginv\advance\labelwidth-\labelsep} +\def\@listvi{\leftmargin\leftmarginvi + \labelwidth\leftmarginvi\advance\labelwidth-\labelsep} + +\abovedisplayskip 7pt plus2pt minus5pt% +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus3pt% +\belowdisplayshortskip 4pt plus3pt minus3pt% + +% Less leading in most fonts (due to the narrow columns) +% The choices were between 1-pt and 1.5-pt leading +\def\@normalsize{\@setsize\normalsize{11pt}\xpt\@xpt} +\def\small{\@setsize\small{10pt}\ixpt\@ixpt} +\def\footnotesize{\@setsize\footnotesize{10pt}\ixpt\@ixpt} +\def\scriptsize{\@setsize\scriptsize{8pt}\viipt\@viipt} +\def\tiny{\@setsize\tiny{7pt}\vipt\@vipt} +\def\large{\@setsize\large{14pt}\xiipt\@xiipt} +\def\Large{\@setsize\Large{16pt}\xivpt\@xivpt} +\def\LARGE{\@setsize\LARGE{20pt}\xviipt\@xviipt} +\def\huge{\@setsize\huge{23pt}\xxpt\@xxpt} +\def\Huge{\@setsize\Huge{28pt}\xxvpt\@xxvpt} + +% The hyperref manual (section 9) says hyperref should be loaded after natbib +\ifacl@hyperref + \PassOptionsToPackage{breaklinks}{hyperref} + \RequirePackage{hyperref} + % make links dark blue + \definecolor{darkblue}{rgb}{0, 0, 0.5} + \hypersetup{colorlinks=true, citecolor=darkblue, linkcolor=darkblue, urlcolor=darkblue} +\else + % This definition is used if the hyperref package is not loaded. + % It provides a backup, no-op definiton of \href. + % This is necessary because \href command is used in the acl_natbib.bst file. + \def\href#1#2{{#2}} + \usepackage{url} +\fi diff --git a/reports/iwsds2025/acl_natbib.bst b/reports/iwsds2025/acl_natbib.bst new file mode 100644 index 0000000..cad5a5e --- /dev/null +++ b/reports/iwsds2025/acl_natbib.bst @@ -0,0 +1,1928 @@ +%%% Modification of BibTeX style file acl_natbib_nourl.bst +%%% ... by urlbst, version 0.9.1 (marked with "% urlbst") +%%% See and repository +%%% Modifications Copyright 2002–23, Norman Gray, +%%% and distributed under the terms of the LPPL; see README for discussion. +%%% +%%% Added webpage entry type, and url and lastchecked fields. +%%% Added eprint support. +%%% Added DOI support. +%%% Added PUBMED support. +%%% Added hyperref support. +%%% Original headers follow... + +%% +%% This is file `acl_natbib_basic.bst', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% merlin.mbs (with options: `ay,nat,pres,ed-au,keyxyr,blkyear,dt-beg,yr-per,note-yr,num-xser,pre-edn,xedn,nfss') +%% ---------------------------------------- +%% *** Intended for ACL conferences *** +%% +%% Copyright 1994-2011 Patrick W Daly + % =============================================================== + % IMPORTANT NOTICE: + % This bibliographic style (bst) file has been generated from one or + % more master bibliographic style (mbs) files, listed above. + % + % This generated file can be redistributed and/or modified under the terms + % of the LaTeX Project Public License Distributed from CTAN + % archives in directory macros/latex/base/lppl.txt; either + % version 1 of the License, or any later version. + % =============================================================== + % Name and version information of the main mbs file: + % \ProvidesFile{merlin.mbs}[2011/11/18 4.33 (PWD, AO, DPC)] + % For use with BibTeX version 0.99a or later + %------------------------------------------------------------------- + % This bibliography style file is intended for texts in ENGLISH + % This is an author-year citation style bibliography. As such, it is + % non-standard LaTeX, and requires a special package file to function properly. + % Such a package is natbib.sty by Patrick W. Daly + % The form of the \bibitem entries is + % \bibitem[Jones et al.(1990)]{key}... + % \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}... + % The essential feature is that the label (the part in brackets) consists + % of the author names, as they should appear in the citation, with the year + % in parentheses following. There must be no space before the opening + % parenthesis! + % With natbib v5.3, a full list of authors may also follow the year. + % In natbib.sty, it is possible to define the type of enclosures that is + % really wanted (brackets or parentheses), but in either case, there must + % be parentheses in the label. + % The \cite command functions as follows: + % \citet{key} ==>> Jones et al. (1990) + % \citet*{key} ==>> Jones, Baker, and Smith (1990) + % \citep{key} ==>> (Jones et al., 1990) + % \citep*{key} ==>> (Jones, Baker, and Smith, 1990) + % \citep[chap. 2]{key} ==>> (Jones et al., 1990, chap. 2) + % \citep[e.g.][]{key} ==>> (e.g. Jones et al., 1990) + % \citep[e.g.][p. 32]{key} ==>> (e.g. Jones et al., 1990, p. 32) + % \citeauthor{key} ==>> Jones et al. + % \citeauthor*{key} ==>> Jones, Baker, and Smith + % \citeyear{key} ==>> 1990 + %--------------------------------------------------------------------- + +ENTRY + { address + archivePrefix + author + booktitle + chapter + edition + editor + eid + eprint + eprinttype % = archivePrefix + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + school + series + title + type + volume + year + doi % urlbst + pubmed % urlbst + url % urlbst + lastchecked % urlbst + } + {} + { label extra.label sort.label short.list } +INTEGERS { output.state before.all mid.sentence after.sentence after.block } +% urlbst... +% urlbst constants and state variables +STRINGS { urlintro + eprinturl eprintprefix doiprefix doiurl pubmedprefix pubmedurl + citedstring onlinestring linktextstring + openinlinelink closeinlinelink } +INTEGERS { hrefform doiform inlinelinks makeinlinelink + addeprints adddoi addpubmed } +FUNCTION {init.urlbst.variables} +{ + % The following constants may be adjusted by hand, if desired + + % The first set allow you to enable or disable certain functionality. + #1 'addeprints := % 0=no eprints; 1=include eprints + #2 'hrefform := % 0=no crossrefs; 1=hypertex hrefs; 2=hyperref hrefs + #1 'inlinelinks := % 0=URLs explicit; 1=URLs attached to titles + #1 'adddoi := % 0=no DOI resolver; 1=include it + #1 'addpubmed := % 0=no PUBMED resolver; 1=include it + #0 'doiform := % 0=with href; 1=with \doi{} + + % String constants, which you _might_ want to tweak. + "online" 'onlinestring := % label that a resource is online + "[link]" 'linktextstring := % anonymous link text + "http://www.ncbi.nlm.nih.gov/pubmed/" 'pubmedurl := % prefix to make URL from PUBMED + "https://doi.org/" 'doiurl := % prefix to make URL from DOI + "doi:" 'doiprefix := % printed text to introduce DOI + "https://arxiv.org/abs/" 'eprinturl := % prefix to make URL from eprint ref + "cited " 'citedstring := % label in "lastchecked" remark + "arXiv:" 'eprintprefix := % text prefix printed before eprint ref + "PMID:" 'pubmedprefix := % text prefix printed before PUBMED ref + "URL: " 'urlintro := % text prefix before URL + + % The following are internal state variables, not configuration constants, + % so they shouldn't be fiddled with. + #0 'makeinlinelink := % state variable managed by possibly.setup.inlinelink + "" 'openinlinelink := % ditto + "" 'closeinlinelink := % ditto +} +INTEGERS { + bracket.state + outside.brackets + open.brackets + within.brackets + close.brackets +} +% ...urlbst to here +FUNCTION {init.state.consts} +{ #0 'outside.brackets := % urlbst... + #1 'open.brackets := + #2 'within.brackets := + #3 'close.brackets := % ...urlbst to here + + #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} +STRINGS { s t} +% urlbst +FUNCTION {output.nonnull.original} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +% urlbst... +% Minimal DOI parsing. +% Given a DOI on the stack, check whether it starts with 'doiurl' or not. +% In either case, leave on the stack first a DOI with, and then a DOI without, the URL prefix. +FUNCTION {parse.doi} +{ + #1 doiurl text.length$ substring$ + doiurl = + { doi + doi doiurl text.length$ #1 + #999 substring$ } + { doiurl doi * + doi } + if$ +} +% The following three functions are for handling inlinelink. They wrap +% a block of text which is potentially output with write$ by multiple +% other functions, so we don't know the content a priori. +% They communicate between each other using the variables makeinlinelink +% (which is true if a link should be made), and closeinlinelink (which holds +% the string which should close any current link. They can be called +% at any time, but start.inlinelink will be a no-op unless something has +% previously set makeinlinelink true, and the two ...end.inlinelink functions +% will only do their stuff if start.inlinelink has previously set +% closeinlinelink to be non-empty. +% (thanks to 'ijvm' for suggested code here) +FUNCTION {uand} +{ 'skip$ { pop$ #0 } if$ } % 'and' (which isn't defined at this point in the file) +FUNCTION {possibly.setup.inlinelink} +{ makeinlinelink hrefform #0 > uand + { doi empty$ adddoi uand + { pubmed empty$ addpubmed uand + { eprint empty$ addeprints uand + { url empty$ + { "" } + { url } + if$ } + { eprinturl eprint * } + if$ } + { pubmedurl pubmed * } + if$ } +% { doiurl doi * } + { doi empty$ + { "XXX" } + { doi parse.doi pop$ } + if$ + } + if$ + % an appropriately-formatted URL is now on the stack + hrefform #1 = % hypertex + { "\special {html: }{" * 'openinlinelink := + "\special {html:}" 'closeinlinelink := } + { "\href {" swap$ * "} {" * 'openinlinelink := % hrefform=#2 -- hyperref + % the space between "} {" matters: a URL of just the right length can cause "\% newline em" + "}" 'closeinlinelink := } + if$ + #0 'makeinlinelink := + } + 'skip$ + if$ % makeinlinelink +} +FUNCTION {add.inlinelink} +{ openinlinelink empty$ + 'skip$ + { openinlinelink swap$ * closeinlinelink * + "" 'openinlinelink := + } + if$ +} +FUNCTION {output.nonnull} +{ % Save the thing we've been asked to output + 's := + % If the bracket-state is close.brackets, then add a close-bracket to + % what is currently at the top of the stack, and set bracket.state + % to outside.brackets + bracket.state close.brackets = + { "]" * + outside.brackets 'bracket.state := + } + 'skip$ + if$ + bracket.state outside.brackets = + { % We're outside all brackets -- this is the normal situation. + % Write out what's currently at the top of the stack, using the + % original output.nonnull function. + s + add.inlinelink + output.nonnull.original % invoke the original output.nonnull + } + { % Still in brackets. Add open-bracket or (continuation) comma, add the + % new text (in s) to the top of the stack, and move to the close-brackets + % state, ready for next time (unless inbrackets resets it). If we come + % into this branch, then output.state is carefully undisturbed. + bracket.state open.brackets = + { " [" * } + { ", " * } % bracket.state will be within.brackets + if$ + s * + close.brackets 'bracket.state := + } + if$ +} + +% Call this function just before adding something which should be presented in +% brackets. bracket.state is handled specially within output.nonnull. +FUNCTION {inbrackets} +{ bracket.state close.brackets = + { within.brackets 'bracket.state := } % reset the state: not open nor closed + { open.brackets 'bracket.state := } + if$ +} + +FUNCTION {format.lastchecked} +{ lastchecked empty$ + { "" } + { inbrackets citedstring lastchecked * } + if$ +} +% ...urlbst to here +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} +FUNCTION {fin.entry.original} % urlbst (renamed from fin.entry, so it can be wrapped below) +{ add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + +FUNCTION {date.block} +{ + new.block +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\emph{" swap$ * "}" * } + if$ +} +FUNCTION {tie.or.space.prefix} % puts ~ before the preceding part if it is of length <3 +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {capitalize} +{ "u" change.case$ "t" change.case$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + % Here are the language-specific definitions for explicit words. + % Each function has a name bbl.xxx where xxx is the English word. + % The language selected here is ENGLISH +FUNCTION {bbl.and} +{ "and"} + +FUNCTION {bbl.etal} +{ "et~al." } + +FUNCTION {bbl.editors} +{ "editors" } + +FUNCTION {bbl.editor} +{ "editor" } + +FUNCTION {bbl.edby} +{ "edited by" } + +FUNCTION {bbl.edition} +{ "edition" } + +FUNCTION {bbl.volume} +{ "volume" } + +FUNCTION {bbl.of} +{ "of" } + +FUNCTION {bbl.number} +{ "number" } + +FUNCTION {bbl.nr} +{ "no." } + +FUNCTION {bbl.in} +{ "in" } + +FUNCTION {bbl.pages} +{ "pages" } + +FUNCTION {bbl.page} +{ "page" } + +FUNCTION {bbl.chapter} +{ "chapter" } + +FUNCTION {bbl.techrep} +{ "Technical Report" } + +FUNCTION {bbl.mthesis} +{ "Master's thesis" } + +FUNCTION {bbl.phdthesis} +{ "Ph.D. thesis" } + +MACRO {jan} {"January"} + +MACRO {feb} {"February"} + +MACRO {mar} {"March"} + +MACRO {apr} {"April"} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"August"} + +MACRO {sep} {"September"} + +MACRO {oct} {"October"} + +MACRO {nov} {"November"} + +MACRO {dec} {"December"} + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} + +MACRO {ieeetc} {"IEEE Transactions on Computers"} + +MACRO {ieeetcad} + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + +MACRO {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +MACRO {tocs} {"ACM Transactions on Computer Systems"} + +MACRO {tods} {"ACM Transactions on Database Systems"} + +MACRO {tog} {"ACM Transactions on Graphics"} + +MACRO {toms} {"ACM Transactions on Mathematical Software"} + +MACRO {toois} {"ACM Transactions on Office Information Systems"} + +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} + +MACRO {tcs} {"Theoretical Computer Science"} + +% bibinfo.check avoids acting on missing fields while bibinfo.warn will +% issue a warning message if a missing field is detected. Prior to calling +% the bibinfo functions, the user should push the field value and then its +% name string, in that order. +FUNCTION {bibinfo.check} +{ swap$ + duplicate$ missing$ + { + pop$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ pop$ + } + { swap$ + pop$ + } + if$ + } + if$ +} +FUNCTION {bibinfo.warn} +{ swap$ + duplicate$ missing$ + { + swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ "empty " swap$ * " in " * cite$ * warning$ + } + { swap$ + pop$ + } + if$ + } + if$ +} +INTEGERS { nameptr namesleft numnames } + + +STRINGS { bibinfo} + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{ff~}{vv~}{ll}{, jj}" % first name first for all authors + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + numnames #2 > + { "," * } + 'skip$ + if$ + t "others" = + { + " " * bbl.etal * + } + { + bbl.and + space.word * t * + } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} +FUNCTION {format.names.ed} +{ + format.names +} +FUNCTION {format.key} +{ empty$ + { key field.or.null } + { "" } + if$ +} + +FUNCTION {format.authors} +{ author "author" format.names +} +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { + "," * + " " * + get.bbl.editor + * + } + if$ +} +FUNCTION {format.note} +{ + note empty$ + { "" } + { note #1 #1 substring$ + duplicate$ "{" = + 'skip$ + { output.state mid.sentence = + { "l" } + { "u" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + } + if$ +} + +FUNCTION {format.title} +{ title + duplicate$ empty$ 'skip$ + { "t" change.case$ } + if$ + "title" bibinfo.check +} +FUNCTION {format.full.names} +{'s := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}" format.name$ + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal * + } + { + numnames #2 > + { "," * } + 'skip$ + if$ + bbl.and + space.word * t * + } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {author.editor.key.full} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.full.names } + if$ + } + { author format.full.names } + if$ +} + +FUNCTION {author.key.full} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.full.names } + if$ +} + +FUNCTION {editor.key.full} +{ editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.full.names } + if$ +} + +FUNCTION {make.full.names} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.full + { type$ "proceedings" = + 'editor.key.full + 'author.key.full + if$ + } + if$ +} + +FUNCTION {output.bibitem.original} % urlbst (renamed from output.bibitem, so it can be wrapped below) +{ newline$ + "\bibitem[{" write$ + label write$ + ")" make.full.names duplicate$ short.list = + { pop$ } + { * } + if$ + "}]{" * write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {n.dashify} +{ + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.in capitalize + " " * } + +FUNCTION {format.date} +{ year "year" bibinfo.check duplicate$ empty$ + { + } + 'skip$ + if$ + extra.label * + before.all 'output.state := + after.sentence 'output.state := +} +FUNCTION {format.btitle} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + emphasize + } + if$ +} +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { bbl.volume volume tie.or.space.prefix + "volume" bibinfo.check * * + series "series" bibinfo.check + duplicate$ empty$ 'pop$ + { swap$ bbl.of space.word * swap$ + emphasize * } + if$ + "volume and number" number either.or.check + } + if$ +} +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { series empty$ + { number "number" bibinfo.check } + { output.state mid.sentence = + { bbl.number } + { bbl.number capitalize } + if$ + number tie.or.space.prefix "number" bibinfo.check * * + bbl.in space.word * + series "series" bibinfo.check * + } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { + output.state mid.sentence = + { "l" } + { "t" } + if$ change.case$ + "edition" bibinfo.check + " " * bbl.edition * + } + if$ +} +INTEGERS { multiresult } +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { duplicate$ multi.page.check + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + } + if$ +} +FUNCTION {format.journal.pages} +{ pages duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ + { pop$ pop$ format.pages } + { + ":" * + swap$ + n.dashify + "pages" bibinfo.check + * + } + if$ + } + if$ +} +FUNCTION {format.journal.eid} +{ eid "eid" bibinfo.check + duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ 'skip$ + { + ":" * + } + if$ + swap$ * + } + if$ +} +FUNCTION {format.vol.num.pages} +{ volume field.or.null + duplicate$ empty$ 'skip$ + { + "volume" bibinfo.check + } + if$ + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + "(" swap$ * ")" * + } + if$ * + eid empty$ + { format.journal.pages } + { format.journal.eid } + if$ +} + +FUNCTION {format.chapter} +{ chapter empty$ + 'format.pages + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + } + if$ +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ +} + +FUNCTION {format.booktitle} +{ + booktitle "booktitle" bibinfo.check + emphasize +} +FUNCTION {format.in.booktitle} +{ format.booktitle duplicate$ empty$ 'skip$ + { + word.in swap$ * + } + if$ +} +FUNCTION {format.in.ed.booktitle} +{ format.booktitle duplicate$ empty$ 'skip$ + { + editor "editor" format.names.ed duplicate$ empty$ 'pop$ + { + "," * + " " * + get.bbl.editor + ", " * + * swap$ + * } + if$ + word.in swap$ * + } + if$ +} +FUNCTION {format.thesis.type} +{ type duplicate$ empty$ + 'pop$ + { swap$ pop$ + "t" change.case$ "type" bibinfo.check + } + if$ +} +FUNCTION {format.tr.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ bbl.techrep } + 'skip$ + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ "t" change.case$ } + { tie.or.space.prefix * * } + if$ +} +FUNCTION {format.article.crossref} +{ + word.in + " \cite{" * crossref * "}" * +} +FUNCTION {format.book.crossref} +{ volume duplicate$ empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + pop$ word.in + } + { bbl.volume + capitalize + swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * + } + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.incoll.inproc.crossref} +{ + word.in + " \cite{" * crossref * "}" * +} +FUNCTION {format.org.or.pub} +{ 't := + "" + address empty$ t empty$ and + 'skip$ + { + t empty$ + { address "address" bibinfo.check * + } + { t * + address empty$ + 'skip$ + { ", " * address "address" bibinfo.check * } + if$ + } + if$ + } + if$ +} +FUNCTION {format.publisher.address} +{ publisher "publisher" bibinfo.warn format.org.or.pub +} + +FUNCTION {format.organization.address} +{ organization "organization" bibinfo.check format.org.or.pub +} + +FUNCTION {archiveprefix.or.eprinttype} % holder for eprinttype with archiveprefix precedence +{ + archiveprefix empty$ + { + eprinttype empty$ + { "" } % not using 'skip$ to reduce errors like "nothing to pop from stack" + { eprinttype } + if$ + } + { archiveprefix } + if$ +} + +FUNCTION {output.eprint} % this is only used with the @misc record type (common for arXiv and other preprint server bibtex records) +{ + eprint empty$ + {% if eprint field is empty + publisher field.or.null "arXiv" = % field.or.null here helps when no publisher field in the record + { publisher " preprint" * } % add " preprint" to publisher with the idea that publisher is the name of the preprint server + { "" } % if publisher != "arXiv" then empty output + if$ + emphasize % no output function after emphasize because nothing goes after this + } + {% if eprint field is not empty + archiveprefix.or.eprinttype empty$ + { "" } % not using 'skip$ to reduce errors like "nothing to pop from stack" + {% if archiveprefix or eprinttype fields are not empty + journal empty$ + { "Preprint" } % if journal field is empty: output just "Preprint" emphasized like a journal name + { journal } % if journal field is not empty, output it (takes precedence) + if$ + emphasize output % emphasize what we formed before, setting output as a border to the subblock that follows with the comma delimiter + archiveprefix.or.eprinttype ":" * eprint * % subblock with eprinttype and eprint number + } + if$ + } + if$ +} + +% urlbst... +% Functions for making hypertext links. +% In all cases, the stack has (link-text href-url) +% +% make 'null' specials +FUNCTION {make.href.null} +{ + pop$ +} +% make hypertex specials +FUNCTION {make.href.hypertex} +{ + "\special {html: }" * swap$ * + "\special {html:}" * +} +% make hyperref specials +FUNCTION {make.href.hyperref} +{ + "\href {" swap$ * "} {\path{" * swap$ * "}}" * +} +FUNCTION {make.href} +{ hrefform #2 = + 'make.href.hyperref % hrefform = 2 + { hrefform #1 = + 'make.href.hypertex % hrefform = 1 + 'make.href.null % hrefform = 0 (or anything else) + if$ + } + if$ +} + +% If inlinelinks is true, then format.url should be a no-op, since it's +% (a) redundant, and (b) could end up as a link-within-a-link. +FUNCTION {format.url} +{ inlinelinks #1 = url empty$ or + { "" } + { hrefform #1 = + { % special case -- add HyperTeX specials + urlintro "\url{" url * "}" * url make.href.hypertex * } + { urlintro "\url{" * url * "}" * } + if$ + } + if$ +} +FUNCTION {format.eprint} +{ eprint empty$ + { "" } + { eprintprefix eprint * eprinturl eprint * make.href } + if$ +} + +FUNCTION {format.doi} +{ doi empty$ + { "" } + { doi parse.doi % leaves "https://doi.org/DOI" DOI on the stack + 's := 't := + doiform #1 = + { "\doi{" s * "}" * } + { doiprefix s * t make.href } + if$ + } + if$ +} + +FUNCTION {format.pubmed} +{ pubmed empty$ + { "" } + { pubmedprefix pubmed * pubmedurl pubmed * make.href } + if$ +} + +% Output a URL. We can't use the more normal idiom (something like +% `format.url output'), because the `inbrackets' within +% format.lastchecked applies to everything between calls to `output', +% so that `format.url format.lastchecked * output' ends up with both +% the URL and the lastchecked in brackets. +FUNCTION {output.url} +{ url empty$ + 'skip$ + { new.block + format.url output + format.lastchecked output + } + if$ +} + +FUNCTION {output.web.refs} +{ + new.block + inlinelinks + 'skip$ % links were inline -- don't repeat them + { % If the generated DOI will be the same as the URL, + % then don't print the URL (thanks to Joseph Wright + % for (the original version of) this code, + % at http://tex.stackexchange.com/questions/5660) + adddoi + doi empty$ { "X" } { doi parse.doi pop$ } if$ % DOI URL to be generated + url empty$ { "Y" } { url } if$ % the URL, or "Y" if empty + = % are the strings equal? + and + 'skip$ + { output.url } + if$ + addeprints eprint empty$ not and + { format.eprint output.nonnull } + 'skip$ + if$ + adddoi doi empty$ not and + { format.doi output.nonnull } + 'skip$ + if$ + addpubmed pubmed empty$ not and + { format.pubmed output.nonnull } + 'skip$ + if$ + } + if$ +} + +% Wrapper for output.bibitem.original. +% If the URL field is not empty, set makeinlinelink to be true, +% so that an inline link will be started at the next opportunity +FUNCTION {output.bibitem} +{ outside.brackets 'bracket.state := + output.bibitem.original + inlinelinks url empty$ not doi empty$ not or pubmed empty$ not or eprint empty$ not or and + { #1 'makeinlinelink := } + { #0 'makeinlinelink := } + if$ +} + +% Wrapper for fin.entry.original +FUNCTION {fin.entry} +{ output.web.refs % urlbst + makeinlinelink % ooops, it appears we didn't have a title for inlinelink + { possibly.setup.inlinelink % add some artificial link text here, as a fallback + linktextstring output.nonnull } + 'skip$ + if$ + bracket.state close.brackets = % urlbst + { "]" * } + 'skip$ + if$ + fin.entry.original +} + +% Webpage entry type. +% Title and url fields required; +% author, note, year, month, and lastchecked fields optional +% See references +% ISO 690-2 http://www.nlc-bnc.ca/iso/tc46sc9/standard/690-2e.htm +% http://www.classroom.net/classroom/CitingNetResources.html +% http://neal.ctstateu.edu/history/cite.html +% http://www.cas.usf.edu/english/walker/mla.html +% for citation formats for web pages. +FUNCTION {webpage} +{ output.bibitem + author empty$ + { editor empty$ + 'skip$ % author and editor both optional + { format.editors output.nonnull } + if$ + } + { editor empty$ + { format.authors output.nonnull } + { "can't use both author and editor fields in " cite$ * warning$ } + if$ + } + if$ + new.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ + format.title "title" output.check + inbrackets onlinestring output + new.block + year empty$ + 'skip$ + { format.date "year" output.check } + if$ + % We don't need to output the URL details ('lastchecked' and 'url'), + % because fin.entry does that for us, using output.web.refs. The only + % reason we would want to put them here is if we were to decide that + % they should go in front of the rather miscellaneous information in 'note'. + new.block + note output + fin.entry +} +% ...urlbst to here + + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst + format.title "title" output.check + new.block + crossref missing$ + { + journal + "journal" bibinfo.check + emphasize + "journal" output.check + possibly.setup.inlinelink format.vol.num.pages output% urlbst + } + { format.article.crossref output.nonnull + format.pages output + } + if$ + new.block + format.note output + fin.entry +} +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + editor format.key output + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + format.date "year" output.check + date.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst + format.btitle "title" output.check + format.edition output + crossref missing$ + { format.bvolume output + new.block + format.number.series output + new.sentence + format.publisher.address output + } + { + new.block + format.book.crossref output.nonnull + } + if$ + new.block + format.note output + fin.entry +} +FUNCTION {booklet} +{ output.bibitem + format.authors output + author format.key output + format.date "year" output.check + date.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst + format.title "title" output.check + new.block + howpublished "howpublished" bibinfo.check output + address "address" bibinfo.check output + new.block + format.note output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + editor format.key output + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + format.date "year" output.check + date.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst + format.btitle "title" output.check + crossref missing$ + { + format.edition output + format.bvolume output + format.chapter "chapter" output.check + new.block + format.number.series output + new.sentence + format.publisher.address output + } + { + format.chapter "chapter" output.check + new.block + format.book.crossref output.nonnull + } + if$ + new.block + format.note output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.edition output + format.bvolume output + format.number.series output + format.chapter.pages output + new.sentence + format.publisher.address output + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ + new.block + format.note output + fin.entry +} +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst + format.title "title" output.check + new.block + crossref missing$ + { format.in.booktitle "booktitle" output.check + format.bvolume output + format.number.series output + format.pages output + address "address" bibinfo.check output + new.sentence + organization "organization" bibinfo.check output + publisher "publisher" bibinfo.check output + } + { format.incoll.inproc.crossref output.nonnull + format.pages output + } + if$ + new.block + format.note output + fin.entry +} +FUNCTION {conference} { inproceedings } +FUNCTION {manual} +{ output.bibitem + format.authors output + author format.key output + format.date "year" output.check + date.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst + format.btitle "title" output.check + format.edition output + organization address new.block.checkb + organization "organization" bibinfo.check output + address "address" bibinfo.check output + new.block + format.note output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst + format.title + "title" output.check + new.block + bbl.mthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + month "month" bibinfo.check output + new.block + format.note output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + author format.key output + format.date "year" output.check + date.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst + format.title output + new.block + howpublished "howpublished" bibinfo.check output + new.block + output.eprint output + new.block + format.note output + fin.entry +} +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst + format.btitle + "title" output.check + new.block + bbl.phdthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + new.block + format.note output + fin.entry +} + +FUNCTION {presentation} +{ output.bibitem + format.authors output + author format.key output + new.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst + format.title output + new.block + format.organization.address "organization and address" output.check + month "month" output.check + year "year" output.check + new.block + format.note output + new.sentence + type missing$ 'skip$ + {"(" type capitalize * ")" * output} + if$ + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + format.editors output + editor format.key output + format.date "year" output.check + date.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst + format.btitle "title" output.check + format.bvolume output + format.number.series output + new.sentence + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + new.sentence + format.publisher.address output + } + if$ + new.block + format.note output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst + format.title + "title" output.check + new.block + format.tr.number output.nonnull + institution "institution" bibinfo.warn output + address "address" bibinfo.check output + new.block + format.note output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst + format.title "title" output.check + new.block + format.note "note" output.check + fin.entry +} + +FUNCTION {default.type} { misc } +READ +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} +INTEGERS { len } +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} +FUNCTION {format.lab.names} +{ 's := + "" 't := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ + " " * bbl.etal * + } + { #2 < + 'skip$ + { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { + " " * bbl.etal * + } + { bbl.and space.word * s #2 "{vv~}{ll}" format.name$ + * } + if$ + } + if$ + } + if$ +} + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.label} +{ editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.short.authors} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.label + 'author.key.label + if$ + } + if$ + 'short.list := +} + +FUNCTION {calc.label} +{ calc.short.authors + short.list + "(" + * + year duplicate$ empty$ + short.list key field.or.null = or + { pop$ "" } + 'skip$ + if$ + * + 'label := +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" + format.name$ 't := + nameptr #1 > + { + " " * + namesleft #1 = t "others" = and + { "zzzzz" 't := } + 'skip$ + if$ + t sortify * + } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {editor.sort} +{ editor empty$ + { key empty$ + { "to sort, need editor or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ +} +FUNCTION {presort} +{ calc.label + label sortify + " " + * + type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.sort + 'author.sort + if$ + } + if$ + #1 entry.max$ substring$ + 'sort.label := + sort.label + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {presort} +SORT +STRINGS { last.label next.extra } +INTEGERS { last.extra.num last.extra.num.extended last.extra.num.blank number.label } +FUNCTION {initialize.extra.label.stuff} +{ #0 int.to.chr$ 'last.label := + "" 'next.extra := + #0 'last.extra.num := + "a" chr.to.int$ #1 - 'last.extra.num.blank := + last.extra.num.blank 'last.extra.num.extended := + #0 'number.label := +} +FUNCTION {forward.pass} +{ last.label label = + { last.extra.num #1 + 'last.extra.num := + last.extra.num "z" chr.to.int$ > + { "a" chr.to.int$ 'last.extra.num := + last.extra.num.extended #1 + 'last.extra.num.extended := + } + 'skip$ + if$ + last.extra.num.extended last.extra.num.blank > + { last.extra.num.extended int.to.chr$ + last.extra.num int.to.chr$ + * 'extra.label := } + { last.extra.num int.to.chr$ 'extra.label := } + if$ + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + label 'last.label := + } + if$ + number.label #1 + 'number.label := +} +FUNCTION {reverse.pass} +{ next.extra "b" = + { "a" 'extra.label := } + 'skip$ + if$ + extra.label 'next.extra := + extra.label + duplicate$ empty$ + 'skip$ + { year field.or.null #-1 #1 substring$ chr.to.int$ #65 < + { "{\natexlab{" swap$ * "}}" * } + { "{(\natexlab{" swap$ * "})}" * } + if$ } + if$ + 'extra.label := + label extra.label * 'label := +} +EXECUTE {initialize.extra.label.stuff} +ITERATE {forward.pass} +REVERSE {reverse.pass} +FUNCTION {bib.sort.order} +{ sort.label + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} +ITERATE {bib.sort.order} +SORT +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" number.label int.to.str$ * "}" * + write$ newline$ + "\providecommand{\natexlab}[1]{#1}" + write$ newline$ +} +EXECUTE {begin.bib} +EXECUTE {init.urlbst.variables} % urlbst +EXECUTE {init.state.consts} +ITERATE {call.type$} +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} +EXECUTE {end.bib} +%% End of customized bst file +%% +%% End of file `acl_natbib_basic.bst'. diff --git a/reports/iwsds2025/custom.bib b/reports/iwsds2025/custom.bib new file mode 100644 index 0000000..3f00350 --- /dev/null +++ b/reports/iwsds2025/custom.bib @@ -0,0 +1,34 @@ +% Use this file for citations not found in the ACL Anthology (contained in "anthology.bib"). + +@book{larsson_issue-based_2002, + author = {Staffan Larsson}, + title = {Issue-based dialogue management}, + year = {2002}, + publisher = {Department of Linguistics, G{\"o}teborg University} +} + + +@article{harel_statecharts_1987, + author = {David Harel}, + title = {Statecharts: a visual formalism for complex systems}, + journal = {Science of Computer Programming}, + volume = {8}, + number = {3}, + pages = {231-274}, + year = {1987}, + issn = {0167-6423}, + doi = {https://doi.org/10.1016/0167-6423(87)90035-9}, + url = {https://www.sciencedirect.com/science/article/pii/0167642387900359} +} + +@inproceedings{larsson_pre-generative_2024, + author = {Staffan Larsson}, + title = {Pre-Generative Conversational AI}, + booktitle = {Proceedings of the 28th Workshop on the Semantics and Pragmatics of Dialogue - Poster Abstracts}, + month = {sep}, + year = {2024}, + address = {Trento, Italy}, + publisher = {SEMDIAL}, + url = {http://semdial.org/anthology/Z24-Larsson_semdial_0023.pdf} +} + diff --git a/reports/iwsds2025/flake.lock b/reports/iwsds2025/flake.lock new file mode 100644 index 0000000..2468070 --- /dev/null +++ b/reports/iwsds2025/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1735563628, + "narHash": "sha256-OnSAY7XDSx7CtDoqNh8jwVwh4xNL/2HaJxGjryLWzX8=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b134951a4c9f3c995fd7be05f3243f8ecd65d798", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/reports/iwsds2025/flake.nix b/reports/iwsds2025/flake.nix new file mode 100644 index 0000000..831744c --- /dev/null +++ b/reports/iwsds2025/flake.nix @@ -0,0 +1,75 @@ +# edited from https://flyx.org/nix-flakes-latex/ + +{ + description = "Reproducible LaTeX Document"; + + inputs = { + nixpkgs.url = github:NixOS/nixpkgs/nixos-24.05; + flake-utils.url = github:numtide/flake-utils; + }; + + outputs = { self, nixpkgs, flake-utils }: + with flake-utils.lib; eachSystem allSystems (system: + let + + # do not include ".tex" + documentName = "main"; + + pkgs = nixpkgs.legacyPackages.${system}; + + + # use this to get everything + # tex = pkgs.texlive.combined.scheme-full; + + myEmacsConfig = pkgs.writeText "default.el" '' + (org-babel-do-load-languages + 'org-babel-load-languages + '((plantuml . t))) + (setq org-plantuml-exec-mode 'plantuml + org-plantuml-args '("-headless")) + (setq org-confirm-babel-evaluate nil) + ''; + + + # use this and add what you need for a lighter load on your nix store + tex = pkgs.texlive.combine { + inherit (pkgs.texlive) scheme-small latexmk + psnfss + helvetic + booktabs + courier + caption + siunitx + url + inconsolata + lipsum + tipa + enumitem + hyperref + biblatex + biblatex-ieee + biber + glossaries + eqparbox + environ + + # for emacs latex + wrapfig + capt-of + svg + catchfile + transparent + ; + }; + + in rec { + devShell = pkgs.mkShell { + buildInputs = [ pkgs.coreutils tex pkgs.gzip pkgs.perl pkgs.emacs pkgs.plantuml pkgs.imagemagick pkgs.inkscape pkgs.git + ]; + shellHook = '' + export MYEMACSLOAD=${myEmacsConfig} + ''; + }; + } + ); +} diff --git a/reports/iwsds2025/img/.placeholder b/reports/iwsds2025/img/.placeholder new file mode 100644 index 0000000..e69de29 diff --git a/reports/iwsds2025/iwsds2025.bib b/reports/iwsds2025/iwsds2025.bib new file mode 100644 index 0000000..8c2de57 --- /dev/null +++ b/reports/iwsds2025/iwsds2025.bib @@ -0,0 +1,11 @@ +@inproceedings{maraev_non-humorous_2021, + author = {Vladislav Maraev and Jean-Philippe Bernardy and Christine Howes}, + keywords = {vm-myself}, + title = {Non-humorous Use of Laughter in Spoken Dialogue Systems}, + booktitle = {Linguistic and Cognitive Approaches to Dialog Agents (LaCATODA 2021)}, + year = {2021}, + pages = {33--44}, + url = {http://ceur-ws.org/Vol-2935/paper4.pdf}, + note = {Part of PhD thesis} +} + diff --git a/reports/iwsds2025/iwsds2025.org b/reports/iwsds2025/iwsds2025.org new file mode 100644 index 0000000..f2a3e71 --- /dev/null +++ b/reports/iwsds2025/iwsds2025.org @@ -0,0 +1,123 @@ +# -*- org-latex-pdf-process: ("latexmk -quiet -shell-escape -f %f"); org-latex-default-packages-alist: nil; org-latex-packages-alist: nil; org-latex-with-hyperref: nil -*- + + +#+OPTIONS: toc:nil author:nil +#+LATEX_CLASS: article +#+LATEX_CLASS_OPTIONS: [11pt] + +#+LATEX_HEADER: \usepackage[review]{acl} +#+LATEX_HEADER: \usepackage{times} +#+LATEX_HEADER: \usepackage{latexsym} +#+LATEX_HEADER: \usepackage[tracking=smallcaps]{microtype} +#+LATEX_HEADER: \usepackage{inconsolata} +#+LATEX_HEADER: \usepackage{graphicx} + +#+LATEX_HEADER: \usepackage{glossaries} +#+LATEX_HEADER: \setacronymstyle{long-sc-short} +#+LATEX_HEADER: \newacronym{isu}{isu}{information state update} +#+LATEX_HEADER: \newacronym{llm}{llm}{large language model} +#+LATEX_HEADER: \newacronym{sisu}{sisu}{Statecharts-based implementation of Information State Update} + +#+LATEX_HEADER: \hypersetup{colorlinks=true, citecolor=darkblue, linkcolor=black, urlcolor=darkblue} + +#+LATEX_HEADER: \author{First Author \\ +#+LATEX_HEADER: Affiliation / Address line 1 \\ +#+LATEX_HEADER: Affiliation / Address line 2 \\ +#+LATEX_HEADER: Affiliation / Address line 3 \\ +#+LATEX_HEADER: \texttt{email@domain} \\\And +#+LATEX_HEADER: Second Author \\ +#+LATEX_HEADER: Affiliation / Address line 1 \\ +#+LATEX_HEADER: Affiliation / Address line 2 \\ +#+LATEX_HEADER: Affiliation / Address line 3 \\ +#+LATEX_HEADER: \texttt{email@domain} \\} + +#+cite_export: natbib acl_natbib +#+bibliography: custom.bib + +#+TITLE: SISU: Statecharts-based implementation of Information State Update +#+AUTHOR: + +#+begin_abstract +The rise of LLM-based approaches to dialogue systems has created an increased need for controllable dialogue. This paper addresses this need by presenting an implementation of a dialogue system based on information state update approach according to [cite/t:@larsson_issue-based_2002]. This enables the integration of rule-based handling of dialogue, expressed by Harel's statecharts, and Larsson's theoretical account grounded in theories of dialogue, expressed by information state update rules. We demonstrate how our approach applies to dialogue domains involving form-filling. We also propose how LLMs can be employed to inject domain knowledge and be used in various components of hybrid dialogues systems, while maintaining control over the overall dialogue logic. +#+end_abstract +* Introduction + +\Glspl{llm} remain undeniably uncontrolled, but their capabilities +have raised the bar for conversational AI. This makes a compelling +argument for using \gls{isu} approach to mitigate the risks associated +with using \glspl{llm}. In controlled \gls{isu}-based systems, LLMs +offer benefits such as pre-generating dialogue domains +[cite:@larsson_pre-generative_2024] and generating natural language +responses. + +In our proposed framework, \gls{sisu}, we combine the statecharts formalism +[cite:@harel_statecharts_1987] with modern features of the TypeScript programming +language. This allows us to run dialogue applications in both frontend +(in-browser voice-enabled dialogue) and backend (controlling social +robots, running automated tests) environments. + +\Gls{sisu} implements a version of IBiS1 [cite:@larsson_issue-based_2002], but improves upon +it by providing the capacity to code parts of a dialogue domain using +statecharts. This is particularly useful for domains and aspects that +have only a procedural description. + + +* DME + +#+begin_src plantuml :results value file :file img/dme.pdf :exports results + hide empty description + state DME { + state Select + state Update + [*] -> Select + Select -> Update + Update -> Select + } +#+end_src + +#+ATTR_LATEX: :float t :placement [h] :width 0.5\linewidth +#+RESULTS: +[[file:img/dme.pdf]] + +#+begin_src plantuml :results value file :file img/select.pdf :exports results + hide empty description + state Select { + state SelectAction + state SelectMove + [*] --> SelectAction + SelectAction -> SelectMove: (/select_respond) + SelectAction -> SelectMove: (/select_from_plan) + SelectAction -> SelectMove + SelectMove -> SelectionDone: (/select_ask) + SelectMove -> SelectionDone: (/select_answer) + SelectMove -> SelectionDone: (/select_other) + SelectMove -> SelectionDone + SelectionDone --> [*]: /sendBackNextMoves + } +#+end_src + +#+ATTR_LATEX: :float multicolumn :placement [h] +#+RESULTS: +[[file:img/select.pdf]] + +#+begin_src plantuml :results value file :file img/update.pdf :exports results + hide empty description + state Update { + [*] -> Init + Init -> Grounding: (/clear_agenda) + Grounding -> Integrate: SAYS\n/updateLatestMoves\n/get_latest_move + Integrate -> DowndateQUD: (/integrate_usr_request) + Integrate -> DowndateQUD: (/integrate_sys_ask) + Integrate -> DowndateQUD: (/integrate_usr_ask) + Integrate -> DowndateQUD: (/integrate_answer) + Integrate -> DowndateQUD: (/integrate_greet) + Integrate -> DowndateQUD + DowndateQUD --> [*] + } +#+end_src + +#+ATTR_LATEX: :float multicolumn :placement [h] +#+RESULTS: +[[file:img/update.png]] + +#+print_bibliography: