Skip to main content

Release notes *2.8.7*

⏱️ 4 min read
  • laser pointer on slides improved; press q to toggle;
  • new Print to PDF feature for notebooks, including manual page breaks via PageBreakAbove/PageBreakBelow;
  • paclet extensions: ship JS/CSS assets, write one package for WLJS/Mathematica/WolframScript, assets embed/cached in exported notebooks;
  • Graphics & media: fixes to 2D aspect/arrows/curves; AnimatedImage exportable to HTML/MDX; easy GIF/video export from Animate.
  • DEV & UX: async RasterizeAsync/ExportAsync; better clipboard options (ClickToCopy, Paste, CopyToClipboard);
  • Windows binaries now digitally signed via SignPath.
Download original notebook

Better laser pointer​

We improved our "laser" pointer used on slides. It has a trail and can work properly in fullscreen mode as well:

tip

Press

q
on a slide

warning

This feature requires WLJS Notebook App, since we rely on our custom renderer implemented in Electron.js.

Now you can print any notebook directly to PDF document:

  • Use command palette

  • Or main menu

Manual page breaks​

Since now you can easily print any notebook, it make sence to control page breaks manually.

note

It will also work if you export a notebook to HTML and then print it

Use PageBreakAbove or PageBreakBelow symbols in the context of Markdown or WLX cells:

.md
<PageBreakAbove/>

SignPath Certificate πŸ“œβ€‹

Now we are officially on SignPath as OSS organization! This allows us to digitally sign our DLL, installers for Windows machines. It should prevent any troubles with anti-malware software.

In a nutshell we have:

  • SignPath Certificate for Windows (FREE)
  • Apple Developer License for MacOS (90 EUR/year)

Extensions for Wolfram Paclets​

We’ve taken a big step toward extending standard Wolfram packages (Paclets) with our frontend extensions.

This means you can write a normal-looking Wolfram package for both Mathematica and WLJS that can take advantage of WLJS’s extra features when needed.

❓ What you can do with this:

  • Ship JavaScript and CSS assets that are automatically integrated into the runtime once the package is loaded.
  • Write a single package for WLJS, Mathematica, and WolframScript.
  • Expose folders from your paclet to an HTTP server.

❓ Will it work for exported notebooks?

  • Yes. JavaScript bundles will be compressed and embedded into the notebook if you apply it from the settings.
  • You can safely publish your notebook.
  • Anyone who doesn’t have those package assets installed will still be able to read the notebook without issues.
  • Everything is cached and updated whenever changes are made to the paclet.

Example​

Here’s how this might look in your PacletInfo.

PacletObject[
  <|
    "Name" -> "CoffeeLiqueur/SplatMesh",
    "License" -> "MIT",
    "Extensions" -> {
      {
        "Javascript",
        "Root" -> {"Assets", "Spark", "kernel.js"}
      },
      {
        "Javascript Bundle", (* only for exporting to HTML *)
        "Root" -> {"Assets", "Bundle", "bundle.js"}
      }
      <...>

Here is a good example we made:

Check out our first crossplatform library SplatMesh 🫟

Improved 2D Graphics​

We fixed an issue with automatic aspect ratio as well as some minor problems with arrows and curves:

transitionMatrix = {{7/10, 0, 3/10, 0}, {1/2, 0, 1/2, 0}, {0, 2/5, 0, 3/5}, {0, 1/5, 0, 4/5}};
mp = DiscreteMarkovProcess[1, transitionMatrix];
Graph[mp]
(*VB[*)(CoffeeLiqueur`Extensions`Boxes`Workarounds`temporal$282502)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKp6UmG6UYmRvrGpimpuiamCaa6SZaJiXpJlmkGKSYG6clGxuZAACRiRYt"*)(*]VB*)

Improved AnimatedImage​

Now any of animated image can be safely exported to HTML, MDX (Static or Interactive)

AnimatedImage[
  Table[RandomImage[], {10}]
, FrameRate->30]
(*VB[*)(FrontEndRef["4978d4a1-c791-4262-bd49-623d9f9bf46c"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm1iaW6SYJBrqJptbGuqaGJkZ6SalmFjqmhkZp1imWSalmZglAwB4pRVa"*)(*]VB*)

Operations with clipboard​

We improved the compatibillity with Mathematica!

ClickToCopy["Click me", Red]

Paste the clipboard content as a new cell

Paste[]

Copy input form of the expression or text to the clipboard

CopyToClipboard["\"Sky is blue\""];

Paste button

PasteButton[Red, Blue]

Export Animations as GIFs πŸ³β€‹

Animate-like expressions are now easy to rasterize into the sequence of frames with AnimatedImage

warning

This feature requires WLJS Notebook App, since we rely on our custom renderer implemented in Electron.js.

Then AnimatedImage expression can be safely exported to video, GIF or preprocessed using standard tools for images

Export["anim.gif", 
 AnimatedImage @ Animate[
  ParametricPlot[ReIm[(*SpB[*)Power[I(*|*),(*|*)-t](*]SpB*) + 3 (*SpB[*)Power[I(*|*),(*|*)t/3](*]SpB*)], {t,0,u}, 
    Epilog->{
      Arrow[{{0,0}, ReIm[(*SpB[*)Power[I(*|*),(*|*)-u](*]SpB*)]}], 
      Arrow[{ ReIm[(*SpB[*)Power[I(*|*),(*|*)-u](*]SpB*)], ReIm[(*SpB[*)Power[I(*|*),(*|*)-u](*]SpB*) + 3 (*SpB[*)Power[I(*|*),(*|*)u/3](*]SpB*)]}]
    }, PlotRange->{{-4,4}, {-4,4}}, GridLines->Automatic,
    PlotStyle->(*VB[*)(RGBColor[1, 0, 0])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qYgCDD/ZQBgMDnAEA4iUPRg=="*)(*]VB*)
  ]
 , {u, 0.001, 4Pi}, 
   RefreshRate->30, 
   Appearance->None
  ]
]
"anim.gif"

Import it back as AnimatedImage

ImageResize["anim.gif" // AnimatedImage, 250]
(*VB[*)(CoffeeLiqueur`Extensions`Video`Internal`imgSymbol$410032)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKmxibpaSkGljoJiYbmOuamBkY6FqaGifrGpkaWZobmyaZpFqaAAB7DRTn"*)(*]VB*)

More async expressions!​

To improve your async programming experience, we provide a few more standard expressions with async support.

Here is the async version of Rasterize:

cell = EvaluationCell[];
Then[RasterizeAsync[Style["Hey!", 14, Bold]], CellPrint[#, "After"->cell]&];

Async Export expression uses parallel kernels to export your data:

cell = EvaluationCell[];
Then[ExportAsync["data.txt", "Hello World!"], CellPrint[#, "After"->cell]&];
data.txt
Hello World!

AnimatedImage does also have a special option for async operations:

AnimatedImage[Animate[x, {x,0,1}], Asynchronous->True]

Minor styles fixes​

Fractions now looks more like ... fractions

(*FB[*)((1)(*,*)/(*,*)(123))(*]FB*)