[Tex/LaTex] How to resolve the conflict between TikZ and syntax packages

incompatibilitypackages

If I add syntax package, the compiler will generate errors:

Minimal Example

\documentclass[10pt,letterpaper]{article}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}

\usepackage{tikz}
\usetikzlibrary{arrows,shapes,automata,backgrounds,petri,positioning}

\usepackage{syntax}

\begin{document}

    \begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,auto]
        \node[state,initial]    (q_1)                           {$q_1$}; 
        \node[state,accepting]  (q_2)   [right=of q_1]          {$q_2$}; 
        \node[state]            (q_3)   [below right=of q_1]    {$q_3$}; 

        \path[->]
        (q_1) edge  [bend left]     node {a}            (q_2)
        (q_1) edge  [loop above]    node {b}            (q_1)
        (q_2) edge  [bend left]     node {a,b}          (q_3)
        (q_3) edge  [bend left]     node {a}            (q_2)
        (q_3) edge  [bend left]     node {b}            (q_1);

        \node [below=1cm, align=flush center,text width=8cm] at (q_3)
        {
            $M_1$
        };
    \end{tikzpicture}
\end{document}

But if I delete \usepackage{syntax}, it compiles successfully. I wonder is there a way to get around this issue? Thank you.

Best Answer

This issue arises because the syntax package makes the underscore (_) active in order to improve the typesetting of code with underscores. This messes with your node name q_1, and leads to the error.

Two ways around this:

  1. Avoid using underscores in node names (and file names).
  2. Load the syntax package with the option nounderscore. You can still get the nice underscore typesetting by using \_ in your code samples.
Related Question