279

I like to use $:=$ for "is defined to be equal to", but this is never typeset with the symmetry one would like, as the colon is always too low relatively to the equals sign. Is there any way of getting this to appear correctly?

12
  • 3
    ":=" is usually meant to be a quite different concept, namely imperative assignment. Commented Oct 18, 2010 at 12:58
  • 53
    @Charles: I've seen it used for both. Pure mathematicians, who have little use for imperative assignment, I think tend to use it more for definitional equality. Commented Nov 3, 2010 at 19:34
  • 10
    Oh yes, they do, all the time. Commented Nov 4, 2010 at 7:26
  • 12
    @Charles: I don't think it's any sloppier than, say, an algebraist writing H < G for "H is a subgroup of G". Sure, we think of < as meaning numerically less than, but there's no ambiguity in the context. And there's a related meaning in both cases: both uses of < give rise to a poset, and both uses of := mark some "special" form of equality. And since most mathematicians have no use for the imperative :=, there's no confusion. Just my 2¢. (Personally, I'm not particularly fond of either usage of :=, preferring "we define x to be …" or "x = …" for the one and "var ← value" for the other.) Commented Nov 4, 2010 at 10:28
  • 5
    @user, you were misinformed. The symbol goes much further back, to APL and the Pascal family of languages. It's meant to resemble APL's left-pointing arrow, which is of course not part of ASCII. That's why people associate it with "imperative assignment" in the discussion.
    – alexis
    Commented Apr 18, 2013 at 10:17

12 Answers 12

249

See the mathtools package, which offers the macro \coloneq for this purpose.

\documentclass{standalone}
\usepackage{mathtools}
\begin{document}
\( b := 10 \) \emph{versus} \( b \coloneq 10 \).
\end{document}

yields

Preview of the above document

Click image or right here to see it at full size (1600×133).

Note that the colon is slightly too low on the left, but vertically centered on the right.


Edit: as of 2022, \coloneq replaces legacy \coloneqq (which is still supported, but now labeled a 'Legacy duplicate name' in the mathtools docs' colon symbols list)

2
  • 21
    @EmilJeřábek Perhaps you can't see it very well in the image, but if you run the code and zoom in on the PDF you'll find the second version has the : and = on the same axis whereas the first one doesn't.
    – Joseph Wright
    Commented May 20, 2014 at 16:55
  • 9
    Is there a unicode symbol for :=, with same benefits as \coloneqq? Yes: U+2254
    – phs
    Commented Mar 7, 2017 at 12:12
98

This answer is an attempt to make Matthew happy, who doesn't like that the dots in the colon are so far apart. (@Matthew: I do understand that you don't like it.)

\makeatletter
\newcommand*{\defeq}{\mathrel{\rlap{%
                     \raisebox{0.3ex}{$\m@th\cdot$}}%
                     \raisebox{-0.3ex}{$\m@th\cdot$}}%
                     =}
\makeatother

EDIT:

To make Matthew even happier, I provide yet another answer that uses a different approach (motivated by the definition of \vdots) where the dots are smaller:

\newcommand*{\defeq}{\mathrel{\vcenter{\baselineskip0.5ex \lineskiplimit0pt
                     \hbox{\scriptsize.}\hbox{\scriptsize.}}}%
                     =}

8
  • 4
    thanks for caring about my happiness. :-) In addition to the dots being the same distance apart as the lines, I were writing ":=" with chalk or pencil I think the diameter of the dots would be about the same as the line width. Can you do that? Commented Nov 3, 2010 at 18:12
  • 5
    @Matthew: Happy now? Commented Nov 3, 2010 at 19:13
  • 3
    Not bad at all. Commented Nov 3, 2010 at 19:18
  • 8
    Fantastic! I've been looking for this for ages. +++++1 Commented Sep 6, 2011 at 7:45
  • 2
    @tohecz: You're right, but do you really want to define something in an index? Or is there some other usage of the symbol? Commented Feb 10, 2013 at 8:00
38

I prefer Donald Arseneau's hack that can be found on the TeX FAQ (sorry, this links to a page in German):

\mathchardef\ordinarycolon\mathcode`\:
\mathcode`\:=\string"8000
\begingroup \catcode`\:=\active
  \gdef:{\mathrel{\mathop\ordinarycolon}}
\endgroup

Just put this code into your preamble. Then you can use := as usual, and you'll get horizontal symmetry. Much easier to use than \coloneqq, in my opinion.

Per @Will Robertson's comment, there is also a feature of mathtools to change the vertical alignment of all colons in math mode.

\mathtoolsset{centercolon}
3
  • 47
    This is already part of mathtools: \mathtoolsset{centercolon} Commented Oct 17, 2010 at 14:34
  • @Will Robertson: Thanks for the tip. I already thought that this should be in some package, but didn't find it. Commented Oct 17, 2010 at 14:40
  • 1
    @WillRobertson That is definitely worth an answer on its own. Commented Feb 25, 2020 at 9:22
19

Obligatory ConTeXt solution: \colonequals; which uses a composed character in MkII and the proper unicode math character in MkIV

15

There is also a package by Heiko Oberdiek: colonequals

Some fonts have dedicated characters for these symbols. Unfortunately, there are name clashes concerning \coloneq, which may refer to :- or to ≔ (U+2254, :=).

1
  • 3
    pxfonts is one of the fonts with this already in. Commented Oct 18, 2010 at 8:03
12

A way to get this with pxfonts without including the whole package:

\DeclareSymbolFont{symbolsC}{U}{pxsyc}{m}{n}
\DeclareMathSymbol{\coloneqq}{\mathrel}{symbolsC}{"42}

and you get:

it's a:= b magic!

11

I tried quite some of the solutions given here but none of those seemed satisfactory to me. Most of them only solve the problem of the vertical alignment of the colon but do not respect the length of all the other binary relations, that is ":=" is much longer than "=" and the like.

My suggestion hence is the following:

\newcommand{\eqcolon}{\mathrel{\resizebox{\widthof{$\mathord{=}$}}{\height}{ $\!\!=\!\!\resizebox{1.2\width}{0.8\height}{\raisebox{0.23ex}{$\mathop{:}$}}\!\!$ }}}
\newcommand{\coloneq}{\mathrel{\resizebox{\widthof{$\mathord{=}$}}{\height}{ $\!\!\resizebox{1.2\width}{0.8\height}{\raisebox{0.23ex}{$\mathop{:}$}}\!\!=\!\!$ }}}

This will result in ":=" beeing equally long as "=" so it will align properly in multiline math equations. Below is a comparisson of the approach \newcommand{\eqcolon}{\ensuremath{\mathrel{=\!\!\mathop{:}}}} with my suggestion. Note how the lines align properly in amsmath align environments.

Before:

unaligned relations

After:

aligned relations

3
  • Welcome to TeX.SX! You can have a look at our starter guide to familiarize yourself further with our format. Commented Oct 28, 2015 at 14:47
  • This looks like an answer to a slightly different question... Commented Oct 28, 2015 at 14:48
  • 5
    @MartinSchröder Why is that? I had the same problem to typeset $:=$ for "defined as". I use this sometimes to define auxillary variables that I only use locally. I just wanted to share my result as I was not satisfied with the typographic quality of other solutions here and in similar questions (e.g. Typesetting the “define equals” symbol).
    – jenom
    Commented Oct 28, 2015 at 15:24
10

I actually think that symbol looks ugly. It would be OK if the spacing between the dots were the same as that between the lines of the equals. But I use

\newcommand{\defeq}{\stackrel{\text{def}}{=}}

instead.

7
  • 13
    Whereas I think that the overset "def" is ugly (and illegible from any distance)! There's no accounting for taste ... Commented Oct 18, 2010 at 8:04
  • 20
    One advantage of := is that ir is bidirectional. := and =: mean different things. \defeq and \triangleeq loose that distinction.
    – Aditya
    Commented Oct 18, 2010 at 13:41
  • 5
    +1 for this. ":=" is programming jargon and, as Charles Stewart points out, misused programming jargon. Personally, I prefer \newcommand{\defeq}{\stackrel{\textup{\tiny def}}{=}}. Then Andrew Stacey can't see it at all, and everyone's happy.
    – Mephisto
    Commented Oct 19, 2010 at 0:08
  • 3
    @Charles: thanks for matching my braces. @Aditya: I see your point of view, but I think bidirectional means the opposite of the way you're using it. Commented Oct 21, 2010 at 1:08
  • 3
    @Matthew: I'd use your \defeq to indicate that an equality holds by definition (i.e., by a definition stated earlier). I've posted another answer that changes the spacing of the dots. Commented Nov 3, 2010 at 16:49
10

My solution is

\def\defeq{\mathrel{\mathop:}=}
2
  • This is not a good solution because you can have a line break between the : and the = (mathtools had this bug a while back, see groups.google.com/group/comp.text.tex/msg/…).
    – Aditya
    Commented Nov 3, 2010 at 17:54
  • 9
    @Aditya: something like \mathrel{\mathop:}= does not break between lines, but using \mathrel{\mathop:}\mkern-1.2mu= as in mathtools does introduce a breaking point at the \mkern (and can be solved by putting a \nobreak just before \mkern or by wrapping everything in a \mathrel). Commented Dec 11, 2010 at 23:24
6

You may try \coloneq (as well as \eqcolon) from unicode-math package:

enter image description here

Note that unicode-math requires XeLaTeX/LuaLaTeX.

4

I use \vcentcolon= from the mathtools package. I like it better than \coloneqq because with the former, there is more spacing between the colon and the equals sign.

enter image description here

3

Edit: I didn't know this at the time of writing this answer, but commath is not a well designed package, and it can lead to obscure problems. I would stay away from it and use a solution from another answer.


The commath package automatically fixes the alignment of := and =: in math mode.

...
\usepackage{commath}
...
\begin{gather*}
a := b \\
b =: a
\end{gather*}
...

cropped render of the above code

You must log in to answer this question.

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