|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
/*
* This file:
* http://anggtwu.net/myqdraw/topdf2.mac.html
* http://anggtwu.net/myqdraw/topdf2.mac
* (find-angg "myqdraw/topdf2.mac")
* Author: Eduardo Ochs <eduardoochs@gmail.com>
*
* This is a variant of topdf1.mac with better redefiners,
* and that should also work for mydraw3d.
*
* See:
* http://anggtwu.net/eev-qdraw.html
* Author: Eduardo Ochs <eduardoochs@gmail.com>
* Version: 2025apr19
* Public domain.
*
* This file defines a variant of `myqdraw', called `myqdrawp', that
* can be configured to work in three modes:
*
* myqdrawp_to_screen() makes myqdrawp draw to the screen,
* myqdrawp_to_single_pdf() makes myqdrawp always draw into the same PDF,
* myqdrawp_to_new_pdf() makes each myqdrawp draw into a new PDF.
*
* See: http://anggtwu.net/eev-maxima.html
* (find-windows-beginner-intro "12. Install qdraw")
* (find-angg ".maxima/maxima-init.mac" "load_qdraw")
* (find-myqdraw "mkanim1.sh")
* (find-myqdraw "myqdraw-tex.lisp" "includegraphics")
*
* «.myqdrawp» (to "myqdrawp")
* «.modes» (to "modes")
* «.modes-test» (to "modes-test")
* «.filenames» (to "filenames")
* «.filenames-test» (to "filenames-test")
* «.includegraphics» (to "includegraphics")
* «.includegraphics-test» (to "includegraphics-test")
* «.ret» (to "ret")
* «.ret-test» (to "ret-test")
* «.more» (to "more")
* «.more-test» (to "more-test")
* «.flipbook» (to "flipbook")
* «.animation» (to "animation")
*/
/* «myqdrawp» (to ".myqdrawp")
* `myqdrawp' is a wrapper around `myqdraw'
* that lets three behaviours be redefined...
*
*
* "Screen" mode
* -------------
* In "screen" mode `myqdrawp' works like `myqdraw' -
* it does not increase any counters,
* it draws to the screen,
* and it returns a list like this:
*
* [gr2d(parametric)]
*
*
* "New PDF" mode
* --------------
* In the "new pdf" mode `myqdrawp':
* increases a counter,
* adds a
*
* more(terminal=pdf, file_name="foo_001.pdf")
*
* to the drawing arguments to make qdraw draw to a file,
* and it returns something like this:
*
* \includegraphics[height=5cm]{foo_001.pdf}
*
*
* "Single PDF" mode
* -----------------
* There is also a "single pdf" mode, in which `myqdrawp'
* does not increase any counters and it uses filenames
* like "foo.pdf" instead of "foo_001.pdf".
*/
/* This part of the code is top-down - it mentions lots of functions
* that will be defined below.
*/
myqdraw ([qargs]) := apply('qdraw, flatten([qargs]));
myqdrawp ([qargs]) := (topdf_incr(), topdf_ret(myqdraw(topdf_more(), qargs)));
topdf_ret (o) := o; /* default: return o instead of an includegraphics */
topdf_more () := []; /* default: do not add a more(...) to the qargs */
topdf_incr () := "nop"; /* default: do not increase the counter */
/* «modes» (to ".modes")
*/
topdf_to_screen () := (topdf_use_incr_0(),
topdf_ret_o(),
topdf_use_dummy_more(),
"Will draw to the screen.");
topdf_to_new_pdf () := (topdf_use_incr_1(),
topdf_ret_includegraphics(),
topdf_use_name_with_n(),
topdf_use_real_more(),
"Will always draw to a new PDF.");
topdf_to_single_pdf() := (topdf_use_incr_0(),
topdf_ret_includegraphics(),
topdf_use_name_single(),
topdf_use_real_more(),
"Will always draw to the same PDF.");
myqdrawp_to_screen () := topdf_to_screen ();
myqdrawp_to_new_pdf () := topdf_to_new_pdf ();
myqdrawp_to_single_pdf() := topdf_to_single_pdf();
/* «modes-test» (to ".modes-test")
* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
ls -lAF /tmp/frame*
rm -v /tmp/frame*
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
** (find-myqdraw "myqdraw3.mac")
load_myqdraw();
load("topdf2.mac");
[topdf_a,topdf_b,topdf_c] : ["/tmp/", "", "frame"];
drawing1(Dx) := mypara([cos(t),sin(t)]+[Dx,0], t,0,2*%pi);
drawing (Dx) := [xyrange(), drawing1(Dx)];
myqdrawp_to_screen(); myqdrawp(drawing(0));
myqdrawp_to_single_pdf(); myqdrawp(drawing(0.5));
myqdrawp(drawing(1.0));
myqdrawp_to_new_pdf(); myqdrawp(drawing(1.5));
myqdrawp(drawing(2.0));
topdf_more();
** Inspect:
** (find-fline "/tmp/" "frame_")
*/
/* «filenames» (to ".filenames")
*/
topdf_a : "~/LATEX/";
topdf_b : "2024-1-C3/";
topdf_c : "test";
topdf_n : 0;
topdf_incr () := topdf_n : topdf_n + 1; /* either increase a counter */
topdf_incr () := "nop"; /* or a no-op (default) */
topdf_c_cn () := format("~a_~3,'0d", topdf_c, topdf_n);
topdf_c () := topdf_c_cn(); /* either "foo_001" */
topdf_c () := topdf_c; /* or "foo" (default) */
topdf_abc () := format("~a~a~a", topdf_a, topdf_b, topdf_c());
topdf_bcpdf () := format("~a~a.pdf", topdf_b, topdf_c());
/* Redefiners:
*/
topdf_use_name_single () := (topdf_c () := topdf_c);
topdf_use_name_with_n () := (topdf_c () := topdf_c_cn());
topdf_use_incr_1 () := (topdf_incr() := topdf_n : topdf_n + 1);
topdf_use_incr_0 () := (topdf_incr() := "nop");
/*
* «filenames-test» (to ".filenames-test")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("topdf2.mac");
[topdf_a,topdf_b,topdf_c] : ["~/LATEX/","2024-1-C3/","test"];
topdf_abc();
topdf_use_name_with_n()$ topdf_bcpdf();
topdf_use_incr_1()$ topdf_incr()$ topdf_bcpdf();
topdf_use_incr_0()$ topdf_incr()$ topdf_bcpdf();
topdf_use_name_single()$ topdf_bcpdf();
*/
/* «includegraphics» (to ".includegraphics")
* New: (find-myqdraw "myqdraw-tex.lisp" "includegraphics")
* Old: topdf_includegraphics() := format("\\includegraphics[~a]{~a}",
* topdf_opts, topdf_bcpdf());
*/
topdf_opts : "height=5cm";
topdf_includegraphics () := includegraphics(topdf_opts, topdf_bcpdf());
/* «includegraphics-test» (to ".includegraphics-test")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("topdf2.mac");
o : includegraphics("height=2cm", "foo.pdf");
tex1(o);
load("myqdraw-tex.lisp"); tex1(o);
*/
/* «ret» (to ".ret")
*/
topdf_ret_includegraphics () := (topdf_ret(o) := topdf_includegraphics());
topdf_ret_o () := (topdf_ret(o) := o);
/* «ret-test» (to ".ret-test")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("topdf2.mac");
topdf_ret_includegraphics()$ topdf_ret(42);
topdf_ret_o()$ topdf_ret(42);
*/
/* «more» (to ".more")
* (find-es "qdraw" "more")
*/
/* Old: */
topdf_more_body () := [terminal=pdf, file_name=topdf_abc()];
topdf_use_real_more () := (topdf_more():=apply('more,topdf_more_body()));
topdf_use_dummy_more() := (topdf_more():=[]);
/* New: */
topdf_more00 () := [terminal=pdf, file_name=topdf_abc()];
topdf_more0 () := topdf_more00();
topdf_more () := apply('more, flatten([topdf_more0()]));
topdf_use_real_more () := (topdf_more0():=topdf_more00());
topdf_use_dummy_more () := (topdf_more0():=[]);
/* «more-test» (to ".more-test")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("topdf2.mac");
topdf_use_dummy_more()$ topdf_more();
topdf_use_real_more ()$ topdf_more();
*/
/* _____ _ _ _ _
* | ___| (_)_ __ | |__ ___ ___ | | __
* | |_ | | | '_ \| '_ \ / _ \ / _ \| |/ /
* | _| | | | |_) | |_) | (_) | (_) | <
* |_| |_|_| .__/|_.__/ \___/ \___/|_|\_\
* |_|
*
* «flipbook» (to ".flipbook")
* This needs the following Debian packages: qpdf.
** Delete the frames from a previous test:
* (find-sh0 "ls -lAF /tmp/frame*")
* (find-sh0 "rm -v /tmp/frame*")
*
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
** (find-myqdraw "myqdraw3.mac")
load_myqdraw();
load("topdf2.mac");
[topdf_a,topdf_b,topdf_c,topdf_n] : ["/tmp/", "", "frame", 0];
myqdrawp_to_screen ();
myqdrawp_to_new_pdf(); "Skip this line to draw to the screen"$
[xmin,xmax, ymin,ymax] : [-2,5, -2,3];
drawing1(Dx) := mypara([cos(t),sin(t)]+[Dx,0], t,0,2*%pi);
drawing (Dx) := [xyrange(), drawing1(Dx)];
** Create the frames 001..004 as .pdfs -
** if we're not in debugging/screen mode!
myqdrawp(drawing(0));
myqdrawp(drawing(0.5));
myqdrawp(drawing(1.0));
myqdrawp(drawing(1.5));
** Inspect the frames with:
** (find-fline "/tmp/" "frame_")
* (eepitch-bash)
* (eepitch-kill)
* (eepitch-bash)
add_1zs () { for i in $*; do echo $i 1-z; done; }
add_1zs /tmp/frame_*.pdf
qpdf --empty --pages $(add_1zs /tmp/frame_*.pdf) -- /tmp/frames.pdf
ls -lAF /tmp/frame*
** Inspect the flipbook with:
** (find-pdf-page "/tmp/frames.pdf")
*/
/* _ _ _ _
* / \ _ __ (_)_ __ ___ __ _| |_(_) ___ _ __
* / _ \ | '_ \| | '_ ` _ \ / _` | __| |/ _ \| '_ \
* / ___ \| | | | | | | | | | (_| | |_| | (_) | | | |
* /_/ \_\_| |_|_|_| |_| |_|\__,_|\__|_|\___/|_| |_|
*
* «animation» (to ".animation")
* This needs the following Debian packages:
* imagemagick (for convert),
* poppler-utils (for pdftoppm),
* gifsicle.
* It converts the flipbook from the previous section to an animated gif.
* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
cutext () { echo $1 | rev | cut -f2- -d. | rev; }
jpgtogif () { echo convert $1 $(cutext $1).gif;
convert $1 $(cutext $1).gif; }
rm -fv /tmp/frame_*.jpg
rm -fv /tmp/frame*.gif
ls -lAF /tmp/frame*
pdftoppm -jpeg -jpegopt quality=80 -r 150 -sep _ /tmp/frames.pdf /tmp/frame
for i in /tmp/frame*.jpg; do jpgtogif $i; done
ls -lAF /tmp/frame*
gifsicle --colors 256 --loop --delay 20 /tmp/frame_*.gif > /tmp/frames.gif
ls -lAF /tmp/frame*
rm -fv /tmp/frame_*.jpg
rm -fv /tmp/frame_*.gif
ls -lAF /tmp/frame*
# To open the animated gif in the browser, do:
# (brg "file:///tmp/frames.gif")
# file:///tmp/frames.gif
# To inspect the gif in Emacs, use `image-mode-map':
# (find-fline "/tmp/frames.gif")
# (find-elocus-links "f" 'image-mode-map "image-next-frame")
# (find-elocus-links "b" 'image-mode-map "image-previous-frame")
*/