diff --git a/docs/features/OxHugo compatibility.md b/docs/features/OxHugo compatibility.md
index b25167f8d..3143eb1b5 100644
--- a/docs/features/OxHugo compatibility.md
+++ b/docs/features/OxHugo compatibility.md
@@ -32,6 +32,7 @@ Quartz by default doesn't understand `org-roam` files as they aren't Markdown. Y
- `replaceFigureWithMdImg`: Whether to replace `` with `![]()`
- Formatting
- `removeHugoShortcode`: Whether to remove hugo shortcode syntax (`{{}}`)
+ - `replaceOrgLatex`: Whether to replace org-mode formatting for latex fragments with what `Plugin.Latex` supports.
> [!warning]
>
diff --git a/quartz/plugins/transformers/oxhugofm.ts b/quartz/plugins/transformers/oxhugofm.ts
index 0d7b9199a..6e70bb190 100644
--- a/quartz/plugins/transformers/oxhugofm.ts
+++ b/quartz/plugins/transformers/oxhugofm.ts
@@ -9,6 +9,9 @@ export interface Options {
removeHugoShortcode: boolean
/** Replace with ![]() */
replaceFigureWithMdImg: boolean
+
+ /** Replace org latex fragments with $ and $$ */
+ replaceOrgLatex: boolean
}
const defaultOptions: Options = {
@@ -16,12 +19,27 @@ const defaultOptions: Options = {
removePredefinedAnchor: true,
removeHugoShortcode: true,
replaceFigureWithMdImg: true,
+ replaceOrgLatex: true,
}
const relrefRegex = new RegExp(/\[([^\]]+)\]\(\{\{< relref "([^"]+)" >\}\}\)/, "g")
const predefinedHeadingIdRegex = new RegExp(/(.*) {#(?:.*)}/, "g")
const hugoShortcodeRegex = new RegExp(/{{(.*)}}/, "g")
const figureTagRegex = new RegExp(/< ?figure src="(.*)" ?>/, "g")
+// \\\\\( -> matches \\(
+// (.+?) -> Lazy match for capturing the equation
+// \\\\\) -> matches \\)
+const inlineLatexRegex = new RegExp(/\\\\\((.+?)\\\\\)/, "g")
+// (?:\\begin{equation}|\\\\\(|\\\\\[) -> start of equation
+// ([\s\S]*?) -> Matches the block equation
+// (?:\\\\\]|\\\\\)|\\end{equation}) -> end of equation
+const blockLatexRegex = new RegExp(
+ /(?:\\begin{equation}|\\\\\(|\\\\\[)([\s\S]*?)(?:\\\\\]|\\\\\)|\\end{equation})/,
+ "g",
+)
+// \$\$[\s\S]*?\$\$ -> Matches block equations
+// \$.*?\$ -> Matches inline equations
+const quartzLatexRegex = new RegExp(/\$\$[\s\S]*?\$\$|\$.*?\$/, "g")
/**
* ox-hugo is an org exporter backend that exports org files to hugo-compatible
@@ -67,6 +85,23 @@ export const OxHugoFlavouredMarkdown: QuartzTransformerPlugin |
return `![](${src})`
})
}
+
+ if (opts.replaceOrgLatex) {
+ src = src.toString()
+ src = src.replaceAll(inlineLatexRegex, (value, ...capture) => {
+ const [eqn] = capture
+ return `$${eqn}$`
+ })
+ src = src.replaceAll(blockLatexRegex, (value, ...capture) => {
+ const [eqn] = capture
+ return `$$${eqn}$$`
+ })
+
+ // ox-hugo escapes _ as \_
+ src = src.replaceAll(quartzLatexRegex, (value) => {
+ return value.replaceAll("\\_", "_")
+ })
+ }
return src
},
}