{"id":13857205,"url":"https://github.com/msprev/panzer","last_synced_at":"2025-04-14T13:12:23.274Z","repository":{"id":16352767,"uuid":"19102749","full_name":"msprev/panzer","owner":"msprev","description":"pandoc + styles","archived":false,"fork":false,"pushed_at":"2019-02-12T13:22:12.000Z","size":737,"stargazers_count":160,"open_issues_count":4,"forks_count":15,"subscribers_count":9,"default_branch":"master","last_synced_at":"2024-10-19T11:14:22.757Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/msprev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-04-24T09:20:30.000Z","updated_at":"2024-09-23T18:32:42.000Z","dependencies_parsed_at":"2022-09-10T16:32:44.371Z","dependency_job_id":null,"html_url":"https://github.com/msprev/panzer","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msprev%2Fpanzer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msprev%2Fpanzer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msprev%2Fpanzer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msprev%2Fpanzer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/msprev","download_url":"https://codeload.github.com/msprev/panzer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248886325,"owners_count":21177644,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-08-05T03:01:29.915Z","updated_at":"2025-04-14T13:12:23.233Z","avatar_url":"https://github.com/msprev.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"-----\n\nDevelopment has ceased on panzer. Over the years, pandoc has gained\npowerful new functionality (e.g. the `--metadata-file` option and Lua\nfilters) that means that 90% of what can be done with panzer can be done\nwith pandoc and some simple wrapper scripts. I no longer use panzer in\nmy own workflow for this reason.\n\nIf you would like to take over development of panzer, let me know.\n\n-----\n\n# panzer\n\npanzer adds *styles* to\n[pandoc](http://johnmacfarlane.net/pandoc/index.html). Styles provide a\nway to set all options for a pandoc document with one line (‘I want this\ndocument be an article/CV/notes/letter’).\n\nYou can think of styles as a level up in abstraction from a pandoc\ntemplate. Styles are combinations of templates, metadata settings,\npandoc command line options, and instructions to run filters, scripts\nand postprocessors. These settings can be customised on a per writer and\nper document basis. Styles can be combined and can bear inheritance\nrelations to each other. panzer exposes a large amount of structured\ninformation to the external processes called by styles, allowing those\nprocesses to be both more powerful and themselves controllable via\nmetadata (and hence also by styles). Styles simplify makefiles, bundling\neverything related to the look of the document in one place.\n\nYou can think of panzer as an exoskeleton that sits around pandoc and\nconfigures pandoc based on a single choice in your document.\n\nTo use a style, add a field with your style name to the yaml metadata\nblock of your document:\n\n``` yaml\nstyle: Notes\n```\n\nMultiple styles can be supplied as a list:\n\n``` yaml\nstyle:\n  - Notes\n  - BoldHeadings\n```\n\nStyles are defined in a yaml file\n([example](https://github.com/msprev/dot-panzer/blob/master/styles/styles.yaml)).\nThe style definition file, plus associated executables, are placed in\nthe `.panzer` directory in the user’s home folder\n([example](https://github.com/msprev/dot-panzer)).\n\nA style can also be defined inside the document’s metadata block:\n\n``` yaml\n---\nstyle: Notes\nstyledef:\n  Notes:\n    all:\n      metadata:\n        numbersections: false\n    latex:\n      metadata:\n        numbersections: true\n        fontsize: 12pt\n      commandline:\n        columns: \"`75`\"\n      lua-filter:\n        - run: macroexpand.lua\n      filter:\n        - run: deemph.py\n...\n```\n\nStyle settings can be overridden by adding the appropriate field outside\na style definition in the document’s metadata block:\n\n``` yaml\n---\nstyle: Notes\nnumbersections: true\nfilter:\n  - run: smallcaps.py\ncommandline:\n  - pdf-engine: \"`xelatex`\"\n...\n```\n\n# Installation\n\n``` bash\npip3 install git+https://github.com/msprev/panzer\n```\n\n*Requirements:*\n\n  - [pandoc](http://johnmacfarlane.net/pandoc/index.html) \\\u003e 2.0\n  - [Python 3](https://www.python.org/downloads/)\n  - [pip](https://pip.pypa.io/en/stable/index.html) (included in most\n    Python 3 distributions)\n\n*To upgrade existing installation:*\n\n``` bash\npip3 install --upgrade git+https://github.com/msprev/panzer\n```\n\nOn Arch Linux systems, the AUR package\n[panzer-git](https://aur.archlinux.org/packages/panzer-git/) can be\nused.\n\n## Troubleshooting\n\nAn [issue](https://github.com/msprev/panzer/issues/20) has been reported\nusing pip to install on Windows. If the method above does not work, use\nthe alternative install method below.\n\n``` \n    git clone https://github.com/msprev/panzer\n    cd panzer\n    python3 setup.py install\n```\n\n*To upgrade existing installation:*\n\n``` \n    cd /path/to/panzer/directory/cloned\n    git pull\n    python3 setup.py install --force\n```\n\n# Use\n\nRun `panzer` on your document as you would `pandoc`. If the document\nlacks a `style` field, this is equivalent to running `pandoc`. If the\ndocument has a `style` field, panzer will invoke pandoc plus any\nassociated scripts, filters, and populate the appropriate metadata\nfields.\n\n`panzer` accepts the same command line options as `pandoc`. These\noptions are passed to the underlying instance of pandoc. pandoc command\nline options can also be set via metadata.\n\npanzer has additional command line options. These are prefixed by triple\ndashes (`---`). Run the command `panzer -h` to see them:\n\n``` \n  -h, --help, ---help, ---h\n                        show this help message and exit\n  -v, --version, ---version, ---v\n                        show program's version number and exit\n  ---quiet              only print errors and warnings\n  ---strict             exit on first error\n  ---panzer-support PANZER_SUPPORT\n                        panzer user data directory\n  ---pandoc PANDOC      pandoc executable\n  ---debug DEBUG        filename to write .log and .json debug files\n```\n\nPanzer expects all input and output to be utf-8.\n\n# Style definition\n\nA style definition may consist\nof:\n\n| field         | value                              | value type                    |\n| :------------ | :--------------------------------- | :---------------------------- |\n| `parent`      | parent(s) of style                 | `MetaList` or `MetaInlines`   |\n| `metadata`    | default metadata fields            | `MetaMap`                     |\n| `commandline` | pandoc command line options        | `MetaMap`                     |\n| `template`    | pandoc template                    | `MetaInlines` or `MetaString` |\n| `preflight`   | run before input doc is processed  | `MetaList`                    |\n| `filter`      | pandoc filters                     | `MetaList`                    |\n| `lua-filter`  | pandoc lua filters                 | `MetaList`                    |\n| `postprocess` | run on pandoc’s output             | `MetaList`                    |\n| `postflight`  | run after output file written      | `MetaList`                    |\n| `cleanup`     | run on exit irrespective of errors | `MetaList`                    |\n\nStyle definitions are hierarchically structured by *name* and *writer*.\nStyle names by convention should be MixedCase (`MyNotes`) to avoid\nconfusion with other metadata fields. Writer names are the same as those\nof the relevant pandoc writer (e.g. `latex`, `html`, `docx`, etc.) A\nspecial writer, `all`, matches every writer.\n\n  - `parent` takes a list or single style. Children inherit the\n    properties of their parents. Children may have multiple parents.\n\n  - `metadata` contains default metadata set by the style. Any metadata\n    field that can appear in a pandoc document can appear here.\n\n  - `commandline` specifies pandoc’s command line options.\n\n  - `template` is a pandoc\n    [template](http://johnmacfarlane.net/pandoc/demo/example9/templates.html)\n    for the style.\n\n  - `preflight` lists executables run before the document is processed.\n    These are run after panzer reads the input, but before that input is\n    sent to pandoc.\n\n  - `filter` lists pandoc [json\n    filters](http://johnmacfarlane.net/pandoc/scripting.html). Filters\n    gain two new properties from panzer. For more info, see section on\n    [compatibility](#compatibility) with pandoc.\n\n  - `lua-filter` lists pandoc [lua\n    filters](https://pandoc.org/lua-filters.html).\n\n  - `postprocessor` lists executable to pipe pandoc’s output through.\n    Standard unix executables (`sed`, `tr`, etc.) are examples of\n    possible use. Postprocessors are skipped if a binary writer\n    (e.g. `docx`) is used.\n\n  - `postflight` lists executables run after the output has been\n    written. If output is stdout, postflight scripts are run after\n    stdout has been flushed.\n\n  - `cleanup` lists executables run before panzer exits and after\n    postflight scripts. Cleanup scripts run irrespective of whether an\n    error has occurred earlier.\n\nExample:\n\n``` yaml\nNotes:\n  all:\n    metadata:\n      numbersections: false\n  latex:\n    metadata:\n      numbersections: true\n      fontsize: 12pt\n    commandline:\n      wrap: preserve\n    filter:\n      - run: deemph.py\n    postflight:\n      - run: latexmk.py\n```\n\nIf panzer were run on the following document with the latex writer\nselected,\n\n``` yaml\n---\ntitle: \"My document\"\nstyle: Notes\n...\n```\n\nit would run pandoc with filter `deemph.py` and command line option\n`--wrap=preserve` on the following and then execute `latexmk.py`.\n\n``` yaml\n---\ntitle: \"My document\"\nnumbersections: true\nfontsize: 12pt\n...\n```\n\n## Style overriding\n\nStyles may be defined:\n\n  - ‘Globally’ in `.yaml` files in `.panzer/styles/`\n  - ‘Locally’ in `.yaml` files in the current working directory\n    `./styles/`)\n  - ‘In document’ inside a `styledef` field in the document’s yaml\n    metadata block\n\nIf no `.panzer/styles/` directory is found, panzer will look for global\nstyle definitions in `.panzer/styles.yaml` if it exists. If no\n`./styles/` directory is found in the current working directory, panzer\nwill look for local style definitions in `./styles.yaml` if it exists.\n\nOverriding among style settings is determined by the following\nrules:\n\n| \\# | overriding rule                                                    |\n| :- | :----------------------------------------------------------------- |\n| 1  | Local style definitions override global style definitions          |\n| 2  | In document style definitions override local style definitions     |\n| 3  | Writer-specific settings override settings for `all`               |\n| 4  | In a list, later styles override earlier ones                      |\n| 5  | Children override parents                                          |\n| 6  | Fields set outside a style definition override any style’s setting |\n\nFor fields that pertain to scripts/filters, overriding is *additive*;\nfor other fields, it is *non-additive*:\n\n  - For `metadata`, `template`, and `commandline`, if one style\n    overrides another (say, a parent and child set `numbersections` to\n    different values), then inheritance is non-additive, and only one\n    (the child) wins.\n\n  - For `preflight`, `lua-filter`, `filter`, `postflight` and `cleanup`\n    if one style overrides another, then the ‘winner’ adds its items\n    after those of the ‘loser’. For example, if the parent adds to\n    `postflight` an item `-run: latexmk.py`, and the child adds `- run:\n    printlog.py`, then `printlog.py` will be run after `latexmk.py`\n\n  - To remove an item from an additive list, add it as the value of a\n    `kill` field: for example, `- kill: latexmk.py`\n\nArguments passed to panzer directly on the command line trump any style\nsettings, and cannot be overridden by any metadata setting. Filters\nspecified on the command line (via `--filter` and `--lua-filter`) are\nrun first, and cannot be removed. All lua filters are run after json\nfilters. pandoc options set via panzer’s command line invocation\noverride any set via `commandline`.\n\nMultiple input files are joined according to pandoc’s rules. Metadata\nare merged using left-biased union. This means overriding behaviour when\nmerging multiple input files is different from that of panzer, and\nalways non-additive.\n\nIf fed input from stdin, panzer buffers this to a temporary file in the\ncurrent working directory before proceeding. This is required to allow\npreflight scripts to access the data. The temporary file is removed when\npanzer exits.\n\n## The run list\n\nExecutables (scripts, filters, postprocessors) are specified by a list\n(the ‘run list’). The list determines what gets run when. Processes are\nexecuted from first to last in the run list. If an item appears as the\nvalue of a `run:` field, then it is added to the run list. If an item\nappears as the value of a `kill:` field, then any previous occurrence is\nremoved from the run list. Killing an item does not prevent it from\nbeing added later. A run list can be completely emptied by adding the\nspecial item `- killall: true`.\n\nArguments can be passed to executables by listing them as the value of\nthe `args` field of that item. The value of the `args` field is passed\nas the command line options to the external process. This value of\n`args` should be a quoted inline code span (e.g. ``\"`--options`\"``) to\nprevent the parser interpreting it as markdown. Note that json filters\nalways receive the writer name as their first argument.\n\nLua filters cannot take arguments and the contents of their `args` field\nis ignored.\n\nExample:\n\n``` yaml\n- filter:\n  - run: setbaseheader.py\n    args: \"`--level=2`\"\n- postprocess:\n  - run: sed\n    args: \"`-e 's/hello/goodbye/g'`\"\n- postflight:\n  - kill: open_pdf.py\n- cleanup:\n  - killall: true\n```\n\nThe filter `setbaseheader.py` receives the writer name as its first\nargument and `--level=2` as its second argument.\n\nWhen panzer is searching for a filter `foo.py`, it will look for:\n\n| \\# | look for                                        |\n| :- | :---------------------------------------------- |\n| 1  | `./foo.py`                                      |\n| 2  | `./filter/foo.py`                               |\n| 3  | `./filter/foo/foo.py`                           |\n| 4  | `~/.panzer/filter/foo.py`                       |\n| 5  | `~/.panzer/filter/foo/foo.py`                   |\n| 6  | `foo.py` in PATH defined by current environment |\n\nSimilar rules apply to other executables and to templates.\n\nThe typical structure for the support directory `.panzer` is:\n\n    .panzer/\n        cleanup/\n        filter/\n        lua-filter/\n        postflight/\n        postprocess/\n        preflight/\n        template/\n        shared/\n        styles/\n\nWithin each directory, each executable may have a named subdirectory:\n\n    postflight/\n        latexmk/\n            latexmk.py\n\n## Pandoc command line options\n\nArbitrary pandoc command line options can be set using metadata via\n`commandline`. `commandline` can appear outside a style definition and\nin a document’s metadata block, where it overrides the settings of any\nstyle.\n\n`commandline` contains one field for each pandoc command line option.\nThe field name is the unabbreviated name of the relevant pandoc command\nline option (e.g. `standalone`).\n\n  - For pandoc flags, the value should be boolean (`true`, `false`),\n    e.g. `standalone: true`.\n  - For pandoc key-values, the value should be a quoted inline code\n    span, e.g. ``include-in-header: \"`path/to/my/header`\"``.\n  - For pandoc repeated key-values, the value should be a list of inline\n    code spans, e.g.\n\n\u003c!-- end list --\u003e\n\n``` yaml\ncommandline:\n  include-in-header:\n    - \"`file1.txt`\"\n    - \"`file2.txt`\"\n    - \"`file3.txt`\"\n```\n\nRepeated key-value options in `comandline` are added after any provided\nfrom the command line. Overriding styles append to repeated key-value\nlists of the styles that they override.\n\n`false` plays a special role. `false` means that the pandoc command line\noption with the field’s name, if set, should be unset. `false` can be\nused for both flags and key-value options (e.g. `include-in-header:\nfalse`).\n\nExample:\n\n``` yaml\ncommandline:\n  standalone: true\n  slide-level: \"`3`\"\n  number-sections: false\n  include-in-header: false\n```\n\nThis passes the following options to pandoc `--standalone\n--slide-level=3` and removes any `--number-sections` and\n`--include-in-header=...` options.\n\nThese pandoc command line options cannot be set via `commandline`:\n\n  - `bash-completion`\n  - `dump-args`\n  - `filter`\n  - `from`\n  - `help`\n  - `ignore-args`\n  - `list-extensions`\n  - `list-highlight-languages`\n  - `list-highlight-styles`\n  - `list-input-formats`\n  - `list-output-formats`\n  - `lua-filter`\n  - `metadata`\n  - `output`\n  - `print-default-data-file`\n  - `print-default-template`\n  - `print-highlight-style`\n  - `read`\n  - `template`\n  - `to`\n  - `variable`\n  - `version`\n  - `write`\n\n# Passing messages to external processes\n\nExternal processes have just as much information as panzer does. panzer\nsends its information to external processes via a json message. This\nmessage is sent as a string over stdin to scripts (preflight,\npostflight, cleanup scripts). It is stored inside a `CodeBlock` of the\nAST for filters. Note that filters need to parse the `panzer_reserved`\nfield and deserialise the contents of its `CodeBlock` to recover the\njson message. Some relevant discussion is\n[here](https://github.com/msprev/panzer/issues/38#issuecomment-367664291).\nPostprocessors do not receive a json message (if you need it, you should\nprobably be using a filter).\n\n    JSON_MESSAGE = [{'metadata':    METADATA,\n                     'template':    TEMPLATE,\n                     'style':       STYLE,\n                     'stylefull':   STYLEFULL,\n                     'styledef':    STYLEDEF,\n                     'runlist':     RUNLIST,\n                     'options':     OPTIONS}]\n\n  - `METADATA` is a copy of the metadata branch of the document’s AST\n    (useful for scripts, not useful for filters)\n\n  - `TEMPLATE` is a string with path to the current template\n\n  - `STYLE` is a list of current style(s)\n\n  - `STYLEFULL` is a list of current style(s) including all parents,\n    grandparents, etc. in order of application\n\n  - `STYLEDEF` is a copy of all style definitions employed in document\n\n  - `RUNLIST` is a list of processes in the run list; it has the\n    following\n    structure:\n\n\u003c!-- end list --\u003e\n\n    RUNLIST = [{'kind':      'preflight'|'filter'|'lua-filter'|'postprocess'|'postflight'|'cleanup',\n                'command':   'my command',\n                'arguments': ['argument1', 'argument2', ...],\n                'status':    'queued'|'running'|'failed'|'done'\n               },\n                ...\n                ...\n              ]\n\n  - `OPTIONS` is a dictionary containing panzer’s and pandoc’s command\n    line options:\n\n\u003c!-- end list --\u003e\n\n``` python\nOPTIONS = {\n    'panzer': {\n        'panzer_support':  const.DEFAULT_SUPPORT_DIR,\n        'pandoc':          'pandoc',\n        'debug':           str(),\n        'quiet':           False,\n        'strict':          False,\n        'stdin_temp_file': str()   # tempfile used to buffer stdin\n    },\n    'pandoc': {\n        'input':      list(),      # list of input files\n        'output':     '-',         # output file; '-' is stdout\n        'pdf_output': False,       # if pandoc will write a .pdf\n        'read':       str(),       # reader\n        'write':      str(),       # writer\n        'options':    {'r': dict(), 'w': dict()}\n    }\n}\n```\n\n`options` contains the command line options with which pandoc is called.\nIt consists of two separate dictionaries. The dictionary under the `'r'`\nkey contains all pandoc options pertaining to reading the source\ndocuments to the AST. The dictionary under the `'w'` key contains all\npandoc options pertaining to writing the AST to the output document.\n\nScripts read the json message above by deserialising json input on\nstdin.\n\nFilters can read the json message by reading the metadata field,\n`panzer_reserved`, stored as a raw code block in the AST, and\ndeserialising the string `JSON_MESSAGE_STR` to recover the json:\n\n    panzer_reserved:\n      json_message: |\n        ``` {.json}\n        JSON_MESSAGE_STR\n        ```\n\n# Receiving messages from external processes\n\npanzer captures stderr output from all executables. This is for pretty\nprinting of info and errors. Scripts and filters should send json\nmessages to panzer via stderr. If a message is sent to stderr that is\nnot correctly formatted, panzer will print it verbatim prefixed by a\n‘\\!’.\n\nThe json message that panzer expects is a newline-separated sequence of\nutf-8 encoded json dictionaries, each with the following structure:\n\n    { 'level': LEVEL, 'message': MESSAGE }\n\n  - `LEVEL` is a string that sets the error level; it can take one of\n    the following values:\n    \n    ``` \n      'CRITICAL'\n      'ERROR'\n      'WARNING'\n      'INFO'\n      'DEBUG'\n      'NOTSET'\n    ```\n\n  - `MESSAGE` is a string with your message\n\n# Compatibility\n\npanzer accepts pandoc filters. panzer allows filters to behave in two\nnew ways:\n\n1.  Json filters can take more than one command line argument (first\n    argument still reserved for the writer).\n2.  A `panzer_reserved` field is added to the AST metadata branch with\n    goodies for filters to mine.\n\nFor pandoc, json filters and lua-filters are applied in the order\nspecified by respective occurances of `--filter` and `--lua-filter` on\nthe command line. This behaviour is not entirely supported in panzer.\nInstead, all json filters are applied first and in the order specified\non the command line and the style definition (command line filters are\napplied first and unkillable). Then the lua-filters are applied, also in\nthe order specified on the command line and by the style definition\n(command line filters are applied first and unkillable). The reasons for\nthe divergence with pandoc’s behaviour are complex but mainly derive\nfrom performance benefit.\n\nThe follow pandoc command line options cannot be used with panzer:\n\n  - `--bash-completion`\n  - `--dump-args`\n  - `--ignore-args`\n  - `--list-extensions`\n  - `--list-highlight-languages`\n  - `--list-highlight-styles`\n  - `--list-input-formats`\n  - `--list-output-formats`\n  - `--print-default-template`, `-D`\n  - `--print-default-data-file`\n  - `--version`, `-v`\n  - `--help`, `-h`\n\nThe following metadata fields are reserved for use by panzer:\n\n  - `styledef`\n  - `style`\n  - `template`\n  - `preflight`\n  - `filter`\n  - `lua-filter`\n  - `postflight`\n  - `postprocess`\n  - `cleanup`\n  - `commandline`\n  - `panzer_reserved`\n  - `read`\n\nThe writer name `all` is also occupied.\n\n# Known issues\n\nPull requests welcome:\n\n  - Slower than I would like (calls to subprocess slow in Python)\n  - Calls to subprocesses (scripts, filters, etc.) block ui\n  - [Possible issue under\n    Windows](https://github.com/msprev/panzer/pull/9), so far reported\n    by only one user. A leading dot plus slash is required on filter\n    filenames. Rather than having `- run: foo.bar`, on Windows one needs\n    to have `- run: ./foo.bar`. More information on this is welcome. I\n    am happy to fix compatibility problems under Windows.\n\n# FAQ\n\n1.  Why do I get the error `[Errno 13] Permission denied`? Filters and\n    scripts must be executable. Vanilla pandoc allows filters to be run\n    without their executable permission set. panzer does not allow this.\n    The solution: set the executable permission of your filter or\n    script, `chmod +x myfilter_name.py` For more, see\n    [here](https://github.com/msprev/panzer/issues/22).\n\n2.  Does panzer expand `~` or `*` inside field of a style definition?\n    panzer does not do any shell expansion/globbing inside a style\n    definition. The reason is described\n    [here](https://github.com/msprev/panzer/issues/23). TL;DR: expansion\n    and globbing are messy and not something that panzer is in a\n    position to do correctly or predictably inside a style definition.\n    You need to use the full path to reference your home directory\n    inside a style definition.\n\n# Similar\n\n  - \u003chttps://github.com/mb21/panrun\u003e\n  - \u003chttps://github.com/htdebeer/pandocomatic\u003e\n  - \u003chttps://github.com/balachia/panopy\u003e\n  - \u003chttps://github.com/phyllisstein/pandown\u003e\n\n# Release notes\n\n  - 1.4.1 (22 February 2018):\n      - improved support of lua filters thanks to feedback from\n        [jzeneto](https://github.com/jzeneto)\n  - 1.4 (20 February 2018):\n      - support added for lua filters\n  - 1.3.1 (18 December 2017):\n      - updated for pandoc 2.0.5\n        [\\#35](https://github.com/msprev/panzer/issues/34). Support for\n        all changes to command line interface and `pptx` writer.\n  - 1.3 (7 November 2017):\n      - updated for pandoc 2.0\n        [\\#31](https://github.com/msprev/panzer/issues/31). Please note\n        that this version of panzer *breaks compatibility with versions\n        of pandoc earlier than 2.0*. Please upgrade to a version of\n        pandoc \\\u003e2.0. Versions of pandoc prior to 2.0 will no longer be\n        supported in future releases of panzer.\n  - 1.2 (12 January 2017):\n      - fixed issue introduced by breaking change in panzer 1.1\n        [\\#27](https://github.com/msprev/panzer/issues/27). Added panzer\n        compatibility mode for pandoc versions \\\u003c1.18. All version of\n        pandoc \\\u003e1.12.1 should work with panzer now.\n  - 1.1 (27 October 2016):\n      - breaking change: support pandoc 1.18’s new api; earlier versions\n        of pandoc will not work\n  - 1.0 (21 July 2015):\n      - new: `---strict` panzer command line option:\n        [\\#10](https://github.com/msprev/panzer/issues/10)\n      - new: `commandline` allows repeated options using lists:\n        [\\#3](https://github.com/msprev/panzer/issues/3)\n      - new: `commandline` lists behave as additive in style\n        inheritance: [\\#6](https://github.com/msprev/panzer/issues/6)\n      - new: support multiple yaml style definition files:\n        [\\#4](https://github.com/msprev/panzer/issues/4)\n      - new: support local yaml style definition files:\n        [\\#4](https://github.com/msprev/panzer/issues/4)\n      - new: simplify format for panzer’s json message:\n        [ce2a12](https://github.com/msprev/panzer/commit/f3a6cc28b78957827cb572e254977c2344ce2a12)\n      - new: reproduce pandoc’s reader depending on writer settings:\n        [\\#1](https://github.com/msprev/panzer/issues/1),\n        [\\#7](https://github.com/msprev/panzer/issues/7)\n      - fix: refactor `commandline` implementation:\n        [\\#1](https://github.com/msprev/panzer/issues/1)\n      - fix: improve documentation:\n        [\\#2](https://github.com/msprev/panzer/issues/2)\n      - fix: unicode error in `setup.py`:\n        [\\#12](https://github.com/msprev/panzer/issues/12)\n      - fix: support yaml style definition files without closing empty\n        line: [\\#13](https://github.com/msprev/panzer/issues/13)\n      - fix: add `.gitignore` files to repository:\n        [PR\\#1](https://github.com/msprev/panzer/pull/9)\n  - 1.0b2 (23 May 2015):\n      - new: `commandline` - set arbitrary pandoc command line options\n        via metadata\n  - 1.0b1 (14 May 2015):\n      - initial release\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmsprev%2Fpanzer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmsprev%2Fpanzer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmsprev%2Fpanzer/lists"}