# What is the right way to set a dimension parameter?

In the TeXbook Knuth set parameters for dimensions mostly as follows:

 \parskip=3pt


Other package authors define such parameters without using the equal sign

 \parskip30pt


Many later authors use the LaTeX \setlength

 \setlength{\parskip}{30pt}


You can even define a constant somewhere and write:

  \parskip\parsep


Even \parskip30PT or even \parskip10Pt works!

I favour \parskip30pt for macros in a package and \newlength for preamble commands in a document. Is there a right way to set a dimension parameter?

Note: here is a short minimal example of all the above commands for anyone wishing to try them out.

\documentclass[11pt]{article}
\usepackage{lipsum}
\begin{document}
\parskip30pt
\lipsum[1-2]
\parskip=3pt
\lipsum[1]
\setlength{\parskip}{30pt}
\lipsum[1]
\parskip\parsep
\lipsum[1]
\parskip25Pt
\lipsum[3]
\parskip30PT
\lipsum[4]
\texttt{\meaning\parsep}

\texttt{\the\parsep}
\end{document}

-

At the TeX level there are two register types to worry about, dimensions and skips. The former only take a dimension (not surprisingly), whereas the later also have a rubber component. LaTeX's 'lengths' are TeX skips and so can have a rubber component. This is important when you consider how to terminate the setting instructions. For example:

\newskip\myskip
\setmyskip{10 pt} plus some other context


Here, TeX will think that 'plus' is part of the skip information and will complain about a missing number. So LaTeX includes a \relax in the definition of \setlength to avoid this:

> \setlength=macro:
#1#2->#1#2\relax .


This termination question does not apply in the case where you are setting one length from another:

\parskip\parsep plus


will not treat the plus as part of the setting. Whenever you set one register from another TeX 'knows' that there is nothing else to look for. (Note: if you try the same with a constant stored as a macro, you are back needing the \relax.)

Now, on the 'right' way to do this I'm not aware of a case where the = is vital (contrast the situation with \let, where sometimes that optional = is significant). So I would not use one.

As LaTeX provides proper termination of the setting, I would prefer it's method over the plain TeX approach if we are talking about a LaTeX document. That said, if I want a fixed length I will tend to prefer a dimension, and use \newdimen followed by the plain TeX setting method with \relax inserted as appropriate.

-
The LaTeX version of \setlength of file latex.ltx contains the bug latex/3066 that is fixed by package fixltx2e. It inserts a space between #1 and #2. – Heiko Oberdiek Jan 20 '13 at 3:28
@HeikoOberdiek I guess 'bug' here is slightly questionable: \dimen0 is not LaTeX syntax, so there is no reason (reading LaTeX: A Document Preparation System) to expect this to work. There was dicussion ages ago within the team about whether expl3 (\dim_set:Nn, etc.) should support register numbers. We decided it should not, i.e. that anything that goes wrong if you do \dim_set:Nn { \dimen0 } { 10 pt } is not a bug. – Joseph Wright Jan 20 '13 at 9:23
@JosephWright Please give an example when \let needs an equal sign. – marczellm Jan 20 '13 at 13:41
@marczellm Usual answer is for awkward cases: \let\foo== would be a trivial one! (Without the first =, you end up with \foo equal to whatever the next token is). – Joseph Wright Jan 20 '13 at 15:03