From 1faae7bf4ceef3c2aa4ea25fc8eeb133fd25ea32 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Tue, 11 Mar 2014 15:31:08 +0100
Subject: [PATCH] Fix output of external functions (and their derivatives) in
 LaTeX.

---
 preprocessor/ExprNode.cc | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/preprocessor/ExprNode.cc b/preprocessor/ExprNode.cc
index 84a0e0d1ec..7a03ee96ec 100644
--- a/preprocessor/ExprNode.cc
+++ b/preprocessor/ExprNode.cc
@@ -4385,9 +4385,12 @@ ExternalFunctionNode::writeOutput(ostream &output, ExprNodeOutputType output_typ
                                   const temporary_terms_t &temporary_terms,
                                   deriv_node_temp_terms_t &tef_terms) const
 {
-  if (output_type == oMatlabOutsideModel || output_type == oSteadyStateFile || output_type == oCSteadyStateFile)
+  if (output_type == oMatlabOutsideModel || output_type == oSteadyStateFile
+      || output_type == oCSteadyStateFile || IS_LATEX(output_type))
     {
-      output << datatree.symbol_table.getName(symb_id) << "(";
+      string name = IS_LATEX(output_type) ? datatree.symbol_table.getTeXName(symb_id)
+        : datatree.symbol_table.getName(symb_id);
+      output << name << "(";
       writeExternalFunctionArguments(output, output_type, temporary_terms, tef_terms);
       output << ")";
       return;
@@ -4924,6 +4927,15 @@ FirstDerivExternalFunctionNode::writeOutput(ostream &output, ExprNodeOutputType
 {
   assert(output_type != oMatlabOutsideModel);
 
+  if (IS_LATEX(output_type))
+    {
+      output << "\\frac{\\partial " << datatree.symbol_table.getTeXName(symb_id)
+             << "}{\\partial " << inputIndex << "}(";
+      writeExternalFunctionArguments(output, output_type, temporary_terms, tef_terms);
+      output << ")";
+      return;
+    }
+
   // If current node is a temporary term
   temporary_terms_t::const_iterator it = temporary_terms.find(const_cast<FirstDerivExternalFunctionNode *>(this));
   if (it != temporary_terms.end())
@@ -5179,6 +5191,15 @@ SecondDerivExternalFunctionNode::writeOutput(ostream &output, ExprNodeOutputType
 {
   assert(output_type != oMatlabOutsideModel);
 
+  if (IS_LATEX(output_type))
+    {
+      output << "\\frac{\\partial^2 " << datatree.symbol_table.getTeXName(symb_id)
+             << "}{\\partial " << inputIndex1 << "\\partial " << inputIndex2 << "}(";
+      writeExternalFunctionArguments(output, output_type, temporary_terms, tef_terms);
+      output << ")";
+      return;
+    }
+
   // If current node is a temporary term
   temporary_terms_t::const_iterator it = temporary_terms.find(const_cast<SecondDerivExternalFunctionNode *>(this));
   if (it != temporary_terms.end())
-- 
GitLab