(function(Prism) {
  var funcPattern = /\\(?:[^a-z()[\]]|[a-z*]+)/i,
    insideEqu = {
      'equation-command': {
        pattern: funcPattern,
        alias: 'regex',
      },
    };

  Prism.languages.latex = {
    comment: /%.*/m,
    // the verbatim environment prints whitespace to the document
    cdata: {
      pattern: /(\\begin\{((?:verbatim|lstlisting)\*?)\})[\s\S]*?(?=\\end\{\2\})/,
      lookbehind: true,
    },
    /*
		 * equations can be between $ $ or \( \) or \[ \]
		 * (all are multiline)
		 */
    equation: [
      {
        pattern: /\$(?:\\[\s\S]|[^\\$])*\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,
        inside: insideEqu,
        alias: 'string',
      },
      {
        pattern: /(\\begin\{((?:equation|math|eqnarray|align|multline|gather)\*?)\})[\s\S]*?(?=\\end\{\2\})/,
        lookbehind: true,
        inside: insideEqu,
        alias: 'string',
      },
    ],
    /*
		 * arguments which are keywords or references are highlighted
		 * as keywords
		 */
    keyword: {
      pattern: /(\\(?:begin|end|ref|cite|label|usepackage|documentclass)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,
      lookbehind: true,
    },
    url: {
      pattern: /(\\url\{)[^}]+(?=\})/,
      lookbehind: true,
    },
    /*
		 * section or chapter headlines are highlighted as bold so that
		 * they stand out more
		 */
    headline: {
      pattern: /(\\(?:part|chapter|section|subsection|frametitle|subsubsection|paragraph|subparagraph|subsubparagraph|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\}(?:\[[^\]]+\])?)/,
      lookbehind: true,
      alias: 'class-name',
    },
    function: {
      pattern: funcPattern,
      alias: 'selector',
    },
    punctuation: /[[\]{}&]/,
  };
})(Prism);
