# Typeset dots around numbers (old typography)

I am trying to typeset some old book in which I notice that all numbers are surrounded with 1 dot (except if it's first in a line in which case there is no dot before or last in a line in which case there is no dot after it). If present the dot is inside the normal interword space (as if by itself it takes no space).

Is there anyway in (lua)TEX (I use context) to typeset numbers in such a way?

I've tried very naive way, but it does not discard dots at beginning or end of lines, and I guess there are issues as well if glue shrinks too much.

\starttext

\dorecurse{100}{
Le \llap{.}1\rlap{.} element. }

\stoptext


Tried cleaders (which are discardable) but dots are centered (and not close to the digit) and do not seem to stretch as I'd expect.

Added picture for illustration. This shows the dots being discarded at end of lines but still too much spacing around the numbers.

Example of old typography (Olivetan french Bible, pdf available from http://www.e-rara.ch/gep_g/content/titleinfo/1751440 if you like gothic typography. It's not easy from the book what is the spacing amount.

• Could you post a screenshot of something you'd like to replicate? – Mico Apr 22 '17 at 12:53
• As background info, these dots seem to come from latin where they were needed to distinguish between numbers (in roman notation) and other normal words. Apparently in some middle age books some books were still following this convention. – Joseph Apr 22 '17 at 13:02
• @Mico I have a simple MWE pdf but I do not know how to attach a file in a comment. – Joseph Apr 22 '17 at 13:08
• @Joseph - You can edit your posting and click on the "Image" button (looks like a mountain range w/ sun in upper right corner) to attach a png file. – Mico Apr 22 '17 at 13:36
• To clarify your requirements about spacing around the dots, can you add an image of what you'd actually desire? A photograph of a page of the book maybe? – ShreevatsaR Apr 23 '17 at 8:25

The order in which you combine the two skips (the \leaders and the non-\leaders one) doesn’t matter: they will always vanish as a unit.

% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.

\usepackage[T1]{fontenc}         % Not always necessary, but recommended.
% End of standard header.  What follows pertains to the problem at hand.

\makeatletter

\newsavebox\@NWD@dot@box
\newlength\@NWD@space@skip
\newcommand*\numberwithdots[1]{%
\unskip
\setbox\@NWD@dot@box \hbox{.}% use current font
\@NWD@space@skip
\fontdimen\tw@ \font
\@plus \fontdimen\thr@@ \font
\@minus \fontdimen 4 \font
\hskip \glueexpr \@NWD@space@skip-\wd\@NWD@dot@box
#1%
\hskip \glueexpr \@NWD@space@skip-\wd\@NWD@dot@box
\ignorespaces
}

\makeatother

\begin{document}

\numberwithdots{1} note that the indent does \emph{not} count as a begin of
line'': not sure if this is what is wanted.  Some text \numberwithdots{2} that
includes \numberwithdots{3} some numbers: I~hope that \numberwithdots{4} some
\numberwithdots{5} of them will fall \numberwithdots{6} on a line boundary,
although \numberwithdots{7} it is \numberwithdots{8} always possible
\numberwithdots{9} to arrange things in order \numberwithdots{10} to make
\numberwithdots{11} this happen.  And it \numberwithdots{12} is also
possible\linebreak[4] \numberwithdots{13} to force \numberwithdots{14} a line
\numberwithdots{15} break\linebreak[4] at a specific \numberwithdots{16}
position.

Two numbers in a row, though, do not \numberwithdots{123} \numberwithdots{456}
look well.

\end{document}


This is the output I get:

Perhaps, it would be preferable to use wider spaces around numbers with dots; and it would be even better to allow the user to customize this aspect.

% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.

\usepackage[T1]{fontenc}         % Not always necessary, but recommended.
% End of standard header.  What follows pertains to the problem at hand.

\makeatletter

\newsavebox\@NWD@dot@box
\newlength\@NWD@space@skip
\newcommand*\@NWD@factor{1.5} % redefine default as you please
\newcommand*\numberwithdots[1]{%
\unskip
\setbox\@NWD@dot@box \hbox{.}% use current font
\@NWD@space@skip
\@NWD@factor\fontdimen\tw@ \font
\@plus \fontdimen\thr@@ \font
\@minus \fontdimen 4 \font
\hskip \glueexpr \@NWD@space@skip-\wd\@NWD@dot@box
#1%
\hskip \glueexpr \@NWD@space@skip-\wd\@NWD@dot@box
\ignorespaces
}
\newcommand*\nwdsetdotspacing[1]{\def\@NWD@factor{#1}}
\newcommand*\nwdlinebreak{\unskip\unskip\linebreak}

\makeatother

\begin{document}

\numberwithdots{1} note that the indent does \emph{not} count as a begin of
line'': not sure if this is what is wanted.  Some text \numberwithdots{2} that
includes \numberwithdots{3} some numbers: I~hope that \numberwithdots{4} some
\numberwithdots{5} of them will fall \numberwithdots{6} on a line boundary,
although \numberwithdots{7} it is \numberwithdots{8} always possible
\numberwithdots{9} to arrange things in order \numberwithdots{10} to make
\numberwithdots{11} this happen.  And it \numberwithdots{12} is also
possible\nwdlinebreak[4] \numberwithdots{13} to force \numberwithdots{14} a line
break \numberwithdots{15}\nwdlinebreak[4] at a specific \numberwithdots{16}
position.

Two numbers in a row, though, do not \numberwithdots{123} \numberwithdots{456}
look well.

\nwdsetdotspacing{} % empty argument amounts to 1

\numberwithdots{1} note that the indent does \emph{not} count as a begin of
line'': not sure if this is what is wanted.  Some text \numberwithdots{2} that
includes \numberwithdots{3} some numbers: I~hope that \numberwithdots{4} some
\numberwithdots{5} of them will fall \numberwithdots{6} on a line boundary,
although \numberwithdots{7} it is \numberwithdots{8} always possible
\numberwithdots{9} to arrange things in order \numberwithdots{10} to make
\numberwithdots{11} this happen.  And it \numberwithdots{12} is also
possible\nwdlinebreak[4] \numberwithdots{13} to force \numberwithdots{14} a line
break \numberwithdots{15}\nwdlinebreak[4] at a specific \numberwithdots{16}
position.

\nwdsetdotspacing{2}

\numberwithdots{1} note that the indent does \emph{not} count as a begin of
line'': not sure if this is what is wanted.  Some text \numberwithdots{2} that
includes \numberwithdots{3} some numbers: I~hope that \numberwithdots{4} some
\numberwithdots{5} of them will fall \numberwithdots{6} on a line boundary,
although \numberwithdots{7} it is \numberwithdots{8} always possible
\numberwithdots{9} to arrange things in order \numberwithdots{10} to make
\numberwithdots{11} this happen.  And it \numberwithdots{12} is also
possible\nwdlinebreak[4] \numberwithdots{13} to force \numberwithdots{14} a line
break \numberwithdots{15}\nwdlinebreak[4] at a specific \numberwithdots{16}
position.

\end{document}


Unfortunately, for a TeXnical reason, in order to force a line break, we also had to replace the \linebreak command with our \nwdlinebreak.

Output:

An additional degree of freedom: a factor also for the amount of backspacing. In addition to this, the following code excerpt presents an alternative, and more robust, implementation:

\makeatletter

% Alternative approach that permits nesting: use temporaries, but with grouping:
\newcommand*\@NWD@dot@factor{}
\newcommand*\@NWD@spc@factor{1.5}
\newcommand*\numberwithdots[1]{%
\unskip
\setbox\z@ \hbox{.}% use current font
\dimen@ \@NWD@dot@factor\wd\z@
\skip@
\@NWD@spc@factor\fontdimen\tw@ \font
\@plus \fontdimen\thr@@ \font
\@minus \fontdimen 4 \font
% More elegant with subroutines (or perhaps not):
{#1}%
\ignorespaces
}
\hskip \glueexpr \skip@-\dimen@ \relax % for robustness
}
}
\newcommand*\nwdsetdotspacing[2][]{%
\def\@NWD@dot@factor{#1}%
\def\@NWD@spc@factor{#2}%
}
\newcommand*\nwdlinebreak{\unskip\unskip\linebreak}

\makeatother


The trick of including a box in a glob of glue as \leaders, in order to have it disappear at line or page breaks, is well known: as far as I can tell, it was first proposed by Marcin Woliński in 2007, see How to make a box disappear at a line break.

\input expl3-generic % just for not using ConTeXt

\ExplSyntaxOn
\cs_set_eq:NN \dorecurse \prg_replicate:nn
\ExplSyntaxOff

\hskip1.5\fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font
}

\dorecurse{100}{The \num{2} element \num{2} xy. }

\bye


If the period should be attached to the number, it's even simpler.

\input expl3-generic

\ExplSyntaxOn
\cs_set_eq:NN \dorecurse \prg_replicate:nn
\ExplSyntaxOff

\newbox\periodbox

\setbox\periodbox=\hbox{.}%
}
\setbox\periodbox=\hbox{.}%

• Are you referring to \spaceskip and \xspaceskip? Edit: Oh, no, now I’ve seen that you didn’t mean that. In any case, of course I had thought of a solution like that, but I wanted to put the dots inside the interword spaces. – GuM Apr 22 '17 at 23:52