More robust florin, without negative margin

Florin was introduced because the Times New Roman italic f extends
weirdly far on either side, whereas the Times New Roman italic florin
symbol is much more...reserved. Or something. I dunno, it looks bad.
Anyway, the thing with florin is it has tons of spacing on either side
for whatever reason, so we use a negative margin to get it to overlap
normally with adjacent characters.

Which seems pretty natural, but unfortunately keeps causing problems
(#61, #90, now #295):
https://github.com/mathquill/mathquill/issues?labels=Florin&state=closed

I suspect that negative margins on inline elements is uncommon, I don't
think the box model is really meant for inline elements, width and
height are even ignored on them. Instead, an inline-block with a fixed
width narrower than the florin symbol (the whole symbol is still visible
because it defaults overflow:visible) and position:relative (to overlap
on both sides, not just the right side) seems less likely to cause
layout quirks. Or at least, unique layout quirks, inline-blocks cause
tons of layout quirks but MathQuill already works around them because
almost everything besides letters and digits are inline-blocks, and
position:relative basically doesn't affect layout.
Renamed "yield" due to ECMAScript 5 reservation closing #298
Renamed "_super" in line with bc7c98ffd78c8316775a4982803467446b2043b0
Merge pull request #299 from RobbinHabermehl/dev

Renamed "yield" and "_super"
Merge pull request #296 from mathquill/fix.florin

More robust florin, without negative margin
Remove .is{First,Last}Letter flags from Letter's

Also remove Letter::latex() entirely. Instead of overriding
Symbol::latex() (which just outputs .ctrlSeq), leave as-is and have
Letter::autoUnItalicize() directly modify .ctrlSeq, using .letter as
saved by Letter::init() and never modified again.

Prep for latex output being more complicated than just two mutually
exclusive flags (i.e., should be outputting \operatorname{...}
sometimes).
Clarify Letter:autoUnItalicize #cleanup

Setting .ctrlSeq and the CSS classes is about to get more complicated,
so separate into its own section, and determine `last` at the beginning
before doing any of it as soon as we know we've found an unitalicized
word (except setting each `un-italicized` CSS class, simplest to do that
in the same loop where we find `last`).
Fix UnItalicized LaTeX output to use \operatorname{...}

...when outputting UnItalicized's that aren't built-in LaTeX commands,
like arcsec. Also parse \operatorname{...} stupidly, by pretending the
letters inside are just variables and auto-unitalicizing as appropriate.

I was originally going to have 'inj' and 'proj' auto-unitalicize as
\operatorname{inj} and \operatorname{proj}, too, but it was a ton of
code (the cleanup in the previous commit was pretty important in making
the diff readable, though it's helpful even now) and I eventually
realized this was much simpler and I should err on the side of fewer
3-letter auto-unitalicized commands anway. So now, 'inj' and 'proj' no
longer auto-unitalicize at all, only 'injlim' and 'projlim' as a whole
get auto-unitalicized. This is implemented as a special case, but
whatever.

This problem was brought up in #286. Also fixes #289 (including [1] by
only setting a 'last' CSS class but no 'first' class in the middle of
two-word operator names; choice of that over 'first' but no 'last' was
largely arbitrary, mainly it just looked more right to see extra space
after rather than before a word).

[1]: https://github.com/mathquill/mathquill/issues/289#issuecomment-41447574
Fix #292 support arcsinh etc as well as arsinh etc
Fix #300: \inf, \liminf broken

Ugh at first I thought this would be as trivial as redefining the florin
to descend from Letter rather only Symbol, but then I realized the
florin character looks italic when what we want is roman 'f', so had to
refactor that out, then found that \inf was an incorrect alias to
\infty! Idiot. So, I hope no one using MathQuill has been relying on
\inf, 'cos this totally changes the meaning of that.
Simplify MathQuill.addAutoCommands() args parsing #cleanup

https://github.com/mathquill/mathquill/commit/b2bfcd8a928be07b6736fe04be3052bb4584bdf2#commitcomment-6163517
Fix #286: add MathQuill.overrideAutoUnitalicized()

https://github.com/mathquill/mathquill/issues/286#issuecomment-40857307
Merge pull request #301 from mathquill/fix.auto-unitalicized

Fix auto-unitalicized
Edit "prevent focus on mousedown in IE≤8" comment

...to link to my thorough explanation/test case on jsbin, rather than
the jQuery ticket where I merely mention it (it links to that jQuery
ticket anyway).

The fix to prevent focus on mousedown in IE≤8 was committed on accident:
https://github.com/mathquill/mathquill/commit/a4ae77cc5378ed9d25e5c111426a2b55227808e8#diff-1
but it's pretty much exactly what I want so I'm not gonna bother
reverting and then re-committing it. Instead, here I make a minor edit
to the comment, and mention that it fixes #206.
Automatic rewrite of CSS class 'mq-array'

Remaining instances of 'array' (outside test/support/):
src/commands/math.js:    // .blocks array of child blocks.
Automatic rewrite of CSS class 'mq-binary-operator'

Remaining instances of 'binary-operator' (outside test/support/):
Automatic rewrite of CSS class 'mq-blur'

Remaining instances of 'blur' (outside test/support/):
src/commands/math.js:    // empty elements need the empty box provided by blur to
src/commands/math.js:    self.postOrder('blur');
src/commands/math.js:  _.blur = function() {
src/commands/math/commands.js:    this.ends[L].blur = function() {
src/commands/text.js:  _.blur = function() {
src/commands/text.js:    MathBlock.prototype.blur.call(this);
src/cursor.js:    if (parent !== this.parent && this.parent.blur) this.parent.blur();
src/publicapi.js:      if (this.controller.blurred) this.controller.cursor.hide().parent.blur();
src/publicapi.js:  _.blur = function() { this.controller.textarea.blur(); return this; };
src/publicapi.js:    if (this.controller.blurred) this.controller.cursor.hide().parent.blur();
src/publicapi.js:    if (ctrlr.blurred) cursor.hide().parent.blur();
src/publicapi.js:      if (this.controller.blurred) this.controller.cursor.hide().parent.blur();
src/services/focusBlur.js:    }).blur(function() {
src/services/focusBlur.js:      blurTimeout = setTimeout(function() { // wait for blur on window; if
src/services/focusBlur.js:        root.postOrder('intentionalBlur'); // none, intentional blur: #264
src/services/focusBlur.js:        blur();
src/services/focusBlur.js:      $(window).on('blur', windowBlur);
src/services/focusBlur.js:    function windowBlur() { // blur event also fired on window, just switching
src/services/focusBlur.js:      clearTimeout(blurTimeout); // tabs/windows, not intentional blur
src/services/focusBlur.js:      blur();
src/services/focusBlur.js:    function blur() { // not directly in the textarea blur handler so as to be
src/services/focusBlur.js:      cursor.hide().parent.blur(); // synchronous with/in the same frame as
src/services/focusBlur.js:      $(window).off('blur', windowBlur);
src/services/focusBlur.js: * TODO: I wanted to move MathBlock::focus and blur here, it would clean
src/services/focusBlur.js: * and TextBlock::blur calls MathBlock::blur, when instead they could
src/services/focusBlur.js: * Problem is, there's lots of calls to .focus()/.blur() on nodes
src/services/focusBlur.js: * outside Controller::focusBlurEvents(), such as .postOrder('blur') on
src/services/focusBlur.js: * insertion, which if MathBlock::blur becomes Node::blur, would add the
src/services/focusBlur.js: * 'blur' CSS class to all Symbol's (because .isEmpty() is true for all
src/services/focusBlur.js: * .blur(), so this is TODO for now.
src/services/textarea.js:    .focus(function() { ctrlr.blurred = false; }).blur(function() {
src/services/textarea.js:      setTimeout(detach); //detaching during blur explodes in WebKit
test/unit/saneKeyboardEvents.test.js:      el.trigger('blur');
Automatic rewrite of CSS class 'mq-denominator'

Remaining instances of 'denominator' (outside test/support/):
README.md:left end of the denominator, right out of the denominator puts the cursor to the
README.md:the right end of the denominator, etc. Note that right out of the numerator to
README.md:the left end of the denominator is actually leftwards (and downwards, it's
README.md:that left into a fraction goes up into the numerator, skipping the denominator;
README.md:symmetrically, right out of the numerator skips the denominator and puts the
README.md:actually rightwards (the drawback is the denominator is always skipped, you
test/unit/publicapi.test.js:    mq.keystroke('Left'); // right edge of denominator
test/unit/updown.test.js:    assert.equal(denom.latex(), '34', 'denominator is right end child of fraction');
test/unit/updown.test.js:    assert.equal(cursor.parent, denom, 'cursor down goes into denominator');
test/unit/updown.test.js:    assert.equal(cursor[L], 0, 'cursor down from numerator inserts at left end of denominator');
test/unit/updown.test.js:    assert.equal(cursor[R], 0, 'cursor up from denominator inserts at right end of numerator');
test/unit/updown.test.js:    assert.equal(cursor.parent, denom, 'cursor down goes into denominator');
test/unit/updown.test.js:    assert.equal(cursor[L], 0, 'cursor down from left of fraction inserts at left end of denominator');
test/unit/updown.test.js:    assert.equal(cursor.parent, halfDenom, 'cursor down goes into denominator of half');
test/unit/updown.test.js:    assert.equal(cursor.parent, subFracDenom, 'cursor in subscript fraction denominator');
test/unit/updown.test.js:    assert.equal(cursor.parent, dxBlock, 'cursor up up from subscript fraction denominator that\s not at right end goes out of subscript');
test/unit/updown.test.js:    assert.equal(cursor[R], sub, 'cursor up up from subscript fraction denominator that\s not at right end goes before subscript');
test/unit/updown.test.js:    assert.equal(cursor.parent, subFracDenom, 'cursor in subscript fraction denominator');
test/unit/updown.test.js:    assert.equal(cursor.parent, dxBlock, 'cursor up up from subscript fraction denominator that is at right end goes out of subscript');
test/unit/updown.test.js:    assert.equal(cursor[L], sub, 'cursor up up from subscript fraction denominator that is at right end goes after subscript');
Automatic rewrite of CSS class 'mq-empty'

Remaining instances of 'empty' (outside test/support/):
README.md:  them to the (default empty) set of "auto-commands", commands automatically
src/commands/math.js:    // empty elements need the empty box provided by blur to
src/commands/math.js:    //insert the cursor at the right end of the first empty child, searching
src/commands/math.js:    //left-to-right, or if none empty, the right end child
src/commands/math/symbols.js:LatexCmds.empty = LatexCmds.emptyset =
src/commands/math/symbols.js:  bind(BinaryOperator,'\\varnothing ','&empty;');
src/css/editable.less:// when empty by inserting invisible text.
src/publicapi.js:      el.empty().unbind('.mathquill')
src/services/latex.js:      jQ.empty();
src/tree.js:    // either it's empty and `rightward` is the left end child (possibly empty)
src/tree.js:    // either it's empty and `leftward` is the right end child (possibly empty)
src/tree.js:    pray('no half-empty fragments', !withDir === !oppDir);
src/tree.js:    // guard for empty and already-disowned fragments
test/unit/SupSub.test.js:    'typed, wrote, wrote empty'.split(', ').forEach(function(did, j) {
test/unit/latex.test.js:  test('empty LaTeX', function () {
test/unit/latex.test.js:      test('empty LaTeX', function () {
test/unit/latex.test.js:      test('empty LaTeX', function () {
test/unit/saneKeyboardEvents.test.js:        assert.equal(el.val(), '', 'the textarea remains empty');
test/unit/tree.test.js:    test('the empty case', function() {
test/unit/tree.test.js:    test('the empty case', function() {
test/unit/tree.test.js:    test('an empty fragment', function() {
test/unit/tree.test.js:      var empty = Fragment();
test/unit/tree.test.js:      empty.each(function() { count += 1 });
test/unit/tree.test.js:      assert.equal(count, 0, 'each is a noop on an empty fragment');
test/unit/tree.test.js:    test('half-empty fragments are disallowed', function() {
test/unit/tree.test.js:      }, 'half-empty on the right');
test/unit/tree.test.js:      }, 'half-empty on the left');
test/unit/typing.test.js:      test('empty parens', function() {
test/unit/typing.test.js:      test('empty mis-matched brackets', function() {
test/unit/typing.test.js:      test('empty pipes', function() {
test/unit/typing.test.js:      test('backspacing close-bracket then open-paren of 1+(]+4 (empty paren group)', function() {
test/unit/typing.test.js:      test('backspacing open-paren then close-bracket of 1+(]+4 (empty paren group)', function() {
test/unit/typing.test.js:      test('backspacing close-bracket then open-paren of 1+(] (empty paren group, nothing after)', function() {
test/unit/typing.test.js:      test('backspacing open-paren then close-bracket of 1+(] (empty paren group, nothing after)', function() {
test/unit/typing.test.js:      test('backspacing close-bracket then open-paren of (]+4 (empty paren group, nothing before)', function() {
test/unit/typing.test.js:      test('backspacing open-paren then close-bracket of (]+4 (empty paren group, nothing before)', function() {
test/unit/typing.test.js:        test('backspacing close-pipe then open-pipe of 1+||+4 (empty pipe pair)', function() {
test/unit/typing.test.js:        test('backspacing open-pipe then close-pipe of 1+||+4 (empty pipe pair)', function() {
test/unit/typing.test.js:        test('backspacing close-pipe then open-pipe of 1+|| (empty pipe pair, nothing after)', function() {
test/unit/typing.test.js:        test('backspacing open-pipe then close-pipe of 1+|| (empty pipe pair, nothing after)', function() {
test/unit/typing.test.js:        test('backspacing close-pipe then open-pipe of ||+4 (empty pipe pair, nothing before)', function() {
test/unit/typing.test.js:        test('backspacing open-pipe then close-pipe of ||+4 (empty pipe pair, nothing before)', function() {
Automatic rewrite of CSS class 'mq-first'

Remaining instances of 'first' (outside test/support/):
README.md:  editable field, respectively. (The first two are implemented in terms of
src/commands/math.js:    //insert the cursor at the right end of the first empty child, searching
src/commands/math.js:    //   top-level close tags, because we should have first encountered a
src/commands/math/commands.js:    this.delimjQs = this.jQ.children(':first').add(this.jQ.children(':last'));
src/commands/math/commands.js://   first typed as one-sided bracket with matching "ghost" bracket at
src/commands/math/symbols.js:    outer: for (var i = 0, first = l[R] || this.parent.ends[L]; i < str.length; i += 1, first = first[R]) {
src/commands/math/symbols.js:          for (var j = 0, letter = first; j < len; j += 1, letter = letter[R]) {
src/commands/math/symbols.js:          first.ctrlSeq = (isBuiltIn ? '\\' : '\\operatorname{') + first.ctrlSeq;
src/commands/math/symbols.js:          first = last;
src/cursor.js:          this.jQ.insertBefore(this[R].jQ.first());
src/cursor.js:          cousin.jQ.insertBefore(gramp.jQ.first());
src/intro.js: *   var doStuff = variadic(function(first, rest) { return rest; });
src/intro.js: * a function that calls it's first argument's method of that name (if
src/intro.js: * a function that calls it's first argument on each of those objects
src/intro.js: * (if the first argument is a function, it is called repeatedly with
src/intro.js: * each object as the first argument, otherwise it is stringified and
src/services/keystroke.js:   * - first check left and right, if so insAtLeft/RightEnd of them
src/tree.js:      this.insertBefore(el.first()) : this.insertAfter(el.last());
test/unit/latex.test.js:      inner1 = MathQuill($(outer.el()).find('.mathquill-editable:first')[0]);
test/unit/unitalicized.test.js:    assertLatex('deleted first char', 's\\csc s\\csc s\\csc');
test/unit/unitalicized.test.js:    assertLatex('typed back first char', '\\csc s\\csc s\\csc sc');