diff --git a/src/macro/Environment.cc b/src/macro/Environment.cc
index 4a0d1c0c6683c2e9b7bb994842b2280944de384b..34686c9cfc7e573875eda973d80a560e2dfaf557 100644
--- a/src/macro/Environment.cc
+++ b/src/macro/Environment.cc
@@ -17,7 +17,9 @@
  * along with Dynare.  If not, see <https://www.gnu.org/licenses/>.
  */
 
+#include <algorithm>
 #include <cassert>
+#include <ranges>
 
 #include "Environment.hh"
 #include "Expressions.hh"
@@ -107,9 +109,21 @@ Environment::print(ostream& output, const vector<string>& vars, const optional<i
   if (!save && !variables.empty())
     output << "Macro Variables:" << endl;
 
+  // For sorting the symbols in a case-insensitive way, see #128
+  auto case_insensitive_string_less = [](const string& a, const string& b) {
+    return lexicographical_compare(
+        begin(a), end(a), begin(b), end(b),
+        [](const char& c1, const char& c2) { return tolower(c1) < tolower(c2); });
+  };
+
   if (vars.empty())
-    for (const auto& it : variables)
-      printVariable(output, it.first, line, save);
+    {
+      vector<string> variables_sorted;
+      ranges::copy(views::keys(variables), back_inserter(variables_sorted));
+      ranges::sort(variables_sorted, case_insensitive_string_less);
+      for (const auto& it : variables_sorted)
+        printVariable(output, it, line, save);
+    }
   else
     for (const auto& it : vars)
       if (isVariableDefined(it))
@@ -119,8 +133,13 @@ Environment::print(ostream& output, const vector<string>& vars, const optional<i
     output << "Macro Functions:" << endl;
 
   if (vars.empty())
-    for (const auto& it : functions)
-      printFunction(output, it.first, line, save);
+    {
+      vector<string> functions_sorted;
+      ranges::copy(views::keys(functions), back_inserter(functions_sorted));
+      ranges::sort(functions_sorted, case_insensitive_string_less);
+      for (const auto& it : functions_sorted)
+        printFunction(output, it, line, save);
+    }
   else
     for (const auto& it : vars)
       if (isFunctionDefined(it))