<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: alexpovel</title><link>https://news.ycombinator.com/user?id=alexpovel</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 18 Jun 2026 11:59:26 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=alexpovel" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by alexpovel in "GitHub introduces sub-issues, issue types and advanced search"]]></title><description><![CDATA[
<p>Oh yeah, that looks super similar. I remember the similarity score being tricky to get useful signal out of, for the underlying model I had used back then. Similar and dissimilar issues all hovered around the 0.80 mark. But surely not hard to improve on, with larger models and possibly higher-dimension vectors.</p>
]]></description><pubDate>Sun, 19 Jan 2025 14:37:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=42757367</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=42757367</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42757367</guid></item><item><title><![CDATA[New comment by alexpovel in "GitHub introduces sub-issues, issue types and advanced search"]]></title><description><![CDATA[
<p>Agree!<p>For fun, I had put together a GitHub bot for this purpose a while ago. It indexes all existing issues in a repo, creates embeddings and stores them in a vector DB. When a new issue is created, the bot comments with the 3 most similar, existing issues, from vector similarity.<p>In theory, that empowers users to close their own issues without maintainer intervention, provided an existing & solved issue covers their use case. In practice, the project never made it past PoC.<p>The mechanism works okay, but I've found available (cheap) embedding models to not be powerful enough. For GitHub, technology-wise, it should be easy to implement though.<p><a href="https://github.com/alexpovel/issuedigger">https://github.com/alexpovel/issuedigger</a></p>
]]></description><pubDate>Sun, 19 Jan 2025 14:18:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=42757192</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=42757192</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42757192</guid></item><item><title><![CDATA[New comment by alexpovel in "Mergiraf: a syntax-aware merge driver for Git"]]></title><description><![CDATA[
<p>Not the OP, but you raise good points. Performance might also be a concern, thinking of languages like Python and its ast package (not sure that’s accessible without going through the interpreter).<p>For a tool I’m writing, the tree-sitter query language is a core piece of the puzzle as well. Once you only have JSON of the concrete syntax trees, you’re back to implementing a query language yourself. Not that OP needs it, but ast-grep might?</p>
]]></description><pubDate>Sun, 10 Nov 2024 09:45:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=42099329</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=42099329</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42099329</guid></item><item><title><![CDATA[New comment by alexpovel in "Refactoring Python with Tree-sitter and Jedi"]]></title><description><![CDATA[
<p>These sorts of cases are why I wrote srgn [0]. It's based on tree-sitter too. Calling it as<p><pre><code>     cat file.py | srgn --py def --py identifiers 'database' 'db'
</code></pre>
will <i>replace</i> all mentions of `database` inside identifiers inside (only!) function definitions (`def`) with `db`.<p>An input like<p><pre><code>    import database
    import pytest


    @pytest.fixture()
    def test_a(database):
        return database


    def test_b(database):
        return database


    database = "database"


    class database:
        pass

</code></pre>
is turned into<p><pre><code>    import database
    import pytest


    @pytest.fixture()
    def test_a(db):
        return db


    def test_b(db):
        return db


    database = "database"


    class database:
        pass

</code></pre>
which seems roughly like what the author is after. Mentions of "database" <i>outside</i> function definitions are not modified. That sort of logic I always found hard to replicate in basic GNU-like tools. If run without stdin, the above command runs recursively, in-place (careful with that one!).<p>Note: I just wrote this, and version 0.13.2 is required for the above to work.<p>[0]: <a href="https://github.com/alexpovel/srgn">https://github.com/alexpovel/srgn</a></p>
]]></description><pubDate>Fri, 27 Sep 2024 20:47:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=41675384</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=41675384</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41675384</guid></item><item><title><![CDATA[New comment by alexpovel in "Greppability is an underrated code metric"]]></title><description><![CDATA[
<p>Regarding your third point, I put together a tool capable of that to some degree.<p>It allows you to grep inside source code, but limit the search to e.g. “only docstrings inside class definitions”, among other things. That is, it allows nesting and is syntax aware. That example is for Python, but the tool speaks more languages (thanks to treesitter).<p><a href="https://github.com/alexpovel/srgn/blob/main/README.md#multiple-language-scopes">https://github.com/alexpovel/srgn/blob/main/README.md#multip...</a></p>
]]></description><pubDate>Tue, 03 Sep 2024 06:22:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=41431855</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=41431855</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41431855</guid></item><item><title><![CDATA[New comment by alexpovel in "Amber: A code search and replace tool"]]></title><description><![CDATA[
<p>The tool you are describing is what I am trying to build at <a href="https://github.com/alexpovel/srgn">https://github.com/alexpovel/srgn</a> . The idea is a compromise between regex (think ripgrep) and grammar awareness (through tree-sitter).</p>
]]></description><pubDate>Thu, 23 May 2024 19:26:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=40458858</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=40458858</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40458858</guid></item><item><title><![CDATA[Show HN: Srgn, AST-aware text manipulation]]></title><description><![CDATA[
<p>srgn is a niche source code (or just text) manipulation tool. It's written in Rust, with performance in mind. I used it to learn the language a while back, in order to work towards something resembling "useful in the real world".<p>Think of srgn as a blend of rip-grep, tree-sitter and GNU `tr`/`sed`. At its core, it most closely resembles `tr`, but expands on it in two important ways.<p>First, srgn provides <i>scoping</i>, used to specify what part of an input to work on. This can be literal text, regular expressions, or tree-sitter queries. The latter is the most interesting one. As tree-sitter queries can be tough to construct (although the tool is excellent, with an online playground for testing and more), srgn has pre-defined queries and makes an effort to unify these across languages. For example, across TypeScript, C#, Go, Rust and Python, you can specify to scope all "comments", and it (hopefully) just works as expected, despite these languages having different ideas of how comments work and look like (C# has multi-line and inline, for example, while Python only has a single type, all of which is also reflected in what tree-sitter calls those corresponding nodes).<p>Secondly, there's <i>actions</i>, which simply perform text manipulation on whatever is in scope from the previous step. One could delete certain parts of all comments, for example, or rewrite all import statements across an entire code base (<a href="https://github.com/alexpovel/srgn#mass-import-module-renaming-python-rust">https://github.com/alexpovel/srgn#mass-import-module-renamin...</a>).<p>I had looked around a bunch for similar tools (<a href="https://github.com/alexpovel/srgn#similar-tools">https://github.com/alexpovel/srgn#similar-tools</a>), but couldn't find any that quite did what srgn does.<p>The CLI is a rather thin wrapper around the Rust library, which is usable in the usual way.<p>By the way, the name srgn stands for surgeon, in the sense of a code surgeon: precise manipulation of text. Regular expressions and tree-sitter queries can be combined, which turns out to be much more powerful than either of these by itself, and also fills a different niche than LSP-powered <i>Rename all</i>-like features. It can also be used in CI, as a simple custom linter ("fail if you find any 'TODO' strings in comments").<p>A lot of the use cases can be covered by just regex, and then fixing mistakes manually; srgn mainly inches the precision of these operations closer to 100%, for when it's needed (like large refactors, where srgn offers full parallelization as well).</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=39160149">https://news.ycombinator.com/item?id=39160149</a></p>
<p>Points: 2</p>
<p># Comments: 1</p>
]]></description><pubDate>Sat, 27 Jan 2024 21:43:49 +0000</pubDate><link>https://github.com/alexpovel/srgn</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=39160149</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39160149</guid></item><item><title><![CDATA[New comment by alexpovel in "Ask HN: What apps have you created for your own use?"]]></title><description><![CDATA[
<p>> But this is a custom setup that's not portable?<p>Caught me.<p>> And how is it less tedious to have to select previously typed text all the time?<p>This is tedious, but I have that automated (AutoHotKey). So a single, AHK-managed hotkey does the equivalent of:<p><pre><code>    CTRL + SHIFT + HOME
    CTRL + C
    feed into tool, paste back
    CTRL + V
</code></pre>
So once done writing, I press that single button and it's done (CTRL+SHIFT+HOME select all text from cursor to beginning). To me, that's a better tradeoff than fiddling with compose keys, which I find to break flow. For very short text, compose key is possibly better; but again, once in AHK, it's a single shortcut. So once more than 1 compose key combination is needed, it's "worth it". But you're right: this is a custom setup and might not work for everyone.</p>
]]></description><pubDate>Wed, 13 Dec 2023 15:33:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=38628858</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=38628858</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38628858</guid></item><item><title><![CDATA[New comment by alexpovel in "Ask HN: What apps have you created for your own use?"]]></title><description><![CDATA[
<p>It's currently whitelist-based [0]. The downside is larger (code) size. The upside is simplicity. I imagine a blacklist could also work well, at smaller size but with more preprocessing needed.<p>[0]: <a href="https://github.com/alexpovel/srgn/blob/0008cce1c71f0d83f6a3186837fb6d1074236424/data/word-lists/de.txt">https://github.com/alexpovel/srgn/blob/0008cce1c71f0d83f6a31...</a></p>
]]></description><pubDate>Wed, 13 Dec 2023 09:24:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=38624724</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=38624724</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38624724</guid></item><item><title><![CDATA[New comment by alexpovel in "Ask HN: What apps have you created for your own use?"]]></title><description><![CDATA[
<p><a href="https://github.com/alexpovel/srgn">https://github.com/alexpovel/srgn</a><p>It grew out of a niche, almost historical need: using a QWERTY keyboard, but needing access to German Umlauts (ä, ö, ü, as well as ß). Switching keyboard layouts is possible but exhausting (it's much more pleasant sticking to one); using modifier keys is similarly tedious, and custom setups break and aren't portable.<p>So this tool can do:<p><pre><code>    $ echo 'Gruess Gott, Poeten und Abenteuergruetze!' | srgn --german
    Grüß Gott, Poeten und Abenteuergrütze!
</code></pre>
meaning it not only replaces Umlauts and Eszett, it also knows when not to (<i>Poeten</i>), and handles arbitrary compound words. Write your text, slap it all into the tool, it spits out results instantly. The original text can use alternative spellings (ou, ae, ue, ss), which is ergonomic. Combined with tools like AutohotKey, GUI integration through a single keyboard shortcut is possible. See [0] for a similar example.<p>A niche need I haven't yet come across someone else having as well! (just the amount of text explaining what it's all about is saying a lot in terms of specificity...)<p>The tool now grew into a tree-sitter based (== language grammar-aware) text manipulation thing, mostly for fun. The bizarre German core is still there however.<p>[0]: <a href="https://github.com/alexpovel/betterletter/blob/c19245bf90589aff7fad744981202ae370d66a51/betterletter.ahk">https://github.com/alexpovel/betterletter/blob/c19245bf90589...</a></p>
]]></description><pubDate>Wed, 13 Dec 2023 07:57:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=38624025</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=38624025</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38624025</guid></item><item><title><![CDATA[New comment by alexpovel in "AST-grep(sg) is a CLI tool for code structural search, lint, and rewriting"]]></title><description><![CDATA[
<p>> diff formatting<p>Thank you for the feedback! That sounds good, I'll add that.</p>
]]></description><pubDate>Sun, 10 Dec 2023 15:53:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=38592346</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=38592346</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38592346</guid></item><item><title><![CDATA[New comment by alexpovel in "AST-grep(sg) is a CLI tool for code structural search, lint, and rewriting"]]></title><description><![CDATA[
<p>Exactly, all the parsing is done by tree-sitter. The Rust bindings to the tree-sitter C lib are a "first-class consumer".</p>
]]></description><pubDate>Sun, 10 Dec 2023 15:42:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=38592261</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=38592261</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38592261</guid></item><item><title><![CDATA[New comment by alexpovel in "AST-grep(sg) is a CLI tool for code structural search, lint, and rewriting"]]></title><description><![CDATA[
<p>Wow! What a coincidence. Just the other day I finished "v1" of a similar tool: <a href="https://github.com/alexpovel/srgn">https://github.com/alexpovel/srgn</a> , calling it a combination of tr/sed, ripgrep and tree-sitter. It's more about editing code in-place, not finding matches.<p>I've spent a lot of time trying to find similar tools, and even list them in the README, but `AST-grep` did not come up! I was a bit confused, as I was sure such a thing <i>must</i> exist already. AST-grep looks much more capable and dynamic, great work, especially around the variable syntax.</p>
]]></description><pubDate>Sun, 10 Dec 2023 13:36:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=38591434</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=38591434</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38591434</guid></item><item><title><![CDATA[New comment by alexpovel in "Ask HN: Those making $0/month or less on side projects – Show and tell"]]></title><description><![CDATA[
<p>ancv: <a href="https://github.com/alexpovel/ancv/">https://github.com/alexpovel/ancv/</a><p>Idea: renders your resume as pretty terminal output. Others can view it in their own terminals:<p><pre><code>    curl -L ancv.io/heyho
</code></pre>
Pipe to a pager for best viewing. Yes, it's just a nerdy gimmick with almost no real use!<p>I provide a GCP-hosted server that works off GitHub gists (where your resume can live in JSONResume form). However, self-hosting is a first-class citizen and easy to use as well.</p>
]]></description><pubDate>Fri, 27 Jan 2023 17:56:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=34549366</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=34549366</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=34549366</guid></item><item><title><![CDATA[Show HN: ancv - Share your CV through curl, pretty-printed]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/alexpovel/ancv">https://github.com/alexpovel/ancv</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=33684987">https://news.ycombinator.com/item?id=33684987</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Sun, 20 Nov 2022 20:35:52 +0000</pubDate><link>https://github.com/alexpovel/ancv</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=33684987</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33684987</guid></item><item><title><![CDATA[Show HN: Ancv – Renders your resume/CV for online and pretty terminal display]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/alexpovel/ancv">https://github.com/alexpovel/ancv</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=32801769">https://news.ycombinator.com/item?id=32801769</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Sun, 11 Sep 2022 18:02:24 +0000</pubDate><link>https://github.com/alexpovel/ancv</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=32801769</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=32801769</guid></item><item><title><![CDATA[New comment by alexpovel in "Some tiny personal programs I've written"]]></title><description><![CDATA[
<p>>  Neat! I'm using QWERTY International layouts myself, where you can type umlauts and ß with special keys for modifiers (e.g. alt+u on Mac for ¨), but I still think this is a cool tool.<p>Yeah, I had looked into these but for some reason that didn't work. Don't remember why.<p>> Looking through the repo I wondered why you would commit the complete German dictionary weighing in at over 30 MB, whereas you only need a small fraction, the words containing the umlauts (or their false matches). Surely this would be a huge performance boost?<p>Yes! It would be performance boost. In fact, I had a "caching" sort of functionality in the tool before. The whole dictionary is shipped (because that makes it much easier and there's almost no risk of wrong-doing just copy-pasting a word list, plus it compresses well enough), but then a list containing only special characters will be generated on first use if it doesn't exist yet.<p>As you noted, a lot of words do contain special letters, so the "complexity" wasn't worth it to me and I removed that. Could be brought back anytime, but it's fine for now.</p>
]]></description><pubDate>Wed, 09 Mar 2022 19:35:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=30618988</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=30618988</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30618988</guid></item><item><title><![CDATA[New comment by alexpovel in "Some tiny personal programs I've written"]]></title><description><![CDATA[
<p>A couple years ago, I switched from German QWERTZ to a UK QWERTY keyboard (wouldn't have minded US QWERTY but the differently shaped return key seemed too foreign). I am not looking back: for programming but also general tasks, having keys like<p><pre><code>    ` [ ] \ / { }
</code></pre>
very easily available is a blessing. The German QWERTZ keyboard has <i>triple</i> occupation on some keys, which is not ergonomic and harder to type fast with.<p>Anyway, both Linux and Windows offer fast switching between installed keyboard layouts/languages using SUPER+SPACE. This is needed in e.g. emails, where I still need Umlauts. It's just much easier to read that way. However, switching back and forth constantly is completely overwhelming and not viable. However, in German, there are perfectly and officially (?) acceptable alternative spellings for our special "Unicode"-characters. They can be typed using plain ASCII, aka a QWERTY keyboard.<p>So, I wrote a script to read in any text, combined it with AutoHotkey on Windows and now have a tool that, at the touch of a button, replaces selected text using alternative spellings (gruen, Duebel, Faehre) with their correct versions (grün, Dübel, Fähre). The tool could be extended for other languages rather easily. I've been using it for over a year now and recently got to release it properly on the cheese shop:<p><pre><code>    pip install betterletter
</code></pre>
(<a href="https://pypi.org/project/betterletter/" rel="nofollow">https://pypi.org/project/betterletter/</a>)<p>Before putting this together, I had looked around for an existing tool. To my surprise (there's always something!), I found nothing. I guess this scratches a too specific itch: using QWERTY but wanting proper spelling quickly, while remaining on QWERTY as to not have a mental breakdown and stay at full typing speed.<p>After writing, select everything (CTRL+SHIFT+HOME works well), hit shortcut, text will be replaced. This takes about 2 seconds, much faster than switching keyboard layouts back and forth. If this ran as a daemon with the dictionary loaded into RAM already, the script could run almost instantaneously (most of the 2 seconds is IO, reading from disk), in linear time according to the text input size.</p>
]]></description><pubDate>Wed, 09 Mar 2022 18:46:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=30618442</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=30618442</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30618442</guid></item><item><title><![CDATA[New comment by alexpovel in "Rewriting LaTeX in Pure Rust"]]></title><description><![CDATA[
<p>> basically every scientific paper I read is set using pdftex<p>That is only because their templates are years behind the curve and they are slow to update. It is not an argument for the advantages of pdftex, aside from its stability, gained over many decades.<p>LuaTeX has been nothing but stable for me, so from a technical standpoint, there is no reason not to switch.<p>As far as scientific papers go, the publishers and editors probably value stability and backward-compatibility (I would).</p>
]]></description><pubDate>Tue, 08 Dec 2020 08:18:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=25343083</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=25343083</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25343083</guid></item><item><title><![CDATA[New comment by alexpovel in "Rewriting LaTeX in Pure Rust"]]></title><description><![CDATA[
<p>LuaLaTeX allocates memory as-needed, see section 3.4.1 in the manual [0] (and comments/answers in this thread [1]).
Base TeX has an arbitrary, by modern standards low memory limit, leading to a whole class of errors plaguing unsuspecting users [2], and spawning entire extensions to deal with these limitations [3].<p>This is simply an artefact of times past and has no technical relevance nowadays.
LuaTeX allows dynamic allocation, with the available system RAM as the upper limit (so effectively, no limitations in everyday usage).<p>Now, I could not find a mention of memory handling in the XeTeX reference manual [4]. People are using tricks like `tikzexternalize` with xelatex [5, 6]. Especially the first point makes me think XeLaTeX inherits base TeX memory handling/limits, but I cannot confirm this.<p>I just know that all my problems disappeared when switching from XeLaTeX to LuaLaTeX.<p>Lastly, see here [7] for a comprehensive (albeit somewhat anecdotal) list of advantages of LuaTeX over XeTeX. Of that list, `microtype` is another significant functionality I rely on.<p>[0]: <a href="http://www.tug.org/texlive//devsrc/Master/texmf-dist/doc/context/documents/general/manuals/luatex.pdf" rel="nofollow">http://www.tug.org/texlive//devsrc/Master/texmf-dist/doc/con...</a><p>[1]: <a href="https://tex.stackexchange.com/q/7953/" rel="nofollow">https://tex.stackexchange.com/q/7953/</a><p>[2]: <a href="https://tex.stackexchange.com/search?q=tex+capacity+exceeded" rel="nofollow">https://tex.stackexchange.com/search?q=tex+capacity+exceeded</a><p>[3]: <a href="https://tex.stackexchange.com/a/482560/" rel="nofollow">https://tex.stackexchange.com/a/482560/</a><p>[4]: <a href="http://mirrors.ctan.org/info/xetexref/xetex-reference.pdf" rel="nofollow">http://mirrors.ctan.org/info/xetexref/xetex-reference.pdf</a><p>[5]: <a href="https://tex.stackexchange.com/q/438131/" rel="nofollow">https://tex.stackexchange.com/q/438131/</a><p>[6]: <a href="https://tex.stackexchange.com/q/334250/" rel="nofollow">https://tex.stackexchange.com/q/334250/</a><p>[7]: <a href="https://tex.stackexchange.com/q/126206/" rel="nofollow">https://tex.stackexchange.com/q/126206/</a></p>
]]></description><pubDate>Mon, 07 Dec 2020 11:39:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=25331238</link><dc:creator>alexpovel</dc:creator><comments>https://news.ycombinator.com/item?id=25331238</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25331238</guid></item></channel></rss>