# LaTeX
URL: /docs/guides/latex
Render mathematical expressions in chat messages using KaTeX.
Render LaTeX mathematical expressions in chat messages using KaTeX.
LaTeX rendering is not enabled in markdown by default.
Install dependencies \[#install-dependencies]
```bash
npm i katex rehype-katex remark-math
```
Add KaTeX CSS to your layout \[#add-katex-css-to-your-layout]
```tsx title="/app/layout.tsx"
import "katex/dist/katex.min.css"; // [!code ++]
```
Update markdown-text.tsx \[#update-markdown-texttsx]
```tsx title="/components/assistant-ui/markdown-text.tsx"
import remarkMath from "remark-math"; // [!code ++]
import rehypeKatex from "rehype-katex"; // [!code ++]
const MarkdownTextImpl = () => {
return (
);
};
export const MarkdownText = memo(MarkdownTextImpl);
```
Supported Formats \[#supported-formats]
By default, remark-math supports:
* `$...$` for inline math
* `$$...$$` for display math
* Fenced code blocks with the `math` language identifier
Supporting Alternative LaTeX Delimiters \[#supporting-alternative-latex-delimiters]
Many language models generate LaTeX using different delimiter formats:
* `\(...\)` for inline math
* `\[...\]` for display math
* Custom formats like `[/math]...[/math]`
You can use the `preprocess` prop to normalize these formats:
```tsx title="/components/assistant-ui/markdown-text.tsx"
const MarkdownTextImpl = () => {
return (
);
};
// Your LaTeX preprocessing function
function normalizeCustomMathTags(input: string): string {
return (
input
// Convert [/math]...[/math] to $$...$$
.replace(/\[\/math\]([\s\S]*?)\[\/math\]/g, (_, content) => `$$${content.trim()}$$`)
// Convert [/inline]...[/inline] to $...$
.replace(/\[\/inline\]([\s\S]*?)\[\/inline\]/g, (_, content) => `$${content.trim()}$`)
// Convert \( ... \) to $...$ (inline math) - handles both single and double backslashes
.replace(/\\{1,2}\(([\s\S]*?)\\{1,2}\)/g, (_, content) => `$${content.trim()}$`)
// Convert \[ ... \] to $$...$$ (block math) - handles both single and double backslashes
.replace(/\\{1,2}\[([\s\S]*?)\\{1,2}\]/g, (_, content) => `$$${content.trim()}$$`)
);
}
```
The preprocessing function runs before markdown parsing, allowing you to transform any delimiter format into the standard `$` and `$$` format.