251

Is there a macro in latex to write ceil(x) and floor(x) in short form? The long form

\left \lceil{x}\right \rceil 

is a bit lengthy to type every time it is used.

vitamin d
  • 137
  • 1
  • 1
  • 11
danny
  • 2,717

4 Answers4

273

Using \DeclarePairedDelimiter from mathtools, you could define macros \ceil and \floor, which will scale the delimiters properly (if starred):

\documentclass{minimal}
\usepackage{mathtools}
\DeclarePairedDelimiter\ceil{\lceil}{\rceil}
\DeclarePairedDelimiter\floor{\lfloor}{\rfloor}

\begin{document} \begin{equation} \floor{\frac{x}{2}} \leq \frac{x}{2} \leq \ceil{\frac{x}{2}} \end{equation} \end{document}

Result:

example of using floor and ceiling

You
  • 6,713
  • 2
  • 29
  • 27
  • 4
    That's neat. Didn't know about this command. – Jan Jun 08 '13 at 11:47
  • 1
    Doesn't work here. Any idea how to do it without mathtools? – David 天宇 Wong Mar 05 '15 at 01:54
  • 3
    Just a question: why * when using \floor? I noticed that if the * is omitted from the command, the delimiter does not resize... but why? – Gherardo Jul 11 '15 at 07:26
  • 4
    @Gherardo: Check the documentation of the mathtools package. It's just the way the \DeclarePairedDelimiter macro works — you can also make it use a specific size if you want to: \floor[\Bigg]{\frac{x}{2}}. – You Jul 11 '15 at 10:10
  • 40
    As a minor side note, the inequality you used as an example is incorrect for all even numbers. – Chris Feb 18 '18 at 13:35
  • I do not know how the definition works, but \lceil{x}\rceil worked. – puravidaso Jan 19 '21 at 02:09
  • @Chris I don't see how the inequality is incorrect. – Atom Aug 23 '22 at 14:06
  • 4
    @Atom The post was edited after I made this comment. https://tex.stackexchange.com/review/suggested-edits/232037 – Chris Aug 23 '22 at 16:29
41
  1. You can define your own macro via the \def command anywhere in your document. For example

    \def\lc{\left\lceil}   
    \def\rc{\right\rceil}
    

    and then just write \lc x \rc.

  2. Or you use the \providecommand in the preamble, e.g.

    \providecommand{\myceil}[1]{\left \lceil #1 \right \rceil }
    

    to simply use \myceil{x} in your document.

  3. Use an editor, like vim, that allows for defining shortcuts for quick and efficient editing.
  4. And, finally, don't forget about readability of your tex document. Check out this thread for some instructive comments on how to write efficient and readable tex math docs.
Jan
  • 1,344
  • 4
    For 1. In LaTeX you should use \newcommand not \def. For 1. and 2. using \left...\right is not appropriate in a number of situations. – Andrew Swann May 05 '18 at 08:40
  • How does \providecommand differ from \newcommand? – Paul Wintz Nov 15 '21 at 10:00
  • 1
    @PaulWintz If the command already exists, \providecommand will do nothing and \newcommand will cause an error. If the command doesn't exist, they are equivalent. There's also \renewcommand, which will cause an error if the command doesn't already exist. The purpose of the three commands is to make sure you realize when you're overwriting an existing command. – Teepeemm Jun 08 '22 at 20:56
22

This will also work fine without using mathtools.

\newcommand{\floor}[1]{\lfloor #1 \rfloor}
  • 6
    Welcome to TeX.SX! \floor and \rfloor are amsmath commands, mathtools builds on top of amsmath, so it's no wonder, this would work even without mathtools. The solution with \DeclarePairedDelimiter shows better spacing however. Perhaps you should elaborate on your answer and show some screenshot and a full example, not only fragments of code –  Jun 24 '15 at 23:47
  • 2
    @ChristianHupfer \lfloor and \rfloor are in core LaTeX. \floor is not defined in amsmath. The \DeclaredPairedDelimiter' is good, but in comparison to the\newcommand` above it mostly provides an easy way to change the code when a different size is required. – Andrew Swann May 05 '18 at 08:44
20

There is no need to use mathtool here:

\newcommand{\floor}[1]{\left\lfloor #1 \right\rfloor}
\newcommand{\ceil}[1]{\left\lceil #1 \right\rceil}

is better than mathtool.

Sebastiano
  • 54,118
latra
  • 95