;; General syntax
(command_name) @function
(caption
  command: _ @function)

(key_value_pair
  key: (_) @variable.parameter
  value: (_))

[
  (comment)
  (line_comment)
  (block_comment)
  (comment_environment)
] @comment

[
  (brack_group)
  (brack_group_argc)
] @variable.parameter

[(operator) "="] @operator

"\\item" @punctuation.special

((word) @punctuation.delimiter
  (#eq? @punctuation.delimiter "&"))

["[" "]" "{" "}"] @punctuation.bracket ; "(" ")" has no syntactical meaning in LaTeX
(math_delimiter
  left_command: _ @punctuation.delimiter
  left_delimiter: _ @punctuation.delimiter
  right_command: _ @punctuation.delimiter
  right_delimiter: _ @punctuation.delimiter
)

;; General environments
(begin
  command: _ @function.builtin
  name: (curly_group_text (text) @function.macro))

(end
  command: _ @function.builtin
  name: (curly_group_text (text) @function.macro))

;; Definitions and references
(new_command_definition
  command: _ @function.macro
  declaration: (curly_group_command_name (_) @function))
(old_command_definition
  command: _ @function.macro
  declaration: (_) @function)
(let_command_definition
  command: _ @function.macro
  declaration: (_) @function)

(environment_definition
  command: _ @function.macro
  name: (curly_group_text (_) @constant))

(theorem_definition
  command: _ @function.macro
  name: (curly_group_text (_) @constant))

(paired_delimiter_definition
  command: _ @function.macro
  declaration: (curly_group_command_name (_) @function))

(label_definition
  command: _ @function.macro
  name: (curly_group_text (_) @label))
(label_reference_range
  command: _ @function.macro
  from: (curly_group_text (_) @label)
  to: (curly_group_text (_) @label))
(label_reference
  command: _ @function.macro
  names: (curly_group_text_list (_) @label))
(label_number
  command: _ @function.macro
  name: (curly_group_text (_) @label)
  number: (_) @markup.link.label)

(citation
  command: _ @function.macro
  keys: (curly_group_text_list) @string)

(glossary_entry_definition
  command: _ @function.macro
  name: (curly_group_text (_) @string))
(glossary_entry_reference
  command: _ @function.macro
  name: (curly_group_text (_) @string))

(acronym_definition
  command: _ @function.macro
  name: (curly_group_text (_) @string))
(acronym_reference
  command: _ @function.macro
  name: (curly_group_text (_) @string))

(color_definition
  command: _ @function.macro
  name: (curly_group_text (_) @string))
(color_reference
  command: _ @function.macro
  name: (curly_group_text (_) @string))

;; Math

(displayed_equation) @markup.raw.block
(inline_formula) @markup.raw.inline

(math_environment
  (begin
    command: _ @function.builtin
    name: (curly_group_text (text) @markup.raw)))

(math_environment
  (text) @markup.raw)

(math_environment
  (end
    command: _ @function.builtin
    name: (curly_group_text (text) @markup.raw)))

;; Sectioning
(title_declaration
  command: _ @namespace
  options: (brack_group (_) @markup.heading)?
  text: (curly_group (_) @markup.heading))

(author_declaration
  command: _ @namespace
  authors: (curly_group_author_list
             ((author)+ @markup.heading)))

(chapter
  command: _ @namespace
  toc: (brack_group (_) @markup.heading)?
  text: (curly_group (_) @markup.heading))

(part
  command: _ @namespace
  toc: (brack_group (_) @markup.heading)?
  text: (curly_group (_) @markup.heading))

(section
  command: _ @namespace
  toc: (brack_group (_) @markup.heading)?
  text: (curly_group (_) @markup.heading))

(subsection
  command: _ @namespace
  toc: (brack_group (_) @markup.heading)?
  text: (curly_group (_) @markup.heading))

(subsubsection
  command: _ @namespace
  toc: (brack_group (_) @markup.heading)?
  text: (curly_group (_) @markup.heading))

(paragraph
  command: _ @namespace
  toc: (brack_group (_) @markup.heading)?
  text: (curly_group (_) @markup.heading))

(subparagraph
  command: _ @namespace
  toc: (brack_group (_) @markup.heading)?
  text: (curly_group (_) @markup.heading))

;; Beamer frames
(generic_environment
  (begin
    name: (curly_group_text
            (text) @markup.heading)
    (#any-of? @markup.heading "frame"))
  .
  (curly_group (_) @markup.heading))

((generic_command
  command: (command_name) @_name
  arg: (curly_group
          (text) @markup.heading))
  (#eq? @_name "\\frametitle"))

;; Formatting
((generic_command
  command: (command_name) @_name
  arg: (curly_group (_) @markup.italic))
  (#eq? @_name "\\emph"))

((generic_command
  command: (command_name) @_name
  arg: (curly_group (_) @markup.italic))
  (#match? @_name "^(\\\\textit|\\\\mathit)$"))

((generic_command
  command: (command_name) @_name
  arg: (curly_group (_) @markup.bold))
  (#match? @_name "^(\\\\textbf|\\\\mathbf)$"))

((generic_command
  command: (command_name) @_name
  .
  arg: (curly_group (_) @markup.link.uri))
  (#match? @_name "^(\\\\url|\\\\href)$"))

;; File inclusion commands
(class_include
  command: _ @keyword.storage.type
  path: (curly_group_path) @string)

(package_include
  command: _ @keyword.storage.type
  paths: (curly_group_path_list) @string)

(latex_include
  command: _ @keyword.control.import
  path: (curly_group_path) @string)
(import_include
  command: _ @keyword.control.import
  directory: (curly_group_path) @string
  file: (curly_group_path) @string)

(bibtex_include
  command: _ @keyword.control.import
  path: (curly_group_path) @string)
(biblatex_include
  "\\addbibresource" @include
  glob: (curly_group_glob_pattern) @string.regex)

(graphics_include
  command: _ @keyword.control.import
  path: (curly_group_path) @string)
(tikz_library_import
  command: _ @keyword.control.import
  paths: (curly_group_path_list) @string)
