Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
#!/bin/bash
# This file:
#   http://anggtwu.net/myqdraw/mkanim1.sh.html
#   http://anggtwu.net/myqdraw/mkanim1.sh
#               (find-myqdraw "mkanim1.sh")
# See: http://anggtwu.net/eev-qdraw.html
#      http://anggtwu.net/eev-qdraw.html#animations
#      http://anggtwu.net/2024-bash-test-blocks.html
#               (find-2024bashtesthsubs "0:00")
# Author: Eduardo Ochs <eduardoochs@gmail.com>
# Version: 2024dec12
# Public domain.
#
#
# Introduction
# ============
# "mkanim1.sh" is a shell library to produce animated gifs.
# This file is a friend of:
#   (find-myqdraw "topdf1.mac")
#
# In short: topdf1.mac is a library to produce animations in Maxima,
# but it only produces frames, each one as a separate PDF; then we can
# use the function "makeflipbook" in this file to produce a multipage
# PDF that works as a flipbook, and the function "makeanim" to convert
# the multipage PDF to an animated gif.
#
# I usually call just "makeboth" to produce the flipbook in PDF first,
# and then the animated git. For example:
#
#   ./mkanim1.sh makeboth anim.gif flipbook.pdf 001.pdf 002.pdf
#
#
# This file was inspired by:
#   (find-git-intro "1. Preparation")
#   (find-git-intro "1. Preparation" "wget" "GIT/eevgitlib1.sh")
#   (find-git-intro "2. A first test")
#   (find-git-intro "2. A first test" "/tmp/eevgitlib1.sh")



# «.variables»		(to "variables")
# «.makeanim»		(to "makeanim")
# «.makeanim-tests»	(to "makeanim-tests")
# «.latex»		(to "latex")
# «.latex-tests»	(to "latex-tests")
# «.why-library»	(to "why-library")
# «.eval»		(to "eval")
# «.eval-tests»		(to "eval-tests")


#                  _       _     _           
# __   ____ _ _ __(_) __ _| |__ | | ___  ___ 
# \ \ / / _` | '__| |/ _` | '_ \| |/ _ \/ __|
#  \ V / (_| | |  | | (_| | |_) | |  __/\__ \
#   \_/ \__,_|_|  |_|\__,_|_.__/|_|\___||___/
#                                            
# «variables»  (to ".variables")
ECHO=""
DELAY=50
DENSITY=200
VERBOSE=""
IGOPTIONS="height=5cm"
GEOMETRY="a5paper,landscape"


#                  _                    _           
#  _ __ ___   __ _| | _____  __ _ _ __ (_)_ __ ___  
# | '_ ` _ \ / _` | |/ / _ \/ _` | '_ \| | '_ ` _ \ 
# | | | | | | (_| |   <  __/ (_| | | | | | | | | | |
# |_| |_| |_|\__,_|_|\_\___|\__,_|_| |_|_|_| |_| |_|
#
# «makeanim»  (to ".makeanim")
# These functions call `qdpf' to glue several one-page/one-frame pdfs
# into a multi-page/multi-frame pdf can be used as a flipbook, and
# they call `convert' - from ImageMagick - to convert that flipbook to
# an animated gif.
#
# Note that:
#  "ECHO=and_run commandandargs" echoes commandandargs and runs it, and
#  "ECHO=echo commandandargs" echoes commandandargs instead of running it.
#
# The test block uses "ECHO=echo" to test the functions in this
# section in "dry run" mode. Compare with:
#   (find-node "(make)Instead of Execution" "-n" "--dry-run")
#                                                   
# See:
#   (find-bashnode "Environment" "parameter assignments")
#   (find-bashnode "Shell Parameter Expansion" "${@:7}")
#   (find-bashnode "Shell Parameter Expansion" "${PARAMETER:+WORD}")
#   (find-es "imagemagick" "pdf-to-animated-gif")
#   (find-es "ps" "qpdf")
#   (find-es "ps" "qpdf-merge")
#   (find-es "ps" "glue-pages")
#                                                   
and_run      () { echo $*; $*; }
cdr          () { echo ${@:2}; }
add_1zs      () { for i in $*; do echo $i 1-z; done; }
makeboth     () { $ECHO makeflipbook $(cdr $*);
                  $ECHO makeanim $1 $2; }
makeflipbook () { $ECHO qpdf --empty --pages $(add_1zs $(cdr $*)) -- $1; }
makeanim     () {
  $ECHO convert -alpha deactivate ${VERBOSE:+-verbose} \
                -delay $DELAY -loop 0 -density $DENSITY $2 $1
}

# «makeanim-tests»  (to ".makeanim-tests")
: <<'%%%%%'
* (eepitch-bash)
* (eepitch-kill)
* (eepitch-bash)
. mkanim1.sh
cdr     a b c d
add_1zs   b c d
ECHO=echo             makeflipbook      flipbook.pdf 1.pdf 2.pdf 3.pdf
ECHO=echo             makeanim anim.gif flipbook.pdf
ECHO=echo VERBOSE=1   makeanim anim.gif flipbook.pdf
ECHO=echo DENSITY=100 makeanim anim.gif flipbook.pdf
ECHO=echo DENSITY=100 makeboth anim.gif flipbook.pdf 1.pdf 2.pdf 3.pdf

%%%%%



#  _         _____   __  __
# | |    __ |_   _|__\ \/ /
# | |   / _` || |/ _ \\  / 
# | |__| (_| || |  __//  \ 
# |_____\__,_||_|\___/_/\_\
#                          
# «latex»  (to ".latex")
includegraphics0 () { echo "\\includegraphics[$IGOPTIONS]{$1}"; }
includegraphics1 () { echo "\\newpage \$$(includegraphics0 $1)\$"; }
includegraphics  () { for i in $*; do includegraphics1 $i; done; }
includegraphics_fulltex () {
  echo "\\documentclass[oneside]{article}"
  echo "\\usepackage{graphicx}"
  echo "\\usepackage[$GEOMETRY]{geometry}"
  echo "\\begin{document}"
  includegraphics $*
  echo "\\end{document}"
}

# «latex-tests»  (to ".latex-tests")
: <<'%%%%%'
* (eepitch-bash)
* (eepitch-kill)
* (eepitch-bash)
. mkanim1.sh
includegraphics0        001.pdf
includegraphics1        001.pdf
includegraphics         001.pdf 002.pdf
includegraphics_fulltex 001.pdf 002.pdf

%%%%%


#                  _ 
#   _____   ____ _| |
#  / _ \ \ / / _` | |
# |  __/\ V / (_| | |
#  \___| \_/ \__,_|_|
#                    
# «why-library»  (to ".why-library")
# «eval»         (to ".eval")
# `mkanim1.sh' is a _library_ that defines several variables and shell
# functions, but it ends with the
#
#   eval "$*"
#
# below, and that `eval' runs the arguments to `mkanim1.sh' in an
# environment in which all those variable and shell functions are
# defined. For example, consider these three lines:
#
#   [1] ./mkanim1.sh ECHO=echo makeboth anim.gif flipbook.pdf 001.pdf 002.pdf
#   [2]        eval "ECHO=echo makeboth anim.gif flipbook.pdf 001.pdf 002.pdf"
#   [3]              ECHO=echo makeboth anim.gif flipbook.pdf 001.pdf 002.pdf
#
# When we run [1] it defines several variables and functions,
# including `ECHO=' and `makeboth () {...}', and then it runs the
# `eval "$*"'; that `eval "$*"' runs [2], that runs [3] in that
# environment; the `ECHO=echo' overrides the `ECHO=' from here,
#
#   (to "variables")
#
# and then the `makeboth' just echoes this:
#
#   makeflipbook flipbook.pdf 001.pdf 002.pdf
#   makeanim anim.gif flipbook.pdf
#
# it does a "dry run", in this sense:
#
#   (find-node "(make)Instead of Execution" "-n" "--dry-run")
#
eval "$*"

# «eval-tests»  (to ".eval-tests")
: <<'%%%%%'
* (eepitch-bash)
* (eepitch-kill)
* (eepitch-bash)
./mkanim1.sh
./mkanim1.sh ECHO=echo makeboth anim.gif flipbook.pdf 001.pdf 002.pdf
./mkanim1.sh ECHO=echo makeflipbook      flipbook.pdf 001.pdf 002.pdf
./mkanim1.sh ECHO=echo makeanim anim.gif flipbook.pdf

%%%%%



# Local Variables:
# coding:  utf-8-unix
# End: