changeset 28982:08a01acc2fcf

Use UTF-8 encoding rather than Symbol font for gnuplot terminals (patch #8696). * __gnuplot_drawnow__.m (gnuplot_set_term): Add "set encoding utf8;" prior to setting the terminal. * __go_draw_axes__.m (__go_draw_axes__): Pass 'gnuplot_term' into all functions __maybe_munge_text__(). Remove all use of undo_string_escapes() around text strings. (do_tics_1): Pass 'gnuplot_term' into __tex2enhanced__(). (get_fontname_and_size): Pass 'gnuplot_term' into __maybe_munge_text__(). (__maybe_munge_text__): Accept 'gnuplot_term' as an input variable. Pass 'gnuplot_term' into all occurrences of __tex2enhanced__(). (__tex2enhanced__): Accept 'gnuplot_term' as an input variable. Determine from gnuplot_term whether /Symbol string or UTF-8 encodings should be used. When inserting symbol strings, make the cell choice according to type. Use added sym.emptyset structure element for empty set escape sequence replacement. (__setup_sym_table__): Add the sys.emptyset definition. Add all the equivalent UTF-8 codes (viewed as glyphs in editors) alongside the /Symbol definitions in a cell array.
author Daniel J Sebald <daniel.sebald@ieee.org>
date Fri, 03 Jul 2015 17:56:48 -0500
parents d632d99d5c2e
children a6b7085c8ac2
files scripts/plot/util/__gnuplot_drawnow__.m scripts/plot/util/private/__gnuplot_draw_axes__.m
diffstat 2 files changed, 160 insertions(+), 156 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/plot/util/__gnuplot_drawnow__.m	Thu Oct 22 11:20:26 2020 -0400
+++ b/scripts/plot/util/__gnuplot_drawnow__.m	Fri Jul 03 17:56:48 2015 -0500
@@ -269,7 +269,7 @@
     endif
 
     ## Set the gnuplot terminal (type, enhanced, title, options & size).
-    term_str = ["set terminal " term];
+    term_str = ["set encoding utf8;\nset terminal " term];
     if (__gnuplot_has_feature__ ("needs_color_with_postscript") ...
         && strcmp (term, "postscript"))
       term_str = [term_str, " color"];
--- a/scripts/plot/util/private/__gnuplot_draw_axes__.m	Thu Oct 22 11:20:26 2020 -0400
+++ b/scripts/plot/util/private/__gnuplot_draw_axes__.m	Fri Jul 03 17:56:48 2015 -0500
@@ -154,11 +154,11 @@
     if (nd == 2)
       t = get (axis_obj.title);
       colorspec = get_text_colorspec (t.color);
-      [tt, f, s] = __maybe_munge_text__ (enhanced, t, "string", t.interpreter);
+      [tt, f, s] = __maybe_munge_text__ (enhanced, t, "string", ...
+                                         t.interpreter, gnuplot_term);
       fontspec = create_fontspec (f, s, gnuplot_term);
       fprintf (plot_stream, ['set title "%s" %s %s %s;' "\n"],
-               undo_string_escapes (tt), fontspec, colorspec,
-               __do_enhanced_option__ (enhanced, t));
+               tt, fontspec, colorspec, __do_enhanced_option__ (enhanced, t));
     else
       ## Change meaning of "normalized", but it at least gives user some control
       if (! strcmp (get (axis_obj.title, "units"), "normalized"))
@@ -186,16 +186,15 @@
       fprintf (plot_stream, "unset xlabel;\n");
       fprintf (plot_stream, "unset x2label;\n");
     else
-      [tt, f, s] = __maybe_munge_text__ (enhanced, t, "string", t.interpreter);
+      [tt, f, s] = __maybe_munge_text__ (enhanced, t, "string", ...
+                                         t.interpreter, gnuplot_term);
       fontspec = create_fontspec (f, s, gnuplot_term);
       if (strcmp (axis_obj.xaxislocation, "top"))
         fprintf (plot_stream, 'set x2label "%s" %s %s %s',
-                 undo_string_escapes (tt), colorspec, fontspec,
-                 __do_enhanced_option__ (enhanced, t));
+                 tt, colorspec, fontspec, __do_enhanced_option__ (enhanced, t));
       else
         fprintf (plot_stream, 'set xlabel "%s" %s %s %s',
-                 undo_string_escapes (tt), colorspec, fontspec,
-                 __do_enhanced_option__ (enhanced, t));
+                 tt, colorspec, fontspec, __do_enhanced_option__ (enhanced, t));
       endif
       fprintf (plot_stream, " rotate by %f;\n", angle);
       if (strcmp (axis_obj.xaxislocation, "top"))
@@ -214,16 +213,15 @@
       fprintf (plot_stream, "unset ylabel;\n");
       fprintf (plot_stream, "unset y2label;\n");
     else
-      [tt, f, s] = __maybe_munge_text__ (enhanced, t, "string", t.interpreter);
+      [tt, f, s] = __maybe_munge_text__ (enhanced, t, "string", ...
+                                         t.interpreter, gnuplot_term);
       fontspec = create_fontspec (f, s, gnuplot_term);
       if (strcmp (axis_obj.yaxislocation, "right"))
         fprintf (plot_stream, 'set y2label "%s" %s %s %s',
-                 undo_string_escapes (tt), colorspec, fontspec,
-                 __do_enhanced_option__ (enhanced, t));
+                 tt, colorspec, fontspec, __do_enhanced_option__ (enhanced, t));
       else
         fprintf (plot_stream, 'set ylabel "%s" %s %s %s',
-                 undo_string_escapes (tt), colorspec, fontspec,
-                 __do_enhanced_option__ (enhanced, t));
+                 tt, colorspec, fontspec, __do_enhanced_option__ (enhanced, t));
       endif
       fprintf (plot_stream, " rotate by %f;\n", angle);
       if (strcmp (axis_obj.yaxislocation, "right"))
@@ -241,11 +239,11 @@
     if (isempty (t.string))
       fputs (plot_stream, "unset zlabel;\n");
     else
-      [tt, f, s] = __maybe_munge_text__ (enhanced, t, "string", t.interpreter);
+      [tt, f, s] = __maybe_munge_text__ (enhanced, t, "string", ...
+                                         t.interpreter, gnuplot_term);
       fontspec = create_fontspec (f, s, gnuplot_term);
       fprintf (plot_stream, 'set zlabel "%s" %s %s %s',
-               undo_string_escapes (tt), colorspec, fontspec,
-               __do_enhanced_option__ (enhanced, t));
+               tt, colorspec, fontspec, __do_enhanced_option__ (enhanced, t));
       fprintf (plot_stream, " rotate by %f;\n", angle);
     endif
   endif
@@ -629,9 +627,8 @@
             have_3d_patch(data_idx) = false;
             tmpdispname = obj.displayname;
             obj.displayname = get (obj.parent, "displayname");
-            tmp = undo_string_escapes (
-                    __maybe_munge_text__ (enhanced, obj, "displayname", hlgndntrp)
-                  );
+            tmp = __maybe_munge_text__ (enhanced, obj, "displayname", ...
+                                        hlgndntrp, gnuplot_term);
             titlespec{data_idx} = ['title "' tmp '"'];
             obj.displayname = tmpdispname;
             if (! isempty (findobj (obj.parent, "-property", "format", "-depth", 0)))
@@ -650,15 +647,15 @@
                 otherwise
                   errbars = "xerrorbars";
               endswitch
-              withclause{data_idx} = sprintf ("with %s linestyle %d",
+              withclause{data_idx} = sprintf ("with %s linestyle %d", ...
                                               errbars, sidx(1));
             else
               ## Place phantom stemseries data for legend
               data{data_idx} = NaN (2,1);
               usingclause{data_idx} = sprintf ("record=1 using ($1):($2)");
               hgobj = get (obj.parent);
-              [hgstyle, hgsidx] = do_linestyle_command (hgobj, hgobj.color, data_idx,
-                                                        plot_stream);
+              [hgstyle, hgsidx] = do_linestyle_command (hgobj, hgobj.color, ...
+                                                        data_idx, plot_stream);
               withclause{data_idx} = sprintf ("with %s linestyle %d",
                                               hgstyle{1}, hgsidx(1));
             endif
@@ -679,9 +676,8 @@
         if (isempty (obj.displayname))
           titlespec{data_idx} = 'title ""';
         else
-          tmp = undo_string_escapes (
-                  __maybe_munge_text__ (enhanced, obj, "displayname", hlgndntrp)
-                );
+          tmp = __maybe_munge_text__ (enhanced, obj, "displayname", ...
+                                      hlgndntrp, gnuplot_term);
           titlespec{data_idx} = ['title "' tmp '"'];
         endif
         usingclause{data_idx} = sprintf ("record=%d", numel (obj.xdata));
@@ -802,9 +798,8 @@
               if (i > 1 || isempty (obj.displayname))
                 titlespec{local_idx} = 'title ""';
               else
-                tmp = undo_string_escapes (
-                        __maybe_munge_text__ (enhanced, obj, "displayname", hlgndntrp)
-                      );
+                tmp = __maybe_munge_text__ (enhanced, obj, "displayname", ...
+                                            hlgndntrp, gnuplot_term);
                 titlespec{local_idx} = ['title "' tmp '"'];
               endif
               if (isfield (obj, "facecolor"))
@@ -1215,9 +1210,8 @@
           parametric(data_idx) = false;
           have_cdata(data_idx) = false;
           have_3d_patch(data_idx) = false;
-          tmp = undo_string_escapes (
-                  __maybe_munge_text__ (enhanced, obj, "displayname", hlgndntrp)
-                );
+          tmp = __maybe_munge_text__ (enhanced, obj, "displayname", ...
+                                      hlgndntrp, gnuplot_term);
           titlespec{data_idx} = ['title "' tmp '"'];
           data{data_idx} = NaN (3,1);
           usingclause{data_idx} = sprintf ("record=1 using ($1):($2):($3)");
@@ -2268,7 +2262,8 @@
   endif
   if (strcmp (interpreter, "tex"))
     for n = 1 : numel (labels)
-      labels{n} = __tex2enhanced__ (labels{n}, fontname, false, false);
+      labels{n} = __tex2enhanced__ (labels{n}, fontname, false, false, ...
+                                    gnuplot_term);
     endfor
   elseif (strcmp (interpreter, "latex"))
     if (! warned_latex)
@@ -2399,7 +2394,8 @@
 
 endfunction
 
-function [str, f, s] = __maybe_munge_text__ (enhanced, obj, fld, ntrp)
+function [str, f, s] = __maybe_munge_text__ (enhanced, obj, fld, ntrp, ...
+                                             gnuplot_term)
   persistent warned_latex = false;
 
   if (strcmp (fld, "string"))
@@ -2436,10 +2432,10 @@
     if (strcmp (ntrp, "tex"))
       if (iscellstr (str))
         for n = 1:numel (str)
-          str{n} = __tex2enhanced__ (str{n}, fnt, it, bld);
+          str{n} = __tex2enhanced__ (str{n}, fnt, it, bld, gnuplot_term);
         endfor
       else
-        str = __tex2enhanced__ (str, fnt, it, bld);
+        str = __tex2enhanced__ (str, fnt, it, bld, gnuplot_term);
       endif
     elseif (strcmp (ntrp, "latex"))
       if (! warned_latex)
@@ -2455,20 +2451,26 @@
 
 endfunction
 
-function str = __tex2enhanced__ (str, fnt, it, bld)
+function str = __tex2enhanced__ (str, fnt, it, bld, gnuplot_term)
   persistent sym = __setup_sym_table__ ();
   persistent flds = fieldnames (sym);
 
+  if (any (strcmp (gnuplot_term, {"postscript", "epscairo"})))
+    symtype = 1;
+  else
+    symtype = 2;
+  endif
+
   [s, e, m] = regexp (str, "\\\\([a-zA-Z]+|0)", "start", "end", "matches");
 
   for i = length (s) : -1 : 1
-    ## special case for "\0"  and replace with empty set "{/Symbol \306}'
+    ## special case for "\0"  and replace with empty set equivalent
     if (strncmp (m{i}, '\0', 2))
-      str = [str(1:s(i) - 1) '{/Symbol \306}' str(s(i) + 2:end)];
+      str = [str(1:s(i) - 1) sym.emptyset{symtype} str(s(i) + 2:end)];
     else
       f = m{i}(2:end);
       if (isfield (sym, f))
-        g = getfield (sym, f);
+        g = sym.(f){symtype};
         ## FIXME: The symbol font doesn't seem to support bold or italic
         ##if (bld)
         ##  if (it)
@@ -2545,7 +2547,7 @@
         ## like \pix, that should be translated to the symbol Pi and x
         for j = 1 : length (flds)
           if (strncmp (flds{j}, f, length (flds{j})))
-            g = getfield (sym, flds{j});
+            g = sym.(flds{j}){symtype};
             ## FIXME: The symbol font doesn't seem to support bold or italic
             ##if (bld)
             ##  if (it)
@@ -2568,7 +2570,7 @@
   ## But need to put the shorter of the two arguments first.
   ## Careful of nested {} and unprinted characters when defining
   ## shortest..  Don't have to worry about things like ^\theta as they
-  ## are already converted to ^{/Symbol q}.
+  ## are already converted.
 
   ## FIXME: This is a mess.  Is it worth it just for a "@" character?
 
@@ -2659,117 +2661,119 @@
 function sym = __setup_sym_table__ ()
 
   ## Setup the translation table for TeX to gnuplot enhanced mode.
-  sym.forall = '{/Symbol \042}';
-  sym.exists = '{/Symbol \044}';
-  sym.ni = '{/Symbol \047}';
-  sym.cong = '{/Symbol \100}';
-  sym.Delta = '{/Symbol D}';
-  sym.Phi = '{/Symbol F}';
-  sym.Gamma = '{/Symbol G}';
-  sym.vartheta = '{/Symbol J}';
-  sym.Lambda = '{/Symbol L}';
-  sym.Pi = '{/Symbol P}';
-  sym.Theta = '{/Symbol Q}';
-  sym.Sigma = '{/Symbol S}';
-  sym.varsigma = '{/Symbol V}';
-  sym.Omega = '{/Symbol W}';
-  sym.Xi = '{/Symbol X}';
-  sym.Psi = '{/Symbol Y}';
-  sym.perp = '{/Symbol \136}';
-  sym.alpha = '{/Symbol a}';
-  sym.beta = '{/Symbol b}';
-  sym.chi = '{/Symbol c}';
-  sym.delta = '{/Symbol d}';
-  sym.epsilon = '{/Symbol e}';
-  sym.phi = '{/Symbol f}';
-  sym.gamma = '{/Symbol g}';
-  sym.eta = '{/Symbol h}';
-  sym.iota = '{/Symbol i}';
-  sym.varphi = '{/Symbol j}';              # Not in OpenGL
-  sym.kappa = '{/Symbol k}';
-  sym.lambda = '{/Symbol l}';
-  sym.mu = '{/Symbol m}';
-  sym.nu = '{/Symbol n}';
-  sym.o = '{/Symbol o}';
-  sym.pi = '{/Symbol p}';
-  sym.theta = '{/Symbol q}';
-  sym.rho = '{/Symbol r}';
-  sym.sigma = '{/Symbol s}';
-  sym.tau = '{/Symbol t}';
-  sym.upsilon = '{/Symbol u}';
-  sym.varpi = '{/Symbol v}';
-  sym.omega = '{/Symbol w}';
-  sym.xi = '{/Symbol x}';
-  sym.psi = '{/Symbol y}';
-  sym.zeta = '{/Symbol z}';
-  sym.sim = '{/Symbol \176}';
-  sym.Upsilon = '{/Symbol \241}';
-  sym.prime = '{/Symbol \242}';
-  sym.leq = '{/Symbol \243}';
-  sym.infty = '{/Symbol \245}';
-  sym.clubsuit = '{/Symbol \247}';
-  sym.diamondsuit = '{/Symbol \250}';
-  sym.heartsuit = '{/Symbol \251}';
-  sym.spadesuit = '{/Symbol \252}';
-  sym.leftrightarrow = '{/Symbol \253}';
-  sym.leftarrow = '{/Symbol \254}';
-  sym.uparrow = '{/Symbol \255}';
-  sym.rightarrow = '{/Symbol \256}';
-  sym.downarrow = '{/Symbol \257}';
-  sym.circ = '{/Symbol \260}';         # degree symbol, not circ as in FLTK
-  sym.deg = '{/Symbol \260}';
-  sym.ast = '{/Symbol *}';
-  sym.pm = '{/Symbol \261}';
-  sym.geq = '{/Symbol \263}';
-  sym.times = '{/Symbol \264}';
-  sym.propto = '{/Symbol \265}';
-  sym.partial = '{/Symbol \266}';
-  sym.bullet = '{/Symbol \267}';
-  sym.div = '{/Symbol \270}';
-  sym.neq = '{/Symbol \271}';
-  sym.equiv = '{/Symbol \272}';
-  sym.approx = '{/Symbol \273}';
-  sym.ldots = '{/Symbol \274}';
-  sym.mid = '{/Symbol \275}';
-  sym.aleph = '{/Symbol \300}';
-  sym.Im = '{/Symbol \301}';
-  sym.Re = '{/Symbol \302}';
-  sym.wp = '{/Symbol \303}';
-  sym.otimes = '{/Symbol \304}';
-  sym.oplus = '{/Symbol \305}';
+  sym.forall = {'{/Symbol \042}', '∀'};
+  sym.exists = {'{/Symbol \044}', '∃'};
+  sym.ni = {'{/Symbol \047}', '∋'};
+  sym.cong = {'{/Symbol \100}', '≅'};
+  sym.Delta = {'{/Symbol D}', 'Δ'};
+  sym.Phi = {'{/Symbol F}', 'Φ'};
+  sym.Gamma = {'{/Symbol G}', 'Γ'};
+  sym.vartheta = {'{/Symbol J}', 'ϑ'};
+  sym.Lambda = {'{/Symbol L}', 'Λ'};
+  sym.Pi = {'{/Symbol P}', 'Π'};
+  sym.Theta = {'{/Symbol Q}', 'Θ'};
+  sym.Sigma = {'{/Symbol S}', 'Σ'};
+  sym.varsigma = {'{/Symbol V}', 'ς'};
+  sym.Omega = {'{/Symbol W}', 'Ω'};
+  sym.Xi = {'{/Symbol X}', 'Ξ'};
+  sym.Psi = {'{/Symbol Y}', 'Ψ'};
+  sym.perp = {'{/Symbol \136}', '⊥'};
+  sym.alpha = {'{/Symbol a}', 'α'};
+  sym.beta = {'{/Symbol b}', 'β'};
+  sym.chi = {'{/Symbol c}', 'χ'};
+  sym.delta = {'{/Symbol d}', 'δ'};
+  sym.epsilon = {'{/Symbol e}', 'ε'};
+  sym.phi = {'{/Symbol f}', 'ϕ'};
+  sym.gamma = {'{/Symbol g}', 'γ'};
+  sym.eta = {'{/Symbol h}', 'η'};
+  sym.iota = {'{/Symbol i}', 'ι'};
+  sym.varphi = {'{/Symbol j}', 'φ'};              # Not in OpenGL
+  sym.kappa = {'{/Symbol k}', 'κ'};
+  sym.lambda = {'{/Symbol l}', 'λ'};
+  sym.mu = {'{/Symbol m}', 'μ'};
+  sym.nu = {'{/Symbol n}', 'ν'};
+  sym.o = {'{/Symbol o}', 'ο'};
+  sym.pi = {'{/Symbol p}', 'π'};
+  sym.theta = {'{/Symbol q}', 'θ'};
+  sym.rho = {'{/Symbol r}', 'ρ'};
+  sym.sigma = {'{/Symbol s}', 'σ'};
+  sym.tau = {'{/Symbol t}', 'τ'};
+  sym.upsilon = {'{/Symbol u}', 'υ'};
+  sym.varpi = {'{/Symbol v}', 'ϖ'};
+  sym.omega = {'{/Symbol w}', 'ω'};
+  sym.xi = {'{/Symbol x}', 'ξ'};
+  sym.psi = {'{/Symbol y}', 'ψ'};
+  sym.zeta = {'{/Symbol z}', 'ζ'};
+  sym.sim = {'{/Symbol \176}', '∼'};
+  sym.Upsilon = {'{/Symbol \241}', 'Υ'};
+  sym.prime = {'{/Symbol \242}', '′'};
+  sym.leq = {'{/Symbol \243}', '≤'};
+  sym.infty = {'{/Symbol \245}', '∞'};
+  sym.clubsuit = {'{/Symbol \247}', '♣'};
+  sym.diamondsuit = {'{/Symbol \250}', '♢'};
+  sym.heartsuit = {'{/Symbol \251}', '♡'};
+  sym.spadesuit = {'{/Symbol \252}', '♠'};
+  sym.leftrightarrow = {'{/Symbol \253}', '↔'};
+  sym.leftarrow = {'{/Symbol \254}', '←'};
+  sym.uparrow = {'{/Symbol \255}', '↑'};
+  sym.rightarrow = {'{/Symbol \256}', '→'};
+  sym.downarrow = {'{/Symbol \257}', '↓'};
+  sym.circ = {'{/Symbol \260}', '∘'};
+  ## degree symbol, not circ as in FLTK
+  sym.deg = {'{/Symbol \260}', '°'};
+  sym.ast = {'{/Symbol *}', '∗'};
+  sym.pm = {'{/Symbol \261}', '±'};
+  sym.geq = {'{/Symbol \263}', '≥'};
+  sym.times = {'{/Symbol \264}', '×'};
+  sym.propto = {'{/Symbol \265}', '∝'};
+  sym.partial = {'{/Symbol \266}', '∂'};
+  sym.bullet = {'{/Symbol \267}', '∙'};
+  sym.div = {'{/Symbol \270}', '÷'};
+  sym.neq = {'{/Symbol \271}', '≠'};
+  sym.equiv = {'{/Symbol \272}', '≡'};
+  sym.approx = {'{/Symbol \273}', '≈'};
+  sym.ldots = {'{/Symbol \274}', '…'};
+  sym.mid = {'{/Symbol \275}', '∣'};
+  sym.aleph = {'{/Symbol \300}', 'ℵ'};
+  sym.Im = {'{/Symbol \301}', 'ℑ'};
+  sym.Re = {'{/Symbol \302}', 'ℜ'};
+  sym.wp = {'{/Symbol \303}', '℘'};
+  sym.otimes = {'{/Symbol \304}', '⊗'};
+  sym.oplus = {'{/Symbol \305}', '⊕'};
   ## empty set, not circled slash division operator as in FLTK.
-  sym.oslash = '{/Symbol \306}';
-  sym.cap = '{/Symbol \307}';
-  sym.cup = '{/Symbol \310}';
-  sym.supset = '{/Symbol \311}';
-  sym.supseteq = '{/Symbol \312}';
-  sym.subset = '{/Symbol \314}';
-  sym.subseteq = '{/Symbol \315}';
-  sym.in = '{/Symbol \316}';
-  sym.notin = '{/Symbol \317}';            # Not in OpenGL
-  sym.angle = '{/Symbol \320}';
-  sym.bigtriangledown = '{/Symbol \321}';  # Not in OpenGL
-  sym.langle = '{/Symbol \341}';
-  sym.rangle = '{/Symbol \361}';
-  sym.nabla = '{/Symbol \321}';
-  sym.prod = '{/Symbol \325}';             # Not in OpenGL
-  sym.surd = '{/Symbol \326}';
-  sym.cdot = '{/Symbol \327}';
-  sym.neg = '{/Symbol \330}';
-  sym.wedge = '{/Symbol \331}';
-  sym.vee = '{/Symbol \332}';
-  sym.Leftrightarrow = '{/Symbol \333}';   # Not in OpenGL
-  sym.Leftarrow = '{/Symbol \334}';
-  sym.Uparrow = '{/Symbol \335}';          # Not in OpenGL
-  sym.Rightarrow = '{/Symbol \336}';
-  sym.Downarrow = '{/Symbol \337}';        # Not in OpenGL
-  sym.diamond = '{/Symbol \340}';          # Not in OpenGL
-  sym.copyright = '{/Symbol \343}';
-  sym.lfloor = '{/Symbol \353}';
-  sym.lceil = '{/Symbol \351}';
-  sym.rfloor = '{/Symbol \373}';
-  sym.rceil = '{/Symbol \371}';
-  sym.int = '{/Symbol \362}';
+  sym.oslash = {'{/Symbol \306}', '⊘'};
+  sym.emptyset = {'{/Symbol \306}', '∅'};
+  sym.cap = {'{/Symbol \307}', '∩'};
+  sym.cup = {'{/Symbol \310}', '∪'};
+  sym.supset = {'{/Symbol \311}', '⊃'};
+  sym.supseteq = {'{/Symbol \312}', '⊇'};
+  sym.subset = {'{/Symbol \314}', '⊂'};
+  sym.subseteq = {'{/Symbol \315}', '⊑'};
+  sym.in = {'{/Symbol \316}', '∈'};
+  sym.notin = {'{/Symbol \317}', '∋'};            # Not in OpenGL
+  sym.angle = {'{/Symbol \320}', '∠'};
+  sym.bigtriangledown = {'{/Symbol \321}', '▽'};  # Not in OpenGL
+  sym.langle = {'{/Symbol \341}', '〈'};
+  sym.rangle = {'{/Symbol \361}', '〉'};
+  sym.nabla = {'{/Symbol \321}', '∇'};
+  sym.prod = {'{/Symbol \325}', '∏'};             # Not in OpenGL
+  sym.surd = {'{/Symbol \326}', '√'};
+  sym.cdot = {'{/Symbol \327}', '⋅'};
+  sym.neg = {'{/Symbol \330}', '¬'};
+  sym.wedge = {'{/Symbol \331}', '∧'};
+  sym.vee = {'{/Symbol \332}', '∨'};
+  sym.Leftrightarrow = {'{/Symbol \333}', '⇔'};   # Not in OpenGL
+  sym.Leftarrow = {'{/Symbol \334}', '⇐'};
+  sym.Uparrow = {'{/Symbol \335}', '⇑'};          # Not in OpenGL
+  sym.Rightarrow = {'{/Symbol \336}', '⇒'};
+  sym.Downarrow = {'{/Symbol \337}', '⇓'};        # Not in OpenGL
+  sym.diamond = {'{/Symbol \340}', '⋄'};          # Not in OpenGL
+  sym.copyright = {'{/Symbol \343}', '©'};
+  sym.lfloor = {'{/Symbol \353}', '⌊'};
+  sym.lceil = {'{/Symbol \351}', '⌈'};
+  sym.rfloor = {'{/Symbol \373}', '⌋'};
+  sym.rceil = {'{/Symbol \371}', '⌉'};
+  sym.int = {'{/Symbol \362}', '∫'};
 
 endfunction
 
@@ -2788,7 +2792,8 @@
 
 function do_text (stream, gpterm, enhanced, obj, hax, screenpos)
 
-  [label, f, s] = __maybe_munge_text__ (enhanced, obj, "string", obj.interpreter);
+  [label, f, s] = __maybe_munge_text__ (enhanced, obj, "string", ...
+                                        obj.interpreter, gpterm);
   fontspec = create_fontspec (f, s, gpterm);
   lpos = obj.position;
   halign = obj.horizontalalignment;
@@ -2846,9 +2851,8 @@
   endif
   fprintf (stream,
            ['set label "%s" at %s %.15e,%.15e%s %s rotate by %f offset character %f,%f %s %s front %s;' "\n"],
-           undo_string_escapes (label), units, lpos(1),
-           lpos(2), zstr, halign, angle, dx_and_dy, fontspec,
-           __do_enhanced_option__ (enhanced, obj), colorspec);
+           label, units, lpos(1), lpos(2), zstr, halign, angle, dx_and_dy,
+           fontspec, __do_enhanced_option__ (enhanced, obj), colorspec);
 
 endfunction