Skip to main content

Is it possible to embed fonts in a .cdf?


I am trying to use a special font with musical symbols in a .cdf that I send to some friends. The font is called "Tempera" and is freely distributed here:


http://christian.texier.pagespro-orange.fr/mididesi/free/index.htm#tempera



In the .cdf I use substitutions like this:


sub = "A" -> "\*StyleBox[\(\!\(\*StyleBox[\"A\",\n\
FontFamily->\"Mathematica6\"]\)\!\(\*StyleBox[\"U\",\n\
FontFamily->\"Tempera\",\nFontSize->18,\nFontWeight->\"Plain\"]\)\)]";

which are used in this manner:


 "A" //. sub

What this does is to change the regular "A" character into a curly A (from the Mathematica6 font) and a symbol that is a half-sharp (the "U" from the Tempera font). This works fine in Mathematica, and also in the .cdf on my computer. However, when I send it to my friend, he sees the "U" and not the half-flat. This is probably what you will see too, unless you download the Tempera font. I believe this means that Mathematica does not embed the font in the .cdf, and I'm wondering if there is any way to force the embedding to occur. While I could have my friend download the font, if I ever want to place the .cdf on the web, this would not be practical.



Answer




Mathematica will only let you use fonts installed on the system. I have two suggestions here:




  1. At the top of your CDF file, display a link depending on the operating system, pointing to the correct file for downloading the font


    link = If[$OperatingSystem == "Linux" || $OperatingSystem == "Windows", 
    Hyperlink["Download font for " <> $OperatingSystem , "http://christian.texier.pagespro-orange.fr/mididesi/free/media/tempera.zip"],
    Hyperlink["Download font for Mac", "http://christian.texier.pagespro-orange.fr/mididesi/free/media/electronica.sit"]
    ];
    link



  2. Alternatively, you can create PDFs for the single characters you use. Out of them, you can create a textual representation which can be saved within your CDF file:


    pdfA = Import["tempera_a.pdf"][[1]];
    symbolA = Compress[pdfA]

    with the outputs from Compress[] you can maybe create a list for the alphabet you use. When you want to use the font afterwards, you can do


    "A"/.{"A" -> Uncompress[symbolA]}


Edit: For the latter approach, I just noticed that Mathematica does have severe problems with embedded fonts - they are not showing up in the correct font. I guess using a raster format like PNG instead of PDF would work, but it's not as nice as scalable fonts from a PDF. If you use PNG however, the files will stay small enough to be included, even at a relatively high resolution. I checked this with a PNG file with resolution 1000px*1000px, where the file size was 60kib, compared to 300kb for the PDF file with the same character and embedded font.



Comments

Popular posts from this blog

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Adding a thick curve to a regionplot

Suppose we have the following simple RegionPlot: f[x_] := 1 - x^2 g[x_] := 1 - 0.5 x^2 RegionPlot[{y < f[x], f[x] < y < g[x], y > g[x]}, {x, 0, 2}, {y, 0, 2}] Now I'm trying to change the curve defined by $y=g[x]$ into a thick black curve, while leaving all other boundaries in the plot unchanged. I've tried adding the region $y=g[x]$ and playing with the plotstyle, which didn't work, and I've tried BoundaryStyle, which changed all the boundaries in the plot. Now I'm kinda out of ideas... Any help would be appreciated! Answer With f[x_] := 1 - x^2 g[x_] := 1 - 0.5 x^2 You can use Epilog to add the thick line: RegionPlot[{y < f[x], f[x] < y < g[x], y > g[x]}, {x, 0, 2}, {y, 0, 2}, PlotPoints -> 50, Epilog -> (Plot[g[x], {x, 0, 2}, PlotStyle -> {Black, Thick}][[1]]), PlotStyle -> {Directive[Yellow, Opacity[0.4]], Directive[Pink, Opacity[0.4]],