diff --git a/default_environment/templates/html/latex_fragment.dust b/default_environment/templates/html/latex_fragment.dust
index 3dfeb76..f43d4df 100644
--- a/default_environment/templates/html/latex_fragment.dust
+++ b/default_environment/templates/html/latex_fragment.dust
@@ -1 +1,2 @@
-!!!!!!!! latex_fragment
+{! TODO: Should I be including MathJax somewhere? !}
+{.value}
diff --git a/org_test_documents/footnotes/reference_in_definition.org b/org_test_documents/footnote/reference_in_definition.org
similarity index 100%
rename from org_test_documents/footnotes/reference_in_definition.org
rename to org_test_documents/footnote/reference_in_definition.org
diff --git a/org_test_documents/footnotes/simple.org b/org_test_documents/footnote/simple.org
similarity index 100%
rename from org_test_documents/footnotes/simple.org
rename to org_test_documents/footnote/simple.org
diff --git a/org_test_documents/latex_fragment/notes.org b/org_test_documents/latex_fragment/notes.org
new file mode 100644
index 0000000..14934df
--- /dev/null
+++ b/org_test_documents/latex_fragment/notes.org
@@ -0,0 +1,36 @@
+* Double dollar
+#+begin_src org
+ $$CONTENTS$$
+#+end_src
+becomes
+#+begin_src text
+ \[CONTENTS\]
+#+end_src
+
+#+begin_src org
+ $$1+1=2$$
+#+end_src
+
+#+begin_src text
+ \[1+1=2\]
+#+end_src
+
+This gets interpreted by mathjax.
+* Single Dollar
+#+begin_src org
+ PRE$BORDER1 BODY BORDER2$POST
+#+end_src
+becomes
+#+begin_src text
+ \(BORDER1 BODY BORDER2\)
+#+end_src
+
+#+begin_src org
+ foo$a bar b$.
+#+end_src
+becomes
+#+begin_src text
+ foo\(a bar b\).
+#+end_src
+
+This gets interpreted by mathjax.
diff --git a/src/context/comment.rs b/src/context/comment.rs
index db44d42..37c81ef 100644
--- a/src/context/comment.rs
+++ b/src/context/comment.rs
@@ -6,18 +6,11 @@ use crate::config::Config;
use crate::error::CustomError;
use crate::intermediate::IComment;
+use super::macros::rnoop;
+
#[derive(Debug, Serialize)]
#[serde(tag = "type")]
#[serde(rename = "comment")]
pub(crate) struct RenderComment {}
-impl RenderComment {
- pub(crate) fn new(
- _config: &Config,
- _output_directory: &Path,
- _output_file: &Path,
- _comment: &IComment,
- ) -> Result {
- Ok(RenderComment {})
- }
-}
+rnoop!(RenderComment, IComment);
diff --git a/src/context/latex_fragment.rs b/src/context/latex_fragment.rs
index ceded7f..6226ad5 100644
--- a/src/context/latex_fragment.rs
+++ b/src/context/latex_fragment.rs
@@ -6,18 +6,25 @@ use crate::config::Config;
use crate::error::CustomError;
use crate::intermediate::ILatexFragment;
+use super::macros::render;
+
#[derive(Debug, Serialize)]
#[serde(tag = "type")]
#[serde(rename = "latex_fragment")]
-pub(crate) struct RenderLatexFragment {}
-
-impl RenderLatexFragment {
- pub(crate) fn new(
- _config: &Config,
- _output_directory: &Path,
- _output_file: &Path,
- _comment: &ILatexFragment,
- ) -> Result {
- Ok(RenderLatexFragment {})
- }
+pub(crate) struct RenderLatexFragment {
+ value: String,
}
+
+render!(
+ RenderLatexFragment,
+ ILatexFragment,
+ original,
+ _config,
+ _output_directory,
+ _output_file,
+ {
+ Ok(RenderLatexFragment {
+ value: original.value.clone(),
+ })
+ }
+);
diff --git a/src/context/macros.rs b/src/context/macros.rs
new file mode 100644
index 0000000..aa6bf2f
--- /dev/null
+++ b/src/context/macros.rs
@@ -0,0 +1,43 @@
+/// Write the implementation for the render ast node.
+///
+/// This exists to make changing the type signature easier.
+macro_rules! render {
+ ($rstruct:ident, $istruct:ident, $original:ident, $config:ident, $output_directory:ident, $output_file:ident, $fnbody:tt) => {
+ impl $rstruct {
+ pub(crate) fn new(
+ config: &Config,
+ output_directory: &Path,
+ output_file: &Path,
+ original: &$istruct,
+ ) -> Result<$rstruct, CustomError> {
+ let $original = original;
+ let $config = config;
+ let $output_directory = output_directory;
+ let $output_file = output_file;
+ $fnbody
+ }
+ }
+ };
+}
+
+pub(crate) use render;
+
+/// Write the implementation for a render ast node that has no fields.
+///
+/// This exists to make changing the type signature easier.
+macro_rules! rnoop {
+ ($rstruct:ident, $istruct:ident) => {
+ impl $rstruct {
+ pub(crate) fn new(
+ _config: &Config,
+ _output_directory: &Path,
+ _output_file: &Path,
+ _original: &$istruct,
+ ) -> Result<$rstruct, CustomError> {
+ Ok($rstruct {})
+ }
+ }
+ };
+}
+
+pub(crate) use rnoop;
diff --git a/src/context/mod.rs b/src/context/mod.rs
index 129ebca..f6203d8 100644
--- a/src/context/mod.rs
+++ b/src/context/mod.rs
@@ -32,6 +32,7 @@ mod keyword;
mod latex_environment;
mod latex_fragment;
mod line_break;
+mod macros;
mod object;
mod org_macro;
mod paragraph;
diff --git a/src/intermediate/latex_fragment.rs b/src/intermediate/latex_fragment.rs
index d76a3a0..14721fd 100644
--- a/src/intermediate/latex_fragment.rs
+++ b/src/intermediate/latex_fragment.rs
@@ -1,5 +1,19 @@
-use super::macros::inoop;
+use super::macros::intermediate;
use crate::error::CustomError;
-inoop!(ILatexFragment, LatexFragment);
+#[derive(Debug, Clone)]
+pub(crate) struct ILatexFragment {
+ pub(crate) value: String,
+}
+
+intermediate!(ILatexFragment, LatexFragment, original, _registry, {
+ let value: String = if original.value.starts_with("$$") && original.value.ends_with("$$") {
+ format!("\\[{}\\]", &original.value[2..(original.value.len() - 2)])
+ } else if original.value.starts_with("$") && original.value.ends_with("$") {
+ format!("\\({}\\)", &original.value[1..(original.value.len() - 1)])
+ } else {
+ original.value.to_owned()
+ };
+ Ok(ILatexFragment { value })
+});