<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><link rel="alternate" type="application/rss+xml" href="../rss.xml"/><style data-href="/styles.5590a669c9dba5321619.css" data-identity="gatsby-global-css">@font-face{font-display:fallback;font-family:Inter;font-style:normal;font-weight:400;src:url(https://rsms.me/inter/font-files/Inter-Regular.woff2?v=3.3) format("woff2"),url(https://rsms.me/inter/font-files/Inter-Regular.woff?v=3.3) format("woff")}@font-face{font-display:fallback;font-family:Inter;font-style:italic;font-weight:400;src:url(https://rsms.me/inter/font-files/Inter-Italic.woff2?v=3.3) format("woff2"),url(https://rsms.me/inter/font-files/Inter-Italic.woff?v=3.3) format("woff")}@font-face{font-display:fallback;font-family:Inter;font-style:normal;font-weight:600;src:url(https://rsms.me/inter/font-files/Inter-SemiBold.woff2?v=3.3) format("woff2"),url(https://rsms.me/inter/font-files/Inter-SemiBold.woff?v=3.3) format("woff")}@font-face{font-display:fallback;font-family:Inter;font-style:italic;font-weight:600;src:url(https://rsms.me/inter/font-files/Inter-SemiBoldItalic.woff2?v=3.3) format("woff2"),url(https://rsms.me/inter/font-files/Inter-SemiBoldItalic.woff?v=3.3) format("woff")}@font-face{font-display:fallback;font-family:Inter;font-style:normal;font-weight:700;src:url(https://rsms.me/inter/font-files/Inter-Bold.woff2?v=3.3) format("woff2"),url(https://rsms.me/inter/font-files/Inter-Bold.woff?v=3.3) format("woff")}@font-face{font-display:fallback;font-family:Inter;font-style:italic;font-weight:700;src:url(https://rsms.me/inter/font-files/Inter-BoldItalic.woff2?v=3.3) format("woff2"),url(https://rsms.me/inter/font-files/Inter-BoldItalic.woff?v=3.3) format("woff")}@font-face{font-display:fallback;font-family:Iosevka Web;font-style:normal;font-weight:400;src:url(../static/iosevka-regular-16dbe5061e131124a488bc943cab77d9.woff2) format("woff2"),url(../static/iosevka-regular-0a866faad05f5adaf3da07d0c4301ece.woff) format("woff"),url(../static/iosevka-regular-86e16893ae35205fb9cbd194d032d18d.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Iosevka Web;font-style:italic;font-weight:400;src:url(../static/iosevka-italic-18bb4838493100eaf489d79269d4a8d0.woff2) format("woff2"),url(../static/iosevka-italic-9216409a4bb6480fc8d83a7185265740.woff) format("woff"),url(../static/iosevka-italic-df5bdd869170b93557f517b1d5072089.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Iosevka Web;font-style:oblique;font-weight:400;src:url(../static/iosevka-oblique-bdc0b8c75ed6d4d80a8473e1b59d3835.woff2) format("woff2"),url(../static/iosevka-oblique-1b4ad417385daab8b6624bd0ee8a5bf8.woff) format("woff"),url(../static/iosevka-oblique-3c4a95b05396b67b453c938e876db665.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Iosevka Web;font-style:normal;font-weight:700;src:url(../static/iosevka-bold-4bff02e3a4a1c702d93452ecd6c1a13f.woff2) format("woff2"),url(../static/iosevka-bold-043d268c51a9f3dfd2e57ea203fa42b0.woff) format("woff"),url(../static/iosevka-bold-dd88607d7c53d2001828e613350b6a72.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Iosevka Web;font-style:italic;font-weight:700;src:url(../static/iosevka-bolditalic-1023faa6207623c2ed7294375abbca63.woff2) format("woff2"),url(../static/iosevka-bolditalic-100aa5a08bdea7237e4c0818a41b4c59.woff) format("woff"),url(../static/iosevka-bolditalic-8fce36ec3f40f04e4ddea632ab0f1d87.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Iosevka Web;font-style:oblique;font-weight:700;src:url(../static/iosevka-boldoblique-ed02bd67300f828e3f1eb9c4e6a611d2.woff2) format("woff2"),url(../static/iosevka-boldoblique-ab212402dc8ff6ba80583ea996578a42.woff) format("woff"),url(../static/iosevka-boldoblique-ef2cf1a2430a178eeb3410e89d657175.ttf) format("truetype")}code[class*=language-],pre[class*=language-]{word-wrap:normal;color:#eceff4;font-family:Iosevka Web,"monospace";-webkit-hyphens:none;-ms-hyphens:none;hyphens:none;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;text-align:left;white-space:pre;word-break:normal;word-spacing:normal}code[class*=language-]::selection,code[class*=language-] ::selection,pre[class*=language-]::selection,pre[class*=language-] ::selection{background:#3b4252}pre[class*=language-]{border-radius:.3em;margin:.5em 0;overflow:auto;padding:1em}:not(pre)>code[class*=language-]{background:#eceff4;border-radius:3px;color:#2e3440;font-family:Iosevka Web,"monospace";font-size:90%;-webkit-font-variant-ligatures:none;font-variant-ligatures:none;padding:.05em .4em}:not(pre)>code[class*=language-]::selection{background:#c9ecff!important}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#4c566a}.token.punctuation{color:#e5e9f0}.namespace{opacity:.7}.token.boolean{color:#81a1c1}.token.number{color:#b48ead}.token.tag{color:#d8dee9}.token.constant,.token.deleted,.token.property,.token.symbol{color:#88c0d0}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string,.token.url{color:#eceff4}.token.entity{background:#eee8d5;color:#657b83}.token.attr-value,.token.keyword{color:#81a1c1}.token.atrule,.token.class-name,.token.function{color:#8fbcbb}.token.important,.token.regex,.token.variable{color:#81a1c1}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.name{color:#a3be8c}.token.trigger{color:#88c0d0}.token.snippet{color:#81a1c1}.token.tabstop{color:#ebcb8b}.token.flags,.token.inline{color:#b48ead}.gatsby-highlight-code-line{background-color:#13151b;border-left:.25em solid #88c0d0;display:block;margin-left:-1em;margin-right:-1em;padding:.1em 1em .1em .75em}</style><meta name="generator" content="Gatsby 4.4.0"/><link rel="preconnect" href="https://www.google-analytics.com"/><link rel="dns-prefetch" href="https://www.google-analytics.com"/><link rel="alternate" type="application/rss+xml" title="Gilles Castel's blog RSS Feed" href="../rss.xml"/><link rel="icon" href="../favicon-32x32.png%3Fv=c9dde36f72d3007a082734fe5feea5e4" type="image/png"/><link rel="manifest" href="../manifest.webmanifest" crossorigin="anonymous"/><meta name="theme-color" content="#2E3440"/><link rel="apple-touch-icon" sizes="48x48" href="../icons/icon-48x48.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><link rel="apple-touch-icon" sizes="72x72" href="../icons/icon-72x72.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><link rel="apple-touch-icon" sizes="96x96" href="../icons/icon-96x96.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><link rel="apple-touch-icon" sizes="144x144" href="../icons/icon-144x144.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><link rel="apple-touch-icon" sizes="192x192" href="../icons/icon-192x192.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><link rel="apple-touch-icon" sizes="256x256" href="../icons/icon-256x256.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><link rel="apple-touch-icon" sizes="384x384" href="../icons/icon-384x384.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><link rel="apple-touch-icon" sizes="512x512" href="../icons/icon-512x512.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><title data-react-helmet="true">How I'm able to take notes in mathematics lectures using LaTeX and Vim | Gilles Castel</title><meta data-react-helmet="true" name="description" content="A while back I answered a question on Quora: Can people actually keep up with note-taking in Mathematics lectures with LaTeX.There, I explained my workflow of taking lecture notes in LaTeX using Vim and how I draw figures in Inkscape.However, a lot has…"/><meta data-react-helmet="true" property="og:title" content="How I'm able to take notes in mathematics lectures using LaTeX and Vim"/><meta data-react-helmet="true" property="og:description" content="A while back I answered a question on Quora: Can people actually keep up with note-taking in Mathematics lectures with LaTeX.There, I explained my workflow of taking lecture notes in LaTeX using Vim and how I draw figures in Inkscape.However, a lot has…"/><meta data-react-helmet="true" property="og:type" content="website"/><meta data-react-helmet="true" name="twitter:card" content="summary"/><meta data-react-helmet="true" name="twitter:creator" content="Gilles Castel"/><meta data-react-helmet="true" name="twitter:title" content="How I'm able to take notes in mathematics lectures using LaTeX and Vim"/><meta data-react-helmet="true" name="twitter:description" content="A while back I answered a question on Quora: Can people actually keep up with note-taking in Mathematics lectures with LaTeX.There, I explained my workflow of taking lecture notes in LaTeX using Vim and how I draw figures in Inkscape.However, a lot has…"/><style data-styled="" data-styled-version="5.3.3">.NEJsy{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #4C566A;border-top:1px solid #4C566A;padding:1em;font-size:80%;}/*!sc*/data-styled.g1[id="Bio__BioDiv-sc-1xze3le-0"]{content:"NEJsy,"}/*!sc*/.gzyKGq{padding-left:1em;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;}/*!sc*/data-styled.g2[id="Bio__Text-sc-1xze3le-1"]{content:"gzyKGq,"}/*!sc*/.iQePnH{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;border-radius:50%;}/*!sc*/data-styled.g3[id="Bio___StyledImg-sc-1xze3le-2"]{content:"iQePnH,"}/*!sc*/::selection{background:#c9ecff;}/*!sc*/::-moz-selection{background:#c9ecff;}/*!sc*/*{margin:0;padding:0;box-sizing:border-box;}/*!sc*/html,body{font-family:'Inter',sans-serif;text-rendering:optimizeLegibility;line-height:1.4;}/*!sc*/body{background:#ffffff;color:#3a343a;font-size:18px;text-rendering:optimizeLegibility;}/*!sc*/a{outline:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;}/*!sc*/p a,figcaption a{border-bottom:1px solid #4C566A;}/*!sc*/table{margin:0 auto;}/*!sc*/.gatsby-resp-image-link{border-bottom:none;}/*!sc*/h1{font-size:230%;line-height:1.2;margin-bottom:0.2em;}/*!sc*/p{margin-top:1.4rem;margin-bottom:1.4rem;}/*!sc*/blockquote{font-style:italic;border-left:2px solid #2E3440;padding-left:1.4rem;margin-left:-1.4rem;}/*!sc*/li{margin-bottom:0.7rem;padding-left:1.4rem;}/*!sc*/ul,ol{padding-left:1.4rem;}/*!sc*/hr{border-top:none;border-bottom:1px solid black;}/*!sc*/.gatsby-highlight{box-shadow:0px 0px 10px rgba(0,0,0,0.2);font-family:'Iosevka Web','monospace';font-size:90%;background-color:#2e3440;margin:1em 0;padding:1em;overflow:auto;}/*!sc*/.gatsby pre,.gatsby pre code{font-family:'Iosevka Web','monospace';}/*!sc*/.gatsby-highlight pre[class*="language-"]{background-color:transparent;margin:0;padding:0;overflow:initial;float:left;min-width:100%;}/*!sc*/.gatsby-video-aspect-ratio{box-shadow:0px 0px 10px rgba(0,0,0,0.2);margin:1em 0;}/*!sc*/.gatsby-resp-image-wrapper{max-width:none !important;}/*!sc*/img[src$=gif]{background-color:#2E333F;box-shadow:0px 0px 10px rgba(0,0,0,0.2);width:100%;}/*!sc*/img[src$="svg"]{width:100%;}/*!sc*/#disqus_thread{position:relative;}/*!sc*/#disqus_thread::after{content:'';position:absolute;left:0;right:0;bottom:0;height:55px;background:#ffffff;}/*!sc*/kbd{font-size:90%;font-family:'Iosevka Web','monospace';padding:.05em .4em;border-radius:3px;border:1px solid gray;background:#ECEFF4;}/*!sc*/figure figcaption{padding:0.7em 1.4em;font-size:80%;background:#ECEFF4;}/*!sc*/data-styled.g4[id="sc-global-cLNjzj1"]{content:"sc-global-cLNjzj1,"}/*!sc*/.cxeJTm{padding:1em;color:#d8dee9;text-align:center;max-width:648px;margin:0 auto;font-size:80%;}/*!sc*/data-styled.g5[id="Layout__Footer-sc-g3mgjj-0"]{content:"cxeJTm,"}/*!sc*/.fwYusv{min-height:100vh;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}/*!sc*/data-styled.g6[id="Layout___StyledDiv-sc-g3mgjj-1"]{content:"fwYusv,"}/*!sc*/.chpAuY{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}/*!sc*/data-styled.g7[id="Layout___StyledDiv2-sc-g3mgjj-2"]{content:"chpAuY,"}/*!sc*/.kbKLKY{font-size:80%;text-transform:lowercase;font-weight:700;font-variant:small-caps;}/*!sc*/data-styled.g8[id="smallcaps__SmallCaps-sc-17d6b14-0"]{content:"kbKLKY,"}/*!sc*/.hyHJPv{font-size:80%;font-weight:700;}/*!sc*/data-styled.g9[id="smallcaps__FakeSmallCaps-sc-17d6b14-1"]{content:"hyHJPv,"}/*!sc*/.iDNUhN{border-bottom:1px solid #4C566A;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/.iDNUhN > span,.iDNUhN a{padding:0.5em 0;}/*!sc*/data-styled.g10[id="blog-post__SupTitle-sc-1993m0e-0"]{content:"iDNUhN,"}/*!sc*/.ijGSzm{width:100%;text-align:center;margin:2.8rem 0;}/*!sc*/data-styled.g11[id="blog-post__Title-sc-1993m0e-1"]{content:"ijGSzm,"}/*!sc*/.cFnHMB{max-width:680px;margin:0 auto;padding:1em;}/*!sc*/.cFnHMB .custom-block.snippet .custom-block-body{font-style:italic;}/*!sc*/.cFnHMB h2,.cFnHMB h3,.cFnHMB h4,.cFnHMB h5,.cFnHMB h6{line-height:1.2;margin-bottom:-1rem;}/*!sc*/.cFnHMB h2{margin-top:2em;font-size:1.4rem;}/*!sc*/.cFnHMB h3{margin-top:2rem;font-size:1.2rem;}/*!sc*/.cFnHMB .toc{z-index:10;position:-webkit-sticky;position:sticky;top:2em;font-size:70%;height:0px;}/*!sc*/@media (max-width:1080px){.cFnHMB .toc{display:none;}}/*!sc*/.cFnHMB .toc ul{list-style:none;display:inline-block;width:calc((100vw - 680px) / 2 - 4em);}/*!sc*/.cFnHMB .toc li{padding-left:0;margin-bottom:0.3em;}/*!sc*/.cFnHMB .toc li p{margin:0;margin-bottom:0.5em;}/*!sc*/.cFnHMB .toc a{border-bottom:none;}/*!sc*/.cFnHMB .toc a.is-active{font-weight:bold;}/*!sc*/.cFnHMB .toc > ul{padding-left:0;-webkit-transform:translateX(calc(-100% - 2em)) translateY(4em);-ms-transform:translateX(calc(-100% - 2em)) translateY(4em);transform:translateX(calc(-100% - 2em)) translateY(4em);}/*!sc*/.cFnHMB .toc > ul::before{content:"Table of contents";font-weight:bold;padding-bottom:0.5em;display:inline-block;}/*!sc*/data-styled.g12[id="blog-post__Main-sc-1993m0e-2"]{content:"cFnHMB,"}/*!sc*/.ePTuVc{margin-bottom:2em;}/*!sc*/.ePTuVc ul{margin:0;padding:0;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/.ePTuVc ul li{margin:0;padding:0;list-style-type:none;}/*!sc*/.ePTuVc ul li a{display:inline-block;padding:0.5em 0;}/*!sc*/.ePTuVc ul li.prev{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}/*!sc*/.ePTuVc ul li.next{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:right;padding-left:1em;}/*!sc*/data-styled.g13[id="blog-post__Nav-sc-1993m0e-3"]{content:"ePTuVc,"}/*!sc*/</style><link as="script" rel="preload" href="../webpack-runtime-f28b399e0936aecf66ac.js"/><link as="script" rel="preload" href="../framework-ea68fce3d30d105ba963.js"/><link as="script" rel="preload" href="../app-9c07f8581d6a14d0067d.js"/><link as="script" rel="preload" href="../04f12b145687b6350b874aa568443d7ed4a3c726-be6a39a4ebd1487fb52e.js"/><link as="script" rel="preload" href="../component---src-templates-blog-post-js-8cf4b165ff72f56ebc7c.js"/><link as="fetch" rel="preload" href="../page-data/post/lecture-notes-1/page-data.json" crossorigin="anonymous"/><link as="fetch" rel="preload" href="../page-data/sq/d/3128451518.json" crossorigin="anonymous"/><link as="fetch" rel="preload" href="../page-data/app-data.json" crossorigin="anonymous"/></head><body><div id="___gatsby"><div style="outline:none" tabindex="-1" id="gatsby-focus-wrapper"><div class="Layout___StyledDiv-sc-g3mgjj-1 fwYusv"><div class="Layout___StyledDiv2-sc-g3mgjj-2 chpAuY"><div class="blog-post__Main-sc-1993m0e-2 cFnHMB"><div class="smallcaps__SmallCaps-sc-17d6b14-0 blog-post__SupTitle-sc-1993m0e-0 kbKLKY iDNUhN"><a href="../index.html">← All articles</a><span>Mar<!-- --> <span class="smallcaps__FakeSmallCaps-sc-17d6b14-1 hyHJPv">16</span>,<!-- --> <span class="smallcaps__FakeSmallCaps-sc-17d6b14-1 hyHJPv">2019</span> •<!-- --> <span class="smallcaps__FakeSmallCaps-sc-17d6b14-1 hyHJPv">15</span> Min Read</span></div><h1 class="blog-post__Title-sc-1993m0e-1 ijGSzm">How I'm able to take notes in mathematics lectures using LaTeX and Vim</h1><div><div class="custom-block snippet"><div class="custom-block-body"><p>A while back I answered a question on Quora: <a href="https://www.quora.com/Can-people-actually-keep-up-with-note-taking-in-Mathematics-lectures-with-LaTeX/answer/Gilles-Castel-1" target="_blank" rel="nofollow noopener noreferrer">Can people actually keep up with note-taking in Mathematics lectures with LaTeX</a>.There, I explained my workflow of taking lecture notes in LaTeX using Vim and how I draw figures in Inkscape.However, a lot has changed since then and I’d like to write a few blog posts explaining my workflow.</p></div></div><p>I started using LaTeX to write lecture notes in the second semester of my bachelor in mathematics, and I’ve been using it ever since,which makes for a total of more than 1700 pages of notes.To give you an idea of what those notes look like, here are some examples:</p><p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; " > <a class="gatsby-resp-image-link" href="../static/ba66c52b01c8fe6b31c97af52b5eb7f7/c2c88/ca1.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 70.58823529411764%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAABR0lEQVQoz21T7Y4DIQj0/d+0qauCIIIfvbTkNnvbm1+aMDLMYFDV1lr/wMzGGGa21np9sPd+vV6qWmttF4iIqoa1lpmJSIyRmb36hF/HGMwsIsyMiACgqnPOcBblnFNKqvpNvl5VlZlVdYzx7jznNDMAyDkz85zzJvuEmdVanbzWCj6ziNRae+/jgxt57z3nFBFEbK2pqvsSRAQAfJ7e+1rLX70Z5g611q5CgleICBG11k7aleyj+RNe9odcSkFEIuq9X+f0c+89xlhKcc8913dULqaUcibpMdzIpRQiqrV6GwBg5kBEx3F4Wx/Mt+VmWPogxoiIIuIeB2bOOQPA+oUndyWLyHEcKaXn8wkAiOiBBURMKblsZvZVvblNRI/Hw9We7rzJZ84AQERzzu+cVRUA2hfCuTqtNWZ2wf9umP8ZM/MV3nv/AAABMXW1rDYkAAAAAElFTkSuQmCC'); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="ca1" title="ca1" src="../static/ba66c52b01c8fe6b31c97af52b5eb7f7/a4de1/ca1.png" srcset="../static/ba66c52b01c8fe6b31c97af52b5eb7f7/e3b59/ca1.png 170w,../static/ba66c52b01c8fe6b31c97af52b5eb7f7/d6fe0/ca1.pngg 340w../static/ba66c52b01c8fe6b31c97af52b5eb7f7/a4de1/ca1.pngng 680../static/ba66c52b01c8fe6b31c97af52b5eb7f7/e9ece/ca1.pngpng 102../static/ba66c52b01c8fe6b31c97af52b5eb7f7/c2c88/ca1.png.png 1173w" sizes="(max-width: 680px) 100vw, 680px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; " > <a class="gatsby-resp-image-link" href="../static/1a393ac73dbb96f6fbd98b258e8a325a/a78ad/ca2.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 69.41176470588235%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAABYElEQVQoz12Sa9OrIAyE/f9/s9ZRkEvDNaTombJvPR2fD4wDLtksmUop9UsphZlzzr338zyP4zgHOeeUUhnUWlNKMUYRmay1WmvvPRF572OM1trWGsTQE5HWehtYa51zr9eLmadlWdZ13bZtWZZt25RSxhgR+a0sIjyAQRHpg8l7/2s75ywi78Glt9bO87wPtNZYU0oT/OBAKbXvu3OulNJ7h/I4jpxzCMEYo5TSgz/bSil4XtfVGOOcs9ZeZaGHMn5BYB+x9z6EkHOOMSLPGOOv5/M80YWIIHN8f3rGT601ZkbIF5e4lILMULa19l+Mi1trtVa88E2MbNuXa3/CWWsN63VwEzNzKYWIQggw/1cZx+/3+1d5mzAiYmYigjuUmcLAWrvvuzEGF98CQ0e1VkwB9j+V53l+PB7z4Pl8KqWcc7fxTClhKvEiV3cTokKMRATz13hc/nvveZBSYmZU/gcYMywFaTlE2gAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="ca2" title="ca2" src="../static/1a393ac73dbb96f6fbd98b258e8a325a/a4de1/ca2.png" srcset="../static/1a393ac73dbb96f6fbd98b258e8a325a/e3b59/ca2.png 170w,../static/1a393ac73dbb96f6fbd98b258e8a325a/d6fe0/ca2.pngg 340w../static/1a393ac73dbb96f6fbd98b258e8a325a/a4de1/ca2.pngng 680../static/1a393ac73dbb96f6fbd98b258e8a325a/e9ece/ca2.pngpng 102../static/1a393ac73dbb96f6fbd98b258e8a325a/a78ad/ca2.png.png 1163w" sizes="(max-width: 680px) 100vw, 680px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; " > <a class="gatsby-resp-image-link" href="../static/cb323a2ec665d98f93f78e13d3972e0e/73116/ca3.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 70.58823529411764%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAABUElEQVQoz2WSWw7jIAxF2f86qwqF8nSwsSFlVDxFmc75ShAHX4wNM/fFGEM/ROS6rrl4v99zzt47EbUb+mvml9baWPTet7yPiDGmlM4vtVZE/MhjjNZarbWUMsb40eaczOy/5JzP89QCf+W6AID5LyqPMQBAo6pZa2Vms3My80/au1xKiTGWUo7jAIDXwqhwXZeeorv/P2KMISLaV2Ymot67AYBSCgB472OMzKyb7rI2hYhKKTlnRJSFQUQtrq3W3VvWILVWa+3r9ToWzjlrrXPuI2sDQgilFP5yl4kopYSIAICImoKIjPf+8Xg8n8/jOLz3WgER1VRZRHLORASL1ppe3miR3QNNLiL3O18LXb+3w5zniYhEhIgaWCf0p9sq11pzzvtFTQjBWhtj9N475zSe1r8/2x41RNzrn3cWEb1MCGHf9mdIRERHEABSSprlDzgWMR7/JT0DAAAAAElFTkSuQmCC'); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="ca3" title="ca3" src="../static/cb323a2ec665d98f93f78e13d3972e0e/a4de1/ca3.png" srcset="../static/cb323a2ec665d98f93f78e13d3972e0e/e3b59/ca3.png 170w,../static/cb323a2ec665d98f93f78e13d3972e0e/d6fe0/ca3.pngg 340w../static/cb323a2ec665d98f93f78e13d3972e0e/a4de1/ca3.pngng 680../static/cb323a2ec665d98f93f78e13d3972e0e/e9ece/ca3.pngpng 102../static/cb323a2ec665d98f93f78e13d3972e0e/73116/ca3.png.png 1155w" sizes="(max-width: 680px) 100vw, 680px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p><p>These lecture notes — including figures — are made while attending the lecture and have not been edited afterwards.To make note taking using LaTeX viable, I had four goals in mind:</p><ul><li>Writing text and mathematical formulas in LaTeX should be as fast as the lecturer writing on a blackboard: no delay is acceptable.</li><li>Drawing figures should be almost as fast as the lecturer.</li><li>Managing notes, i.e. adding a note, compiling all my notes, compiling the last two lectures, searching in notes, etc. should be easy and quick.</li><li>Annotating pdf documents using LaTeX should be possible for when I want to write notes alongside a pdf document.</li></ul><p>This blog post will focus on the first item: writing LaTeX.</p><div class="toc"><ul><li><a href="lecture-notes-1.html#vim-and-latex">Vim and LaTeX</a></li><li><p><a href="lecture-notes-1.html#snippets">Snippets</a></p><ul><li><a href="lecture-notes-1.html#whats-a-snippet">What’s a snippet?</a></li><li><a href="lecture-notes-1.html#using-ultisnips-to-create-snippets">Using UltiSnips to create snippets</a></li></ul></li><li><p><a href="lecture-notes-1.html#latex-snippets">LaTeX snippets</a></p><ul><li><a href="lecture-notes-1.html#environments">Environments</a></li><li><a href="lecture-notes-1.html#inline-and-display-math">Inline and display math</a></li><li><a href="lecture-notes-1.html#sub--and-superscripts">Sub- and superscripts</a></li><li><a href="lecture-notes-1.html#fractions">Fractions</a></li><li><a href="lecture-notes-1.html#sympy-and-mathematica">Sympy and Mathematica</a></li><li><a href="lecture-notes-1.html#postfix-snippets">Postfix snippets</a></li><li><a href="lecture-notes-1.html#other-snippets">Other snippets</a></li><li><a href="lecture-notes-1.html#course-specific-snippets">Course specific snippets</a></li><li><a href="lecture-notes-1.html#context">Context</a></li></ul></li><li><a href="lecture-notes-1.html#correcting-spelling-mistakes-on-the-fly">Correcting spelling mistakes on the fly</a></li><li><a href="lecture-notes-1.html#in-conclusion">In conclusion</a></li></ul></div><h2 id="vim-and-latex">Vim and LaTeX</h2><p>For writing text and mathematical formulas in LaTeX, I use Vim.Vim is a powerful general purpose text editor that’s very extensible.I use it for writing code, LaTeX, markdown, … basically everything that’s text-based.It has a fairly steep learning curve, but once you’ve got the basics down, it’s hard to get back to an editor without Vim keybindings.Here’s what my screen looks like when I’m editing LaTeX:</p><p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; " > <a class="gatsby-resp-image-link" href="../static/4282d15d03150c89182ab56634d2b4b0/d7e34/vimzathura.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 56.470588235294116%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABh0lEQVQoz0VS2W7DIBDkg+rY3MthjLlsJ6RJqyr//ymVoYc0Qvuws5oDhEVkKjKVsIyjCARSxyTCJALTxYY7uCu4o70nzHo3652bDRm7P58vG+9UZQJJ2F3Yvc9YRjkfc3y4+HDpCe7gZuNmoyozXZguSKhyqy8bqjCbmg/tKzfbG3EDXQa6jHwlEDHERsgD81gG3ERRldEoYkmPWl9iPprOTCBemP9D19+NXJgnkEbuuSkEEppkLPtHun4t5dOE9740tr3OHPk68hXL2LWc0fCfi4jI6MuniQ/tq8sf4Cs1Gz7PrwNd6E8Km5yP7vN0ISORiUBEE1+FLtTsBBK4KzNnYNpVLMJAF6YLzIdyV+2rtAfTuQvpQBiS8Tdud9oOy/nguox87bIHuvTwJhGwjFQlrku3cGEeYZm0r62eNDL/Rlzf7uRTYau9D6wxp99ETjLVBZabtDtrfZxNQur8v5yJysLurIkafotAkwh6rbDcMKRJ/v8wLM+cqUpU5V44VZmqjOV/kd/Mv5h5tO/4MAAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="Vim and Zathura" title="Vim and Zathura" src="../static/4282d15d03150c89182ab56634d2b4b0/a4de1/vimzathura.png" srcset="../static/4282d15d03150c89182ab56634d2b4b0/e3b59/vimzathura.png 170w,../static/4282d15d03150c89182ab56634d2b4b0/d6fe0/vimzathura.pngg 340w../static/4282d15d03150c89182ab56634d2b4b0/a4de1/vimzathura.pngng 680../static/4282d15d03150c89182ab56634d2b4b0/e9ece/vimzathura.pngpng 102../static/4282d15d03150c89182ab56634d2b4b0/e0c87/vimzathura.png.png 13../static/4282d15d03150c89182ab56634d2b4b0/d7e34/vimzathura.pnga.png 1919w" sizes="(max-width: 680px) 100vw, 680px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p><p>On the left you see Vim and on the right my pdf viewer, <a href="https://en.wikipedia.org/wiki/Zathura_(document_viewer)" target="_blank" rel="nofollow noopener noreferrer">Zathura</a>, which also has Vim-like keybindings.I’m using Ubuntu with <a href="https://github.com/baskerville/bspwm" target="_blank" rel="nofollow noopener noreferrer">bspwm</a> as my window manager.The LaTeX plugin I’m using in Vim is <a href="https://github.com/lervag/vimtex" target="_blank" rel="nofollow noopener noreferrer">vimtex</a>.It provides syntax highlighting, table of contents view, synctex, etc.Using <a href="https://github.com/junegunn/vim-plug" target="_blank" rel="nofollow noopener noreferrer">vim-plug</a>, I configured it as follows:</p><div class="gatsby-highlight" data-language="vim"><pre class="language-vim"><code class="language-vim">Plug <span class="token string">'lervag/vimtex'</span><span class="token keyword">let</span> g<span class="token punctuation">:</span>tex_flavor<span class="token operator">=</span><span class="token string">'latex'</span><span class="token keyword">let</span> g<span class="token punctuation">:</span>vimtex_view_method<span class="token operator">=</span><span class="token string">'zathura'</span><span class="token keyword">let</span> g<span class="token punctuation">:</span>vimtex_quickfix_mode<span class="token operator">=</span><span class="token number">0</span><span class="token keyword">set</span> conceallevel<span class="token operator">=</span><span class="token number">1</span><span class="token keyword">let</span> g<span class="token punctuation">:</span>tex_conceal<span class="token operator">=</span><span class="token string">'abdmg'</span></code></pre></div><p>The last two lines configure the concealment.This is a feature where LaTeX code is replaced or made invisible when your cursor is not on that line.By making <code class="language-text">\[</code>, <code class="language-text">\]</code>, <code class="language-text">$</code> invisible, they’re less obtrusive which gives you a better overview of the document. This feature also replaces <code class="language-text">\bigcap</code> by by <code class="language-text">∩</code>, <code class="language-text">\in</code> by <code class="language-text">∈</code> etc.The following animation should make that clear.</p><p><img src="../d362e0b837be308b0f8897482a331ec6/conceal.gif" alt="conceal"></p><p>With this set up, I come to the crux of this blog post: writing LaTeX as fast as the lecturer can write on the blackboard.This is where snippets come into play.</p><h2 id="snippets">Snippets</h2><h3 id="whats-a-snippet">What’s a snippet?</h3><p>A snippet is a short reusable piece of text that can be triggered by some other text.For example, when I type <code class="language-text">sign</code> and press <kbd>Tab</kbd>, the word <code class="language-text">sign</code> will be expanded to a signature:</p><p><img src="../5ab28b1ad6114b68f4ce459d4f89eeae/sign.gif" alt="sign"></p><p>Snippets can also be dynamic: when I type <code class="language-text">today</code> and press <kbd>Tab</kbd>, the word <code class="language-text">today</code> will be replaced by the current date, and <code class="language-text">box</code> <kbd>Tab</kbd> becomes a box that automatically grows in size.</p><p><img src="../1b6301a6561d104b4bc79654cb75470d/today.gif" alt="today"></p><p><img src="../8b7caefc472eae0941f41365d16e8d2d/box.gif" alt="box"></p><p>You can even use one snippet inside another:</p><p><img src="../cdd1fded48947d163c2e5e6b974cfec0/todaybox.gif" alt="todaybox"></p><h3 id="using-ultisnips-to-create-snippets">Using UltiSnips to create snippets</h3><p>I use the plugin <a href="https://github.com/SirVer/ultisnips" target="_blank" rel="nofollow noopener noreferrer">UltiSnips</a> to manage my snippets. My configuration is</p><div class="gatsby-highlight" data-language="vim"><pre class="language-vim"><code class="language-vim">Plug <span class="token string">'sirver/ultisnips'</span><span class="token keyword">let</span> g<span class="token punctuation">:</span>UltiSnipsExpandTrigger <span class="token operator">=</span> <span class="token string">'<tab>'</span><span class="token keyword">let</span> g<span class="token punctuation">:</span>UltiSnipsJumpForwardTrigger <span class="token operator">=</span> <span class="token string">'<tab>'</span><span class="token keyword">let</span> g<span class="token punctuation">:</span>UltiSnipsJumpBackwardTrigger <span class="token operator">=</span> <span class="token string">'<s-tab>'</span></code></pre></div><p>The code for the <code class="language-text">sign</code> snippet is the following:</p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">sign </span><span class="token name">"Signature"</span></span>Yours sincerely, Gilles Castel<span class="token keyword">endsnippet</span></code></pre></div><p>For dynamic snippets, you can put code between backticks <code class="language-text">``</code> which will be run when the snippet is expanded.Here, I’ve used bash to format the current date: <code class="language-text">date + %F</code>.</p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">today </span><span class="token name">"Date"</span></span>`date +%F`<span class="token keyword">endsnippet</span></code></pre></div><p>You can also use Python inside a <code class="language-text">`!p ... `</code> block.Have a look at the code for the <code class="language-text">box</code> snippet:</p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">box </span><span class="token name">"Box"</span></span>`<span class="token inline">!p</span><span class="token python"> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> <span class="token string">'┌'</span> <span class="token operator">+</span> <span class="token string">'─'</span> <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'┐'</span>`</span>│ <span class="token tabstop">$1</span> │`<span class="token inline">!p</span><span class="token python"> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> <span class="token string">'└'</span> <span class="token operator">+</span> <span class="token string">'─'</span> <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'┘'</span>`</span><span class="token tabstop">$0</span><span class="token keyword">endsnippet</span></code></pre></div><p>These Python code blocks will be replaced by the value of the variable <code class="language-text">snip.rv</code>.Inside these blocks, you have access to the current state of the snippet, e.g. <code class="language-text">t[1]</code> contains the first tab stop, <code class="language-text">fn</code> the current filename, …</p><h2 id="latex-snippets">LaTeX snippets</h2><p>Using snippets, writing LaTeX is a lot faster than writing it by hand.Especially some of the more complex snippets can save you a lot of time and frustration. Let’s begin with some simple snippets.</p><h3 id="environments">Environments</h3><p>To insert an environment, all I have to do is type <code class="language-text">beg</code> at the beginning of a line.Then I type the name of the environment, which is mirrored in the <code class="language-text">\end{}</code> command. Pressing <kbd>Tab</kbd> places the cursor inside the newly created environment.</p><p><img src="../d5ed641a9cb568d13dd56d98fec6376b/beginend.gif" alt="beginend"></p><p>The code for this snippet is the following.</p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">beg </span><span class="token name">"begin{} / end{}"</span> <span class="token flags">bA</span></span>\begin{<span class="token tabstop">$1</span>} <span class="token tabstop">$0</span>\end{<span class="token tabstop">$1</span>}<span class="token keyword">endsnippet</span></code></pre></div><p>The <code class="language-text">b</code> means that this snippet will only be expanded at the beginning of a line and <code class="language-text">A</code> stands for auto expand, which means I do not have to press <kbd>Tab</kbd> to expand the snippet. Tab stops — i.e. places you can jump to by pressing <kbd>Tab</kbd> and <kbd>Shift</kbd>+<kbd>Tab</kbd> — are represented by <code class="language-text">$1</code>, <code class="language-text">$2</code>, … and the last one with <code class="language-text">$0</code>.</p><h3 id="inline-and-display-math">Inline and display math</h3><p>Two of my most frequently used snippets are <code class="language-text">mk</code> and <code class="language-text">dm</code>.They’re the snippets responsible for starting math mode.The first one is a snippet for inline math, the second one for displayed math.</p><p><img src="../12a16b6a90c4d85a887c7cde0f18bb8c/mkdm.gif" alt="mkdm"></p><p>The snippet for inline math is ‘smart’: it knows when to insert a space after the dollar sign.When I start typing a word directly behind the closing <code class="language-text">$</code>, it adds a space.However, when I type a non-word character, it does not add a space, which would be preferred for example in the case of <code class="language-text">$p$-value</code>.</p><p><img src="../1172a1f556fd36b42f7c3642b3952e2c/mk_space.gif" alt="mk_space"></p><p>The code for this snippet is the following.</p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">mk </span><span class="token name">"Math"</span> <span class="token flags">wA</span></span>$<span class="token tabstop">${1}</span>$`<span class="token inline">!p</span><span class="token python"><span class="token keyword">if</span> t<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">and</span> t<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">not</span> <span class="token keyword">in</span> <span class="token punctuation">[</span><span class="token string">','</span><span class="token punctuation">,</span> <span class="token string">'.'</span><span class="token punctuation">,</span> <span class="token string">'?'</span><span class="token punctuation">,</span> <span class="token string">'-'</span><span class="token punctuation">,</span> <span class="token string">' '</span><span class="token punctuation">]</span><span class="token punctuation">:</span> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> <span class="token string">' '</span><span class="token keyword">else</span><span class="token punctuation">:</span> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> <span class="token string">''</span>`</span><span class="token tabstop">$2</span><span class="token keyword">endsnippet</span></code></pre></div><p>The <code class="language-text">w</code> at the end of the first line means that this snippet will expand at word boundaries, so e.g. <code class="language-text">hellomk</code> won’t expand, but <code class="language-text">hello mk</code> will.</p><p>The snippet for displayed math is more simple, but it also is quite handy; it makes me never forget ending equations with a period.</p><p><img src="../a682e97365ecfe19fe0c5bc08bacfec6/dm.gif" alt="dm"></p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">dm </span><span class="token name">"Math"</span> <span class="token flags">wA</span></span>\[<span class="token tabstop">$1</span>.\] <span class="token tabstop">$0</span><span class="token keyword">endsnippet</span></code></pre></div><h3 id="sub--and-superscripts">Sub- and superscripts</h3><p>Another useful snippet is one for subscripts.It changes changes <code class="language-text">a1</code> to <code class="language-text">a_1</code> and <code class="language-text">a_12</code> to <code class="language-text">a_{12}</code>.</p><p><img src="../f26633cb822c6b52d346dfbba6e1a1bd/subscripts.gif" alt="subscripts"></p><p>The code for this snippet uses a regular expression for its trigger.It expands the snippet when you type a character followed by a digit, which encoded by <code class="language-text">[A-Za-z]\d</code>, or a character followed by <code class="language-text">_</code> and two digits: <code class="language-text">[A-Za-z]_\d\d</code>.</p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">'([A-Za-z])(\d)' </span><span class="token name">"auto subscript"</span> <span class="token flags">wrA</span></span>`<span class="token inline">!p</span><span class="token python"> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>`_`!p snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span>`</span><span class="token keyword">endsnippet</span> <span class="token snippet">snippet <span class="token trigger">'([A-Za-z])_(\d\d)' </span><span class="token name">"auto subscript2"</span> <span class="token flags">wrA</span></span>`<span class="token inline">!p</span><span class="token python"> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>`_<span class="token punctuation">{</span>`!p snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span>`</span>}<span class="token keyword">endsnippet</span></code></pre></div><p>When you wrap parts of a regular expression in a group using parenthesis, e.g. <code class="language-text">(\d\d)</code>, you can use them in the expansion of the snippet via <code class="language-text">match.group(i)</code> in Python.</p><p>As for superscripts, I use <code class="language-text">td</code>, which becomes <code class="language-text">^{}</code>. However, for squared, cubed, complement and a handful of other common ones, I use dedicated snippets such as <code class="language-text">sr</code>, <code class="language-text">cb</code> and <code class="language-text">comp</code>.</p><p><img src="../da855cd9e67c48f508fab5ddc8c877fe/superscripts.gif" alt="superscripts"></p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">sr </span><span class="token name">"^2"</span> <span class="token flags">iA</span></span>^2<span class="token keyword">endsnippet</span> <span class="token snippet">snippet <span class="token trigger">cb </span><span class="token name">"^3"</span> <span class="token flags">iA</span></span>^3<span class="token keyword">endsnippet</span> <span class="token snippet">snippet <span class="token trigger">compl </span><span class="token name">"complement"</span> <span class="token flags">iA</span></span>^{c}<span class="token keyword">endsnippet</span> <span class="token snippet">snippet <span class="token trigger">td </span><span class="token name">"superscript"</span> <span class="token flags">iA</span></span>^{<span class="token tabstop">$1</span>}<span class="token tabstop">$0</span><span class="token keyword">endsnippet</span></code></pre></div><h3 id="fractions">Fractions</h3><p>One of my most convenient snippets is one for fractions. This makes the following expansions:</p><table><thead><tr><th align="right"></th><th></th><th align="left"></th></tr></thead><tbody><tr><td align="right"><code class="language-text">//</code></td><td>→</td><td align="left"><code class="language-text">\frac{}{}</code></td></tr><tr><td align="right"><code class="language-text">3/</code></td><td>→</td><td align="left"><code class="language-text">\frac{3}{}</code></td></tr><tr><td align="right"><code class="language-text">4\pi^2/</code></td><td>→</td><td align="left"><code class="language-text">\frac{4\pi^2}{}</code></td></tr><tr><td align="right"><code class="language-text">(1 + 2 + 3)/</code></td><td>→</td><td align="left"><code class="language-text">\frac{1 + 2 + 3}{}</code></td></tr><tr><td align="right"><code class="language-text">(1+(2+3)/)</code></td><td>→</td><td align="left"><code class="language-text">(1 + \frac{2+3}{})</code></td></tr><tr><td align="right"><code class="language-text">(1 + (2+3))/</code></td><td>→</td><td align="left"><code class="language-text">\frac{1 + (2+3)}{}</code></td></tr></tbody></table><p><img src="../3f83f1bdc3078aa16382e80a276f199f/frac.gif" alt="frac"></p><p>The code for the first one is easy:</p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">// </span><span class="token name">"Fraction"</span> <span class="token flags">iA</span></span>\\frac{<span class="token tabstop">$1</span>}{<span class="token tabstop">$2</span>}<span class="token tabstop">$0</span><span class="token keyword">endsnippet</span></code></pre></div><p>The second and third examples are made possible using regular expressions to match for expressions like <code class="language-text">3/</code>, <code class="language-text">4ac/</code>, <code class="language-text">6\pi^2/</code>, <code class="language-text">a_2/</code>, etc.</p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">'((\d+)|(\d*)(\\)?([A-Za-z]+)((\^|_)(\{\d+\}|\d))*)/' </span><span class="token name">"Fraction"</span> <span class="token flags">wrA</span></span>\\frac{`<span class="token inline">!p</span><span class="token python"> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>`</span>}{<span class="token tabstop">$1</span>}<span class="token tabstop">$0</span><span class="token keyword">endsnippet</span></code></pre></div><p>As you can see, regular expressions can become quite overwhelming, but here’s a diagram that should explain it:</p><p><img src="../908df5ec254f9cd5b08b99b8a54318d0/regex.svg" alt="Diagram of the regular expression"></p><p>In the fourth and fifth cases, it tries to find the matching parenthesis. As this isn’t possible using the regular expression engine of UltiSnips, I resorted to using Python:</p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token keyword">priority</span> 1000<span class="token snippet">snippet <span class="token trigger">'^.*\)/' </span><span class="token name">"() Fraction"</span> <span class="token flags">wrA</span></span>`<span class="token inline">!p</span><span class="token python">stripped <span class="token operator">=</span> match<span class="token punctuation">.</span>string<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span>depth <span class="token operator">=</span> <span class="token number">0</span>i <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>stripped<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span> <span class="token keyword">if</span> stripped<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">')'</span><span class="token punctuation">:</span> depth <span class="token operator">+=</span> <span class="token number">1</span> <span class="token keyword">if</span> stripped<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">'('</span><span class="token punctuation">:</span> depth <span class="token operator">-=</span> <span class="token number">1</span> <span class="token keyword">if</span> depth <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">:</span> <span class="token keyword">break</span><span class="token punctuation">;</span> i <span class="token operator">-=</span> <span class="token number">1</span>snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> stripped<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">:</span>i<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token string">"\\frac{"</span> <span class="token operator">+</span> stripped<span class="token punctuation">[</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">:</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token string">"}"</span>`</span>{<span class="token tabstop">$1</span>}<span class="token tabstop">$0</span><span class="token keyword">endsnippet</span></code></pre></div><p>The last snippet concerning fractions I’d like to share is one that uses your selection to make a fraction. You can use it by first selecting some text, then pressing <kbd>Tab</kbd>, typing <code class="language-text">/</code> and pressing <kbd>Tab</kbd> again.</p><p><img src="../0da01b9566dc437fabf0c563ed14941f/visualfrac.gif" alt="visualfrac"></p><p>The code makes use of the <code class="language-text">${VISUAL}</code> variable that represents your selection.</p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">/ </span><span class="token name">"Fraction"</span> <span class="token flags">iA</span></span>\\frac{<span class="token tabstop">${VISUAL}</span>}{<span class="token tabstop">$1</span>}<span class="token tabstop">$0</span><span class="token keyword">endsnippet</span></code></pre></div><h3 id="sympy-and-mathematica">Sympy and Mathematica</h3><p>Another cool — but less used — snippet is one that uses <a href="https://www.sympy.org/" target="_blank" rel="nofollow noopener noreferrer">sympy</a> to evaluate mathematical expressions. For example: <code class="language-text">sympy</code> <kbd>Tab</kbd> expands to <code class="language-text">sympy | sympy</code>, and <code class="language-text">sympy 1 + 1 sympy</code> <kbd>Tab</kbd> expands to <code class="language-text">2</code>.</p><p><img src="../8c8f143fdcdc2f3e6de9853cf7ea3def/sympy.gif" alt="sympy"></p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">sympy </span><span class="token name">"sympy block "</span> <span class="token flags">w</span></span>sympy <span class="token tabstop">$1</span> sympy<span class="token tabstop">$0</span><span class="token keyword">endsnippet</span> <span class="token keyword">priority</span> 10000<span class="token snippet">snippet <span class="token trigger">'sympy(.*)sympy' </span><span class="token name">"evaluate sympy"</span> <span class="token flags">wr</span></span>`<span class="token inline">!p</span><span class="token python"><span class="token keyword">from</span> sympy <span class="token keyword">import</span> <span class="token operator">*</span>x<span class="token punctuation">,</span> y<span class="token punctuation">,</span> z<span class="token punctuation">,</span> t <span class="token operator">=</span> symbols<span class="token punctuation">(</span><span class="token string">'x y z t'</span><span class="token punctuation">)</span>k<span class="token punctuation">,</span> m<span class="token punctuation">,</span> n <span class="token operator">=</span> symbols<span class="token punctuation">(</span><span class="token string">'k m n'</span><span class="token punctuation">,</span> integer<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span>f<span class="token punctuation">,</span> g<span class="token punctuation">,</span> h <span class="token operator">=</span> symbols<span class="token punctuation">(</span><span class="token string">'f g h'</span><span class="token punctuation">,</span> cls<span class="token operator">=</span>Function<span class="token punctuation">)</span>init_printing<span class="token punctuation">(</span><span class="token punctuation">)</span>snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> <span class="token builtin">eval</span><span class="token punctuation">(</span><span class="token string">'latex('</span> <span class="token operator">+</span> match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">'\\'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span> \ <span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">'^'</span><span class="token punctuation">,</span> <span class="token string">'**'</span><span class="token punctuation">)</span> \ <span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">'{'</span><span class="token punctuation">,</span> <span class="token string">'('</span><span class="token punctuation">)</span> \ <span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">'}'</span><span class="token punctuation">,</span> <span class="token string">')'</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">')'</span><span class="token punctuation">)</span>`</span><span class="token keyword">endsnippet</span></code></pre></div><p>For the Mathematica users out there, you can do something similar:</p><p><img src="../82f7f187a685a52ed7665fded563f936/mathematica.gif" alt="mathematica"></p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token keyword">priority</span> 1000<span class="token snippet">snippet <span class="token trigger">math </span><span class="token name">"mathematica block"</span> <span class="token flags">w</span></span>math <span class="token tabstop">$1</span> math<span class="token tabstop">$0</span><span class="token keyword">endsnippet</span> <span class="token keyword">priority</span> 10000<span class="token snippet">snippet <span class="token trigger">'math(.*)math' </span><span class="token name">"evaluate mathematica"</span> <span class="token flags">wr</span></span>`<span class="token inline">!p</span><span class="token python"><span class="token keyword">import</span> subprocesscode <span class="token operator">=</span> <span class="token string">'ToString['</span> <span class="token operator">+</span> match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">', TeXForm]'</span>snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> subprocess<span class="token punctuation">.</span>check_output<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'wolframscript'</span><span class="token punctuation">,</span> <span class="token string">'-code'</span><span class="token punctuation">,</span> code<span class="token punctuation">]</span><span class="token punctuation">)</span>`</span><span class="token keyword">endsnippet</span></code></pre></div><h3 id="postfix-snippets">Postfix snippets</h3><p>Some other snippets I find worth sharing are postfix snippets.Examples of such snippets are <code class="language-text">phat</code> → <code class="language-text">\hat{p}</code> and <code class="language-text">zbar</code> → <code class="language-text">\overline{z}</code>.A similar snippet is a postfix vector, for example <code class="language-text">v,.</code> → <code class="language-text">\vec{v}</code> and <code class="language-text">v.,</code> → <code class="language-text">\vec{v}</code>.The order of <code class="language-text">,</code> and <code class="language-text">.</code> doesn’t matter, so I can press them both at the same time.These snippets are a real time-saver, because you can type in the same order the lecturer writes on the blackboard.</p><p><img src="../7c2e62aae292bc4d65eae363c816e206/barhatvec.gif" alt="barhatvec"></p><p>Note that I can still use <code class="language-text">bar</code> and <code class="language-text">hat</code> prefix too, as I’ve added them with a lower priority.The code for those snippets is:</p><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token keyword">priority</span> 10<span class="token snippet">snippet <span class="token trigger">"bar" </span><span class="token name">"bar"</span> <span class="token flags">riA</span></span>\overline{<span class="token tabstop">$1</span>}<span class="token tabstop">$0</span><span class="token keyword">endsnippet</span> <span class="token keyword">priority</span> 100<span class="token snippet">snippet <span class="token trigger">"([a-zA-Z])bar" </span><span class="token name">"bar"</span> <span class="token flags">riA</span></span>\overline{`<span class="token inline">!p</span><span class="token python"> snip<span class="token punctuation">.</span>rv<span class="token operator">=</span>match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>`</span>}<span class="token keyword">endsnippet</span></code></pre></div><div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token keyword">priority</span> 10<span class="token snippet">snippet <span class="token trigger">"hat" </span><span class="token name">"hat"</span> <span class="token flags">riA</span></span>\hat{<span class="token tabstop">$1</span>}<span class="token tabstop">$0</span><span class="token keyword">endsnippet</span> <span class="token keyword">priority</span> 100<span class="token snippet">snippet <span class="token trigger">"([a-zA-Z])hat" </span><span class="token name">"hat"</span> <span class="token flags">riA</span></span>\hat{`<span class="token inline">!p</span><span class="token python"> snip<span class="token punctuation">.</span>rv<span class="token operator">=</span>match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>`</span>}Lines 1–500 of 660. Load more
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><link rel="alternate" type="application/rss+xml" href="../rss.xml"/><style data-href="/styles.5590a669c9dba5321619.css" data-identity="gatsby-global-css">@font-face{font-display:fallback;font-family:Inter;font-style:normal;font-weight:400;src:url(https://rsms.me/inter/font-files/Inter-Regular.woff2?v=3.3) format("woff2"),url(https://rsms.me/inter/font-files/Inter-Regular.woff?v=3.3) format("woff")}@font-face{font-display:fallback;font-family:Inter;font-style:italic;font-weight:400;src:url(https://rsms.me/inter/font-files/Inter-Italic.woff2?v=3.3) format("woff2"),url(https://rsms.me/inter/font-files/Inter-Italic.woff?v=3.3) format("woff")}@font-face{font-display:fallback;font-family:Inter;font-style:normal;font-weight:600;src:url(https://rsms.me/inter/font-files/Inter-SemiBold.woff2?v=3.3) format("woff2"),url(https://rsms.me/inter/font-files/Inter-SemiBold.woff?v=3.3) format("woff")}@font-face{font-display:fallback;font-family:Inter;font-style:italic;font-weight:600;src:url(https://rsms.me/inter/font-files/Inter-SemiBoldItalic.woff2?v=3.3) format("woff2"),url(https://rsms.me/inter/font-files/Inter-SemiBoldItalic.woff?v=3.3) format("woff")}@font-face{font-display:fallback;font-family:Inter;font-style:normal;font-weight:700;src:url(https://rsms.me/inter/font-files/Inter-Bold.woff2?v=3.3) format("woff2"),url(https://rsms.me/inter/font-files/Inter-Bold.woff?v=3.3) format("woff")}@font-face{font-display:fallback;font-family:Inter;font-style:italic;font-weight:700;src:url(https://rsms.me/inter/font-files/Inter-BoldItalic.woff2?v=3.3) format("woff2"),url(https://rsms.me/inter/font-files/Inter-BoldItalic.woff?v=3.3) format("woff")}@font-face{font-display:fallback;font-family:Iosevka Web;font-style:normal;font-weight:400;src:url(../static/iosevka-regular-16dbe5061e131124a488bc943cab77d9.woff2) format("woff2"),url(../static/iosevka-regular-0a866faad05f5adaf3da07d0c4301ece.woff) format("woff"),url(../static/iosevka-regular-86e16893ae35205fb9cbd194d032d18d.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Iosevka Web;font-style:italic;font-weight:400;src:url(../static/iosevka-italic-18bb4838493100eaf489d79269d4a8d0.woff2) format("woff2"),url(../static/iosevka-italic-9216409a4bb6480fc8d83a7185265740.woff) format("woff"),url(../static/iosevka-italic-df5bdd869170b93557f517b1d5072089.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Iosevka Web;font-style:oblique;font-weight:400;src:url(../static/iosevka-oblique-bdc0b8c75ed6d4d80a8473e1b59d3835.woff2) format("woff2"),url(../static/iosevka-oblique-1b4ad417385daab8b6624bd0ee8a5bf8.woff) format("woff"),url(../static/iosevka-oblique-3c4a95b05396b67b453c938e876db665.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Iosevka Web;font-style:normal;font-weight:700;src:url(../static/iosevka-bold-4bff02e3a4a1c702d93452ecd6c1a13f.woff2) format("woff2"),url(../static/iosevka-bold-043d268c51a9f3dfd2e57ea203fa42b0.woff) format("woff"),url(../static/iosevka-bold-dd88607d7c53d2001828e613350b6a72.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Iosevka Web;font-style:italic;font-weight:700;src:url(../static/iosevka-bolditalic-1023faa6207623c2ed7294375abbca63.woff2) format("woff2"),url(../static/iosevka-bolditalic-100aa5a08bdea7237e4c0818a41b4c59.woff) format("woff"),url(../static/iosevka-bolditalic-8fce36ec3f40f04e4ddea632ab0f1d87.ttf) format("truetype")}@font-face{font-display:fallback;font-family:Iosevka Web;font-style:oblique;font-weight:700;src:url(../static/iosevka-boldoblique-ed02bd67300f828e3f1eb9c4e6a611d2.woff2) format("woff2"),url(../static/iosevka-boldoblique-ab212402dc8ff6ba80583ea996578a42.woff) format("woff"),url(../static/iosevka-boldoblique-ef2cf1a2430a178eeb3410e89d657175.ttf) format("truetype")}code[class*=language-],pre[class*=language-]{word-wrap:normal;color:#eceff4;font-family:Iosevka Web,"monospace";-webkit-hyphens:none;-ms-hyphens:none;hyphens:none;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;text-align:left;white-space:pre;word-break:normal;word-spacing:normal}code[class*=language-]::selection,code[class*=language-] ::selection,pre[class*=language-]::selection,pre[class*=language-] ::selection{background:#3b4252}pre[class*=language-]{border-radius:.3em;margin:.5em 0;overflow:auto;padding:1em}:not(pre)>code[class*=language-]{background:#eceff4;border-radius:3px;color:#2e3440;font-family:Iosevka Web,"monospace";font-size:90%;-webkit-font-variant-ligatures:none;font-variant-ligatures:none;padding:.05em .4em}:not(pre)>code[class*=language-]::selection{background:#c9ecff!important}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#4c566a}.token.punctuation{color:#e5e9f0}.namespace{opacity:.7}.token.boolean{color:#81a1c1}.token.number{color:#b48ead}.token.tag{color:#d8dee9}.token.constant,.token.deleted,.token.property,.token.symbol{color:#88c0d0}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string,.token.url{color:#eceff4}.token.entity{background:#eee8d5;color:#657b83}.token.attr-value,.token.keyword{color:#81a1c1}.token.atrule,.token.class-name,.token.function{color:#8fbcbb}.token.important,.token.regex,.token.variable{color:#81a1c1}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.name{color:#a3be8c}.token.trigger{color:#88c0d0}.token.snippet{color:#81a1c1}.token.tabstop{color:#ebcb8b}.token.flags,.token.inline{color:#b48ead}.gatsby-highlight-code-line{background-color:#13151b;border-left:.25em solid #88c0d0;display:block;margin-left:-1em;margin-right:-1em;padding:.1em 1em .1em .75em}</style><meta name="generator" content="Gatsby 4.4.0"/><link rel="preconnect" href="https://www.google-analytics.com"/><link rel="dns-prefetch" href="https://www.google-analytics.com"/><link rel="alternate" type="application/rss+xml" title="Gilles Castel's blog RSS Feed" href="../rss.xml"/><link rel="icon" href="../favicon-32x32.png%3Fv=c9dde36f72d3007a082734fe5feea5e4" type="image/png"/><link rel="manifest" href="../manifest.webmanifest" crossorigin="anonymous"/><meta name="theme-color" content="#2E3440"/><link rel="apple-touch-icon" sizes="48x48" href="../icons/icon-48x48.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><link rel="apple-touch-icon" sizes="72x72" href="../icons/icon-72x72.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><link rel="apple-touch-icon" sizes="96x96" href="../icons/icon-96x96.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><link rel="apple-touch-icon" sizes="144x144" href="../icons/icon-144x144.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><link rel="apple-touch-icon" sizes="192x192" href="../icons/icon-192x192.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><link rel="apple-touch-icon" sizes="256x256" href="../icons/icon-256x256.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><link rel="apple-touch-icon" sizes="384x384" href="../icons/icon-384x384.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><link rel="apple-touch-icon" sizes="512x512" href="../icons/icon-512x512.png%3Fv=c9dde36f72d3007a082734fe5feea5e4"/><title data-react-helmet="true">How I'm able to take notes in mathematics lectures using LaTeX and Vim | Gilles Castel</title><meta data-react-helmet="true" name="description" content="A while back I answered a question on Quora: Can people actually keep up with note-taking in Mathematics lectures with LaTeX. There, I explained my workflow of taking lecture notes in LaTeX using Vim and how I draw figures in Inkscape. However, a lot has…"/><meta data-react-helmet="true" property="og:title" content="How I'm able to take notes in mathematics lectures using LaTeX and Vim"/><meta data-react-helmet="true" property="og:description" content="A while back I answered a question on Quora: Can people actually keep up with note-taking in Mathematics lectures with LaTeX. There, I explained my workflow of taking lecture notes in LaTeX using Vim and how I draw figures in Inkscape. However, a lot has…"/><meta data-react-helmet="true" property="og:type" content="website"/><meta data-react-helmet="true" name="twitter:card" content="summary"/><meta data-react-helmet="true" name="twitter:creator" content="Gilles Castel"/><meta data-react-helmet="true" name="twitter:title" content="How I'm able to take notes in mathematics lectures using LaTeX and Vim"/><meta data-react-helmet="true" name="twitter:description" content="A while back I answered a question on Quora: Can people actually keep up with note-taking in Mathematics lectures with LaTeX. There, I explained my workflow of taking lecture notes in LaTeX using Vim and how I draw figures in Inkscape. However, a lot has…"/><style data-styled="" data-styled-version="5.3.3">.NEJsy{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #4C566A;border-top:1px solid #4C566A;padding:1em;font-size:80%;}/*!sc*/ data-styled.g1[id="Bio__BioDiv-sc-1xze3le-0"]{content:"NEJsy,"}/*!sc*/ .gzyKGq{padding-left:1em;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;}/*!sc*/ data-styled.g2[id="Bio__Text-sc-1xze3le-1"]{content:"gzyKGq,"}/*!sc*/ .iQePnH{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;border-radius:50%;}/*!sc*/ data-styled.g3[id="Bio___StyledImg-sc-1xze3le-2"]{content:"iQePnH,"}/*!sc*/ ::selection{background:#c9ecff;}/*!sc*/ ::-moz-selection{background:#c9ecff;}/*!sc*/ *{margin:0;padding:0;box-sizing:border-box;}/*!sc*/ html,body{font-family:'Inter',sans-serif;text-rendering:optimizeLegibility;line-height:1.4;}/*!sc*/ body{background:#ffffff;color:#3a343a;font-size:18px;text-rendering:optimizeLegibility;}/*!sc*/ a{outline:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;}/*!sc*/ p a,figcaption a{border-bottom:1px solid #4C566A;}/*!sc*/ table{margin:0 auto;}/*!sc*/ .gatsby-resp-image-link{border-bottom:none;}/*!sc*/ h1{font-size:230%;line-height:1.2;margin-bottom:0.2em;}/*!sc*/ p{margin-top:1.4rem;margin-bottom:1.4rem;}/*!sc*/ blockquote{font-style:italic;border-left:2px solid #2E3440;padding-left:1.4rem;margin-left:-1.4rem;}/*!sc*/ li{margin-bottom:0.7rem;padding-left:1.4rem;}/*!sc*/ ul,ol{padding-left:1.4rem;}/*!sc*/ hr{border-top:none;border-bottom:1px solid black;}/*!sc*/ .gatsby-highlight{box-shadow:0px 0px 10px rgba(0,0,0,0.2);font-family:'Iosevka Web','monospace';font-size:90%;background-color:#2e3440;margin:1em 0;padding:1em;overflow:auto;}/*!sc*/ .gatsby pre,.gatsby pre code{font-family:'Iosevka Web','monospace';}/*!sc*/ .gatsby-highlight pre[class*="language-"]{background-color:transparent;margin:0;padding:0;overflow:initial;float:left;min-width:100%;}/*!sc*/ .gatsby-video-aspect-ratio{box-shadow:0px 0px 10px rgba(0,0,0,0.2);margin:1em 0;}/*!sc*/ .gatsby-resp-image-wrapper{max-width:none !important;}/*!sc*/ img[src$=gif]{background-color:#2E333F;box-shadow:0px 0px 10px rgba(0,0,0,0.2);width:100%;}/*!sc*/ img[src$="svg"]{width:100%;}/*!sc*/ #disqus_thread{position:relative;}/*!sc*/ #disqus_thread::after{content:'';position:absolute;left:0;right:0;bottom:0;height:55px;background:#ffffff;}/*!sc*/ kbd{font-size:90%;font-family:'Iosevka Web','monospace';padding:.05em .4em;border-radius:3px;border:1px solid gray;background:#ECEFF4;}/*!sc*/ figure figcaption{padding:0.7em 1.4em;font-size:80%;background:#ECEFF4;}/*!sc*/ data-styled.g4[id="sc-global-cLNjzj1"]{content:"sc-global-cLNjzj1,"}/*!sc*/ .cxeJTm{padding:1em;color:#d8dee9;text-align:center;max-width:648px;margin:0 auto;font-size:80%;}/*!sc*/ data-styled.g5[id="Layout__Footer-sc-g3mgjj-0"]{content:"cxeJTm,"}/*!sc*/ .fwYusv{min-height:100vh;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}/*!sc*/ data-styled.g6[id="Layout___StyledDiv-sc-g3mgjj-1"]{content:"fwYusv,"}/*!sc*/ .chpAuY{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}/*!sc*/ data-styled.g7[id="Layout___StyledDiv2-sc-g3mgjj-2"]{content:"chpAuY,"}/*!sc*/ .kbKLKY{font-size:80%;text-transform:lowercase;font-weight:700;font-variant:small-caps;}/*!sc*/ data-styled.g8[id="smallcaps__SmallCaps-sc-17d6b14-0"]{content:"kbKLKY,"}/*!sc*/ .hyHJPv{font-size:80%;font-weight:700;}/*!sc*/ data-styled.g9[id="smallcaps__FakeSmallCaps-sc-17d6b14-1"]{content:"hyHJPv,"}/*!sc*/ .iDNUhN{border-bottom:1px solid #4C566A;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/ .iDNUhN > span,.iDNUhN a{padding:0.5em 0;}/*!sc*/ data-styled.g10[id="blog-post__SupTitle-sc-1993m0e-0"]{content:"iDNUhN,"}/*!sc*/ .ijGSzm{width:100%;text-align:center;margin:2.8rem 0;}/*!sc*/ data-styled.g11[id="blog-post__Title-sc-1993m0e-1"]{content:"ijGSzm,"}/*!sc*/ .cFnHMB{max-width:680px;margin:0 auto;padding:1em;}/*!sc*/ .cFnHMB .custom-block.snippet .custom-block-body{font-style:italic;}/*!sc*/ .cFnHMB h2,.cFnHMB h3,.cFnHMB h4,.cFnHMB h5,.cFnHMB h6{line-height:1.2;margin-bottom:-1rem;}/*!sc*/ .cFnHMB h2{margin-top:2em;font-size:1.4rem;}/*!sc*/ .cFnHMB h3{margin-top:2rem;font-size:1.2rem;}/*!sc*/ .cFnHMB .toc{z-index:10;position:-webkit-sticky;position:sticky;top:2em;font-size:70%;height:0px;}/*!sc*/ @media (max-width:1080px){.cFnHMB .toc{display:none;}}/*!sc*/ .cFnHMB .toc ul{list-style:none;display:inline-block;width:calc((100vw - 680px) / 2 - 4em);}/*!sc*/ .cFnHMB .toc li{padding-left:0;margin-bottom:0.3em;}/*!sc*/ .cFnHMB .toc li p{margin:0;margin-bottom:0.5em;}/*!sc*/ .cFnHMB .toc a{border-bottom:none;}/*!sc*/ .cFnHMB .toc a.is-active{font-weight:bold;}/*!sc*/ .cFnHMB .toc > ul{padding-left:0;-webkit-transform:translateX(calc(-100% - 2em)) translateY(4em);-ms-transform:translateX(calc(-100% - 2em)) translateY(4em);transform:translateX(calc(-100% - 2em)) translateY(4em);}/*!sc*/ .cFnHMB .toc > ul::before{content:"Table of contents";font-weight:bold;padding-bottom:0.5em;display:inline-block;}/*!sc*/ data-styled.g12[id="blog-post__Main-sc-1993m0e-2"]{content:"cFnHMB,"}/*!sc*/ .ePTuVc{margin-bottom:2em;}/*!sc*/ .ePTuVc ul{margin:0;padding:0;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/ .ePTuVc ul li{margin:0;padding:0;list-style-type:none;}/*!sc*/ .ePTuVc ul li a{display:inline-block;padding:0.5em 0;}/*!sc*/ .ePTuVc ul li.prev{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}/*!sc*/ .ePTuVc ul li.next{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:right;padding-left:1em;}/*!sc*/ data-styled.g13[id="blog-post__Nav-sc-1993m0e-3"]{content:"ePTuVc,"}/*!sc*/ </style><link as="script" rel="preload" href="../webpack-runtime-f28b399e0936aecf66ac.js"/><link as="script" rel="preload" href="../framework-ea68fce3d30d105ba963.js"/><link as="script" rel="preload" href="../app-9c07f8581d6a14d0067d.js"/><link as="script" rel="preload" href="../04f12b145687b6350b874aa568443d7ed4a3c726-be6a39a4ebd1487fb52e.js"/><link as="script" rel="preload" href="../component---src-templates-blog-post-js-8cf4b165ff72f56ebc7c.js"/><link as="fetch" rel="preload" href="../page-data/post/lecture-notes-1/page-data.json" crossorigin="anonymous"/><link as="fetch" rel="preload" href="../page-data/sq/d/3128451518.json" crossorigin="anonymous"/><link as="fetch" rel="preload" href="../page-data/app-data.json" crossorigin="anonymous"/></head><body><div id="___gatsby"><div style="outline:none" tabindex="-1" id="gatsby-focus-wrapper"><div class="Layout___StyledDiv-sc-g3mgjj-1 fwYusv"><div class="Layout___StyledDiv2-sc-g3mgjj-2 chpAuY"><div class="blog-post__Main-sc-1993m0e-2 cFnHMB"><div class="smallcaps__SmallCaps-sc-17d6b14-0 blog-post__SupTitle-sc-1993m0e-0 kbKLKY iDNUhN"><a href="../index.html">← All articles</a><span>Mar<!-- --> <span class="smallcaps__FakeSmallCaps-sc-17d6b14-1 hyHJPv">16</span>,<!-- --> <span class="smallcaps__FakeSmallCaps-sc-17d6b14-1 hyHJPv">2019</span> •<!-- --> <span class="smallcaps__FakeSmallCaps-sc-17d6b14-1 hyHJPv">15</span> Min Read</span></div><h1 class="blog-post__Title-sc-1993m0e-1 ijGSzm">How I'm able to take notes in mathematics lectures using LaTeX and Vim</h1><div><div class="custom-block snippet"><div class="custom-block-body"><p>A while back I answered a question on Quora: <a href="https://www.quora.com/Can-people-actually-keep-up-with-note-taking-in-Mathematics-lectures-with-LaTeX/answer/Gilles-Castel-1" target="_blank" rel="nofollow noopener noreferrer">Can people actually keep up with note-taking in Mathematics lectures with LaTeX</a>. There, I explained my workflow of taking lecture notes in LaTeX using Vim and how I draw figures in Inkscape. However, a lot has changed since then and I’d like to write a few blog posts explaining my workflow.</p></div></div> <p>I started using LaTeX to write lecture notes in the second semester of my bachelor in mathematics, and I’ve been using it ever since, which makes for a total of more than 1700 pages of notes. To give you an idea of what those notes look like, here are some examples:</p> <p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; " > <a class="gatsby-resp-image-link" href="../static/ba66c52b01c8fe6b31c97af52b5eb7f7/c2c88/ca1.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 70.58823529411764%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAABR0lEQVQoz21T7Y4DIQj0/d+0qauCIIIfvbTkNnvbm1+aMDLMYFDV1lr/wMzGGGa21np9sPd+vV6qWmttF4iIqoa1lpmJSIyRmb36hF/HGMwsIsyMiACgqnPOcBblnFNKqvpNvl5VlZlVdYzx7jznNDMAyDkz85zzJvuEmdVanbzWCj6ziNRae+/jgxt57z3nFBFEbK2pqvsSRAQAfJ7e+1rLX70Z5g611q5CgleICBG11k7aleyj+RNe9odcSkFEIuq9X+f0c+89xlhKcc8913dULqaUcibpMdzIpRQiqrV6GwBg5kBEx3F4Wx/Mt+VmWPogxoiIIuIeB2bOOQPA+oUndyWLyHEcKaXn8wkAiOiBBURMKblsZvZVvblNRI/Hw9We7rzJZ84AQERzzu+cVRUA2hfCuTqtNWZ2wf9umP8ZM/MV3nv/AAABMXW1rDYkAAAAAElFTkSuQmCC'); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="ca1" title="ca1" src="../static/ba66c52b01c8fe6b31c97af52b5eb7f7/a4de1/ca1.png" srcset="../static/ba66c52b01c8fe6b31c97af52b5eb7f7/e3b59/ca1.png 170w,../static/ba66c52b01c8fe6b31c97af52b5eb7f7/d6fe0/ca1.pngg 340w../static/ba66c52b01c8fe6b31c97af52b5eb7f7/a4de1/ca1.pngng 680../static/ba66c52b01c8fe6b31c97af52b5eb7f7/e9ece/ca1.pngpng 102../static/ba66c52b01c8fe6b31c97af52b5eb7f7/c2c88/ca1.png.png 1173w" sizes="(max-width: 680px) 100vw, 680px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span> <span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; " > <a class="gatsby-resp-image-link" href="../static/1a393ac73dbb96f6fbd98b258e8a325a/a78ad/ca2.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 69.41176470588235%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAABYElEQVQoz12Sa9OrIAyE/f9/s9ZRkEvDNaTombJvPR2fD4wDLtksmUop9UsphZlzzr338zyP4zgHOeeUUhnUWlNKMUYRmay1WmvvPRF572OM1trWGsTQE5HWehtYa51zr9eLmadlWdZ13bZtWZZt25RSxhgR+a0sIjyAQRHpg8l7/2s75ywi78Glt9bO87wPtNZYU0oT/OBAKbXvu3OulNJ7h/I4jpxzCMEYo5TSgz/bSil4XtfVGOOcs9ZeZaGHMn5BYB+x9z6EkHOOMSLPGOOv5/M80YWIIHN8f3rGT601ZkbIF5e4lILMULa19l+Mi1trtVa88E2MbNuXa3/CWWsN63VwEzNzKYWIQggw/1cZx+/3+1d5mzAiYmYigjuUmcLAWrvvuzEGF98CQ0e1VkwB9j+V53l+PB7z4Pl8KqWcc7fxTClhKvEiV3cTokKMRATz13hc/nvveZBSYmZU/gcYMywFaTlE2gAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="ca2" title="ca2" src="../static/1a393ac73dbb96f6fbd98b258e8a325a/a4de1/ca2.png" srcset="../static/1a393ac73dbb96f6fbd98b258e8a325a/e3b59/ca2.png 170w,../static/1a393ac73dbb96f6fbd98b258e8a325a/d6fe0/ca2.pngg 340w../static/1a393ac73dbb96f6fbd98b258e8a325a/a4de1/ca2.pngng 680../static/1a393ac73dbb96f6fbd98b258e8a325a/e9ece/ca2.pngpng 102../static/1a393ac73dbb96f6fbd98b258e8a325a/a78ad/ca2.png.png 1163w" sizes="(max-width: 680px) 100vw, 680px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span> <span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; " > <a class="gatsby-resp-image-link" href="../static/cb323a2ec665d98f93f78e13d3972e0e/73116/ca3.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 70.58823529411764%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAABUElEQVQoz2WSWw7jIAxF2f86qwqF8nSwsSFlVDxFmc75ShAHX4wNM/fFGEM/ROS6rrl4v99zzt47EbUb+mvml9baWPTet7yPiDGmlM4vtVZE/MhjjNZarbWUMsb40eaczOy/5JzP89QCf+W6AID5LyqPMQBAo6pZa2Vms3My80/au1xKiTGWUo7jAIDXwqhwXZeeorv/P2KMISLaV2Ymot67AYBSCgB472OMzKyb7rI2hYhKKTlnRJSFQUQtrq3W3VvWILVWa+3r9ToWzjlrrXPuI2sDQgilFP5yl4kopYSIAICImoKIjPf+8Xg8n8/jOLz3WgER1VRZRHLORASL1ppe3miR3QNNLiL3O18LXb+3w5zniYhEhIgaWCf0p9sq11pzzvtFTQjBWhtj9N475zSe1r8/2x41RNzrn3cWEb1MCGHf9mdIRERHEABSSprlDzgWMR7/JT0DAAAAAElFTkSuQmCC'); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="ca3" title="ca3" src="../static/cb323a2ec665d98f93f78e13d3972e0e/a4de1/ca3.png" srcset="../static/cb323a2ec665d98f93f78e13d3972e0e/e3b59/ca3.png 170w,../static/cb323a2ec665d98f93f78e13d3972e0e/d6fe0/ca3.pngg 340w../static/cb323a2ec665d98f93f78e13d3972e0e/a4de1/ca3.pngng 680../static/cb323a2ec665d98f93f78e13d3972e0e/e9ece/ca3.pngpng 102../static/cb323a2ec665d98f93f78e13d3972e0e/73116/ca3.png.png 1155w" sizes="(max-width: 680px) 100vw, 680px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p> <p>These lecture notes — including figures — are made while attending the lecture and have not been edited afterwards. To make note taking using LaTeX viable, I had four goals in mind:</p> <ul> <li>Writing text and mathematical formulas in LaTeX should be as fast as the lecturer writing on a blackboard: no delay is acceptable.</li> <li>Drawing figures should be almost as fast as the lecturer.</li> <li>Managing notes, i.e. adding a note, compiling all my notes, compiling the last two lectures, searching in notes, etc. should be easy and quick.</li> <li>Annotating pdf documents using LaTeX should be possible for when I want to write notes alongside a pdf document.</li> </ul> <p>This blog post will focus on the first item: writing LaTeX.</p> <div class="toc"> <ul> <li><a href="lecture-notes-1.html#vim-and-latex">Vim and LaTeX</a></li> <li> <p><a href="lecture-notes-1.html#snippets">Snippets</a></p> <ul> <li><a href="lecture-notes-1.html#whats-a-snippet">What’s a snippet?</a></li> <li><a href="lecture-notes-1.html#using-ultisnips-to-create-snippets">Using UltiSnips to create snippets</a></li> </ul> </li> <li> <p><a href="lecture-notes-1.html#latex-snippets">LaTeX snippets</a></p> <ul> <li><a href="lecture-notes-1.html#environments">Environments</a></li> <li><a href="lecture-notes-1.html#inline-and-display-math">Inline and display math</a></li> <li><a href="lecture-notes-1.html#sub--and-superscripts">Sub- and superscripts</a></li> <li><a href="lecture-notes-1.html#fractions">Fractions</a></li> <li><a href="lecture-notes-1.html#sympy-and-mathematica">Sympy and Mathematica</a></li> <li><a href="lecture-notes-1.html#postfix-snippets">Postfix snippets</a></li> <li><a href="lecture-notes-1.html#other-snippets">Other snippets</a></li> <li><a href="lecture-notes-1.html#course-specific-snippets">Course specific snippets</a></li> <li><a href="lecture-notes-1.html#context">Context</a></li> </ul> </li> <li><a href="lecture-notes-1.html#correcting-spelling-mistakes-on-the-fly">Correcting spelling mistakes on the fly</a></li> <li><a href="lecture-notes-1.html#in-conclusion">In conclusion</a></li> </ul> </div> <h2 id="vim-and-latex">Vim and LaTeX</h2> <p>For writing text and mathematical formulas in LaTeX, I use Vim. Vim is a powerful general purpose text editor that’s very extensible. I use it for writing code, LaTeX, markdown, … basically everything that’s text-based. It has a fairly steep learning curve, but once you’ve got the basics down, it’s hard to get back to an editor without Vim keybindings. Here’s what my screen looks like when I’m editing LaTeX:</p> <p><span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; " > <a class="gatsby-resp-image-link" href="../static/4282d15d03150c89182ab56634d2b4b0/d7e34/vimzathura.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" style="padding-bottom: 56.470588235294116%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABh0lEQVQoz0VS2W7DIBDkg+rY3MthjLlsJ6RJqyr//ymVoYc0Qvuws5oDhEVkKjKVsIyjCARSxyTCJALTxYY7uCu4o70nzHo3652bDRm7P58vG+9UZQJJ2F3Yvc9YRjkfc3y4+HDpCe7gZuNmoyozXZguSKhyqy8bqjCbmg/tKzfbG3EDXQa6jHwlEDHERsgD81gG3ERRldEoYkmPWl9iPprOTCBemP9D19+NXJgnkEbuuSkEEppkLPtHun4t5dOE9740tr3OHPk68hXL2LWc0fCfi4jI6MuniQ/tq8sf4Cs1Gz7PrwNd6E8Km5yP7vN0ISORiUBEE1+FLtTsBBK4KzNnYNpVLMJAF6YLzIdyV+2rtAfTuQvpQBiS8Tdud9oOy/nguox87bIHuvTwJhGwjFQlrku3cGEeYZm0r62eNDL/Rlzf7uRTYau9D6wxp99ETjLVBZabtDtrfZxNQur8v5yJysLurIkafotAkwh6rbDcMKRJ/v8wLM+cqUpU5V44VZmqjOV/kd/Mv5h5tO/4MAAAAABJRU5ErkJggg=='); background-size: cover; display: block;" ></span> <img class="gatsby-resp-image-image" alt="Vim and Zathura" title="Vim and Zathura" src="../static/4282d15d03150c89182ab56634d2b4b0/a4de1/vimzathura.png" srcset="../static/4282d15d03150c89182ab56634d2b4b0/e3b59/vimzathura.png 170w,../static/4282d15d03150c89182ab56634d2b4b0/d6fe0/vimzathura.pngg 340w../static/4282d15d03150c89182ab56634d2b4b0/a4de1/vimzathura.pngng 680../static/4282d15d03150c89182ab56634d2b4b0/e9ece/vimzathura.pngpng 102../static/4282d15d03150c89182ab56634d2b4b0/e0c87/vimzathura.png.png 13../static/4282d15d03150c89182ab56634d2b4b0/d7e34/vimzathura.pnga.png 1919w" sizes="(max-width: 680px) 100vw, 680px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async" /> </a> </span></p> <p>On the left you see Vim and on the right my pdf viewer, <a href="https://en.wikipedia.org/wiki/Zathura_(document_viewer)" target="_blank" rel="nofollow noopener noreferrer">Zathura</a>, which also has Vim-like keybindings. I’m using Ubuntu with <a href="https://github.com/baskerville/bspwm" target="_blank" rel="nofollow noopener noreferrer">bspwm</a> as my window manager. The LaTeX plugin I’m using in Vim is <a href="https://github.com/lervag/vimtex" target="_blank" rel="nofollow noopener noreferrer">vimtex</a>. It provides syntax highlighting, table of contents view, synctex, etc. Using <a href="https://github.com/junegunn/vim-plug" target="_blank" rel="nofollow noopener noreferrer">vim-plug</a>, I configured it as follows:</p> <div class="gatsby-highlight" data-language="vim"><pre class="language-vim"><code class="language-vim">Plug <span class="token string">'lervag/vimtex'</span> <span class="token keyword">let</span> g<span class="token punctuation">:</span>tex_flavor<span class="token operator">=</span><span class="token string">'latex'</span> <span class="token keyword">let</span> g<span class="token punctuation">:</span>vimtex_view_method<span class="token operator">=</span><span class="token string">'zathura'</span> <span class="token keyword">let</span> g<span class="token punctuation">:</span>vimtex_quickfix_mode<span class="token operator">=</span><span class="token number">0</span> <span class="token keyword">set</span> conceallevel<span class="token operator">=</span><span class="token number">1</span> <span class="token keyword">let</span> g<span class="token punctuation">:</span>tex_conceal<span class="token operator">=</span><span class="token string">'abdmg'</span></code></pre></div> <p>The last two lines configure the concealment. This is a feature where LaTeX code is replaced or made invisible when your cursor is not on that line. By making <code class="language-text">\[</code>, <code class="language-text">\]</code>, <code class="language-text">$</code> invisible, they’re less obtrusive which gives you a better overview of the document. This feature also replaces <code class="language-text">\bigcap</code> by by <code class="language-text">∩</code>, <code class="language-text">\in</code> by <code class="language-text">∈</code> etc. The following animation should make that clear.</p> <p><img src="../d362e0b837be308b0f8897482a331ec6/conceal.gif" alt="conceal"></p> <p>With this set up, I come to the crux of this blog post: writing LaTeX as fast as the lecturer can write on the blackboard. This is where snippets come into play.</p> <h2 id="snippets">Snippets</h2> <h3 id="whats-a-snippet">What’s a snippet?</h3> <p>A snippet is a short reusable piece of text that can be triggered by some other text. For example, when I type <code class="language-text">sign</code> and press <kbd>Tab</kbd>, the word <code class="language-text">sign</code> will be expanded to a signature:</p> <p><img src="../5ab28b1ad6114b68f4ce459d4f89eeae/sign.gif" alt="sign"></p> <p>Snippets can also be dynamic: when I type <code class="language-text">today</code> and press <kbd>Tab</kbd>, the word <code class="language-text">today</code> will be replaced by the current date, and <code class="language-text">box</code> <kbd>Tab</kbd> becomes a box that automatically grows in size.</p> <p><img src="../1b6301a6561d104b4bc79654cb75470d/today.gif" alt="today"></p> <p><img src="../8b7caefc472eae0941f41365d16e8d2d/box.gif" alt="box"></p> <p>You can even use one snippet inside another:</p> <p><img src="../cdd1fded48947d163c2e5e6b974cfec0/todaybox.gif" alt="todaybox"></p> <h3 id="using-ultisnips-to-create-snippets">Using UltiSnips to create snippets</h3> <p>I use the plugin <a href="https://github.com/SirVer/ultisnips" target="_blank" rel="nofollow noopener noreferrer">UltiSnips</a> to manage my snippets. My configuration is</p> <div class="gatsby-highlight" data-language="vim"><pre class="language-vim"><code class="language-vim">Plug <span class="token string">'sirver/ultisnips'</span> <span class="token keyword">let</span> g<span class="token punctuation">:</span>UltiSnipsExpandTrigger <span class="token operator">=</span> <span class="token string">'<tab>'</span> <span class="token keyword">let</span> g<span class="token punctuation">:</span>UltiSnipsJumpForwardTrigger <span class="token operator">=</span> <span class="token string">'<tab>'</span> <span class="token keyword">let</span> g<span class="token punctuation">:</span>UltiSnipsJumpBackwardTrigger <span class="token operator">=</span> <span class="token string">'<s-tab>'</span></code></pre></div> <p>The code for the <code class="language-text">sign</code> snippet is the following:</p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">sign </span><span class="token name">"Signature"</span></span> Yours sincerely, Gilles Castel <span class="token keyword">endsnippet</span></code></pre></div> <p>For dynamic snippets, you can put code between backticks <code class="language-text">``</code> which will be run when the snippet is expanded. Here, I’ve used bash to format the current date: <code class="language-text">date + %F</code>.</p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">today </span><span class="token name">"Date"</span></span> `date +%F` <span class="token keyword">endsnippet</span></code></pre></div> <p>You can also use Python inside a <code class="language-text">`!p ... `</code> block. Have a look at the code for the <code class="language-text">box</code> snippet:</p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">box </span><span class="token name">"Box"</span></span> `<span class="token inline">!p</span><span class="token python"> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> <span class="token string">'┌'</span> <span class="token operator">+</span> <span class="token string">'─'</span> <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'┐'</span>`</span> │ <span class="token tabstop">$1</span> │ `<span class="token inline">!p</span><span class="token python"> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> <span class="token string">'└'</span> <span class="token operator">+</span> <span class="token string">'─'</span> <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'┘'</span>`</span> <span class="token tabstop">$0</span> <span class="token keyword">endsnippet</span></code></pre></div> <p>These Python code blocks will be replaced by the value of the variable <code class="language-text">snip.rv</code>. Inside these blocks, you have access to the current state of the snippet, e.g. <code class="language-text">t[1]</code> contains the first tab stop, <code class="language-text">fn</code> the current filename, …</p> <h2 id="latex-snippets">LaTeX snippets</h2> <p>Using snippets, writing LaTeX is a lot faster than writing it by hand. Especially some of the more complex snippets can save you a lot of time and frustration. Let’s begin with some simple snippets.</p> <h3 id="environments">Environments</h3> <p>To insert an environment, all I have to do is type <code class="language-text">beg</code> at the beginning of a line. Then I type the name of the environment, which is mirrored in the <code class="language-text">\end{}</code> command. Pressing <kbd>Tab</kbd> places the cursor inside the newly created environment.</p> <p><img src="../d5ed641a9cb568d13dd56d98fec6376b/beginend.gif" alt="beginend"></p> <p>The code for this snippet is the following.</p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">beg </span><span class="token name">"begin{} / end{}"</span> <span class="token flags">bA</span></span> \begin{<span class="token tabstop">$1</span>} <span class="token tabstop">$0</span> \end{<span class="token tabstop">$1</span>} <span class="token keyword">endsnippet</span></code></pre></div> <p>The <code class="language-text">b</code> means that this snippet will only be expanded at the beginning of a line and <code class="language-text">A</code> stands for auto expand, which means I do not have to press <kbd>Tab</kbd> to expand the snippet. Tab stops — i.e. places you can jump to by pressing <kbd>Tab</kbd> and <kbd>Shift</kbd>+<kbd>Tab</kbd> — are represented by <code class="language-text">$1</code>, <code class="language-text">$2</code>, … and the last one with <code class="language-text">$0</code>.</p> <h3 id="inline-and-display-math">Inline and display math</h3> <p>Two of my most frequently used snippets are <code class="language-text">mk</code> and <code class="language-text">dm</code>. They’re the snippets responsible for starting math mode. The first one is a snippet for inline math, the second one for displayed math.</p> <p><img src="../12a16b6a90c4d85a887c7cde0f18bb8c/mkdm.gif" alt="mkdm"></p> <p>The snippet for inline math is ‘smart’: it knows when to insert a space after the dollar sign. When I start typing a word directly behind the closing <code class="language-text">$</code>, it adds a space. However, when I type a non-word character, it does not add a space, which would be preferred for example in the case of <code class="language-text">$p$-value</code>.</p> <p><img src="../1172a1f556fd36b42f7c3642b3952e2c/mk_space.gif" alt="mk_space"></p> <p>The code for this snippet is the following.</p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">mk </span><span class="token name">"Math"</span> <span class="token flags">wA</span></span> $<span class="token tabstop">${1}</span>$`<span class="token inline">!p</span><span class="token python"> <span class="token keyword">if</span> t<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">and</span> t<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">not</span> <span class="token keyword">in</span> <span class="token punctuation">[</span><span class="token string">','</span><span class="token punctuation">,</span> <span class="token string">'.'</span><span class="token punctuation">,</span> <span class="token string">'?'</span><span class="token punctuation">,</span> <span class="token string">'-'</span><span class="token punctuation">,</span> <span class="token string">' '</span><span class="token punctuation">]</span><span class="token punctuation">:</span> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> <span class="token string">' '</span> <span class="token keyword">else</span><span class="token punctuation">:</span> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> <span class="token string">''</span> `</span><span class="token tabstop">$2</span> <span class="token keyword">endsnippet</span></code></pre></div> <p>The <code class="language-text">w</code> at the end of the first line means that this snippet will expand at word boundaries, so e.g. <code class="language-text">hellomk</code> won’t expand, but <code class="language-text">hello mk</code> will.</p> <p>The snippet for displayed math is more simple, but it also is quite handy; it makes me never forget ending equations with a period.</p> <p><img src="../a682e97365ecfe19fe0c5bc08bacfec6/dm.gif" alt="dm"></p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">dm </span><span class="token name">"Math"</span> <span class="token flags">wA</span></span> \[ <span class="token tabstop">$1</span> .\] <span class="token tabstop">$0</span> <span class="token keyword">endsnippet</span></code></pre></div> <h3 id="sub--and-superscripts">Sub- and superscripts</h3> <p>Another useful snippet is one for subscripts. It changes changes <code class="language-text">a1</code> to <code class="language-text">a_1</code> and <code class="language-text">a_12</code> to <code class="language-text">a_{12}</code>.</p> <p><img src="../f26633cb822c6b52d346dfbba6e1a1bd/subscripts.gif" alt="subscripts"></p> <p>The code for this snippet uses a regular expression for its trigger. It expands the snippet when you type a character followed by a digit, which encoded by <code class="language-text">[A-Za-z]\d</code>, or a character followed by <code class="language-text">_</code> and two digits: <code class="language-text">[A-Za-z]_\d\d</code>.</p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">'([A-Za-z])(\d)' </span><span class="token name">"auto subscript"</span> <span class="token flags">wrA</span></span> `<span class="token inline">!p</span><span class="token python"> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>`_`!p snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span>`</span> <span class="token keyword">endsnippet</span> <span class="token snippet">snippet <span class="token trigger">'([A-Za-z])_(\d\d)' </span><span class="token name">"auto subscript2"</span> <span class="token flags">wrA</span></span> `<span class="token inline">!p</span><span class="token python"> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>`_<span class="token punctuation">{</span>`!p snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span>`</span>} <span class="token keyword">endsnippet</span></code></pre></div> <p>When you wrap parts of a regular expression in a group using parenthesis, e.g. <code class="language-text">(\d\d)</code>, you can use them in the expansion of the snippet via <code class="language-text">match.group(i)</code> in Python.</p> <p>As for superscripts, I use <code class="language-text">td</code>, which becomes <code class="language-text">^{}</code>. However, for squared, cubed, complement and a handful of other common ones, I use dedicated snippets such as <code class="language-text">sr</code>, <code class="language-text">cb</code> and <code class="language-text">comp</code>.</p> <p><img src="../da855cd9e67c48f508fab5ddc8c877fe/superscripts.gif" alt="superscripts"></p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">sr </span><span class="token name">"^2"</span> <span class="token flags">iA</span></span> ^2 <span class="token keyword">endsnippet</span> <span class="token snippet">snippet <span class="token trigger">cb </span><span class="token name">"^3"</span> <span class="token flags">iA</span></span> ^3 <span class="token keyword">endsnippet</span> <span class="token snippet">snippet <span class="token trigger">compl </span><span class="token name">"complement"</span> <span class="token flags">iA</span></span> ^{c} <span class="token keyword">endsnippet</span> <span class="token snippet">snippet <span class="token trigger">td </span><span class="token name">"superscript"</span> <span class="token flags">iA</span></span> ^{<span class="token tabstop">$1</span>}<span class="token tabstop">$0</span> <span class="token keyword">endsnippet</span></code></pre></div> <h3 id="fractions">Fractions</h3> <p>One of my most convenient snippets is one for fractions. This makes the following expansions:</p> <table> <thead> <tr> <th align="right"></th> <th></th> <th align="left"></th> </tr> </thead> <tbody> <tr> <td align="right"><code class="language-text">//</code></td> <td>→</td> <td align="left"><code class="language-text">\frac{}{}</code></td> </tr> <tr> <td align="right"><code class="language-text">3/</code></td> <td>→</td> <td align="left"><code class="language-text">\frac{3}{}</code></td> </tr> <tr> <td align="right"><code class="language-text">4\pi^2/</code></td> <td>→</td> <td align="left"><code class="language-text">\frac{4\pi^2}{}</code></td> </tr> <tr> <td align="right"><code class="language-text">(1 + 2 + 3)/</code></td> <td>→</td> <td align="left"><code class="language-text">\frac{1 + 2 + 3}{}</code></td> </tr> <tr> <td align="right"><code class="language-text">(1+(2+3)/)</code></td> <td>→</td> <td align="left"><code class="language-text">(1 + \frac{2+3}{})</code></td> </tr> <tr> <td align="right"><code class="language-text">(1 + (2+3))/</code></td> <td>→</td> <td align="left"><code class="language-text">\frac{1 + (2+3)}{}</code></td> </tr> </tbody> </table> <p><img src="../3f83f1bdc3078aa16382e80a276f199f/frac.gif" alt="frac"></p> <p>The code for the first one is easy:</p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">// </span><span class="token name">"Fraction"</span> <span class="token flags">iA</span></span> \\frac{<span class="token tabstop">$1</span>}{<span class="token tabstop">$2</span>}<span class="token tabstop">$0</span> <span class="token keyword">endsnippet</span></code></pre></div> <p>The second and third examples are made possible using regular expressions to match for expressions like <code class="language-text">3/</code>, <code class="language-text">4ac/</code>, <code class="language-text">6\pi^2/</code>, <code class="language-text">a_2/</code>, etc.</p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">'((\d+)|(\d*)(\\)?([A-Za-z]+)((\^|_)(\{\d+\}|\d))*)/' </span><span class="token name">"Fraction"</span> <span class="token flags">wrA</span></span> \\frac{`<span class="token inline">!p</span><span class="token python"> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>`</span>}{<span class="token tabstop">$1</span>}<span class="token tabstop">$0</span> <span class="token keyword">endsnippet</span></code></pre></div> <p>As you can see, regular expressions can become quite overwhelming, but here’s a diagram that should explain it:</p> <p><img src="../908df5ec254f9cd5b08b99b8a54318d0/regex.svg" alt="Diagram of the regular expression"></p> <p>In the fourth and fifth cases, it tries to find the matching parenthesis. As this isn’t possible using the regular expression engine of UltiSnips, I resorted to using Python:</p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token keyword">priority</span> 1000 <span class="token snippet">snippet <span class="token trigger">'^.*\)/' </span><span class="token name">"() Fraction"</span> <span class="token flags">wrA</span></span> `<span class="token inline">!p</span><span class="token python"> stripped <span class="token operator">=</span> match<span class="token punctuation">.</span>string<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span> depth <span class="token operator">=</span> <span class="token number">0</span> i <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>stripped<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span> <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span> <span class="token keyword">if</span> stripped<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">')'</span><span class="token punctuation">:</span> depth <span class="token operator">+=</span> <span class="token number">1</span> <span class="token keyword">if</span> stripped<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">'('</span><span class="token punctuation">:</span> depth <span class="token operator">-=</span> <span class="token number">1</span> <span class="token keyword">if</span> depth <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">:</span> <span class="token keyword">break</span><span class="token punctuation">;</span> i <span class="token operator">-=</span> <span class="token number">1</span> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> stripped<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">:</span>i<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token string">"\\frac{"</span> <span class="token operator">+</span> stripped<span class="token punctuation">[</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">:</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token string">"}"</span> `</span>{<span class="token tabstop">$1</span>}<span class="token tabstop">$0</span> <span class="token keyword">endsnippet</span></code></pre></div> <p>The last snippet concerning fractions I’d like to share is one that uses your selection to make a fraction. You can use it by first selecting some text, then pressing <kbd>Tab</kbd>, typing <code class="language-text">/</code> and pressing <kbd>Tab</kbd> again.</p> <p><img src="../0da01b9566dc437fabf0c563ed14941f/visualfrac.gif" alt="visualfrac"></p> <p>The code makes use of the <code class="language-text">${VISUAL}</code> variable that represents your selection.</p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">/ </span><span class="token name">"Fraction"</span> <span class="token flags">iA</span></span> \\frac{<span class="token tabstop">${VISUAL}</span>}{<span class="token tabstop">$1</span>}<span class="token tabstop">$0</span> <span class="token keyword">endsnippet</span></code></pre></div> <h3 id="sympy-and-mathematica">Sympy and Mathematica</h3> <p>Another cool — but less used — snippet is one that uses <a href="https://www.sympy.org/" target="_blank" rel="nofollow noopener noreferrer">sympy</a> to evaluate mathematical expressions. For example: <code class="language-text">sympy</code> <kbd>Tab</kbd> expands to <code class="language-text">sympy | sympy</code>, and <code class="language-text">sympy 1 + 1 sympy</code> <kbd>Tab</kbd> expands to <code class="language-text">2</code>.</p> <p><img src="../8c8f143fdcdc2f3e6de9853cf7ea3def/sympy.gif" alt="sympy"></p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token snippet">snippet <span class="token trigger">sympy </span><span class="token name">"sympy block "</span> <span class="token flags">w</span></span> sympy <span class="token tabstop">$1</span> sympy<span class="token tabstop">$0</span> <span class="token keyword">endsnippet</span> <span class="token keyword">priority</span> 10000 <span class="token snippet">snippet <span class="token trigger">'sympy(.*)sympy' </span><span class="token name">"evaluate sympy"</span> <span class="token flags">wr</span></span> `<span class="token inline">!p</span><span class="token python"> <span class="token keyword">from</span> sympy <span class="token keyword">import</span> <span class="token operator">*</span> x<span class="token punctuation">,</span> y<span class="token punctuation">,</span> z<span class="token punctuation">,</span> t <span class="token operator">=</span> symbols<span class="token punctuation">(</span><span class="token string">'x y z t'</span><span class="token punctuation">)</span> k<span class="token punctuation">,</span> m<span class="token punctuation">,</span> n <span class="token operator">=</span> symbols<span class="token punctuation">(</span><span class="token string">'k m n'</span><span class="token punctuation">,</span> integer<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span> f<span class="token punctuation">,</span> g<span class="token punctuation">,</span> h <span class="token operator">=</span> symbols<span class="token punctuation">(</span><span class="token string">'f g h'</span><span class="token punctuation">,</span> cls<span class="token operator">=</span>Function<span class="token punctuation">)</span> init_printing<span class="token punctuation">(</span><span class="token punctuation">)</span> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> <span class="token builtin">eval</span><span class="token punctuation">(</span><span class="token string">'latex('</span> <span class="token operator">+</span> match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">'\\'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span> \ <span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">'^'</span><span class="token punctuation">,</span> <span class="token string">'**'</span><span class="token punctuation">)</span> \ <span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">'{'</span><span class="token punctuation">,</span> <span class="token string">'('</span><span class="token punctuation">)</span> \ <span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">'}'</span><span class="token punctuation">,</span> <span class="token string">')'</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">')'</span><span class="token punctuation">)</span> `</span> <span class="token keyword">endsnippet</span></code></pre></div> <p>For the Mathematica users out there, you can do something similar:</p> <p><img src="../82f7f187a685a52ed7665fded563f936/mathematica.gif" alt="mathematica"></p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token keyword">priority</span> 1000 <span class="token snippet">snippet <span class="token trigger">math </span><span class="token name">"mathematica block"</span> <span class="token flags">w</span></span> math <span class="token tabstop">$1</span> math<span class="token tabstop">$0</span> <span class="token keyword">endsnippet</span> <span class="token keyword">priority</span> 10000 <span class="token snippet">snippet <span class="token trigger">'math(.*)math' </span><span class="token name">"evaluate mathematica"</span> <span class="token flags">wr</span></span> `<span class="token inline">!p</span><span class="token python"> <span class="token keyword">import</span> subprocess code <span class="token operator">=</span> <span class="token string">'ToString['</span> <span class="token operator">+</span> match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">', TeXForm]'</span> snip<span class="token punctuation">.</span>rv <span class="token operator">=</span> subprocess<span class="token punctuation">.</span>check_output<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'wolframscript'</span><span class="token punctuation">,</span> <span class="token string">'-code'</span><span class="token punctuation">,</span> code<span class="token punctuation">]</span><span class="token punctuation">)</span> `</span> <span class="token keyword">endsnippet</span></code></pre></div> <h3 id="postfix-snippets">Postfix snippets</h3> <p>Some other snippets I find worth sharing are postfix snippets. Examples of such snippets are <code class="language-text">phat</code> → <code class="language-text">\hat{p}</code> and <code class="language-text">zbar</code> → <code class="language-text">\overline{z}</code>. A similar snippet is a postfix vector, for example <code class="language-text">v,.</code> → <code class="language-text">\vec{v}</code> and <code class="language-text">v.,</code> → <code class="language-text">\vec{v}</code>. The order of <code class="language-text">,</code> and <code class="language-text">.</code> doesn’t matter, so I can press them both at the same time. These snippets are a real time-saver, because you can type in the same order the lecturer writes on the blackboard.</p> <p><img src="../7c2e62aae292bc4d65eae363c816e206/barhatvec.gif" alt="barhatvec"></p> <p>Note that I can still use <code class="language-text">bar</code> and <code class="language-text">hat</code> prefix too, as I’ve added them with a lower priority. The code for those snippets is:</p> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token keyword">priority</span> 10 <span class="token snippet">snippet <span class="token trigger">"bar" </span><span class="token name">"bar"</span> <span class="token flags">riA</span></span> \overline{<span class="token tabstop">$1</span>}<span class="token tabstop">$0</span> <span class="token keyword">endsnippet</span> <span class="token keyword">priority</span> 100 <span class="token snippet">snippet <span class="token trigger">"([a-zA-Z])bar" </span><span class="token name">"bar"</span> <span class="token flags">riA</span></span> \overline{`<span class="token inline">!p</span><span class="token python"> snip<span class="token punctuation">.</span>rv<span class="token operator">=</span>match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>`</span>} <span class="token keyword">endsnippet</span></code></pre></div> <div class="gatsby-highlight" data-language="snip"><pre class="language-snip"><code class="language-snip"><span class="token keyword">priority</span> 10 <span class="token snippet">snippet <span class="token trigger">"hat" </span><span class="token name">"hat"</span> <span class="token flags">riA</span></span> \hat{<span class="token tabstop">$1</span>}<span class="token tabstop">$0</span> <span class="token keyword">endsnippet</span> <span class="token keyword">priority</span> 100 <span class="token snippet">snippet <span class="token trigger">"([a-zA-Z])hat" </span><span class="token name">"hat"</span> <span class="token flags">riA</span></span> \hat{`<span class="token inline">!p</span><span class="token python"> snip<span class="token punctuation">.</span>rv<span class="token operator">=</span>match<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>`</span>}