summaryrefslogtreecommitdiff
path: root/fonts/spark-otf
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /fonts/spark-otf
Initial commit
Diffstat (limited to 'fonts/spark-otf')
-rw-r--r--fonts/spark-otf/Changes11
-rw-r--r--fonts/spark-otf/README.md17
-rw-r--r--fonts/spark-otf/doc/spark-otf-doc.bib45
-rw-r--r--fonts/spark-otf/doc/spark-otf-doc.pdfbin0 -> 106096 bytes
-rw-r--r--fonts/spark-otf/doc/spark-otf-doc.tex446
-rw-r--r--fonts/spark-otf/latex/spark-otf.sty161
6 files changed, 680 insertions, 0 deletions
diff --git a/fonts/spark-otf/Changes b/fonts/spark-otf/Changes
new file mode 100644
index 0000000000..4425b163de
--- /dev/null
+++ b/fonts/spark-otf/Changes
@@ -0,0 +1,11 @@
+0.05 2019-04-13 - fix for new fontnames and more styles
+0.04 2017-09-26 - fix for filenames
+ - added short form ! for marks
+ - added char sets for the documentation
+0.03 2017-09-24 - added color
+ - fix for \IfValueTF->\IfBooleanTF
+ - fix for xelatex
+0.02 2017-09-21 - added a star version for LuaLaTeX which
+ allows any values in the data list
+ - added error message for pdflatex
+0.01 2017-09-19 - first CTAN version
diff --git a/fonts/spark-otf/README.md b/fonts/spark-otf/README.md
new file mode 100644
index 0000000000..0fd25d8a04
--- /dev/null
+++ b/fonts/spark-otf/README.md
@@ -0,0 +1,17 @@
+# README #
+Package spark-otf supports the free fonts from
+"After the Flood" which are available from the
+website https://aftertheflood.com/projects/sparks/
+or from https://github.com/aftertheflood/spark
+
+Following font files are supported:
+
+- Sparks-Bar-???.otf
+- Sparks-Dotline-???.otf
+- Sparks-Dot-???.otf
+
+
+
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
diff --git a/fonts/spark-otf/doc/spark-otf-doc.bib b/fonts/spark-otf/doc/spark-otf-doc.bib
new file mode 100644
index 0000000000..9dde6057b7
--- /dev/null
+++ b/fonts/spark-otf/doc/spark-otf-doc.bib
@@ -0,0 +1,45 @@
+@online{fontconfig,
+ author ={{\texttt{freedesktop.org}}},
+ sortname = {freedesktop},
+ title = {Fontconfig},
+ subtitle = {A library for configuring and customizing font access},
+ date = {2017-07-05},
+ urldate={2017-09-26},
+ url = {https://www.freedesktop.org/wiki/Software/fontconfig/}
+}
+@online{wikipedia,
+ author = {{\WikipediA}},
+ sortlabel = {Wikipedia},
+ sortname = {Wikipedia},
+ title = {Sparkline},
+ date = {2017-09-03},
+ urldate = {2017-09-19},
+ url = {https://en.wikipedia.org/wiki/Sparkline},
+}
+
+@online{features,
+ author = {{\WikipediA}},
+ sortlabel = {Wikipedia},
+ sortname = {Wikipedia},
+ title = {List of typographic features},
+ date = {2017-02-21},
+ urldate = {2017-03-24},
+ url = {https://en.wikipedia.org/wiki/List_of_typographic_features},
+}
+
+@online{tufte,
+ author = {Edward Tufte},
+ title = {History of Sparklines and Edward Tufte Contribution},
+ date = {2017-09-19},
+ urldate = {2017-09-19},
+ url = {https://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=000AIr00},
+}
+
+@online{atf,
+author = {Max Gadney and Mike Gallagher and Nick Cross and Sabih Ali},
+title = {AtF Spark},
+subtitle = {Our new typeface for code-free sparklines},
+Organisation = {After the flood},
+url = {https://aftertheflood.com/projects/sparks/},
+}
+
diff --git a/fonts/spark-otf/doc/spark-otf-doc.pdf b/fonts/spark-otf/doc/spark-otf-doc.pdf
new file mode 100644
index 0000000000..e436bd73c0
--- /dev/null
+++ b/fonts/spark-otf/doc/spark-otf-doc.pdf
Binary files differ
diff --git a/fonts/spark-otf/doc/spark-otf-doc.tex b/fonts/spark-otf/doc/spark-otf-doc.tex
new file mode 100644
index 0000000000..d92461a66e
--- /dev/null
+++ b/fonts/spark-otf/doc/spark-otf-doc.tex
@@ -0,0 +1,446 @@
+%% $Id: spark-otf-doc.tex 1047 2019-04-12 17:22:07Z herbert $
+%
+\listfiles
+\documentclass[fontsize=11pt,DIV=14,parskip=half-]{scrartcl}
+\usepackage{fontspec}
+\usepackage{graphicx}
+\usepackage{multido,showexpl}
+\usepackage[%usefilenames,
+ TT={Scale=0.88,FakeStretch=0.9},
+ SS={Scale=0.9},
+ RM={Scale=0.9},
+ DefaultFeatures={Ligatures=TeX}]{lucida-otf} % support opentype math fonts
+\usepackage[usefilenames=false]{spark-otf} % support opentype spark fonts
+\makeatletter
+\let\SparkVersion\spark@version
+\makeatother
+\newsavebox\ZBox \newsavebox\SBox
+
+\usepackage{biblatex}
+\addbibresource{\jobname.bib}
+
+\usepackage{dtk-logos} % for Wikipedia W
+
+\pagestyle{headings}
+
+\usepackage[colorlinks,hyperfootnotes=false]{hyperref}
+% define \code for url-like breaking of typewriter fragments.
+\ifx\nolinkurl\undefined \let\code\url \else \let\code\nolinkurl \fi
+
+% Define \cs to prepend a backslash, and be unbreakable:
+\DeclareRobustCommand\cs[1]{\mbox{\texttt{\char`\\#1}}}
+
+
+\title{Support for the Spark OpenType fonts \\--\\ v.~\SparkVersion}
+\author{Herbert Voß}
+\begin{document}
+\maketitle
+\tableofcontents
+
+\section{Introduction}
+
+A sparkline is a very small line chart, typically drawn without axes or coordinates.
+It presents the general shape of the variation (typically over time) in some measurement,
+such as temperature or stock market price, in a simple and highly condensed way.
+Sparklines are small enough to be embedded in text, or several sparklines may be
+grouped together as elements of a small multiple. Whereas the typical chart is
+designed to show as much data as possible, and is set off from the flow of text,
+sparklines are intended to be succinct, memorable, and located where they are discussed.~\cite{wikipedia}
+
+
+\section{The fonts}
+
+The fonts are available from \url{https://github.com/aftertheflood/spark} and should be saved
+either in \path{Library/fonts/} (MAC OSX), \path{c:\Windows\Fonts} (Windows) or
+\path{/usr/local/share/fonts} (Linux) or any other location where
+the fonts will be found by the system.
+
+\begin{verbatim}
+Sparks-Bar-Extranarrow.otf
+Sparks-Bar-Extrawide.otf
+Sparks-Bar-Medium.otf
+Sparks-Bar-Narrow.otf
+Sparks-Bar-Wide.otf
+Sparks-Dot-Extralarge.otf
+Sparks-Dot-Extrasmall.otf
+Sparks-Dot-Large.otf
+Sparks-Dot-Medium.otf
+Sparks-Dot-Small.otf
+Sparks-Dotline-Extrathick.otf
+Sparks-Dotline-Extrathin.otf
+Sparks-Dotline-Medium.otf
+Sparks-Dotline-Thick.otf
+Sparks-Dotline-Thin.otf
+\end{verbatim}
+%-rw-r--r-- 1 voss voss 24708 Sep 15 11:20 Spark - Bar - Medium.otf
+%-rw-r--r-- 1 voss voss 24696 Sep 15 11:20 Spark - Bar - Narrow.otf
+%-rw-r--r-- 1 voss voss 24680 Sep 15 11:20 Spark - Bar - Thin.otf
+%-rw-r--r-- 1 voss voss 22140 Sep 15 11:20 Spark - Dot-line - Medium.otf
+%-rw-r--r-- 1 voss voss 24616 Sep 15 11:20 Spark - Dot - Medium.otf
+%-rw-r--r-- 1 voss voss 24580 Sep 15 11:20 Spark - Dot - Small.otf
+
+
+The package defines the following font macros (using symbol names):
+
+\small
+\begin{verbatim}
+\newfontface\sparkBarMedium{Spark-Bar-Medium}[RawFeature=+calt,\spark@DefaultFeatures]
+\newfontface\sparkBarNarrow{Spark-Bar-Narrow}[RawFeature=+calt,\spark@DefaultFeatures]
+\newfontface\sparkBarExtranarrow{Spark-Bar-Extranarrow}[RawFeature=+calt,\spark@DefaultFeatures]
+\newfontface\sparkBarWide{Spark-Bar-Wide}[RawFeature=+calt,\spark@DefaultFeatures]
+\newfontface\sparkBarExtrawide{Spark-Bar-Extrawide}[RawFeature=+calt,\spark@DefaultFeatures]
+%
+\newfontface\sparkDotLineMedium{Spark-Dotline-Medium}[RawFeature=+calt,\spark@DefaultFeatures]
+\newfontface\sparkDotLineThick{Spark-Dotline-Thick}[RawFeature=+calt,\spark@DefaultFeatures]
+\newfontface\sparkDotLineExtrathick{Spark-Dotline-Extrathick}[RawFeature=+calt,\spark@DefaultFeatures]
+\newfontface\sparkDotLineThin{Spark-Dotline-Thin}[RawFeature=+calt,\spark@DefaultFeatures]
+\newfontface\sparkDotLineExtrathin{Spark-Dotline-Extrathin}[RawFeature=+calt,\spark@DefaultFeatures]
+%
+\newfontface\sparkDotMedium{Spark-Dot-Medium}[RawFeature=+calt,\spark@DefaultFeatures]
+\newfontface\sparkDotSmall{Spark-Dot-Small}[RawFeature=+calt,\spark@DefaultFeatures]
+\newfontface\sparkDotExtralarge{Spark-Dot-Extralarge}[RawFeature=+calt,\spark@DefaultFeatures]
+\newfontface\sparkDotExtrasmall{Spark-Dot-Extrasmall}[RawFeature=+calt,\spark@DefaultFeatures]
+\end{verbatim}
+
+\normalsize
+
+\section{The macros}
+
+\begin{verbatim}
+\sparkBar[<Type>][<No>]{values}[<No>]
+\sparkDot[<Type>][<No>]{values}[<No>]
+\sparkDotline[<Type>][<No>]{values}[<No>]
+\sparkBar*[<Type>][<No>]{values}[<No>]
+\sparkDot*[<Type>][<No>]{values}[<No>]
+\sparkDotline*[<Type>][<No>]{values}[<No>]
+\sparkBar[<Type>]{!value,values,...,!value}
+\sparkDot[<Type>]{!value,values,...,!value}
+\sparkDotline[<Type>]{!value,values,...,!value}
+\sparkBar*[<Type>]{!value,values,...,!value}
+\sparkDot*[<Type>]{!value,values,...,!value}
+\sparkDotline*[<Type>]{!value,values,...,!value}
+\end{verbatim}
+
+If \texttt{[<Type>]} is missing, \texttt{Medium} is assumed. The type is mandatory if you use
+the first \texttt{[<No>]} argument! The star versions are only valid for Lua\LaTeX\ where the values
+can be of any interval. They will be changed to the allowed interval:
+
+\begin{itemize}
+\item for \cs{sparkDotline}: $[0,9]$
+\item for all other: $[0,100]$
+\end{itemize}
+
+
+Instead of using the optional arguments for printing the first and/or last value you
+can use the !-notation, then the first and/or last listed value are printed. There is no difference
+in using the optional arguments; it saves only some keystrokes if the printed values are
+the same as in the list.
+
+\section{Text examples}
+
+\subsection{Bars}
+
+\typeout{Bar-Medium}%
+
+\subsubsection{Bar-Medium}
+
+\begin{LTXexample}[pos=t]
+Text \sparkBar{14,95,68,9,19,41,91,1,81,97,79,45,96,76,17,65,8,92} Text\\
+Text \sparkBar[Medium]{14,95,68,9,19,41,91,1,81,97,79,45,96,76,17,65,8,92} Text\\
+Text \sparkBar[Medium][14]{14,95,68,9,19,41,91,1,81,97,79,45,96,76,17,65,8,92}[92] Text\\
+Text \sparkBar{!14,95,68,9,19,41,91,1,81,97,79,45,96,76,17,65,8,!92} Text
+\end{LTXexample}
+
+
+\subsubsection{Bar-Narrow}
+
+\begin{LTXexample}[pos=t]
+Text \sparkBar[Narrow]{19,32,93,4,95,46,13,23,50,86,94,68,58,41,89,57,74,8} Text\\
+Text \sparkBar[Narrow][19]{19,32,93,4,95,46,13,23,50,86,94,68,58,41,89,57,74,!8} Text\\
+Text \sparkBar[Narrow]{!19,32,93,4,95,46,13,23,50,86,94,68,58,41,89,57,74,!8} Text
+\end{LTXexample}
+
+
+\subsubsection{Bar-Extranarrow}
+
+\begin{LTXexample}[pos=t]
+Text \sparkBar[Extranarrow]{19,32,93,4,95,46,13,23,50,86,94,68,58,41,89,57,74,8} Text\\
+Text \sparkBar[Extranarrow][19]{19,32,93,4,95,46,13,23,50,86,94,68,58,41,89,57,74,!8} Text\\
+Text \sparkBar[Extranarrow]{!19,32,93,4,95,46,13,23,50,86,94,68,58,41,89,57,74,!8} Text
+\end{LTXexample}
+
+
+\subsubsection{Bar-Wide}
+
+\begin{LTXexample}[pos=t]
+Text \sparkBar[Wide]{13,15,59,73,42,1,41,51,4,97,35,55,37,24,89,21,30,22} Text\\
+Text \sparkBar[Wide][13]{13,15,59,73,42,1,41,51,4,97,35,55,37,24,89,21,30,22}[22] Text\\
+Text \sparkBar[Wide]{!13,15,59,73,42,1,41,51,4,97,35,55,37,24,89,21,30,22} Text\\
+Text \sparkBar[Wide]{!13,15,59,73,42,1,41,51,4,97,35,55,37,24,89,21,30,!22} Text
+\end{LTXexample}
+
+
+\subsubsection{Bar-Extrawide}
+
+\begin{LTXexample}[pos=t]
+Text \sparkBar[Extrawide]{13,15,59,73,42,1,41,51,4,97,35,55,37,24,89,21,30,22} Text\\
+Text \sparkBar[Extrawide][13]{13,15,59,73,42,1,41,51,4,97,35,55,37,24,89,21,30,22}[22] Text\\
+Text \sparkBar[Extrawide]{!13,15,59,73,42,1,41,51,4,97,35,55,37,24,89,21,30,22} Text\\
+Text \sparkBar[Extrawide]{!13,15,59,73,42,1,41,51,4,97,35,55,37,24,89,21,30,!22} Text
+\end{LTXexample}
+
+
+
+\subsection{Dots}
+
+\subsubsection{Dot-Medium -- the default}
+
+\begin{LTXexample}[pos=t]
+Text \sparkDot{54,39,26,65,29,58,36,99,16,56,76,69,71,77,7,40,79,1} Text\\
+Text \sparkDot[Medium][54]{54,39,26,65,29,58,36,99,16,56,76,69,71,77,7,40,79,1}[1] Text\\
+Text \sparkDot{!54,39,26,65,29,58,36,99,16,56,76,69,71,77,7,40,79,!1} Text
+\end{LTXexample}
+
+
+\subsubsection{Dot-Small}
+
+
+\begin{LTXexample}[pos=t]
+Text \sparkDot[Small]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76} Text\\
+Text \sparkDot[Small][1]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76}[76] Text\\
+Text \sparkDot[Small]{!1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,!76} Text
+\end{LTXexample}
+
+\subsubsection{Dot-Extrasmall}
+
+\begin{LTXexample}[pos=t]
+Text \sparkDot[Extrasmall]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76} Text\\
+Text \sparkDot[Extrasmall][1]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76}[76] Text\\
+Text \sparkDot[Extrasmall]{!1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,!76} Text
+\end{LTXexample}
+
+
+\subsubsection{Dot-Extralarge}
+
+\begin{LTXexample}[pos=t]
+Text \sparkDot[Extralarge]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76} Text\\
+Text \sparkDot[Extralarge][1]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76}[76] Text\\
+Text \sparkDot[Extralarge]{!1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,!76} Text
+\end{LTXexample}
+
+
+
+
+\subsection{Dotline}
+
+\subsubsection{Dotline-Thin}
+
+\begin{LTXexample}[pos=t]
+Text \sparkDotline[Thin]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76} Text\\
+Text \sparkDotline[Thin][1]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76}[76] Text\\
+Text \sparkDotline[Thin]{!1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,!76} Text
+\end{LTXexample}
+
+\subsubsection{Dotline-Extrathin}
+
+\begin{LTXexample}[pos=t]
+Text \sparkDotline[Extrathin]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76} Text\\
+Text \sparkDotline[Extrathin][1]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76}[76] Text\\
+Text \sparkDotline[Extrathin]{!1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,!76} Text
+\end{LTXexample}
+
+
+
+\subsubsection{Dotline-Medium -- the default}
+
+\begin{LTXexample}[pos=t]
+Text \sparkDotline{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76} Text\\
+Text \sparkDotline[Medium][1]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76}[76] Text\\
+Text \sparkDotline{!1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,!76} Text
+\end{LTXexample}
+
+\subsubsection{Dotline-Thick}
+
+\begin{LTXexample}[pos=t]
+Text \sparkDotline[Thick]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76} Text\\
+Text \sparkDotline[Thick][1]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76}[76] Text\\
+Text \sparkDotline[Thick]{!1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,!76} Text
+\end{LTXexample}
+
+\subsubsection{Dotline-Extrathick}
+
+\begin{LTXexample}[pos=t]
+Text \sparkDotline[Extrathick]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76} Text\\
+Text \sparkDotline[Extrathick][1]{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76}[76] Text\\
+Text \sparkDotline[Extrathick]{!1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,!76} Text
+\end{LTXexample}
+
+
+\section{Examples for Lua\protect\LaTeX}
+The current version of \texttt{spark-otf} supports only star versions for Lua\LaTeX.
+
+
+\subsection{Bars}
+
+\begin{LTXexample}[pos=t]
+Text \sparkBar*{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76} Text\\
+Text \sparkBar*{9,4,2,1,6,7,3,8,3,7,1,4,9,2,8,5,1,8} Text\\
+Text \sparkBar*[Narrow]{111,179,188,146,154,177,191,124,170,122,127,129,140,133,131,195,126,176} Text\\
+\end{LTXexample}
+
+
+\subsection{Dots}
+\begin{LTXexample}[pos=t]
+Text \sparkDotline*{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76} Text\\
+Text \sparkDotline{9,4,2,1,6,7,3,8,3,7,1,4,9,2,8,5,1,8} Text\\
+Text \sparkDotline+{9,4,2,1,6,7,3,8,3,7,1,4,9,2,8,5,1,8} Text\\
+Text \sparkDot*[Medium][19]{19,114,12,111,16,17,113,118,113,67,61,74,39,52,38,55,111,88}[88] Text\\
+Text \sparkDotline*[Medium][111]{111,179,188,146,154,177,191,124,170,122,127,129,140,133,131,195,126,176}[176] Text
+\end{LTXexample}
+
+
+
+\section{Using color}
+It is possible to mark single or some values with a specific color, which must
+be given in binary notation, e.g. \verb|ff0000| for red (R-G-B). The macro \verb|\setSparkColor|
+\emph{should} include the (last) comma after the value:
+
+\begin{LTXexample}[pos=t]
+Text \sparkBar{14,95,68,9,19,41,\setSparkColor{ff0000}{91,}1,81,97,79,45,96,76,17,65,8,92} Text
+ \sparkBar{!14,95,68,9,19,41,\setSparkColor{ff0000}{91,1,81,97,79,}45,96,76,17,65,8,!92} Text
+
+\bigskip
+\noindent
+Text \sparkDot{14,95,68,9,19,41,\setSparkColor{ff0000}{91,}1,81,97,79,45,96,76,17,65,8,92} Text
+ \sparkDot{!14,95,68,9,19,41,\setSparkColor{ff0000}{91,1,81,97,79,}45,96,76,17,65,8,!92} Text
+\end{LTXexample}
+
+Coloring does \emph{not} work for the star version of the macro and \emph{not} for
+\verb|\sparkDotline|.
+
+
+\section{The charsets}
+
+\subsection{Spark-BarMedium}
+
+%\includegraphics{images/Spark-BarMedium}
+
+{\sparkBarMedium
+\multido{\iA=32+50}{20000}{\sbox\ZBox{%
+ \multido{\iB=\iA+1}{50}{%
+ \sbox\SBox{\symbol{\iB}}%
+ \ifdim\wd\SBox>0pt\usebox\SBox\kern0.45pt\fi}}%
+ \ifdim\wd\ZBox>0pt \sbox\ZBox{\makebox[4em][r]{\iA: }%
+ \multido{\iB=\iA+1}{50}{%
+ \sbox\SBox{\symbol{\iB}}%
+ \ifdim\wd\SBox>0pt\usebox\SBox\else\kern0.45em\fi\kern0.25pt}}%
+ \usebox\ZBox\\\fi}
+}
+
+
+%\string{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1\string}
+
+
+
+%-* !"\#\$\%'()*+,-./0123456789.;<=>@CDEGHILNOSTU[\textbackslash]\_ht\{\_\}°¢
+
+\subsection*{Spark-BarNarrow}
+
+{\sparkBarNarrow
+\multido{\iA=32+50}{20000}{\sbox\ZBox{%
+ \multido{\iB=\iA+1}{50}{%
+ \sbox\SBox{\symbol{\iB}}%
+ \ifdim\wd\SBox>0pt\usebox\SBox\kern0.35pt\fi}}%
+ \ifdim\wd\ZBox>0pt \sbox\ZBox{\makebox[4em][r]{\iA: }%
+ \multido{\iB=\iA+1}{50}{%
+ \sbox\SBox{\symbol{\iB}}%
+ \ifdim\wd\SBox>0pt\usebox\SBox\else\kern0.35em\fi\kern0.25pt}}%
+ \usebox\ZBox\\\fi}
+}
+
+
+\iffalse
+
+\subsection*{Spark-BarThin}
+
+{\sparkBarThin
+\multido{\iA=32+50}{20000}{\sbox\ZBox{%
+ \multido{\iB=\iA+1}{50}{%
+ \sbox\SBox{\symbol{\iB}}%
+ \ifdim\wd\SBox>0pt\usebox\SBox\kern0.1pt\fi}}%
+ \ifdim\wd\ZBox>0pt \sbox\ZBox{\makebox[4em][r]{\iA: }%
+ \multido{\iB=\iA+1}{50}{%
+ \sbox\SBox{\symbol{\iB}}%
+ \ifdim\wd\SBox>0pt\usebox\SBox\else\kern0.1em\fi\kern0.25pt}}%
+ \usebox\ZBox\\\fi}
+}
+
+
+\subsection*{Spark-DotMedium}
+
+{\sparkDotMedium
+\multido{\iA=32+50}{20000}{\sbox\ZBox{%
+ \multido{\iB=\iA+1}{50}{%
+ \sbox\SBox{\symbol{\iB}}%
+ \ifdim\wd\SBox>0pt\usebox\SBox\kern0.35pt\fi}}%
+ \ifdim\wd\ZBox>0pt \sbox\ZBox{\makebox[4em][r]{\iA: }%
+ \multido{\iB=\iA+1}{50}{%
+ \sbox\SBox{\symbol{\iB}}%
+ \ifdim\wd\SBox>0pt\usebox\SBox\else\kern0.35em\fi\kern0.25pt}}%
+ \usebox\ZBox\\\fi}
+}
+
+
+\subsection*{Spark-DotSmall}
+
+{\sparkDotSmall
+\multido{\iA=32+50}{20000}{\sbox\ZBox{%
+ \multido{\iB=\iA+1}{50}{%
+ \sbox\SBox{\symbol{\iB}}%
+ \ifdim\wd\SBox>0pt\usebox\SBox\kern0.2pt\fi}}%
+ \ifdim\wd\ZBox>0pt \sbox\ZBox{\makebox[4em][r]{\iA: }%
+ \multido{\iB=\iA+1}{50}{%
+ \sbox\SBox{\symbol{\iB}}%
+ \ifdim\wd\SBox>0pt\usebox\SBox\else\kern0.2em\fi\kern0.25pt}}%
+ \usebox\ZBox\\\fi}
+}
+
+
+\subsection*{Spark-DotLine}
+
+{\sparkDotLine
+\multido{\iA=32+50}{20000}{\sbox\ZBox{%
+ \multido{\iB=\iA+1}{50}{%
+ \sbox\SBox{\symbol{\iB}}%
+ \ifdim\wd\SBox>0pt\usebox\SBox\kern0.4pt\fi}}%
+ \ifdim\wd\ZBox>0pt \sbox\ZBox{\makebox[4em][r]{\iA: }%
+ \multido{\iB=\iA+1}{50}{%
+ \sbox\SBox{\symbol{\iB}}%
+ \ifdim\wd\SBox>0pt\usebox\SBox\else\kern0.4em\fi\kern0.25pt}}%
+ \usebox\ZBox\\\fi}
+}
+
+
+\fi
+
+
+\nocite{*}
+\printbibliography
+
+
+\end{document}
+
+
+<p class=spark-bar-medium>{14,95,68,9,19,41,91,1,81,97,79,45,96,76,17,65,8,92}</p>
+
+<p class=spark-bar-narrow>{19,32,93,4,95,46,13,23,50,86,94,68,58,41,89,57,74,8}</p>
+
+<p class=spark-bar-thin>{13,15,59,73,42,1,41,51,4,97,35,55,37,24,89,21,30,22}</p>
+
+<p class=spark-dot-medium>{54,39,26,65,29,58,36,99,16,56,76,69,71,77,7,40,79,1}</p>
+
+<p class=spark-dot-small>{1,79,88,46,54,77,91,24,70,22,27,29,40,33,31,95,26,76}</p>
+
+<p class=spark-line-medium>{9,4,2,1,6,7,3,8,3,7,1,4,9,2,8,5,1,8}</p>
+\NewDocumentCommand\spark{omo}{{\sparklinesbarmedium
+ \IfValueT{#1}{#1}\string{#2\string}\IfValueT{#3}{#3}}}
diff --git a/fonts/spark-otf/latex/spark-otf.sty b/fonts/spark-otf/latex/spark-otf.sty
new file mode 100644
index 0000000000..eae4f650d0
--- /dev/null
+++ b/fonts/spark-otf/latex/spark-otf.sty
@@ -0,0 +1,161 @@
+%% $Id: spark-otf.sty 1047 2019-04-12 17:22:07Z herbert $
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+% Copyright 2017 Herbert Voss hvoss@tug.org
+%%
+\def\spark@version{0.05}
+\ProvidesPackage{spark-otf}[%
+ 2019/04/12 v. \spark@version~(Herbert Voss) Supports spark OpenType for lualatex/xelatex.]
+%
+\RequirePackage{ifxetex,ifluatex,xkeyval}
+%
+\newif\ifspark@usefilenames \spark@usefilenamesfalse
+\DeclareOptionX{usefilenames}[true]{\@nameuse{spark@usefilenames#1}}
+%
+\providecommand\spark@DefaultFeatures{}
+\DeclareOptionX{DefaultFeatures}{\def\spark@DefaultFeatures{#1}}
+
+\ProcessOptionsX\relax
+
+\ifxetex\else\ifluatex\else
+ \@latex@error{This package can only be used with "XeLaTeX" or "LuaLaTeX"!%
+ \MessageBreak "pdfLaTeX" or any other "TeX" version are _not_ possible!}%
+\fi\fi
+\RequirePackage{luaotfload,xparse}
+
+\ifluatex\RequirePackage{luacode}\fi
+
+\newcommand\setSparkColor[2]{%
+ \addfontfeatures{UprightFeatures={Color=#1}}#2%
+ \addfontfeatures{UprightFeatures={Color=000000}}}
+
+\ifspark@usefilenames
+ \typeout {Using file names for the spark font}%
+%----------------------------------------- file names ----------------------------
+ \font\sparkBarMedium ="file:Sparks-Bar-Medium.otf:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkBarNarrow ="file:Sparks-Bar-Narrow.otf:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkBarExtranarrow="file:Sparks-Bar-Extranarrow.otf:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkBarWide ="file:Sparks-Bar-Wide.otf:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkBarExtrawide ="file:Sparks-Bar-Extrawide.otfmode=node;+calt;\spark@DefaultFeatures"
+%
+ \font\sparkDotlineMedium ="file:Sparks-Dotline-Medium.otf:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkDotlineThick ="file:Sparks-Dotline-Thick.otf:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkDotlineExtrathick="file:Sparks-Dotline-Extrathick.otf:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkDotlineThin ="file:Sparks-Dotline-Thin.otf:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkDotlineExtrathin ="file:Sparks-Dotline-Extrathin.otf:mode=node;+calt;\spark@DefaultFeatures"
+%
+ \font\sparkDotMedium ="file:Sparks-Dot-Medium.otf:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkDotSmall ="file:Sparks-Dot-Small.otf:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkDotExtralarge="file:Sparks-Dot-Extralarge.otf:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkDotExtrasmall="file:Sparks-Dot-Extrasmall.otf:mode=node;+calt;\spark@DefaultFeatures"
+%
+\else
+ \typeout {Using symbolic names for the spark font}%
+%----------------------------------------- symbolic names ----------------------------
+ \font\sparkBarMedium = "name:Sparks Bar Medium:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkBarNarrow = "name:Sparks Bar Narrow:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkBarExtranarrow= "name:Sparks Bar Extra-narrow:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkBarWide = "name:Sparks Bar Wide:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkBarExtrawide = "name:Sparks Bar Extra-wide:mode=node;+calt;\spark@DefaultFeatures"
+%
+ \font\sparkDotlineMedium = "name:Sparks Dot-line Medium:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkDotlineThick = "name:Sparks Dot-line Thick:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkDotlineExtrathick= "name:Sparks Dot-line Extra-thick:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkDotlineThin = "name:Sparks Dot-line Thin:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkDotlineExtrathin = "name:Sparks Dot-line Extra-thin:mode=node;+calt;\spark@DefaultFeatures"
+%
+ \font\sparkDotMedium = "name:Sparks Dot Medium:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkDotSmall = "name:Sparks Dot Small:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkDotExtralarge= "name:Sparks Dot Extra-large:mode=node;+calt;\spark@DefaultFeatures"
+ \font\sparkDotExtrasmall= "name:Sparks Dot Extra-small:mode=node;+calt;\spark@DefaultFeatures"
+\fi
+%
+%
+\def\Extend@List{\@ifnextchar!\Extend@List@i\Extend@List@ii}
+\def\Extend@List@i!#1,#2\@nil{%
+ \def\spark@mark@first{#1}%
+ \def\spark@values@i{#1,}%
+ \Extend@List@iii#2,!,!\@nil
+}
+\def\Extend@List@ii#1\@nil{\Extend@List@iii#1,!,!\@nil}
+%
+\def\Extend@List@iii#1,!#2,!#3\@nil{%
+ \ifx\relax#2\relax % no value with !
+ \edef\spark@values@i{\spark@values@i#1}%
+ \def\spark@mark@last{}%
+ \else
+ \edef\spark@values@i{\spark@values@i#1,#2}%
+ \def\spark@mark@last{#2}%
+ \fi
+}
+
+\def\check@list@values#1{%
+ \def\spark@values@i{}%
+ \def\spark@mark@first{}%
+ \def\spark@mark@last{}%
+ \Extend@List#1\@nil
+}
+
+%
+\ifluatex
+\begin{luacode}
+function RelativeValues(v,m)
+ local Values = {}
+ for k,x in ipairs(v) do
+ Values[k] = x
+ end
+ table.sort(Values)
+ local MaxVal = (Values[#Values])
+ for k,x in ipairs(v) do
+ Values[k] = math.floor(x/MaxVal*m)
+ end
+ for i,k in ipairs(Values) do
+ tex.sprint(k)
+ if (i < #Values) then tex.sprint(",") end
+ end
+end
+\end{luacode}
+% 12 3 45
+ \NewDocumentCommand\sparkBar{sO{Medium}O{}mO{}}{{%
+ \check@list@values{#4}%
+ \IfBooleanTF{#1}%
+ {\edef\spark@values@ii{\directlua{RelativeValues({\spark@values@i},99)}}}%
+ {\let\spark@values@ii\spark@values@i}%
+ \@nameuse{sparkBar#2}#3\spark@mark@first\string{\spark@values@ii\string}\spark@mark@last#5%
+ }}
+% 12 3 45
+ \NewDocumentCommand\sparkDot{sO{Medium}O{}mO{}}{{%
+ \check@list@values{#4}%
+ \IfBooleanTF{#1}%
+ {\edef\spark@values@ii{\directlua{RelativeValues({\spark@values@i},100)}}}%
+ {\let\spark@values@ii\spark@values@i}%
+ \@nameuse{sparkDot#2}#3\spark@mark@first\string{\spark@values@ii\string}\spark@mark@last#5%
+ }}
+% 12 3 45
+ \NewDocumentCommand\sparkDotline{sO{Medium}O{}mO{}}{{%
+ \check@list@values{#4}%
+ \IfBooleanTF{#1}%
+ {\edef\spark@values@ii{\directlua{RelativeValues({\spark@values@i},100)}}}%
+ {\let\spark@values@ii\spark@values@i}%
+ \@nameuse{sparkDotline#2}#3\spark@mark@first\string{\spark@values@ii\string}\spark@mark@last#5%
+ }}
+\else %% XeLaTeX% 1 2 34
+ \NewDocumentCommand\sparkBar{O{Medium}O{}mO{}}{{%
+ \check@list@values{#3}%
+ \@nameuse{sparkBar#1}\spark@mark@first\string{\spark@values@i\string}\spark@mark@last%
+ }}% 1 2 34
+ \NewDocumentCommand\sparkDot{O{Medium}O{}mO{}}{{%
+ \check@list@values{#3}%
+ \@nameuse{sparkDot#1}\spark@mark@first\string{\spark@values@i\string}\spark@mark@last%
+ }}%
+ \NewDocumentCommand\sparkDotline{O{Medium}O{}mO{}}{{%
+ \check@list@values{#3}%
+ \@nameuse{sparkDotline#1}\spark@mark@first\string{\spark@values@i\string}\spark@mark@last%
+ }}
+\fi
+%%
+\endinput
+