<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/assets/atom.xsl" type="text/xsl"?><feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="en-US"
	><title>Sacha Chua - tag - literate</title>
	<subtitle>Emacs, sketches, and life</subtitle>
	<link rel="self" type="application/atom+xml" href="https://sachachua.com/blog/tag/literate/feed/atom/index.xml" />
  <link rel="alternate" type="text/html" href="https://sachachua.com/blog/tag/literate" />
  <id>https://sachachua.com/blog/tag/literate/feed/atom/index.xml</id>
  <generator uri="https://11ty.dev">11ty</generator>
	<updated>2018-03-09T04:29:51Z</updated>
<entry>
		<title type="html">Using Org Mode, LaTeX, Beamer, and Medibang Paint to make a children's book</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2018/03/using-org-mode-latex-beamer-and-medibang-paint-to-make-a-childrens-book/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2018-03-09T09:32:49Z</updated>
    <published>2018-03-09T04:29:51Z</published>
    <category term="drawing" />
<category term="emacs" />
<category term="geek" />
<category term="org" />
<category term="publishing" />
		<id>https://sachachua.com/blog/?p=29175</id>
		<content type="html"><![CDATA[<div id="outline-container-org6409454" class="outline-2">
<h3 id="org6409454">
    Story<br>
  </h3>
<div class="outline-text-2" id="text-org6409454">
  </div>
<ul class="org-ul">
<li>
      <a id="org9701ba7"></a>
    </li>
<li>
      <a id="org57a96fc"></a>
    </li>
<li>
      <a id="org3a1c196"></a>
    </li>
<li>
      <a id="org3eeffad"></a>It's time to make a smoothie!
    </li>
<li>
      <a id="orgf08be21"></a>I pour blueberries into the blender.
    </li>
<li>
      <a id="orgda1294c"></a>Mama adds hemp seeds.
    </li>
<li>
      <a id="orgf46cf54"></a>I add spinach.
    </li>
<li>
      <a id="org7d1e726"></a>Mama blends it all with some water.
    </li>
<li>
      <a id="org43c7e6d"></a>I peel and add a banana.
    </li>
<li>
      <a id="org725371d"></a>I add some yogurt.
    </li>
<li>
      <a id="orgebc9ca4"></a>Mama blends it again.
    </li>
<li>
      <a id="org7e37b9b"></a>Yum yum!
    </li>
</ul>
</div>
<div id="outline-container-orgb0c778b" class="outline-2">
<h3 id="orgb0c778b">
    Links<br>
  </h3>
<div class="outline-text-2" id="text-orgb0c778b">
<ul class="org-ul">
<li>
        <a href="https://github.com/sachac/book-lets-make-a-smoothie/raw/master/print-duplex-short-edge-flip.pdf">PDF Ready for printing on 8.5&#8243;x14&#8243; paper in landscape mode, duplex, <b>short edge</b> flip</a>
      </li>
<li>
        <a href="https://github.com/sachac/book-lets-make-a-smoothie/raw/master/onscreen.pdf">PDF for onscreen viewing</a>
      </li>
<li>
        <a href="https://github.com/sachac/book-lets-make-a-smoothie">Code and drawings on Github</a>
      </li>
</ul></div>
</div>
<div id="outline-container-org616c361" class="outline-2">
<h3 id="org616c361">
    Thumbnails<br>
  </h3>
<div class="outline-text-2" id="text-org616c361">
<p>
      <img src="https://github.com/sachac/book-lets-make-a-smoothie/raw/master/thumbnails/spread0.png" alt="spread0.png"> <img src="https://github.com/sachac/book-lets-make-a-smoothie/raw/master/thumbnails/spread1.png" alt="spread1.png"> <img src="https://github.com/sachac/book-lets-make-a-smoothie/raw/master/thumbnails/spread2.png" alt="spread2.png"> <img src="https://github.com/sachac/book-lets-make-a-smoothie/raw/master/thumbnails/spread3.png" alt="spread3.png"> <img src="https://github.com/sachac/book-lets-make-a-smoothie/raw/master/thumbnails/spread4.png" alt="spread4.png"> <img src="https://github.com/sachac/book-lets-make-a-smoothie/raw/master/thumbnails/spread5.png" alt="spread5.png">
    </p></div>
</div>
<div id="outline-container-orgbe8ab57" class="outline-2">
<h3 id="orgbe8ab57">
    Process<br>
  </h3>
<div class="outline-text-2" id="text-orgbe8ab57">
  </div>
<ul class="org-ul">
<li>
      <a id="org3217ccc"></a>Prerequisites<p></p>
<div class="outline-text-3" id="text-org3217ccc">
<ul class="org-ul">
<li>
            ImageMagick
          </li>
<li>
            Texlive (probably)
          </li>
<li>
            latex-beamer
          </li>
<li>
            Org Mode and Emacs
          </li>
</ul></div>
</li>
<li>
      <a id="org243a8f6"></a>Set up Org Mode export to Beamer<p></p>
<div class="outline-text-3" id="text-org243a8f6">
  <div class="org-src-container">
    
<pre class="src src-emacs-lisp">(eval-after-load <span class="org-string">"ox-latex"</span>
  <span class="org-comment-delimiter">;; </span><span class="org-comment">update the list of LaTeX classes and associated header (encoding, etc.)</span>
  <span class="org-comment-delimiter">;; </span><span class="org-comment">and structure</span>
  '(add-to-list 'org-latex-classes
                `(<span class="org-string">"beamer"</span>
                  ,(concat <span class="org-string">"\\documentclass[presentation]{beamer}\n"</span>
                           <span class="org-string">"[DEFAULT-PACKAGES]"</span>
                           <span class="org-string">"[PACKAGES]"</span>
                           <span class="org-string">"[EXTRA]\n"</span>)
                  (<span class="org-string">"\\section{%s}"</span> . <span class="org-string">"\\section*{%s}"</span>)
                  (<span class="org-string">"\\subsection{%s}"</span> . <span class="org-string">"\\subsection*{%s}"</span>)
                  (<span class="org-string">"\\subsubsection{%s}"</span> . <span class="org-string">"\\subsubsection*{%s}"</span>))))
</pre>
<p></p></div>
<p></p></div>
</li>
<li>
      <a id="orge8ef105"></a>Set up image directories<p></p>
<div class="outline-text-3" id="text-orge8ef105">
<div class="org-src-container">
<pre class="src src-sh">mkdir text-pages blank-spreads drawn drawn-pages
</pre>
<p></p></div>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left">
<col class="org-left"> </colgroup>
<tbody>
<tr>
<td class="org-left">
                text-pages
              </td>
<td class="org-left">
                Will contain one image per page of just the plain text.
              </td>
</tr>
<tr>
<td class="org-left">
                blank-spreads
              </td>
<td class="org-left">
                Will contain text spreads ready for drawing
              </td>
</tr>
<tr>
<td class="org-left">
                drawn
              </td>
<td class="org-left">
                Export one image per spread (without the text layers) from your drawing program
              </td>
</tr>
<tr>
<td class="org-left">
                drawn-pages
              </td>
<td class="org-left">
                Will contain one image per page combining text and drawing
              </td>
</tr>
</tbody>
</table></div>
</li>
<li>
      <a id="org72d4505"></a>Tweak the header.tex<p></p>
<div class="outline-text-3" id="text-org72d4505">
<p>
          This file gets included in the LaTeX file for the children's book. Tweak it to change the appearance. In this example, I use black serif text at the bottom of the page.
        </p>
<div class="org-src-container">
<pre class="src src-latex"><span class="org-keyword">\geometry</span>{paperwidth=7in,paperheight=8.5in,left=0.5in,top=0.5in,right=0.5in,bottom=0.5in}
<span class="org-keyword">\setbeamercolor</span>{normal text}{fg=black,bg=white}
<span class="org-keyword">\setbeamercolor</span>{structure}{fg=black,bg=white}
<span class="org-keyword">\usefonttheme</span>{serif}
<span class="org-keyword">\setbeamertemplate</span>{frametitle}
{
  <span class="org-keyword">\begin</span>{<span class="org-function-name">center</span>}
  <span class="org-keyword">\vspace</span>{0.7<span class="org-keyword">\textheight</span>}                    
  <span class="org-keyword">\noindent</span>
  <span class="org-keyword">\insertframetitle</span>
  <span class="org-keyword">\end</span>{<span class="org-function-name">center</span>}
}
<span class="org-keyword">\usepackage</span>[noframe]{<span class="org-builtin">showframe</span>}
<span class="org-keyword">\renewcommand</span>{<span class="org-function-name">\maketitle</span>}{}
</pre>
<p></p></div>
<p></p></div>
</li>
<li>
      <a id="org234d2e1"></a>Write the story<p></p>
<div class="outline-text-3" id="text-org234d2e1">
<p>
          I used Org Mode to make it easy to write the story.
        </p>
<p>
          Some considerations:
        </p>
<ul class="org-ul">
<li>
            Because we're printing this as a saddle-stitched booklet, the number of lines should be a multiple of four. Sixteen is probably a good maximum.
          </li>
<li>
            The first heading is actually for the last page.
          </li>
<li>
            The second heading is for the cover page.
          </li>
<li>
            The third heading is for the first inner page, the fourth heading is for the second inner page, and so on.
          </li>
</ul>
<div class="org-src-container">
<pre class="src src-org"><span class="org-org-meta-line">#+OPTIONS:   TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc author:nil date:nil</span>
<span class="org-org-meta-line">#+OPTIONS: H:1</span>
<span class="org-org-meta-line">#+startup: beamer</span>
<span class="org-org-meta-line">#+LaTeX_CLASS: beamer</span>
<span class="org-org-meta-line">#+LaTeX_CLASS_OPTIONS: [20pt]</span>
<span class="org-org-meta-line">#+BEAMER_FRAME_LEVEL: 1</span>
<span class="org-org-meta-line">#+LATEX_HEADER: \input{header.tex}</span>
<span class="org-org-meta-line">#+PROPERTY: header-args :var pages=12</span>

<span class="org-org-level-1">* Story</span>

<span class="org-org-level-2">** </span>
<span class="org-org-level-2">** </span>
<span class="org-org-level-2">** </span>
<span class="org-org-level-2">** It's time to make a smoothie!</span>
<span class="org-org-level-2">** I pour blueberries into the blender.</span>
<span class="org-org-level-2">** Mama adds hemp seeds.</span>
<span class="org-org-level-2">** I add spinach.</span>
<span class="org-org-level-2">** Mama blends it all with some water.</span>
<span class="org-org-level-2">** I peel and add a banana.</span>
<span class="org-org-level-2">** I add some yogurt. </span>
<span class="org-org-level-2">** Mama blends it again.</span>
<span class="org-org-level-2">** Yum yum!</span>
</pre>
<p></p></div>
<p></p></div>
</li>
<li>
      <a id="org90e9adc"></a>Make the tex, PDF, page PNGs, and spread PNGs<p></p>
<div class="outline-text-3" id="text-org90e9adc">
<ol class="org-ol">
<li>
            Go to the subtree for the story and use <code>M-x org-export-dispatch</code> (<code>C-c C-e</code>) with the subtree option (<code>C-s</code>) to export it as a Beamer file (option <code>l b</code>).
          </li>
<li>
<p>
              Use <code>pdflatex</code> to convert the .tex to PDF.
            </p>
<div class="org-src-container">
<pre class="src src-sh">pdflatex index.tex
</pre>
<p></p></div>
</li>
<li>
<p>
              Create one PNG per text page with:
            </p>
<div class="org-src-container">
<pre class="src src-sh">convert -density 300 index.pdf -quality 100 text-pages/page%02d.png
</pre>
<p></p></div>
</li>
<li>
<p>
              Create spreads to draw on with:
            </p>
<div class="org-src-container">
<pre class="src src-sh">montage text-pages/page*.png -tile 2x1 -mode Concatenate blank-spreads/spread%d.png
</pre>
<p></p></div>
</li>
<li>
<p>
              Optionally, create a layered PSD with:
            </p>
<div class="org-src-container">
<pre class="src src-sh">convert blank-spreads/spread*.png <span class="org-string">\(</span> -clone 1,0 -background white -flatten -alpha off <span class="org-string">\)</span> -reverse spreads-for-drawing.psd
</pre>
<p></p></div>
</li>
</ol></div>
</li>
<li>
      <a id="orgaaa9750"></a>Draw<p></p>
<div class="outline-text-3" id="text-orgaaa9750">
<p>
          I imported the PNG layers into MediBang Paint on a Samsung Note 8 Android phone, and then:
        </p>
<ul class="org-ul">
<li>
            imported photos
          </li>
<li>
            traced them
          </li>
<li>
            painted and shaded them
          </li>
<li>
            hid the text layers
          </li>
<li>
            exported one PNG per spread to QuickPic, renamed them, and uploaded them to Dropbox, because I couldn't figure out how to export to Dropbox directly
          </li>
</ul>
<p>
          Layer folders were handy for organizing spread-related images. I couldn't seem to move all of the layers in a layer folder together on Android, but the iPad was able to do so. If I didn't have the iPad handy, I combined the layers by exporting a PNG and then importeing it back into MediBang Paint.
        </p>
<p>
          This was a decent setup that allowed me to draw and paint even when I was in bed nursing A- and waiting for her to fall asleep. I held the phone with one hand and rotated the canvas as needed so that it was easier for me to draw lines with my right. Because of the awkward position and the small screen size, the lines are not as smooth as I might like, but the important thing is that they're there. Whee! =)
        </p>
<p>
          It turns out to be possible to use the free MediBang Pro drawing program under Wine on Linux to import the PSD and save it to the cloud. I was also sometimes able to switch to drawing with iPad Pro with Pencil, but it was harder to find time to do that because that usually made A- want to draw too.
        </p>
<p>
          Anyway, after I drew and exported the PNGs, the next step was to…
        </p></div>
</li>
<li>
      <a id="orgaf276ec"></a>Convert the drawn spreads back to pages and combine them with the text<p></p>
<div class="outline-text-3" id="text-orgaf276ec">
<p>
          Here's some code that combines the drawing and the text. Keeping the drawing and the text separate until this stage (instead of exporting the PNGs with the text) makes it easier to change the text later by recreating the text PNGs and running this step.
        </p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(<span class="org-keyword">defun</span> <span class="org-function-name">my/combine-spread-drawing-and-text</span> (page num-pages)
  (<span class="org-keyword">let</span> ((gravity (<span class="org-keyword">if</span> (= (% page 2) 1) <span class="org-string">"West"</span> <span class="org-string">"East"</span>))
        (spread (/ (% page num-pages) 2)))
    (shell-command
      (format 
       (concat <span class="org-string">"convert </span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(</span></span><span class="org-string"> "</span>
               <span class="org-string">"drawn/spread%d.png -gravity %s "</span>
               <span class="org-string">"-chop 50%%x0 +repage </span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string"> "</span>
               <span class="org-string">"text-pages/page%02d.png -compose darken "</span>
               <span class="org-string">"-composite drawn-pages/page%02d.png"</span>)
       spread gravity page page))))

(<span class="org-keyword">cl-loop</span> for i from 0 to (1- pages) do
         (my/combine-spread-drawing-and-text i pages))
</pre>
<p></p></div>
<p></p></div>
</li>
<li>
      <a id="org49f7e1c"></a>Create print spreads for saddle-stitching<p></p>
<div class="outline-text-3" id="text-org49f7e1c">
<p>
          This code pairs up the drawn pages into a PDF that can be printed duplex. Make sure to choose the option to flip along the <b>short edge.</b> I hard-coded the page orders for 4-, 8-, 12-, and 16-page booklets.
        </p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(<span class="org-keyword">let*</span> ((page-order
        '((0 1 2 3)   <span class="org-comment-delimiter">; </span><span class="org-comment">hard-coded page sequences</span>
          (0 1 2 7 6 3 4 5)
          (0 1 2 11 10 3 4 9 8 5 6 7)
          (0 1 2 15 14 3 4 13 12 5 6 11 10 7 8 9)))
       (sequence
        (mapconcat (<span class="org-keyword">lambda</span> (d) (format <span class="org-string">"drawn-pages/page%02d.png"</span> d))
                   (elt page-order (1- (/ pages 4))) <span class="org-string">" "</span>)))
  (shell-command
   (format
    <span class="org-string">"montage %s -tile 2x1 -mode Concatenate print-duplex-short-edge-flip.pdf"</span>
    sequence)))
</pre>
<p></p></div>
<p></p></div>
</li>
<li>
      <a id="org0387a9c"></a>Print and bind<p></p>
<div class="outline-text-3" id="text-org0387a9c">
<p>
          After printing and folding the book, I used tape to make the book hold together. Tada!
        </p></div>
</li>
<li>
      <a id="org1b2ccd7"></a>Create on-screen PDF for reading<p></p>
<div class="outline-text-3" id="text-org1b2ccd7">
<p>
          A little bit of manipulation so that the last page is in the right place:
        </p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(shell-command
  (format <span class="org-string">"convert %s onscreen.pdf"</span> 
    (mapconcat 'identity (<span class="org-keyword">cl-loop</span> for i from 1 to pages 
      collect (format <span class="org-string">"drawn-pages/page%02d.png"</span> (% i pages))) <span class="org-string">" "</span>)))
</pre>
<p></p></div>
<p></p></div>
</li>
<li>
      <a id="orgb0d1e9d"></a>Create thumbnails of spreads<p></p>
<div class="outline-text-3" id="text-orgb0d1e9d">
<div class="org-src-container">
<pre class="src src-emacs-lisp">(<span class="org-keyword">cl-loop</span>
 for i from 0 to (1- (/ pages 2)) do 
 (shell-command
  (format 
   (concat <span class="org-string">"convert "</span>
           <span class="org-string">"</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(</span></span><span class="org-string"> blank-spreads/spread%d.png "</span>
           <span class="org-string">"drawn/spread%d.png "</span>
           <span class="org-string">"-compose darken "</span>
           <span class="org-string">"-resize %dx -flatten </span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string"> "</span>
           <span class="org-string">"</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(</span></span><span class="org-string"> +clone -background black -shadow 50x1+%d+%d </span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string"> "</span>
           <span class="org-string">"+swap -compose src-over -composite "</span>
           <span class="org-string">"thumbnails/spread%d.png"</span>)
   i i width shadow shadow i)))
</pre>
<p></p></div>
<p></p></div>
</li>
<li>
      <a id="org06639fa"></a>Ideas for next steps<p></p>
<div class="outline-text-3" id="text-org06639fa">
<ul class="org-ul">
<li>
            Better thumbnails for easy previews
          </li>
<li>
            PDF for online reading
          </li>
<li>
            More layout possibilities (photos, verses, etc.)
          </li>
<li>
            Smaller books: <p></p>
<ul class="org-ul">
<li>
                crop marks on a full-page print, or
              </li>
<li>
                the right imposition rules to print more pages on a sheet
              </li>
</ul>
</li>
</ul></div>
</li>
</ul>
</div>
<p>You can <a href="https://sachachua.com/blog/2018/03/using-org-mode-latex-beamer-and-medibang-paint-to-make-a-childrens-book/#comment">view 4 comments</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2018%2F03%2Fusing-org-mode-latex-beamer-and-medibang-paint-to-make-a-childrens-book%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry>
</feed>