diff --git a/TexSoup/data.py b/TexSoup/data.py
index f7279c8..58cd070 100644
--- a/TexSoup/data.py
+++ b/TexSoup/data.py
@@ -1317,7 +1317,7 @@ class TexArgs(list):
         """
         arg = self.__coerce(arg)
 
-        if isinstance(arg, TexGroup):
+        if isinstance(arg, (TexGroup, TexCmd)):
             super().insert(i, arg)
 
         if len(self) <= 1:
diff --git a/TexSoup/reader.py b/TexSoup/reader.py
index 3347393..fd53989 100644
--- a/TexSoup/reader.py
+++ b/TexSoup/reader.py
@@ -391,7 +391,7 @@ def read_arg_required(
        b. A curly-brace delimiter. If the required argument is brace-delimited,
           the contents of the brace group are used as the argument.
        c. Spacer or not, if a brace group is not found, simply use the next
-          character.
+          character, unless it is a backslash, in which case use the full command name
 
     :param Buffer src: a buffer of tokens
     :param TexArgs args: existing arguments to extend
@@ -422,7 +422,12 @@ def read_arg_required(
             n_required -= 1
             continue
         elif src.hasNext() and n_required > 0:
-            args.append('{%s}' % next(src))
+            next_token = next(src)
+            if next_token.category == TC.Escape:
+                name, _ = read_command(src, 0, 0, tolerance=tolerance, mode=mode)
+                args.append(TexCmd(name, position=next_token.position))
+            else:
+                args.append('{%s}' % next_token)
             n_required -= 1
             continue
 
diff --git a/TexSoup/tokens.py b/TexSoup/tokens.py
index 1f66cd5..492c50e 100644
--- a/TexSoup/tokens.py
+++ b/TexSoup/tokens.py
@@ -116,14 +116,15 @@ def tokenize_escaped_symbols(text, prev=None):
     '\\}'
     >>> tokenize_escaped_symbols(categorize(r'\%'))
     '\\%'
-    >>> tokenize_escaped_symbols(categorize(r'\ %'))  # not even one spacer is allowed
+    >>> tokenize_escaped_symbols(categorize(r'\ '))
+    '\\ '
     """
     if text.peek().category == CC.Escape \
             and text.peek(1) \
             and text.peek(1).category in (
                 CC.Escape, CC.GroupBegin, CC.GroupEnd, CC.MathSwitch,
                 CC.Alignment, CC.Macro, CC.Superscript, CC.Subscript,
-                CC.Active, CC.Comment, CC.Other):
+                CC.Spacer, CC.Active, CC.Comment, CC.Other):
         result = text.forward(2)
         result.category = TC.EscapedComment
         return result

diff --git a/tests/test_parser.py b/tests/test_parser.py
index 136710e..60ea596 100644
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -189,9 +189,9 @@ def test_escaped_characters():
     """
     soup = TexSoup(r"""
     \begin{itemize}
-    \item Ice cream costs \$4-\$5 around here. \}[\{]
+    \item Ice cream costs \$4-\$5 around here. \}\ [\{]
     \end{itemize}""")
-    assert str(soup.item).strip() == r'\item Ice cream costs \$4-\$5 around here. \}[\{]'
+    assert str(soup.item).strip() == r'\item Ice cream costs \$4-\$5 around here. \}\ [\{]'
     assert '\\$4-\\$5' in str(soup), 'Escaped characters not properly rendered.'
 
 
@@ -384,6 +384,14 @@ def test_def_item():
     assert soup.item is not None
 
 
+def test_def_without_braces():
+    """Tests that def without braces around the new command parses correctly"""
+    soup = TexSoup(r"\def\acommandname{replacement text}")
+    assert len(soup.find("def").args) == 2
+    assert str(soup.find("def").args[0]) == r"\acommandname"
+    assert str(soup.find("def").args[1]) == "{replacement text}"
+
+
 def test_grouping_optional_argument():
     """Tests that grouping occurs correctly"""
     soup = TexSoup(r"\begin{Theorem}[The argopt contains {$]\int_\infty$} the square bracket]\end{Theorem}")

Control spaces "\ " in math mode don't make the roundtrip
People often use `\ ` (called control space) to insert a little extra space in math mode—to avoid the default behaviour of ignoring math spaces.

In TexSoup these get eaten up somehow, so when serialize back out, the tex is different:

Failing test case:
```python
def test_contol_space_command():
    """A control space "\ " can be used to insert extra spacing in math mode."""
    math_with_spaces = r"""$a \ = \ \sin\theta$"""
    soup = TexSoup(math_with_spaces)
    assert str(soup) == math_with_spaces, 'Control spaces not preserved in math'
```

<img width="561" alt="Screen Shot 2020-10-18 at 1 10 39 AM" src="https://user-images.githubusercontent.com/163966/96359259-cb07c400-10de-11eb-9364-228d308bc34b.png">

expected: `$a \ = \ \sin\theta$`

observed: `$a \=\\sin\theta$`

Here are the tokens in case that's helpful:
```
  '$'_MathSwitch
  'a '_Text
  '\'_Escape
  ' = '_Text
  '\'_Escape
  ' '_MergedSpacer
  '\'_Escape
  'sin'_CommandName
  '\'_Escape
  'theta'_CommandName
  '$'_MathSwitch
```


See https://tex.stackexchange.com/a/74354 for a complete list of all special LaTeX spacing commands inside and outide of math mode.

No urgency to fix this --- perhaps it is even a feature, since prevents users from trying to override default LaTeX spacing behaviour :)

tests/test_parser.py::test_escaped_characters tests/test_parser.py::test_def_without_braces
TexSoup/__init__.py::TexSoup.TexSoup TexSoup/category.py::TexSoup.category.categorize TexSoup/data.py::TexSoup.data.TexArgs TexSoup/data.py::TexSoup.data.TexArgs.__contains__ TexSoup/data.py::TexSoup.data.TexArgs.__getitem__ TexSoup/data.py::TexSoup.data.TexArgs.__repr__ TexSoup/data.py::TexSoup.data.TexArgs.__str__ TexSoup/data.py::TexSoup.data.TexArgs.append TexSoup/data.py::TexSoup.data.TexArgs.clear TexSoup/data.py::TexSoup.data.TexArgs.extend TexSoup/data.py::TexSoup.data.TexArgs.insert TexSoup/data.py::TexSoup.data.TexArgs.pop TexSoup/data.py::TexSoup.data.TexArgs.remove TexSoup/data.py::TexSoup.data.TexArgs.reverse TexSoup/data.py::TexSoup.data.TexCmd TexSoup/data.py::TexSoup.data.TexEnv TexSoup/data.py::TexSoup.data.TexEnv.__init__ TexSoup/data.py::TexSoup.data.TexExpr.__eq__ TexSoup/data.py::TexSoup.data.TexExpr.all TexSoup/data.py::TexSoup.data.TexExpr.append TexSoup/data.py::TexSoup.data.TexExpr.contents TexSoup/data.py::TexSoup.data.TexExpr.insert TexSoup/data.py::TexSoup.data.TexExpr.remove TexSoup/data.py::TexSoup.data.TexExpr.string TexSoup/data.py::TexSoup.data.TexGroup.parse TexSoup/data.py::TexSoup.data.TexNamedEnv TexSoup/data.py::TexSoup.data.TexNode.__iter__ TexSoup/data.py::TexSoup.data.TexNode.__match__ TexSoup/data.py::TexSoup.data.TexNode.all TexSoup/data.py::TexSoup.data.TexNode.append TexSoup/data.py::TexSoup.data.TexNode.args TexSoup/data.py::TexSoup.data.TexNode.char_pos_to_line TexSoup/data.py::TexSoup.data.TexNode.children TexSoup/data.py::TexSoup.data.TexNode.contents TexSoup/data.py::TexSoup.data.TexNode.copy TexSoup/data.py::TexSoup.data.TexNode.count TexSoup/data.py::TexSoup.data.TexNode.delete TexSoup/data.py::TexSoup.data.TexNode.descendants TexSoup/data.py::TexSoup.data.TexNode.find TexSoup/data.py::TexSoup.data.TexNode.find_all TexSoup/data.py::TexSoup.data.TexNode.insert TexSoup/data.py::TexSoup.data.TexNode.name TexSoup/data.py::TexSoup.data.TexNode.remove TexSoup/data.py::TexSoup.data.TexNode.replace TexSoup/data.py::TexSoup.data.TexNode.replace_with TexSoup/data.py::TexSoup.data.TexNode.string TexSoup/data.py::TexSoup.data.TexNode.text TexSoup/data.py::TexSoup.data.TexText TexSoup/data.py::TexSoup.data.TexText.__contains__ TexSoup/data.py::TexSoup.data.TexText.__eq__ TexSoup/data.py::TexSoup.data.TexText.__repr__ TexSoup/data.py::TexSoup.data.TexText.__str__ TexSoup/reader.py::TexSoup.reader.make_read_peek TexSoup/reader.py::TexSoup.reader.read_arg TexSoup/reader.py::TexSoup.reader.read_arg_required TexSoup/reader.py::TexSoup.reader.read_args TexSoup/reader.py::TexSoup.reader.read_command TexSoup/reader.py::TexSoup.reader.read_env TexSoup/reader.py::TexSoup.reader.read_item TexSoup/reader.py::TexSoup.reader.read_math_env TexSoup/reader.py::TexSoup.reader.read_skip_env TexSoup/reader.py::TexSoup.reader.read_spacer TexSoup/tokens.py::TexSoup.tokens.next_token TexSoup/tokens.py::TexSoup.tokens.tokenize TexSoup/tokens.py::TexSoup.tokens.tokenize_command_name TexSoup/tokens.py::TexSoup.tokens.tokenize_escaped_symbols TexSoup/tokens.py::TexSoup.tokens.tokenize_ignore TexSoup/tokens.py::TexSoup.tokens.tokenize_line_break TexSoup/tokens.py::TexSoup.tokens.tokenize_line_comment TexSoup/tokens.py::TexSoup.tokens.tokenize_math_asym_switch TexSoup/tokens.py::TexSoup.tokens.tokenize_math_sym_switch TexSoup/tokens.py::TexSoup.tokens.tokenize_spacers TexSoup/tokens.py::TexSoup.tokens.tokenize_string TexSoup/tokens.py::TexSoup.tokens.tokenize_symbols TexSoup/utils.py::TexSoup.utils.Buffer TexSoup/utils.py::TexSoup.utils.Buffer.__getitem__ TexSoup/utils.py::TexSoup.utils.Buffer.backward TexSoup/utils.py::TexSoup.utils.Buffer.forward TexSoup/utils.py::TexSoup.utils.Buffer.forward_until TexSoup/utils.py::TexSoup.utils.CharToLineOffset TexSoup/utils.py::TexSoup.utils.MixedBuffer.__init__ TexSoup/utils.py::TexSoup.utils.Token.__add__ TexSoup/utils.py::TexSoup.utils.Token.__contains__ TexSoup/utils.py::TexSoup.utils.Token.__eq__ TexSoup/utils.py::TexSoup.utils.Token.__getitem__ TexSoup/utils.py::TexSoup.utils.Token.__hash__ TexSoup/utils.py::TexSoup.utils.Token.__iadd__ TexSoup/utils.py::TexSoup.utils.Token.__iter__ TexSoup/utils.py::TexSoup.utils.Token.__radd__ TexSoup/utils.py::TexSoup.utils.Token.lstrip TexSoup/utils.py::TexSoup.utils.Token.rstrip TexSoup/utils.py::TexSoup.utils.to_list tests/test_parser.py::test_commands_only tests/test_parser.py::test_commands_envs_only tests/test_parser.py::test_commands_envs_text tests/test_parser.py::test_text_preserved tests/test_parser.py::test_command_name_parse tests/test_parser.py::test_command_env_name_parse tests/test_parser.py::test_commands_without_arguments tests/test_parser.py::test_unlabeled_environment tests/test_parser.py::test_ignore_environment tests/test_parser.py::test_inline_math tests/test_parser.py::test_math_environment_weirdness tests/test_parser.py::test_tokenize_punctuation_command_names tests/test_parser.py::test_item_parsing tests/test_parser.py::test_item_argument_parsing tests/test_parser.py::test_comment_escaping tests/test_parser.py::test_comment_unparsed tests/test_parser.py::test_comment_after_escape tests/test_parser.py::test_items_with_labels tests/test_parser.py::test_multiline_args tests/test_parser.py::test_nested_commands tests/test_parser.py::test_def_item tests/test_parser.py::test_grouping_optional_argument tests/test_parser.py::test_basic_whitespace tests/test_parser.py::test_whitespace_in_command tests/test_parser.py::test_math_environment_whitespace tests/test_parser.py::test_non_letter_commands tests/test_parser.py::test_math_environment_escape tests/test_parser.py::test_punctuation_command_structure tests/test_parser.py::test_non_punctuation_command_structure tests/test_parser.py::test_allow_unclosed_non_curly_braces tests/test_parser.py::test_buffer tests/test_parser.py::test_to_buffer tests/test_parser.py::test_unclosed_commands tests/test_parser.py::test_unclosed_environments tests/test_parser.py::test_unclosed_math_environments tests/test_parser.py::test_arg_parse tests/test_parser.py::test_tolerance_env_unclosed