144

In the inline math mode ($...$), if the formula is too long, LaTeX will try to break it on operators, e.g.

very long text followed by a very long equation like $a+b+c+d+e+f+g+h+i+j+k+l$ etc

may be rendered as

very long text followed
by a very long equation
like a+b+c+d+e+f+g+h+i+
j+k+l etc

However, the break won't happen if they are separated by commas, e.g.

very long text followed by a very long equation like $a,b,c,d,e,f,g,h,i,j,k,l$ etc

will overflow the page like

very long text followed
by a very long equation
like a,b,c,d,e,f,g,h,i,j,k,l
etc

How to make LaTeX able to insert line breaks after a comma too?

6
  • I tried breqn but it uses "expl3.sty" which can not be found by Latex ALTHOUGH I downloaded it and put in the same folder where breqn.sty exists!
    – Ahmad
    Jan 8, 2011 at 22:09
  • @Ahmad: If you've got a question, then you should ask it in a new post. Please do this with the "Ask Question" link. In your new question you could link to this one. Jan 8, 2011 at 22:09
  • @Ahmad: Just a note to confirm Hendrik's comment, this ought to be reposted as a question for you to get the best chance of it being answered. Jan 8, 2011 at 22:09
  • Late to the party, but just for the record: You can make the comma be treated like a binary or relation operator with the commands \mathbin{,} or \mathrel{,}. For instance, $stuff \mathrel{,} morestuff$ will allow the linebreak between the two stuffs.
    – phfaist
    Dec 4, 2017 at 22:27
  • Automatical breaking at + does happen neither between \left and \right nor between { and }. I had to suppress them manually in latex's export of matlab's Live Editor. Sep 28 at 7:41

6 Answers 6

128

If the expression contains many commas then consider to break it into several math expressions, separated by commas. It reads like a list of math expressions. This way TeX can break the line.

To achieve line breaks after a comma, you could insert \allowbreak after the comma and before the next math symbol. If necessary, leave a blank after \allowbreak.

If you would like to have a document wide solution, you could redefine the comma. One solution, following the tip here would be:

\makeatletter
\def\old@comma{,}
\catcode`\,=13
\def,{%
  \ifmmode%
    \old@comma\discretionary{}{}{}%
  \else%
    \old@comma%
  \fi%
}
\makeatother
8
  • 8
    Thanks. My expression is actually a set with 48 elements, so splitting them into several expressions may not sound mathematically logical. I will try \allowbreak.
    – kennytm
    Aug 18, 2010 at 15:50
  • 3
    +1, excellent answer! However, there's a complication: Please see tex.stackexchange.com/q/19094/1347. May 26, 2011 at 9:51
  • 10
    Note that the \allowbreak solution does not work if you have \left...\right delimiters that span the break in your equation
    – Mosby
    Jan 7, 2016 at 15:45
  • 11
    Any trick for \allowbreak working in \left...\right delimiters? Mar 21, 2017 at 15:29
  • 3
    This document-wide solution seems to break tikz...
    – xuhdev
    Aug 13, 2017 at 4:22
43

You could take a look at the breqn package, which is aimed at solving this problem in a general sense.

3
  • 13
    Wow, breqn allows \left and \right to work across line breaks! Aug 18, 2010 at 17:13
  • 8
    Indeed, amongst other things. The late Michael Downes was a very clever guy!
    – Joseph Wright
    Aug 18, 2010 at 18:02
  • 1
    For commas, this does not work with all types of atoms. See the discussion here. Apr 26, 2015 at 12:47
21

Here is a solution that doesn't make the comma globally active:

\documentclass{article}

\newcommand{\splitatcommas}[1]{%
  \begingroup
  \begingroup\lccode`~=`, \lowercase{\endgroup
    \edef~{\mathchar\the\mathcode`, \penalty0 \noexpand\hspace{0pt plus 1em}}%
  }\mathcode`,="8000 #1%
  \endgroup
}

\begin{document}

\setlength{\lineskiplimit}{2pt}\setlength{\lineskip}{3pt} % for this particular case

$\splitatcommas{
  \frac{1}{2},\frac{3}{5},\frac{8}{13},\frac{21}{34},\frac{55}{89},
  \frac{144}{233},\frac{377}{610},\frac{987}{1597},\frac{2584}{4181},
  \frac{6765}{10946},\frac{17711}{28657},\frac{46368}{75025},
  \frac{121393}{196418},\frac{317811}{514229},\frac{832040}{1346269},
  \frac{2178309}{3524578},\frac{5702887}{9227465},
  \frac{14930352}{24157817},\frac{39088169}{63245986},\frac{102334155}{165580141}
}$

\end{document}

The setting of \lineskiplimit and \lineskip are for the particular case where fractions are needed in the argument.

enter image description here

A variant that allows nesting:

\documentclass{article}

\newcommand{\splitatcommas}[1]{%
  \begingroup
  \ifnum\mathcode`,="8000
  \else
    \begingroup\lccode`~=`, \lowercase{\endgroup
      \edef~{\mathchar\the\mathcode`, \penalty0 \noexpand\hspace{0pt plus 1em}}%
    }\mathcode`,="8000
  \fi
  #1%
  \endgroup
}

\newcommand{\tuple}[1]{(\splitatcommas{#1})}
\newcommand{\set}[1]{\{\splitatcommas{#1}\}}

\begin{document}

\setlength{\lineskiplimit}{2pt}\setlength{\lineskip}{3pt} % for this particular case

$\splitatcommas{
  \frac{1}{2},\frac{3}{5},\frac{8}{13},\frac{21}{34},\frac{55}{89},
  \frac{144}{233},\frac{377}{610},\frac{987}{1597},\frac{2584}{4181},
  \frac{6765}{10946},\frac{17711}{28657},\frac{46368}{75025},
  \frac{121393}{196418},\frac{317811}{514229},\frac{832040}{1346269},
  \frac{2178309}{3524578},\frac{5702887}{9227465},
  \frac{14930352}{24157817},\frac{39088169}{63245986},\frac{102334155}{165580141}
}$

$\set{
  \tuple{a,b,c,d},\tuple{1,2,3,4,5,6},\tuple{11,22,33,44,55,66,77,88},
  \tuple{a,b,c,d},\tuple{1,2,3,4,5,6},\tuple{11,22,33,44,55,66,77,88},
  \tuple{a,b,c,d},\tuple{1,2,3,4,5,6},\tuple{11,22,33,44,55,66,77,88},
  \tuple{a,b,c,d},\tuple{1,2,3,4,5,6},\tuple{11,22,33,44,55,66,77,88}
}$

\end{document}

enter image description here

15
  • 1
    @Nasser With breqn this is guaranteed not to work. Probably something can be done, I'll work on your problem later.
    – egreg
    May 14, 2016 at 16:59
  • Did you manage to find the workaround for breqn?
    – azetina
    Jul 13, 2016 at 13:51
  • 2
    @azetina I don't consider breqn a usable piece of software.
    – egreg
    Jul 13, 2016 at 14:15
  • @egreg Nice solution! But if I do nesting like \splitatcommas{a , b,\splitatcommas{c, d} I’m getting errors like ! Bad mathchar (32768). Do you have any idea to fix this?
    – Ronny
    Jan 7, 2018 at 23:02
  • 1
    @Ronny Added the variant
    – egreg
    Jan 8, 2018 at 13:46
15

Just try inserting \allowbreak in between your inline equations.

$x_1, x_2,...\allowbreak, y_1,y_2,y_n$. The line won't reach out and break at before y_1

2
  • 2
    Welcome ! Could you please expand your answer a bit, with a small example for instance ?
    – BambOo
    Nov 5, 2018 at 15:38
  • 1
    That's it! It also works in plain TeX.
    – user206750
    Sep 7, 2022 at 9:17
4

In luatex you have a new possibility that does not involve active characters, you can declare , to be a mathbin (like +) so that line breaking is allowed and then set the mathord-mathbin spacing to zero so it gets no space before, like punctuation:

enter image description here

\documentclass{article}

\begin{document}

$
\mathcode`\,="213B % mathbin
\Umathordbinspacing\textstyle 0mu % no space before
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a$
\end{document}
2

If you can split the equation into several sub equation using $, and if you are using braces use \left. and \right. (with dot) to balance the braces.

Example:

 $X = \left\{\right.a$, $b$, $c$, $d\left.\right\}$

X = { a, b, c, d }

This should allow line breaks behind the commas.

2
  • 11
    You might as well just omit \left and \right. Putting the matching brace directly adjacent obviates any point to having scaling braces at all. Mar 15, 2014 at 18:36
  • disregarding the pointless \left and \right commands, ;) it is a quick workaround. Jun 6, 2016 at 10:39

You must log in to answer this question.

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