After having read the answers to What are the various units (ex, em, in, pt, bp, dd, pc) expressed in mm? and some related questions, I’ve realized that one of my basic assumptions about Tex was wrong: I thought that since the scaled point sp is the fundamental internal base unit (at about 5.36 nm), all other (absolute) units would be expressed in an integer amount thereof. This would have been the values in the top-level bullet points below, the bold values are reported by source code like 1pt = \number\dimexpr 1pt\relax sp:

  • 1pt = 65536sp (exact definition, 2^16)
  • 1pc = 12pt = 786432sp
  • 1bp = 65781.76sp ⇒ 65781sp to 65782sp (with 72.27/72 = 803/800 pt/bp)
    • from int in: same int values
    • 100bp = \number\dimexpr 100bp\relax sp6578176sp (not 6578100sp!)
  • 1in = 72.27pt = 4736286.72sp ⇒ 4736286sp to 4736287sp
    • from int bp: 72bp = 4736232sp to 4736304sp
    • 100in = \number\dimexpr 100in\relax sp473628672sp (not 473628600sp!)

Okay, so points and inches are accurately implemented, but what about millimetres and centimetres?

  • 1mm = 186467.9811… sp ⇒ 186467sp to 186468sp
    • from int in by pt: same int values
    • from int in by bp: 186465sp to 186466sp or 186468sp to 186469sp
    • 1000mm = \number\dimexpr 1000mm\relax sp ⇒ 186467981sp
    • 2540mm = \number\dimexpr 2540mm\relax sp ⇒ 473628672sp (= 100in)
  • 1cm = 1864679.811… sp ⇒ 1864679sp to 1864680sp
    • from int in by pt: same int values
    • from int in by bp: 186465sp to 186466sp or 186468sp to
    • from int mm: 10mm = 1864650sp, 1864660sp, 1864670sp, 1864680sp or 1864690sp
    • 100cm = \number\dimexpr 100cm\relax sp ⇒ 186467981sp
    • 254cm = \number\dimexpr 254cm\relax sp ⇒ 473628672sp (= 100in)

It seems reasonable to expect that the actual internal definition is in fact 1in = 1cm = 10mm, but since values get truncated when converted to sp, there’ll of course be rounding errors as shown in the answers linked to above.

But what’s the actual definition of the Didot point (and Cicero) in Tex and which historic definition does it try to approximate? I’ve seen 1238/1157 pt/dd or 1.07 pt/dd been stated several times, but no actual authoritative reference.

  • 1dd = sp or sp (70124sp)
    • ⅜ mm/dd: 0.375mm =
    • Tschichold 100/266 mm/dd: 0.37594mm =
    • Didot approx.: 0.37597mm =
    • Berthold: 0.376mm =
    • 16/15 pt/dd: 69905sp
    • 1.07pt =
  • 1cc = 12dd = `` or sp (841489sp, not 841488sp!)
    • 4.5mm =
    • Tschichold 1200/266 mm/cc: ca. 4.5112782mm
    • Berthold: 4.512mm =
    • 192/15 pt/pc: 12.8pt =
    • 12.84pt =
\noindent1pt = \number\dimexpr 1pt\relax sp

\noindent1pc = \number\dimexpr 1pc\relax sp

\noindent1bp = \number\dimexpr 1bp\relax sp

\noindent1in = \number\dimexpr 1in\relax sp

800bp = 803pt = \number\dimexpr 800bp\relax sp = \number\dimexpr 803pt\relax sp %= 52625408sp

\noindent1mm = \number\dimexpr 1mm\relax sp

\noindent1cm = \number\dimexpr 1cm\relax sp

2540mm = 254cm = 100in = 7200bp = 7227pt \hfill\break %= 473628672sp
= \number\dimexpr 2540mm\relax sp = \number\dimexpr 254cm\relax sp = \number\dimexpr 100in\relax sp = \number\dimexpr 7200bp\relax sp = \number\dimexpr 7227pt\relax sp

\noindent1dd = \number\dimexpr 1dd\relax sp %= 70124sp

1.07pt = \number\dimexpr 1.07pt\relax sp %= 70124sp

Berthold: \number\dimexpr 0.376mm\relax sp %= 70113sp

Didot approx.: \number\dimexpr 0.37597mm\relax sp %= 70107sp

Tschichold: \number\dimexpr 0.37593985mm\relax sp (100/266 mm/dd) %= 70101sp

3/8 mm/dd: \number\dimexpr 0.375mm\relax sp %= 69925sp

16/15 pt/dd: 69905sp

1238pt = 1157dd = \number\dimexpr 1238pt\relax sp = \number\dimexpr 1157dd\relax sp %= 81133568sp

\noindent1cc = 12dd = \number\dimexpr 1cc\relax sp = \number\dimexpr 12dd\relax sp  %= 841489sp != 841488sp

12.84pt = \number\dimexpr 12.84pt\relax sp %= 841482sp != 841488sp

Berthold: \number\dimexpr 4.512mm\relax sp %= 841342sp != 841356sp

Tschichold:  \number\dimexpr 4.5112782mm\relax sp (1200/266 mm/cc) %= 841208sp != 841212sp

4.5mm = \number\dimexpr 4.5mm\relax sp %= 839105sp != 839100sp

192/15 pt/pc: \number\dimexpr 12.8pt\relax sp %= 838861sp != 838860sp

1238pc = 1157cc = \number\dimexpr 1238pc\relax sp = \number\dimexpr 1157cc\relax sp %= 973602816sp

10000pt = \number\dimexpr 10000pt\relax sp %= 655360000sp

10000bp = \number\dimexpr 10000bp\relax sp %= 657817600sp

10000dd = \number\dimexpr 10000dd\relax sp %= 701240864sp

1 Answer 1


Ouch, just minutes after I posted the question, I think I’ve found the answer myself:

line 13773ff.

The next two parameters, |num| and |den|, are positive integers that define
the units of measurement; they are the numerator and denominator of a
fraction by which all dimensions in the \.{DVI} file could be
multiplied in order to get lengths in units of $10^{-7}$ meters. Since
$\rm 7227{pt} = 254{cm}$, and since \TeX\ works with scaled points
where there are $2^{16}$ sp in a point, \TeX\ sets

line #10443ff.

@ The necessary conversion factors can all be specified exactly as
fractions whose numerator and denominator sum to 32768 or less.
According to the definitions here, $\rm2660\,dd\approx1000.33297\,mm$;
this agrees well with the value $\rm1000.333\,mm$ cited by Bosshard
@^Bosshard, Hans Rudolf@> in {\sl Technische Grundlagen zur
Satzherstellung\/} (Bern, 1980). The Didot point has been newly
standardized in 1978; it's now exactly $\rm 1\,nd=0.375\,mm$.
Conversion uses the equation $0.375=21681/20320/72.27\cdot25.4$. The
new Cicero follows the new Didot point; $\rm 1\,nc=12\,nd$. These
would lead to the ratios $21681/20320$ and $65043/5080$, respectively.
The closest approximations supported by the algorithm would be
$11183/10481$ and $1370/107$.  In order to maintain the relation $\rm
1\,nc=12\,nd$, we pick the ratio $685/642$ for $\rm nd$, however.

line #10460ff.

@d set_conversion_end(#)== denom:=#; end
@d set_conversion(#)==@+begin num:=#; set_conversion_end

@<Scan for \(a)all other units and adjust |cur_val| and |f|...@>=
if scan_keyword("in") then set_conversion(7227)(100)
else if scan_keyword("pc") then set_conversion(12)(1)
else if scan_keyword("cm") then set_conversion(7227)(254)
else if scan_keyword("mm") then set_conversion(7227)(2540)
else if scan_keyword("bp") then set_conversion(7227)(7200)
else if scan_keyword("dd") then set_conversion(1238)(1157)
else if scan_keyword("cc") then set_conversion(14856)(1157)
else if scan_keyword("nd") then set_conversion(685)(642)
else if scan_keyword("nc") then set_conversion(1370)(107)
else if scan_keyword("sp") then goto done

So 1238/1157 pt/dd or pc/cc is indeed exact and there are actually two units for the “metric Didot point” of 375 µm and its cicero: nd and nc:

  • 1nd = ⌊685/642 pt⌋ = 69925sp ≈ 0.375mm
  • 1nc = ⌊1370/107 pt⌋ = 839105sp ≈ 4.5mm
  • 1
    In Knuth's tex.web (texdoc tex), these comments (and code) are in §587 and §458. Jan 18, 2017 at 21:00

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .