{"id":15064038,"url":"https://github.com/paolobrasolin/mnogootex","last_synced_at":"2026-03-03T20:31:38.828Z","repository":{"id":56884148,"uuid":"115222865","full_name":"paolobrasolin/mnogootex","owner":"paolobrasolin","description":"Mnogootex (многоꙮтех) simplifies and parallelizes compilation of a TeX document with multiple classes. ","archived":false,"fork":false,"pushed_at":"2021-11-19T19:59:39.000Z","size":361,"stargazers_count":5,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-10-27T23:59:12.294Z","etag":null,"topics":["academic-publishing","academic-writing","latex","latexmk","parallelization","tex"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/paolobrasolin.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-12-23T21:29:39.000Z","updated_at":"2022-06-04T20:08:47.000Z","dependencies_parsed_at":"2022-08-20T23:40:32.304Z","dependency_job_id":null,"html_url":"https://github.com/paolobrasolin/mnogootex","commit_stats":null,"previous_names":["tetrapharmakon/mnogootex"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/paolobrasolin/mnogootex","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paolobrasolin%2Fmnogootex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paolobrasolin%2Fmnogootex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paolobrasolin%2Fmnogootex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paolobrasolin%2Fmnogootex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/paolobrasolin","download_url":"https://codeload.github.com/paolobrasolin/mnogootex/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paolobrasolin%2Fmnogootex/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30058274,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-03T18:21:05.932Z","status":"ssl_error","status_checked_at":"2026-03-03T18:20:59.341Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["academic-publishing","academic-writing","latex","latexmk","parallelization","tex"],"created_at":"2024-09-25T00:10:41.750Z","updated_at":"2026-03-03T20:31:37.632Z","avatar_url":"https://github.com/paolobrasolin.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Многоꙮтех\n\n[![CI tests status badge][build-shield]][build-url]\n[![Latest release badge][rubygems-shield]][rubygems-url]\n[![License badge][license-shield]][license-url]\n[![Maintainability badge][cc-maintainability-shield]][cc-maintainability-url]\n[![Test coverage badge][cc-coverage-shield]][cc-coverage-url]\n\n[build-shield]: https://img.shields.io/github/workflow/status/paolobrasolin/mnogootex/CI/main?label=tests\u0026logo=github\n[build-url]: https://github.com/paolobrasolin/mnogootex/actions/workflows/main.yml \"CI tests status\"\n[rubygems-shield]: https://img.shields.io/gem/v/mnogootex?logo=ruby\n[rubygems-url]: https://rubygems.org/gems/mnogootex \"Latest release\"\n[license-shield]: https://img.shields.io/github/license/paolobrasolin/mnogootex\n[license-url]: https://github.com/paolobrasolin/mnogootex/blob/main/LICENSE \"License\"\n[cc-maintainability-shield]: https://img.shields.io/codeclimate/maintainability/paolobrasolin/mnogootex?logo=codeclimate\n[cc-maintainability-url]: https://codeclimate.com/github/paolobrasolin/mnogootex \"Maintainability\"\n[cc-coverage-shield]: https://img.shields.io/codeclimate/coverage/paolobrasolin/mnogootex?logo=codeclimate\u0026label=test%20coverage\n[cc-coverage-url]: https://codeclimate.com/github/paolobrasolin/mnogootex/coverage \"Test coverage\"\n\nМногоꙮтех (mnogootex) is a utility that parallelizes compilation\nof a LaTeX document using different classes and offers a\nmeaningfully filtered output.\n\nThe motivating use case is maintaining a single preamble while\nsubmitting a paper to many journals using their outdated or crummy\ndocument classes.\n\n## Getting started\n\n### Prerequisites\n\nМногоꙮтех is written in [**Ruby**](https://www.ruby-lang.org) and requires version `\u003e=2.5` (earlier ones are untested).\nYou can check whether it's installed by running `ruby --version`.\nFor installation instructions you can refer to the [official documentation](https://www.ruby-lang.org/en/documentation/installation/).\n\n\nМногоꙮтех heavily relies on [**`latexmk`**](https://ctan.org/pkg/latexmk).\nYou can check whether it's installed by running `latexmk --version`.\nIf you are missing it, follow the documentation of your specific LaTeX distribution and install the `latexmk` package.\n\n### Installation\n\nTo install многоꙮтех execute\n\n```bash\ngem install mnogootex\n```\n\nIf you're upgrading from a previous version, execute\n\n```bash\ngem update mnogootex\n```\n\nand remove any mention of `mnogootex` from your shell profile (it's not needed anymore).\n\n### Quick start\n\nFirst you write a LaTeX document:\n\n```latex\n% ~/demo/main.tex\n\\documentclass{scrarticle}\n\\begin{document}\n  \\abstract{Simply put, my article is awesome.}\n  Let's port my \\KOMAScript\\ article to other classes!\n\\end{document}\n```\n\nThen you list the desided classes in a Многоꙮтех configuration file:\n\n```yaml\n# ~/demo/.mnogootexrc\njobs:\n  - scrartcl\n  - article\n  - book\n```\n\nFinally you run `mnogootex build` and enjoy the technicolor:\n\n![A user types `mnogootex build main.tex` in the console. Some spinners indicating progress appear. Then the outcome for each class is presented. Failing ones include abridged and color coded logs, to pinpoint the errors.](demo/demo.gif?raw=true \"TTY demo GIF\")\n\n## Usage\n\nA Многоꙮтех run does the following:\n1. copy the _source_ folder of a project to many _target_ folders, one for each _job_;\n2. replace the document class in the source of each _target_ folder with the name of the relative _job_;\n3. call `latexmk` in parallel on each _target_ folder to compile the documents (or do other tasks);\n4. wait for the outcomes and print the logs, filtered and colour-coded in a meaningful way.\n\nIts convenience lies in the fact that it\n* automates the setup process,\n* parallelizes compilation,\n* improves the readability of the infamous waterfall logs.\n\nМногоꙮтех can be invoked from CLI using `mnogootex`.\nIt accepts various [commands](#mnogootex-commands) detailed below.\n\nTo leverage the full power of this tool you will need to learn writing [`mnogootex` configurations](#mnogootex-configuration) and ['latexmk' configurations](#latexmk-configuration).\nIt might sound daunting but they're really just a few lines.\n\n### `mnogootex` commands\n\n\u003e **Notation:** `[FOO]` means that _`FOO` is optional_ while `FOO ...` means _one or more `FOO`s_.\n\nAll commands except `help` accept the same parameters, so let's examine them in advance to avoid repeating ourselves later.\nHere is their syntax:\n\n```bash\nmnogootex COMMAND [JOB ...] [FLAG ...] ROOT\n```\n\n`JOB`s are the names of the document classes to compile your document with.\nZero or more can be provided, and when none is given the job list is loaded from the [configuration](#jobs).\n\n`FLAG`s are `latexmk` options.\nZero or more can be provided to override the behaviour of the `latexmk` call underlying the `mnogootex` command.\nYou can obtain a list of available options with the inline help `latexmk --help`, and the full documentation with `man latexmk`.\nGenerally speaking, if you find yourself always using a `FLAG` you should properly [configure `latexmk`](#latexmk-configuration) instead.\n\nThe last mandatory parameter is the `ROOT` file for compiling of your document.\n\nLet's examine the details of each command now.\n\n#### `help [COMMAND]`\n\nThis command prints the help for `COMMAND` (or all commands if none is given).\n\n#### `exec [JOB ...] [FLAG ...] ROOT`\n\nThis command simply runs `latexmk` on the `ROOT` document for each of your `JOB`s passing the given `FLAG`s.\n\nAll other commands below are specializations of this one.\nHowever you'll seldom use it unless you're debugging.\n\n#### `build [JOB ...] [FLAG ...] ROOT`\n\nThis command builds your document.\n\nIt is equivalent to `exec [JOB ...] -interaction=nonstopmode ROOT`.\n\nYou will probably need to pass some `FLAG`s (e.g. to use the correct engine) but it is not recommended: [configure `latexmk`](#latexmk-configuration) instead.\n\n#### `open [JOB ...] [FLAG ...] ROOT`\n\nThis command opens the final compilation artifact (after running the build if necessary).\n\nIt is equivalent to `exec [JOB ...] -pv -interaction=nonstopmode ROOT`.\n\nYou might need to pass some `FLAG`s (e.g. to use the correct viewer) but it is not recommended: [configure `latexmk`](#latexmk-configuration) instead.\n\n#### `clean [JOB ...] [FLAG ...] ROOT`\n\nThis command deletes all nonessential build files while keeping the compiled artifacts.\n\nIt is equivalent to `exec [JOB ...] -c ROOT`.\n\n#### `clobber [JOB ...] [FLAG ...] ROOT`\n\nThis command deletes all nonessential build files including the compiled artifacts.\n\nIt is equivalent to `exec [JOB ...] -C ROOT`.\n\n### `mnogootex` configuration\n\n`mnogootex` is configured through [`YAML`](https://learnxinyminutes.com/docs/yaml/)\nfiles named `.mnogootexrc` put into your projects' root directory.\n\nWhen `mnogootex` loads a configuration it also looks up for `.mnogootexrc`\nfiles in all parent directories to merge then together (from the\nshallowest to the deepest path).  This means that e.g. you can keep\na configuration file in your home folder and use it as a global\nconfiguration for all you projects, while overwriting only specific\noptions in the configuration files of each one.\n\n`mnogootex` currently accepts three options.\n\n#### `jobs`\n\nThis option represents the `JOB`s to build your document (when none are given via CLI).\n\nIt must contain valid document class names, given as a list of strings.\n\nBy default there are no `JOB`s:\n\n```yaml\n# Default value:\njobs: []\n```\n\nHere is a slightly more interesting example:\n\n```yaml\njobs:\n  - scrartcl\n  - article\n  - book\n```\n\n#### `work_path`\n\nThis option is the folder where all elaboration happens.\n\nIt must be a well formed path, given as a string.\n\nBy default none is given, meaning that each run of any given job happens in a dedicated temporary folder:\n\n```yaml\n# Default value:\nwork_path: null\n```\n\nOverriding this allows you to have easier access to the compilation artifacts.\nA good choice is setting it to `./build` and keep everything below your source folder:\n\n```yaml\nwork_path: ./build\n```\n\n#### `spinner`\n\nThis option is the spinner animation shown by the CLI.\n\nIt is a series of frames given as characters of a string.\n\nBy default it's a hole looping around in a blister:\n\n```yaml\n# Default value:\nspinner: ⣾⣽⣻⢿⡿⣟⣯⣷\n```\n\nHere is a couple more in case your terminal doesn't like Unicode:\n\n```yaml\n# A wriggly ASCII worm:\nspinner: )}]|[{({[|]}\n# An extended ASCII boomerang:\nspinner: ╒┍┌┎╓╖┒┐┑╕╛┙┘┚╜╙┖└┕╘\n```\n\nFeel free to get creative!\n\n### `latexmk` configuration\n\n`latexmk` is configured through [`Perl`](https://www.perl.org/)\nfiles named `.latexmkrc` put into your projects' root directory.\n\nWhen `latexmk` loads a configuration it also looks up for `.latexmkrc`\nfiles in all parent directories to merge then together (from the\nshallowest to the deepest path).  This means that e.g. you can keep\na configuration file in your home folder and use it as a global\nconfiguration for all you projects, while overwriting only specific\noptions in the configuration files of each one.\n\n`latexmk` has a gazillion of options.\nWe'll just skim over the most common ones here.\n\nFirst of all, one must pick the correct engine.\nAssuming you want to produce a PDF artifact, you have a few choices:\n\n```perl\n$pdf_mode = 1; # create PDF with pdflatex\n# $pdf_mode = 2; # create PDF with ps2pdf (via PS)\n# $pdf_mode = 3; # create PDF with dvipdf (via DVI)\n# $pdf_mode = 4; # create PDF with lualatex\n# $pdf_mode = 5; # create PDF with xelatex\n```\n\nThen, if your PDF previewer is not being detected, you might need to configure it.\nAssuming you want to use evince:\n\n```perl\n$pdf_previewer = 'start evince';\n```\n\nMost people won't probably need anything more than that.\nHowever, for further details read the documentation in the commandline with `man latexmk` or on [CTAN](https://ctan.mirror.garr.it/mirrors/ctan/support/latexmk/latexmk.txt)\n\n## Acknowledgements\n\n* Thanks to [@tetrapharmakon](https://github.com/tetrapharmakon) for being the first tester and user.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaolobrasolin%2Fmnogootex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpaolobrasolin%2Fmnogootex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaolobrasolin%2Fmnogootex/lists"}