# 4 Understanding Macros and Packages

Macros and packages in plasTeX live a dual life. On one hand, macros can be defined in LaTeX files and expanded by plasTeX itself. On the other hand, macros can also be implemented as Python classes. Packages are the same way. plasTeX can handle some LaTeX packages natively. Others may have to be implemented in Python. In most cases, both implementations work transparently together. If you don’t define that many macros, and the ones that you do define are simple or even of intermediate complexity, it’s probably better to just let plasTeX handle them natively. However, there are some reasons that you may want to implement Python versions of your macros:

- Python versions of macros are generally faster

- You have more control over what gets inserted into the output document

- You can store information in the document’s `userdata` dictionary for use later

- You can prevent a macro from being expanded into primitive LaTeX commands, so that a custom renderer can be used on that node

- Some macros just don’t make sense in a plasTeX document

- Some macros are just too complicated for plasTeX

If any of these reasons appeal to you, read the following sections on how to implement macros and packages in plasTeX.

- 4.1 Defining Macros in LaTeX
- 4.2 Defining Macros in Python
  - 4.2.1 Python Classes
  - 4.2.2 INI Files
  - 4.2.3 The Document Context
- 4.3 Packages