<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/assets/rss.xsl" type="text/xsl"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"

>
<channel>
	<title>Sacha Chua - category - geek</title>
	<atom:link href="https://sachachua.com/blog/category/geek/feed/index.xml" rel="self" type="application/rss+xml" />
	<atom:link href="https://sachachua.com/blog/category/geek" rel="alternate" type="text/html" />
	<link>https://sachachua.com/blog/category/geek/feed/index.xml</link>
	<description>Emacs, sketches, and life</description>
  
	<lastBuildDate>Fri, 09 Oct 2026 18:58:09 GMT</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>daily</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>11ty</generator>
  <item>
		<title>Des commandes vocales pour ajouter des tâches sur Emacs</title>
		<link>https://sachachua.com/blog/2026/10/des-commandes-vocales-sur-emacs-pour-ajouter-des-taches/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Wed, 07 Oct 2026 19:52:45 GMT</pubDate>
    <category>emacs</category>
<category>org</category>
<category>speech</category>
<category>speech-recognition</category>
<category>french</category>
		<guid isPermaLink="false">https://sachachua.com/blog/2026/10/des-commandes-vocales-sur-emacs-pour-ajouter-des-taches/</guid>
		<description><![CDATA[<p>
</p><div class="yt-video"><iframe width="456" height="315" title="YouTube video player" src="https://www.youtube-nocookie.com/embed/rGAXW9S4AiE?enablejsapi=1" frameborder="0" allowfullscreen=""></iframe><a href="https://youtu.be/rGAXW9S4AiE">Watch on YouTube</a></div>
<p></p>

<p>
Liens :
</p>

<ul class="org-ul">
<li><a href="https://sachachua.com/blog/2026/09/experimenting-with-orukeet-for-speech-recognition/">Orukeet</a> pour la reconnaissance vocale parce qu'il est assez rapide et assez précis.</li>
<li><a href="https://github.com/sachac/whisper.el/">sachac/whisper.el</a></li>
<li><a href="https://codeberg.org/sachac/speech-input">speech-input</a></li>
</ul>

<p>
</p><div class="full-transcript"><p></p><div class="transcript-heading"><span class="audio-time" data-start="0.000000">0:00</span> <strong>Introduction</strong></div><p></p><span class="audio-time caption" data-speaker="" data-start="0.000000" data-stop="3.047000">Je veux vous présenter ma petite expérience</span> <span class="audio-time caption" data-speaker="" data-start="3.047000" data-stop="4.879000">de la reconnaissance vocale</span> <span class="audio-time caption" data-speaker="" data-start="4.879000" data-stop="6.778000">pour dicter dans Emacs</span> <span class="audio-time caption" data-speaker="" data-start="6.778000" data-stop="8.477000">et pour les contrôler.</span> <span class="audio-time caption" data-speaker="" data-start="8.477000" data-stop="10.444000">J'utilise le modèle Orukeet</span> <span class="audio-time caption" data-speaker="" data-start="10.444000" data-stop="12.876000">pour la reconnaissance vocale parce qu'il est</span> <span class="audio-time caption" data-speaker="" data-start="12.876000" data-stop="15.415000">assez rapide et assez précis.</span> <span class="audio-time caption" data-speaker="" data-start="15.415000" data-stop="18.335000">Je l'intègre dans Emacs en utilisant</span> <span class="audio-time caption" data-speaker="" data-start="18.335000" data-stop="22.034000">mes bibliothèques sachac/whisper.el et speech-input.</span> <span class="audio-time caption" data-speaker="" data-start="22.034000" data-stop="24.427000">J'ai récemment créé des commandes vocales</span> <span class="audio-time caption" data-speaker="" data-start="24.427000" data-stop="28.273000">pour ajouter des éléments à ma liste de tâches.</span> <span class="audio-time caption" data-speaker="" data-start="28.273000" data-stop="31.326000">C'est étonnement utile parce que ça réduit</span> <span class="audio-time caption" data-speaker="" data-start="31.326000" data-stop="34.325000">la charge cognitive liée à la mémorisation</span> <span class="audio-time caption" data-speaker="" data-start="34.325000" data-stop="35.951000">des raccourcis clavier.</span> <span class="audio-time caption" data-speaker="" data-start="35.951000" data-stop="37.551000">Je vais vous montrer cela.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="37.000000">0:37</span> <strong>Ajouter des tâches
</strong></div><p></p><a href="https://sachachua.com/blog/2026/10/des-commandes-vocales-sur-emacs-pour-ajouter-des-taches/2026-10-07_14-11-23-00-00-58-833.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/10/des-commandes-vocales-sur-emacs-pour-ajouter-des-taches/2026-10-07_14-11-23-00-00-58-833.jpg" alt="image from video " data-time=""></a><span class="audio-time caption" data-speaker="" data-start="37.551000" data-stop="40.124000">Je presse la touche zéro du pavé numérique</span> <span class="audio-time caption" data-speaker="" data-start="40.124000" data-stop="42.390000">avant et après avoir dit</span> <span class="audio-time caption" data-speaker="" data-start="42.390000" data-stop="46.422000">« Rappelle-moi demain de préparer</span> <span class="audio-time caption" data-speaker="" data-start="46.422000" data-stop="48.668000">une présentation pour Emacs Paris</span> <span class="audio-time caption" data-speaker="" data-start="48.668000" data-stop="58.108000">sur les commandes vocales. »</span> <span class="audio-time caption" data-speaker="" data-start="58.108000" data-stop="63.228000">La fonction crée une tâche dans ma boîte de réception.</span> <span class="audio-time caption" data-speaker="" data-start="63.228000" data-stop="66.428000">La tâche est planifiée pour demain.</span> <span class="audio-time caption" data-speaker="" data-start="66.428000" data-stop="67.621000">Il y a un lien</span> <span class="audio-time caption" data-speaker="" data-start="67.621000" data-stop="69.900000">vers l'enregistrement</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="69.000000">1:09</span> <strong>D'autres dates
</strong></div><p></p><a href="https://sachachua.com/blog/2026/10/des-commandes-vocales-sur-emacs-pour-ajouter-des-taches/2026-10-07_14-11-23-00-02-26-667.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/10/des-commandes-vocales-sur-emacs-pour-ajouter-des-taches/2026-10-07_14-11-23-00-02-26-667.jpg" alt="image from video " data-time=""></a><span class="audio-time caption" data-speaker="" data-start="69.900000" data-stop="73.494000">« Rappelez-moi demain de préparer une présentation</span> <span class="audio-time caption" data-speaker="" data-start="73.494000" data-stop="81.680000">pour Emacs Paris sur les commandes vocales »,</span> <span class="audio-time caption" data-speaker="" data-start="81.680000" data-stop="88.940000">la capture d'écran et</span> <span class="audio-time caption" data-speaker="" data-start="88.940000" data-stop="90.240000">le contexte de tâche.</span> <span class="audio-time caption" data-speaker="" data-start="90.240000" data-stop="93.294000">Ça m'aident si j'ai été mal comprise</span> <span class="audio-time caption" data-speaker="" data-start="93.294000" data-stop="96.239000">ou si j'ai besoin de contexte.</span> <span class="audio-time caption" data-speaker="" data-start="96.239000" data-stop="97.327000">De la même manière,</span> <span class="audio-time caption" data-speaker="" data-start="97.327000" data-stop="100.526000">je peux dire « Rappelle-moi la semaine prochaine</span> <span class="audio-time caption" data-speaker="" data-start="100.526000" data-stop="110.237000">de faire la paperasse pour l'école. »</span> <span class="audio-time caption" data-speaker="" data-start="110.237000" data-stop="112.444000">« Rappelle-moi aujourd'hui de créer</span> <span class="audio-time caption" data-speaker="" data-start="112.444000" data-stop="119.376000">une vidéo sur mes commandes vocales. »</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="119.000000">1:59</span> <strong>Basculer à une tâche
</strong></div><p></p><a href="https://sachachua.com/blog/2026/10/des-commandes-vocales-sur-emacs-pour-ajouter-des-taches/2026-10-07_14-11-23-00-02-45-867.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/10/des-commandes-vocales-sur-emacs-pour-ajouter-des-taches/2026-10-07_14-11-23-00-02-45-867.jpg" alt="image from video " data-time=""></a><span class="audio-time caption" data-speaker="" data-start="119.376000" data-stop="122.296000">Je peux aussi créer une tâche et déclencher</span> <span class="audio-time caption" data-speaker="" data-start="122.296000" data-stop="125.455000">le suivi du temps (ou clock in).</span> <span class="audio-time caption" data-speaker="" data-start="125.455000" data-stop="127.095000">Par exemple, je peux dire</span> <span class="audio-time caption" data-speaker="" data-start="127.095000" data-stop="135.474000">« Commence à implémenter la génération des questions. »</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="135.000000">2:15</span> <strong>Retrouver le fil de mes pensées
</strong></div><p></p><a href="https://sachachua.com/blog/2026/10/des-commandes-vocales-sur-emacs-pour-ajouter-des-taches/2026-10-07_14-11-23-00-03-07-000.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/10/des-commandes-vocales-sur-emacs-pour-ajouter-des-taches/2026-10-07_14-11-23-00-03-07-000.jpg" alt="image from video " data-time=""></a><span class="audio-time caption" data-speaker="" data-start="135.474000" data-stop="138.107000">Si je perds le fil de mes pensées :</span> <span class="audio-time caption" data-speaker="" data-start="138.107000" data-stop="142.307000">« j'en étais où ? »</span> <span class="audio-time caption" data-speaker="" data-start="142.307000" data-stop="147.227000">Ça m'affiche les tâches récentes.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="147.000000">2:27</span> <strong>Je faisais quoi ?
</strong></div><p></p><a href="https://sachachua.com/blog/2026/10/des-commandes-vocales-sur-emacs-pour-ajouter-des-taches/2026-10-07_14-11-23-00-03-27-333.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/10/des-commandes-vocales-sur-emacs-pour-ajouter-des-taches/2026-10-07_14-11-23-00-03-27-333.jpg" alt="image from video " data-time=""></a><span class="audio-time caption" data-speaker="" data-start="147.227000" data-stop="150.747000">« Je faisais quoi ? »</span> <span class="audio-time caption" data-speaker="" data-start="150.747000" data-stop="158.846000">Ça bascule sur la tâche actuelle.</span> <span class="audio-time caption" data-speaker="" data-start="158.846000" data-stop="163.226000">Voilà des commandes vocales pour ajouter des tâches.</span></div>
<p></p>
<div><a href="https://sachachua.com/blog/2026/10/des-commandes-vocales-sur-emacs-pour-ajouter-des-taches/index.org">View Org source for this post</a></div>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F10%2Fdes-commandes-vocales-sur-emacs-pour-ajouter-des-taches%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>]]></description>
		</item><item>
		<title>Emacs Carnival Oct 2026: Exploring keys and voice input in Emacs</title>
		<link>https://sachachua.com/blog/2026/10/emacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Wed, 07 Oct 2026 12:18:31 GMT</pubDate>
    <category>emacs</category>
<category>speech-recognition</category>
<category>speech</category>
		<guid isPermaLink="false">https://sachachua.com/blog/2026/10/emacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs/</guid>
		<description><![CDATA[<div class="sticky-toc" id="orgf14a149">
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="https://sachachua.com/blog/feed/index.xml#emacs-carnival-exploring-keys-and-voice-input-in-emacs-making-more-use-of-the-keyboard">Making more use of the keyboard</a></li>
<li><a href="https://sachachua.com/blog/feed/index.xml#emacs-carnival-exploring-keys-and-voice-input-in-emacs-some-reasons-why-i-m-curious-about-speech-recognition">Some reasons why I'm curious about speech recognition</a></li>
<li><a href="https://sachachua.com/blog/feed/index.xml#emacs-carnival-exploring-keys-and-voice-input-in-emacs-quick-benefits-from-voice-commands">Quick benefits from voice commands</a></li>
<li><a href="https://sachachua.com/blog/feed/index.xml#emacs-carnival-exploring-keys-and-voice-input-in-emacs-prior-work-on-voice-control-of-emacs-voicemacs-emacslisten">Prior work on voice control of Emacs: Voicemacs, Emacslisten</a></li>
<li><a href="https://sachachua.com/blog/feed/index.xml#emacs-carnival-exploring-keys-and-voice-input-in-emacs-imagining-a-hybrid-approach-keyboard-voice-even-mouse-stylus">Imagining a hybrid approach: keyboard, voice, even mouse/stylus?</a></li>
</ul>
</div>

</div>
<div id="outline-container-emacs-carnival-exploring-keys-and-voice-input-in-emacs-making-more-use-of-the-keyboard" class="outline-3">
<h3 id="emacs-carnival-exploring-keys-and-voice-input-in-emacs-making-more-use-of-the-keyboard"><a href="https://sachachua.com/blog/feed/index.xml#emacs-carnival-exploring-keys-and-voice-input-in-emacs-making-more-use-of-the-keyboard">Making more use of the keyboard</a></h3>
<div class="outline-text-3" id="text-emacs-carnival-exploring-keys-and-voice-input-in-emacs-making-more-use-of-the-keyboard">
<p>
October's Emacs Carnival theme "<a href="https://www.emacswiki.org/emacs/CarnivalOctober2026">Are keyboards and M-x here to stay?</a>" is a good nudge to think about the voice interface I've been experimenting with and where I want to take it.
</p>

<p>
<a href="https://chrismaiorana.com/m-x-magic/">Like Chris Maiorana</a>, I love the way Emacs's <code>M-x</code> (<code>execute-extended-command</code>) allows me to call any command by name.
It means that I can call commands or come up with my own commands without worrying about assigning them to keyboard shortcuts or making sense of where to place them in a hierarchical menu.
With flexible completion via the <a href="https://github.com/minad/vertico">vertico</a> and <a href="https://github.com/oantolin/orderless">orderless</a> packages, I don’t even need to type in the full name of the command or remember the words in the right order.
If I still can’t remember the command, it’s easy enough to use defalias to make my own nickname for it.
</p>


<figure id="orga9cf8e9">
<a href="https://sachachua.com/blog/2026/10/emacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs/2026-10-06_11-04-07.png"><img src="https://sachachua.com/blog/2026/10/emacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs/2026-10-06_11-04-07.png" alt="2026-10-06_11-04-07.png"></a>

<figcaption><span class="figure-number">Figure 1: </span>I can filter M-x to show just my custom commands</figcaption>
</figure>

<p>
I tend to limit keyboard shortcuts to only my most common commands.
Everything else is hard to practise enough so that it sticks in my muscle memory.
Even with <a href="https://github.com/minad/marginalia">marginalia</a> showing me keybindings when I use <code>M-x</code> and <a href="https://emacsredux.com/blog/2026/07/18/which-key-is-now-built-in/">which-key</a> showing me hints when I pause, it doesn’t sink in.
</p>


<figure id="orgc830000">
<a href="https://sachachua.com/blog/2026/10/emacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs/2026-10-06_11-05-00.png"><img src="https://sachachua.com/blog/2026/10/emacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs/2026-10-06_11-05-00.png" alt="2026-10-06_11-05-00.png"></a>

<figcaption><span class="figure-number">Figure 2: </span>Marginalia shows keybindings</figcaption>
</figure>

<p>
Maybe I could use <a href="https://github.com/federicotdn/key-quiz">key-quiz</a> to drill a small number of keyboard shortcuts I’m actively working on learning, or modify <code>help-quick-sections</code> to show me reminders when I use <code>C-h C-q</code> (<code>help-quick-toggle</code>).
</p>

<p>
Getting one keyboard shortcut to do the right thing in different
contexts is great because it means fewer shortcuts to memorize. Sometimes I can do that by binding the right functions to different mode maps with <code>bind-key</code>, like the way my <a href="https://sachachua.com/blog/2025/09/adding-org-mode-link-awesomeness-elsewhere-my-org-insert-link-dwim/">sacha-org-insert-link-dwim</a> uses the right link syntax in Markdown or OddMuse too.
I also like the context-sensitive keyboard shortcuts I get from <a href="https://github.com/oantolin/embark">Embark</a>.
I find myself using a handful of those regularly, and <code>C-.</code>
(<code>embark-act</code>) starts a bunch of shortcuts across different types of
things: <code>i</code> to insert, <code>w</code> to copy, and so on.
For example, I know <code>C-x C-f</code> (<code>find-file</code>) will let me select a file to open.
Instead of opening it, I can use <code>C-. i</code> to insert the filename into the buffer.
</p>

<p>
Simpler keyboard shortcuts help. I rarely use the numpad on my laptop keyboard, so those keys can be mapped to functions that don't need to be followed by lots of typing. For example, 0 is a large button. I use it to start and stop speech recognition. Actually, I bind f9 in Emacs to <code>sacha-whisper-run-at-point</code>, and I bind numpad-0 as a keyboard shortcut in KDE (my window manager) instead of just in Emacs so that it's available globally. I'm still on X11 instead of Wayland. The shell script <a href="https://sachachua.com/blog/2026/10/emacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs/xdotool-emacs">xdotool-emacs</a> focuses Emacs briefly and sends the keys, and the shortcut is set to <code>/home/sacha/bin/xdotool-emacs key &#45;&#45;clearmodifiers F9</code>. I do that instead of using emacsclient because emacsclient starts a different buffer, and I might want to keep the context. My <a href="https://sachachua.com/dotemacs#multimedia-whisper">sacha-whisper-maybe-type</a> function detects if Emacs is not the focused application and types the text if it isn't, which means I can use it as keyboard input for oher applications while still taking advantage of the corrections and commands I've defined in Emacs. An easy-to-press global shortcut means I can use it from anywhere, even when my foreground app is the browser or another application.
</p>

<p>
An additional modifier opens up more possibilities for keyboard shortcuts near the regular typing position. My Windows key acts like a Super modifier. I've set it up as a one-shot modifier with Kanata so that I can either hold it down to access more shortcuts or tap it to treat it like a leader key.
</p>

<p>
There are quite a few commands for which neither M-x nor keyboard shortcuts feel like the right fit: things I want to do faster or more fluidly than M-x, but which I don't do often enough to memorize a good shortcut for. I've been experimenting a bit with voice input, and I really like it.
</p>
</div>
</div>
<div id="outline-container-emacs-carnival-exploring-keys-and-voice-input-in-emacs-some-reasons-why-i-m-curious-about-speech-recognition" class="outline-3">
<h3 id="emacs-carnival-exploring-keys-and-voice-input-in-emacs-some-reasons-why-i-m-curious-about-speech-recognition"><a href="https://sachachua.com/blog/feed/index.xml#emacs-carnival-exploring-keys-and-voice-input-in-emacs-some-reasons-why-i-m-curious-about-speech-recognition">Some reasons why I'm curious about speech recognition</a></h3>
<div class="outline-text-3" id="text-emacs-carnival-exploring-keys-and-voice-input-in-emacs-some-reasons-why-i-m-curious-about-speech-recognition">
<ul class="org-ul">
<li>I could use more practice speaking, since I don't talk to a lot of people in real life.
<ul class="org-ul">
<li><b>English:</b> Videos and livestreams can be a way to share interesting things and start conversations. I want to organize my thoughts, improve my breathing, and reduce my stutters and false starts. That will make the audio more pleasant to listen to. Dictating to my computer gives me more practice. It also makes things easier to livestream if I can reuse my speech as input.</li>
<li><p>
<b>French:</b> I like challenging my brain and I want to help the kiddo learn it too. Improving my speaking will also make it easier for me to listen to myself and close the feedback loop. Maybe I can even use speech recognition to give me feedback and increase motivation while speaking, like <a href="https://sachachua.com/dotemacs#writing-and-editing-speech-recognition-reporting-speaking-stats-balance">keeping track of words or phrases I want to use</a>. When I use them in conversation, the buffer can cross them off the list, which lets me focus on the words remaining.
</p>

<figure id="org07b8286">
<img src="https://sachachua.com/blog/2026/10/using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time/2026-10-07_07-33-03.png" alt="2026-10-07_07-33-03.png">

<figcaption><span class="figure-number">Figure 3: </span>Screenshot showing balance and target words</figcaption>
</figure></li>
</ul></li>
<li>Dictation can capture ideas quickly, with more natural wording, especially since typing sometimes gets messed up on my computer.</li>
<li>Voice interfaces might let me reduce some kinds of task friction or work hands-free. For example, I like setting timers by voice on my phone while cooking. It might be interesting to be able to dictate a draft while knitting or hand-sewing.</li>
<li>Brain fog is something I will likely need to deal with. I got a preview of it thanks to the sleep deprivation of early parenting. I know that brain fog is probably going to happen around menopause, it will probably also be part of aging, and it's a common symptom of long COVID which I might still end up getting despite my precautions. I could get into an accident and hurt my hands. I like Emacs and I want to be able to keep using it even if cognitive or physical changes make it harder to remember or use lots of keyboard shortcuts. If I start playing around with this now, the capabilities and the habits will be there when I need it.</li>
<li>Other people are already dealing with those kinds of physical or cognitive constraints, so things I figure out might be useful for other people.</li>
<li>A global shortcut for voice notes and commands let me quickly dash off a reminder before I take off. I don't have to find Emacs and go through my Org capture templates.</li>
<li>It's fun. I like saying "Prepare for take-off" and having Emacs get ready for a spontaneous stream by updating YouTube using my current Org Mode subtree title and description. I like seeing if my dictionary of substitutions can fix the commonly misrecognized words. Saying "I command you to&hellip;" to get Emacs to do a M-x command is totally inefficient but also playful, and silly things stick in my brain better thanks to the mnemonic advantage of humor. My brain likes that kind of novelty.</li>
</ul>

<p>
For context, I use Linux on a Lenovo P52 laptop (manufactured 2018, 64 GB RAM but hardly any GPU), and I have an Android phone. I like writing regular text, Emacs Lisp, and some Python and JavaScript. I'm slowly starting to have more focused time now that the kiddo is in virtual school, although it's still broken up by recess and lunch. I will probably have an increasing amount of focused time over the next few years.
</p>
</div>
</div>
<div id="outline-container-emacs-carnival-exploring-keys-and-voice-input-in-emacs-quick-benefits-from-voice-commands" class="outline-3">
<h3 id="emacs-carnival-exploring-keys-and-voice-input-in-emacs-quick-benefits-from-voice-commands"><a href="https://sachachua.com/blog/feed/index.xml#emacs-carnival-exploring-keys-and-voice-input-in-emacs-quick-benefits-from-voice-commands">Quick benefits from voice commands</a></h3>
<div class="outline-text-3" id="text-emacs-carnival-exploring-keys-and-voice-input-in-emacs-quick-benefits-from-voice-commands">
<p>
I love the way voice reduces context shifts. For example, some of my most-used voice commands are:
</p>

<ul class="org-ul">
<li><p>
remind me [today/tomorrow/next week/next month/someday] to&hellip;: capture and schedule the task; include an Org link and screenshot for context, and link to the audio recording in case the text was misrecognized
</p>


<figure id="org3080bba">
<a href="https://sachachua.com/blog/2026/10/emacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs/2026-10-07_10-00-55.png"><img src="https://sachachua.com/blog/2026/10/emacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs/2026-10-07_10-00-55.png" alt="2026-10-07_10-00-55.png"></a>

<figcaption><span class="figure-number">Figure 4: </span>Captured tasks have an audio recording, a screenshot, and a link</figcaption>
</figure></li>

<li>switch to&hellip;: capture the task and immediately clock into it</li>
<li>what was I doing?: jump to the current task</li>
<li><p>
where was I?: show recently-clocked tasks
</p>

<figure id="orgb00fc87">
<a href="https://sachachua.com/blog/2026/10/emacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs/2026-10-07_10-02-00.png"><img src="https://sachachua.com/blog/2026/10/emacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs/2026-10-07_10-02-00.png" alt="2026-10-07_10-02-00.png"></a>

<figcaption><span class="figure-number">Figure 5: </span>This is the same as C-u M-x org-clock-goto</figcaption>
</figure></li>
</ul>

<p>
I don't have to think about which keys I've configured in <code>org-capture-templates</code>. I just use a natural phrase.
</p>

<p>
I've defined "open &hellip;" to open things from my <a href="https://sachachua.com/dotemacs/index.html#org-bookmarks">bookmarked links stored in an Org file</a>. Because my numpad-0 keybinding works from anywhere, I can even use it to open sites or capture notes while looking at my browser.
</p>

<p>
Because Emacs can interact with lots of other applications, I can even experiment with controlling those applications by voice. For example, I use obs-websocket.el to control OBS for streaming or recording a video. Using "Let's go live" and "Over and out" to start or stop streaming or "Start recording" and "Stop recording" to manage the recording means I can do that without needing to find the right window. I stream with a 10-second delay so that there's a little bit of time to catch any private information that's been accidentally shared on the screen. My new "panic" command lets me discard that delay and interrupt the stream by using an OBS keyboard shortcut to kill the stream immediately, even if I'm probably not going to remember that exact keyboard shortcut when I'm stressed. It should be a little easier to remember that than a keyboard shortcut I hardly ever use or a menu item that is a really small target (and my Emacs might not even be my foreground app).
</p>

<p>
For regular dictation, I'm experimenting with having it automatically place each sentence on a new line or list item. This makes it easy to reorganize in Org. I can refill it into a paragraph when I'm done.
</p>

<p>
I still have to deal with the limits of my memory, of course.
I have a "what can I say" command that opens up an Org file with my notes. I keep this as a manual note instead of just dumping the contents of my <code>sacha-whisper-commands</code> variable so that I can prioritize the things I'm trying to build as habits.
</p>

<p>
<a href="https://sachachua.com/dotemacs#writing-and-editing-speech-recognition-slowly-building-speech-based-commands-for-emacs">Here's the part of my config that sets up some speech commands</a>.
</p>

<p>
I might want more complex grammar someday for things that regular expressions can't easily handle.
That's something other projects have done a good job of figuring out.
</p>
</div>
</div>
<div id="outline-container-emacs-carnival-exploring-keys-and-voice-input-in-emacs-prior-work-on-voice-control-of-emacs-voicemacs-emacslisten" class="outline-3">
<h3 id="emacs-carnival-exploring-keys-and-voice-input-in-emacs-prior-work-on-voice-control-of-emacs-voicemacs-emacslisten"><a href="https://sachachua.com/blog/feed/index.xml#emacs-carnival-exploring-keys-and-voice-input-in-emacs-prior-work-on-voice-control-of-emacs-voicemacs-emacslisten">Prior work on voice control of Emacs: Voicemacs, Emacslisten</a></h3>
<div class="outline-text-3" id="text-emacs-carnival-exploring-keys-and-voice-input-in-emacs-prior-work-on-voice-control-of-emacs-voicemacs-emacslisten">
<p>
There's been a lot of good work on voice input over the years, especially since a number of Emacs users have a hard time with or would like to avoid repetitive stress injury. In addition to the innumerable projects that let you use Whisper or similar speech recognition engines to dictate prose, there are also a few projects that use a constrained vocabulary to more reliably control Emacs. Two projects in this area are based on the <a href="https://talonvoice.com/">Talon</a> voice control system: <a href="https://github.com/jcaw/voicemacs">Voicemacs</a> and <a href="https://emacslisten.org/">Emacslisten</a>.
</p>

<ul class="org-ul">
<li>The <a href="https://github.com/talonhub/community">Talon community hub</a> defines some Emacs commands. I think it simulates keyboard input and assumes that you have <a href="https://github.com/lewang/flx">flx</a> or some other fuzzy completion matching so that input like <code>M-x t-d-on-e</code> runs <code>toggle-debug-on-error</code>, as defined in <a href="https://github.com/talonhub/community/blob/main/apps/emacs/emacs_commands.csv">community/apps/emacs/emacs_commands.csv</a>. I seem to be having a hard time with getting orderless to do that with <code>orderless-flex</code>, so I'm just going to remove that column of the CSV from my <a href="https://sachachua.com/blog/2026/10/emacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs/emacs_commands.csv">emacs_commands.csv</a>.</li>
<li><a href="https://emacslisten.org/">Emacslisten</a> uses <a href="https://github.com/ErikPrantare/phony.el">Emacs Lisp macros</a> to define the command vocabulary. <a href="https://github.com/ErikPrantare/cursorfree.el">Cursorfree</a> defines a whole bunch of them, using <a href="https://github.com/ErikPrantare/hatty.el">hatty</a> for voice navigation within a buffer.</li>
<li><a href="https://github.com/jcaw/voicemacs">Voicemacs</a> defines its commands in Python in the user's Talon config (<a href="https://github.com/jcaw/talon_config/tree/master/emacs">see example</a>). It feels fairly complex, like it assumes it's being cloned as your <code>~/.talon/user</code> directory. It lets Emacs and Talon communicate via RPC to send additional context. It also extends some things like dired and company to make them more voice-friendly.</li>
</ul>

<p>
I'm new to both projects, so I'm not sure if I'm reading this right, but I think I might be able to use Emacslisten to define voice commands with Emacs Lisp, and then maybe someday use Voicemacs to provide richer context for some of those commands. For example, Voicemacs can list snippets, but I'm not quite sure how to use that yet.
</p>

<p>
It looks like I can use Talon for commands and my whisper.el setup for regular dictation at the same time. The Pipewire virtual sinks help with that, I think, since the programs don't have to have an exclusive lock on the audio device. This means that I can explore the kinds of vocabularies that people have set up while also taking advantage of greater accuracy and ease of correction in my whisper dictation workflow. I think I can use the Talon process socket to turn off recognition when I want to dictate using my whisper.el setup, and then I can turn it back on afterwards.
</p>

<p>
A note about the underlying speech recognition: <a href="https://talonvoice.com/">Talon</a> is cross-platform and free, but not open source. Subscribing to Talon (CAD 36/month) lets you use a Conformer + Whisper hybrid engine that uses whisper-large for more accuracy, but that's a bit on the expensive side for me. <a href="https://github.com/dictation-toolbox/dragonfly">Dragonfly</a> is a free open source engine that can use Kaldi or CMU Pocket Sphinx for speech recognition, but I'm not sure what the performance is like.
</p>

<p>
Interestingly, because Talon simulates keystrokes, using the commands from the community set means keys sometimes arrive out of order on my computer. "split solo" is supposed to run <code>M-x delete-other-windows</code>, but it sometimes ends up sending <code>M-x delete-other-wnidows</code> instead. This is the same sort of annoyance that gets in the way of typing quickly on my computer. Keystrokes get processed out of order when the CPU gets busy, which is part of the reason why I find dictation to be more reliable than typing sometimes. I should fix that someday, but my attempts so far aren't working. (I wonder if it has something to do with the GPU under Linux; maybe I should drop back down to CPU only since it turns out I can't use the GPU for much anyway.) Quick fix, let's try adding a brief delay in my <a href="https://sachachua.com/blog/2026/10/emacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs/settings.talon">settings.talon</a>:
</p>

<pre class="example" id="org4ab5427">
settings():
    # Adds a small pause (in ms) between each character typed
    insert_wait = 5

    # Ensures modifiers (Shift/Ctrl) don't un-latch too fast
    key_wait = 1.0
</pre>

<p>
I think Voicemacs uses a sevver and and Emacslisten uses emacsclient to communicate with Emacs directly, so they probably won't run into this keystroke problem.
</p>

<p>
It might be interesting to see if I can port some of my simpler commands over to Emacslisten or straight Talon so that they're always active. Then I can slowly work on getting used to the other commands people find useful, or incorporating them into my setup.
</p>
</div>
</div>
<div id="outline-container-emacs-carnival-exploring-keys-and-voice-input-in-emacs-imagining-a-hybrid-approach-keyboard-voice-even-mouse-stylus" class="outline-3">
<h3 id="emacs-carnival-exploring-keys-and-voice-input-in-emacs-imagining-a-hybrid-approach-keyboard-voice-even-mouse-stylus"><a href="https://sachachua.com/blog/feed/index.xml#emacs-carnival-exploring-keys-and-voice-input-in-emacs-imagining-a-hybrid-approach-keyboard-voice-even-mouse-stylus">Imagining a hybrid approach: keyboard, voice, even mouse/stylus?</a></h3>
<div class="outline-text-3" id="text-emacs-carnival-exploring-keys-and-voice-input-in-emacs-imagining-a-hybrid-approach-keyboard-voice-even-mouse-stylus">
<p>
I love shifting fluidly from one form of input to another, depending on what makes sense at that moment.
</p>

<p>
For example, <a href="https://sachachua.com/blog/2025/07/finding-the-shape-of-my-thoughts/">I often start my thoughts</a> by drawing on a light dotted grid using Noteful on my iPad. That lets me quickly cluster ideas spatially, drawing connections and highlighting words as I figure out what I want to say.
</p>

<p>
</p><div class="sketch-full"><a class="photoswipe" href="https://sketches.sachachua.com/filename/2026-10-07-01%20Experimenting%20with%20voice%20input%20in%20Emacs%20-%20rough%20braindump.jpeg" data-src="https://sketches.sachachua.com/static/2026-10-07-01%20Experimenting%20with%20voice%20input%20in%20Emacs%20-%20rough%20braindump.jpeg" data-title="2026-10-07-01 Experimenting with voice input in Emacs - rough braindump.jpeg" data-w="2900" data-h="2050"><picture>
      <img src="https://sketches.sachachua.com/static/2026-10-07-01%20Experimenting%20with%20voice%20input%20in%20Emacs%20-%20rough%20braindump.jpeg" width="2900" height="2050" alt="2026-10-07-01 Experimenting with voice input in Emacs - rough braindump.jpeg" loading="lazy" style="max-height: 90vw; height: auto; width: auto" decoding="async">
      <figcaption>2026-10-07-01 Experimenting with voice input in Emacs - rough braindump.jpeg</figcaption>
    </picture></a></div>
<p></p>

<p>
Then I use dictation and typing to sketch the outline, jumping around as thoughts occur to me. If I'm livestreaming at the same time, that helps me demonstrate things along the way and lets me benefit from people's questions. Dictation lets me explain things to people and capture the text at the same time.
</p>

<p>
I can move around with the keyboard, but it would be really cool to use voice for quick navigation between sections of my outline using either line numbers or words. I've implemented a "line" command that lets me jump to a line using the last two digits of its line number, since I probably won't have more than 100 lines visible on the screen at a time. For example, this line is currently 119, so referring to it as "nineteen" would work. I'd like to add more operations for editing the text. I think it would be great to be able to say "kill line 33" to delete that line or "move lines 16 to 20 after 27" to have it move those lines there.
</p>

<p>
I now have a <code>sacha-whisper-one-sentence-per-line</code> variable that splits up dictation if non-nil, so we'll see where those take me. Orukeet does a reasonable job of punctuating my sentences if I don't pause too much between phrases. <a href="https://sachachua.com/blog/2025/09/emacs-cycle-through-different-paragraph-formats-all-on-one-line-wrapped-max-one-sentence-per-line-one-sentence-per-line/">My M-q re-wraps paragraphs</a> between one sentence per line, one paragraph per line, and wrapping to fill-column, and it's probably the sort of thing that more voice commands would make even more convenient.
</p>

<p>
Maybe I can even use that spatial sense of a layout by touching buttons in an Emacs-served webpage on my tablet to direct my dictation to different places. <a href="https://github.com/larrasket/org-draw">Org-draw</a> uses a similar Emacs web server approach to let you draw on another device and embed the results into an Org file, and there are also simpler HTTP servers (<a target="_blank" href="https://melpa.org/#/web-server">web-server</a>, <a target="_blank" href="https://melpa.org/#/simple-httpd">simple-httpd</a>), so it's probably quite doable. I'm imagining something that takes the top-level items from my current nested list and makes them nice big buttons, so I could have something like "Introduction", "Keyboard", "Reasons", "Experiment", "Hybrid", and "Conclusion", and clicking on those could trigger a POST request to the server inside Emacs which moves my point accordingly. I might even have buttons for various commands. It sounds pretty straightforward to implement.
</p>

<p>
When my brain comes up with lots of interesting ideas, my org-capture voice commands let me choose which rabbit holes to postpone and which ones I want to dive into.
</p>

<p>
If I get interrupted by life, I can write on my phone while waiting for the kiddo. <a href="https://www.orgzlyrevived.com/">Orgzly Revived</a> and <a href="https://syncthing.net/">Syncthing</a> let me pick up where I left off.
</p>

<p>
As I get thoughts down, I can use keyboard shortcuts to rearrange things and then convert the list of sentences into paragraphs. <a href="https://sachachua.com/blog/2025/07/finding-unlinked-text/">I can easily turn text into links</a> using my favourites.
</p>

<p>
I can imagine combining the audio clips from the text properties with the videos and screenshots to create a quick narrated clip that I can edit (using Emacs, of course), or publishing the narration so that people can listen to it if they like.
</p>

<p>
This combination of drawing + audio + text works better for me than any of those components alone. Visuals give me anchors for my thoughts. Audio helps with the braindump. Text permits precise, searchable details we can copy. Like <a href="https://curious.port111.com/2026/08/22/will-voice-kill-the-keyboard.html">George Jones</a>, I find they all have their uses and their strengths.
</p>

<p>
When I try to dictate longer sections without that kind of visual support, I often lose my train of thought. I want to see where I've been and where I want to go. I don't trust LLMs to clean up that kind of rough transcript; the output doesn't quite resonate with me. I like keeping speech recognition constrained to sentences I can immediately check or reorganize, and I have the recordings as text properties so I can go back to that segment if I need to (at least during the current editing section). That way, I'm never left scratching my head and wondering what I meant.
</p>

<p>
I love that local speech recognition is getting better and better. I'm curious about whether small language models can do better turn detection to help compensate for my intra-phrase delays when I'm thinking of a word, and whether decision models can automatically classify a sentence into its place in my outline. I think it would be cool if embeddings or other language models could suggest related words or resources as I go along. Lots of interesting possibilities even with the technology that's already available.
</p>

<p>
Thanks to George Jones for hosting <a href="https://www.emacswiki.org/emacs/CarnivalOctober2026">this month's Emacs Carnival on input alternatives</a>. Check out the page for more posts!
</p>
</div>
</div>
<div><a href="https://sachachua.com/blog/2026/10/emacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs/index.org">View Org source for this post</a></div>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F10%2Femacs-carnival-oct-2026-exploring-keys-and-voice-input-in-emacs%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>]]></description>
		</item><item>
		<title>Using Emacs to visualize speaking and target words/phrases in real-ish time</title>
		<link>https://sachachua.com/blog/2026/10/using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Wed, 07 Oct 2026 11:47:04 GMT</pubDate>
    <category>audio</category>
<category>speech-recognition</category>
<category>emacs</category>
<category>learning</category>
<category>visualization</category>
		<guid isPermaLink="false">https://sachachua.com/blog/2026/10/using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time/</guid>
		<description><![CDATA[<div class="sticky-toc" id="org2065881">
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="https://sachachua.com/blog/feed/index.xml#writing-and-editing-speech-recognition-using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time-voice-activity-detection-and-speech-recognition">1. Voice activity detection and speech recognition</a></li>
<li><a href="https://sachachua.com/blog/feed/index.xml#writing-and-editing-speech-recognition-using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time-noticing-bingo-phrases">2. Noticing bingo phrases</a></li>
</ul>
</div>

</div>


<figure id="org2f7e64e">
<img src="https://sachachua.com/blog/2026/10/using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time/2026-10-07_07-33-03.png" alt="2026-10-07_07-33-03.png">

<figcaption><span class="figure-number">Figure 1: </span>Screenshot showing my list of target phrases and which ones have been recognized</figcaption>
</figure>

<p>
When I'm working with a tutor to improve my French, I sometimes need
to push myself to provide more details when I'm sharing and ask more
follow-up questions in response to what they're saying, instead of
falling back to « D'accord » and « C'est cool. » Visualizing the
timeline in real-time lets me see if the turn-taking looks good. I
might even need to take a more active role in controlling the
conversation if I happen to be meeting a tutor who tends to go on
monologues.
</p>

<p>
When I'm talking out loud on my own for practice, this might also
nudge me to reduce the pauses and enrich my vocabulary by practising
saying things often enough that they become more automatic.
</p>
<div id="outline-container-writing-and-editing-speech-recognition-using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time-voice-activity-detection-and-speech-recognition" class="outline-3">
<h3 id="writing-and-editing-speech-recognition-using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time-voice-activity-detection-and-speech-recognition"><span class="section-number-3">1.</span> <a href="https://sachachua.com/blog/feed/index.xml#writing-and-editing-speech-recognition-using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time-voice-activity-detection-and-speech-recognition">Voice activity detection and speech recognition</a></h3>
<div class="outline-text-3" id="text-writing-and-editing-speech-recognition-using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time-voice-activity-detection-and-speech-recognition">
<p>
This code uses this server <a href="https://sachachua.com/blog/2026/10/using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time/asr.py">vad-file.py</a>, which I generated with Google Gemini. It emits JSONL for voice activity detection events (start/stop) and uses Orukeet to transcribe the speech once the voice activity detection notices it's finished. I also use spacy to look up token information because I want to someday colour the nouns by gender, which might allow me to correct myself in the next sentence instead of hesitating in the previous one.
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp"><code><span class="org-comment-delimiter">;; </span><span class="org-comment">Report on the balance between my tutor and me</span>
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-vad-tutor-process</span> nil)
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-vad-tutor-dir</span> <span class="org-string">"~/vendor/orukeet"</span>)
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-vad-tutor-command</span> <span class="org-highlight-quoted-quote">`</span>(,(expand-file-name <span class="org-string">".venv/bin/python"</span> sacha-vad-tutor-dir)
                                  <span class="org-string">"asr.py"</span>
                                  <span class="org-string">"&#45;&#45;spacy-model"</span>
                                  <span class="org-string">"fr_dep_news_trf"</span>
                                  <span class="org-string">"-s"</span> <span class="org-string">"300"</span> <span class="org-string">"-t"</span>
                                  <span class="org-string">"VirtualMicSink.monitor=sacha"</span> <span class="org-string">"alsa_output.usb-AT_AT2040USB_202011110001-00.analog-stereo.monitor=tutor"</span>))
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-vad-tutor-events</span> nil <span class="org-doc">"List of events as an list of alists (label start stop duration)."</span>)
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-vad-tutor-labels</span> <span class="org-highlight-quoted-quote">'</span>(<span class="org-string">"sacha"</span> <span class="org-string">"tutor"</span>))
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-vad-tutor-summary</span> <span class="org-highlight-quoted-quote">'</span>((<span class="org-string">"sacha"</span> . 0)
                                  (<span class="org-string">"tutor"</span> . 0)))
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-vad-tutor-session-length</span> (* 60 60) <span class="org-doc">"Number of seconds to use for scale."</span>)

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-vad-tutor-update-view</span> ()
  <span class="org-doc">"Visualize the last 3 minutes and the overview of the session.</span>
<span class="org-doc">Also keep track of target phrases."</span>
  (<span class="org-keyword">interactive</span>)
  (<span class="org-keyword">with-current-buffer</span> (get-buffer-create <span class="org-string">"*tutor stats*"</span>)
    (erase-buffer)
    (<span class="org-keyword">let*</span> ((total (apply <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">+</span> (mapcar <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">cdr</span> sacha-vad-tutor-summary)))
           (height 30)
           (width (window-width nil t))
           (max-seconds
            (<span class="org-keyword">if</span> sacha-vad-tutor-events
                (apply <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">max</span> (mapcar (<span class="org-keyword">lambda</span> (o) (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">end</span> o))
                                    sacha-vad-tutor-events))
              0))
           (threshold 180)              <span class="org-comment-delimiter">; </span><span class="org-comment">last three minutes</span>
           (threshold-seconds (- max-seconds threshold))
           (recent
            (seq-keep
             (<span class="org-keyword">lambda</span> (o)
               (<span class="org-keyword">when</span> (&gt;= (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">start</span> o)
                         threshold-seconds)
                 (<span class="org-keyword">let-alist</span> o
                   <span class="org-highlight-quoted-quote">`</span>((label . ,.label)
                     (start . ,(- .start threshold-seconds))
                     (end . ,(- .end threshold-seconds))))))
             (copy-sequence sacha-vad-tutor-events)))
           (recent-total (apply <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">+</span> (mapcar (<span class="org-keyword">lambda</span> (o)
                                             (-
                                              (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">end</span> o)
                                              (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">start</span> o)))
                                           recent))))
      (<span class="org-keyword">save-excursion</span>
        (insert
         (format <span class="org-string">"Last %d minute%s:\n"</span>
                 (/ threshold 60)
                 (<span class="org-keyword">if</span> (&gt; (/ threshold 60) 1)
                     <span class="org-string">"s"</span>
                   <span class="org-string">""</span>))
         (mapconcat
          (<span class="org-keyword">lambda</span> (o)
            (format <span class="org-string">"%d%% %s\n"</span>
                    (/ (* 100.0 (cdr o)) recent-total)
                    (car o)))
          (seq-map
           (<span class="org-keyword">lambda</span> (group)
             (cons (car group)
                   (apply <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">+</span> (mapcar (<span class="org-keyword">lambda</span> (o)
                                       (-
                                        (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">end</span> o)
                                        (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">start</span> o)))
                                     (cdr group)))))
           (seq-group-by (<span class="org-keyword">lambda</span> (o) (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">label</span> o)) recent)))
         <span class="org-string">"\n"</span>)
        (svg-insert-image
         (sacha-vad-visualize
          sacha-vad-tutor-labels
          recent
          t
          width height))
        (insert
         <span class="org-string">"\nTotal:\n"</span>

         (mapconcat
          (<span class="org-keyword">lambda</span> (o)
            (format <span class="org-string">"%d%% %s\n"</span>
                    (/ (* 100.0 (cdr o)) total)
                    (car o)))
          sacha-vad-tutor-summary))
        (svg-insert-image
         (sacha-vad-visualize sacha-vad-tutor-labels sacha-vad-tutor-events t
                              width height
                              sacha-vad-tutor-session-length))
        (insert <span class="org-string">"\n\n"</span>  (sacha-learn-lang-bingo-summary))))))

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-vad-handle-end-event</span> (data)
  <span class="org-doc">"Handle the end event."</span>
  (<span class="org-keyword">let</span> ((event (list
                (cons <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">label</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">label</span> data))
                (cons <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">start</span> (- (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">timestamp</span> data)
                                (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">duration</span> data)
                                (<span class="org-keyword">or</span> sacha-vad-tutor-start-seconds 0)))
                (cons <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">end</span> (- (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">timestamp</span> data)
                              (<span class="org-keyword">or</span> sacha-vad-tutor-start-seconds 0))))))
    (<span class="org-keyword">push</span> event sacha-vad-tutor-events)
    (<span class="org-keyword">let-alist</span> data
      (<span class="org-keyword">incf</span> (alist-get (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">label</span> data) sacha-vad-tutor-summary 0 nil <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">string=</span>)
            .duration))
    (sacha-vad-tutor-update-view)))

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-vad-tutor-filter</span> (proc string)
  <span class="org-doc">"Add and parse."</span>
  (<span class="org-keyword">when</span> (buffer-live-p (process-buffer proc))
    <span class="org-comment-delimiter">;; </span><span class="org-comment">split the string by newline?</span>
    (<span class="org-keyword">with-current-buffer</span> (process-buffer proc)
      (goto-char (point-max))
      (<span class="org-keyword">save-excursion</span>
        (insert string))
      (<span class="org-keyword">catch</span> <span class="org-highlight-quoted-quote">'</span><span class="org-constant">waiting</span>
        (<span class="org-keyword">unless</span> (<span class="org-keyword">or</span> (eobp) (looking-at <span class="org-string">"\n*$"</span>))
          (<span class="org-keyword">let</span> ((data (json-read)))
            (<span class="org-keyword">when</span> (string= (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">event</span> data) <span class="org-string">"end"</span>)
              (sacha-vad-handle-end-event data))
            (<span class="org-keyword">when</span> (string= (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">event</span> data) <span class="org-string">"final"</span>)
              (sacha-vad-handle-text-event data))))))))

(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-vad-last-speaker</span> nil <span class="org-doc">"Previous speaker."</span>)

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-vad-handle-text-event</span> (data)
  (<span class="org-keyword">with-current-buffer</span> (get-buffer-create <span class="org-string">"*Transcript*"</span>)
    (set (make-local-variable <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">window-point-insertion-type</span>) t)
    (<span class="org-keyword">save-excursion</span>
      (goto-char (point-max))
      <span class="org-comment-delimiter">;; </span><span class="org-comment">insert break</span>
      (insert
       (<span class="org-keyword">if</span> (string= sacha-vad-last-speaker (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">label</span> data))
           <span class="org-string">" "</span>
         (concat (<span class="org-keyword">if</span> (bobp) <span class="org-string">""</span> <span class="org-string">"\n\n"</span>) (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">label</span> data) <span class="org-string">": "</span>))
       (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">text</span> data))
      (<span class="org-keyword">setq</span> sacha-vad-last-speaker (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">label</span> data))
      (<span class="org-keyword">when</span> (string= (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">label</span> data) <span class="org-string">"sacha"</span>)
        (sacha-learn-lang-notice-bingo-words (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">text</span> data))))))

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-vad-tutor-start</span> ()
  <span class="org-doc">"Start the process."</span>
  (<span class="org-keyword">interactive</span>)
  (sacha-vad-tutor-ensure)
  (<span class="org-keyword">setq</span> sacha-vad-tutor-summary <span class="org-highlight-quoted-quote">'</span>((<span class="org-string">"sacha"</span> . 0)
                                  (<span class="org-string">"tutor"</span> . 0))
        sacha-vad-tutor-events nil)
  (<span class="org-keyword">with-current-buffer</span> (get-buffer-create <span class="org-string">"*Transcript*"</span>)
    (erase-buffer)
    (display-buffer (current-buffer)))
  (display-buffer (get-buffer-create <span class="org-string">"*tutor stats*"</span>)))

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-vad-tutor-ensure</span> ()
  <span class="org-doc">"Start the process if it's not already running."</span>
  (<span class="org-keyword">interactive</span>)
  (<span class="org-keyword">unless</span> (process-live-p sacha-vad-tutor-process)
    (<span class="org-keyword">setq</span> sacha-vad-tutor-process-start-time (current-time))
    (<span class="org-keyword">setq</span> sacha-vad-tutor-start-seconds 0)
    (<span class="org-keyword">let</span> ((default-directory sacha-vad-tutor-dir))
      (<span class="org-keyword">setq</span> sacha-vad-tutor-process
            (make-process
             <span class="org-builtin">:name</span> <span class="org-string">"vad-tutor"</span>
             <span class="org-builtin">:command</span> sacha-vad-tutor-command
             <span class="org-builtin">:connection-type</span> <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">pipe</span>
             <span class="org-builtin">:buffer</span> (get-buffer-create <span class="org-string">"*vad-tutor*"</span>)
             <span class="org-builtin">:stderr</span> (get-buffer-create <span class="org-string">"*vad-tutor-err*"</span>)
             <span class="org-builtin">:filter</span> <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">sacha-vad-tutor-filter</span>)))))

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-vad-tutor-stop</span> ()
  <span class="org-doc">"Stop the process."</span>
  (<span class="org-keyword">interactive</span>)
  (interrupt-process sacha-vad-tutor-process))

<span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-js-parse-jsonl-file</span> (file)
  <span class="org-doc">"Parse jsonl as a list"</span>
  (<span class="org-keyword">let</span> (results)
    (<span class="org-keyword">with-temp-buffer</span>
      (insert-file-contents file)
      (goto-char (point-min))
      (<span class="org-keyword">while</span> (not (eobp))
        (<span class="org-keyword">condition-case</span> nil
            (<span class="org-keyword">push</span> (json-read) results)
          (<span class="org-warning">error</span> (goto-char (point-max))))))
    (nreverse results)))

(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-vad-tutor-start-seconds</span> 0 <span class="org-doc">"Number of seconds to consider as the start."</span>)
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-vad-tutor-process-start-time</span> nil <span class="org-doc">"Time that the process started."</span>)

<span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-vad-tutor-reset-clock</span> ()
  <span class="org-doc">"Reset the start of the session."</span>
  (<span class="org-keyword">interactive</span>)
  (<span class="org-keyword">setq</span> sacha-vad-tutor-start-seconds
        (time-to-seconds (time-subtract (current-time)
                                        sacha-vad-tutor-process-start-time)))
  (mapcar (<span class="org-keyword">lambda</span> (o) (setcdr o 0)) sacha-vad-tutor-summary)
  (<span class="org-keyword">setq</span> sacha-vad-tutor-events nil))

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-vad-visualize</span> (labels list <span class="org-type">&amp;optional</span> output-file width height max-seconds)
  (<span class="org-keyword">setq</span> height (<span class="org-keyword">or</span> height 25))
  (<span class="org-keyword">setq</span> width (<span class="org-keyword">or</span> width (window-width nil t)))
  (<span class="org-keyword">let*</span> ((svg (svg-create width height))
         (max-seconds (max
                       (<span class="org-keyword">or</span> max-seconds 0)
                       (<span class="org-keyword">if</span> list
                           (apply <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">max</span> (mapcar (<span class="org-keyword">lambda</span> (o) (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">end</span> o))
                                               list))
                         0)))
         (pixels-per-second (/ (* 1.0 width) max-seconds))
         (row-height (/ height (length labels))))
    (<span class="org-keyword">dolist</span> (o list)
      (<span class="org-keyword">let-alist</span> o
        (<span class="org-keyword">let</span> ((y (* row-height (<span class="org-keyword">or</span> (seq-position labels .label <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">string=</span>) -1))))
          (<span class="org-keyword">when</span> (&gt;= y 0)
            (svg-rectangle
             svg
             (* .start pixels-per-second)
             y
             (* (- .end .start) pixels-per-second)
             row-height <span class="org-builtin">:fill</span> <span class="org-string">"green"</span>)))))
    (<span class="org-keyword">cond</span>
     ((stringp output-file)
      (<span class="org-keyword">with-temp-file</span> output-file
        (svg-print svg)))
     (output-file
      svg)
     (t
      (<span class="org-keyword">with-current-buffer</span> (get-buffer-create <span class="org-string">"*vad*"</span>)
        (goto-char (point-min))
        (display-buffer (current-buffer))
        (erase-buffer)
        (svg-insert-image svg))))))

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-vad-stats</span> (labels list)
  <span class="org-doc">"Return the balance of time talking as (label total percentage)."</span>
  (<span class="org-keyword">let*</span> ((max-seconds (apply <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">+</span> (mapcar
                                 (<span class="org-keyword">lambda</span> (o) (<span class="org-keyword">let-alist</span> o (- .end .start)))
                                 list)))
         (durations (mapcar (<span class="org-keyword">lambda</span> (o)
                            (cons
                             (car o)
                             (mapcar (<span class="org-keyword">lambda</span> (e) (<span class="org-keyword">let-alist</span> e (- .end .start)))
                                     (cdr o))))
                          (seq-group-by (<span class="org-keyword">lambda</span> (o) (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">label</span> o))
                                        list))))
    (seq-map
     (<span class="org-keyword">lambda</span> (label)
       (<span class="org-keyword">let*</span> ((row (cdr (assoc label durations)))
              (total (apply <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">+</span> row)))
         <span class="org-highlight-quoted-quote">`</span>((label . ,label)
           (total . ,total)
           (count . ,(length row))
           (percentage . ,(<span class="org-keyword">and</span> total max-seconds (&gt; max-seconds 0) (* 100.0 (/ total max-seconds)))))))
     labels)))

<span class="org-comment-delimiter">;; </span><span class="org-comment">(sacha-vad-stats '("sacha" "tutor") (seq-take (sacha-js-parse-jsonl-file "~/proj/speech/output2.log") 5))</span>
<span class="org-comment-delimiter">;; </span><span class="org-comment">(sacha-vad-stats '("sacha" "tutor") (sacha-js-parse-jsonl-file "~/proj/speech/output.log"))</span>
<span class="org-comment-delimiter">;; </span><span class="org-comment">(sacha-vad-visualize '("sacha" "tutor") (sacha-js-parse-jsonl-file "~/proj/speech/output.log"))</span>
<span class="org-comment-delimiter">;; </span><span class="org-comment">(sacha-vad-visualize '("sacha" "tutor") (seq-take (sacha-js-parse-jsonl-file "~/proj/speech/output2.log") 30))</span>

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-vad-tutor-group-output</span> (files)
  (<span class="org-keyword">let</span> ((grouped-files (seq-group-by
                        (<span class="org-keyword">lambda</span> (o)
                          (substring (file-name-base o) 0 10))
                        files)))
    (mapcar
     (<span class="org-keyword">lambda</span> (group)
       (<span class="org-keyword">let</span> ((start 0))
         (cons (car (cdr group))
               (seq-reduce
                (<span class="org-keyword">lambda</span> (prev file)
                  (append prev
                          (<span class="org-keyword">let</span> ((max-seconds 0))
                            (<span class="org-keyword">prog1</span> (mapcar (<span class="org-keyword">lambda</span> (event)
                                             (<span class="org-keyword">incf</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">start</span> event) start)
                                             (<span class="org-keyword">incf</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">end</span> event) start)
                                             (<span class="org-keyword">setq</span> max-seconds (max (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">end</span> event) max-seconds))
                                             event)
                                           (sacha-js-parse-jsonl-file file))
                              (<span class="org-keyword">setq</span> start max-seconds)))))
                (cdr group)
                nil))))
     grouped-files)))

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-vad-tutor-make-table</span> (files <span class="org-type">&amp;optional</span> width height)
  <span class="org-doc">"Make a summary table."</span>
  (<span class="org-keyword">let</span> ((labels sacha-vad-tutor-labels)
        (width (<span class="org-keyword">or</span> width 500))
        (height (<span class="org-keyword">or</span> height 30)))
    <span class="org-comment-delimiter">;; </span><span class="org-comment">combine data as needed</span>
    (append
     <span class="org-highlight-quoted-quote">'</span>((<span class="org-string">"Date"</span> <span class="org-string">"Tutor"</span> <span class="org-string">"Minutes"</span> <span class="org-string">"%"</span> <span class="org-string">"Visualization"</span>) hline)
     (seq-map
      (<span class="org-keyword">lambda</span> (group)
        (<span class="org-keyword">let*</span> ((list (cdr group))
               (base (file-name-base (car group))))
          (<span class="org-keyword">if</span> list
              (<span class="org-keyword">let-alist</span> (car (sacha-vad-stats labels list))
                (<span class="org-keyword">let</span> ((svg-name
                       (expand-file-name
                        (concat (file-name-base (car group)) <span class="org-string">"-"</span> .label <span class="org-string">".svg"</span>)
                        <span class="org-string">"~/proj/french/conversation"</span>)))
                  (sacha-vad-visualize
                   (list .label)
                   list
                   svg-name
                   width
                   height)
                  (list
                   (format-time-string <span class="org-string">"%Y-%m-%d"</span>
                                       (seconds-to-time
                                        (sacha-filename-timestamp (car group))))
                   <span class="org-comment-delimiter">;; </span><span class="org-comment">(org-link-make-string (concat "file:" o) "file")</span>
                   (<span class="org-keyword">if</span> (string-match <span class="org-string">"-conversation-</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 class="org-negation-char">^</span></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">"</span> base)
                       (s-capitalize (substring (match-string 1 base) 0 1))
                     <span class="org-string">""</span>)

                   (round (/ .total 60))
                   (format <span class="org-string">"%d%%"</span> .percentage)
                   (org-link-make-string (concat <span class="org-string">"file:"</span> svg-name)
                                         (concat <span class="org-string">"file:"</span> svg-name))
                   )))
            (list <span class="org-string">"?"</span>))))
      (sacha-vad-tutor-group-output files))
     nil)))
</code></pre>
</div>

</div>
</div>
<div id="outline-container-writing-and-editing-speech-recognition-using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time-noticing-bingo-phrases" class="outline-3">
<h3 id="writing-and-editing-speech-recognition-using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time-noticing-bingo-phrases"><span class="section-number-3">2.</span> <a href="https://sachachua.com/blog/feed/index.xml#writing-and-editing-speech-recognition-using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time-noticing-bingo-phrases">Noticing bingo phrases</a></h3>
<div class="outline-text-3" id="text-writing-and-editing-speech-recognition-using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time-noticing-bingo-phrases">
<p>
Here's the code that reminds me to use the words or expressions on my
to-do list, and then keeps track of how often I've used them,
prioritizes the ones that I haven't used yet, and displays these.
It can work with either my Whisper dictation workflow or the VAD
events server described above.
</p>

<p>
I keep the list of expressions in <a href="https://sachachua.com/blog/2026/10/using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time/bingo.txt">file:///home/sacha/proj/french/bingo.txt</a>.
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-learn-lang-bingo-word-file</span> <span class="org-string">"~/proj/french/bingo.txt"</span>)
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-learn-lang-bingo-words</span> nil <span class="org-doc">"List of words."</span>)
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-learn-lang-bingo-words-hash</span> nil <span class="org-doc">"Data for the counts."</span>)

<span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-learn-lang-bingo-words</span> ()
  <span class="org-doc">"Load the list of words from the file."</span>
  (<span class="org-keyword">interactive</span>)
  (<span class="org-keyword">setq</span> sacha-learn-lang-bingo-words
        (seq-map (<span class="org-keyword">lambda</span> (o)
                   (<span class="org-keyword">when</span> (= (length o) 1)
                     (<span class="org-keyword">setq</span> o (list (car o) 0)))
                   (<span class="org-keyword">setq</span> o (append o (list
                                      (string-trim (replace-regexp-in-string
                                                    <span class="org-string">" *\\[.+?\\] *"</span> <span class="org-string">" "</span>
                                                    (car o))))))
                   o)
                 (pcsv-parse-file sacha-learn-lang-bingo-word-file)))
  sacha-learn-lang-bingo-words)

<span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-learn-lang-bingo-handler</span> (event)
  <span class="org-doc">"Manually register the event."</span>
  (<span class="org-keyword">interactive</span> <span class="org-string">"e"</span>)
    (<span class="org-keyword">let*</span> ((pos (posn-point (event-end event)))
           (val (get-text-property pos <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">bingo</span>)))
      (<span class="org-keyword">when</span> val
        (sacha-learn-lang-notice-bingo-words val))))

(<span class="org-keyword">defvar-keymap</span> sacha-learn-lang-bingo-map
  <span class="org-string">"&lt;mouse-1&gt;"</span> <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">sacha-learn-lang-bingo-handler</span>)

<span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-learn-lang-bingo-summary</span> ()
  <span class="org-doc">"Summarize the words to say."</span>
  (<span class="org-keyword">let</span> ((target (seq-filter (<span class="org-keyword">lambda</span> (row) (= (elt row 1) 0))
                            sacha-learn-lang-bingo-words))
        (yay (seq-filter (<span class="org-keyword">lambda</span> (row) (&gt; (elt row 1) 0))
                         sacha-learn-lang-bingo-words)))
    (concat
     (<span class="org-keyword">if</span> target
         (concat <span class="org-string">"Target: "</span>
                 (mapconcat (<span class="org-keyword">lambda</span> (row)
                              (propertize
                               (car row)
                               <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">keymap</span> sacha-learn-lang-bingo-map
                               <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">bingo</span> (car row)))
                            target
                            <span class="org-string">"; "</span>)
                 <span class="org-string">"\n\n"</span>)
       <span class="org-string">""</span>)
     (<span class="org-keyword">if</span> yay
         (concat
          <span class="org-string">"Yay! "</span>
          (mapconcat (<span class="org-keyword">lambda</span> (row)
                       (propertize (format <span class="org-string">"%s (%s)"</span> (car row) (elt row 1))
                                   <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">keymap</span> sacha-learn-lang-bingo-map
                                   <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">bingo</span> (car row)))
                     (seq-filter (<span class="org-keyword">lambda</span> (row) (&gt; (elt row 1) 0))
                                 sacha-learn-lang-bingo-words)
                     <span class="org-string">"; "</span>)
          <span class="org-string">"\n\n"</span>)
       <span class="org-string">""</span>))))

<span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-learn-lang-notice-bingo-words</span> (text)
  <span class="org-doc">"Look for the bingo words in TEXT and celebrate when I use them.</span>
<span class="org-doc">Add to `</span><span class="org-doc"><span class="org-constant">whisper-insert-text-at-point</span></span><span class="org-doc">'."</span>
  (<span class="org-keyword">when</span> text
    (<span class="org-keyword">unless</span> sacha-learn-lang-bingo-words (sacha-learn-lang-bingo-words))
    (<span class="org-keyword">let</span> ((found (seq-find
                  (<span class="org-keyword">lambda</span> (o)
                    (<span class="org-keyword">and</span> (elt o 2)
                         (string-match (concat <span class="org-string">"\\&lt;"</span> (elt o 2)) text)))
                  sacha-learn-lang-bingo-words)))
      (<span class="org-keyword">when</span> found
        (<span class="org-keyword">incf</span> (elt found 1))
        (sacha-vad-tutor-update-view)
        (<span class="org-keyword">with-current-buffer</span> (get-buffer-create <span class="org-string">"*Bingo*"</span>)
          (erase-buffer)
          (insert (sacha-learn-lang-bingo-summary))))))
  text)
</code></pre>
</div>

</div>
</div>

<div class="note">This is part of my <a href="https://sachachua.com/dotemacs#writing-and-editing-speech-recognition-reporting-speaking-stats-balance">EmacsConfiguration.</a></div><div><a href="https://sachachua.com/blog/2026/10/using-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time/index.org">View Org source for this post</a></div>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F10%2Fusing-emacs-to-visualize-speaking-and-target-words-phrases-in-real-ish-time%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>]]></description>
		</item><item>
		<title>Emacs Lisp: Parse page ranges, insert issue references</title>
		<link>https://sachachua.com/blog/2026/10/emacs-lisp-parse-page-ranges-insert-issue-references/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Mon, 05 Oct 2026 21:30:38 GMT</pubDate>
    <category>elisp</category>
<category>emacs</category>
		<guid isPermaLink="false">https://sachachua.com/blog/2026/10/emacs-lisp-parse-page-ranges-insert-issue-references/</guid>
		<description><![CDATA[<p>
<a href="https://social.tchncs.de/@zyzzyxdonta/117387493564517016">David Pape asked:</a>
</p>

<blockquote>
<p>
I just typed
</p>

<p>
<code>&gt;Closes: #47, #48, #49, #50, #51, #52, #53, #54</code>
</p>

<p>
into a commit description, all by hand.
</p>

<p>
Is there a way in Emacs to expand some kind of range description to make this easier? 😅
</p>

<p>
I want to expand strings like "5-10, 15-18, 3" into numbers.
</p>
</blockquote>

<p>
Hmm, could be useful. It reminds me of how page ranges work, which will be handy if I want to tinker with PDFs. Let's see if something like this works:
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-parse-page-range</span> (s)
  <span class="org-doc">"Parse a page range string and return a list of numbers.</span>
<span class="org-doc">Ex: 1-5</span>
<span class="org-doc">2-4, 6-10</span>
<span class="org-doc">1 4 7-9</span>
<span class="org-doc">3-11/2   - this one specifies an increment"</span>
  (seq-mapcat
   (<span class="org-keyword">lambda</span> (part)
     (<span class="org-keyword">let</span> ((nums (mapcar <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">string-to-number</span> (split-string part <span class="org-string">" *[-/] *"</span>))))
       (<span class="org-keyword">if</span> (= (length nums) 1)
           nums
         (number-sequence (elt nums 0) (elt nums 1) (elt nums 2)))))
   (split-string s <span class="org-string">"[, \t\n\r]+"</span>)))

(<span class="org-keyword">ert-deftest</span> <span class="org-function-name">sacha-parse-page-range</span> ()
  (<span class="org-keyword">should</span> (equal (sacha-parse-page-range <span class="org-string">"5-10"</span>)
                 <span class="org-highlight-quoted-quote">'</span>(5 6 7 8 9 10)))
  (<span class="org-keyword">should</span> (equal (sacha-parse-page-range <span class="org-string">"1-5, 8"</span>)
                 <span class="org-highlight-quoted-quote">'</span>(1 2 3 4 5 8)))
  (<span class="org-keyword">should</span> (equal (sacha-parse-page-range <span class="org-string">"1 4 7-9"</span>)
                 <span class="org-highlight-quoted-quote">'</span>(1 4 7 8 9)))
  (<span class="org-keyword">should</span> (equal (sacha-parse-page-range <span class="org-string">"3-11/2"</span>)
                 <span class="org-highlight-quoted-quote">'</span>(3 5 7 9 11))))

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-issue-range</span> (range)
  <span class="org-doc">"Expand RANGE to a list of issues and insert them."</span>
  (<span class="org-keyword">interactive</span> <span class="org-string">"MRange (ex: 1-5, 7): "</span>)
  (<span class="org-keyword">let</span> ((s (mapconcat (<span class="org-keyword">lambda</span> (n) (format <span class="org-string">"#%d"</span> n))
                      (sacha-parse-page-range range)
                      <span class="org-string">", "</span>)))
    (<span class="org-keyword">when</span> (called-interactively-p <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">any</span>)
      (insert s))
    s))
</code></pre>
</div>


<div class="note">This is part of my <a href="https://sachachua.com/dotemacs#coding-emacs-lisp-parse-page-ranges">EmacsConfiguration.</a></div><div><a href="https://sachachua.com/blog/2026/10/emacs-lisp-parse-page-ranges-insert-issue-references/index.org">View Org source for this post</a></div>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F10%2Femacs-lisp-parse-page-ranges-insert-issue-references%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>]]></description>
		</item><item>
		<title>2026-10-05 Emacs news</title>
		<link>https://sachachua.com/blog/2026/10/2026-10-05-emacs-news/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Mon, 05 Oct 2026 14:01:16 GMT</pubDate>
    <category>emacs</category>
<category>emacs-news</category>
		<guid isPermaLink="false">https://sachachua.com/blog/2026/10/2026-10-05-emacs-news/</guid>
		<description><![CDATA[<p>
The Emacs Carnival for October is about <a href="https://www.emacswiki.org/emacs/CarnivalOctober2026">looking into your crystal ball</a>. I'd love to see what you're looking forward to exploring. Thanks to George Jones for hosting!
</p>

<ul class="org-ul">
<li>Upcoming events (<a href="https://emacslife.com/calendar/emacs-calendar.ics">iCal file</a>, <a href="https://emacslife.com/calendar/">Org</a>):
<ul class="org-ul">
<li>Emacs.si (in person): Emacs.si meetup #10 2026 (v #živo) <a href="https://dogodki.kompot.si/events/df5d39f6-4d78-4841-b207-ef2c9e60bd5c">https://dogodki.kompot.si/events/df5d39f6-4d78-4841-b207-ef2c9e60bd5c</a> Mon Oct 5 1900 CET</li>
<li>Atelier Emacs Montpellier (in person) <a href="https://lebib.org/date/atelier-emacs">https://lebib.org/date/atelier-emacs</a> Fri Oct 9 1800 Europe/Paris</li>
<li>Emacs Berlin: In-Person-Only Emacs-Berlin Stammtisch <a href="https://emacs-berlin.org/">https://emacs-berlin.org/</a> Tue Oct 13 1900 Europe/Berlin</li>
<li>OrgMeetup (virtual) <a href="https://orgmode.org/worg/orgmeetup.html">https://orgmode.org/worg/orgmeetup.html</a> Wed Oct 14 0900 America/Vancouver - 1100 America/Chicago - 1200 America/Toronto - 1600 Etc/UTC - 1800 Europe/Berlin - 2130 Asia/Kolkata &ndash; Thu Oct 15 0000 Asia/Singapore</li>
</ul></li>
<li>Beginner:
<ul class="org-ul">
<li><a href="https://www.jamescherti.com/emacs-resources/">A list of Emacs learning materials and references</a> (<a href="https://www.reddit.com/r/emacs/comments/1wwnyct/a_list_of_emacs_learning_materials_and_references/">Reddit</a>)</li>
</ul></li>
<li>Emacs configuration:
<ul class="org-ul">
<li><a href="https://lvajxi03.github.io/posts/2026-09-30/">Customize Me</a> (<a href="https://mastodon.social/@marcin_bielewicz/117361564204638422">@marcin_bielewicz</a>)</li>
<li><a href="https://github.com/joshbax189/package-load-indicator">[ANN] package-load-indicator: instantly see which packages are loaded within your init file</a> (<a href="https://www.reddit.com/r/emacs/comments/1wxu76q/ann_packageloadindicator_instantly_see_which/">Reddit</a>)</li>
</ul></li>
<li>Emacs Lisp:
<ul class="org-ul">
<li><a href="https://www.youtube.com/watch?v=0sQB5WsTZ7U">Reading the emacs compilation mode source code</a> (01:29:41)</li>
<li><a href="https://www.youtube.com/watch?v=tybv1j7H9nQ">Reading some emacs package source code (e.g. comint)</a> (01:20:07)</li>
<li><a href="https://www.youtube.com/watch?v=oXEWpyhwqxU">Desafio #1 | Divisão por 5 (Emacs+Elisp)</a> (19:53)</li>
</ul></li>
<li>Appearance:
<ul class="org-ul">
<li><a href="https://bsky.app/profile/citizen428.net/post/3mx4ncb2px22p">Tip: increase text scale for modes like elfeed-show - @citizen428.net on Bluesky</a></li>
<li><a href="https://github.com/jamescherti/persist-text-scale.el">jamescherti/persist-text-scale.el: Emacs: Persist and Restore Text Scale</a> (<a href="https://www.reddit.com/r/emacs/comments/1wvi9rq/persisttextscaleel_persist_and_restore_emacs_text/">Reddit</a>, <a href="https://irreal.org/blog/?p=14122">Irreal</a>)</li>
<li><a href="https://protesilaos.com/codelog/2026-10-05-emacs-doric-meadow-doric-mountain/">Protesilaos: Emacs: ‘doric-meadow’ and ‘doric-mountain’ coming to the ‘doric-themes’</a></li>
</ul></li>
<li>Navigation:
<ul class="org-ul">
<li><a href="https://techhub.social/@lispwizard/117365321892889079">Tip about C-r RET to turn isearch into a minibuffer prompt (@lispwizard@techhub.social)</a></li>
<li><a href="https://mbork.pl/2026-09-28_How_many_screens_left">Marcin Borkowski: How many screens left</a></li>
<li><a href="https://jmthornton.net/blog/p/emacs-project-override/">Overriding project.el project root in Emacs | Blog | Jade Michael Thornton</a> (<a href="https://floss.social/@artfulrobot/117384579308145113">@artfulrobot@floss.social</a>)</li>
<li><a href="https://github.com/ismd/preview-tab.el">preview-tab: VS Code's preview tab for Emacs, now on MELPA</a> (<a href="https://www.reddit.com/r/emacs/comments/1wu9jai/previewtab_vs_codes_preview_tab_for_emacs_now_on/">Reddit</a>)</li>
</ul></li>
<li>Dired:
<ul class="org-ul">
<li><a href="https://bsky.app/profile/citizen428.net/post/3mwwzlb2ett2s">Tip: dired-async-mode when you're doing long-running actions @citizen428.net on Bluesky</a></li>
</ul></li>
<li>Writing:
<ul class="org-ul">
<li><a href="https://citizen428.net/blog/emacs-simple-obsidian/">Emacs: Obsidian without external packages - citizen428.net</a></li>
<li><a href="https://christiantietze.de/posts/2026/09/watch-zettelkasten-for-regular-emacs-hackers/">Christian Tietze: Watch My EmacsConf Talk: Zettelkasten for Regular Emacs Hackers</a></li>
</ul></li>
<li>Denote:
<ul class="org-ul">
<li><a href="https://protesilaos.com/codelog/2026-09-29-emacs-denote-data-status-update/">Protesilaos: Emacs: status update on the ‘denote-data’ cache for Denote</a></li>
</ul></li>
<li>Org Mode:
<ul class="org-ul">
<li><a href="https://isamert.net/2026/10/04/opening-org-capture-in-a-new-frame.html">Isa Mert Gurbuz: Opening org-capture in a new frame</a></li>
<li><a href="https://github.com/davidlee/org-incremental-writing">org-incremental-writing package</a> (<a href="https://www.reddit.com/r/emacs/comments/1wxx7td/orgincrementalwriting_package/">Reddit</a>) - written with agent assistance</li>
<li><a href="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/">Sacha Chua: Emacs Chat 31: Pedro A. Aranda Gutierrez</a> - Org LaTeX export with fallbacks (<a href="https://www.youtube.com/watch?v=aEnacESU-DU">YouTube</a>)</li>
<li><a href="https://ray-on-emacs.blogspot.com/2026/09/now-org-toggle-timestamp-overlays-is.html">Raymond Zeitler: Now org-toggle-timestamp-overlays is Disabled</a></li>
<li><a href="https://github.com/bradmont/org-roam-tree/tree/master">Org-roam-tree update: jit rendering, arbitrary search and more!</a> (<a href="https://www.reddit.com/r/emacs/comments/1wvj882/orgroamtree_update_jit_rendering_arbitrary_search/">Reddit</a>)</li>
<li><a href="https://github.com/SenkiReign/roam-inline">inline backlinks for org-roam</a> (<a href="https://www.reddit.com/r/emacs/comments/1wu6wgk/inline_backlinks_for_orgroam/">Reddit</a>)</li>
<li><a href="https://github.com/yibie/excali-mode/releases/tag/v0.2.0">excali-mode 0.2.0: a diagram DSL with explicit placement and Org Babel support</a> (<a href="https://www.reddit.com/r/emacs/comments/1wuc6bk/excalimode_excalidraw_running_natively_inside/">Reddit</a>, <a href="https://www.reddit.com/r/emacs/comments/1wy58em/excalimode_020_a_diagram_dsl_with_explicit/">Reddit</a>)</li>
<li><a href="https://www.reddit.com/r/emacs/comments/1ww5ac7/github_does_not_preview_org_mode_files_anymore/">Github does not preview Org mode files any more</a> (<a href="https://github.com/github/markup/pull/2106">bug</a>)</li>
</ul></li>
<li>Coding:
<ul class="org-ul">
<li><a href="https://www.reddit.com/r/emacs/comments/1wxeb8l/ive_used_emacs_successfully_for_decades_without/">I've used emacs successfully for decades without using LSP or Eglot. Tell me what I'm missing.</a></li>
<li><a href="https://github.com/bigbuger/python-rope.el">A package using rope to do python code refactoring in emacs</a></li>
<li><a href="https://youtu.be/eVyr1dLExOw">Clutch update: a video walkthrough (PostgreSQL, JDBC, row editing, JSON hover preview)</a> (<a href="https://www.youtube.com/watch?v=eVyr1dLExOw">YouTube</a> 04:17, <a href="https://github.com/LuciusChen/clutch">GitHub</a>, <a href="https://www.reddit.com/r/emacs/comments/1wu8ewd/clutch_update_a_video_walkthrough_postgresql_jdbc/">Reddit</a>)</li>
</ul></li>
<li>Shells:
<ul class="org-ul">
<li><a href="https://ankit.earth/blog/fix-nested-emacs-frames/">Ankit Gadiya: Fix nested Emacs frames</a> (<a href="https://irreal.org/blog/?p=14124">Irreal</a>)</li>
</ul></li>
<li>Web:
<ul class="org-ul">
<li><a href="https://github.com/Daskeladden/canvas-browser">canvas-browser: a Chromium page in an Emacs buffer, drawn on an Emacs 32 canvas image</a> (<a href="https://www.reddit.com/r/emacs/comments/1wv56lq/canvasbrowser_a_chromium_page_in_an_emacs_buffer/">Reddit</a>)</li>
</ul></li>
<li>Mail, news, and chat:
<ul class="org-ul">
<li><a href="https://github.com/rougier/tootle">tootle: A tiny, text-only, read-only, emoji-free Mastodon client for Emacs.</a> (<a href="https://www.reddit.com/r/emacs/comments/1wvrnll/a_tiny_textonly_readonly_emojifree_mastodon/">Reddit</a>) Also rougier's experiment in vibe-coding</li>
<li><a href="http://en.andros.dev/blog/782e8f3b/how-i-built-a-whatsapp-client-for-emacs-without-an-api/">Andros Fenollosa: How I built a WhatsApp client for Emacs without an API</a></li>
</ul></li>
<li>Multimedia:
<ul class="org-ul">
<li><a href="http://yummymelon.com/devnull/announcing-triode-el.html">nfdn: Announcing triode.el - control an app for playing Internet radio</a> (<a href="https://sfba.social/@kickingvegas/117389609128787208">@kickingvegas@sfba.social</a>)</li>
</ul></li>
<li>Fun:
<ul class="org-ul">
<li><a href="http://curious.galthub.com/blog/2026-09-29/">Zippy in the mists of time · Curious Musings</a> (<a href="https://fosstodon.org/@eludom/117361750520628616">@eludom@fosstodon.org</a>)</li>
<li><a href="https://ray-on-emacs.blogspot.com/2026/10/what-is-spook.html">Raymond Zeitler: What is spook?</a></li>
<li><a href="https://dataswamp.org/~incal/el-gpu/">el-gpu</a> demo <a href="https://dataswamp.org/~incal/sw-vidz/pix-el.mkv">pix-el.mkv</a></li>
</ul></li>
<li>LLMs:
<ul class="org-ul">
<li><a href="https://github.com/ahyatt/llm">LLM release 0.33.0, with decisions!</a> (<a href="https://www.reddit.com/r/emacs/comments/1wxn0jg/llm_release_0330_with_decisions/">Reddit</a>, <a href="https://www.reddit.com/r/emacs/comments/1ws60sw/llm_package_support_for_jev_layastyle_quick/">Reddit</a>)</li>
<li><a href="https://www.youtube.com/watch?v=wwW7D80JK0M">AI built my Emacs plugin</a> (01:31)</li>
<li><a href="https://www.youtube.com/watch?v=mz9JQnCbbzg">Emacs ollama agent demo 01</a> (02:22)
<ul class="org-ul">
<li><a href="https://www.youtube.com/watch?v=MNpu2kRcKd0">introduction (配音版)</a> (06:04)</li>
<li><a href="https://www.youtube.com/watch?v=jkQnKvSrBaM">change font and size</a> (02:22)</li>
<li><a href="https://www.youtube.com/watch?v=zUwNkaD41ws">網站內容擷取</a> (01:14)</li>
<li><a href="https://www.youtube.com/watch?v=c81VC5mIWF4">排序</a> (02:17)</li>
</ul></li>
</ul></li>
<li>Community:
<ul class="org-ul">
<li><a href="https://www.emacswiki.org/emacs/CarnivalOctober2026">EmacsWiki : CarnivalOctober2026 - Crystal ball</a> (<a href="https://fosstodon.org/@eludom/117362492633626441">@eludom@fosstodon.org</a>)</li>
<li><a href="https://hachyderm.io/@emacs_london/117388137407624934">Matei Candea (social anthropologist) is looking for interviewees for a research project on Emacs, its users and its community (@emacs_london@hachyderm.io)</a></li>
<li><a href="https://social.tchncs.de/@omidmash/117364362694272553">Looking for people who want to have a Lisp meetup in Hamburg (@omidmash@social.tchncs.de)</a></li>
<li><a href="https://chrismaiorana.com/m-x-magic/">Chris Maiorana: M-x and the future of Emacs</a></li>
<li><a href="https://ffloyd.space/thoughts/2026-10-01-roman-and-editors">Roman and Editors ⋄ ffloyd.space</a> (<a href="https://mastodon.social/@ffloyd/117366593139144188">@ffloyd</a>)</li>
<li><a href="https://eliasebner.com/blog/thoughts/switching-to-emacs-as-a-neovim-user/">Switching To Emacs as a Neovim User</a> (<a href="https://www.reddit.com/r/emacs/comments/1wsmcxe/switching_to_emacs_as_a_neovim_user/">Reddit</a>, <a href="https://lobste.rs/s/bctr1m/switching_emacs_as_neovim_user">lobste.rs</a>)</li>
<li><a href="https://www.youtube.com/watch?v=ysq9HQ5H_gU">Yay Emacs 39: Testing my new streaming functions</a> (01:54:59) working on Emacs News, tinkering with speech commands
<ul class="org-ul">
<li><a href="https://www.youtube.com/watch?v=SqsxuN3CPWc">Yay Emacs 40: Tinkering with my speech commands and working on the schedule for EmacsConf</a> (58:14)</li>
</ul></li>
</ul></li>
<li>Other:
<ul class="org-ul">
<li><a href="https://www.youtube.com/watch?v=LmjESSIlyDg">Let Emacs make you happy</a> (12:05) - Highlight mode, sentences, split windows, Org mode, functions, and navigation.</li>
<li><a href="https://v.redd.it/phpq8z7eyxsh1">Emacs is now my new rofi</a> (<a href="https://www.reddit.com/r/emacs/comments/1wvepbp/emacs_is_now_my_new_rofi/">Reddit</a>) - emacsclient + vertico for launching applications</li>
<li><a href="http://yummymelon.com/devnull/announcing-aqui.html">nfdn: Announcing Aquí</a> (<a href="https://irreal.org/blog/?p=14114">Irreal</a>) - location finder</li>
<li><a href="https://github.com/cark/isled/blob/main/frontends/emacs/README.md">isled - a personal issue ledger</a> (<a href="https://www.reddit.com/r/emacs/comments/1wvgd6l/isled_a_personal_issue_ledger/">Reddit</a>) see also org-edna if you want to have task dependencies; mostly AI written</li>
<li><a href="https://github.com/jamescherti/bufferfile.el">Emacs bufferfile.el: Rename, Delete, or Copy Files and Associated Buffers (e.g., clones/indirect buffers) [Release 1.0.9]​</a></li>
<li><a href="https://github.com/ruediger/qrencode-el/releases/tag/v1.6">qrencode-el 1.6: export QR codes as SVG, get the SVG DOM using Elisp</a> (<a href="https://hachyderm.io/@ruediger/117368390989543260">@ruediger@hachyderm.io</a>)</li>
<li><a href="https://tv.dyne.org/w/aQTaXgg7Zvp7j5HNnnzoPN">[22] Emacs Reader: Rendering Architecture Refactor and Other Fixes - Dyne.org TV</a> (<a href="https://mathstodon.xyz/@divyaranjan/117383432660564714">@divyaranjan@mathstodon.xyz</a>)</li>
</ul></li>
<li>Emacs development:
<ul class="org-ul">
<li>emacs-devel:
<ul class="org-ul">
<li><a href="https://yhetil.org/emacs-devel/jwv1pa9r14c.fsf-monnier+emacs@gnu.org/">Getting rid of pathologically slow regexp matches - Stefan Monnier</a></li>
<li><a href="https://yhetil.org/emacs-devel/2b9df97c-4882-4f42-bdf0-4818a3afd81e@imayhem.com/">Library for exporting PDF - Cecilio Pardo</a></li>
<li><a href="https://yhetil.org/emacs-devel/jwv8q4oypd1.fsf-monnier+emacs@gnu.org/">Explanation of quoting in docstrings</a></li>
</ul></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=314cc0201f118daf5bd5a202a371166bbc3a492f">* lisp/faces.el (header-line-emphasis): New face.</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=1324e3660105b08a90596c47eee66eca5426aa01">Add a 'syntax-propertize-function' to 'lisp-mode'</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=f78ab3b719d3db8203b2bf9fc877a277a6d4ad1b">Indent HTML lists by a consistent width in SHR</a></li>
</ul></li>
<li>New packages:
<ul class="org-ul">
<li><a target="_blank" href="https://elpa.nongnu.org/nongnu/ebuild-mode.html">ebuild-mode</a>: edit ebuild and eclass files (NonGNU ELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/triode">triode</a>: Interface to Triode app, macOS internet radio (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/pyfun-mode">pyfun-mode</a>: Major mode for the Pyfun language (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/neofetch">neofetch</a>: Pretty system information tool for the Eshell (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/latex-to-svg-for-latex">latex-to-svg-for-latex</a>: Preview LaTeX math as SVG in LaTeX buffers (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/gptel-annotate">gptel-annotate</a>: Annotate files or buffers with LLMs (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/clel">clel</a>: Runtime library for ClojureElisp (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/brewpage">brewpage</a>: Publish buffers/regions to brewpage.app (MELPA)</li>
</ul></li>
</ul>

<p>
Links from <a href="https://www.reddit.com/r/emacs">reddit.com/r/emacs</a>, <a href="https://www.reddit.com/r/orgmode">r/orgmode</a>, <a href="https://www.reddit.com/r/spacemacs">r/spacemacs</a>, <a href="https://mastodon.social/tags/emacs">Mastodon #emacs</a>, <a href="https://bsky.app/hashtag/emacs">Bluesky #emacs</a>, <a href="https://hn.algolia.com/?query=emacs&amp;sort=byDate&amp;prefix&amp;page=0&amp;dateRange=all&amp;type=story">Hacker News</a>, <a href="https://lobste.rs/search?q=emacs&amp;what=stories&amp;order=newest">lobste.rs</a>, <a href="https://programming.dev/c/emacs?dataType=Post&amp;page=1&amp;sort=New">programming.dev</a>, <a href="https://lemmy.world/c/emacs">lemmy.world</a>, <a href="https://lemmy.ml/c/emacs?dataType=Post&amp;page=1&amp;sort=New">lemmy.ml</a>, <a href="https://planet.emacslife.com">planet.emacslife.com</a>, <a href="https://www.youtube.com/playlist?list=PL4th0AZixyREOtvxDpdxC9oMuX7Ar7Sdt">YouTube</a>, <a href="http://git.savannah.gnu.org/cgit/emacs.git/log/etc/NEWS">the Emacs NEWS file</a>, <a href="https://emacslife.com/calendar/">Emacs Calendar</a>, and <a href="https://lists.gnu.org/archive/html/emacs-devel/2026-10">emacs-devel</a>. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at <a href="mailto:sacha@sachachua.com">sacha@sachachua.com</a>. Thank you!</p>
<div><a href="https://sachachua.com/blog/2026/10/2026-10-05-emacs-news/index.org">View Org source for this post</a></div>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F10%2F2026-10-05-emacs-news%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>]]></description>
		</item><item>
		<title>Emacs Chat 31: Pedro A. Aranda Gutierrez</title>
		<link>https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Fri, 02 Oct 2026 23:01:46 GMT</pubDate>
    <category>emacs</category>
<category>emacs-chat</category>
		<guid isPermaLink="false">https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/</guid>
		<description><![CDATA[<p>
We chatted with Pedro about Org Mode, LaTeX exports and font management
including alternatives and things you can and can't do depending
on your choices.
</p>

<p>
Update <span class="timestamp-wrapper"><time class="timestamp" datetime="2026-10-04">[2026-10-04 Sun]</time></span>: Looks like the issue with the hand emoji was
that there's a regression in TeXLive: LaTeX 2024 produces the PDF with
the right fonts and colours, but LaTeX 2026 doesn't.
</p>

<p>
Links:
</p>

<ul class="org-ul">
<li><a href="https://codeberg.org/paaguti">paaguti - Codeberg.org</a></li>
<li><a href="https://orgmode.org/worg/org-mailing-list.html">Org mailing list</a></li>
</ul>

<p>
<video preload="none" controls="1" src="https://archive.org/download/emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez.webm" poster="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/2026-09-24_19-03-03.png" type="video/webm"><track kind="subtitles" label="Captions" src="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez.vtt" srclang="en" default=""><span>Video not supported. Thumbnail:<br><img src="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/2026-09-24_19-03-03.png" alt="Thumbnail"></span></video>
</p>

<p>
<a href="https://archive.org/details/emacs-chat-31-pedro-a-aranda-gutierrez/">View in the Internet Archive</a>, <a href="https://youtube.com/live/aEnacESU-DU">watch or comment on YouTube</a>, <a href="https://sachachua.com/blog/feed/index.xml#ID-emacs-chat-31-pedro-a-aranda-gutierrez-transcript">read the transcript online</a>, download the transcript (<a href="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez.vtt">VTT</a> or <a href="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez.txt">TXT</a>), or <a href="mailto:sacha@sachachua.com">e-mail me</a>.
</p>
<div id="outline-container-emacs-chat-31-pedro-a-aranda-gutierrez-chapters" class="outline-3">
<h3 id="emacs-chat-31-pedro-a-aranda-gutierrez-chapters"><a href="https://sachachua.com/blog/feed/index.xml#emacs-chat-31-pedro-a-aranda-gutierrez-chapters">Chapters</a></h3>
<div class="outline-text-3" id="text-emacs-chat-31-pedro-a-aranda-gutierrez-chapters">
<p>
</p><ul class="org-ul">
<li><span class="audio-time" data-start="0.031" data-stop="3.528">0:00</span> Opening</li>
<li><span class="audio-time" data-start="84.912" data-stop="90.099">1:24</span> Setting things up</li>
<li><span class="audio-time" data-start="153.222" data-stop="155.404">2:33</span> Local variables</li>

<li><span class="audio-time" data-start="236.831" data-stop="242.158">3:56</span> Mini export menu</li>

<li><span class="audio-time" data-start="257.281" data-stop="259.784">4:17</span> Basic output with different fonts</li>
<li><span class="audio-time" data-start="289.865" data-stop="296.215">4:49</span> Adding a code block as source</li>
<li><span class="audio-time" data-start="378.757" data-stop="381.700">6:18</span> The problem with exporting Unicode</li>
<li><span class="audio-time" data-start="465.578" data-stop="467.781">7:45</span> Trying a different font</li>
<li><span class="audio-time" data-start="545.026" data-stop="548.691">9:05</span> LuaLaTeX</li>
<li><span class="audio-time" data-start="637.678" data-stop="640.762">10:37</span> Switching to FreeSerif, FreeSans, and FreeMono</li>
<li><span class="audio-time" data-start="724.925" data-stop="726.507">12:04</span> LuaLaTeX is slower</li>
<li><span class="audio-time" data-start="762.482" data-stop="766.428">12:42</span> The fonts are rendered</li>
<li><span class="audio-time" data-start="822.896" data-stop="824.558">13:42</span> The farmer on the donkey in front of the train</li>
<li><span class="audio-time" data-start="935.772" data-stop="937.134">15:35</span> Unicode and LuaLaTeX</li>
<li><span class="audio-time" data-start="1020.428" data-stop="1021.449">17:00</span> Emojis</li>
<li><span class="audio-time" data-start="1117.654" data-stop="1123.061">18:37</span> Fallback fonts</li>

<li><span class="audio-time" data-start="1299.389" data-stop="1302.132">21:39</span> Fallback configuration</li>

<li><span class="audio-time" data-start="1367.285" data-stop="1369.810">22:47</span> Selecting fonts</li>
<li><span class="audio-time" data-start="1450.642" data-stop="1454.547">24:10</span> Fallbacks</li>
<li><span class="audio-time" data-start="1606.485" data-stop="1609.869">26:46</span> The LaTeX produced</li>

<li><span class="audio-time" data-start="1641.521" data-stop="1643.644">27:21</span> Character families should be in the Messages buffer</li>
<li><span class="audio-time" data-start="1809.653" data-stop="1812.076">30:09</span> Behind the scenes</li>
<li><span class="audio-time" data-start="1860.410" data-stop="1862.292">31:00</span> Refreshing local variables</li>
<li><span class="audio-time" data-start="2017.885" data-stop="2023.331">33:37</span> Scaling fonts to match lowercase</li>

<li><span class="audio-time" data-start="2057.987" data-stop="2062.375">34:17</span> Specifying the fallbacks</li>
<li><span class="audio-time" data-start="2133.006" data-stop="2136.350">35:33</span> HarfBuzz</li>
<li><span class="audio-time" data-start="2177.821" data-stop="2180.284">36:17</span> Upcoming work on Babel (the LaTeX package)</li>
<li><span class="audio-time" data-start="2222.401" data-stop="2225.364">37:02</span> More about HarfBuzz and ligatures?</li>
<li><span class="audio-time" data-start="2363.982" data-stop="2368.612">39:23</span> Upcoming talk on accessible presentations</li>
<li><span class="audio-time" data-start="2479.838" data-stop="2482.741">41:19</span> Upcoming work on Polyglossia and Babel</li>
<li><span class="audio-time" data-start="2522.932" data-stop="2529.583">42:02</span> Chinese, Japanese, and Korean</li>

<li><span class="audio-time" data-start="2662.973" data-stop="2666.497">44:22</span> The development process</li>
<li><span class="audio-time" data-start="2892.519" data-stop="2894.583">48:12</span> Retirement</li>
<li><span class="audio-time" data-start="2981.142" data-stop="2982.285">49:41</span> Fallback fonts</li>
<li><span class="audio-time" data-start="3186.429" data-stop="3189.254">53:06</span> LaTeX versions</li>
<li><span class="audio-time" data-start="3398.714" data-stop="3402.640">56:38</span> Sans serif fonts are better for accessibility</li>
<li><span class="audio-time" data-start="3429.775" data-stop="3432.518">57:09</span> Wanting markup for sans serif</li>
<li><span class="audio-time" data-start="3633.922" data-stop="3638.668">1:00:33</span> Contacting Pedro</li>
</ul>

<p></p>
</div>
</div>
<div id="outline-container-emacs-chat-31-pedro-a-aranda-gutierrez-transcript-section" class="outline-3">
<h3 id="emacs-chat-31-pedro-a-aranda-gutierrez-transcript-section"><a href="https://sachachua.com/blog/feed/index.xml#emacs-chat-31-pedro-a-aranda-gutierrez-transcript-section">Transcript</a></h3>
<div class="outline-text-3" id="text-emacs-chat-31-pedro-a-aranda-gutierrez-transcript-section">
<details class="code-details"><a name="ID-emacs-chat-31-pedro-a-aranda-gutierrez-transcript"></a><summary>Expand this to read the transcript</summary>
<p>
</p><div class="full-transcript"><p></p><div class="transcript-heading"><span class="audio-time" data-start="0.000000">0:00</span> <strong>Opening</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="0.031000" data-stop="3.528000"><strong class="speaker-name">Sacha:</strong>  But first, I will press the go live</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3.568000" data-stop="5.738000">button because this time I'm going to remember.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="9.042000" data-stop="13.068000">Okay, now I think we are live.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="13.829000" data-stop="17.014000">Welcome to Emacs Chat 31.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="17.034000" data-stop="20.840000">Today we have Pedro Aranda Gutierrez, who is here</span> <span class="audio-time caption" data-speaker="Sacha" data-start="20.900000" data-stop="23.212000">to talk about all the cool things</span> <span class="audio-time caption" data-speaker="Sacha" data-start="23.213000" data-stop="24.706000">with Org LaTeX Export.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="25.527000" data-stop="28.612000">And Prot is here also because he knows a lot more</span> <span class="audio-time caption" data-speaker="Sacha" data-start="28.652000" data-stop="30.795000">about fonts and writing in multiple languages and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="30.815000" data-stop="31.356000">all that stuff.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="31.376000" data-stop="33.559000">So I'm counting on Prot to ask questions when my</span> <span class="audio-time caption" data-speaker="Sacha" data-start="33.579000" data-stop="37.345000">mind just goes like, ooh, cool demo.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="37.848000" data-stop="42.934000"><strong class="speaker-name">Pedro:</strong>  Hello, here we are.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="44.256000" data-stop="49.803000">So yes, I wanted to talk about what is news for all.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="50.544000" data-stop="55.269000">At least this part, the integration of the basic</span> <span class="audio-time caption" data-speaker="Pedro" data-start="55.309000" data-stop="61.937000">font management with lualatex is in main</span> <span class="audio-time caption" data-speaker="Pedro" data-start="61.938000" data-stop="63.079000">right now in Org Mode.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="64.358000" data-stop="65.239000"><strong class="speaker-name">Prot:</strong>  Very well, very well.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="65.259000" data-stop="70.968000"><strong class="speaker-name">Pedro:</strong>  I was not expecting that to happen,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="70.969000" data-stop="73.072000">but it happened.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="73.092000" data-stop="74.194000">So that's the situation.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="74.755000" data-stop="80.004000">And I would just like to go stepwise on what you</span> <span class="audio-time caption" data-speaker="Pedro" data-start="80.044000" data-stop="82.468000">have to do, what you can do, what you can't do</span> <span class="audio-time caption" data-speaker="Pedro" data-start="83.289000" data-stop="84.932000">with these things.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="84.000000">1:24</span> <strong>Setting things up</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="84.912000" data-stop="90.099000"><strong class="speaker-name">Pedro:</strong> This is my Emacs 31 compiled a couple of days</span> <span class="audio-time caption" data-speaker="Pedro" data-start="90.139000" data-stop="91.821000">ago and I'm on devel.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="92.081000" data-stop="97.167000">I'm on main here, on main for Org mode.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="98.549000" data-stop="102.054000">I have a small Org file here which initially</span> <span class="audio-time caption" data-speaker="Pedro" data-start="102.154000" data-stop="104.777000">I'm going to be using pdflatex to compile,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="106.073000" data-stop="109.218000">with a trick: I'm not compiling in the background,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="109.279000" data-stop="113.165000">but I have a script here in the terminal to have</span> <span class="audio-time caption" data-speaker="Pedro" data-start="113.205000" data-stop="117.413000">a bit more of feedback or direct feedback of what</span> <span class="audio-time caption" data-speaker="Pedro" data-start="117.493000" data-stop="118.054000">is happening.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="119.296000" data-stop="122.901000">If we go through this...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="122.902000" data-stop="127.550000">I mean this is basically my template</span> <span class="audio-time caption" data-speaker="Pedro" data-start="127.830000" data-stop="129.854000">to start any article. It's going to be an</span> <span class="audio-time caption" data-speaker="Pedro" data-start="129.954000" data-stop="130.495000">article.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="132.533000" data-stop="134.296000">we are going to use pdflatex.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="135.358000" data-stop="141.770000">And the other thing is I have a very small thing</span> <span class="audio-time caption" data-speaker="Pedro" data-start="141.891000" data-stop="144.596000">with the default font.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="144.676000" data-stop="147.100000">Then I have also the Sans Serif font.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="147.701000" data-stop="152.871000">I also have some monospaced fonts with it.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="153.000000">2:33</span> <strong>Local variables
</strong></div><p></p><a href="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-03-16-167.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-03-16-167.jpg" alt="image from video 00:03:16.167" data-time="00:03:16.167"></a><span class="audio-time caption" data-speaker="Pedro" data-start="153.222000" data-stop="155.404000"><strong class="speaker-name">Pedro:</strong> The things that I have here that might be</span> <span class="audio-time caption" data-speaker="Pedro" data-start="155.444000" data-stop="157.867000">interesting for people is that another thing that</span> <span class="audio-time caption" data-speaker="Pedro" data-start="157.967000" data-stop="161.911000">is quite recent for Emacs is that we are starting</span> <span class="audio-time caption" data-speaker="Pedro" data-start="161.971000" data-stop="169.339000">to have a lot of the configuration variables as</span> <span class="audio-time caption" data-speaker="Pedro" data-start="169.459000" data-stop="170.420000">local variables.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="170.440000" data-stop="173.723000">So you don't have to go and get in</span> <span class="audio-time caption" data-speaker="Pedro" data-start="173.724000" data-stop="177.508000">your init's .el to have anything configured.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="177.725000" data-stop="178.547000">Why?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="178.567000" data-stop="182.474000">This is another sort of fight against the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="182.654000" data-stop="183.696000">windmills I've had.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="184.618000" data-stop="184.879000">Why?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="185.099000" data-stop="189.287000">Because with this I can make my Org files more</span> <span class="audio-time caption" data-speaker="Pedro" data-start="189.327000" data-stop="191.251000">distributable, so I can share them with more</span> <span class="audio-time caption" data-speaker="Pedro" data-start="191.291000" data-stop="193.936000">people and they don't have to touch anything in</span> <span class="audio-time caption" data-speaker="Pedro" data-start="193.996000" data-stop="195.138000">their configurations.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="196.160000" data-stop="198.805000">That's the basic idea.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="199.392000" data-stop="202.795000">Small little trick that I have is that I'm using</span> <span class="audio-time caption" data-speaker="Pedro" data-start="202.875000" data-stop="206.258000">fancyvrb for everything instead of listings.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="207.139000" data-stop="211.163000">And there was somewhere in the documentation, you</span> <span class="audio-time caption" data-speaker="Pedro" data-start="211.183000" data-stop="215.046000">also have an explanation for how to use fancyvrb</span> <span class="audio-time caption" data-speaker="Pedro" data-start="215.507000" data-stop="218.469000">to substitute listings and get nice listings in</span> <span class="audio-time caption" data-speaker="Pedro" data-start="218.529000" data-stop="225.796000">your LaTeX exported by Org.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="225.816000" data-stop="229.399000">And that's the only thing.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="229.379000" data-stop="231.663000">Initially, pdflatex,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="231.763000" data-stop="232.844000">Everything is plain.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="233.726000" data-stop="236.830000">If I go and just go and export...</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="236.000000">3:56</span> <strong>Mini export menu
</strong></div><p></p><a href="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-03-57-700.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-03-57-700.jpg" alt="image from video 00:03:57.700" data-time="00:03:57.700"></a><span class="audio-time caption" data-speaker="Pedro" data-start="236.831000" data-stop="242.158000"><strong class="speaker-name">Pedro:</strong> This is a mini export menu I have myself</span> <span class="audio-time caption" data-speaker="Pedro" data-start="242.159000" data-stop="242.920000">because I think it's</span> <span class="audio-time caption" data-speaker="Pedro" data-start="243.461000" data-stop="249.350000">much more handy than the export thing that we</span> <span class="audio-time caption" data-speaker="Pedro" data-start="249.410000" data-stop="250.092000">have in Org Mode.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="250.112000" data-stop="252.315000">So I did a small one for me.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="252.295000" data-stop="257.280000">And so I'm exporting to LaTeX and there you see the...</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="257.000000">4:17</span> <strong>Basic output with different fonts</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="257.281000" data-stop="259.784000"><strong class="speaker-name">Pedro:</strong> This was quick, of course, but what you</span> <span class="audio-time caption" data-speaker="Pedro" data-start="259.803000" data-stop="265.311000">see is I have my serif, my sans serif, and I have</span> <span class="audio-time caption" data-speaker="Pedro" data-start="265.431000" data-stop="270.497000">my monofont and that's nice, right?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="270.517000" data-stop="273.381000">So that's one of the things that we always want</span> <span class="audio-time caption" data-speaker="Pedro" data-start="273.421000" data-stop="273.741000">to have.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="274.622000" data-stop="278.387000">Now, the next thing is everything would be nice.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="279.008000" data-stop="285.759000">And now I need my [??], full file where I</span> <span class="audio-time caption" data-speaker="Pedro" data-start="285.799000" data-stop="287.842000">have the rest of the things that I want to copy</span> <span class="audio-time caption" data-speaker="Pedro" data-start="287.882000" data-stop="289.304000">and paste into this presentation.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="289.000000">4:49</span> <strong>Adding a code block as source</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="289.865000" data-stop="296.215000"><strong class="speaker-name">Pedro:</strong> Everything would be nice if I just were to go and</span> <span class="audio-time caption" data-speaker="Pedro" data-start="296.575000" data-stop="304.253000">add a small command to do things, but I'm only going</span> <span class="audio-time caption" data-speaker="Pedro" data-start="304.293000" data-stop="305.756000">to be listing the source.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="306.157000" data-stop="309.363000">So let me just go and check that.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="309.383000" data-stop="312.689000">If I do like this, so I have a small listing.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="313.070000" data-stop="314.492000">Why do I need listings?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="314.593000" data-stop="317.378000">This is partially for my lectures.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="318.480000" data-stop="322.347000">I want to share code with my students and tell them</span> <span class="audio-time caption" data-speaker="Pedro" data-start="323.238000" data-stop="324.820000">how to program, right?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="325.560000" data-stop="328.724000">Or they are in a lab and they need an example of</span> <span class="audio-time caption" data-speaker="Pedro" data-start="328.784000" data-stop="332.508000">a command that they need to achieve a search and</span> <span class="audio-time caption" data-speaker="Pedro" data-start="332.568000" data-stop="333.849000">output in the computer.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="334.790000" data-stop="338.094000">So what I would do, first step, which would</span> <span class="audio-time caption" data-speaker="Pedro" data-start="338.314000" data-stop="342.318000">also work with pdflatex, is I'm going to go and</span> <span class="audio-time caption" data-speaker="Pedro" data-start="342.418000" data-stop="344.140000">export the source.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="344.160000" data-stop="346.663000">If I now go and export the source,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="348.010000" data-stop="354.297000">I got a second compile, and now you see that I</span> <span class="audio-time caption" data-speaker="Pedro" data-start="354.357000" data-stop="355.422000">included the command.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="356.583000" data-stop="361.571000">Nice thing about using fancyvrb here is that as</span> <span class="audio-time caption" data-speaker="Pedro" data-start="361.651000" data-stop="366.498000">I have fancyvrb here configured, I'm using the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="366.578000" data-stop="369.242000">listings stuff, but this is the configuration for</span> <span class="audio-time caption" data-speaker="Pedro" data-start="369.282000" data-stop="369.863000">fancyvrb.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="370.204000" data-stop="373.629000">I can include things like a frame to separate</span> <span class="audio-time caption" data-speaker="Pedro" data-start="373.950000" data-stop="378.777000">code from other things in the document.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="378.000000">6:18</span> <strong>The problem with exporting Unicode</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="378.757000" data-stop="381.700000"><strong class="speaker-name">Pedro:</strong> But now here problems started and this is this</span> <span class="audio-time caption" data-speaker="Pedro" data-start="381.741000" data-stop="385.225000">was practically what happened two years ago when</span> <span class="audio-time caption" data-speaker="Pedro" data-start="385.265000" data-stop="388.669000">someone asked in the list how can I do this and</span> <span class="audio-time caption" data-speaker="Pedro" data-start="388.709000" data-stop="390.991000">the thing is he also wanted to have something</span> <span class="audio-time caption" data-speaker="Pedro" data-start="391.071000" data-stop="394.195000">like I want to export both so I also want to</span> <span class="audio-time caption" data-speaker="Pedro" data-start="394.255000" data-stop="394.956000">export the results.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="397.699000" data-stop="399.041000">Let's see what happens in this case.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="399.341000" data-stop="401.784000">It's the tree command so it will be showing a</span> <span class="audio-time caption" data-speaker="Pedro" data-start="401.844000" data-stop="404.747000">couple of files that I have on my on my system</span> <span class="audio-time caption" data-speaker="Pedro" data-start="405.809000" data-stop="407.751000">and let's see what happens with pdflatex.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="413.198000" data-stop="418.327000">It seems to be working, but then if you go to the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="418.488000" data-stop="420.852000">log, and this is why I have the log here, you</span> <span class="audio-time caption" data-speaker="Pedro" data-start="420.872000" data-stop="424.078000">start seeing a lot of errors.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="426.042000" data-stop="426.342000">Why?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="426.402000" data-stop="430.249000">Because it has records that do not exist.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="430.269000" data-stop="431.151000"><strong class="speaker-name">Prot:</strong>  Missing characters.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="431.952000" data-stop="433.656000"><strong class="speaker-name">Pedro:</strong>  Missing characters and things like that.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="433.796000" data-stop="435.018000">So this was the question.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="435.058000" data-stop="436.641000">How can I solve this?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="437.954000" data-stop="441.740000">The obvious answer is pdflatex is not as good</span> <span class="audio-time caption" data-speaker="Pedro" data-start="441.900000" data-stop="447.208000">with UTF-8 extended, so migrate to lualatex.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="450.534000" data-stop="451.615000">That was one of the things.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="452.637000" data-stop="455.902000">But you could actually do it.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="456.122000" data-stop="462.092000">Before going to that, people said, let's go back</span> <span class="audio-time caption" data-speaker="Pedro" data-start="462.152000" data-stop="463.033000">and put source.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="465.000000">7:45</span> <strong>Trying a different font</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="465.578000" data-stop="467.781000"><strong class="speaker-name">Pedro:</strong> You already have the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="467.841000" data-stop="472.989000">different font packages in in pdflatex, so why not</span> <span class="audio-time caption" data-speaker="Pedro" data-start="473.390000" data-stop="475.433000">using one of the font packages that you have, for</span> <span class="audio-time caption" data-speaker="Pedro" data-start="475.493000" data-stop="478.517000">example, the Bera fonts. This Bera font here</span> <span class="audio-time caption" data-speaker="Pedro" data-start="478.557000" data-stop="481.862000">Bera, Bera Sans and Bera Mono should</span> <span class="audio-time caption" data-speaker="Pedro" data-start="482.604000" data-stop="485.187000">allow you to do what you want to do. I checked.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="486.069000" data-stop="488.793000">What I'm doing here is I have</span> <span class="audio-time caption" data-speaker="Pedro" data-start="488.813000" data-stop="493.560000">my local variables.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="494.198000" data-stop="496.781000">I've refreshed my local variables to include</span> <span class="audio-time caption" data-speaker="Pedro" data-start="497.262000" data-stop="500.024000">in the packages, the packages for Bera,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="500.025000" data-stop="501.767000">Bera sans, and Bera mono.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="503.049000" data-stop="503.950000">Let's see what happens.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="504.070000" data-stop="514.602000">If I go just for the source, I get the Bera thing.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="514.643000" data-stop="518.607000">So there should be some sort, I get the Bera font</span> <span class="audio-time caption" data-speaker="Pedro" data-start="518.628000" data-stop="519.269000">integrated.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="520.429000" data-stop="523.498000">So there should be some hope with this.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="523.938000" data-stop="524.239000">Fine.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="524.820000" data-stop="531.649000">So let's go back into doing things with the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="531.889000" data-stop="532.890000">results included.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="536.615000" data-stop="537.196000">Bad luck.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="538.558000" data-stop="539.879000">We continue to have this problem.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="540.260000" data-stop="542.303000">This is inherent to pdflatex.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="544.185000" data-stop="544.425000">Right?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="545.000000">9:05</span> <strong>LuaLaTeX</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="545.026000" data-stop="548.691000"><strong class="speaker-name">Pedro:</strong> So we have to move to lualatex, right?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="552.232000" data-stop="556.878000">And now to be able to do what I'm doing here with</span> <span class="audio-time caption" data-speaker="Pedro" data-start="556.938000" data-stop="559.921000">lualatex and with my script in the background</span> <span class="audio-time caption" data-speaker="Pedro" data-start="559.961000" data-stop="562.585000">to see what is happening, I just need to get out</span> <span class="audio-time caption" data-speaker="Pedro" data-start="563.666000" data-stop="564.527000">and get in again.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="570.574000" data-stop="574.619000">So we were at this point, we had the Bera fonts.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="575.300000" data-stop="579.866000">Let's go to see the Bera fonts just with a source</span> <span class="audio-time caption" data-speaker="Pedro" data-start="580.667000" data-stop="581.648000">on lualatex.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="582.877000" data-stop="584.881000">This is something that some people ask.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="593.256000" data-stop="595.440000">The Bera fonts don't have the mono font.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="596.502000" data-stop="598.405000">So we have to move to something else.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="600.494000" data-stop="601.756000">Fine.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="601.776000" data-stop="603.658000">That's point number one.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="604.379000" data-stop="606.040000">And since that does not work...</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="606.041000" data-stop="608.484000"><strong class="speaker-name">Prot:</strong>  Sans also, right?</span> <span class="audio-time caption" data-speaker="Prot" data-start="608.504000" data-stop="610.406000">You should have a sans-serif line.</span> <span class="audio-time caption" data-speaker="Prot" data-start="610.426000" data-stop="612.869000">I didn't see that.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="613.050000" data-stop="613.790000"><strong class="speaker-name">Pedro:</strong>  Yes. Exactly.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="614.511000" data-stop="617.735000">So the Bera fonts, as some people suggested, do</span> <span class="audio-time caption" data-speaker="Pedro" data-start="617.855000" data-stop="621.540000">not work with lualatex as we want.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="622.820000" data-stop="627.686000">So if this doesn't work and the corresponding is</span> <span class="audio-time caption" data-speaker="Pedro" data-start="627.746000" data-stop="632.452000">not one-to-one, so why not go directly into using</span> <span class="audio-time caption" data-speaker="Pedro" data-start="632.492000" data-stop="637.638000">the full thing with lualatex, right?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="637.000000">10:37</span> <strong>Switching to FreeSerif, FreeSans, and FreeMono</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="637.678000" data-stop="640.762000"><strong class="speaker-name">Pedro:</strong> The first thing I would have to do is I'm going</span> <span class="audio-time caption" data-speaker="Pedro" data-start="640.802000" data-stop="642.964000">to get rid of the Bera fonts here</span> <span class="audio-time caption" data-speaker="Pedro" data-start="642.965000" data-stop="650.154000">in my local variables.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="650.174000" data-stop="651.055000">I put it at the end.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="652.823000" data-stop="656.528000">So now with my local variables like this, I'm</span> <span class="audio-time caption" data-speaker="Pedro" data-start="656.608000" data-stop="659.511000">only going to have packages like enumitem and</span> <span class="audio-time caption" data-speaker="Pedro" data-start="659.591000" data-stop="660.232000">fancyvrb.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="662.675000" data-stop="667.361000">I'm going to be using lualatex and now in a</span> <span class="audio-time caption" data-speaker="Pedro" data-start="667.401000" data-stop="670.144000">very big first thing, what I would have to do is</span> <span class="audio-time caption" data-speaker="Pedro" data-start="670.505000" data-stop="675.811000">to start with my LaTeX header and then start</span> <span class="audio-time caption" data-speaker="Pedro" data-start="675.851000" data-stop="677.173000">with my setmainfont.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="677.573000" data-stop="679.354000">Let's say we use the simple ones,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="679.355000" data-stop="681.598000">the setmainfont</span> <span class="audio-time caption" data-speaker="Pedro" data-start="682.979000" data-stop="694.092000">FreeSerif, FreeSans... As always, the fingers are...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="698.096000" data-stop="706.025000">And here you go with the mono, and with the mono</span> <span class="audio-time caption" data-speaker="Pedro" data-start="706.406000" data-stop="709.249000">right. Let's try this at this point in time.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="709.589000" data-stop="711.210000">What will happen? I'm going to be using</span> <span class="audio-time caption" data-speaker="Pedro" data-start="711.211000" data-stop="713.908000">the free fonts directly</span> <span class="audio-time caption" data-speaker="Pedro" data-start="713.909000" data-stop="716.633000">with lualatex and with lualatex commands.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="718.315000" data-stop="719.437000">Let's see what happens here.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="722.401000" data-stop="724.524000">Starts compiling, starts compiling.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="724.000000">12:04</span> <strong>LuaLaTeX is slower</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="724.925000" data-stop="726.507000"><strong class="speaker-name">Pedro:</strong> lualatex is slower, yes.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="727.529000" data-stop="730.473000">That's the main drawback, mainly for people who</span> <span class="audio-time caption" data-speaker="Pedro" data-start="730.553000" data-stop="737.083000">want to have equations, LaTeX preview.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="739.055000" data-stop="742.182000">In Org, when they want to have the preview for</span> <span class="audio-time caption" data-speaker="Pedro" data-start="742.242000" data-stop="745.689000">equations and maths and so on in Org Mode, that</span> <span class="audio-time caption" data-speaker="Pedro" data-start="746.370000" data-stop="750.860000">is the main challenge because lualatex gets</span> <span class="audio-time caption" data-speaker="Pedro" data-start="750.880000" data-stop="754.588000">slower, and that will of course make them not be</span> <span class="audio-time caption" data-speaker="Pedro" data-start="754.688000" data-stop="761.060000">able to get a flashy auto-refreshing display and so on.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="762.000000">12:42</span> <strong>The fonts are rendered</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="762.482000" data-stop="766.428000"><strong class="speaker-name">Pedro:</strong> But the thing for me and for my manuals, if you</span> <span class="audio-time caption" data-speaker="Pedro" data-start="766.488000" data-stop="769.693000">want to say it like this, is that first of all we</span> <span class="audio-time caption" data-speaker="Pedro" data-start="769.753000" data-stop="773.158000">have here the serif fonts, you have the sans</span> <span class="audio-time caption" data-speaker="Pedro" data-start="773.178000" data-stop="777.064000">fonts, you have the mono font with the free fonts, right?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="778.146000" data-stop="782.012000">So the next thing that came in was of course,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="782.453000" data-stop="786.038000">let's see what happens with the listing.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="798.893000" data-stop="804.664000">Takes longer, but that is something that I can</span> <span class="audio-time caption" data-speaker="Pedro" data-start="804.864000" data-stop="808.731000">use to show my students how things will look like</span> <span class="audio-time caption" data-speaker="Pedro" data-start="808.832000" data-stop="809.353000">in the screen.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="811.717000" data-stop="815.424000">And this was a question that was raised beginning</span> <span class="audio-time caption" data-speaker="Pedro" data-start="815.444000" data-stop="817.628000">of 2024 in the list.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="820.392000" data-stop="821.694000"><strong class="speaker-name">Sacha:</strong>  I appreciate your persistence.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="822.000000">13:42</span> <strong>The farmer on the donkey in front of the train</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="822.896000" data-stop="824.558000"><strong class="speaker-name">Pedro:</strong>  Yes.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="825.560000" data-stop="830.086000">There's this film, Spanish film from the 30s,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="830.126000" data-stop="831.188000">from beginning of the 30s.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="831.288000" data-stop="833.211000">It was still Republic before the Civil War.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="834.092000" data-stop="840.882000">And there's a man dressed as a farmer in Aragon</span> <span class="audio-time caption" data-speaker="Pedro" data-start="841.443000" data-stop="845.809000">(they are known to be very stubborn) on his donkey</span> <span class="audio-time caption" data-speaker="Pedro" data-start="845.789000" data-stop="847.752000">on a train track,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="848.493000" data-stop="851.778000">and the train behind him, and he doesn't move</span> <span class="audio-time caption" data-speaker="Pedro" data-start="851.798000" data-stop="852.799000">from the track.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="852.819000" data-stop="856.885000">The only thing he's saying, "You can toot as much</span> <span class="audio-time caption" data-speaker="Pedro" data-start="856.945000" data-stop="858.467000">as you want, I'm not going to move.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="858.808000" data-stop="860.450000">If you want to move, move yourself."</span> <span class="audio-time caption" data-speaker="Pedro" data-start="860.871000" data-stop="861.532000">So he continues.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="861.592000" data-stop="865.377000">And the train, and the people: "Why don't you move?"</span> <span class="audio-time caption" data-speaker="Pedro" data-start="865.898000" data-stop="867.761000">At the end, they come to a joint, he</span> <span class="audio-time caption" data-speaker="Pedro" data-start="867.821000" data-stop="870.084000">continues on the road, and the train takes the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="870.144000" data-stop="871.165000">other track.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="871.186000" data-stop="874.170000">When the train goes by, he says, I told you,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="874.250000" data-stop="875.712000">you had to go another way.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="877.548000" data-stop="880.974000">So this is more or less, this in Spanish has</span> <span class="audio-time caption" data-speaker="Pedro" data-start="881.054000" data-stop="885.422000">become a saying.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="885.622000" data-stop="887.045000">It's more than a phrase.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="887.145000" data-stop="889.269000">It's a chufla chufla.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="890.311000" data-stop="894.017000">And I'm a bit of a chufla chufla.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="894.197000" data-stop="897.263000">When I think that there's something that needs to</span> <span class="audio-time caption" data-speaker="Pedro" data-start="897.303000" data-stop="899.607000">be done, I can be very stubborn.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="901.713000" data-stop="905.779000"><strong class="speaker-name">Prot:</strong>  And of course you need to be stubborn</span> <span class="audio-time caption" data-speaker="Prot" data-start="906.119000" data-stop="909.704000">because these sorts of things are tricky and they</span> <span class="audio-time caption" data-speaker="Prot" data-start="909.784000" data-stop="911.606000">require time. Especially on</span> <span class="audio-time caption" data-speaker="Prot" data-start="911.607000" data-stop="914.069000">a mailing-list-driven workflow,</span> <span class="audio-time caption" data-speaker="Prot" data-start="914.070000" data-stop="915.952000">you have to listen to what users want.</span> <span class="audio-time caption" data-speaker="Prot" data-start="915.953000" data-stop="918.696000">You have to take in feedback. It is a slow process.</span> <span class="audio-time caption" data-speaker="Prot" data-start="918.697000" data-stop="920.279000">You really have to be patient and</span> <span class="audio-time caption" data-speaker="Prot" data-start="920.339000" data-stop="921.640000">stubborn, for sure.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="921.641000" data-stop="929.492000"><strong class="speaker-name">Pedro:</strong>  Yes. Basically, my motivation was I know that I need it.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="930.485000" data-stop="933.089000">Maybe other people don't want to say,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="933.129000" data-stop="934.310000">but they need it also.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="935.000000">15:35</span> <strong>Unicode and LuaLaTeX</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="935.772000" data-stop="937.134000"><strong class="speaker-name">Prot:</strong>  Can I ask a comment?</span> <span class="audio-time caption" data-speaker="Prot" data-start="937.214000" data-stop="939.898000">Can I ask a question here or will you continue?</span> <span class="audio-time caption" data-speaker="Prot" data-start="939.918000" data-stop="943.844000">Because I want to clarify the Unicode characters.</span> <span class="audio-time caption" data-speaker="Prot" data-start="944.104000" data-stop="945.406000">Earlier we were getting an error.</span> <span class="audio-time caption" data-speaker="Prot" data-start="946.187000" data-stop="947.909000">Now we see the tree.</span> <span class="audio-time caption" data-speaker="Prot" data-start="949.151000" data-stop="951.734000">Is this because of FreeFont?</span> <span class="audio-time caption" data-speaker="Prot" data-start="951.754000" data-stop="953.417000">Is this because of lualatex?</span> <span class="audio-time caption" data-speaker="Prot" data-start="953.917000" data-stop="954.739000">Is it a combination?</span> <span class="audio-time caption" data-speaker="Prot" data-start="954.879000" data-stop="957.943000">What exactly helped us fix this?</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="958.160000" data-stop="961.404000"><strong class="speaker-name">Pedro:</strong>  Okay, it's a very, very good question.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="961.444000" data-stop="962.545000">I was forgetting that.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="962.946000" data-stop="964.528000">So here we have a combination.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="966.490000" data-stop="971.576000">lualatex is handling the UTF characters very nicely.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="971.596000" data-stop="975.541000">Something that pdflatex did not or was very</span> <span class="audio-time caption" data-speaker="Pedro" data-start="975.581000" data-stop="978.685000">difficult to have them done, doing it.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="979.686000" data-stop="984.212000">The second thing is that Free Mono has these</span> <span class="audio-time caption" data-speaker="Pedro" data-start="985.013000" data-stop="986.074000">display characters.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="986.763000" data-stop="988.307000">which is also important.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="989.010000" data-stop="991.096000">And of course, if you want to use free mono, you</span> <span class="audio-time caption" data-speaker="Pedro" data-start="991.156000" data-stop="995.568000">need to use lualatex to drive the thing.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="995.589000" data-stop="997.554000">So it's the three things.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="997.574000" data-stop="1000.663000">You have the right font, the right compiler and</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1000.703000" data-stop="1001.987000">the right environment.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1003.486000" data-stop="1009.173000">So the next thing is, of course, also on the list.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1009.193000" data-stop="1012.838000">Once again, I need my full because it's going to</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1012.878000" data-stop="1015.982000">be a bit quicker than if I go writing everything</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1016.062000" data-stop="1016.583000">on my own.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1017.284000" data-stop="1020.427000">If I go down...</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1020.000000">17:00</span> <strong>Emojis</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1020.428000" data-stop="1021.449000"><strong class="speaker-name">Pedro:</strong> There was someone saying,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1021.569000" data-stop="1024.313000">"Hey, I want my emojis."</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1027.056000" data-stop="1028.278000"><strong class="speaker-name">Sacha:</strong>  They're very important, you know.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1029.490000" data-stop="1031.352000"><strong class="speaker-name">Pedro:</strong>  Yeah, I know.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1031.412000" data-stop="1035.217000">For me, it's as important as for anyone.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1036.238000" data-stop="1042.185000">Because maybe you want this, or if you're just...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1042.305000" data-stop="1047.431000">If I'm on a manual, I might want to point out</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1047.491000" data-stop="1053.378000">things like... And then I go with the hand, with</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1053.418000" data-stop="1057.843000">the body, with the hand, with the...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1059.072000" data-stop="1062.256000">single finger which is the S and then I just want</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1062.297000" data-stop="1066.342000">to point at things like this for example and to</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1066.402000" data-stop="1070.648000">make it... I might want to highlight something</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1070.688000" data-stop="1075.014000">that people have to do with this. Let's try</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1075.235000" data-stop="1077.778000">with this current configuration. If I try with</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1077.798000" data-stop="1080.422000">this current configuration... And there we are going</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1080.462000" data-stop="1086.661000">to see the second part of the answer to Prot's question:</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1086.681000" data-stop="1089.804000">we start compiling, we start compiling, we start</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1089.864000" data-stop="1093.728000">compiling, and then suddenly we have like two</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1093.828000" data-stop="1097.452000">characters which are not part of the thing.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1098.312000" data-stop="1098.533000">Why?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1098.553000" data-stop="1101.315000">Because they are not part of Free Font.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1101.956000" data-stop="1107.582000">Or in this case they are not part of FreeSerif.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1108.482000" data-stop="1110.244000">They are not included in FreeSerif.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1110.304000" data-stop="1112.046000">I need something else.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1112.768000" data-stop="1116.953000">There's where the full thing came in.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1117.000000">18:37</span> <strong>Fallback fonts
</strong></div><p></p><a href="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-20-01-900.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-20-01-900.jpg" alt="image from video 00:20:01.900" data-time="00:20:01.900"></a><span class="audio-time caption" data-speaker="Pedro" data-start="1117.654000" data-stop="1123.061000"><strong class="speaker-name">Pedro:</strong> I was very much inspired by what Pandoc is doing.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1123.101000" data-stop="1125.484000">In Pandoc, you can say, "I have my serif font, which</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1125.545000" data-stop="1129.970000">is this font. For this font, I want</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1130.010000" data-stop="1134.656000">these fallbacks because that's..." Fallback is, first</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1134.696000" data-stop="1135.638000">of all, fallback fonts.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1135.798000" data-stop="1141.425000">Fallback is a term used by lualatex to</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1141.540000" data-stop="1144.744000">say, if you can't find a character in a font,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1144.745000" data-stop="1147.709000">try to find it in another font.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1148.030000" data-stop="1151.756000">And then, if you provide lualatex with a list of</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1151.816000" data-stop="1155.161000">fonts, it's going to be looking up the fonts</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1155.501000" data-stop="1156.723000">to get your characters.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1158.686000" data-stop="1160.148000">That's the main idea.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1161.330000" data-stop="1164.715000"><strong class="speaker-name">Prot:</strong>  Let me ask something here, because if you</span> <span class="audio-time caption" data-speaker="Prot" data-start="1164.855000" data-stop="1166.518000">notice the output...</span> <span class="audio-time caption" data-speaker="Prot" data-start="1166.735000" data-stop="1169.939000">Of course, it is not what we want, but it is also</span> <span class="audio-time caption" data-speaker="Prot" data-start="1170.099000" data-stop="1174.245000">not just the tofu, you know, like the missing</span> <span class="audio-time caption" data-speaker="Prot" data-start="1174.285000" data-stop="1174.865000">character.</span> <span class="audio-time caption" data-speaker="Prot" data-start="1175.406000" data-stop="1179.652000">If you notice, there is some kind of a symbol</span> <span class="audio-time caption" data-speaker="Prot" data-start="1179.732000" data-stop="1181.354000">there going on.</span> <span class="audio-time caption" data-speaker="Prot" data-start="1181.594000" data-stop="1185.079000">From what I recall, we have characters and</span> <span class="audio-time caption" data-speaker="Prot" data-start="1185.119000" data-stop="1186.861000">then we have something that is called the</span> <span class="audio-time caption" data-speaker="Prot" data-start="1186.961000" data-stop="1188.742000">grapheme or grapheme cluster,</span> <span class="audio-time caption" data-speaker="Prot" data-start="1188.743000" data-stop="1189.764000">something like that,</span> <span class="audio-time caption" data-speaker="Prot" data-start="1189.765000" data-stop="1191.647000">which is basically characters laid on top</span> <span class="audio-time caption" data-speaker="Prot" data-start="1191.707000" data-stop="1193.890000">of each other to produce the emoji.</span> <span class="audio-time caption" data-speaker="Prot" data-start="1194.359000" data-stop="1197.908000">It seems here that Free Font has the</span> <span class="audio-time caption" data-speaker="Prot" data-start="1198.028000" data-stop="1199.993000">underlying characters, but maybe not the</span> <span class="audio-time caption" data-speaker="Prot" data-start="1200.073000" data-stop="1201.896000">composition codes or something like that.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1201.897000" data-stop="1205.966000"><strong class="speaker-name">Pedro:</strong>  No. It only has some characters.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1205.967000" data-stop="1207.671000">It only has some some underlying</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1207.731000" data-stop="1210.157000">characters. For example it only has the...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1210.424000" data-stop="1213.407000">It has the finger, but it doesn't have</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1213.987000" data-stop="1216.310000">all the compositions that you need for that.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1216.330000" data-stop="1216.950000"><strong class="speaker-name">Prot:</strong>  Exactly.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1216.990000" data-stop="1219.293000"><strong class="speaker-name">Sacha:</strong>  That one in particular, I think, changes</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1219.333000" data-stop="1220.494000">the color of it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1220.514000" data-stop="1221.415000">So that's why.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1221.435000" data-stop="1222.576000"><strong class="speaker-name">Pedro:</strong>  Yes.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1222.816000" data-stop="1226.460000">And if you look at the, if we go back here, it's</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1226.520000" data-stop="1233.086000">saying there's no character at all for the face.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1234.087000" data-stop="1236.169000">But if you go to the beginning, you will also</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1236.289000" data-stop="1239.452000">notice that there was some, where was it?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1239.512000" data-stop="1240.313000">I've seen it.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1244.393000" data-stop="1248.918000">At some point, they are also telling you that the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1248.978000" data-stop="1250.120000">thing... where is it?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1250.420000" data-stop="1250.981000">Okay, fine.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1251.622000" data-stop="1252.843000">It's going to take too long to find.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1253.304000" data-stop="1254.325000"><strong class="speaker-name">Sacha:</strong>  It's fine.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1254.345000" data-stop="1256.307000">Besides, you fixed the problem, so you don't have</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1256.327000" data-stop="1257.929000">to dig into the old way of doing things.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1259.231000" data-stop="1263.276000"><strong class="speaker-name">Pedro:</strong>  Yes, so that's my main problem right now.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1264.477000" data-stop="1269.743000">So I go and I'm going to go to the... I keep</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1269.783000" data-stop="1275.336000">trying to use the teleconference, the conference screen,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1275.396000" data-stop="1277.199000">the shared screen instead of the red one.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1277.580000" data-stop="1281.827000">This is why sometimes I sort of get mixed up.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1282.708000" data-stop="1284.091000">We had this.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1287.136000" data-stop="1291.623000">And I'm just going to go and comment this out</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1292.144000" data-stop="1294.127000">because I'm going to go for the new one.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1299.000000">21:39</span> <strong>Fallback configuration
</strong></div><p></p><a href="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-22-31-167.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-22-31-167.jpg" alt="image from video 00:22:31.167" data-time="00:22:31.167"></a><span class="audio-time caption" data-speaker="Pedro" data-start="1299.389000" data-stop="1302.132000"><strong class="speaker-name">Pedro:</strong> For the new one, I have a full example here.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1302.592000" data-stop="1306.456000">Here we go with the fontspec configuration,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1309.639000" data-stop="1313.462000">which is at the beginning. You say, what are you</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1313.502000" data-stop="1320.769000">doing there, right? I know it might</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1320.809000" data-stop="1323.372000">look a bit scary at the beginning but then if you</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1323.552000" data-stop="1325.774000">if you're familiar with what Pandoc is doing it's</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1325.854000" data-stop="1326.915000">not that different</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1328.701000" data-stop="1329.302000"><strong class="speaker-name">Sacha:</strong>  Nonsense.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1329.482000" data-stop="1330.162000">It's not scary at all.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1330.182000" data-stop="1331.584000">We'll just copy whatever you post.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1335.007000" data-stop="1335.828000"><strong class="speaker-name">Prot:</strong>  Life is simple.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1336.809000" data-stop="1340.212000"><strong class="speaker-name">Pedro:</strong>  Yeah, no, but I mean, that's the basic idea.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1340.913000" data-stop="1343.636000">You have something very similar to this in the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1344.036000" data-stop="1349.261000">actual documentation, both in the docstring and</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1349.441000" data-stop="1350.583000">in the manual.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1351.143000" data-stop="1354.066000">So all this process that I'm telling you is also</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1354.166000" data-stop="1357.189000">part of the manual, step by step.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1357.928000" data-stop="1361.414000">So let's go for this and let's try to... First of</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1361.475000" data-stop="1363.478000">all, I'm going to load my new variables.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1363.498000" data-stop="1365.001000">I'm going to refresh the variables.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1366.143000" data-stop="1367.225000">Let's go.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1367.000000">22:47</span> <strong>Selecting fonts</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1367.285000" data-stop="1369.810000"><strong class="speaker-name">Pedro:</strong> What I'm saying here is I have a main font,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1371.072000" data-stop="1372.194000">I have a sans font,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1373.096000" data-stop="1375.140000">and I have a mono font, right?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1375.921000" data-stop="1377.744000">That's something that I also had here...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1377.745000" data-stop="1379.548000">about here in this part.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1382.043000" data-stop="1384.126000">The next thing that I'm saying is that the font</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1384.146000" data-stop="1387.770000">is free serif, which is this mapping, but saying</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1387.810000" data-stop="1390.012000">that for main I'm going to use free serif,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1390.013000" data-stop="1392.335000">for sans I'm going to use free sans,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1392.336000" data-stop="1394.298000">and for mono I'm going to use Noto Sans Mono.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1394.599000" data-stop="1395.680000">Why Noto Sans Mono?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1395.700000" data-stop="1396.381000">Because I like it.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1397.702000" data-stop="1400.806000">It's a bit of a change too. So you can also</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1400.846000" data-stop="1405.112000">see that you can mix font families and so on.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1405.132000" data-stop="1407.915000">Basically I like it because it's very readable.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1409.060000" data-stop="1410.181000">And it's very accessible.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1410.762000" data-stop="1413.525000">So for this, everything would be what I had</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1413.585000" data-stop="1414.306000">before, right?</span> <p></p><a href="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-23-39-033.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-23-39-033.jpg" alt="image from video 00:23:39.033" data-time="00:23:39.033"></a><span class="audio-time caption" data-speaker="Pedro" data-start="1415.287000" data-stop="1418.151000"><strong class="speaker-name">Pedro:</strong> If you have noticed before I compile, you see</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1418.231000" data-stop="1421.214000">that each font has its own size.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1422.636000" data-stop="1426.140000">That is sometimes sort of not very nice, right?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1426.741000" data-stop="1429.224000">So what I would do... The next is I'm going to</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1429.484000" data-stop="1433.188000">add a property to both the sans and the monophon</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1433.228000" data-stop="1436.913000">to say, try to scale them so that they match the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1436.973000" data-stop="1438.915000">lowercase of the main font.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1440.768000" data-stop="1445.294000">That sort of makes them more proportional,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1445.775000" data-stop="1449.480000">better look and feel, right?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1450.000000">24:10</span> <strong>Fallbacks</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1450.642000" data-stop="1454.547000"><strong class="speaker-name">Pedro:</strong> Now comes the really nice thing, the fallbacks.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1455.569000" data-stop="1457.632000">We've said, fallback is what?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1457.672000" data-stop="1462.218000">Fallback is an alternative font I want to add to</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1462.699000" data-stop="1467.445000">the document when a character is missing.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1467.465000" data-stop="1470.049000">I could just have a list of different fonts</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1471.210000" data-stop="1476.796000">and go with it and have lualatex decide which</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1476.976000" data-stop="1477.857000">characters to use.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1479.059000" data-stop="1482.563000">But that would make the whole thing very, very, very slow.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1483.564000" data-stop="1490.011000">So there's one extra step here, which is look at the document,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1491.693000" data-stop="1495.497000">find what kind of Emacs scripts you have in the document.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1496.776000" data-stop="1499.539000">Then, if you need to add fallbacks, add them</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1499.599000" data-stop="1501.702000">for the scripts that are present in the document.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1503.664000" data-stop="1505.907000">For example, in this case, we have the emojis.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1507.789000" data-stop="1511.654000">These are the ones that I want to change.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1512.655000" data-stop="1517.581000">But I don't have any simplified Chinese here,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1518.803000" data-stop="1522.547000">so there's not going to be any Han character</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1523.860000" data-stop="1526.684000">in the document, so it's not going to be included</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1528.126000" data-stop="1530.710000">in the produced LaTeX.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1533.434000" data-stop="1535.177000">That's the whole idea of the fallbacks.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1537.720000" data-stop="1540.945000">You have fallbacks for the fonts that need them.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1540.965000" data-stop="1543.509000">You might want to have fallbacks</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1543.629000" data-stop="1547.134000">for sans serif, maybe, if you need it.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1548.751000" data-stop="1550.196000">If not, you can omit it.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1550.216000" data-stop="1553.024000">In this case, we are only having fallbacks here</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1553.125000" data-stop="1557.880000">in the serif font, so I'm only going to be adding</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1558.321000" data-stop="1561.832000">the serif, the fallbacks for serif.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1563.263000" data-stop="1565.006000">So that's the basic idea.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1565.827000" data-stop="1568.051000">If you go to Pandoc and you read the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1568.111000" data-stop="1571.016000">documentation, you will notice that most of the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1571.076000" data-stop="1572.999000">things are okay.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1573.199000" data-stop="1581.573000">It's not an Emacs Lisp list here or a plist because</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1581.633000" data-stop="1585.339000">it's YAML, but it's very similar.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1586.045000" data-stop="1590.710000">I did some state-of-the-art research before</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1591.430000" data-stop="1594.113000">actually coming at the end to this definition.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1595.034000" data-stop="1598.778000">So now, before I compile and we see that we have</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1598.978000" data-stop="1602.081000">everything we want, I'm also going to show you</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1602.181000" data-stop="1604.704000">what is produced.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1604.724000" data-stop="1605.104000"><strong class="speaker-name">Sacha:</strong>  Let's see.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1606.000000">26:46</span> <strong>The LaTeX produced
</strong></div><p></p><a href="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-26-51-067.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-26-51-067.jpg" alt="image from video 00:26:51.067" data-time="00:26:51.067"></a><span class="audio-time caption" data-speaker="Pedro" data-start="1606.485000" data-stop="1609.869000"><strong class="speaker-name">Pedro:</strong>  This is the LaTeX that is produced.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1609.889000" data-stop="1611.791000">The important part is here.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1612.932000" data-stop="1613.993000">That's the fallbacks.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1615.306000" data-stop="1619.452000">If you see, I'm only having the Noto Color</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1619.472000" data-stop="1622.116000">emoji font being included.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1622.236000" data-stop="1624.579000">Why? Because what I told you before, there is no Han,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1625.080000" data-stop="1628.845000">so there's no character being added there.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1629.526000" data-stop="1632.510000">I don't add the Han font because I don't need it.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1635.094000" data-stop="1638.078000">That's sort of a mini optimization that you may</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1638.158000" data-stop="1638.799000">want to have.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1640.399000" data-stop="1641.520000">Next thing...</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1641.000000">27:21</span> <strong>Character families should be in the Messages buffer</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1641.521000" data-stop="1643.644000"><strong class="speaker-name">Sacha:</strong>  Sorry, how do people find out what keys</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1643.704000" data-stop="1646.087000">they need to put into that alist? Can they</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1646.147000" data-stop="1648.371000">describe-char for example to see whether</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1648.731000" data-stop="1651.235000">they need to put in emoji or some other...?</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1652.336000" data-stop="1657.163000"><strong class="speaker-name">Pedro:</strong>  That's a very good question. For</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1657.203000" data-stop="1659.987000">that, I need to get to the Messages,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1663.693000" data-stop="1667.318000">or... Oops. I have Warnings...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1672.006000" data-stop="1672.687000">Where is it?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1674.028000" data-stop="1687.020000">You should normally have, in your Messages,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1687.021000" data-stop="1690.283000">a message from Org Mode</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1690.284000" data-stop="1693.687000">telling you that it found the characters.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1693.727000" data-stop="1696.110000">I don't know why I'm not seeing it here.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1696.130000" data-stop="1697.912000"><strong class="speaker-name">Sacha:</strong>  Is it maybe in that Tilix window that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1697.952000" data-stop="1699.313000">you have there with a make edit?</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1700.778000" data-stop="1701.419000"><strong class="speaker-name">Pedro:</strong>  No, no, no.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1702.161000" data-stop="1704.286000">It's inside the Emacs.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1704.587000" data-stop="1711.783000">And I'm not finding it.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1715.105000" data-stop="1715.966000">I'm not finding it.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1716.026000" data-stop="1718.390000">I don't know why, but it should be there.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1719.151000" data-stop="1725.240000">Normally, Org Mode would tell you that you have</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1726.222000" data-stop="1729.547000">these and those characters, that you have the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1729.587000" data-stop="1730.388000">different families.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1730.849000" data-stop="1741.324000">You will also see it if I were to, say... I'm going</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1741.365000" data-stop="1744.369000">to move this out so I don't have fallbacks.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1746.475000" data-stop="1749.499000">This would be a basic configuration.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1750.260000" data-stop="1758.292000">So now that I have my fallbacks out, and I go and</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1758.312000" data-stop="1766.783000">I... So you see that I don't have fallbacks.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1767.184000" data-stop="1770.829000">And then if I go to the warrings, where is it?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1773.020000" data-stop="1774.590000"><strong class="speaker-name">Prot:</strong>  Maybe messages?</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1775.435000" data-stop="1777.005000"><strong class="speaker-name">Pedro:</strong>  To the messages, exactly.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1784.984000" data-stop="1786.225000">I'm sorry, I don't find it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1786.766000" data-stop="1787.287000"><strong class="speaker-name">Sacha:</strong>  It's okay.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1787.487000" data-stop="1788.528000"><strong class="speaker-name">Pedro:</strong>  But there is a message,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1789.009000" data-stop="1791.911000">I'm sure there is a message</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1791.912000" data-stop="1796.797000">which tells you which families or which scripts</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1796.798000" data-stop="1799.601000">you have in your document.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1800.362000" data-stop="1800.562000"><strong class="speaker-name">Sacha:</strong>  All right.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1800.582000" data-stop="1801.403000">No problem.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1801.423000" data-stop="1803.826000">I'm sure all of this will come with wonderful</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1803.886000" data-stop="1809.633000">documentation because the Org project is very good at that.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1809.000000">30:09</span> <strong>Behind the scenes</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1809.653000" data-stop="1812.076000"><strong class="speaker-name">Pedro:</strong>  Yes. We spend a lot of time going through the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1812.116000" data-stop="1813.337000">documentation.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1814.009000" data-stop="1819.398000">The current documentation currently has undergone</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1819.658000" data-stop="1823.444000">a lot of scrutiny both by Ihor and by myself.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1823.645000" data-stop="1825.608000">I've rewritten it two or three times to make it</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1825.708000" data-stop="1830.656000">clearer as I gained insights into what I wanted</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1830.716000" data-stop="1833.621000">to tell people and</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1833.601000" data-stop="1836.985000">At one point in time I isolated myself completely.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1837.005000" data-stop="1838.326000">I rewrote everything.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1838.887000" data-stop="1842.471000">I forgot about all the exchanges I had with Ihor</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1842.791000" data-stop="1847.957000">and I had my own ideas of what I wanted to say.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1848.337000" data-stop="1850.639000">I rewrote everything from scratch and suddenly</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1850.800000" data-stop="1852.181000">Ihor said, this is what I wanted.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1853.883000" data-stop="1858.508000">Currently the documentation is at least a bit</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1858.548000" data-stop="1859.809000">more than just usable.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1860.000000">31:00</span> <strong>Refreshing local variables</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1860.410000" data-stop="1862.292000"><strong class="speaker-name">Pedro:</strong> Let's go back to this.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1863.082000" data-stop="1869.171000">As you see... This is something stupid.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1869.191000" data-stop="1872.797000">I mean, you see that this refresh local variables</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1873.258000" data-stop="1875.100000">is a small function that I've written myself.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1875.842000" data-stop="1880.889000">Since I'm working a lot with local variables, I'm</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1881.270000" data-stop="1884.315000">also trying to have shortcuts for all this kind</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1884.375000" data-stop="1884.695000">of things.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1885.036000" data-stop="1887.179000"><strong class="speaker-name">Sacha:</strong>  Oh, I thought C-c C-c did that in the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1887.219000" data-stop="1887.840000">directive.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1889.288000" data-stop="1894.155000"><strong class="speaker-name">Pedro:</strong>  Sometimes it does not, or at least...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1894.175000" data-stop="1899.682000">the case is... I did it myself.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1899.963000" data-stop="1902.246000">I rewrote everything to be sure that I got my</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1902.486000" data-stop="1904.509000">local variables, my directory variables, and</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1904.569000" data-stop="1909.115000">everything nice as I wanted. Once I have this...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1909.395000" data-stop="1913.241000">Once again... There. If I now go and compile</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1913.261000" data-stop="1915.684000">for the last time...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1918.313000" data-stop="1919.334000">What is missing?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1919.375000" data-stop="1921.778000">What have I done wrong?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1935.958000" data-stop="1939.764000"><strong class="speaker-name">Sacha:</strong>  Do you want a series of undoes?</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1940.384000" data-stop="1942.648000"><strong class="speaker-name">Pedro:</strong>  I'm going to go the quick way.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1943.329000" data-stop="1945.231000"><strong class="speaker-name">Prot:</strong>  I think there was a missing parenthesis in that.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1945.492000" data-stop="1946.413000"><strong class="speaker-name">Pedro:</strong>  Yeah, somewhere.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1947.322000" data-stop="1951.927000"><strong class="speaker-name">Prot:</strong>  Yeah, yeah, yeah, there it is.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1957.073000" data-stop="1959.576000"><strong class="speaker-name">Pedro:</strong>  No, it looks right, actually.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1959.596000" data-stop="1964.682000">No, yes, because I've copied it from my notebook.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1969.948000" data-stop="1970.889000"><strong class="speaker-name">Sacha:</strong>  It's not doing the thing yet.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="1973.312000" data-stop="1973.532000"><strong class="speaker-name">Pedro:</strong>  Yeah, yeah.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1975.165000" data-stop="1979.346000">And that comes... That's something that I...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1979.347000" data-stop="1981.176000">So at least if you do it like this...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1983.215000" data-stop="1986.560000">I don't know why this hand does not work</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1986.600000" data-stop="1989.264000">correctly with Noto Color Emoji.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1989.765000" data-stop="1991.167000">Another takeaway.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1991.188000" data-stop="1994.773000">You have to find your own wonderful emoji file.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1995.094000" data-stop="1996.115000">The other one is Apple.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="1996.296000" data-stop="2001.343000">Apple Color Emoji has a different [??] for emojis.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2001.964000" data-stop="2003.807000">That's something that I also wanted to highlight.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2003.887000" data-stop="2007.433000">Sometimes you don't get the full...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2007.413000" data-stop="2011.458000">It's important you have to do a lot of look and find.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2012.459000" data-stop="2015.661000">But at least with this you get your...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2015.662000" data-stop="2017.705000">At least with this, what do I get?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2017.000000">33:37</span> <strong>Scaling fonts to match lowercase
</strong></div><p></p><a href="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-33-39-067.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-33-39-067.jpg" alt="image from video 00:33:39.067" data-time="00:33:39.067"></a><span class="audio-time caption" data-speaker="Pedro" data-start="2017.885000" data-stop="2023.331000"><strong class="speaker-name">Pedro:</strong> I get my fonts scaled so that they look more or</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2023.351000" data-stop="2024.733000">less the same size,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2026.194000" data-stop="2027.376000">which is a nice appearance.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2027.456000" data-stop="2032.281000">I have my listings and my outputs.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2033.963000" data-stop="2034.984000">And I have my emojis.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2036.646000" data-stop="2037.387000"><strong class="speaker-name">Prot:</strong>  This looks good.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2038.396000" data-stop="2039.579000"><strong class="speaker-name">Pedro:</strong>  This is basically what I need.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2039.580000" data-stop="2042.883000"><strong class="speaker-name">Prot:</strong>  Can I ask something?</span> <span class="audio-time caption" data-speaker="Prot" data-start="2043.484000" data-stop="2044.746000">Two questions, actually.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2045.708000" data-stop="2050.535000">One is, I see the props parameter you have for the...</span> <span class="audio-time caption" data-speaker="Prot" data-start="2050.536000" data-stop="2051.838000">if you switch to your Emacs buffer...</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2053.360000" data-stop="2053.981000"><strong class="speaker-name">Pedro:</strong>  Just a second.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2054.001000" data-stop="2056.205000">I was on the wrong stream.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2056.344000" data-stop="2058.007000"><strong class="speaker-name">Prot:</strong>  Okay.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2057.000000">34:17</span> <strong>Specifying the fallbacks</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="2057.987000" data-stop="2062.375000"><strong class="speaker-name">Prot:</strong> So you see you have that props, and then you are</span> <span class="audio-time caption" data-speaker="Prot" data-start="2062.435000" data-stop="2067.963000">passing it a string. In the fallbacks, you have a</span> <span class="audio-time caption" data-speaker="Prot" data-start="2068.023000" data-stop="2072.268000">slightly different expression where you have the</span> <span class="audio-time caption" data-speaker="Prot" data-start="2072.329000" data-stop="2075.554000">font set, and then you pass it the font, but for</span> <span class="audio-time caption" data-speaker="Prot" data-start="2075.594000" data-stop="2077.838000">example, with Noto Color Emoji, you are not just</span> <span class="audio-time caption" data-speaker="Prot" data-start="2077.878000" data-stop="2080.021000">passing Noto Color Emoji, you are also passing a</span> <span class="audio-time caption" data-speaker="Prot" data-start="2080.081000" data-stop="2084.788000">parameter to me that looks like the pango markup,</span> <span class="audio-time caption" data-speaker="Prot" data-start="2085.292000" data-stop="2088.518000">whereas the other one looks like something else,</span> <span class="audio-time caption" data-speaker="Prot" data-start="2088.539000" data-stop="2090.322000">another markup.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2090.342000" data-stop="2092.708000">I just want to ask if you know, off the top of</span> <span class="audio-time caption" data-speaker="Prot" data-start="2092.748000" data-stop="2096.034000">your head, if the documentation for Pango and for</span> <span class="audio-time caption" data-speaker="Prot" data-start="2096.074000" data-stop="2097.758000">whatever else that is,</span> <span class="audio-time caption" data-speaker="Prot" data-start="2097.759000" data-stop="2102.000000">is clearly available somewhere so that we can follow it because</span> <span class="audio-time caption" data-speaker="Prot" data-start="2102.001000" data-stop="2103.933000">one issue I always find with</span> <span class="audio-time caption" data-speaker="Prot" data-start="2103.934000" data-stop="2107.833000">LaTeX or with anything that has to do with these complex things</span> <span class="audio-time caption" data-speaker="Prot" data-start="2107.834000" data-stop="2110.600000">is that they assume you are a domain expert.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2110.601000" data-stop="2112.167000">And it's like, okay, just do fonts</span> <span class="audio-time caption" data-speaker="Prot" data-start="2112.168000" data-stop="2113.733000">the way you do it in LaTeX.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2113.734000" data-stop="2115.833000">And I'm like, okay, how do you do it...</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2115.834000" data-stop="2116.567000"><strong class="speaker-name">Pedro:</strong>  "No, but how?"</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2116.568000" data-stop="2123.955000">Yeah, I know. Exactly. That part is extremely complex.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2125.117000" data-stop="2128.621000">Because in this case, what you're saying</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2128.741000" data-stop="2131.303000">is do whatever you do with your normal fonts</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2131.304000" data-stop="2132.345000">if you don't have the colon.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2133.000000">35:33</span> <strong>HarfBuzz</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2133.006000" data-stop="2136.350000"><strong class="speaker-name">Pedro:</strong> If you have the colon, then what they say is you</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2136.410000" data-stop="2139.394000">need to have, in this case, you need to have the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2139.434000" data-stop="2146.582000">HarfBuzz rasterizer or however it is called.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2147.563000" data-stop="2149.986000">And that... Yes, you're completely right.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2150.306000" data-stop="2152.569000">This is a problem with the documentation.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2152.589000" data-stop="2156.256000">I have... To the best of my knowledge,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2156.257000" data-stop="2163.225000">the only ones that really need harf are the emojis.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2165.360000" data-stop="2167.690000">That's the example.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2167.710000" data-stop="2170.233000">For the rest of the font, at least at this point</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2170.313000" data-stop="2174.117000">in time, you don't need, or with this feature</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2174.137000" data-stop="2177.261000">set, you don't need any sort of extra things.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2177.000000">36:17</span> <strong>Upcoming work on Babel (the LaTeX package)</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2177.821000" data-stop="2180.284000"><strong class="speaker-name">Pedro:</strong> The extra things will come in the future,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2180.804000" data-stop="2186.211000">when you try to integrate things like Babel,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2186.212000" data-stop="2189.255000">with controlling the fonts in Babel,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2189.256000" data-stop="2191.418000">which I personally already have running,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2191.419000" data-stop="2195.045000">but it's not yet integrated into Org Mode.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2195.766000" data-stop="2197.408000">That's going to take another year, I think.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2199.751000" data-stop="2202.275000"><strong class="speaker-name">Prot:</strong>  But you are persistent, so yeah, you will do it.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2202.295000" data-stop="2205.239000"><strong class="speaker-name">Pedro:</strong>  Yeah, no, no. I mean, I want to have it.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2205.660000" data-stop="2206.782000">I need it also.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2206.802000" data-stop="2209.866000">At least I would like to see it officially</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2210.183000" data-stop="2214.096000">sanctioned by whoever needs to sanction it before</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2214.176000" data-stop="2215.461000">I retire in two years,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2217.869000" data-stop="2220.598000">so that people can use it once I retire.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2222.000000">37:02</span> <strong>More about HarfBuzz and ligatures?</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="2222.401000" data-stop="2225.364000"><strong class="speaker-name">Prot:</strong>  Good, good. The other question I have related to this and</span> <span class="audio-time caption" data-speaker="Prot" data-start="2225.384000" data-stop="2229.048000">emoji is I remember when HarfBuzz was discussed</span> <span class="audio-time caption" data-speaker="Prot" data-start="2229.068000" data-stop="2231.130000">in the context of integrating it with Emacs.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2231.170000" data-stop="2233.813000">Maybe that was Emacs 28 or something along those lines.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2234.734000" data-stop="2235.915000">There was this point.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2235.995000" data-stop="2238.397000">Now, maybe I am conflating things, but there was</span> <span class="audio-time caption" data-speaker="Prot" data-start="2238.417000" data-stop="2241.861000">this point that with this included, like you</span> <span class="audio-time caption" data-speaker="Prot" data-start="2241.921000" data-stop="2245.304000">build Emacs with support for HarfBuzz and now it</span> <span class="audio-time caption" data-speaker="Prot" data-start="2245.385000" data-stop="2247.767000">also supports ligatures.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2247.747000" data-stop="2251.375000">Now, a ligature is something that is fancy. Like, for</span> <span class="audio-time caption" data-speaker="Prot" data-start="2251.435000" data-stop="2254.021000">example, you take three characters, like</span> <span class="audio-time caption" data-speaker="Prot" data-start="2254.061000" data-stop="2256.025000">the equal sign in JavaScript,</span> <span class="audio-time caption" data-speaker="Prot" data-start="2256.026000" data-stop="2257.147000">three equal signs,</span> <span class="audio-time caption" data-speaker="Prot" data-start="2257.148000" data-stop="2259.894000">and you make it look like one character.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2260.155000" data-stop="2262.280000">I don't know if this is part of what you are</span> <span class="audio-time caption" data-speaker="Prot" data-start="2262.360000" data-stop="2262.921000">doing here.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2263.778000" data-stop="2267.864000"><strong class="speaker-name">Pedro:</strong>  Well, a very good question.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2270.287000" data-stop="2275.274000">This discussion that there was on Emacs 28 for</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2275.594000" data-stop="2278.298000">HarfBuzz (yes or no) and ligatures and all these</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2278.338000" data-stop="2282.343000">kind of things has not helped.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2283.365000" data-stop="2284.666000">Let's say it this way...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2286.269000" data-stop="2288.031000">It adds confusion.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2288.011000" data-stop="2293.178000">In this context, sorry to be that clear.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2293.419000" data-stop="2296.723000">Why? Because you have to think it as two different,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2297.264000" data-stop="2299.868000">this is two different, completely different pairs</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2299.928000" data-stop="2300.248000">of shoes.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2300.869000" data-stop="2304.154000"><strong class="speaker-name">Sacha:</strong>  Okay, because we're saying it's not LaTeX export.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2304.174000" data-stop="2308.099000"><strong class="speaker-name">Pedro:</strong>  Yes, so I'm delegating as much as I can</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2308.800000" data-stop="2312.345000">to lualatex and to all these, so ligatures and</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2312.405000" data-stop="2315.790000">things like that are part of LaTeX.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2316.479000" data-stop="2319.505000">I don't want to treat them at all.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2320.126000" data-stop="2324.575000">The only point where I need to sort of touch</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2325.997000" data-stop="2328.242000">lower level, which would be like HarfBuzz, for</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2328.302000" data-stop="2332.430000">example, is telling lualatex to use HarfBuzz to</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2333.351000" data-stop="2334.313000">include some characters.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2336.097000" data-stop="2338.842000">So that's the full question.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2339.041000" data-stop="2340.463000"><strong class="speaker-name">Sacha:</strong>  So far you've shown us how to include</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2340.523000" data-stop="2344.027000">Unicode in the output and also how to specify</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2344.067000" data-stop="2346.870000">fallback fonts for things like emojis and other</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2346.910000" data-stop="2348.992000">things that are not included in your main font.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2349.493000" data-stop="2351.435000">Were there other parts of your very large patch?</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2353.617000" data-stop="2358.203000"><strong class="speaker-name">Pedro:</strong>  Oh, the other parts, which are not...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2358.223000" data-stop="2362.127000">Well, I mean, the current state is that we have</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2362.387000" data-stop="2363.108000">all this.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2363.000000">39:23</span> <strong>Upcoming talk on accessible presentations</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2363.982000" data-stop="2368.612000"><strong class="speaker-name">Pedro:</strong> We also have support for accessible presentations,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2369.193000" data-stop="2373.082000">and there... In EmacsConf 26, we're going to have a</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2374.645000" data-stop="2377.391000">presentation on how this came to life by the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2377.451000" data-stop="2378.593000">person who inspired it,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2378.594000" data-stop="2382.362000">and by the person who wrote it, yours truly.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2382.629000" data-stop="2386.593000">The third thing that we have for that,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2386.594000" data-stop="2391.201000">we also have a lot of things related with metadata</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2392.382000" data-stop="2396.468000">management for LaTeX and for PDF documents.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2397.369000" data-stop="2401.635000">That's also something where I directly call on</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2401.755000" data-stop="2407.082000">experts to help us because I know what I know,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2407.342000" data-stop="2410.206000">which is at this point I know I don't know.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2410.608000" data-stop="2412.890000">That's my current situation.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2414.652000" data-stop="2416.734000">I know very little about all this document</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2417.535000" data-stop="2419.237000">metadata stuff.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2419.257000" data-stop="2423.401000">I'm learning in the process of writing things</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2423.461000" data-stop="2426.865000">for accessible presentations.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2427.285000" data-stop="2431.369000">I'm also learning things related with tagging</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2431.409000" data-stop="2434.152000">PDFs and the tag PDF and all this kind of</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2435.554000" data-stop="2438.016000">packages which are emerging right now and latest.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2439.160000" data-stop="2440.122000">And all this kind of things.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2440.202000" data-stop="2444.730000">This integration, which is starting to be fruitful.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2445.672000" data-stop="2450.140000">I already have... I'm using it with a couple of</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2450.200000" data-stop="2451.442000">students who need that.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2452.003000" data-stop="2454.688000">They can access my presentations right now.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2457.753000" data-stop="2463.143000">I'm also sort of using them as guinea pigs,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2463.123000" data-stop="2467.827000">as willing guinea pigs. I'm going beyond</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2468.308000" data-stop="2470.610000">presentations to providing them with documents</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2470.670000" data-stop="2473.592000">and so on, and they provide feedback about how</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2473.693000" data-stop="2475.554000">accessible those documents are and so on.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2476.615000" data-stop="2478.937000">For that, we need help.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2479.000000">41:19</span> <strong>Upcoming work on Polyglossia and Babel</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2479.838000" data-stop="2482.741000"><strong class="speaker-name">Pedro:</strong> Then the other big thing which is still part</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2482.781000" data-stop="2489.667000">of our conversation right now is the Polyglossia</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2490.928000" data-stop="2492.910000">and Babel packages.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2493.346000" data-stop="2500.535000">Polyglossian Babel for internationalization.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2502.898000" data-stop="2506.061000">For example, Babel is very nice in managing</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2506.062000" data-stop="2510.007000">left to right and right to left and things like that.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2511.389000" data-stop="2513.211000"><strong class="speaker-name">Sacha:</strong>  I don't suppose you have a quick demonstration?</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2514.558000" data-stop="2515.560000"><strong class="speaker-name">Pedro:</strong>  Not yet.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2517.042000" data-stop="2520.327000">That would be another long presentation to show</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2520.368000" data-stop="2522.892000">you all the kinds of things that we can do.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2522.000000">42:02</span> <strong>Chinese, Japanese, and Korean
</strong></div><p></p><a href="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-43-47-100.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/emacs-chat-31-pedro-a-aranda-gutierrez-00-43-47-100.jpg" alt="image from video 00:43:47.100" data-time="00:43:47.100"></a><span class="audio-time caption" data-speaker="Pedro" data-start="2522.932000" data-stop="2529.583000"><strong class="speaker-name">Pedro:</strong> And just before we close this, I've been showing</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2530.023000" data-stop="2534.190000">what I mostly hear dominate, which is English,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2534.571000" data-stop="2538.878000">Spanish, or Latin alphabet.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2538.858000" data-stop="2543.224000">But with this package, we also have initial</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2543.264000" data-stop="2548.390000">support for when you're using xelatex.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2549.011000" data-stop="2553.336000">There's a package which is called xeCJK to</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2553.477000" data-stop="2556.559000">provide simplified Chinese, Japanese,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2556.560000" data-stop="2557.962000">and Korean documents.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2558.643000" data-stop="2563.689000">So this, with lualatex, raw, without any Babel or</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2563.770000" data-stop="2566.732000">anything else, raw and monolingual,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2566.733000" data-stop="2568.055000">is also supported.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2568.794000" data-stop="2573.861000">What I basically do is I map what is on</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2574.101000" data-stop="2578.307000">Overleaf describing how to do this with xelatex</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2578.427000" data-stop="2581.992000">and this package which is called xeCJK.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2583.575000" data-stop="2587.761000">I map that with the same kind of header.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2588.021000" data-stop="2591.946000">You can use this kind of variables to do the same</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2592.547000" data-stop="2597.434000">for this Chinese, Japanese, and Korean document.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2598.022000" data-stop="2600.888000"><strong class="speaker-name">Sacha:</strong>  Would you happen to have an example so</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2601.650000" data-stop="2603.754000">that people can see what the markup looks like?</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2605.738000" data-stop="2608.564000"><strong class="speaker-name">Pedro:</strong>  The markup, I mean, the idea would be</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2608.724000" data-stop="2612.993000">instead of using main... I don't have an example here..</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2614.289000" data-stop="2616.895000">But the idea is that instead of calling the fonts</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2617.155000" data-stop="2621.464000">main, sans, and mono, you have CJKmain.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2621.945000" data-stop="2623.910000">So you would have something like, the font would</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2623.950000" data-stop="2625.132000">be like CJKMain.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2625.774000" data-stop="2630.203000">C, J, K. And the other thing is that you would</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2630.243000" data-stop="2634.272000">have to change your compiler to xelatex.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2635.973000" data-stop="2642.502000">That's also very, very well documented in current</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2643.082000" data-stop="2644.364000">main Org.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2645.165000" data-stop="2646.206000">So we have it.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2650.672000" data-stop="2653.977000">That would be more or less the effort of the last</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2654.137000" data-stop="2660.265000">couple of years and how it has crystallized into</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2660.305000" data-stop="2662.588000">things that are already in master.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2662.000000">44:22</span> <strong>The development process</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2662.973000" data-stop="2666.497000"><strong class="speaker-name">Sacha:</strong>  I'm quite curious about the development process.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2666.577000" data-stop="2669.641000">Since it's a large change and it's taking a while</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2669.661000" data-stop="2672.144000">to develop, what was it like for you to keep it</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2672.204000" data-stop="2675.989000">going despite all the developments in Org</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2676.069000" data-stop="2679.113000">underneath?</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2679.133000" data-stop="2681.055000"><strong class="speaker-name">Pedro:</strong>  Well, it's not that difficult.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2681.756000" data-stop="2686.382000">At the end, I needed to learn to use VC.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2687.948000" data-stop="2691.653000">Last year in Emacs, I'm doing everything from the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2691.673000" data-stop="2693.996000">VC package in Emacs.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2694.016000" data-stop="2698.361000">So I have a nice workflow there to go and get</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2698.461000" data-stop="2703.948000">my... I have two... On one side, I'm, of course,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2705.150000" data-stop="2708.034000">going back and putting everything into the main</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2708.314000" data-stop="2711.458000">Org git.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2711.438000" data-stop="2716.086000">But I'm also having my own Codeberg with most</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2716.146000" data-stop="2718.290000">things that I'm using.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2719.993000" data-stop="2723.379000">With Emacs it's quite easy to go, either modify</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2723.519000" data-stop="2726.885000">one and have the things pushed up, or generating</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2726.925000" data-stop="2731.793000">the patches so that Ihor blesses them,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2731.773000" data-stop="2733.315000">puts them into main.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2733.735000" data-stop="2738.520000">Or when I'm doing lots of things that I need for</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2738.600000" data-stop="2740.803000">a certain point, I go to my Codeberg.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2740.843000" data-stop="2742.725000">There I have my FontSpec 3 branch.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2743.305000" data-stop="2745.428000">There I do my own changes.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2745.448000" data-stop="2746.108000">I check them.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2746.168000" data-stop="2746.809000">I test them.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2746.989000" data-stop="2749.051000">I test drive them.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2749.692000" data-stop="2752.715000">Because, yes, it's been a lot of work to have</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2752.795000" data-stop="2753.917000">everything running.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2755.138000" data-stop="2759.322000">But it's always based on real life.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2759.342000" data-stop="2764.119000">And how would... I try to say</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2764.120000" data-stop="2766.703000">how would someone do it, who knows a</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2766.763000" data-stop="2772.151000">bit about Emacs and a bit about LaTeX and wants</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2772.651000" data-stop="2774.133000">to write as little as possible.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2775.736000" data-stop="2777.799000"><strong class="speaker-name">Sacha:</strong>  This is so much better than the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2777.879000" data-stop="2781.403000">other way of specifying a new LaTeX command that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2781.424000" data-stop="2783.326000">just changes the font for that one specific</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2783.366000" data-stop="2784.908000">character and then you have to use it for all the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2784.968000" data-stop="2786.430000">emojis that you have in your document.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2786.891000" data-stop="2789.775000">So having it automatically fall back is so much nicer.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2791.308000" data-stop="2794.452000"><strong class="speaker-name">Pedro:</strong>  Yeah, no, I mean, I was not going to go</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2794.512000" data-stop="2797.856000">the PDF way of having every emoji that I want,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2798.557000" data-stop="2801.300000">recoded, and then inserted into the document.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2802.041000" data-stop="2804.965000">I tried some.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2806.887000" data-stop="2807.528000">What was it?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2807.949000" data-stop="2808.810000">When did we start?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2810.652000" data-stop="2813.115000">I tried it like eight years ago, and I decided</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2813.155000" data-stop="2817.154000">once I have emojis in a nice way, I will use them.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2817.795000" data-stop="2820.340000">So my first manuals, if you go back, the first</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2820.380000" data-stop="2823.285000">manuals that I distributed for that specific</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2823.345000" data-stop="2825.189000">course did not have any emojis.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2826.571000" data-stop="2832.482000">So I was able to do basically this, which was</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2832.783000" data-stop="2836.890000">what I needed for... I started with a header like this.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2839.334000" data-stop="2843.639000">And then when things came and I also needed to go</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2843.739000" data-stop="2848.765000">like the scaling, what I did was scale.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2851.969000" data-stop="2855.093000">So this was my beginning in all this.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2857.496000" data-stop="2859.939000">And these were the commands that I always had in</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2859.959000" data-stop="2862.802000">the beginning with my lualatex.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2863.062000" data-stop="2865.325000">The moment I moved to lualatex</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2865.777000" data-stop="2872.248000">which was when I needed to do things like this.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2873.730000" data-stop="2878.017000">Then once I wanted to go further, then I</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2878.057000" data-stop="2880.742000">started. When this came to the mailing list,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2880.982000" data-stop="2883.246000">my first answer was I'm doing this.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2884.660000" data-stop="2886.523000">And then the next question was,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2886.524000" data-stop="2887.507000">what about the emojis?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2887.527000" data-stop="2892.499000">That sort of triggered the rest.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2892.000000">48:12</span> <strong>Retirement</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2892.519000" data-stop="2894.583000"><strong class="speaker-name">Sacha:</strong>  You mentioned wanting to retire in two years.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2895.024000" data-stop="2897.751000">I very much hope that you will retire and do even</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2897.811000" data-stop="2898.653000">more Emacs.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2899.814000" data-stop="2906.965000"><strong class="speaker-name">Pedro:</strong>  I want to continue because it's a nice pastime.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2908.587000" data-stop="2914.396000">I want to transition from my tool at work, or in</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2914.456000" data-stop="2918.762000">this case, my tool at the university, to this is</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2918.843000" data-stop="2924.291000">a nice pastime to keep this up and running.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2924.812000" data-stop="2927.155000">It would be a real pity to lose all this.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2927.860000" data-stop="2929.544000"><strong class="speaker-name">Sacha:</strong>  I'm sure we can find you volunteer</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2929.584000" data-stop="2930.106000">guinea pigs.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="2932.652000" data-stop="2936.341000"><strong class="speaker-name">Pedro:</strong>  I hope I'll get more and more, because</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2936.762000" data-stop="2941.313000">the more people test it, the better it will get.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2941.968000" data-stop="2944.411000">And I'm really looking forward to... I mean, I</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2944.471000" data-stop="2948.716000">already showed all the things that you can do in</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2948.736000" data-stop="2955.383000">the last big... In the last Emacs conference last winter.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2956.444000" data-stop="2959.368000">So I'm not going to repeat this here.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2960.509000" data-stop="2964.413000">So the talk, because I think it's more important</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2964.474000" data-stop="2967.377000">to go move on to the next big thing and have</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2967.437000" data-stop="2970.220000">people doing accessible documents.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2971.634000" data-stop="2975.826000">I'll keep on top of my donkey with the train</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2975.866000" data-stop="2979.357000">behind me until I get Babel and Polyglossia also</span> <span class="audio-time caption" data-speaker="Pedro" data-start="2979.437000" data-stop="2981.122000">integrated.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2981.000000">49:41</span> <strong>Fallback fonts</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="2981.142000" data-stop="2982.285000"><strong class="speaker-name">Prot:</strong>  Nice, nice, nice.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2983.902000" data-stop="2986.484000">Let me ask you the other question I had,</span> <span class="audio-time caption" data-speaker="Prot" data-start="2986.504000" data-stop="2988.146000">which maybe it is simple.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2988.666000" data-stop="2990.428000">Because you mentioned that you want to have</span> <span class="audio-time caption" data-speaker="Prot" data-start="2990.908000" data-stop="2993.571000">local variables so that the documents are</span> <span class="audio-time caption" data-speaker="Prot" data-start="2993.651000" data-stop="2997.474000">portable, which brings me to the question about</span> <span class="audio-time caption" data-speaker="Prot" data-start="2998.075000" data-stop="2999.916000">specifying generic fonts.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2999.936000" data-stop="3004.320000">Like, can you do something like use whatever the</span> <span class="audio-time caption" data-speaker="Prot" data-start="3004.380000" data-stop="3007.864000">system has for Serif, Sans, Mono?</span> <span class="audio-time caption" data-speaker="Prot" data-start="3007.884000" data-stop="3011.467000">Or you always have to specify a font family, like</span> <span class="audio-time caption" data-speaker="Prot" data-start="3011.547000" data-stop="3013.909000">Free Serif, Noto Sans, etc.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3013.889000" data-stop="3019.198000"><strong class="speaker-name">Pedro:</strong>  At this point, this was a very very long</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3019.238000" data-stop="3020.360000">discussion with Ihor.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3020.901000" data-stop="3023.605000">Do you want to have generics or do you want to</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3023.665000" data-stop="3024.607000">have specifics?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3026.510000" data-stop="3029.956000">I was looking more towards specifics.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3030.317000" data-stop="3035.911000">Why? Because in my experience, I mean, before I</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3035.931000" data-stop="3039.216000">started lecturing, I was for a long time in a</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3039.316000" data-stop="3041.079000">research and development company.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3041.981000" data-stop="3043.483000">We had European projects.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3043.744000" data-stop="3049.754000">There you had your own LaTeX templates.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3050.294000" data-stop="3053.059000">There you had to specify each and every font.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3054.052000" data-stop="3057.578000">Then in parallel with that, in the company they</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3057.618000" data-stop="3061.784000">had their own templates for PowerPoint, for Word</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3061.844000" data-stop="3065.510000">and so on, and you had to specify each and every</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3065.570000" data-stop="3067.854000">font that you wanted to use.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3068.695000" data-stop="3073.723000">So I've been mapping my experience in my prior</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3073.763000" data-stop="3076.547000">life into this.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3077.409000" data-stop="3079.452000">Having font families</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3080.090000" data-stop="3082.592000">might be nice. For example, Bera, I said at the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3082.632000" data-stop="3084.494000">beginning, that's one of the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3084.554000" data-stop="3087.577000">things that might be interesting, right? But as you</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3087.617000" data-stop="3091.720000">see, even in pdflatex, with Bera, you have to</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3091.921000" data-stop="3095.384000">include three different packages. So what's</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3095.444000" data-stop="3097.306000">the difference between including three different</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3097.346000" data-stop="3101.870000">packages, or directly saying, here, you have</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3101.890000" data-stop="3104.492000">three different fonts, one for main, one for...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3104.552000" data-stop="3107.495000">it's only one for main, one</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3107.535000" data-stop="3110.097000">for sans and one for...</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3110.077000" data-stop="3112.083000">That's the only thing that you have in LaTeX.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3112.705000" data-stop="3115.454000"><strong class="speaker-name">Sacha:</strong>  So, not like the CSS way of specifying</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3115.474000" data-stop="3119.146000">multiple fonts just in case one of them is not there?</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3119.166000" data-stop="3124.232000"><strong class="speaker-name">Pedro:</strong>  No. I mean, in this case,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3124.233000" data-stop="3129.400000">you are always going to go with what the system has.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3129.420000" data-stop="3132.424000">Normally, most of the fonts that, at least</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3132.484000" data-stop="3135.608000">most of the fonts that I recommend to use, are</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3135.669000" data-stop="3139.333000">fonts that are included because you have your</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3139.554000" data-stop="3142.718000">LaTeX installed underneath.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3144.160000" data-stop="3146.843000">It's not that I'm going to be there with a, I</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3146.883000" data-stop="3150.428000">don't know, what was this, what was it?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3151.505000" data-stop="3156.614000">Well, there was this Telefonica font family.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3160.120000" data-stop="3161.583000">No one is going to have it in real life.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3163.987000" data-stop="3169.016000">But the Free fonts are part of LaTeX.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3169.537000" data-stop="3171.560000">Another font that I really like a lot, because</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3171.620000" data-stop="3176.128000">it's very, very readable, is the TeX Gyre family.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3176.969000" data-stop="3178.813000">TeX Gyre is very, very readable.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3179.174000" data-stop="3180.436000">They have all kinds of fonts.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3180.937000" data-stop="3181.879000">I'm using two.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3182.140000" data-stop="3182.260000">Why?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3182.300000" data-stop="3184.505000">Because it's part of LaTeX.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3186.000000">53:06</span> <strong>LaTeX versions</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3186.429000" data-stop="3189.254000"><strong class="speaker-name">Pedro:</strong> And by the way, all this that I've shown today</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3189.295000" data-stop="3195.788000">can be done with a LaTeX which is basically 2024.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3197.202000" data-stop="3200.570000">What I'm going to be showing in December needs a</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3200.650000" data-stop="3202.274000">very, very modern LaTeX.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3202.935000" data-stop="3203.116000">Why?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3203.136000" data-stop="3207.025000">Because accessibility has not been in the wire</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3207.165000" data-stop="3210.954000">for the last... Well, it has only been in the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3210.994000" data-stop="3212.157000">wire for the last months.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3213.352000" data-stop="3216.295000">So, the real support for accessibility things</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3216.415000" data-stop="3219.718000">comes with very, very modern LaTeX stuff.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3219.738000" data-stop="3222.681000">But this is something you can do with, I mean,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3222.901000" data-stop="3229.307000">Ubuntu 2024, I'm sure, and Ubuntu even earlier,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3229.668000" data-stop="3230.769000">you could also do.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3231.690000" data-stop="3235.393000">Because the LaTeX is not that fancy.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3235.413000" data-stop="3238.016000">I think fallback fonts are already a</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3238.076000" data-stop="3241.779000">well-established mechanism in lualatex for a lot</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3241.819000" data-stop="3242.380000">of time.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3243.608000" data-stop="3245.210000"><strong class="speaker-name">Sacha:</strong>  Would you happen to know if the widely</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3245.250000" data-stop="3248.234000">released LaTeX 2024, for example, might have</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3248.314000" data-stop="3250.837000">support for multiple fallback fonts?</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3253.040000" data-stop="3256.445000"><strong class="speaker-name">Pedro:</strong>  That should be starting 2020.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3256.485000" data-stop="3266.378000"><strong class="speaker-name">Sacha:</strong>  Okay. So it's just in the Org side</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3266.498000" data-stop="3269.182000">where you might say main, this font is just Free</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3269.202000" data-stop="3272.586000">Serif, and not Free Serif, something, something.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3273.022000" data-stop="3277.770000"><strong class="speaker-name">Pedro:</strong>  Yeah exactly all right because...</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3277.771000" data-stop="3280.235000"><strong class="speaker-name">Sacha:</strong>  I do actually use custom fonts. When I export my</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3280.295000" data-stop="3282.760000">configuration, I want to use my handwriting for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3282.840000" data-stop="3285.465000">the titles, but of course nobody else is going</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3285.485000" data-stop="3287.508000">to have my handwriting... I mean, it's</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3287.548000" data-stop="3289.392000">public but people are not going to go to the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3289.412000" data-stop="3292.337000">trouble of downloading it, so yes, it would be nice</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3292.377000" data-stop="3295.142000">to have that fallback. Not that I'm saying, "Please</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3295.162000" data-stop="3296.785000">get on your donkey and go in that direction..."</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3298.233000" data-stop="3301.397000"><strong class="speaker-name">Pedro:</strong>  No, of course not. But in this case,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3301.817000" data-stop="3305.682000">good news for you, if you have this as a ttf or as</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3305.742000" data-stop="3310.587000">an otf font, then you can include that as your</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3310.627000" data-stop="3314.492000">main font, and the PDF that you post at the end</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3315.413000" data-stop="3319.157000">will have that already embedded, so you can</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3319.378000" data-stop="3321.540000">produce your PDFs with your fonts.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3321.858000" data-stop="3324.843000">The thing is, if you want to share the font, if</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3324.863000" data-stop="3327.688000">you want to share the source and then have other</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3327.728000" data-stop="3330.633000">people compile it, then you have to tell them to</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3330.693000" data-stop="3335.782000">install the fonts that are missing.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3336.523000" data-stop="3338.026000">But I think that's something that happens always.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3339.148000" data-stop="3340.871000">You enter a company, they have their own fonts.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3340.911000" data-stop="3343.195000">The first thing that you have to do, if you don't</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3343.235000" data-stop="3348.918000">get a pre-installed computer: download the fonts.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3349.018000" data-stop="3351.061000">If you want to produce documents for the company,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3351.081000" data-stop="3353.084000">you have to download the fonts and install them</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3353.124000" data-stop="3354.406000">so that you can produce.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3355.247000" data-stop="3356.949000">You don't have a boss telling you, no,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3356.989000" data-stop="3358.672000">the fonts, the fonts, the fonts.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3359.593000" data-stop="3361.375000"><strong class="speaker-name">Prot:</strong>  It's part of the brand, of course, yeah.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3361.716000" data-stop="3363.879000"><strong class="speaker-name">Pedro:</strong>  Yeah, no, no, it's a very important part</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3363.919000" data-stop="3364.420000">of the brand.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3364.660000" data-stop="3368.926000"><strong class="speaker-name">Sacha:</strong>  And of course, LaTeX is very good for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3368.986000" data-stop="3371.710000">controlling all these matters of presentation.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3372.702000" data-stop="3375.549000"><strong class="speaker-name">Pedro:</strong>  Exactly. I mean one of the things that I</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3375.910000" data-stop="3381.663000">I like most... Once again, here I've tried a</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3382.385000" data-stop="3384.670000">couple of times to have</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3385.696000" data-stop="3389.141000">a movement in that direction, a bit more</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3389.241000" data-stop="3395.229000">control of fonts within a LaTeX document or</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3395.350000" data-stop="3397.032000">within an Org document.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3398.000000">56:38</span> <strong>Sans serif fonts are better for accessibility</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3398.714000" data-stop="3402.640000"><strong class="speaker-name">Pedro:</strong> What you can do now is in LaTeX you can go and</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3402.700000" data-stop="3407.767000">say no, the main font is SF family.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3408.888000" data-stop="3411.152000">That's the default font so that you have</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3411.212000" data-stop="3412.834000">everything in some series.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3413.017000" data-stop="3416.180000">That's something that, by the way, enhances</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3416.561000" data-stop="3417.262000">accessibility.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3419.324000" data-stop="3423.268000">Because there are some people who will just</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3423.869000" data-stop="3429.755000">collapse with serif fonts and they need sans serif.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3429.000000">57:09</span> <strong>Wanting markup for sans serif</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3429.775000" data-stop="3432.518000"><strong class="speaker-name">Pedro:</strong> The other thing, the step that I wanted to move</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3432.558000" data-stop="3435.641000">forward is I want to highlight some words with</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3435.942000" data-stop="3437.083000">Sans Serif.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3437.148000" data-stop="3441.393000">Instead of bold or with the emphasis with the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3441.453000" data-stop="3446.298000">italics and so on, why not make some words stand</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3446.399000" data-stop="3447.960000">out with sans serif?</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3448.381000" data-stop="3450.804000">That's something that I also discussed in the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3450.844000" data-stop="3452.826000">Org list and no one wanted that.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3454.308000" data-stop="3457.131000">That's a pity.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3458.232000" data-stop="3460.314000"><strong class="speaker-name">Prot:</strong>  Because it might introduce new markup, of</span> <span class="audio-time caption" data-speaker="Prot" data-start="3460.375000" data-stop="3460.635000">course.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3461.055000" data-stop="3466.281000"><strong class="speaker-name">Pedro:</strong>  Yes. I would need just one more markup.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3466.301000" data-stop="3468.535000">And I was like, "Another one, please?" "No."</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3470.217000" data-stop="3470.657000"><strong class="speaker-name">Sacha:</strong>  I see.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3472.379000" data-stop="3474.402000">I've been just overriding the standard one</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3474.422000" data-stop="3477.305000">because, for example, I won't actually underline things.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3477.846000" data-stop="3480.930000">So I just change my underline to be something else.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3480.950000" data-stop="3483.313000">But of course, as a general practice, it's not</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3483.353000" data-stop="3484.995000">going to be that useful.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3485.436000" data-stop="3487.438000">You only have so many emphasis characters.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3488.532000" data-stop="3489.474000"><strong class="speaker-name">Pedro:</strong>  Yeah, no, of course.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3489.554000" data-stop="3492.900000">But if you don't want to underline another thing</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3492.920000" data-stop="3497.809000">that many people find disturbing or really</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3497.869000" data-stop="3501.756000">challenging, this is why I'm saying, let's try to</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3501.816000" data-stop="3504.962000">also have the possibility of having a specific</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3505.022000" data-stop="3507.486000">markup just for Sans Serif for that.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3510.284000" data-stop="3512.667000">It's all accessibility.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3513.307000" data-stop="3518.053000">I'm quite, how can I say, I'm very sensible to</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3518.113000" data-stop="3518.853000">this kind of things.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3519.995000" data-stop="3521.656000">I'm very sensitive to this kind of things.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3524.179000" data-stop="3528.344000">Mainly because I've been from very, very young,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3528.644000" data-stop="3536.713000">I've been very involved in the disability world.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3537.436000" data-stop="3540.421000"><strong class="speaker-name">Sacha:</strong>  I'm looking forward to hearing more</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3540.461000" data-stop="3545.008000">about your accessibility improvements in December</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3545.188000" data-stop="3546.490000">at EmacsConf.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3548.053000" data-stop="3549.956000">Thank you so much for working on this.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3551.518000" data-stop="3552.480000"><strong class="speaker-name">Pedro:</strong>  You're welcome.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3552.500000" data-stop="3556.947000">Thank you, yes.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3557.433000" data-stop="3561.685000"><strong class="speaker-name">Sacha:</strong>  You showed us Unicode, you showed us</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3561.785000" data-stop="3564.894000">emojis, you showed us theoretically how you would</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3565.356000" data-stop="3568.625000">do it for non-Latin character sets.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3569.146000" data-stop="3571.172000">It will all be wonderfully documented.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3571.490000" data-stop="3574.535000">And it is now in Org Devel, right?</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3575.156000" data-stop="3577.399000"><strong class="speaker-name">Pedro:</strong>  It's in Org Main.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3578.220000" data-stop="3578.701000"><strong class="speaker-name">Sacha:</strong>  Oh, sorry, yes.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3578.801000" data-stop="3579.242000">Org Main.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3579.262000" data-stop="3580.924000">So it'll make it into its release.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3581.946000" data-stop="3584.670000">I'm looking forward to seeing all of that.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3585.351000" data-stop="3592.142000"><strong class="speaker-name">Pedro:</strong>  It should be like Org 10 when it comes into being.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3592.162000" data-stop="3596.128000">People will still need to download stuff and</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3596.548000" data-stop="3598.932000">compile it on their own.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3598.912000" data-stop="3601.514000">That's the main problem.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3601.814000" data-stop="3604.116000">That's the only thing that I would like to see</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3604.156000" data-stop="3606.659000">advance at some point.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3607.119000" data-stop="3609.340000">But maybe that's with the next Emacs,</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3609.341000" data-stop="3610.182000">with Emacs 32.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3611.082000" data-stop="3612.203000"><strong class="speaker-name">Sacha:</strong>  Okay.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3612.604000" data-stop="3614.365000">Looking forward to seeing how that works out.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3614.445000" data-stop="3616.587000">If people are curious, they can find you on the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3616.687000" data-stop="3619.449000">Org Mode mailing list and volunteer to be guinea</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3619.469000" data-stop="3620.871000">pigs for various things.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3621.671000" data-stop="3624.073000">Your code is already in main, so it's easy enough</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3624.113000" data-stop="3624.834000">to try out.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3625.474000" data-stop="3627.596000">And thank you very much for sharing the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3627.636000" data-stop="3628.497000">demonstration today.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3629.877000" data-stop="3630.678000"><strong class="speaker-name">Pedro:</strong>  Okay, fine.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3630.898000" data-stop="3631.679000">Thank you very much.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3632.100000" data-stop="3633.862000">Just one small comment.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3633.000000">1:00:33</span> <strong>Contacting Pedro</strong></div><p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3633.922000" data-stop="3638.668000"><strong class="speaker-name">Pedro:</strong> I'm also maintaining LaTeX and Beamer in Org.</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3638.688000" data-stop="3642.453000">So any bugs, any questions, anything through the</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3642.493000" data-stop="3646.038000">mailing list and I'll try to answer as soon as</span> <span class="audio-time caption" data-speaker="Pedro" data-start="3646.078000" data-stop="3649.122000">possible.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3649.142000" data-stop="3650.443000"><strong class="speaker-name">Sacha:</strong>  I will end the stream there so people</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3650.483000" data-stop="3652.486000">have an hour of wonderful stuff to listen to.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3652.726000" data-stop="3654.028000">Thanks everyone for joining.</span> <p></p><span class="audio-time caption" data-speaker="Pedro" data-start="3655.358000" data-stop="3656.767000"><strong class="speaker-name">Pedro:</strong>  Thank you.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3656.768000" data-stop="3658.205000"><strong class="speaker-name">Prot:</strong>  Thank you.</span></div>
<p></p>


<a name="end-emacs-chat-31-pedro-a-aranda-gutierrez-transcript"></a></details>
</div>
</div>
<div><a href="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/index.org">View Org source for this post</a></div>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F10%2Foct-2-emacs-chat-31-pedro-a-aranda-gutierrez%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>]]></description>
		</item><item>
		<title>2026-09-28 Emacs news</title>
		<link>https://sachachua.com/blog/2026/09/2026-09-28-emacs-news/</link>
		<dc:creator><![CDATA[Sacha Chua]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 13:31:07 GMT</pubDate>
    <category>emacs</category>
<category>emacs-news</category>
		<guid isPermaLink="false">https://sachachua.com/blog/2026/09/2026-09-28-emacs-news/</guid>
		<description><![CDATA[<p>
There's a <a href="https://www.youtube.com/watch?v=KQEZBGkImII">nice long video about Org mode</a> with plenty of tips for beginners. Also, it's the end of the month, so check out the submissions for the <a href="https://www.emacswiki.org/emacs/Carnival">Emacs Carnival</a> for September (<a href="https://www.emacswiki.org/emacs/CarnivalSeptember2026">"Games"</a>) and consider volunteering to host the next one!
</p>

<ul class="org-ul">
<li>Upcoming events (<a href="https://emacslife.com/calendar/emacs-calendar.ics">iCal file</a>, <a href="https://emacslife.com/calendar/">Org</a>):
<ul class="org-ul">
<li>Emacs Berlin: Emacs-Berlin Hybrid Meetup <a href="https://emacs-berlin.org/">https://emacs-berlin.org/</a> Wed Sep 30 1000 America/Vancouver - 1200 America/Chicago - 1300 America/Toronto - 1700 Etc/UTC - 1900 Europe/Berlin - 2230 Asia/Kolkata &ndash; Thu Oct 1 0100 Asia/Singapore</li>
<li>EmacsATX: Emacs Social <a href="https://www.meetup.com/emacsatx/events/316464079/">https://www.meetup.com/emacsatx/events/316464079/</a> Thu Oct 1 1600 America/Vancouver - 1800 America/Chicago - 1900 America/Toronto - 2300 Etc/UTC &ndash; Fri Oct 2 0100 Europe/Berlin - 0430 Asia/Kolkata - 0700 Asia/Singapore</li>
<li><a href="https://sachachua.com/blog/2026/10/oct-2-emacs-chat-31-pedro-a-aranda-gutierrez/">Sacha Chua: Oct 2 - Emacs Chat 31: Pedro A. Aranda Gutierrez</a> (<a href="https://protesilaos.com/codelog/2026-09-25-emacs-live-sacha-pedro/">Protesilaos</a>, <a href="https://www.youtube.com/watch?v=aEnacESU-DU">YouTube</a>)</li>
<li>M-x Research: TBA <a href="https://m-x-research.github.io/">https://m-x-research.github.io/</a> Fri Oct 2 0800 America/Vancouver - 1000 America/Chicago - 1100 America/Toronto - 1500 Etc/UTC - 1700 Europe/Berlin - 2030 Asia/Kolkata - 2300 Asia/Singapore</li>
<li>Emacs.si (in person): Emacs.si meetup #10 2026 (v #živo) <a href="https://dogodki.kompot.si/events/df5d39f6-4d78-4841-b207-ef2c9e60bd5c">https://dogodki.kompot.si/events/df5d39f6-4d78-4841-b207-ef2c9e60bd5c</a> Mon Oct 5 1900 CET</li>
<li>Atelier Emacs Montpellier (in person) <a href="https://lebib.org/date/atelier-emacs">https://lebib.org/date/atelier-emacs</a> Fri Oct 9 1800 Europe/Paris</li>
</ul></li>
<li>Emacs configuration:
<ul class="org-ul">
<li><a href="https://www.reddit.com/r/emacs/comments/1wl2rhp/confirmkillemacs_should_be_a_boolean/">Discussion about confirm-kill-emacs</a> (<a href="https://irreal.org/blog/?p=14104">Irreal</a>)</li>
</ul></li>
<li>Emacs Lisp:
<ul class="org-ul">
<li><a href="http://yummymelon.com/devnull/announcing-restlib.html">Charles Choi: Announcing restlib - a utility library for building Emacs REST clients</a></li>
</ul></li>
<li>Appearance:
<ul class="org-ul">
<li><a href="https://techhub.social/@lispwizard/117348649189858245">Tip about changing the default font size (@lispwizard@techhub.social)</a></li>
<li><a href="https://github.com/masukomi/doom_config/blob/main/config.org#per-mode-themes">Per-mode themes</a> (<a href="https://connectified.com/@masukomi/117337835482059211">@masukomi@connectified.com</a>)</li>
</ul></li>
<li>Navigation:
<ul class="org-ul">
<li><a href="https://mbork.pl/2026-09-21_forward-paragraph_in_Magit">Marcin Borkowski: forward-paragraph in Magit</a></li>
<li><a href="https://kod.ujo.moe/jadedctrl/bookmark-groups.el">jadedctrl/bookmark-groups.el: Easily manage separate Emacs bookmark files - Kodujo Ŝɪɴᴏɴᴏᴍᴇ</a> (<a href="https://jam.xwx.moe/objects/24911119-eaa5-4ba4-9d4b-c8dbd7c57ff3">@jadedctrl@jam.xwx.moe</a>)</li>
<li><a href="https://github.com/benleis1/ilist-plus">Some updates on my package ilist-plus</a> (<a href="https://www.reddit.com/r/emacs/comments/1wooper/some_updates_on_my_package_ilistplus/">Reddit</a>) extensions to imenu-list</li>
</ul></li>
<li>Hyperbole:
<ul class="org-ul">
<li><a href="https://www.youtube.com/watch?v=o27oIxbSpBQ">Crie botões no Emacs</a> (10:36)</li>
</ul></li>
<li>Dired:
<ul class="org-ul">
<li><a href="https://techhub.social/@lispwizard/117328387866174436">C-u M-x dired to pass flags to ls command (@lispwizard@techhub.social)</a></li>
<li><a href="http://yummymelon.com/devnull/binding-the-spc-key-in-dired-and-ibuffer.html">Charles Choi: Binding the SPC key in Dired and IBuffer</a> (<a href="https://irreal.org/blog/?p=14106">Irreal</a>)</li>
</ul></li>
<li>Writing:
<ul class="org-ul">
<li><a href="https://www.reddit.com/r/emacs/comments/1ws28im/til_about_remember_mode_builtin_persistentscratch/">TIL about Remember mode - built-in persistent-scratch</a></li>
<li><a href="https://utcc.utoronto.ca/~cks/space/blog/programming/EmacsFlyspellWordTracking">How Emacs does things: flyspell's way of tracking misspelled words</a> (<a href="https://utcc.utoronto.ca/~cks/space/blog/programming/EmacsFlyspellWordTracking">@chris_siebenmann@robot.villas</a>)</li>
</ul></li>
<li>Denote:
<ul class="org-ul">
<li><a href="https://protesilaos.com/codelog/2026-09-25-emacs-denote-find-file/">Protesilaos: Emacs: find a file in the ‘denote-directory’</a></li>
<li><a href="https://protesilaos.com/codelog/2026-09-26-emacs-experiment-denote-cache/">Protesilaos: Emacs: I am experimenting with a Denote cache</a></li>
</ul></li>
<li>Org Mode:
<ul class="org-ul">
<li><a href="https://www.youtube.com/watch?v=KQEZBGkImII">How I Actually Use Org Mode - Emacs Everywhere #3</a> (01:00:42)</li>
<li><a href="https://www.youtube.com/watch?v=HqV_l5lry00">Spacemacs | What kind of notes I take? | Productivity</a> (07:04, in French)</li>
<li><a href="https://www.youtube.com/watch?v=YvFS1O2Oqvs">org for creator - turn your thought from graphs into meaningful posts</a> (13:43)
<ul class="org-ul">
<li><a href="https://www.youtube.com/watch?v=ZTsmHx7yoGo">org per creatori - i tuoi pensieri in grafi che creano storie</a> (12:55)</li>
</ul></li>
<li><a href="https://emacs.dyerdwelling.family/emacs/20260924135500-emacs&#45;&#45;copy-only-what-you-see-teaching-m-w-a-prefix-argument/">James Dyer: Copy Only What You See: Teaching M-w a Prefix Argument</a> (<a href="https://irreal.org/blog/?p=14108">Irreal</a>)</li>
<li><a href="https://github.com/yibie/org-table-widget">org-table-widget 0.3.0: long Org tables now scroll like ordinary text</a> (<a href="https://www.reddit.com/r/emacs/comments/1wow52y/orgtablewidget_030_long_org_tables_now_scroll/">Reddit</a>)</li>
<li><a href="https://www.reddit.com/r/emacs/comments/1wo1som/a_small_featurenot_sure_if_its_useful_but_its_a/">Org tangle and run</a></li>
<li><a href="https://v.redd.it/r82fm3ayg1rh1">Supertag V2: I rebuilt a note-taking system, and what I learned</a> (<a href="https://www.reddit.com/r/emacs/comments/1wn4hy7/supertag_v2_i_rebuilt_a_notetaking_system_and/">Reddit</a>)</li>
<li><a href="https://github.com/yibie/chai">Chai 2.1: read, highlight, search and ask your Org book library, with notes you can carry out</a> (<a href="https://www.reddit.com/r/emacs/comments/1wph5b1/chai_21_read_highlight_search_and_ask_your_org/">Reddit</a>)</li>
<li>Org development:
<ul class="org-ul">
<li><a href="https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/etc/ORG-NEWS?id=10814296c77681fbbf708f0d898fa88cbaa7ccce">Add OTHER_LANGUAGES to the metadata</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/etc/ORG-NEWS?id=578c2650bcd17d74658b7a3fdfc9fd4917eb159d">ox-latex: add :alt attribute for images</a></li>
</ul></li>
</ul></li>
<li>Coding:
<ul class="org-ul">
<li><a href="https://www.reddit.com/r/emacs/comments/1wpuk2f/emacs_clangd_and_lspmode_diagnostic_lag_while/">Emacs: clangd and lsp-mode -&gt; diagnostic lag while typing, and an on-demand solution</a></li>
<li><a href="https://protesilaos.com/codelog/2026-09-23-emacs-sxhkdrc-mode-1-3-0/">Protesilaos: Emacs: sxhkdrc-mode version 1.3.0</a></li>
<li><a href="https://www.reddit.com/r/lisp/comments/1wozt4o/varhammer_118_midnight/">Varhammer 1.1.8 "Midnight" - Portable Common Lisp for Windows</a> (<a href="https://www.reddit.com/r/emacs/comments/1wquz2p/varhammer_118_midnight/">Reddit</a>)</li>
</ul></li>
<li>Math:
<ul class="org-ul">
<li><a href="https://fosstodon.org/@aethor/117310180115101422">Tip: latex-math-mode minor mode has a menu of symbols (@aethor@fosstodon.org)</a></li>
</ul></li>
<li>Shells:
<ul class="org-ul">
<li><a href="https://techhub.social/@lispwizard/117343857396819133">send-invisible: Handle password prompts in shells or comint when not properly detected (@lispwizard@techhub.social)</a></li>
</ul></li>
<li>Web:
<ul class="org-ul">
<li><a href="https://git.andros.dev/andros/termweb.el">andros/termweb.el: Reformat web pages so they read well in EWW, the Emacs browser</a> (<a href="https://activity.andros.dev/@andros/statuses/01M34VJZBRYMZGAX9H8BJFDZD4">@andros@activity.andros.dev</a>)</li>
<li><a href="https://einar.codeberg.page/eww-in-emacs-31-would-not-use-browse-url-generic-as-browse-url-secondary-browser-function.html">Einar Mostad: EWW in Emacs 31 would not use browse-url-generic as browse-url-secondary-browser-function</a></li>
</ul></li>
<li>Mail, news, and chat:
<ul class="org-ul">
<li><a href="https://github.com/guibor/teams4e">GitHub - guibor/teams4e: A mu4e-inspired Microsoft Teams client for Emacs.</a> (<a href="https://www.reddit.com/r/emacs/comments/1wpw4fb/github_guiborteams4e_a_mu4einspired_microsoft/">Reddit</a>)</li>
</ul></li>
<li>Multimedia:
<ul class="org-ul">
<li><a href="https://www.youtube.com/watch?v=j2YSbH6OMD8">Playing around with OBS, Emacs, and speech commands</a> (01:54)</li>
</ul></li>
<li>LLMs:
<ul class="org-ul">
<li><a href="https://github.com/ahyatt/llm/tree/decision">llm package support for jev / laya-style quick decisions</a> (<a href="https://www.reddit.com/r/emacs/comments/1ws60sw/llm_package_support_for_jev_layastyle_quick/">Reddit</a>)</li>
<li><a href="https://moxnet.eu/braindump/brainiac-v3-0-released">Brainiac v3.0 released</a> (<a href="https://www.reddit.com/r/emacs/comments/1wncjh2/brainiac_v30_released/">Reddit</a>)</li>
<li><a href="https://xenodium.com/agent-shell-0-78-updates">Alvaro Ramirez: agent-shell 0.78 updates</a> (<a href="https://www.reddit.com/r/emacs/comments/1wn768h/agentshell_078_updates/">Reddit</a>)</li>
<li><a href="https://www.youtube.com/watch?v=mzba_LQQCLM">Fazendo gambiarra com Emacs e Remux</a> (55:31)</li>
</ul></li>
<li>Community:
<ul class="org-ul">
<li><a href="https://www.reddit.com/r/emacs/comments/1wmxqol/fortnightly_tips_tricks_and_questions_20260922/">Fortnightly Tips, Tricks, and Questions — 2026-09-22 / week 38</a></li>
<li><a href="https://www.youtube.com/watch?v=3hBdSrqdXqs">Everyday Emacs 2026-2027 Series - 1</a> (02:11) - Series of videos in Turkish; live-coding?</li>
</ul></li>
<li>Other:
<ul class="org-ul">
<li><a href="https://olddeuteronomy.github.io/post/running-emacs-in-microvm/">The Emacs Cat: Running Emacs in microVM</a></li>
</ul></li>
<li>Emacs development:
<ul class="org-ul">
<li>emacs-devel:
<ul class="org-ul">
<li><a href="https://lists.gnu.org/archive/html/emacs-devel/2026-09/msg00430.html">Detecting and warning about homoglyph attacks</a></li>
</ul></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=cc7a4dfbf175a361aecb4c0696ded20e02d6a8aa">Improve directory-files-recursively</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=193785af9fb7c269dfadfdbf96d3418e03787cc2">Fix creation of commit message from ChangeLog (bug#81909)</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=70662bc0ff44c36674adf4ea9fd52e87a76a576a">New option vc-dir-simple-unmark-all-files</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=7b578f7d886b5dc5ef1a22b2b20a52ea443ed708">New option vc-quick-select-current-working-tree</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=b41af68695860eefacbae0a05c03798aee2f99c1">New command diff-goto-old-source</a></li>
</ul></li>
<li>New packages:
<ul class="org-ul">
<li><a target="_blank" href="https://melpa.org/#/adif">adif</a>: Major mode for viewing and editing ADIF log files (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/aqui">aqui</a>: Location update (optimized for macOS) (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/consult-ghostel">consult-ghostel</a>: Consult integration for ghostel (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/consult-zoxide">consult-zoxide</a>: Jump to zoxide directories with Consult (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/dharmamitra">dharmamitra</a>: Sanskrit/Pāli/Tibetan/Chinese analysis via dharmamitra.org (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/latex-to-svg-for-markdown">latex-to-svg-for-markdown</a>: Preview Markdown LaTeX math as SVG (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/preview-tab">preview-tab</a>: Temporary file buffers, like VS Code's preview tab (MELPA)</li>
</ul></li>
</ul>

<p>
Links from <a href="https://www.reddit.com/r/emacs">reddit.com/r/emacs</a>, <a href="https://www.reddit.com/r/orgmode">r/orgmode</a>, <a href="https://www.reddit.com/r/spacemacs">r/spacemacs</a>, <a href="https://mastodon.social/tags/emacs">Mastodon #emacs</a>, <a href="https://bsky.app/hashtag/emacs">Bluesky #emacs</a>, <a href="https://hn.algolia.com/?query=emacs&amp;sort=byDate&amp;prefix&amp;page=0&amp;dateRange=all&amp;type=story">Hacker News</a>, <a href="https://lobste.rs/search?q=emacs&amp;what=stories&amp;order=newest">lobste.rs</a>, <a href="https://programming.dev/c/emacs?dataType=Post&amp;page=1&amp;sort=New">programming.dev</a>, <a href="https://lemmy.world/c/emacs">lemmy.world</a>, <a href="https://lemmy.ml/c/emacs?dataType=Post&amp;page=1&amp;sort=New">lemmy.ml</a>, <a href="https://planet.emacslife.com">planet.emacslife.com</a>, <a href="https://www.youtube.com/playlist?list=PL4th0AZixyREOtvxDpdxC9oMuX7Ar7Sdt">YouTube</a>, <a href="http://git.savannah.gnu.org/cgit/emacs.git/log/etc/NEWS">the Emacs NEWS file</a>, <a href="https://emacslife.com/calendar/">Emacs Calendar</a>, and <a href="https://lists.gnu.org/archive/html/emacs-devel/2026-09">emacs-devel</a>. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at <a href="mailto:sacha@sachachua.com">sacha@sachachua.com</a>. Thank you!</p>
<div><a href="https://sachachua.com/blog/2026/09/2026-09-28-emacs-news/index.org">View Org source for this post</a></div>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F09%2F2026-09-28-emacs-news%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>]]></description>
		</item>
	</channel>
</rss>