You don’t need the semicolon. After it’s sent to the background it’s free to get another command.
evince foo.pdf bar.pdf & emacs foo.tex &
BTW, the core issue is that (Bourne-derived) shells do not allow empty commands.
“;” and “&” are command terminators, meaning fg and bg respectively.
So “; ;” (or “;” at the beginning of a line) is also invalid.
(Newline(s) imply “;” if there is a not-yet-terminated command,
unless you use “\” to continue the line.)
Languages vary a lot on these policies:
C-derived languages allow empty statements.
Pascal and PERL have separators, not terminators.
No, it’s just confused and can’t work out quite what you mean.
You need to group the & with the command that you want to put in the background:
$ (evince foo.pdf bar.pdf &); emacs foo.tex &
That works fine. Even more explicit would be:
$ (evince foo.pdf bar.pdf &); (emacs foo.tex &)
Especially if you then wanted to chain more commands after the end as well.