From e11a34ebeb96a1e568cc937df3b614062ddb0adf Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 19 Feb 2024 03:01:14 +0000 Subject: CTAN sync 202402190301 --- FILES.byname | 2667 +- FILES.byname.gz | Bin 2636545 -> 2636606 bytes FILES.last07days | 1526 +- biblio/ctan-bibdata/ctan.bib | 29 +- macros/generic/markdown/CHANGES.md | 334 +- macros/generic/markdown/README.md | 110 +- macros/generic/markdown/VERSION | 2 +- macros/generic/markdown/docstrip.cfg | 8 +- macros/generic/markdown/examples/context-mkiv.tex | 6 +- macros/generic/markdown/examples/example.md | 16 +- macros/generic/markdown/examples/latex-luatex.tex | 16 +- macros/generic/markdown/examples/latex-pdftex.tex | 10 +- macros/generic/markdown/examples/optex.tex | 379 + .../markdown/libraries/markdown-tinyyaml.lua | 4 +- macros/generic/markdown/markdown.dtx | 32604 +++++++++++-------- macros/generic/markdown/markdown.html | 13625 ++++---- macros/generic/markdown/markdown.ins | 11 +- macros/generic/markdown/markdown.pdf | Bin 1011455 -> 1089321 bytes macros/jptex/latex/jlreq-deluxe/LICENSE | 2 +- macros/jptex/latex/jlreq-deluxe/README-ja.md | 2 + macros/jptex/latex/jlreq-deluxe/README.md | 2 + macros/jptex/latex/jlreq-deluxe/jlreq-deluxe.pdf | Bin 63709 -> 64005 bytes macros/jptex/latex/jlreq-deluxe/jlreq-deluxe.sty | 4 +- macros/jptex/latex/jlreq-deluxe/jlreq-deluxe.tex | 2 +- .../jlreq-deluxe/tfm/bjlreq--upexpgothb-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpgothb-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpgothbn-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpgothbn-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpgotheb-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpgotheb-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpgothebn-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpgothebn-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpgothr-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpgothr-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpgothrn-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpgothrn-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpmgothr-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpmgothr-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpmgothrn-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpmgothrn-v.tfm | Bin 2332 -> 2668 bytes .../latex/jlreq-deluxe/tfm/bjlreq--upexpminb-h.tfm | Bin 2332 -> 2668 bytes .../latex/jlreq-deluxe/tfm/bjlreq--upexpminb-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpminbn-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpminbn-v.tfm | Bin 2332 -> 2668 bytes .../latex/jlreq-deluxe/tfm/bjlreq--upexpminl-h.tfm | Bin 2332 -> 2668 bytes .../latex/jlreq-deluxe/tfm/bjlreq--upexpminl-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpminln-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpminln-v.tfm | Bin 2332 -> 2668 bytes .../latex/jlreq-deluxe/tfm/bjlreq--upexpminr-h.tfm | Bin 2332 -> 2668 bytes .../latex/jlreq-deluxe/tfm/bjlreq--upexpminr-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpminrn-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upexpminrn-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlgothb-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlgothb-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlgothbn-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlgothbn-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlgotheb-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlgotheb-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlgothebn-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlgothebn-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlgothr-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlgothr-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlgothrn-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlgothrn-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlmgothr-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlmgothr-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlmgothrn-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlmgothrn-v.tfm | Bin 2332 -> 2668 bytes .../latex/jlreq-deluxe/tfm/bjlreq--upnmlminb-h.tfm | Bin 2332 -> 2668 bytes .../latex/jlreq-deluxe/tfm/bjlreq--upnmlminb-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlminbn-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlminbn-v.tfm | Bin 2332 -> 2668 bytes .../latex/jlreq-deluxe/tfm/bjlreq--upnmlminl-h.tfm | Bin 2332 -> 2668 bytes .../latex/jlreq-deluxe/tfm/bjlreq--upnmlminl-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlminln-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlminln-v.tfm | Bin 2332 -> 2668 bytes .../latex/jlreq-deluxe/tfm/bjlreq--upnmlminr-h.tfm | Bin 2332 -> 2668 bytes .../latex/jlreq-deluxe/tfm/bjlreq--upnmlminr-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlminrn-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--upnmlminrn-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--uprubygothb-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--uprubygothb-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--uprubygotheb-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--uprubygotheb-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--uprubygothr-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--uprubygothr-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--uprubymgothr-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--uprubymgothr-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--uprubyminb-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--uprubyminb-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--uprubyminl-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--uprubyminl-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--uprubyminr-h.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bjlreq--uprubyminr-v.tfm | Bin 2332 -> 2668 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpgothb-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpgothb-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpgothbn-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpgothbn-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpgotheb-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpgotheb-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpgothebn-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpgothebn-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpgothr-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpgothr-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpgothrn-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpgothrn-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpmgothr-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpmgothr-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpmgothrn-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpmgothrn-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpminb-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpminb-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpminbn-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpminbn-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpminl-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpminl-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpminln-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpminln-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpminr-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpminr-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpminrn-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upexpminrn-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlgothb-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlgothb-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlgothbn-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlgothbn-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlgotheb-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlgotheb-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlgothebn-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlgothebn-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlgothr-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlgothr-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlgothrn-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlgothrn-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlmgothr-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlmgothr-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlmgothrn-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlmgothrn-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlminb-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlminb-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlminbn-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlminbn-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlminl-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlminl-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlminln-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlminln-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlminr-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlminr-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlminrn-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--upnmlminrn-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--uprubygothb-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--uprubygothb-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--uprubygotheb-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--uprubygotheb-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--uprubygothr-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--uprubygothr-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--uprubymgothr-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--uprubymgothr-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--uprubyminb-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--uprubyminb-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--uprubyminl-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--uprubyminl-v.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--uprubyminr-h.tfm | Bin 2368 -> 2704 bytes .../jlreq-deluxe/tfm/bzjlreq--uprubyminr-v.tfm | Bin 2368 -> 2704 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpgothb-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpgothb-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upexpgothbn-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upexpgothbn-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upexpgotheb-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upexpgotheb-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upexpgothebn-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upexpgothebn-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpgothr-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpgothr-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upexpgothrn-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upexpgothrn-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upexpmgothr-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upexpmgothr-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upexpmgothrn-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upexpmgothrn-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpminb-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpminb-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpminbn-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpminbn-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpminl-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpminl-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpminln-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpminln-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpminr-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpminr-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpminrn-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upexpminrn-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlgothb-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlgothb-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upnmlgothbn-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upnmlgothbn-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upnmlgotheb-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upnmlgotheb-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upnmlgothebn-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upnmlgothebn-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlgothr-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlgothr-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upnmlgothrn-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upnmlgothrn-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upnmlmgothr-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upnmlmgothr-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upnmlmgothrn-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--upnmlmgothrn-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlminb-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlminb-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlminbn-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlminbn-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlminl-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlminl-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlminln-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlminln-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlminr-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlminr-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlminrn-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--upnmlminrn-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--uprubygothb-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--uprubygothb-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--uprubygotheb-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--uprubygotheb-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--uprubygothr-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--uprubygothr-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--uprubymgothr-h.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/jlreq--uprubymgothr-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--uprubyminb-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--uprubyminb-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--uprubyminl-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--uprubyminl-v.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--uprubyminr-h.tfm | Bin 2304 -> 2640 bytes .../latex/jlreq-deluxe/tfm/jlreq--uprubyminr-v.tfm | Bin 2304 -> 2640 bytes .../jlreq-deluxe/tfm/zjlreq--upexpgothb-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpgothb-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpgothbn-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpgothbn-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpgotheb-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpgotheb-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpgothebn-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpgothebn-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpgothr-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpgothr-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpgothrn-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpgothrn-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpmgothr-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpmgothr-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpmgothrn-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpmgothrn-v.tfm | Bin 2340 -> 2676 bytes .../latex/jlreq-deluxe/tfm/zjlreq--upexpminb-h.tfm | Bin 2340 -> 2676 bytes .../latex/jlreq-deluxe/tfm/zjlreq--upexpminb-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpminbn-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpminbn-v.tfm | Bin 2340 -> 2676 bytes .../latex/jlreq-deluxe/tfm/zjlreq--upexpminl-h.tfm | Bin 2340 -> 2676 bytes .../latex/jlreq-deluxe/tfm/zjlreq--upexpminl-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpminln-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpminln-v.tfm | Bin 2340 -> 2676 bytes .../latex/jlreq-deluxe/tfm/zjlreq--upexpminr-h.tfm | Bin 2340 -> 2676 bytes .../latex/jlreq-deluxe/tfm/zjlreq--upexpminr-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpminrn-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upexpminrn-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlgothb-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlgothb-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlgothbn-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlgothbn-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlgotheb-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlgotheb-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlgothebn-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlgothebn-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlgothr-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlgothr-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlgothrn-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlgothrn-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlmgothr-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlmgothr-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlmgothrn-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlmgothrn-v.tfm | Bin 2340 -> 2676 bytes .../latex/jlreq-deluxe/tfm/zjlreq--upnmlminb-h.tfm | Bin 2340 -> 2676 bytes .../latex/jlreq-deluxe/tfm/zjlreq--upnmlminb-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlminbn-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlminbn-v.tfm | Bin 2340 -> 2676 bytes .../latex/jlreq-deluxe/tfm/zjlreq--upnmlminl-h.tfm | Bin 2340 -> 2676 bytes .../latex/jlreq-deluxe/tfm/zjlreq--upnmlminl-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlminln-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlminln-v.tfm | Bin 2340 -> 2676 bytes .../latex/jlreq-deluxe/tfm/zjlreq--upnmlminr-h.tfm | Bin 2340 -> 2676 bytes .../latex/jlreq-deluxe/tfm/zjlreq--upnmlminr-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlminrn-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--upnmlminrn-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--uprubygothb-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--uprubygothb-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--uprubygotheb-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--uprubygotheb-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--uprubygothr-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--uprubygothr-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--uprubymgothr-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--uprubymgothr-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--uprubyminb-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--uprubyminb-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--uprubyminl-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--uprubyminl-v.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--uprubyminr-h.tfm | Bin 2340 -> 2676 bytes .../jlreq-deluxe/tfm/zjlreq--uprubyminr-v.tfm | Bin 2340 -> 2676 bytes .../latex/jlreq-deluxe/vf/bjlreq--upexpgothb-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/bjlreq--upexpgothbn-v.vf | Bin 3848 -> 5108 bytes .../latex/jlreq-deluxe/vf/bjlreq--upexpgotheb-v.vf | Bin 3848 -> 5108 bytes .../jlreq-deluxe/vf/bjlreq--upexpgothebn-v.vf | Bin 3848 -> 5108 bytes .../latex/jlreq-deluxe/vf/bjlreq--upexpgothr-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/bjlreq--upexpgothrn-v.vf | Bin 3848 -> 5108 bytes .../latex/jlreq-deluxe/vf/bjlreq--upexpmgothr-v.vf | Bin 3848 -> 5108 bytes .../jlreq-deluxe/vf/bjlreq--upexpmgothrn-v.vf | Bin 3848 -> 5108 bytes .../latex/jlreq-deluxe/vf/bjlreq--upexpminb-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/bjlreq--upexpminbn-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/bjlreq--upexpminl-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/bjlreq--upexpminln-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/bjlreq--upexpminr-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/bjlreq--upexpminrn-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/bjlreq--upnmlgothb-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/bjlreq--upnmlgothbn-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/bjlreq--upnmlgotheb-v.vf | Bin 472 -> 1732 bytes .../jlreq-deluxe/vf/bjlreq--upnmlgothebn-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/bjlreq--upnmlgothr-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/bjlreq--upnmlgothrn-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/bjlreq--upnmlmgothr-v.vf | Bin 472 -> 1732 bytes .../jlreq-deluxe/vf/bjlreq--upnmlmgothrn-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/bjlreq--upnmlminb-v.vf | Bin 468 -> 1728 bytes .../latex/jlreq-deluxe/vf/bjlreq--upnmlminbn-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/bjlreq--upnmlminl-v.vf | Bin 468 -> 1728 bytes .../latex/jlreq-deluxe/vf/bjlreq--upnmlminln-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/bjlreq--upnmlminr-v.vf | Bin 468 -> 1728 bytes .../latex/jlreq-deluxe/vf/bjlreq--upnmlminrn-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/bjlreq--uprubygothb-v.vf | Bin 3844 -> 5104 bytes .../jlreq-deluxe/vf/bjlreq--uprubygotheb-v.vf | Bin 3848 -> 5108 bytes .../latex/jlreq-deluxe/vf/bjlreq--uprubygothr-v.vf | Bin 3844 -> 5104 bytes .../jlreq-deluxe/vf/bjlreq--uprubymgothr-v.vf | Bin 3848 -> 5108 bytes .../latex/jlreq-deluxe/vf/bjlreq--uprubyminb-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/bjlreq--uprubyminl-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/bjlreq--uprubyminr-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upexpgothb-v.vf | Bin 3536 -> 4796 bytes .../jlreq-deluxe/vf/bzjlreq--upexpgothbn-v.vf | Bin 3536 -> 4796 bytes .../jlreq-deluxe/vf/bzjlreq--upexpgotheb-v.vf | Bin 3536 -> 4796 bytes .../jlreq-deluxe/vf/bzjlreq--upexpgothebn-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upexpgothr-v.vf | Bin 3536 -> 4796 bytes .../jlreq-deluxe/vf/bzjlreq--upexpgothrn-v.vf | Bin 3536 -> 4796 bytes .../jlreq-deluxe/vf/bzjlreq--upexpmgothr-v.vf | Bin 3536 -> 4796 bytes .../jlreq-deluxe/vf/bzjlreq--upexpmgothrn-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upexpminb-v.vf | Bin 3532 -> 4792 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upexpminbn-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upexpminl-v.vf | Bin 3532 -> 4792 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upexpminln-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upexpminr-v.vf | Bin 3532 -> 4792 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upexpminrn-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upnmlgothb-v.vf | Bin 160 -> 1420 bytes .../jlreq-deluxe/vf/bzjlreq--upnmlgothbn-v.vf | Bin 160 -> 1420 bytes .../jlreq-deluxe/vf/bzjlreq--upnmlgotheb-v.vf | Bin 160 -> 1420 bytes .../jlreq-deluxe/vf/bzjlreq--upnmlgothebn-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upnmlgothr-v.vf | Bin 160 -> 1420 bytes .../jlreq-deluxe/vf/bzjlreq--upnmlgothrn-v.vf | Bin 160 -> 1420 bytes .../jlreq-deluxe/vf/bzjlreq--upnmlmgothr-v.vf | Bin 160 -> 1420 bytes .../jlreq-deluxe/vf/bzjlreq--upnmlmgothrn-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upnmlminb-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upnmlminbn-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upnmlminl-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upnmlminln-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upnmlminr-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/bzjlreq--upnmlminrn-v.vf | Bin 160 -> 1420 bytes .../jlreq-deluxe/vf/bzjlreq--uprubygothb-v.vf | Bin 3536 -> 4796 bytes .../jlreq-deluxe/vf/bzjlreq--uprubygotheb-v.vf | Bin 3536 -> 4796 bytes .../jlreq-deluxe/vf/bzjlreq--uprubygothr-v.vf | Bin 3536 -> 4796 bytes .../jlreq-deluxe/vf/bzjlreq--uprubymgothr-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/bzjlreq--uprubyminb-v.vf | Bin 3532 -> 4792 bytes .../latex/jlreq-deluxe/vf/bzjlreq--uprubyminl-v.vf | Bin 3532 -> 4792 bytes .../latex/jlreq-deluxe/vf/bzjlreq--uprubyminr-v.vf | Bin 3532 -> 4792 bytes .../latex/jlreq-deluxe/vf/jlreq--upexpgothb-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/jlreq--upexpgothbn-v.vf | Bin 3848 -> 5108 bytes .../latex/jlreq-deluxe/vf/jlreq--upexpgotheb-v.vf | Bin 3848 -> 5108 bytes .../latex/jlreq-deluxe/vf/jlreq--upexpgothebn-v.vf | Bin 3848 -> 5108 bytes .../latex/jlreq-deluxe/vf/jlreq--upexpgothr-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/jlreq--upexpgothrn-v.vf | Bin 3848 -> 5108 bytes .../latex/jlreq-deluxe/vf/jlreq--upexpmgothr-v.vf | Bin 3848 -> 5108 bytes .../latex/jlreq-deluxe/vf/jlreq--upexpmgothrn-v.vf | Bin 3848 -> 5108 bytes .../latex/jlreq-deluxe/vf/jlreq--upexpminb-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/jlreq--upexpminbn-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/jlreq--upexpminl-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/jlreq--upexpminln-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/jlreq--upexpminr-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/jlreq--upexpminrn-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/jlreq--upnmlgothb-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/jlreq--upnmlgothbn-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/jlreq--upnmlgotheb-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/jlreq--upnmlgothebn-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/jlreq--upnmlgothr-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/jlreq--upnmlgothrn-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/jlreq--upnmlmgothr-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/jlreq--upnmlmgothrn-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/jlreq--upnmlminb-v.vf | Bin 468 -> 1728 bytes .../latex/jlreq-deluxe/vf/jlreq--upnmlminbn-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/jlreq--upnmlminl-v.vf | Bin 468 -> 1728 bytes .../latex/jlreq-deluxe/vf/jlreq--upnmlminln-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/jlreq--upnmlminr-v.vf | Bin 468 -> 1728 bytes .../latex/jlreq-deluxe/vf/jlreq--upnmlminrn-v.vf | Bin 472 -> 1732 bytes .../latex/jlreq-deluxe/vf/jlreq--uprubygothb-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/jlreq--uprubygotheb-v.vf | Bin 3848 -> 5108 bytes .../latex/jlreq-deluxe/vf/jlreq--uprubygothr-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/jlreq--uprubymgothr-v.vf | Bin 3848 -> 5108 bytes .../latex/jlreq-deluxe/vf/jlreq--uprubyminb-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/jlreq--uprubyminl-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/jlreq--uprubyminr-v.vf | Bin 3844 -> 5104 bytes .../latex/jlreq-deluxe/vf/zjlreq--upexpgothb-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/zjlreq--upexpgothbn-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/zjlreq--upexpgotheb-v.vf | Bin 3536 -> 4796 bytes .../jlreq-deluxe/vf/zjlreq--upexpgothebn-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/zjlreq--upexpgothr-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/zjlreq--upexpgothrn-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/zjlreq--upexpmgothr-v.vf | Bin 3536 -> 4796 bytes .../jlreq-deluxe/vf/zjlreq--upexpmgothrn-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/zjlreq--upexpminb-v.vf | Bin 3532 -> 4792 bytes .../latex/jlreq-deluxe/vf/zjlreq--upexpminbn-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/zjlreq--upexpminl-v.vf | Bin 3532 -> 4792 bytes .../latex/jlreq-deluxe/vf/zjlreq--upexpminln-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/zjlreq--upexpminr-v.vf | Bin 3532 -> 4792 bytes .../latex/jlreq-deluxe/vf/zjlreq--upexpminrn-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/zjlreq--upnmlgothb-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/zjlreq--upnmlgothbn-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/zjlreq--upnmlgotheb-v.vf | Bin 160 -> 1420 bytes .../jlreq-deluxe/vf/zjlreq--upnmlgothebn-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/zjlreq--upnmlgothr-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/zjlreq--upnmlgothrn-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/zjlreq--upnmlmgothr-v.vf | Bin 160 -> 1420 bytes .../jlreq-deluxe/vf/zjlreq--upnmlmgothrn-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/zjlreq--upnmlminb-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/zjlreq--upnmlminbn-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/zjlreq--upnmlminl-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/zjlreq--upnmlminln-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/zjlreq--upnmlminr-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/zjlreq--upnmlminrn-v.vf | Bin 160 -> 1420 bytes .../latex/jlreq-deluxe/vf/zjlreq--uprubygothb-v.vf | Bin 3536 -> 4796 bytes .../jlreq-deluxe/vf/zjlreq--uprubygotheb-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/zjlreq--uprubygothr-v.vf | Bin 3536 -> 4796 bytes .../jlreq-deluxe/vf/zjlreq--uprubymgothr-v.vf | Bin 3536 -> 4796 bytes .../latex/jlreq-deluxe/vf/zjlreq--uprubyminb-v.vf | Bin 3532 -> 4792 bytes .../latex/jlreq-deluxe/vf/zjlreq--uprubyminl-v.vf | Bin 3532 -> 4792 bytes .../latex/jlreq-deluxe/vf/zjlreq--uprubyminr-v.vf | Bin 3532 -> 4792 bytes macros/latex/contrib/easybook/easybook.dtx | 109 +- macros/latex/contrib/easybook/easybook.pdf | Bin 598997 -> 602008 bytes macros/latex/contrib/easybook/easybook.tex | 59 +- macros/latex/contrib/l3kernel/CHANGELOG.md | 12 +- macros/latex/contrib/l3kernel/README.md | 2 +- macros/latex/contrib/l3kernel/expl3.dtx | 4 +- macros/latex/contrib/l3kernel/expl3.pdf | Bin 610363 -> 610339 bytes macros/latex/contrib/l3kernel/interface3.pdf | Bin 1792513 -> 1793104 bytes macros/latex/contrib/l3kernel/interface3.tex | 2 +- macros/latex/contrib/l3kernel/l3basics.dtx | 24 +- macros/latex/contrib/l3kernel/l3bitset.dtx | 2 +- macros/latex/contrib/l3kernel/l3bootstrap.dtx | 2 +- macros/latex/contrib/l3kernel/l3box.dtx | 2 +- macros/latex/contrib/l3kernel/l3cctab.dtx | 2 +- macros/latex/contrib/l3kernel/l3clist.dtx | 2 +- macros/latex/contrib/l3kernel/l3coffins.dtx | 2 +- macros/latex/contrib/l3kernel/l3color.dtx | 2 +- macros/latex/contrib/l3kernel/l3debug.dtx | 6 +- macros/latex/contrib/l3kernel/l3deprecation.dtx | 6 +- macros/latex/contrib/l3kernel/l3doc.dtx | 4 +- macros/latex/contrib/l3kernel/l3doc.pdf | Bin 565282 -> 565548 bytes macros/latex/contrib/l3kernel/l3docstrip.dtx | 2 +- macros/latex/contrib/l3kernel/l3docstrip.pdf | Bin 151264 -> 151219 bytes macros/latex/contrib/l3kernel/l3expan.dtx | 2 +- macros/latex/contrib/l3kernel/l3file.dtx | 2 +- macros/latex/contrib/l3kernel/l3flag.dtx | 10 +- macros/latex/contrib/l3kernel/l3fp-assign.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp-aux.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp-basics.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp-convert.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp-expo.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp-extended.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp-functions.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp-logic.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp-parse.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp-random.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp-round.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp-symbolic.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp-traps.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp-trig.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp-types.dtx | 2 +- macros/latex/contrib/l3kernel/l3fp.dtx | 2 +- macros/latex/contrib/l3kernel/l3fparray.dtx | 2 +- macros/latex/contrib/l3kernel/l3int.dtx | 2 +- macros/latex/contrib/l3kernel/l3intarray.dtx | 2 +- .../latex/contrib/l3kernel/l3kernel-functions.dtx | 4 +- macros/latex/contrib/l3kernel/l3keys.dtx | 2 +- macros/latex/contrib/l3kernel/l3legacy.dtx | 2 +- macros/latex/contrib/l3kernel/l3luatex.dtx | 2 +- macros/latex/contrib/l3kernel/l3msg.dtx | 2 +- macros/latex/contrib/l3kernel/l3names.dtx | 2 +- macros/latex/contrib/l3kernel/l3news.pdf | Bin 396222 -> 396222 bytes macros/latex/contrib/l3kernel/l3news01.pdf | Bin 122959 -> 122959 bytes macros/latex/contrib/l3kernel/l3news02.pdf | Bin 150919 -> 150919 bytes macros/latex/contrib/l3kernel/l3news03.pdf | Bin 148747 -> 148747 bytes macros/latex/contrib/l3kernel/l3news04.pdf | Bin 114754 -> 114754 bytes macros/latex/contrib/l3kernel/l3news05.pdf | Bin 112524 -> 112524 bytes macros/latex/contrib/l3kernel/l3news06.pdf | Bin 151591 -> 151591 bytes macros/latex/contrib/l3kernel/l3news07.pdf | Bin 128344 -> 128344 bytes macros/latex/contrib/l3kernel/l3news08.pdf | Bin 163484 -> 163484 bytes macros/latex/contrib/l3kernel/l3news09.pdf | Bin 250159 -> 250159 bytes macros/latex/contrib/l3kernel/l3news10.pdf | Bin 150302 -> 150302 bytes macros/latex/contrib/l3kernel/l3news11.pdf | Bin 170102 -> 170102 bytes macros/latex/contrib/l3kernel/l3news12.pdf | Bin 205020 -> 205020 bytes macros/latex/contrib/l3kernel/l3pdf.dtx | 2 +- macros/latex/contrib/l3kernel/l3prefixes.csv | 4 +- macros/latex/contrib/l3kernel/l3prefixes.pdf | Bin 82731 -> 82720 bytes macros/latex/contrib/l3kernel/l3prg.dtx | 2 +- macros/latex/contrib/l3kernel/l3prop.dtx | 4 +- macros/latex/contrib/l3kernel/l3quark.dtx | 2 +- macros/latex/contrib/l3kernel/l3regex.dtx | 2 +- macros/latex/contrib/l3kernel/l3seq.dtx | 2 +- macros/latex/contrib/l3kernel/l3skip.dtx | 2 +- macros/latex/contrib/l3kernel/l3sort.dtx | 2 +- macros/latex/contrib/l3kernel/l3str-convert.dtx | 2 +- macros/latex/contrib/l3kernel/l3str.dtx | 2 +- macros/latex/contrib/l3kernel/l3styleguide.pdf | Bin 296657 -> 296530 bytes macros/latex/contrib/l3kernel/l3styleguide.tex | 2 +- macros/latex/contrib/l3kernel/l3syntax-changes.pdf | Bin 231496 -> 231378 bytes macros/latex/contrib/l3kernel/l3syntax-changes.tex | 2 +- macros/latex/contrib/l3kernel/l3sys.dtx | 2 +- macros/latex/contrib/l3kernel/l3term-glossary.pdf | Bin 242296 -> 242164 bytes macros/latex/contrib/l3kernel/l3term-glossary.tex | 2 +- macros/latex/contrib/l3kernel/l3text-case.dtx | 2 +- macros/latex/contrib/l3kernel/l3text-map.dtx | 2 +- macros/latex/contrib/l3kernel/l3text-purify.dtx | 2 +- macros/latex/contrib/l3kernel/l3text.dtx | 2 +- macros/latex/contrib/l3kernel/l3tl-analysis.dtx | 79 +- macros/latex/contrib/l3kernel/l3tl-build.dtx | 2 +- macros/latex/contrib/l3kernel/l3tl.dtx | 2 +- macros/latex/contrib/l3kernel/l3token.dtx | 6 +- macros/latex/contrib/l3kernel/l3unicode.dtx | 2 +- macros/latex/contrib/l3kernel/source3.pdf | Bin 7574815 -> 7556690 bytes macros/latex/contrib/l3kernel/source3.tex | 2 +- macros/latex/contrib/l3packages/CHANGELOG.md | 8 +- macros/latex/contrib/l3packages/README.md | 2 +- macros/latex/contrib/l3packages/l3keys2e.dtx | 4 +- macros/latex/contrib/l3packages/l3keys2e.pdf | Bin 412717 -> 412694 bytes macros/latex/contrib/l3packages/xfp.dtx | 4 +- macros/latex/contrib/l3packages/xfp.pdf | Bin 332421 -> 332379 bytes macros/latex/contrib/l3packages/xparse.dtx | 4 +- macros/latex/contrib/l3packages/xparse.pdf | Bin 534182 -> 534131 bytes macros/latex/contrib/l3packages/xtemplate.dtx | 10 +- macros/latex/contrib/l3packages/xtemplate.pdf | Bin 448106 -> 448820 bytes .../latex/contrib/randexam/randexam-a-answer.pdf | Bin 49588 -> 49886 bytes .../latex/contrib/randexam/randexam-a-answer.tex | 10 +- macros/latex/contrib/randexam/randexam-a-blank.pdf | Bin 41374 -> 41751 bytes .../latex/contrib/randexam/randexam-b-answer.pdf | Bin 49570 -> 49948 bytes macros/latex/contrib/randexam/randexam-b-blank.pdf | Bin 41309 -> 41687 bytes macros/latex/contrib/randexam/randexam.cls | 423 +- macros/latex/contrib/randexam/randexam.pdf | Bin 52431 -> 63636 bytes macros/latex/contrib/randexam/randexam.tex | 142 +- macros/latex/contrib/sjtutex/README.md | 31 + macros/latex/contrib/sjtutex/sjtu-vi-badge-red.pdf | Bin 0 -> 20101 bytes .../contrib/sjtutex/sjtu-vi-badge-small-red.pdf | Bin 0 -> 20011 bytes macros/latex/contrib/sjtutex/sjtu-vi-logo-red.pdf | Bin 0 -> 39157 bytes .../contrib/sjtutex/sjtu-vi-logo-small-red.pdf | Bin 0 -> 39066 bytes macros/latex/contrib/sjtutex/sjtu-vi-name-red.pdf | Bin 0 -> 20802 bytes macros/latex/contrib/sjtutex/sjtutex.dtx | 6137 ++++ macros/latex/contrib/sjtutex/sjtutex.pdf | Bin 0 -> 713536 bytes support/TeX4ht/source/ChangeLog | 7 + support/TeX4ht/source/tex4ht-fonts-noncjk.tex | 249 +- systems/texlive/tlnet/tlpkg/texlive.tlpdb | 66 +- systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 | 2 +- systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 | 2 +- .../texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc | 16 +- systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz | Bin 2548064 -> 2548524 bytes timestamp | 2 +- 572 files changed, 36393 insertions(+), 22530 deletions(-) create mode 100644 macros/generic/markdown/examples/optex.tex create mode 100644 macros/latex/contrib/sjtutex/README.md create mode 100644 macros/latex/contrib/sjtutex/sjtu-vi-badge-red.pdf create mode 100644 macros/latex/contrib/sjtutex/sjtu-vi-badge-small-red.pdf create mode 100644 macros/latex/contrib/sjtutex/sjtu-vi-logo-red.pdf create mode 100644 macros/latex/contrib/sjtutex/sjtu-vi-logo-small-red.pdf create mode 100644 macros/latex/contrib/sjtutex/sjtu-vi-name-red.pdf create mode 100644 macros/latex/contrib/sjtutex/sjtutex.dtx create mode 100644 macros/latex/contrib/sjtutex/sjtutex.pdf diff --git a/FILES.byname b/FILES.byname index c8c5e49929..75da031a04 100644 --- a/FILES.byname +++ b/FILES.byname @@ -2077,12 +2077,12 @@ 2023/10/05 | 1710 | biblio/citation-style-language/README.md 2023/10/05 | 12878 | biblio/citation-style-language/vancouver.csl 2023/10/05 | 4531754 | biblio/citation-style-language.zip -2024/02/17 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx +2024/02/18 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx 2022/10/08 | 127 | biblio/ctan-bibdata/biblatex-ctan/ctan.cbx -2024/02/17 | 2847952 | biblio/ctan-bibdata/ctan.bib -2024/02/17 | 3708800 | biblio/ctan-bibdata/ctan.pdf +2024/02/18 | 2847888 | biblio/ctan-bibdata/ctan.bib +2024/02/18 | 3708800 | biblio/ctan-bibdata/ctan.pdf 2023/01/16 | 1489 | biblio/ctan-bibdata/README -2024/02/17 | 4117589 | biblio/ctan-bibdata.zip +2024/02/18 | 4117547 | biblio/ctan-bibdata.zip 2023/02/23 | 3126 | biblio/pbibtex/pbibtex-base/cpp.awk 2023/02/23 | 1009 | biblio/pbibtex/pbibtex-base/generate.sh 2023/02/23 | 22362 | biblio/pbibtex/pbibtex-base/jabbrv.bst @@ -5444,7 +5444,7 @@ 1990/10/02 | 5440 | dviware/vutex/vaxvms.hlp 1990/10/02 | 812 | dviware/vutex/vaxvms.ins 1990/10/02 | 127576 | dviware/vutex/vutex.web -2024/02/17 | 131291 | FILES.last07days +2024/02/18 | 119915 | FILES.last07days 2021/07/24 | 1139410 | fonts/aboensis/Aboensis.glyphs 2021/07/24 | 18907382 | fonts/aboensis/aboensis.pdf 2021/07/24 | 137860 | fonts/aboensis/Aboensis-Regular.otf @@ -206617,7 +206617,7 @@ 2023/01/23 | 862071 | install/macros/generic/expkv-bundle.tds.zip 2022/02/04 | 232668 | install/macros/generic/iftex.tds.zip 2012/09/20 | 321508 | install/macros/generic/langcode.tds.zip -2023/04/27 | 1452921 | install/macros/generic/markdown.tds.zip +2024/02/17 | 1578727 | install/macros/generic/markdown.tds.zip 2014/06/11 | 428488 | install/macros/generic/mathdots.tds.zip 2024/01/21 | 2843812 | install/macros/generic/memoize.tds.zip 2014/01/02 | 496633 | install/macros/generic/minifp.tds.zip @@ -206776,8 +206776,8 @@ 2024/01/04 | 949878 | install/macros/latex/contrib/l3backend.tds.zip 2024/02/08 | 829326 | install/macros/latex/contrib/l3build.tds.zip 2024/01/04 | 4059172 | install/macros/latex/contrib/l3experimental.tds.zip -2024/02/13 | 14314783 | install/macros/latex/contrib/l3kernel.tds.zip -2024/02/13 | 1758079 | install/macros/latex/contrib/l3packages.tds.zip +2024/02/18 | 14296648 | install/macros/latex/contrib/l3kernel.tds.zip +2024/02/18 | 1758830 | install/macros/latex/contrib/l3packages.tds.zip 2023/10/14 | 606244 | install/macros/latex/contrib/lastpage.tds.zip 2009/09/02 | 556672 | install/macros/latex/contrib/layouts.tds.zip 2008/07/25 | 125603 | install/macros/latex/contrib/lcyw.tds.zip @@ -206868,6 +206868,7 @@ 2021/11/10 | 657160 | install/macros/latex/contrib/sdaps.tds.zip 2019/12/10 | 544332 | install/macros/latex/contrib/selinput.tds.zip 2024/02/15 | 1593952 | install/macros/latex/contrib/siunitx.tds.zip +2024/02/18 | 975103 | install/macros/latex/contrib/sjtutex.tds.zip 2019/10/15 | 315856 | install/macros/latex/contrib/skmath.tds.zip 2019/10/16 | 345652 | install/macros/latex/contrib/skrapport.tds.zip 2016/02/18 | 469004 | install/macros/latex/contrib/splitindex.tds.zip @@ -215247,23 +215248,24 @@ 2016/06/15 | 170646 | macros/generic/luatex85/luatex85.pdf 2016/06/15 | 316 | macros/generic/luatex85/README.md 2016/06/15 | 173375 | macros/generic/luatex85.zip -2023/04/27 | 33355 | macros/generic/markdown/CHANGES.md -2023/04/27 | 4377 | macros/generic/markdown/docstrip.cfg -2023/04/27 | 1974 | macros/generic/markdown/examples/context-mkiv.tex -2023/04/27 | 3967 | macros/generic/markdown/examples/example.md -2023/04/27 | 1364 | macros/generic/markdown/examples/latex-luatex.tex -2023/04/27 | 1781 | macros/generic/markdown/examples/latex-pdftex.tex -2023/04/27 | 75 | macros/generic/markdown/examples/scientists.csv -2023/04/27 | 22796 | macros/generic/markdown/libraries/markdown-tinyyaml.lua -2023/04/27 | 4681 | macros/generic/markdown/markdown.css -2023/04/27 | 823196 | macros/generic/markdown/markdown.dtx -2023/04/27 | 947905 | macros/generic/markdown/markdown.html -2023/04/27 | 1333 | macros/generic/markdown/markdown.ins -2023/04/27 | 1011455 | macros/generic/markdown/markdown.pdf -2023/04/27 | 140951 | macros/generic/markdown/markdown.png -2023/04/27 | 18970 | macros/generic/markdown/README.md -2023/04/27 | 31 | macros/generic/markdown/VERSION -2023/04/27 | 1376621 | macros/generic/markdown.zip +2024/02/17 | 43730 | macros/generic/markdown/CHANGES.md +2024/02/17 | 4405 | macros/generic/markdown/docstrip.cfg +2024/02/17 | 2189 | macros/generic/markdown/examples/context-mkiv.tex +2024/02/17 | 3832 | macros/generic/markdown/examples/example.md +2024/02/17 | 1609 | macros/generic/markdown/examples/latex-luatex.tex +2024/02/17 | 1778 | macros/generic/markdown/examples/latex-pdftex.tex +2024/02/17 | 9855 | macros/generic/markdown/examples/optex.tex +2024/02/17 | 75 | macros/generic/markdown/examples/scientists.csv +2024/02/17 | 22881 | macros/generic/markdown/libraries/markdown-tinyyaml.lua +2024/02/17 | 4681 | macros/generic/markdown/markdown.css +2024/02/17 | 952201 | macros/generic/markdown/markdown.dtx +2024/02/17 | 1037811 | macros/generic/markdown/markdown.html +2024/02/17 | 1650 | macros/generic/markdown/markdown.ins +2024/02/17 | 1089321 | macros/generic/markdown/markdown.pdf +2024/02/17 | 140951 | macros/generic/markdown/markdown.png +2024/02/17 | 21983 | macros/generic/markdown/README.md +2024/02/17 | 31 | macros/generic/markdown/VERSION +2024/02/18 | 1483341 | macros/generic/markdown.zip 2014/06/11 | 20744 | macros/generic/mathdots/mathdots.dtx 2014/06/11 | 1203 | macros/generic/mathdots/mathdots.ins 2014/06/11 | 258547 | macros/generic/mathdots/mathdots.pdf @@ -220021,1133 +220023,1133 @@ 2023/10/09 | 428 | macros/jptex/latex/japanese-otf/vf/utftmrz-h.vf 2023/10/09 | 428 | macros/jptex/latex/japanese-otf/vf/utftmrz-v.vf 2023/10/09 | 26781270 | macros/jptex/latex/japanese-otf.zip -2023/02/23 | 63709 | macros/jptex/latex/jlreq-deluxe/jlreq-deluxe.pdf -2023/02/23 | 3896 | macros/jptex/latex/jlreq-deluxe/jlreq-deluxe.sty -2023/02/23 | 3846 | macros/jptex/latex/jlreq-deluxe/jlreq-deluxe.tex -2023/02/23 | 1086 | macros/jptex/latex/jlreq-deluxe/LICENSE -2023/02/23 | 3908 | macros/jptex/latex/jlreq-deluxe/README-ja.md -2023/02/23 | 1444 | macros/jptex/latex/jlreq-deluxe/README.md -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothb-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothbn-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothbn-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothb-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgotheb-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothebn-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothebn-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgotheb-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothr-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothrn-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothrn-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothr-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expmgothr-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expmgothrn-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expmgothrn-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expmgothr-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminb-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminbn-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminbn-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminb-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminl-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminln-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminln-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminl-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminr-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminrn-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminrn-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminr-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothb-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothbn-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothbn-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothb-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgotheb-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothebn-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothebn-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgotheb-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothr-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothrn-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothrn-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothr-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlmgothr-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlmgothrn-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlmgothrn-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlmgothr-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminb-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminbn-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminbn-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminb-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminl-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminln-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminln-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminl-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminr-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminrn-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminrn-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminr-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygothb-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygothb-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygotheb-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygotheb-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygothr-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygothr-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubymgothr-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubymgothr-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminb-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminb-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminl-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminl-v.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminr-h.tfm -2023/02/23 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminr-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothb-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothbn-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothbn-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothb-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgotheb-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothebn-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothebn-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgotheb-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothr-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothrn-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothrn-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothr-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpmgothr-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpmgothrn-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpmgothrn-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpmgothr-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminb-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminbn-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminbn-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminb-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminl-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminln-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminln-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminl-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminr-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminrn-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminrn-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminr-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothb-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothbn-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothbn-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothb-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgotheb-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothebn-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothebn-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgotheb-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothr-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothrn-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothrn-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothr-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlmgothr-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlmgothrn-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlmgothrn-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlmgothr-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminb-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminbn-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminbn-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminb-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminl-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminln-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminln-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminl-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminr-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminrn-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminrn-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminr-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygothb-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygothb-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygotheb-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygotheb-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygothr-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygothr-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubymgothr-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubymgothr-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminb-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminb-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminl-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminl-v.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminr-h.tfm -2023/02/23 | 2332 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminr-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothb-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothbn-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothbn-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothb-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgotheb-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothebn-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothebn-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgotheb-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothr-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothrn-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothrn-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothr-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expmgothr-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expmgothrn-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expmgothrn-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expmgothr-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminb-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminbn-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminbn-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminb-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminl-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminln-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminln-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminl-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminr-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminrn-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminrn-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminr-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothb-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothbn-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothbn-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothb-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgotheb-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothebn-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothebn-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgotheb-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothr-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothrn-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothrn-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothr-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlmgothr-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlmgothrn-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlmgothrn-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlmgothr-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminb-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminbn-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminbn-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminb-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminl-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminln-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminln-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminl-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminr-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminrn-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminrn-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminr-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygothb-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygothb-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygotheb-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygotheb-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygothr-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygothr-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubymgothr-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubymgothr-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminb-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminb-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminl-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminl-v.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminr-h.tfm -2023/02/23 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminr-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothb-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothbn-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothbn-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothb-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgotheb-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothebn-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothebn-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgotheb-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothr-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothrn-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothrn-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothr-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpmgothr-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpmgothrn-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpmgothrn-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpmgothr-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminb-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminbn-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminbn-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminb-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminl-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminln-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminln-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminl-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminr-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminrn-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminrn-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminr-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothb-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothbn-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothbn-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothb-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgotheb-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothebn-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothebn-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgotheb-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothr-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothrn-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothrn-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothr-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlmgothr-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlmgothrn-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlmgothrn-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlmgothr-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminb-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminbn-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminbn-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminb-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminl-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminln-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminln-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminl-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminr-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminrn-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminrn-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminr-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygothb-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygothb-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygotheb-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygotheb-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygothr-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygothr-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubymgothr-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubymgothr-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminb-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminb-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminl-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminl-v.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminr-h.tfm -2023/02/23 | 2368 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminr-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothb-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothbn-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothbn-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothb-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgotheb-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothebn-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothebn-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgotheb-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothr-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothrn-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothrn-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothr-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expmgothr-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expmgothrn-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expmgothrn-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expmgothr-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminb-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminbn-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminbn-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminb-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminl-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminln-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminln-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminl-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminr-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminrn-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminrn-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminr-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothb-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothbn-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothbn-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothb-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgotheb-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothebn-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothebn-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgotheb-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothr-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothrn-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothrn-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothr-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlmgothr-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlmgothrn-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlmgothrn-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlmgothr-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminb-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminbn-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminbn-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminb-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminl-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminln-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminln-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminl-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminr-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminrn-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminrn-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminr-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygothb-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygothb-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygotheb-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygotheb-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygothr-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygothr-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubymgothr-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubymgothr-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminb-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminb-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminl-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminl-v.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminr-h.tfm -2023/02/23 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminr-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothb-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothbn-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothbn-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothb-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgotheb-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothebn-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothebn-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgotheb-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothr-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothrn-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothrn-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothr-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpmgothr-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpmgothrn-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpmgothrn-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpmgothr-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminb-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminbn-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminbn-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminb-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminl-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminln-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminln-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminl-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminr-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminrn-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminrn-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminr-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothb-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothbn-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothbn-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothb-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgotheb-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothebn-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothebn-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgotheb-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothr-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothrn-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothrn-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothr-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlmgothr-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlmgothrn-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlmgothrn-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlmgothr-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminb-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminbn-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminbn-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminb-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminl-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminln-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminln-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminl-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminr-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminrn-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminrn-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminr-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygothb-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygothb-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygotheb-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygotheb-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygothr-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygothr-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubymgothr-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubymgothr-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminb-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminb-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminl-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminl-v.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminr-h.tfm -2023/02/23 | 2304 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminr-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothb-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothbn-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothbn-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothb-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgotheb-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothebn-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothebn-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgotheb-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothr-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothrn-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothrn-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothr-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expmgothr-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expmgothrn-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expmgothrn-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expmgothr-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminb-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminbn-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminbn-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminb-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminl-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminln-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminln-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminl-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminr-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminrn-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminrn-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminr-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothb-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothbn-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothbn-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothb-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgotheb-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothebn-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothebn-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgotheb-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothr-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothrn-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothrn-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothr-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlmgothr-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlmgothrn-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlmgothrn-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlmgothr-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminb-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminbn-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminbn-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminb-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminl-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminln-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminln-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminl-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminr-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminrn-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminrn-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminr-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygothb-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygothb-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygotheb-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygotheb-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygothr-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygothr-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubymgothr-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubymgothr-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminb-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminb-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminl-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminl-v.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminr-h.tfm -2023/02/23 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminr-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothb-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothbn-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothbn-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothb-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgotheb-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothebn-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothebn-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgotheb-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothr-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothrn-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothrn-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothr-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpmgothr-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpmgothrn-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpmgothrn-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpmgothr-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminb-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminbn-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminbn-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminb-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminl-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminln-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminln-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminl-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminr-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminrn-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminrn-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminr-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothb-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothbn-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothbn-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothb-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgotheb-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothebn-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothebn-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgotheb-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothr-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothrn-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothrn-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothr-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlmgothr-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlmgothrn-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlmgothrn-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlmgothr-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminb-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminbn-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminbn-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminb-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminl-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminln-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminln-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminl-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminr-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminrn-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminrn-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminr-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygothb-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygothb-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygotheb-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygotheb-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygothr-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygothr-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubymgothr-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubymgothr-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminb-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminb-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminl-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminl-v.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminr-h.tfm -2023/02/23 | 2340 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminr-v.tfm -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothb-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothbn-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothbn-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothb-v.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgotheb-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothebn-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothebn-v.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgotheb-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothr-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothrn-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothrn-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothr-v.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expmgothr-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expmgothrn-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expmgothrn-v.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expmgothr-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminb-h.vf -2023/02/23 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminbn-h.vf -2023/02/23 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminbn-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminb-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminl-h.vf -2023/02/23 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminln-h.vf -2023/02/23 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminln-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminl-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminr-h.vf -2023/02/23 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminrn-h.vf -2023/02/23 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminrn-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminr-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothb-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothbn-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothbn-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothb-v.vf -2023/02/23 | 340 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgotheb-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothebn-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothebn-v.vf -2023/02/23 | 340 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgotheb-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothr-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothrn-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothrn-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothr-v.vf -2023/02/23 | 340 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlmgothr-h.vf -2023/02/23 | 3088 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlmgothrn-h.vf -2023/02/23 | 3088 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlmgothrn-v.vf -2023/02/23 | 340 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlmgothr-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminb-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminbn-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminbn-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminb-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminl-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminln-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminln-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminl-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminr-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminrn-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminrn-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminr-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygothb-h.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygothb-v.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygotheb-h.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygotheb-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygothr-h.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygothr-v.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubymgothr-h.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubymgothr-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminb-h.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminb-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminl-h.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminl-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminr-h.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminr-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothb-h.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothbn-h.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothbn-v.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothb-v.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgotheb-h.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothebn-h.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothebn-v.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgotheb-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothr-h.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothrn-h.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothrn-v.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothr-v.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpmgothr-h.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpmgothrn-h.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpmgothrn-v.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpmgothr-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminb-h.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminbn-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminbn-v.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminb-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminl-h.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminln-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminln-v.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminl-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminr-h.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminrn-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminrn-v.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminr-v.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothb-h.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothbn-h.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothbn-v.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothb-v.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgotheb-h.vf -2023/02/23 | 536 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothebn-h.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothebn-v.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgotheb-v.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothr-h.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothrn-h.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothrn-v.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothr-v.vf -2023/02/23 | 536 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlmgothr-h.vf -2023/02/23 | 536 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlmgothrn-h.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlmgothrn-v.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlmgothr-v.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminb-h.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminbn-h.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminbn-v.vf -2023/02/23 | 468 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminb-v.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminl-h.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminln-h.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminln-v.vf -2023/02/23 | 468 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminl-v.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminr-h.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminrn-h.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminrn-v.vf -2023/02/23 | 468 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminr-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygothb-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygothb-v.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygotheb-h.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygotheb-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygothr-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygothr-v.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubymgothr-h.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubymgothr-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminb-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminb-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminl-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminl-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminr-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminr-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothb-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothbn-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothbn-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothb-v.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgotheb-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothebn-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothebn-v.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgotheb-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothr-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothrn-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothrn-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothr-v.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expmgothr-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expmgothrn-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expmgothrn-v.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expmgothr-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminb-h.vf -2023/02/23 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminbn-h.vf -2023/02/23 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminbn-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminb-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminl-h.vf -2023/02/23 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminln-h.vf -2023/02/23 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminln-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminl-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminr-h.vf -2023/02/23 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminrn-h.vf -2023/02/23 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminrn-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminr-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothb-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothbn-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothbn-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothb-v.vf -2023/02/23 | 120 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgotheb-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothebn-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothebn-v.vf -2023/02/23 | 120 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgotheb-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothr-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothrn-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothrn-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothr-v.vf -2023/02/23 | 120 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlmgothr-h.vf -2023/02/23 | 2868 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlmgothrn-h.vf -2023/02/23 | 2868 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlmgothrn-v.vf -2023/02/23 | 120 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlmgothr-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminb-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminbn-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminbn-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminb-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminl-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminln-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminln-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminl-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminr-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminrn-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminrn-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminr-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygothb-h.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygothb-v.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygotheb-h.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygotheb-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygothr-h.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygothr-v.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubymgothr-h.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubymgothr-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminb-h.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminb-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminl-h.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminl-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminr-h.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminr-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothb-h.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothbn-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothbn-v.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothb-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgotheb-h.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothebn-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothebn-v.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgotheb-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothr-h.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothrn-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothrn-v.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothr-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpmgothr-h.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpmgothrn-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpmgothrn-v.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpmgothr-v.vf -2023/02/23 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminb-h.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminbn-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminbn-v.vf -2023/02/23 | 3532 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminb-v.vf -2023/02/23 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminl-h.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminln-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminln-v.vf -2023/02/23 | 3532 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminl-v.vf -2023/02/23 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminr-h.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminrn-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminrn-v.vf -2023/02/23 | 3532 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminr-v.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothb-h.vf -2023/02/23 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothbn-h.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothbn-v.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothb-v.vf -2023/02/23 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgotheb-h.vf -2023/02/23 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothebn-h.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothebn-v.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgotheb-v.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothr-h.vf -2023/02/23 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothrn-h.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothrn-v.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothr-v.vf -2023/02/23 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlmgothr-h.vf -2023/02/23 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlmgothrn-h.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlmgothrn-v.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlmgothr-v.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminb-h.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminbn-h.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminbn-v.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminb-v.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminl-h.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminln-h.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminln-v.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminl-v.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminr-h.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminrn-h.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminrn-v.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminr-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygothb-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygothb-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygotheb-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygotheb-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygothr-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygothr-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubymgothr-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubymgothr-v.vf -2023/02/23 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminb-h.vf -2023/02/23 | 3532 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminb-v.vf -2023/02/23 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminl-h.vf -2023/02/23 | 3532 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminl-v.vf -2023/02/23 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminr-h.vf -2023/02/23 | 3532 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminr-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothb-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothbn-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothbn-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothb-v.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgotheb-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothebn-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothebn-v.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgotheb-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothr-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothrn-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothrn-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothr-v.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expmgothr-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expmgothrn-h.vf -2023/02/23 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expmgothrn-v.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expmgothr-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminb-h.vf -2023/02/23 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminbn-h.vf -2023/02/23 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminbn-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminb-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminl-h.vf -2023/02/23 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminln-h.vf -2023/02/23 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminln-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminl-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminr-h.vf -2023/02/23 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminrn-h.vf -2023/02/23 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminrn-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminr-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothb-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothbn-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothbn-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothb-v.vf -2023/02/23 | 340 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgotheb-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothebn-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothebn-v.vf -2023/02/23 | 340 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgotheb-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothr-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothrn-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothrn-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothr-v.vf -2023/02/23 | 340 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlmgothr-h.vf -2023/02/23 | 3088 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlmgothrn-h.vf -2023/02/23 | 3088 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlmgothrn-v.vf -2023/02/23 | 340 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlmgothr-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminb-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminbn-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminbn-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminb-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminl-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminln-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminln-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminl-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminr-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminrn-h.vf -2023/02/23 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminrn-v.vf -2023/02/23 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminr-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygothb-h.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygothb-v.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygotheb-h.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygotheb-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygothr-h.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygothr-v.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubymgothr-h.vf -2023/02/23 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubymgothr-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminb-h.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminb-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminl-h.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminl-v.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminr-h.vf -2023/02/23 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminr-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothb-h.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothbn-h.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothbn-v.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothb-v.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgotheb-h.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothebn-h.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothebn-v.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgotheb-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothr-h.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothrn-h.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothrn-v.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothr-v.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpmgothr-h.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpmgothrn-h.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpmgothrn-v.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpmgothr-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminb-h.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminbn-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminbn-v.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminb-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminl-h.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminln-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminln-v.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminl-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminr-h.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminrn-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminrn-v.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminr-v.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothb-h.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothbn-h.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothbn-v.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothb-v.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgotheb-h.vf -2023/02/23 | 536 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothebn-h.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothebn-v.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgotheb-v.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothr-h.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothrn-h.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothrn-v.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothr-v.vf -2023/02/23 | 536 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlmgothr-h.vf -2023/02/23 | 536 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlmgothrn-h.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlmgothrn-v.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlmgothr-v.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminb-h.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminbn-h.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminbn-v.vf -2023/02/23 | 468 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminb-v.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminl-h.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminln-h.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminln-v.vf -2023/02/23 | 468 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminl-v.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminr-h.vf -2023/02/23 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminrn-h.vf -2023/02/23 | 472 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminrn-v.vf -2023/02/23 | 468 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminr-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygothb-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygothb-v.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygotheb-h.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygotheb-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygothr-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygothr-v.vf -2023/02/23 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubymgothr-h.vf -2023/02/23 | 3848 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubymgothr-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminb-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminb-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminl-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminl-v.vf -2023/02/23 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminr-h.vf -2023/02/23 | 3844 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminr-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothb-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothbn-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothbn-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothb-v.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgotheb-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothebn-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothebn-v.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgotheb-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothr-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothrn-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothrn-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothr-v.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expmgothr-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expmgothrn-h.vf -2023/02/23 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expmgothrn-v.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expmgothr-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminb-h.vf -2023/02/23 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminbn-h.vf -2023/02/23 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminbn-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminb-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminl-h.vf -2023/02/23 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminln-h.vf -2023/02/23 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminln-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminl-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminr-h.vf -2023/02/23 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminrn-h.vf -2023/02/23 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminrn-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminr-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothb-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothbn-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothbn-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothb-v.vf -2023/02/23 | 120 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgotheb-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothebn-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothebn-v.vf -2023/02/23 | 120 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgotheb-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothr-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothrn-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothrn-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothr-v.vf -2023/02/23 | 120 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlmgothr-h.vf -2023/02/23 | 2868 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlmgothrn-h.vf -2023/02/23 | 2868 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlmgothrn-v.vf -2023/02/23 | 120 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlmgothr-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminb-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminbn-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminbn-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminb-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminl-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminln-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminln-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminl-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminr-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminrn-h.vf -2023/02/23 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminrn-v.vf -2023/02/23 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminr-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygothb-h.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygothb-v.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygotheb-h.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygotheb-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygothr-h.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygothr-v.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubymgothr-h.vf -2023/02/23 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubymgothr-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminb-h.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminb-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminl-h.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminl-v.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminr-h.vf -2023/02/23 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminr-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothb-h.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothbn-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothbn-v.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothb-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgotheb-h.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothebn-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothebn-v.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgotheb-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothr-h.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothrn-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothrn-v.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothr-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpmgothr-h.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpmgothrn-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpmgothrn-v.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpmgothr-v.vf -2023/02/23 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminb-h.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminbn-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminbn-v.vf -2023/02/23 | 3532 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminb-v.vf -2023/02/23 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminl-h.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminln-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminln-v.vf -2023/02/23 | 3532 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminl-v.vf -2023/02/23 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminr-h.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminrn-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminrn-v.vf -2023/02/23 | 3532 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminr-v.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothb-h.vf -2023/02/23 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothbn-h.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothbn-v.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothb-v.vf -2023/02/23 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgotheb-h.vf -2023/02/23 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothebn-h.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothebn-v.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgotheb-v.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothr-h.vf -2023/02/23 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothrn-h.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothrn-v.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothr-v.vf -2023/02/23 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlmgothr-h.vf -2023/02/23 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlmgothrn-h.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlmgothrn-v.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlmgothr-v.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminb-h.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminbn-h.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminbn-v.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminb-v.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminl-h.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminln-h.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminln-v.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminl-v.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminr-h.vf -2023/02/23 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminrn-h.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminrn-v.vf -2023/02/23 | 160 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminr-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygothb-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygothb-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygotheb-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygotheb-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygothr-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygothr-v.vf -2023/02/23 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubymgothr-h.vf -2023/02/23 | 3536 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubymgothr-v.vf -2023/02/23 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminb-h.vf -2023/02/23 | 3532 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminb-v.vf -2023/02/23 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminl-h.vf -2023/02/23 | 3532 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminl-v.vf -2023/02/23 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminr-h.vf -2023/02/23 | 3532 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminr-v.vf -2023/02/23 | 1138582 | macros/jptex/latex/jlreq-deluxe.zip +2024/02/18 | 64005 | macros/jptex/latex/jlreq-deluxe/jlreq-deluxe.pdf +2024/02/18 | 3896 | macros/jptex/latex/jlreq-deluxe/jlreq-deluxe.sty +2024/02/18 | 3846 | macros/jptex/latex/jlreq-deluxe/jlreq-deluxe.tex +2024/02/18 | 1086 | macros/jptex/latex/jlreq-deluxe/LICENSE +2024/02/18 | 3980 | macros/jptex/latex/jlreq-deluxe/README-ja.md +2024/02/18 | 1511 | macros/jptex/latex/jlreq-deluxe/README.md +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothbn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothbn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgotheb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothebn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothebn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgotheb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothrn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothrn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expmgothr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expmgothrn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expmgothrn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expmgothr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminbn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminbn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminl-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminln-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminln-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminl-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminrn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminrn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothbn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothbn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgotheb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothebn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothebn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgotheb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothrn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothrn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlmgothr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlmgothrn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlmgothrn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlmgothr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminbn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminbn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminl-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminln-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminln-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminl-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminrn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminrn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygothb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygothb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygotheb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygotheb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygothr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygothr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubymgothr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubymgothr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminl-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminl-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothbn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothbn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgotheb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothebn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothebn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgotheb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothrn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothrn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpmgothr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpmgothrn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpmgothrn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpmgothr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminbn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminbn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminl-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminln-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminln-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminl-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminrn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminrn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothbn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothbn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgotheb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothebn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothebn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgotheb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothrn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothrn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlmgothr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlmgothrn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlmgothrn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlmgothr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminbn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminbn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminl-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminln-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminln-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminl-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminrn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminrn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygothb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygothb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygotheb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygotheb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygothr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygothr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubymgothr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubymgothr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminl-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminl-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothbn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothbn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgotheb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothebn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothebn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgotheb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothrn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothrn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expmgothr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expmgothrn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expmgothrn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expmgothr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminbn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminbn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminl-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminln-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminln-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminl-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminrn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminrn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothbn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothbn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgotheb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothebn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothebn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgotheb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothrn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothrn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlmgothr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlmgothrn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlmgothrn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlmgothr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminbn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminbn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminl-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminln-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminln-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminl-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminrn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminrn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygothb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygothb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygotheb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygotheb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygothr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygothr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubymgothr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubymgothr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminl-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminl-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothbn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothbn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgotheb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothebn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothebn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgotheb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothrn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothrn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpmgothr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpmgothrn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpmgothrn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpmgothr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminbn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminbn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminl-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminln-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminln-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminl-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminrn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminrn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothbn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothbn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgotheb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothebn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothebn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgotheb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothrn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothrn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlmgothr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlmgothrn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlmgothrn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlmgothr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminbn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminbn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminl-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminln-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminln-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminl-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminrn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminrn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygothb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygothb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygotheb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygotheb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygothr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygothr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubymgothr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubymgothr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminl-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminl-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothbn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothbn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgotheb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothebn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothebn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgotheb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothrn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothrn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expmgothr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expmgothrn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expmgothrn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expmgothr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminbn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminbn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminl-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminln-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminln-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminl-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminrn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminrn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothbn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothbn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgotheb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothebn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothebn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgotheb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothrn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothrn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlmgothr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlmgothrn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlmgothrn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlmgothr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminbn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminbn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminl-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminln-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminln-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminl-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminrn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminrn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygothb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygothb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygotheb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygotheb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygothr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygothr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubymgothr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubymgothr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminl-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminl-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothbn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothbn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgotheb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothebn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothebn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgotheb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothrn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothrn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpmgothr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpmgothrn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpmgothrn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpmgothr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminbn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminbn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminl-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminln-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminln-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminl-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminrn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminrn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothbn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothbn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgotheb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothebn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothebn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgotheb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothrn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothrn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlmgothr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlmgothrn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlmgothrn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlmgothr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminbn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminbn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminl-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminln-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminln-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminl-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminrn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminrn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygothb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygothb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygotheb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygotheb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygothr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygothr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubymgothr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubymgothr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminl-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminl-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothbn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothbn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgotheb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothebn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothebn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgotheb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothrn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothrn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expmgothr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expmgothrn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expmgothrn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expmgothr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminbn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminbn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminl-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminln-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminln-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminl-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminrn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminrn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothbn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothbn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgotheb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothebn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothebn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgotheb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothrn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothrn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlmgothr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlmgothrn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlmgothrn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlmgothr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminbn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminbn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminl-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminln-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminln-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminl-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminrn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminrn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygothb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygothb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygotheb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygotheb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygothr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygothr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubymgothr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubymgothr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminl-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminl-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothbn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothbn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgotheb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothebn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothebn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgotheb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothrn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothrn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpmgothr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpmgothrn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpmgothrn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpmgothr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminbn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminbn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminl-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminln-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminln-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminl-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminrn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminrn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothbn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothbn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgotheb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothebn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothebn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgotheb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothrn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothrn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlmgothr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlmgothrn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlmgothrn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlmgothr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminbn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminbn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminl-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminln-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminln-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminl-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminrn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminrn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygothb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygothb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygotheb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygotheb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygothr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygothr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubymgothr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubymgothr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminl-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminl-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminr-v.tfm +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothb-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothbn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothbn-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothb-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgotheb-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothebn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothebn-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgotheb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothr-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothrn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothrn-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothr-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expmgothr-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expmgothrn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expmgothrn-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expmgothr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminb-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminbn-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminbn-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminl-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminln-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminln-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminl-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminr-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminrn-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminrn-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminr-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothb-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothbn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothbn-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothb-v.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgotheb-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothebn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothebn-v.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgotheb-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothr-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothrn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothrn-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothr-v.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlmgothr-h.vf +2024/02/18 | 3088 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlmgothrn-h.vf +2024/02/18 | 3088 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlmgothrn-v.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlmgothr-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminb-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminbn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminbn-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminb-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminl-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminln-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminln-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminl-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminr-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminrn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminrn-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygothb-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygothb-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygotheb-h.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygotheb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygothr-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygothr-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubymgothr-h.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubymgothr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminb-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminl-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminl-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminr-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminr-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothb-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothbn-h.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothbn-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothb-v.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgotheb-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothebn-h.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothebn-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgotheb-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothr-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothrn-h.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothrn-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothr-v.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpmgothr-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpmgothrn-h.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpmgothrn-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpmgothr-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminb-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminbn-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminbn-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminb-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminl-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminln-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminln-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminl-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminr-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminrn-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminrn-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminr-v.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothb-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothbn-h.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothbn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothb-v.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgotheb-h.vf +2024/02/18 | 536 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothebn-h.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothebn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgotheb-v.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothr-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothrn-h.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothrn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothr-v.vf +2024/02/18 | 536 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlmgothr-h.vf +2024/02/18 | 536 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlmgothrn-h.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlmgothrn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlmgothr-v.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminb-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminbn-h.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminbn-v.vf +2024/02/18 | 1728 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminb-v.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminl-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminln-h.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminln-v.vf +2024/02/18 | 1728 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminl-v.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminr-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminrn-h.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminrn-v.vf +2024/02/18 | 1728 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminr-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygothb-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygothb-v.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygotheb-h.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygotheb-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygothr-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygothr-v.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubymgothr-h.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubymgothr-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminb-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminb-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminl-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminl-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminr-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothb-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothbn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothbn-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothb-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgotheb-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothebn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothebn-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgotheb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothr-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothrn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothrn-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothr-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expmgothr-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expmgothrn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expmgothrn-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expmgothr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminb-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminbn-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminbn-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminl-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminln-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminln-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminl-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminr-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminrn-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminrn-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminr-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothb-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothbn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothbn-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothb-v.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgotheb-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothebn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothebn-v.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgotheb-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothr-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothrn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothrn-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothr-v.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlmgothr-h.vf +2024/02/18 | 2868 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlmgothrn-h.vf +2024/02/18 | 2868 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlmgothrn-v.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlmgothr-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminb-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminbn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminbn-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminb-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminl-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminln-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminln-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminl-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminr-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminrn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminrn-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygothb-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygothb-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygotheb-h.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygotheb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygothr-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygothr-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubymgothr-h.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubymgothr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminb-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminl-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminl-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminr-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminr-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothb-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothbn-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothbn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothb-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgotheb-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothebn-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothebn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgotheb-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothr-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothrn-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothrn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothr-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpmgothr-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpmgothrn-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpmgothrn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpmgothr-v.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminb-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminbn-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminbn-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminb-v.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminl-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminln-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminln-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminl-v.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminr-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminrn-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminrn-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminr-v.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothb-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothbn-h.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothbn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothb-v.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgotheb-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothebn-h.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothebn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgotheb-v.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothr-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothrn-h.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothrn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothr-v.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlmgothr-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlmgothrn-h.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlmgothrn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlmgothr-v.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminb-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminbn-h.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminbn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminb-v.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminl-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminln-h.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminln-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminl-v.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminr-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminrn-h.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminrn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminr-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygothb-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygothb-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygotheb-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygotheb-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygothr-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygothr-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubymgothr-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubymgothr-v.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminb-h.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminb-v.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminl-h.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminl-v.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminr-h.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothb-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothbn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothbn-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothb-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgotheb-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothebn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothebn-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgotheb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothr-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothrn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothrn-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothr-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expmgothr-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expmgothrn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expmgothrn-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expmgothr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminb-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminbn-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminbn-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminl-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminln-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminln-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminl-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminr-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminrn-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminrn-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminr-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothb-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothbn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothbn-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothb-v.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgotheb-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothebn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothebn-v.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgotheb-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothr-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothrn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothrn-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothr-v.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlmgothr-h.vf +2024/02/18 | 3088 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlmgothrn-h.vf +2024/02/18 | 3088 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlmgothrn-v.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlmgothr-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminb-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminbn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminbn-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminb-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminl-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminln-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminln-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminl-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminr-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminrn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminrn-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygothb-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygothb-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygotheb-h.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygotheb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygothr-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygothr-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubymgothr-h.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubymgothr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminb-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminl-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminl-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminr-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminr-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothb-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothbn-h.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothbn-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothb-v.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgotheb-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothebn-h.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothebn-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgotheb-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothr-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothrn-h.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothrn-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothr-v.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpmgothr-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpmgothrn-h.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpmgothrn-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpmgothr-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminb-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminbn-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminbn-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminb-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminl-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminln-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminln-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminl-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminr-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminrn-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminrn-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminr-v.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothb-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothbn-h.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothbn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothb-v.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgotheb-h.vf +2024/02/18 | 536 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothebn-h.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothebn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgotheb-v.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothr-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothrn-h.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothrn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothr-v.vf +2024/02/18 | 536 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlmgothr-h.vf +2024/02/18 | 536 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlmgothrn-h.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlmgothrn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlmgothr-v.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminb-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminbn-h.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminbn-v.vf +2024/02/18 | 1728 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminb-v.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminl-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminln-h.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminln-v.vf +2024/02/18 | 1728 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminl-v.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminr-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminrn-h.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminrn-v.vf +2024/02/18 | 1728 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminr-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygothb-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygothb-v.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygotheb-h.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygotheb-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygothr-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygothr-v.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubymgothr-h.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubymgothr-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminb-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminb-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminl-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminl-v.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminr-h.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothb-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothbn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothbn-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothb-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgotheb-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothebn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothebn-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgotheb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothr-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothrn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothrn-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothr-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expmgothr-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expmgothrn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expmgothrn-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expmgothr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminb-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminbn-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminbn-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminl-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminln-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminln-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminl-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminr-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminrn-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminrn-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminr-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothb-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothbn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothbn-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothb-v.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgotheb-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothebn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothebn-v.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgotheb-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothr-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothrn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothrn-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothr-v.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlmgothr-h.vf +2024/02/18 | 2868 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlmgothrn-h.vf +2024/02/18 | 2868 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlmgothrn-v.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlmgothr-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminb-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminbn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminbn-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminb-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminl-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminln-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminln-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminl-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminr-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminrn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminrn-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygothb-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygothb-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygotheb-h.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygotheb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygothr-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygothr-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubymgothr-h.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubymgothr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminb-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminl-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminl-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminr-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminr-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothb-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothbn-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothbn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothb-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgotheb-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothebn-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothebn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgotheb-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothr-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothrn-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothrn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothr-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpmgothr-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpmgothrn-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpmgothrn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpmgothr-v.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminb-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminbn-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminbn-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminb-v.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminl-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminln-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminln-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminl-v.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminr-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminrn-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminrn-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminr-v.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothb-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothbn-h.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothbn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothb-v.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgotheb-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothebn-h.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothebn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgotheb-v.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothr-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothrn-h.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothrn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothr-v.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlmgothr-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlmgothrn-h.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlmgothrn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlmgothr-v.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminb-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminbn-h.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminbn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminb-v.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminl-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminln-h.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminln-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminl-v.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminr-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminrn-h.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminrn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminr-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygothb-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygothb-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygotheb-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygotheb-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygothr-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygothr-v.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubymgothr-h.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubymgothr-v.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminb-h.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminb-v.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminl-h.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminl-v.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminr-h.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminr-v.vf +2024/02/18 | 1205619 | macros/jptex/latex/jlreq-deluxe.zip 2023/09/17 | 5662 | macros/jptex/latex/jlreq/jfm-jlreq-jidori.lua 2024/02/13 | 48897 | macros/jptex/latex/jlreq/jfm-jlreq.lua 2024/02/16 | 290095 | macros/jptex/latex/jlreq/jlreq.cls @@ -232360,12 +232362,12 @@ 2008/02/10 | 19110 | macros/latex/contrib/ean13isbn/License.txt 2021/01/24 | 422 | macros/latex/contrib/ean13isbn/README 2021/01/24 | 322624 | macros/latex/contrib/ean13isbn.zip -2024/02/16 | 75978 | macros/latex/contrib/easybook/easybook.dtx +2024/02/18 | 76700 | macros/latex/contrib/easybook/easybook.dtx 2024/01/04 | 2081 | macros/latex/contrib/easybook/easybook.ins -2024/02/16 | 598997 | macros/latex/contrib/easybook/easybook.pdf -2024/02/16 | 89291 | macros/latex/contrib/easybook/easybook.tex +2024/02/18 | 602008 | macros/latex/contrib/easybook/easybook.pdf +2024/02/18 | 91329 | macros/latex/contrib/easybook/easybook.tex 2024/01/03 | 801 | macros/latex/contrib/easybook/README.md -2024/02/16 | 642167 | macros/latex/contrib/easybook.zip +2024/02/18 | 645793 | macros/latex/contrib/easybook.zip 2009/06/17 | 82589 | macros/latex/contrib/easy/doc/docbib.pdf 2009/06/17 | 78378 | macros/latex/contrib/easy/doc/docbmat.pdf 2009/06/17 | 99132 | macros/latex/contrib/easy/doc/doceqn.pdf @@ -240755,134 +240757,134 @@ 2024/01/04 | 1624 | macros/latex/contrib/l3experimental/xgalley.ins 2024/01/04 | 299509 | macros/latex/contrib/l3experimental/xgalley.pdf 2024/01/05 | 4023424 | macros/latex/contrib/l3experimental.zip -2024/02/13 | 57438 | macros/latex/contrib/l3kernel/CHANGELOG.md -2024/02/13 | 71193 | macros/latex/contrib/l3kernel/expl3.dtx -2024/02/13 | 610363 | macros/latex/contrib/l3kernel/expl3.pdf -2024/02/13 | 1792513 | macros/latex/contrib/l3kernel/interface3.pdf -2024/02/13 | 1949 | macros/latex/contrib/l3kernel/interface3.tex -2024/02/13 | 137539 | macros/latex/contrib/l3kernel/l3basics.dtx -2024/02/13 | 19547 | macros/latex/contrib/l3kernel/l3bitset.dtx -2024/02/13 | 12948 | macros/latex/contrib/l3kernel/l3bootstrap.dtx -2024/02/13 | 87749 | macros/latex/contrib/l3kernel/l3box.dtx -2024/02/13 | 33772 | macros/latex/contrib/l3kernel/l3cctab.dtx -2024/02/13 | 83169 | macros/latex/contrib/l3kernel/l3clist.dtx -2024/02/13 | 88241 | macros/latex/contrib/l3kernel/l3coffins.dtx -2024/02/13 | 112260 | macros/latex/contrib/l3kernel/l3color.dtx -2024/02/13 | 41847 | macros/latex/contrib/l3kernel/l3debug.dtx -2024/02/13 | 24987 | macros/latex/contrib/l3kernel/l3deprecation.dtx -2024/02/13 | 159767 | macros/latex/contrib/l3kernel/l3doc.dtx -2024/02/13 | 565282 | macros/latex/contrib/l3kernel/l3doc.pdf -2024/02/13 | 2384 | macros/latex/contrib/l3kernel/l3docstrip.dtx -2024/02/13 | 151264 | macros/latex/contrib/l3kernel/l3docstrip.pdf -2024/02/13 | 88794 | macros/latex/contrib/l3kernel/l3expan.dtx -2024/02/13 | 144214 | macros/latex/contrib/l3kernel/l3file.dtx -2024/02/13 | 14100 | macros/latex/contrib/l3kernel/l3flag.dtx -2024/02/13 | 11778 | macros/latex/contrib/l3kernel/l3fparray.dtx -2024/02/13 | 9445 | macros/latex/contrib/l3kernel/l3fp-assign.dtx -2024/02/13 | 47237 | macros/latex/contrib/l3kernel/l3fp-aux.dtx -2024/02/13 | 84789 | macros/latex/contrib/l3kernel/l3fp-basics.dtx -2024/02/13 | 19637 | macros/latex/contrib/l3kernel/l3fp-convert.dtx -2024/02/13 | 76534 | macros/latex/contrib/l3kernel/l3fp.dtx -2024/02/13 | 49321 | macros/latex/contrib/l3kernel/l3fp-expo.dtx -2024/02/13 | 51091 | macros/latex/contrib/l3kernel/l3fp-extended.dtx -2024/02/13 | 7831 | macros/latex/contrib/l3kernel/l3fp-functions.dtx -2024/02/13 | 23206 | macros/latex/contrib/l3kernel/l3fp-logic.dtx -2024/02/13 | 105022 | macros/latex/contrib/l3kernel/l3fp-parse.dtx -2024/02/13 | 23581 | macros/latex/contrib/l3kernel/l3fp-random.dtx -2024/02/13 | 18528 | macros/latex/contrib/l3kernel/l3fp-round.dtx -2024/02/13 | 20310 | macros/latex/contrib/l3kernel/l3fp-symbolic.dtx -2024/02/13 | 12832 | macros/latex/contrib/l3kernel/l3fp-traps.dtx -2024/02/13 | 73845 | macros/latex/contrib/l3kernel/l3fp-trig.dtx -2024/02/13 | 4911 | macros/latex/contrib/l3kernel/l3fp-types.dtx -2024/02/13 | 6393 | macros/latex/contrib/l3kernel/l3.ins -2024/02/13 | 30504 | macros/latex/contrib/l3kernel/l3intarray.dtx -2024/02/13 | 92983 | macros/latex/contrib/l3kernel/l3int.dtx -2024/02/13 | 29836 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx -2024/02/13 | 130500 | macros/latex/contrib/l3kernel/l3keys.dtx -2024/02/13 | 4570 | macros/latex/contrib/l3kernel/l3legacy.dtx -2024/02/13 | 23828 | macros/latex/contrib/l3kernel/l3luatex.dtx -2024/02/13 | 82874 | macros/latex/contrib/l3kernel/l3msg.dtx -2024/02/13 | 80270 | macros/latex/contrib/l3kernel/l3names.dtx -2024/02/13 | 122959 | macros/latex/contrib/l3kernel/l3news01.pdf -2024/02/13 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex -2024/02/13 | 150919 | macros/latex/contrib/l3kernel/l3news02.pdf -2024/02/13 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex -2024/02/13 | 148747 | macros/latex/contrib/l3kernel/l3news03.pdf -2024/02/13 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex -2024/02/13 | 114754 | macros/latex/contrib/l3kernel/l3news04.pdf -2024/02/13 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex -2024/02/13 | 112524 | macros/latex/contrib/l3kernel/l3news05.pdf -2024/02/13 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex -2024/02/13 | 151591 | macros/latex/contrib/l3kernel/l3news06.pdf -2024/02/13 | 6433 | macros/latex/contrib/l3kernel/l3news06.tex -2024/02/13 | 128344 | macros/latex/contrib/l3kernel/l3news07.pdf -2024/02/13 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex -2024/02/13 | 163484 | macros/latex/contrib/l3kernel/l3news08.pdf -2024/02/13 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex -2024/02/13 | 250159 | macros/latex/contrib/l3kernel/l3news09.pdf -2024/02/13 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex -2024/02/13 | 150302 | macros/latex/contrib/l3kernel/l3news10.pdf -2024/02/13 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex -2024/02/13 | 170102 | macros/latex/contrib/l3kernel/l3news11.pdf -2024/02/13 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex -2024/02/13 | 205020 | macros/latex/contrib/l3kernel/l3news12.pdf -2024/02/13 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex -2024/02/13 | 396222 | macros/latex/contrib/l3kernel/l3news.pdf -2024/02/13 | 4890 | macros/latex/contrib/l3kernel/l3news.tex -2024/02/13 | 17204 | macros/latex/contrib/l3kernel/l3pdf.dtx -2024/02/13 | 48372 | macros/latex/contrib/l3kernel/l3prefixes.csv -2024/02/13 | 82731 | macros/latex/contrib/l3kernel/l3prefixes.pdf -2024/02/13 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex -2024/02/13 | 70830 | macros/latex/contrib/l3kernel/l3prg.dtx -2024/02/13 | 103074 | macros/latex/contrib/l3kernel/l3prop.dtx -2024/02/13 | 35453 | macros/latex/contrib/l3kernel/l3quark.dtx -2024/02/13 | 305486 | macros/latex/contrib/l3kernel/l3regex.dtx -2024/02/13 | 100486 | macros/latex/contrib/l3kernel/l3seq.dtx -2024/02/13 | 91719 | macros/latex/contrib/l3kernel/l3skip.dtx -2024/02/13 | 40727 | macros/latex/contrib/l3kernel/l3sort.dtx -2024/02/13 | 113735 | macros/latex/contrib/l3kernel/l3str-convert.dtx -2024/02/13 | 82462 | macros/latex/contrib/l3kernel/l3str.dtx -2024/02/13 | 296657 | macros/latex/contrib/l3kernel/l3styleguide.pdf -2024/02/13 | 11882 | macros/latex/contrib/l3kernel/l3styleguide.tex -2024/02/13 | 231496 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf -2024/02/13 | 6219 | macros/latex/contrib/l3kernel/l3syntax-changes.tex -2024/02/13 | 36608 | macros/latex/contrib/l3kernel/l3sys.dtx -2024/02/13 | 242296 | macros/latex/contrib/l3kernel/l3term-glossary.pdf -2024/02/13 | 7079 | macros/latex/contrib/l3kernel/l3term-glossary.tex -2024/02/13 | 76368 | macros/latex/contrib/l3kernel/l3text-case.dtx -2024/02/13 | 48900 | macros/latex/contrib/l3kernel/l3text.dtx -2024/02/13 | 16624 | macros/latex/contrib/l3kernel/l3text-map.dtx -2024/02/13 | 20460 | macros/latex/contrib/l3kernel/l3text-purify.dtx -2024/02/13 | 62663 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx -2024/02/13 | 13250 | macros/latex/contrib/l3kernel/l3tl-build.dtx -2024/02/13 | 149691 | macros/latex/contrib/l3kernel/l3tl.dtx -2024/02/13 | 116935 | macros/latex/contrib/l3kernel/l3token.dtx -2024/02/13 | 35639 | macros/latex/contrib/l3kernel/l3unicode.dtx -2024/02/13 | 3078 | macros/latex/contrib/l3kernel/README.md -2024/02/13 | 24830 | macros/latex/contrib/l3kernel/source3body.tex -2024/02/13 | 7574815 | macros/latex/contrib/l3kernel/source3.pdf -2024/02/13 | 2282 | macros/latex/contrib/l3kernel/source3.tex -2024/02/14 | 14046736 | macros/latex/contrib/l3kernel.zip -2024/02/13 | 7813 | macros/latex/contrib/l3packages/CHANGELOG.md -2024/02/13 | 1444 | macros/latex/contrib/l3packages/l3keys2e-demo.tex -2024/02/13 | 12304 | macros/latex/contrib/l3packages/l3keys2e.dtx -2024/02/13 | 1228 | macros/latex/contrib/l3packages/l3keys2e.ins -2024/02/13 | 412717 | macros/latex/contrib/l3packages/l3keys2e.pdf -2024/02/13 | 1005 | macros/latex/contrib/l3packages/README.md -2024/02/13 | 7372 | macros/latex/contrib/l3packages/xfp.dtx -2024/02/13 | 1191 | macros/latex/contrib/l3packages/xfp.ins -2024/02/13 | 332421 | macros/latex/contrib/l3packages/xfp.pdf -2024/02/13 | 84537 | macros/latex/contrib/l3packages/xparse-2018-04-12.sty -2024/02/13 | 6195 | macros/latex/contrib/l3packages/xparse-2020-10-01.sty -2024/02/13 | 59622 | macros/latex/contrib/l3packages/xparse.dtx -2024/02/13 | 80215 | macros/latex/contrib/l3packages/xparse-generic.tex -2024/02/13 | 1272 | macros/latex/contrib/l3packages/xparse.ins -2024/02/13 | 534182 | macros/latex/contrib/l3packages/xparse.pdf -2024/02/13 | 49753 | macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty -2024/02/13 | 28221 | macros/latex/contrib/l3packages/xtemplate.dtx -2024/02/13 | 1561 | macros/latex/contrib/l3packages/xtemplate.ins -2024/02/13 | 448106 | macros/latex/contrib/l3packages/xtemplate.pdf -2024/02/14 | 1749530 | macros/latex/contrib/l3packages.zip +2024/02/18 | 57732 | macros/latex/contrib/l3kernel/CHANGELOG.md +2024/02/18 | 71193 | macros/latex/contrib/l3kernel/expl3.dtx +2024/02/18 | 610339 | macros/latex/contrib/l3kernel/expl3.pdf +2024/02/18 | 1793104 | macros/latex/contrib/l3kernel/interface3.pdf +2024/02/18 | 1949 | macros/latex/contrib/l3kernel/interface3.tex +2024/02/18 | 137856 | macros/latex/contrib/l3kernel/l3basics.dtx +2024/02/18 | 19547 | macros/latex/contrib/l3kernel/l3bitset.dtx +2024/02/18 | 12948 | macros/latex/contrib/l3kernel/l3bootstrap.dtx +2024/02/18 | 87749 | macros/latex/contrib/l3kernel/l3box.dtx +2024/02/18 | 33772 | macros/latex/contrib/l3kernel/l3cctab.dtx +2024/02/18 | 83169 | macros/latex/contrib/l3kernel/l3clist.dtx +2024/02/18 | 88241 | macros/latex/contrib/l3kernel/l3coffins.dtx +2024/02/18 | 112260 | macros/latex/contrib/l3kernel/l3color.dtx +2024/02/18 | 41910 | macros/latex/contrib/l3kernel/l3debug.dtx +2024/02/18 | 24987 | macros/latex/contrib/l3kernel/l3deprecation.dtx +2024/02/18 | 159767 | macros/latex/contrib/l3kernel/l3doc.dtx +2024/02/18 | 565548 | macros/latex/contrib/l3kernel/l3doc.pdf +2024/02/18 | 2384 | macros/latex/contrib/l3kernel/l3docstrip.dtx +2024/02/18 | 151219 | macros/latex/contrib/l3kernel/l3docstrip.pdf +2024/02/18 | 88794 | macros/latex/contrib/l3kernel/l3expan.dtx +2024/02/18 | 144214 | macros/latex/contrib/l3kernel/l3file.dtx +2024/02/18 | 14152 | macros/latex/contrib/l3kernel/l3flag.dtx +2024/02/18 | 11778 | macros/latex/contrib/l3kernel/l3fparray.dtx +2024/02/18 | 9445 | macros/latex/contrib/l3kernel/l3fp-assign.dtx +2024/02/18 | 47237 | macros/latex/contrib/l3kernel/l3fp-aux.dtx +2024/02/18 | 84789 | macros/latex/contrib/l3kernel/l3fp-basics.dtx +2024/02/18 | 19637 | macros/latex/contrib/l3kernel/l3fp-convert.dtx +2024/02/18 | 76534 | macros/latex/contrib/l3kernel/l3fp.dtx +2024/02/18 | 49321 | macros/latex/contrib/l3kernel/l3fp-expo.dtx +2024/02/18 | 51091 | macros/latex/contrib/l3kernel/l3fp-extended.dtx +2024/02/18 | 7831 | macros/latex/contrib/l3kernel/l3fp-functions.dtx +2024/02/18 | 23206 | macros/latex/contrib/l3kernel/l3fp-logic.dtx +2024/02/18 | 105022 | macros/latex/contrib/l3kernel/l3fp-parse.dtx +2024/02/18 | 23581 | macros/latex/contrib/l3kernel/l3fp-random.dtx +2024/02/18 | 18528 | macros/latex/contrib/l3kernel/l3fp-round.dtx +2024/02/18 | 20310 | macros/latex/contrib/l3kernel/l3fp-symbolic.dtx +2024/02/18 | 12832 | macros/latex/contrib/l3kernel/l3fp-traps.dtx +2024/02/18 | 73845 | macros/latex/contrib/l3kernel/l3fp-trig.dtx +2024/02/18 | 4911 | macros/latex/contrib/l3kernel/l3fp-types.dtx +2024/02/18 | 6393 | macros/latex/contrib/l3kernel/l3.ins +2024/02/18 | 30504 | macros/latex/contrib/l3kernel/l3intarray.dtx +2024/02/18 | 92983 | macros/latex/contrib/l3kernel/l3int.dtx +2024/02/18 | 29838 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx +2024/02/18 | 130500 | macros/latex/contrib/l3kernel/l3keys.dtx +2024/02/18 | 4570 | macros/latex/contrib/l3kernel/l3legacy.dtx +2024/02/18 | 23828 | macros/latex/contrib/l3kernel/l3luatex.dtx +2024/02/18 | 82874 | macros/latex/contrib/l3kernel/l3msg.dtx +2024/02/18 | 80270 | macros/latex/contrib/l3kernel/l3names.dtx +2024/02/18 | 122959 | macros/latex/contrib/l3kernel/l3news01.pdf +2024/02/18 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex +2024/02/18 | 150919 | macros/latex/contrib/l3kernel/l3news02.pdf +2024/02/18 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex +2024/02/18 | 148747 | macros/latex/contrib/l3kernel/l3news03.pdf +2024/02/18 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex +2024/02/18 | 114754 | macros/latex/contrib/l3kernel/l3news04.pdf +2024/02/18 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex +2024/02/18 | 112524 | macros/latex/contrib/l3kernel/l3news05.pdf +2024/02/18 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex +2024/02/18 | 151591 | macros/latex/contrib/l3kernel/l3news06.pdf +2024/02/18 | 6433 | macros/latex/contrib/l3kernel/l3news06.tex +2024/02/18 | 128344 | macros/latex/contrib/l3kernel/l3news07.pdf +2024/02/18 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex +2024/02/18 | 163484 | macros/latex/contrib/l3kernel/l3news08.pdf +2024/02/18 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex +2024/02/18 | 250159 | macros/latex/contrib/l3kernel/l3news09.pdf +2024/02/18 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex +2024/02/18 | 150302 | macros/latex/contrib/l3kernel/l3news10.pdf +2024/02/18 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex +2024/02/18 | 170102 | macros/latex/contrib/l3kernel/l3news11.pdf +2024/02/18 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex +2024/02/18 | 205020 | macros/latex/contrib/l3kernel/l3news12.pdf +2024/02/18 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex +2024/02/18 | 396222 | macros/latex/contrib/l3kernel/l3news.pdf +2024/02/18 | 4890 | macros/latex/contrib/l3kernel/l3news.tex +2024/02/18 | 17204 | macros/latex/contrib/l3kernel/l3pdf.dtx +2024/02/18 | 48386 | macros/latex/contrib/l3kernel/l3prefixes.csv +2024/02/18 | 82720 | macros/latex/contrib/l3kernel/l3prefixes.pdf +2024/02/18 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex +2024/02/18 | 70830 | macros/latex/contrib/l3kernel/l3prg.dtx +2024/02/18 | 103246 | macros/latex/contrib/l3kernel/l3prop.dtx +2024/02/18 | 35453 | macros/latex/contrib/l3kernel/l3quark.dtx +2024/02/18 | 305486 | macros/latex/contrib/l3kernel/l3regex.dtx +2024/02/18 | 100486 | macros/latex/contrib/l3kernel/l3seq.dtx +2024/02/18 | 91719 | macros/latex/contrib/l3kernel/l3skip.dtx +2024/02/18 | 40727 | macros/latex/contrib/l3kernel/l3sort.dtx +2024/02/18 | 113735 | macros/latex/contrib/l3kernel/l3str-convert.dtx +2024/02/18 | 82462 | macros/latex/contrib/l3kernel/l3str.dtx +2024/02/18 | 296530 | macros/latex/contrib/l3kernel/l3styleguide.pdf +2024/02/18 | 11882 | macros/latex/contrib/l3kernel/l3styleguide.tex +2024/02/18 | 231378 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf +2024/02/18 | 6219 | macros/latex/contrib/l3kernel/l3syntax-changes.tex +2024/02/18 | 36608 | macros/latex/contrib/l3kernel/l3sys.dtx +2024/02/18 | 242164 | macros/latex/contrib/l3kernel/l3term-glossary.pdf +2024/02/18 | 7079 | macros/latex/contrib/l3kernel/l3term-glossary.tex +2024/02/18 | 76368 | macros/latex/contrib/l3kernel/l3text-case.dtx +2024/02/18 | 48900 | macros/latex/contrib/l3kernel/l3text.dtx +2024/02/18 | 16624 | macros/latex/contrib/l3kernel/l3text-map.dtx +2024/02/18 | 20460 | macros/latex/contrib/l3kernel/l3text-purify.dtx +2024/02/18 | 63041 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx +2024/02/18 | 13250 | macros/latex/contrib/l3kernel/l3tl-build.dtx +2024/02/18 | 149691 | macros/latex/contrib/l3kernel/l3tl.dtx +2024/02/18 | 117131 | macros/latex/contrib/l3kernel/l3token.dtx +2024/02/18 | 35639 | macros/latex/contrib/l3kernel/l3unicode.dtx +2024/02/18 | 3078 | macros/latex/contrib/l3kernel/README.md +2024/02/18 | 24830 | macros/latex/contrib/l3kernel/source3body.tex +2024/02/18 | 7556690 | macros/latex/contrib/l3kernel/source3.pdf +2024/02/18 | 2282 | macros/latex/contrib/l3kernel/source3.tex +2024/02/18 | 14028549 | macros/latex/contrib/l3kernel.zip +2024/02/18 | 7978 | macros/latex/contrib/l3packages/CHANGELOG.md +2024/02/18 | 1444 | macros/latex/contrib/l3packages/l3keys2e-demo.tex +2024/02/18 | 12304 | macros/latex/contrib/l3packages/l3keys2e.dtx +2024/02/18 | 1228 | macros/latex/contrib/l3packages/l3keys2e.ins +2024/02/18 | 412694 | macros/latex/contrib/l3packages/l3keys2e.pdf +2024/02/18 | 1005 | macros/latex/contrib/l3packages/README.md +2024/02/18 | 7372 | macros/latex/contrib/l3packages/xfp.dtx +2024/02/18 | 1191 | macros/latex/contrib/l3packages/xfp.ins +2024/02/18 | 332379 | macros/latex/contrib/l3packages/xfp.pdf +2024/02/18 | 84537 | macros/latex/contrib/l3packages/xparse-2018-04-12.sty +2024/02/18 | 6195 | macros/latex/contrib/l3packages/xparse-2020-10-01.sty +2024/02/18 | 59622 | macros/latex/contrib/l3packages/xparse.dtx +2024/02/18 | 80215 | macros/latex/contrib/l3packages/xparse-generic.tex +2024/02/18 | 1272 | macros/latex/contrib/l3packages/xparse.ins +2024/02/18 | 534131 | macros/latex/contrib/l3packages/xparse.pdf +2024/02/18 | 49753 | macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty +2024/02/18 | 28584 | macros/latex/contrib/l3packages/xtemplate.dtx +2024/02/18 | 1561 | macros/latex/contrib/l3packages/xtemplate.ins +2024/02/18 | 448820 | macros/latex/contrib/l3packages/xtemplate.pdf +2024/02/18 | 1750298 | macros/latex/contrib/l3packages.zip 2008/03/30 | 76250 | macros/latex/contrib/labbook/labboode.pdf 2003/08/06 | 81327 | macros/latex/contrib/labbook/labbook.dtx 2003/06/03 | 1041 | macros/latex/contrib/labbook/labbook.el @@ -248033,19 +248035,19 @@ 2007/05/16 | 179602 | macros/latex/contrib/randbild/randbild.pdf 2007/05/16 | 4038 | macros/latex/contrib/randbild/README 2007/05/16 | 80648 | macros/latex/contrib/randbild.zip -2024/02/03 | 49588 | macros/latex/contrib/randexam/randexam-a-answer.pdf -2024/02/02 | 10522 | macros/latex/contrib/randexam/randexam-a-answer.tex -2024/02/03 | 41374 | macros/latex/contrib/randexam/randexam-a-blank.pdf -2024/01/27 | 156 | macros/latex/contrib/randexam/randexam-a-blank.tex -2024/02/03 | 49570 | macros/latex/contrib/randexam/randexam-b-answer.pdf -2024/01/30 | 171 | macros/latex/contrib/randexam/randexam-b-answer.tex -2024/02/03 | 41309 | macros/latex/contrib/randexam/randexam-b-blank.pdf -2024/01/27 | 156 | macros/latex/contrib/randexam/randexam-b-blank.tex -2024/02/02 | 45387 | macros/latex/contrib/randexam/randexam.cls -2024/02/03 | 52431 | macros/latex/contrib/randexam/randexam.pdf -2024/02/02 | 21736 | macros/latex/contrib/randexam/randexam.tex +2024/02/17 | 49886 | macros/latex/contrib/randexam/randexam-a-answer.pdf +2024/02/17 | 10524 | macros/latex/contrib/randexam/randexam-a-answer.tex +2024/02/17 | 41751 | macros/latex/contrib/randexam/randexam-a-blank.pdf +2024/02/17 | 156 | macros/latex/contrib/randexam/randexam-a-blank.tex +2024/02/17 | 49948 | macros/latex/contrib/randexam/randexam-b-answer.pdf +2024/02/17 | 171 | macros/latex/contrib/randexam/randexam-b-answer.tex +2024/02/17 | 41687 | macros/latex/contrib/randexam/randexam-b-blank.pdf +2024/02/17 | 156 | macros/latex/contrib/randexam/randexam-b-blank.tex +2024/02/18 | 49156 | macros/latex/contrib/randexam/randexam.cls +2024/02/18 | 63636 | macros/latex/contrib/randexam/randexam.pdf +2024/02/18 | 24801 | macros/latex/contrib/randexam/randexam.tex 2024/01/27 | 140 | macros/latex/contrib/randexam/README -2024/02/03 | 245809 | macros/latex/contrib/randexam.zip +2024/02/18 | 257400 | macros/latex/contrib/randexam.zip 2018/12/28 | 15719 | macros/latex/contrib/randomwalk/randomwalk.dtx 2018/12/28 | 409 | macros/latex/contrib/randomwalk/randomwalk.ins 2018/12/28 | 478962 | macros/latex/contrib/randomwalk/randomwalk.pdf @@ -250219,6 +250221,15 @@ 2024/02/15 | 273398 | macros/latex/contrib/siunitx/siunitx-v2.sty 2024/02/15 | 31738 | macros/latex/contrib/siunitx/siunitx-version-1.cfg 2024/02/15 | 1546468 | macros/latex/contrib/siunitx.zip +2024/02/18 | 1904 | macros/latex/contrib/sjtutex/README.md +2024/02/18 | 210848 | macros/latex/contrib/sjtutex/sjtutex.dtx +2024/02/18 | 713536 | macros/latex/contrib/sjtutex/sjtutex.pdf +2024/02/18 | 20101 | macros/latex/contrib/sjtutex/sjtu-vi-badge-red.pdf +2024/02/18 | 20011 | macros/latex/contrib/sjtutex/sjtu-vi-badge-small-red.pdf +2024/02/18 | 39157 | macros/latex/contrib/sjtutex/sjtu-vi-logo-red.pdf +2024/02/18 | 39066 | macros/latex/contrib/sjtutex/sjtu-vi-logo-small-red.pdf +2024/02/18 | 20802 | macros/latex/contrib/sjtutex/sjtu-vi-name-red.pdf +2024/02/18 | 882205 | macros/latex/contrib/sjtutex.zip 2011/06/03 | 662398 | macros/latex/contrib/skb/doc/skb.pdf 2011/03/15 | 1485 | macros/latex/contrib/skb/doc/user-guide/database/acronyms.tex 2011/03/15 | 722 | macros/latex/contrib/skb/doc/user-guide/database/bibliography.tex @@ -300238,7 +300249,7 @@ 2021/05/03 | 629 | support/TeX4ht/doc/README 2020/08/24 | 358454 | support/TeX4ht/doc/TeX4ht-doc.tex 2021/05/11 | 262 | support/TeX4ht/README -2024/02/16 | 245753 | support/TeX4ht/source/ChangeLog +2024/02/17 | 245987 | support/TeX4ht/source/ChangeLog 2021/05/03 | 1375 | support/TeX4ht/source/checklog.lua 2021/05/03 | 1189 | support/TeX4ht/source/common-code.tex 2021/05/03 | 2727 | support/TeX4ht/source/common-info.tex @@ -300272,7 +300283,7 @@ 2022/07/16 | 187196 | support/TeX4ht/source/tex4ht-fonts-mnsymbol.tex 2023/03/29 | 703260 | support/TeX4ht/source/tex4ht-fonts-modern.tex 2023/11/19 | 297980 | support/TeX4ht/source/tex4ht-fonts-newtx.tex -2023/12/20 | 1658217 | support/TeX4ht/source/tex4ht-fonts-noncjk.tex +2024/02/17 | 1663353 | support/TeX4ht/source/tex4ht-fonts-noncjk.tex 2023/05/14 | 207863 | support/TeX4ht/source/tex4ht-fonts-opensans.tex 2023/05/14 | 207441 | support/TeX4ht/source/tex4ht-fonts-spectral.tex 2023/05/14 | 162204 | support/TeX4ht/source/tex4ht-fonts-stix2.tex @@ -302604,13 +302615,13 @@ 2023/02/19 | 54964523 | systems/mac/mactex/mactex-ghostscript-10.0.0-20230218.pkg 2023/03/20 | 73 | systems/mac/mactex/mactex-ghostscript-10.0.0-20230218.pkg.md5 2023/03/20 | 169 | systems/mac/mactex/mactex-ghostscript-10.0.0-20230218.pkg.sha512 -2023/03/15 | 2285239 | systems/mac/mactex/mactex-MacTeXtras-20230320.zip -2023/03/20 | 65 | systems/mac/mactex/mactex-MacTeXtras-20230320.zip.md5 -2023/03/20 | 161 | systems/mac/mactex/mactex-MacTeXtras-20230320.zip.sha512 +2024/02/17 | 2284462 | systems/mac/mactex/mactex-MacTeXtras-20240217.zip +2024/02/17 | 65 | systems/mac/mactex/mactex-MacTeXtras-20240217.zip.md5 +2024/02/17 | 161 | systems/mac/mactex/mactex-MacTeXtras-20240217.zip.sha512 2023/03/19 | 45 | systems/mac/mactex/MacTeX.pkg.md5 2023/03/19 | 141 | systems/mac/mactex/MacTeX.pkg.sha512 -2023/03/20 | 49 | systems/mac/mactex/MacTeXtras.zip.md5 -2023/03/20 | 145 | systems/mac/mactex/MacTeXtras.zip.sha512 +2024/02/17 | 49 | systems/mac/mactex/MacTeXtras.zip.md5 +2024/02/17 | 145 | systems/mac/mactex/MacTeXtras.zip.sha512 2023/03/19 | 182 | systems/mac/mactex/README 1995/08/15 | 308344 | systems/mac/MakeIndex-Fat-1.0-sit.hqx 1994/04/20 | 2925109 | systems/mac/metafont/bluesky/MAC_MF_0.66.sit.hqx @@ -306258,8 +306269,8 @@ 2023/01/28 | 4844 | systems/texlive/tlnet/archive/codeanatomy.source.r65648.tar.xz 2022/01/29 | 385704 | systems/texlive/tlnet/archive/codebox.doc.r61771.tar.xz 2022/01/29 | 3640 | systems/texlive/tlnet/archive/codebox.r61771.tar.xz -2024/01/08 | 239500 | systems/texlive/tlnet/archive/codedescribe.doc.r69343.tar.xz -2024/01/08 | 11044 | systems/texlive/tlnet/archive/codedescribe.r69343.tar.xz +2024/02/18 | 240104 | systems/texlive/tlnet/archive/codedescribe.doc.r69944.tar.xz +2024/02/18 | 11100 | systems/texlive/tlnet/archive/codedescribe.r69944.tar.xz 2019/02/28 | 377460 | systems/texlive/tlnet/archive/codedoc.doc.r17630.tar.xz 2019/02/28 | 10108 | systems/texlive/tlnet/archive/codedoc.r17630.tar.xz 2023/02/12 | 97984 | systems/texlive/tlnet/archive/codehigh.doc.r65787.tar.xz @@ -312636,8 +312647,8 @@ 2023/08/23 | 427424 | systems/texlive/tlnet/archive/notomath.doc.r68014.tar.xz 2023/08/23 | 213708 | systems/texlive/tlnet/archive/notomath.r68014.tar.xz 2022/09/13 | 26607012 | systems/texlive/tlnet/archive/noto.r64351.tar.xz -2024/02/17 | 4168608 | systems/texlive/tlnet/archive/novel.doc.r69925.tar.xz -2024/02/17 | 116580 | systems/texlive/tlnet/archive/novel.r69925.tar.xz +2024/02/18 | 4171144 | systems/texlive/tlnet/archive/novel.doc.r69945.tar.xz +2024/02/18 | 116564 | systems/texlive/tlnet/archive/novel.r69945.tar.xz 2019/02/28 | 175128 | systems/texlive/tlnet/archive/nowidow.doc.r24066.tar.xz 2019/02/28 | 1200 | systems/texlive/tlnet/archive/nowidow.r24066.tar.xz 2019/02/28 | 3340 | systems/texlive/tlnet/archive/nowidow.source.r24066.tar.xz @@ -313668,9 +313679,9 @@ 2021/08/26 | 30572 | systems/texlive/tlnet/archive/polski.source.r60322.tar.xz 2023/07/24 | 1392140 | systems/texlive/tlnet/archive/poltawski.doc.r67718.tar.xz 2023/07/24 | 6817740 | systems/texlive/tlnet/archive/poltawski.r67718.tar.xz -2023/12/12 | 815268 | systems/texlive/tlnet/archive/polyglossia.doc.r69093.tar.xz -2023/12/12 | 126768 | systems/texlive/tlnet/archive/polyglossia.r69093.tar.xz -2023/12/12 | 169816 | systems/texlive/tlnet/archive/polyglossia.source.r69093.tar.xz +2024/02/18 | 824692 | systems/texlive/tlnet/archive/polyglossia.doc.r69946.tar.xz +2024/02/18 | 126540 | systems/texlive/tlnet/archive/polyglossia.r69946.tar.xz +2024/02/18 | 171084 | systems/texlive/tlnet/archive/polyglossia.source.r69946.tar.xz 2023/11/10 | 186376 | systems/texlive/tlnet/archive/polyhedra.doc.r68770.tar.xz 2023/11/10 | 3500 | systems/texlive/tlnet/archive/polyhedra.r68770.tar.xz 2019/02/28 | 400020 | systems/texlive/tlnet/archive/polynom.doc.r44832.tar.xz @@ -315990,7 +316001,7 @@ 2022/09/13 | 600 | systems/texlive/tlnet/archive/texlive-scripts.amd64-freebsd.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.amd64-netbsd.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.armhf-linux.r64356.tar.xz -2024/02/17 | 432568 | systems/texlive/tlnet/archive/texlive-scripts.doc.r69902.tar.xz +2024/02/18 | 432612 | systems/texlive/tlnet/archive/texlive-scripts.doc.r69938.tar.xz 2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.aarch64-linux.r53577.tar.xz 2020/01/27 | 924 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-freebsd.r53577.tar.xz 2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-netbsd.r53577.tar.xz @@ -316012,7 +316023,7 @@ 2022/09/13 | 592 | systems/texlive/tlnet/archive/texlive-scripts.i386-linux.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-netbsd.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-solaris.r64356.tar.xz -2024/02/17 | 114052 | systems/texlive/tlnet/archive/texlive-scripts.r69902.tar.xz +2024/02/18 | 114052 | systems/texlive/tlnet/archive/texlive-scripts.r69938.tar.xz 2022/09/13 | 580 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r64356.tar.xz 2023/05/14 | 60312 | systems/texlive/tlnet/archive/texlive-scripts.windows.r67095.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r64356.tar.xz @@ -317923,16 +317934,16 @@ 2020/07/18 | 47816 | systems/texlive/tlnet/archive/zztex.doc.r55862.tar.xz 2020/07/18 | 101724 | systems/texlive/tlnet/archive/zztex.r55862.tar.xz 2024/02/05 | 125030 | systems/texlive/tlnet/install-tl -2024/02/17 | 5748174 | systems/texlive/tlnet/install-tl-unx.tar.gz -2024/02/17 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 -2024/02/17 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc +2024/02/18 | 5749498 | systems/texlive/tlnet/install-tl-unx.tar.gz +2024/02/18 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 +2024/02/18 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc 2023/05/13 | 5083 | systems/texlive/tlnet/install-tl-windows.bat -2024/02/17 | 21030898 | systems/texlive/tlnet/install-tl-windows.exe -2024/02/17 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 -2024/02/17 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc -2024/02/17 | 26035598 | systems/texlive/tlnet/install-tl.zip -2024/02/17 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 -2024/02/17 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc +2024/02/18 | 21030931 | systems/texlive/tlnet/install-tl-windows.exe +2024/02/18 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 +2024/02/18 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc +2024/02/18 | 26035598 | systems/texlive/tlnet/install-tl.zip +2024/02/18 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 +2024/02/18 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc 2023/03/19 | 1229 | systems/texlive/tlnet/README.md 2023/03/19 | 0 | systems/texlive/tlnet/TEXLIVE_2023 2024/01/02 | 9011 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg @@ -317984,12 +317995,12 @@ 2023/02/21 | 20371 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm 2024/01/31 | 5840 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm 2023/04/08 | 28167 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm -2024/02/17 | 19328517 | systems/texlive/tlnet/tlpkg/texlive.tlpdb -2024/02/17 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 +2024/02/18 | 19328466 | systems/texlive/tlnet/tlpkg/texlive.tlpdb +2024/02/18 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 2024/01/31 | 87229 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm -2024/02/17 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 -2024/02/17 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc -2024/02/17 | 2548064 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz +2024/02/18 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +2024/02/18 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc +2024/02/18 | 2548524 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz 2023/02/20 | 58928 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm 2023/06/11 | 42749 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm 2023/02/21 | 16138 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm @@ -320696,7 +320707,7 @@ 2024/02/11 | 95286 | systems/texlive/tlnet/tlpkg/translations/fr.po 2024/02/11 | 88795 | systems/texlive/tlnet/tlpkg/translations/it.po 2024/02/11 | 63064 | systems/texlive/tlnet/tlpkg/translations/ja.po -2024/02/17 | 47499 | systems/texlive/tlnet/tlpkg/translations/messages.pot +2024/02/18 | 47499 | systems/texlive/tlnet/tlpkg/translations/messages.pot 2024/02/11 | 59155 | systems/texlive/tlnet/tlpkg/translations/nl.po 2024/02/11 | 68210 | systems/texlive/tlnet/tlpkg/translations/pl.po 2024/02/11 | 83641 | systems/texlive/tlnet/tlpkg/translations/pt_BR.po @@ -329162,7 +329173,7 @@ 2014/07/05 | 611 | systems/win32/yandy/README 2014/07/05 | 1004628 | systems/win32/yandy/yandy-src.tar.xz 2014/07/05 | 1012416 | systems/win32/yandy.zip -2024/02/18 | 186 | timestamp +2024/02/19 | 186 | timestamp 2002/08/26 | 61898 | usergrps/dante/antrag.pdf 2002/08/26 | 118217 | usergrps/dante/antrag.ps 2021/11/11 | 917 | usergrps/dante/dtk/doc/beispiel.bib diff --git a/FILES.byname.gz b/FILES.byname.gz index 08bc6b1203..82b248a98c 100644 Binary files a/FILES.byname.gz and b/FILES.byname.gz differ diff --git a/FILES.last07days b/FILES.last07days index 98e39fc64f..2b6e2011de 100644 --- a/FILES.last07days +++ b/FILES.last07days @@ -1,5 +1,1311 @@ +2024/02/18 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex +2024/02/18 | 975103 | install/macros/latex/contrib/sjtutex.tds.zip +2024/02/18 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex +2024/02/18 | 9445 | macros/latex/contrib/l3kernel/l3fp-assign.dtx +2024/02/18 | 92983 | macros/latex/contrib/l3kernel/l3int.dtx +2024/02/18 | 91719 | macros/latex/contrib/l3kernel/l3skip.dtx +2024/02/18 | 91329 | macros/latex/contrib/easybook/easybook.tex +2024/02/18 | 88794 | macros/latex/contrib/l3kernel/l3expan.dtx +2024/02/18 | 88241 | macros/latex/contrib/l3kernel/l3coffins.dtx +2024/02/18 | 882205 | macros/latex/contrib/sjtutex.zip +2024/02/18 | 87749 | macros/latex/contrib/l3kernel/l3box.dtx +2024/02/18 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex +2024/02/18 | 84789 | macros/latex/contrib/l3kernel/l3fp-basics.dtx +2024/02/18 | 84537 | macros/latex/contrib/l3packages/xparse-2018-04-12.sty +2024/02/18 | 83169 | macros/latex/contrib/l3kernel/l3clist.dtx +2024/02/18 | 82874 | macros/latex/contrib/l3kernel/l3msg.dtx +2024/02/18 | 82720 | macros/latex/contrib/l3kernel/l3prefixes.pdf +2024/02/18 | 824692 | systems/texlive/tlnet/archive/polyglossia.doc.r69946.tar.xz +2024/02/18 | 82462 | macros/latex/contrib/l3kernel/l3str.dtx +2024/02/18 | 80270 | macros/latex/contrib/l3kernel/l3names.dtx +2024/02/18 | 80215 | macros/latex/contrib/l3packages/xparse-generic.tex +2024/02/18 | 7978 | macros/latex/contrib/l3packages/CHANGELOG.md +2024/02/18 | 7831 | macros/latex/contrib/l3kernel/l3fp-functions.dtx +2024/02/18 | 76700 | macros/latex/contrib/easybook/easybook.dtx +2024/02/18 | 76534 | macros/latex/contrib/l3kernel/l3fp.dtx +2024/02/18 | 76368 | macros/latex/contrib/l3kernel/l3text-case.dtx +2024/02/18 | 7556690 | macros/latex/contrib/l3kernel/source3.pdf +2024/02/18 | 73845 | macros/latex/contrib/l3kernel/l3fp-trig.dtx +2024/02/18 | 7372 | macros/latex/contrib/l3packages/xfp.dtx +2024/02/18 | 713536 | macros/latex/contrib/sjtutex/sjtutex.pdf +2024/02/18 | 71193 | macros/latex/contrib/l3kernel/expl3.dtx +2024/02/18 | 70830 | macros/latex/contrib/l3kernel/l3prg.dtx +2024/02/18 | 7079 | macros/latex/contrib/l3kernel/l3term-glossary.tex +2024/02/18 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex +2024/02/18 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex +2024/02/18 | 645793 | macros/latex/contrib/easybook.zip +2024/02/18 | 6433 | macros/latex/contrib/l3kernel/l3news06.tex +2024/02/18 | 64005 | macros/jptex/latex/jlreq-deluxe/jlreq-deluxe.pdf +2024/02/18 | 6393 | macros/latex/contrib/l3kernel/l3.ins +2024/02/18 | 63636 | macros/latex/contrib/randexam/randexam.pdf +2024/02/18 | 63041 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx +2024/02/18 | 6219 | macros/latex/contrib/l3kernel/l3syntax-changes.tex +2024/02/18 | 6195 | macros/latex/contrib/l3packages/xparse-2020-10-01.sty +2024/02/18 | 610339 | macros/latex/contrib/l3kernel/expl3.pdf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expmgothrn-v.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expmgothrn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothrn-v.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothrn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothebn-v.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothebn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothbn-v.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothbn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expmgothrn-v.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expmgothrn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothrn-v.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothrn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothebn-v.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothebn-h.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothbn-v.vf +2024/02/18 | 6044 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothbn-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminrn-v.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminrn-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminln-v.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminln-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminbn-v.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminbn-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminrn-v.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminrn-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminln-v.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminln-h.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminbn-v.vf +2024/02/18 | 6040 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminbn-h.vf +2024/02/18 | 602008 | macros/latex/contrib/easybook/easybook.pdf +2024/02/18 | 59622 | macros/latex/contrib/l3packages/xparse.dtx +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expmgothrn-v.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expmgothrn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothrn-v.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothrn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothebn-v.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothebn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothbn-v.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothbn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expmgothrn-v.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expmgothrn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothrn-v.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothrn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothebn-v.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothebn-h.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothbn-v.vf +2024/02/18 | 5824 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothbn-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminrn-v.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminrn-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminln-v.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminln-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminbn-v.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminbn-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminrn-v.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminrn-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminln-v.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminln-h.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminbn-v.vf +2024/02/18 | 5820 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminbn-h.vf +2024/02/18 | 57732 | macros/latex/contrib/l3kernel/CHANGELOG.md +2024/02/18 | 5749498 | systems/texlive/tlnet/install-tl-unx.tar.gz +2024/02/18 | 565548 | macros/latex/contrib/l3kernel/l3doc.pdf +2024/02/18 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex +2024/02/18 | 536 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlmgothrn-h.vf +2024/02/18 | 536 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlmgothr-h.vf +2024/02/18 | 536 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothebn-h.vf +2024/02/18 | 536 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlmgothrn-h.vf +2024/02/18 | 536 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlmgothr-h.vf +2024/02/18 | 536 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothebn-h.vf +2024/02/18 | 534131 | macros/latex/contrib/l3packages/xparse.pdf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminrn-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminr-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminln-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminl-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminbn-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminb-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothrn-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothr-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgotheb-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothbn-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothb-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminrn-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminr-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminln-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminl-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminbn-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminb-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothrn-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothr-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgotheb-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothbn-h.vf +2024/02/18 | 532 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothb-h.vf +2024/02/18 | 51091 | macros/latex/contrib/l3kernel/l3fp-extended.dtx +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubymgothr-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygotheb-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpmgothr-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpmgothrn-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothrn-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgotheb-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothebn-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothbn-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubymgothr-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygotheb-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpmgothr-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpmgothrn-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothrn-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgotheb-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothebn-v.vf +2024/02/18 | 5108 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothbn-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminr-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminl-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminb-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygothr-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygothb-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminr-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminrn-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminl-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminln-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminb-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminbn-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothr-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothb-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminr-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminl-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminb-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygothr-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygothb-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminr-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminrn-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminl-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminln-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminb-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminbn-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothr-v.vf +2024/02/18 | 5104 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothb-v.vf +2024/02/18 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex +2024/02/18 | 49753 | macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty +2024/02/18 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex +2024/02/18 | 49321 | macros/latex/contrib/l3kernel/l3fp-expo.dtx +2024/02/18 | 49156 | macros/latex/contrib/randexam/randexam.cls +2024/02/18 | 4911 | macros/latex/contrib/l3kernel/l3fp-types.dtx +2024/02/18 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 +2024/02/18 | 4890 | macros/latex/contrib/l3kernel/l3news.tex +2024/02/18 | 48900 | macros/latex/contrib/l3kernel/l3text.dtx +2024/02/18 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc +2024/02/18 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc +2024/02/18 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc +2024/02/18 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc +2024/02/18 | 48386 | macros/latex/contrib/l3kernel/l3prefixes.csv +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubymgothr-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygothr-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygotheb-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygothb-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminrn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminln-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminbn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpmgothr-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpmgothrn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothr-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothrn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgotheb-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothebn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothb-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothbn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubymgothr-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygothr-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygotheb-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygothb-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminrn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminln-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminbn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpmgothr-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpmgothrn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothr-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothrn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgotheb-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothebn-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothb-v.vf +2024/02/18 | 4796 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothbn-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminr-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminl-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminb-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminr-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminl-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminb-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminr-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminl-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminb-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminr-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminl-v.vf +2024/02/18 | 4792 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminb-v.vf +2024/02/18 | 47499 | systems/texlive/tlnet/tlpkg/translations/messages.pot +2024/02/18 | 47237 | macros/latex/contrib/l3kernel/l3fp-aux.dtx +2024/02/18 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex +2024/02/18 | 4570 | macros/latex/contrib/l3kernel/l3legacy.dtx +2024/02/18 | 448820 | macros/latex/contrib/l3packages/xtemplate.pdf +2024/02/18 | 432612 | systems/texlive/tlnet/archive/texlive-scripts.doc.r69938.tar.xz +2024/02/18 | 41910 | macros/latex/contrib/l3kernel/l3debug.dtx +2024/02/18 | 4171144 | systems/texlive/tlnet/archive/novel.doc.r69945.tar.xz +2024/02/18 | 412694 | macros/latex/contrib/l3packages/l3keys2e.pdf +2024/02/18 | 4117547 | biblio/ctan-bibdata.zip +2024/02/18 | 40727 | macros/latex/contrib/l3kernel/l3sort.dtx +2024/02/18 | 3980 | macros/jptex/latex/jlreq-deluxe/README-ja.md +2024/02/18 | 396222 | macros/latex/contrib/l3kernel/l3news.pdf +2024/02/18 | 39157 | macros/latex/contrib/sjtutex/sjtu-vi-logo-red.pdf +2024/02/18 | 39066 | macros/latex/contrib/sjtutex/sjtu-vi-logo-small-red.pdf +2024/02/18 | 3896 | macros/jptex/latex/jlreq-deluxe/jlreq-deluxe.sty +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubymgothr-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygotheb-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpmgothrn-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpmgothr-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothrn-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothebn-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgotheb-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothbn-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubymgothr-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygotheb-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpmgothrn-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpmgothr-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothrn-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothebn-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgotheb-h.vf +2024/02/18 | 3884 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothbn-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminr-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminl-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubyminb-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygothr-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--uprubygothb-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminrn-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminr-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminln-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminl-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminbn-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpminb-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothr-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upexpgothb-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminr-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminl-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubyminb-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygothr-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--uprubygothb-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminrn-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminr-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminln-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminl-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminbn-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpminb-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothr-h.vf +2024/02/18 | 3880 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upexpgothb-h.vf +2024/02/18 | 3846 | macros/jptex/latex/jlreq-deluxe/jlreq-deluxe.tex +2024/02/18 | 3708800 | biblio/ctan-bibdata/ctan.pdf +2024/02/18 | 36608 | macros/latex/contrib/l3kernel/l3sys.dtx +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubymgothr-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygothr-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygotheb-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubygothb-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminrn-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminln-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminbn-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpmgothrn-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpmgothr-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothrn-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothr-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothebn-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgotheb-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothbn-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpgothb-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubymgothr-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygothr-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygotheb-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubygothb-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminrn-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminln-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminbn-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpmgothrn-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpmgothr-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothrn-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothr-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothebn-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgotheb-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothbn-h.vf +2024/02/18 | 3604 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpgothb-h.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminr-h.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminl-h.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--uprubyminb-h.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminr-h.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminl-h.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upexpminb-h.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminr-h.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminl-h.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--uprubyminb-h.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminr-h.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminl-h.vf +2024/02/18 | 3600 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upexpminb-h.vf +2024/02/18 | 35639 | macros/latex/contrib/l3kernel/l3unicode.dtx +2024/02/18 | 35453 | macros/latex/contrib/l3kernel/l3quark.dtx +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlmgothr-v.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlmgothr-h.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgotheb-v.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgotheb-h.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlmgothr-v.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlmgothr-h.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgotheb-v.vf +2024/02/18 | 340 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgotheb-h.vf +2024/02/18 | 33772 | macros/latex/contrib/l3kernel/l3cctab.dtx +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminr-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminr-h.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminl-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminl-h.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminb-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminb-h.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothr-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothr-h.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothb-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothb-h.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminr-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminr-h.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminl-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminl-h.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminb-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminb-h.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothr-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothr-h.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothb-v.vf +2024/02/18 | 336 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothb-h.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubymgothr-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubymgothr-h.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygotheb-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygotheb-h.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expmgothr-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expmgothr-h.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgotheb-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgotheb-h.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubymgothr-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubymgothr-h.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygotheb-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygotheb-h.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expmgothr-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expmgothr-h.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgotheb-v.vf +2024/02/18 | 3324 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgotheb-h.vf +2024/02/18 | 332379 | macros/latex/contrib/l3packages/xfp.pdf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminr-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminl-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminl-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubyminb-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygothr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygothr-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygothb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--rubygothb-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminr-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminl-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminl-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expminb-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothr-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--expgothb-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminr-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminl-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminl-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubyminb-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygothr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygothr-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygothb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--rubygothb-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminr-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminl-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminl-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expminb-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothr-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothr-h.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothb-v.vf +2024/02/18 | 3320 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--expgothb-h.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubymgothr-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubymgothr-h.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygotheb-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygotheb-h.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expmgothr-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expmgothr-h.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgotheb-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgotheb-h.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubymgothr-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubymgothr-h.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygotheb-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygotheb-h.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expmgothr-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expmgothr-h.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgotheb-v.vf +2024/02/18 | 3104 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgotheb-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminr-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminl-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminl-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubyminb-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygothr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygothr-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygothb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--rubygothb-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminr-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminl-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminl-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expminb-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothr-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--expgothb-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminr-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminl-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminl-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubyminb-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygothr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygothr-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygothb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--rubygothb-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminr-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminl-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminl-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expminb-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothr-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothr-h.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothb-v.vf +2024/02/18 | 3100 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--expgothb-h.vf +2024/02/18 | 3088 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlmgothrn-v.vf +2024/02/18 | 3088 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlmgothrn-h.vf +2024/02/18 | 3088 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlmgothrn-v.vf +2024/02/18 | 3088 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlmgothrn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminrn-v.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminrn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminln-v.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminln-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminbn-v.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlminbn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothrn-v.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothrn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothebn-v.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothebn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothbn-v.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--nmlgothbn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminrn-v.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminrn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminln-v.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminln-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminbn-v.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlminbn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothrn-v.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothrn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothebn-v.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothebn-h.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothbn-v.vf +2024/02/18 | 3084 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--nmlgothbn-h.vf +2024/02/18 | 3078 | macros/latex/contrib/l3kernel/README.md +2024/02/18 | 305486 | macros/latex/contrib/l3kernel/l3regex.dtx +2024/02/18 | 30504 | macros/latex/contrib/l3kernel/l3intarray.dtx +2024/02/18 | 29838 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx +2024/02/18 | 296530 | macros/latex/contrib/l3kernel/l3styleguide.pdf +2024/02/18 | 2868 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlmgothrn-v.vf +2024/02/18 | 2868 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlmgothrn-h.vf +2024/02/18 | 2868 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlmgothrn-v.vf +2024/02/18 | 2868 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlmgothrn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminrn-v.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminrn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminln-v.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminln-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminbn-v.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminbn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothrn-v.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothrn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothebn-v.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothebn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothbn-v.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothbn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminrn-v.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminrn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminln-v.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminln-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminbn-v.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminbn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothrn-v.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothrn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothebn-v.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothebn-h.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothbn-v.vf +2024/02/18 | 2864 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothbn-h.vf +2024/02/18 | 28584 | macros/latex/contrib/l3packages/xtemplate.dtx +2024/02/18 | 2847888 | biblio/ctan-bibdata/ctan.bib +2024/02/18 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminl-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminl-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubyminb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubymgothr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubymgothr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygothr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygothr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygotheb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygotheb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygothb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--uprubygothb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminrn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminrn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminl-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminln-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminln-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminl-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminbn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminbn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlminb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlmgothr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlmgothrn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlmgothrn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlmgothr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothrn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothrn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgotheb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothebn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothebn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgotheb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothbn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothbn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upnmlgothb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminrn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminrn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminl-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminln-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminln-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminl-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminbn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminbn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpminb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpmgothr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpmgothrn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpmgothrn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpmgothr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothr-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothrn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothrn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothr-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgotheb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothebn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothebn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgotheb-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothb-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothbn-v.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothbn-h.tfm +2024/02/18 | 2704 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--upexpgothb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminl-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminl-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubyminb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubymgothr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubymgothr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygothr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygothr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygotheb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygotheb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygothb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--uprubygothb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminrn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminrn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminl-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminln-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminln-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminl-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminbn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminbn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlminb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlmgothr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlmgothrn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlmgothrn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlmgothr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothrn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothrn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgotheb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothebn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothebn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgotheb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothbn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothbn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upnmlgothb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminrn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminrn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminl-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminln-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminln-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminl-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminbn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminbn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpminb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpmgothr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpmgothrn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpmgothrn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpmgothr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothr-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothrn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothrn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothr-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgotheb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothebn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothebn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgotheb-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothb-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothbn-v.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothbn-h.tfm +2024/02/18 | 2676 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--upexpgothb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminl-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminl-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubyminb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubymgothr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubymgothr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygothr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygothr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygotheb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygotheb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygothb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--uprubygothb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminrn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminrn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminl-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminln-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminln-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminl-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminbn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminbn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlminb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlmgothr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlmgothrn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlmgothrn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlmgothr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothrn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothrn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgotheb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothebn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothebn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgotheb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothbn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothbn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upnmlgothb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminrn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminrn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminl-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminln-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminln-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminl-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminbn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminbn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpminb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpmgothr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpmgothrn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpmgothrn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpmgothr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothr-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothrn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothrn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothr-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgotheb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothebn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothebn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgotheb-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothb-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothbn-v.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothbn-h.tfm +2024/02/18 | 2668 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--upexpgothb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminl-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminl-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubyminb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubymgothr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubymgothr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygothr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygothr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygotheb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygotheb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygothb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--uprubygothb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminrn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminrn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminl-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminln-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminln-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminl-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminbn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminbn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlminb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlmgothr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlmgothrn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlmgothrn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlmgothr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothrn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothrn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgotheb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothebn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothebn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgotheb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothbn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothbn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upnmlgothb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminrn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminrn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminl-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminln-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminln-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminl-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminbn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminbn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpminb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpmgothr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpmgothrn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpmgothrn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpmgothr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothr-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothrn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothrn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothr-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgotheb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothebn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothebn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgotheb-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothb-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothbn-v.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothbn-h.tfm +2024/02/18 | 2640 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--upexpgothb-h.tfm +2024/02/18 | 26035598 | systems/texlive/tlnet/install-tl.zip +2024/02/18 | 257400 | macros/latex/contrib/randexam.zip +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlmgothrn-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlmgothr-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothrn-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothebn-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgotheb-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothbn-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlmgothrn-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlmgothr-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothrn-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothebn-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgotheb-h.vf +2024/02/18 | 256 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothbn-h.vf +2024/02/18 | 2548524 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminrn-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminr-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminln-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminl-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminbn-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminb-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothr-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothb-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminrn-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminr-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminln-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminl-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminbn-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminb-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothr-h.vf +2024/02/18 | 252 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothb-h.vf +2024/02/18 | 250159 | macros/latex/contrib/l3kernel/l3news09.pdf +2024/02/18 | 24987 | macros/latex/contrib/l3kernel/l3deprecation.dtx +2024/02/18 | 24830 | macros/latex/contrib/l3kernel/source3body.tex +2024/02/18 | 24801 | macros/latex/contrib/randexam/randexam.tex +2024/02/18 | 242164 | macros/latex/contrib/l3kernel/l3term-glossary.pdf +2024/02/18 | 240104 | systems/texlive/tlnet/archive/codedescribe.doc.r69944.tar.xz +2024/02/18 | 2384 | macros/latex/contrib/l3kernel/l3docstrip.dtx +2024/02/18 | 23828 | macros/latex/contrib/l3kernel/l3luatex.dtx +2024/02/18 | 23581 | macros/latex/contrib/l3kernel/l3fp-random.dtx +2024/02/18 | 23206 | macros/latex/contrib/l3kernel/l3fp-logic.dtx +2024/02/18 | 231378 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf +2024/02/18 | 2282 | macros/latex/contrib/l3kernel/source3.tex +2024/02/18 | 210848 | macros/latex/contrib/sjtutex/sjtutex.dtx +2024/02/18 | 21030931 | systems/texlive/tlnet/install-tl-windows.exe +2024/02/18 | 20802 | macros/latex/contrib/sjtutex/sjtu-vi-name-red.pdf +2024/02/18 | 205020 | macros/latex/contrib/l3kernel/l3news12.pdf +2024/02/18 | 20460 | macros/latex/contrib/l3kernel/l3text-purify.dtx +2024/02/18 | 20310 | macros/latex/contrib/l3kernel/l3fp-symbolic.dtx +2024/02/18 | 20101 | macros/latex/contrib/sjtutex/sjtu-vi-badge-red.pdf +2024/02/18 | 20011 | macros/latex/contrib/sjtutex/sjtu-vi-badge-small-red.pdf +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminl-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminl-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubyminb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubymgothr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubymgothr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygothr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygothr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygotheb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygotheb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygothb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--rubygothb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminrn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminrn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminl-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminln-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminln-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminl-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminbn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminbn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlminb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlmgothr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlmgothrn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlmgothrn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlmgothr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothrn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothrn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgotheb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothebn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothebn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgotheb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothbn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothbn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--nmlgothb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminrn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminrn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminl-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminln-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminln-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminl-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminbn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminbn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expminb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expmgothr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expmgothrn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expmgothrn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expmgothr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothr-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothrn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothrn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothr-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgotheb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothebn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothebn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgotheb-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothb-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothbn-v.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothbn-h.tfm +2024/02/18 | 1968 | macros/jptex/latex/jlreq-deluxe/tfm/bzjlreq--expgothb-h.tfm +2024/02/18 | 19637 | macros/latex/contrib/l3kernel/l3fp-convert.dtx +2024/02/18 | 19547 | macros/latex/contrib/l3kernel/l3bitset.dtx +2024/02/18 | 1949 | macros/latex/contrib/l3kernel/interface3.tex +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminl-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminl-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubyminb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubymgothr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubymgothr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygothr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygothr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygotheb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygotheb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygothb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--rubygothb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminrn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminrn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminl-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminln-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminln-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminl-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminbn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminbn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlminb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlmgothr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlmgothrn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlmgothrn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlmgothr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothrn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothrn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgotheb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothebn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothebn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgotheb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothbn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothbn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--nmlgothb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminrn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminrn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminl-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminln-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminln-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminl-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminbn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminbn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expminb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expmgothr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expmgothrn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expmgothrn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expmgothr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothr-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothrn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothrn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothr-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgotheb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothebn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothebn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgotheb-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothb-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothbn-v.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothbn-h.tfm +2024/02/18 | 1940 | macros/jptex/latex/jlreq-deluxe/tfm/zjlreq--expgothb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminl-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminl-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubyminb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubymgothr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubymgothr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygothr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygothr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygotheb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygotheb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygothb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--rubygothb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminrn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminrn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminl-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminln-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminln-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminl-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminbn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminbn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlminb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlmgothr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlmgothrn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlmgothrn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlmgothr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothrn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothrn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgotheb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothebn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothebn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgotheb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothbn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothbn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--nmlgothb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminrn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminrn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminl-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminln-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminln-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminl-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminbn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminbn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expminb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expmgothr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expmgothrn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expmgothrn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expmgothr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothr-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothrn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothrn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothr-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgotheb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothebn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothebn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgotheb-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothb-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothbn-v.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothbn-h.tfm +2024/02/18 | 1932 | macros/jptex/latex/jlreq-deluxe/tfm/bjlreq--expgothb-h.tfm +2024/02/18 | 19328466 | systems/texlive/tlnet/tlpkg/texlive.tlpdb +2024/02/18 | 1904 | macros/latex/contrib/sjtutex/README.md +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminl-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminl-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubyminb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubymgothr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubymgothr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygothr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygothr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygotheb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygotheb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygothb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--rubygothb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminrn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminrn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminl-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminln-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminln-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminl-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminbn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminbn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlminb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlmgothr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlmgothrn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlmgothrn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlmgothr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothrn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothrn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgotheb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothebn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothebn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgotheb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothbn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothbn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--nmlgothb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminrn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminrn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminl-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminln-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminln-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminl-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminbn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminbn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expminb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expmgothr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expmgothrn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expmgothrn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expmgothr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothr-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothrn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothrn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothr-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgotheb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothebn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothebn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgotheb-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothb-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothbn-v.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothbn-h.tfm +2024/02/18 | 1904 | macros/jptex/latex/jlreq-deluxe/tfm/jlreq--expgothb-h.tfm +2024/02/18 | 18528 | macros/latex/contrib/l3kernel/l3fp-round.dtx +2024/02/18 | 1793104 | macros/latex/contrib/l3kernel/interface3.pdf +2024/02/18 | 1758830 | install/macros/latex/contrib/l3packages.tds.zip +2024/02/18 | 1750298 | macros/latex/contrib/l3packages.zip +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminrn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminln-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminbn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlmgothr-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlmgothrn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothr-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothrn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgotheb-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothebn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothb-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlgothbn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminrn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminln-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminbn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlmgothr-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlmgothrn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothr-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothrn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgotheb-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothebn-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothb-v.vf +2024/02/18 | 1732 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlgothbn-v.vf +2024/02/18 | 1728 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminr-v.vf +2024/02/18 | 1728 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminl-v.vf +2024/02/18 | 1728 | macros/jptex/latex/jlreq-deluxe/vf/jlreq--upnmlminb-v.vf +2024/02/18 | 1728 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminr-v.vf +2024/02/18 | 1728 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminl-v.vf +2024/02/18 | 1728 | macros/jptex/latex/jlreq-deluxe/vf/bjlreq--upnmlminb-v.vf +2024/02/18 | 17204 | macros/latex/contrib/l3kernel/l3pdf.dtx +2024/02/18 | 171084 | systems/texlive/tlnet/archive/polyglossia.source.r69946.tar.xz +2024/02/18 | 170102 | macros/latex/contrib/l3kernel/l3news11.pdf +2024/02/18 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx +2024/02/18 | 16624 | macros/latex/contrib/l3kernel/l3text-map.dtx +2024/02/18 | 163484 | macros/latex/contrib/l3kernel/l3news08.pdf +2024/02/18 | 159767 | macros/latex/contrib/l3kernel/l3doc.dtx +2024/02/18 | 1561 | macros/latex/contrib/l3packages/xtemplate.ins +2024/02/18 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 +2024/02/18 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 +2024/02/18 | 151591 | macros/latex/contrib/l3kernel/l3news06.pdf +2024/02/18 | 151219 | macros/latex/contrib/l3kernel/l3docstrip.pdf +2024/02/18 | 1511 | macros/jptex/latex/jlreq-deluxe/README.md +2024/02/18 | 150919 | macros/latex/contrib/l3kernel/l3news02.pdf +2024/02/18 | 150302 | macros/latex/contrib/l3kernel/l3news10.pdf +2024/02/18 | 149691 | macros/latex/contrib/l3kernel/l3tl.dtx +2024/02/18 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex +2024/02/18 | 148747 | macros/latex/contrib/l3kernel/l3news03.pdf +2024/02/18 | 1483341 | macros/generic/markdown.zip +2024/02/18 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 +2024/02/18 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +2024/02/18 | 1444 | macros/latex/contrib/l3packages/l3keys2e-demo.tex +2024/02/18 | 144214 | macros/latex/contrib/l3kernel/l3file.dtx +2024/02/18 | 14296648 | install/macros/latex/contrib/l3kernel.tds.zip +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminr-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminrn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminl-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminln-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminb-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlminbn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlmgothr-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlmgothrn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothr-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothrn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgotheb-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothebn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothb-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--upnmlgothbn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminr-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminrn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminl-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminln-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminb-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlminbn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlmgothr-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlmgothrn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothr-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothrn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgotheb-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothebn-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothb-v.vf +2024/02/18 | 1420 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--upnmlgothbn-v.vf +2024/02/18 | 14152 | macros/latex/contrib/l3kernel/l3flag.dtx +2024/02/18 | 14028549 | macros/latex/contrib/l3kernel.zip +2024/02/18 | 137856 | macros/latex/contrib/l3kernel/l3basics.dtx +2024/02/18 | 13250 | macros/latex/contrib/l3kernel/l3tl-build.dtx +2024/02/18 | 130500 | macros/latex/contrib/l3kernel/l3keys.dtx +2024/02/18 | 12948 | macros/latex/contrib/l3kernel/l3bootstrap.dtx +2024/02/18 | 128344 | macros/latex/contrib/l3kernel/l3news07.pdf +2024/02/18 | 12832 | macros/latex/contrib/l3kernel/l3fp-traps.dtx +2024/02/18 | 1272 | macros/latex/contrib/l3packages/xparse.ins +2024/02/18 | 126540 | systems/texlive/tlnet/archive/polyglossia.r69946.tar.xz +2024/02/18 | 12304 | macros/latex/contrib/l3packages/l3keys2e.dtx +2024/02/18 | 122959 | macros/latex/contrib/l3kernel/l3news01.pdf +2024/02/18 | 1228 | macros/latex/contrib/l3packages/l3keys2e.ins +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlmgothr-v.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlmgothr-h.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgotheb-v.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgotheb-h.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlmgothr-v.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlmgothr-h.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgotheb-v.vf +2024/02/18 | 120 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgotheb-h.vf +2024/02/18 | 1205619 | macros/jptex/latex/jlreq-deluxe.zip +2024/02/18 | 1191 | macros/latex/contrib/l3packages/xfp.ins +2024/02/18 | 11882 | macros/latex/contrib/l3kernel/l3styleguide.tex +2024/02/18 | 11778 | macros/latex/contrib/l3kernel/l3fparray.dtx +2024/02/18 | 117131 | macros/latex/contrib/l3kernel/l3token.dtx +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminr-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminr-h.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminl-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminl-h.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminb-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlminb-h.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothr-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothr-h.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothb-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/zjlreq--nmlgothb-h.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminr-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminr-h.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminl-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminl-h.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminb-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlminb-h.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothr-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothr-h.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothb-v.vf +2024/02/18 | 116 | macros/jptex/latex/jlreq-deluxe/vf/bzjlreq--nmlgothb-h.vf +2024/02/18 | 116564 | systems/texlive/tlnet/archive/novel.r69945.tar.xz +2024/02/18 | 114754 | macros/latex/contrib/l3kernel/l3news04.pdf +2024/02/18 | 114052 | systems/texlive/tlnet/archive/texlive-scripts.r69938.tar.xz +2024/02/18 | 113735 | macros/latex/contrib/l3kernel/l3str-convert.dtx +2024/02/18 | 112524 | macros/latex/contrib/l3kernel/l3news05.pdf +2024/02/18 | 112260 | macros/latex/contrib/l3kernel/l3color.dtx +2024/02/18 | 11100 | systems/texlive/tlnet/archive/codedescribe.r69944.tar.xz +2024/02/18 | 1086 | macros/jptex/latex/jlreq-deluxe/LICENSE +2024/02/18 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex +2024/02/18 | 105022 | macros/latex/contrib/l3kernel/l3fp-parse.dtx +2024/02/18 | 103246 | macros/latex/contrib/l3kernel/l3prop.dtx +2024/02/18 | 1005 | macros/latex/contrib/l3packages/README.md +2024/02/18 | 100486 | macros/latex/contrib/l3kernel/l3seq.dtx +2024/02/17 | 9855 | macros/generic/markdown/examples/optex.tex 2024/02/17 | 98454 | macros/luatex/latex/novel/doc/extras/novel-example.pdf 2024/02/17 | 98012 | systems/texlive/tlnet/archive/spbmark.doc.r69927.tar.xz +2024/02/17 | 952201 | macros/generic/markdown/markdown.dtx 2024/02/17 | 93379 | systems/win32/miktex/tm/packages/spbmark__doc.tar.lzma 2024/02/17 | 920 | systems/win32/miktex/tm/packages/pr.ini 2024/02/17 | 9002 | systems/win32/miktex/tm/packages/cnbwp.tar.lzma @@ -16,6 +1322,7 @@ 2024/02/17 | 78353 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma 2024/02/17 | 77332 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma 2024/02/17 | 76141 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma +2024/02/17 | 75 | macros/generic/markdown/examples/scientists.csv 2024/02/17 | 7561 | macros/luatex/latex/novel/lualatex/novel-DropCap.sty 2024/02/17 | 75143 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma 2024/02/17 | 75040 | systems/texlive/tlnet/archive/expex-glossonly.doc.r69923.tar.xz @@ -35,6 +1342,7 @@ 2024/02/17 | 682743 | systems/win32/miktex/tm/packages/functional__doc.tar.lzma 2024/02/17 | 67828 | systems/texlive/tlnet/archive/siunitx.r69922.tar.xz 2024/02/17 | 67391 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma +2024/02/17 | 65 | systems/mac/mactex/mactex-MacTeXtras-20240217.zip.md5 2024/02/17 | 65122 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma 2024/02/17 | 64839 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma 2024/02/17 | 636720 | systems/texlive/tlnet/archive/luaotfload.doc.r69921.tar.xz @@ -48,7 +1356,6 @@ 2024/02/17 | 601822 | systems/win32/miktex/tm/packages/easybook__doc.tar.lzma 2024/02/17 | 59279 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma 2024/02/17 | 58931 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma -2024/02/17 | 5748174 | systems/texlive/tlnet/install-tl-unx.tar.gz 2024/02/17 | 5744 | systems/win32/miktex/tm/packages/spbmark__source.tar.lzma 2024/02/17 | 55956 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma 2024/02/17 | 5571308 | systems/texlive/tlnet/archive/pgf-periodictable.doc.r69924.tar.xz @@ -59,18 +1366,16 @@ 2024/02/17 | 530202 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma 2024/02/17 | 52602 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma 2024/02/17 | 513296 | systems/texlive/tlnet/archive/pgf-periodictable.r69924.tar.xz +2024/02/17 | 49 | systems/mac/mactex/MacTeXtras.zip.md5 2024/02/17 | 499899 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma +2024/02/17 | 49948 | macros/latex/contrib/randexam/randexam-b-answer.pdf +2024/02/17 | 49886 | macros/latex/contrib/randexam/randexam-a-answer.pdf 2024/02/17 | 49725 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma -2024/02/17 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 -2024/02/17 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc -2024/02/17 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc -2024/02/17 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc -2024/02/17 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc 2024/02/17 | 48761 | systems/win32/miktex/tm/packages/functional__source.tar.lzma 2024/02/17 | 48299 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma -2024/02/17 | 47499 | systems/texlive/tlnet/tlpkg/translations/messages.pot 2024/02/17 | 47404 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma 2024/02/17 | 473015 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma +2024/02/17 | 4681 | macros/generic/markdown/markdown.css 2024/02/17 | 459832 | systems/texlive/tlnet/archive/pynotebook.doc.r69928.tar.xz 2024/02/17 | 459623 | systems/win32/miktex/tm/packages/pynotebook__doc.tar.lzma 2024/02/17 | 45948 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma @@ -78,12 +1383,13 @@ 2024/02/17 | 44358 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma 2024/02/17 | 44109 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma 2024/02/17 | 44070 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma -2024/02/17 | 432568 | systems/texlive/tlnet/archive/texlive-scripts.doc.r69902.tar.xz +2024/02/17 | 4405 | macros/generic/markdown/docstrip.cfg +2024/02/17 | 43730 | macros/generic/markdown/CHANGES.md 2024/02/17 | 43095 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma +2024/02/17 | 41751 | macros/latex/contrib/randexam/randexam-a-blank.pdf 2024/02/17 | 4174342 | systems/win32/miktex/tm/packages/novel__source.tar.lzma -2024/02/17 | 4168608 | systems/texlive/tlnet/archive/novel.doc.r69925.tar.xz +2024/02/17 | 41687 | macros/latex/contrib/randexam/randexam-b-blank.pdf 2024/02/17 | 4125 | systems/win32/miktex/tm/packages/spbmark.tar.lzma -2024/02/17 | 4117589 | biblio/ctan-bibdata.zip 2024/02/17 | 40883 | systems/win32/miktex/tm/packages/easybook__source.tar.lzma 2024/02/17 | 40360 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma 2024/02/17 | 39868 | systems/texlive/tlnet/archive/exam-zh.r69920.tar.xz @@ -91,12 +1397,12 @@ 2024/02/17 | 3926 | macros/luatex/latex/novel/doc/extras/novel-example.tex 2024/02/17 | 3924 | systems/texlive/tlnet/archive/spbmark.r69927.tar.xz 2024/02/17 | 3880 | systems/texlive/tlnet/archive/texlogfilter.r69919.tar.xz +2024/02/17 | 3832 | macros/generic/markdown/examples/example.md 2024/02/17 | 3818 | macros/luatex/latex/novel/lualatex/novel-Sandbox.sty 2024/02/17 | 381896 | macros/unicodetex/latex/polyglossia/polyglossia.pdf 2024/02/17 | 37605 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma 2024/02/17 | 37500 | systems/win32/miktex/tm/packages/tabularray.tar.lzma 2024/02/17 | 37364 | systems/texlive/tlnet/archive/tabularray.r69926.tar.xz -2024/02/17 | 3708800 | biblio/ctan-bibdata/ctan.pdf 2024/02/17 | 36805 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma 2024/02/17 | 36708 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma 2024/02/17 | 3611 | systems/win32/miktex/tm/packages/pynotebook__source.tar.lzma @@ -113,6 +1419,7 @@ 2024/02/17 | 328609 | macros/luatex/latex/novel/doc/novel-documentation.html 2024/02/17 | 32726 | macros/luatex/latex/novel/doc/novel.pdf 2024/02/17 | 32111 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma +2024/02/17 | 31 | macros/generic/markdown/VERSION 2024/02/17 | 31749 | macros/latex/contrib/codedescribe/latex/codedescribe.sty 2024/02/17 | 3163 | macros/latex/contrib/codedescribe/README.md 2024/02/17 | 31575 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma @@ -122,7 +1429,6 @@ 2024/02/17 | 29118 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma 2024/02/17 | 287390 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma 2024/02/17 | 28706 | macros/latex/contrib/codedescribe/latex/codelisting.sty -2024/02/17 | 2847952 | biblio/ctan-bibdata/ctan.bib 2024/02/17 | 2844124 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma 2024/02/17 | 2831 | macros/luatex/latex/novel/doc/novel.tex 2024/02/17 | 2827 | systems/win32/miktex/tm/packages/pynotebook.tar.lzma @@ -130,27 +1436,29 @@ 2024/02/17 | 27148 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma 2024/02/17 | 2708656 | systems/texlive/tlnet/archive/exam-zh.doc.r69920.tar.xz 2024/02/17 | 2688 | systems/texlive/tlnet/archive/pynotebook.r69928.tar.xz -2024/02/17 | 26035598 | systems/texlive/tlnet/install-tl.zip 2024/02/17 | 25613 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma 2024/02/17 | 25605 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma -2024/02/17 | 2548064 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz 2024/02/17 | 254545 | macros/latex/contrib/codedescribe.zip 2024/02/17 | 252555 | macros/latex/contrib/codedescribe/doc/codedescribe.pdf 2024/02/17 | 2495149 | systems/win32/miktex/tm/packages/simpleicons__doc.tar.lzma 2024/02/17 | 249437 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma 2024/02/17 | 2485968 | systems/texlive/tlnet/archive/simpleicons.doc.r69933.tar.xz +2024/02/17 | 245987 | support/TeX4ht/source/ChangeLog 2024/02/17 | 245919 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma 2024/02/17 | 24141 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma 2024/02/17 | 24034 | macros/luatex/latex/novel/lualatex/novel.cls 2024/02/17 | 23866 | macros/latex/contrib/codedescribe/doc/codedescribe.tex 2024/02/17 | 2348 | systems/texlive/tlnet/archive/expex-glossonly.r69923.tar.xz 2024/02/17 | 232152 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma +2024/02/17 | 22881 | macros/generic/markdown/libraries/markdown-tinyyaml.lua +2024/02/17 | 2284462 | systems/mac/mactex/mactex-MacTeXtras-20240217.zip 2024/02/17 | 221356 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma +2024/02/17 | 21983 | macros/generic/markdown/README.md +2024/02/17 | 2189 | macros/generic/markdown/examples/context-mkiv.tex 2024/02/17 | 218880 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma 2024/02/17 | 217158 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma 2024/02/17 | 21697 | macros/luatex/latex/novel/lualatex/novel-TextMacros.sty 2024/02/17 | 21647 | systems/win32/miktex/tm/packages/simpleicons__source.tar.lzma -2024/02/17 | 21030898 | systems/texlive/tlnet/install-tl-windows.exe 2024/02/17 | 20836 | systems/win32/miktex/tm/packages/tabularray__source.tar.lzma 2024/02/17 | 2056135 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma 2024/02/17 | 2054033 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma @@ -160,33 +1468,38 @@ 2024/02/17 | 19946 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma 2024/02/17 | 19794 | macros/luatex/latex/novel/lualatex/novel-Images.sty 2024/02/17 | 1963 | macros/unicodetex/latex/polyglossia/README.md -2024/02/17 | 19328517 | systems/texlive/tlnet/tlpkg/texlive.tlpdb 2024/02/17 | 182855 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma 2024/02/17 | 18081 | macros/luatex/latex/novel/lualatex/novel-HeadFootStyles.sty +2024/02/17 | 1778 | macros/generic/markdown/examples/latex-pdftex.tex 2024/02/17 | 1763404 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma 2024/02/17 | 1763200 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma 2024/02/17 | 17571 | macros/luatex/latex/novel/lualatex/novel-pdfx.sty 2024/02/17 | 174116 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma 2024/02/17 | 17235 | macros/luatex/latex/novel/lualatex/novel-LayoutSettings.sty +2024/02/17 | 171 | macros/latex/contrib/randexam/randexam-b-answer.tex 2024/02/17 | 17155 | macros/luatex/latex/novel/lualatex/novel-Fonts.sty -2024/02/17 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx 2024/02/17 | 16636 | systems/texlive/tlnet/archive/easybook.r69930.tar.xz +2024/02/17 | 1663353 | support/TeX4ht/source/tex4ht-fonts-noncjk.tex 2024/02/17 | 16516 | systems/texlive/tlnet/archive/easybook.source.r69930.tar.xz +2024/02/17 | 1650 | macros/generic/markdown/markdown.ins 2024/02/17 | 16242 | systems/win32/miktex/tm/packages/easybook.tar.lzma +2024/02/17 | 161 | systems/mac/mactex/mactex-MacTeXtras-20240217.zip.sha512 +2024/02/17 | 1609 | macros/generic/markdown/examples/latex-luatex.tex 2024/02/17 | 159884 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma +2024/02/17 | 1578727 | install/macros/generic/markdown.tds.zip 2024/02/17 | 15780 | macros/luatex/latex/novel/lualatex/novel-Footnotes.sty -2024/02/17 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 +2024/02/17 | 156 | macros/latex/contrib/randexam/randexam-b-blank.tex +2024/02/17 | 156 | macros/latex/contrib/randexam/randexam-a-blank.tex 2024/02/17 | 153484 | systems/texlive/tlnet/archive/jlreq.r69932.tar.xz 2024/02/17 | 1531331 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma -2024/02/17 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 2024/02/17 | 15017 | systems/win32/miktex/tm/packages/novel__doc.tar.lzma -2024/02/17 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 +2024/02/17 | 145 | systems/mac/mactex/MacTeXtras.zip.sha512 2024/02/17 | 14598 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma -2024/02/17 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 2024/02/17 | 1441025 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma 2024/02/17 | 14280 | macros/luatex/latex/novel/lualatex/novel-ChapterScene.sty 2024/02/17 | 141946 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma 2024/02/17 | 141609 | systems/win32/miktex/tm/packages/jlreq.tar.lzma +2024/02/17 | 140951 | macros/generic/markdown/markdown.png 2024/02/17 | 137763 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma 2024/02/17 | 1356202 | install/macros/unicodetex/latex/polyglossia.tds.zip 2024/02/17 | 1341570 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma @@ -197,20 +1510,21 @@ 2024/02/17 | 117702 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma 2024/02/17 | 1172939 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma 2024/02/17 | 116828 | systems/win32/miktex/tm/packages/novel.tar.lzma -2024/02/17 | 116580 | systems/texlive/tlnet/archive/novel.r69925.tar.xz 2024/02/17 | 1150 | systems/win32/miktex/tm/packages/next/pr.ini -2024/02/17 | 114052 | systems/texlive/tlnet/archive/texlive-scripts.r69902.tar.xz 2024/02/17 | 112426 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma 2024/02/17 | 11065 | systems/win32/miktex/tm/packages/functional.tar.lzma 2024/02/17 | 109922 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma 2024/02/17 | 10976 | systems/texlive/tlnet/archive/functional.r69929.tar.xz +2024/02/17 | 1089321 | macros/generic/markdown/markdown.pdf 2024/02/17 | 108820 | systems/win32/miktex/tm/packages/cnbwp__source.tar.lzma 2024/02/17 | 108541 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma 2024/02/17 | 1074357 | macros/unicodetex/latex/polyglossia/polyglossia.dtx 2024/02/17 | 106590 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma 2024/02/17 | 105748 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma +2024/02/17 | 10524 | macros/latex/contrib/randexam/randexam-a-answer.tex 2024/02/17 | 104443 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma 2024/02/17 | 104212 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma +2024/02/17 | 1037811 | macros/generic/markdown/markdown.html 2024/02/17 | 103669 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma 2024/02/17 | 10092 | systems/texlive/tlnet/archive/cnbwp.r69931.tar.xz 2024/02/16 | 996 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsonetwo.tfm @@ -221,7 +1535,6 @@ 2024/02/16 | 93842 | macros/latex/contrib/spbmark/spbmark.pdf 2024/02/16 | 895821 | systems/win32/miktex/tm/packages/kaytannollista-latexia.tar.lzma 2024/02/16 | 893 | macros/luatex/latex/novel/README.md -2024/02/16 | 89291 | macros/latex/contrib/easybook/easybook.tex 2024/02/16 | 8820 | support/TeX4ht/source/mktex4ht-cnf.tex 2024/02/16 | 8783 | systems/win32/miktex/tm/packages/jlreq__source.tar.lzma 2024/02/16 | 85165 | systems/win32/miktex/tm/packages/fontspec__source.tar.lzma @@ -239,7 +1552,6 @@ 2024/02/16 | 787839 | systems/win32/miktex/tm/packages/huawei__doc.tar.lzma 2024/02/16 | 780874 | systems/win32/miktex/tm/packages/latex-base-dev__source.tar.lzma 2024/02/16 | 7787 | macros/jptex/latex/jlreq/README.md -2024/02/16 | 75978 | macros/latex/contrib/easybook/easybook.dtx 2024/02/16 | 7595 | macros/latex/contrib/cnbwp/doc/cnbsample.bib 2024/02/16 | 75915 | macros/latex/contrib/cnbwp/doc/cnbwp-manual-cs.tex 2024/02/16 | 74884 | macros/latex/contrib/pynotebook/doc/pynotebook-examples-pitonpylautex.pdf @@ -249,7 +1561,6 @@ 2024/02/16 | 67892 | systems/win32/miktex/tm/packages/siunitx.tar.lzma 2024/02/16 | 6512 | systems/win32/miktex/tm/packages/exesheet.tar.lzma 2024/02/16 | 642473 | systems/win32/miktex/tm/packages/xfrac__doc.tar.lzma -2024/02/16 | 642167 | macros/latex/contrib/easybook.zip 2024/02/16 | 6336 | macros/luatex/latex/novel/lualatex/novel-microtype.cfg 2024/02/16 | 628274 | support/TeX4ht/source/tex4ht-html4.tex 2024/02/16 | 624304 | systems/win32/miktex/tm/packages/luaotfload.tar.lzma @@ -258,7 +1569,6 @@ 2024/02/16 | 6199208 | fonts/simpleicons.zip 2024/02/16 | 6198 | systems/win32/miktex/tm/packages/gitinfo-lua__source.tar.lzma 2024/02/16 | 6024 | systems/win32/miktex/tm/packages/lua-placeholders__source.tar.lzma -2024/02/16 | 598997 | macros/latex/contrib/easybook/easybook.pdf 2024/02/16 | 5763 | systems/win32/miktex/tm/packages/lua-placeholders.tar.lzma 2024/02/16 | 5706471 | systems/win32/miktex/tm/packages/latex-tools-dev__doc.tar.lzma 2024/02/16 | 56797 | systems/win32/miktex/tm/packages/proflycee.tar.lzma @@ -348,7 +1658,6 @@ 2024/02/16 | 248376 | systems/win32/miktex/tm/packages/latex-base-dev.tar.lzma 2024/02/16 | 2475109 | fonts/simpleicons/doc/simpleicons.pdf 2024/02/16 | 2469053 | systems/win32/miktex/tm/packages/optex__doc.tar.lzma -2024/02/16 | 245753 | support/TeX4ht/source/ChangeLog 2024/02/16 | 243395 | macros/latex/contrib/cnbwp/doc/cnbwp-manual-cs.pdf 2024/02/16 | 2417207 | systems/win32/miktex/tm/packages/nicematrix__doc.tar.lzma 2024/02/16 | 24102 | macros/latex/contrib/cnbwp/doc/graph18.eps @@ -1063,7 +2372,6 @@ 2024/02/14 | 17782 | macros/latex-dev/base/cyrguide.tex 2024/02/14 | 176171 | macros/latex-dev/required/tools/shellesc.pdf 2024/02/14 | 175211 | macros/latex-dev/base/ltnews05.pdf -2024/02/14 | 1749530 | macros/latex/contrib/l3packages.zip 2024/02/14 | 17389 | macros/latex-dev/base/ltbibl.dtx 2024/02/14 | 173013 | macros/latex-dev/base/tlc2.err 2024/02/14 | 171410 | macros/latex-dev/base/docstrip.dtx @@ -1105,7 +2413,6 @@ 2024/02/14 | 142867 | macros/latex-dev/base/ltnews06.pdf 2024/02/14 | 14091 | macros/latex-dev/base/ltpage.dtx 2024/02/14 | 14075 | macros/latex-dev/required/tools/afterpage.dtx -2024/02/14 | 14046736 | macros/latex/contrib/l3kernel.zip 2024/02/14 | 139685 | macros/latex-dev/required/tools/array.dtx 2024/02/14 | 1390205 | macros/latex-dev/base/ltnews.pdf 2024/02/14 | 1389 | macros/generic/lt3luabridge/docstrip.cfg @@ -1173,90 +2480,54 @@ 2024/02/14 | 10215 | macros/latex-dev/required/latex-lab/changes.txt 2024/02/14 | 10072 | macros/latex-dev/base/format.ins 2024/02/14 | 10016 | macros/optex/README -2024/02/13 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex 2024/02/13 | 984 | support/arara/scripts/rules/arara-rule-make.yaml 2024/02/13 | 97684 | systems/texlive/tlnet/archive/texinfo.r69818.tar.xz 2024/02/13 | 950 | support/arara/scripts/rules/arara-rule-gnuplot.yaml 2024/02/13 | 9466 | macros/unicodetex/latex/fontspec/fontspec-code-vars.dtx -2024/02/13 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex -2024/02/13 | 9445 | macros/latex/contrib/l3kernel/l3fp-assign.dtx 2024/02/13 | 94210 | macros/optex/doc/optex-userdoc.tex 2024/02/13 | 941616 | macros/latex/contrib/nicematrix/nicematrix.pdf 2024/02/13 | 9398 | macros/unicodetex/latex/fontspec/fontspec-code-feat-aat.dtx 2024/02/13 | 9351 | macros/unicodetex/latex/fontspec/fontspec-doc-enc.tex 2024/02/13 | 9303 | macros/jptex/latex/jlreq/jlreq-trimmarks-ja.md -2024/02/13 | 92983 | macros/latex/contrib/l3kernel/l3int.dtx -2024/02/13 | 91719 | macros/latex/contrib/l3kernel/l3skip.dtx 2024/02/13 | 915 | support/arara/scripts/rules/arara-rule-move.yaml 2024/02/13 | 911886 | macros/latex/contrib/nicematrix/nicematrix-french.pdf 2024/02/13 | 910 | support/arara/scripts/rules/arara-rule-xindex.yaml 2024/02/13 | 9103 | macros/unicodetex/latex/fontspec/fontspec-doc-intro.tex -2024/02/13 | 88794 | macros/latex/contrib/l3kernel/l3expan.dtx -2024/02/13 | 88241 | macros/latex/contrib/l3kernel/l3coffins.dtx 2024/02/13 | 878 | support/arara/scripts/rules/arara-rule-ghostscript.yaml -2024/02/13 | 87749 | macros/latex/contrib/l3kernel/l3box.dtx 2024/02/13 | 87630 | support/albatross/doc/albatross-manual.pdf -2024/02/13 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex -2024/02/13 | 84789 | macros/latex/contrib/l3kernel/l3fp-basics.dtx -2024/02/13 | 84537 | macros/latex/contrib/l3packages/xparse-2018-04-12.sty 2024/02/13 | 841 | support/arara/scripts/rules/arara-rule-tikzmake.yaml 2024/02/13 | 838 | support/arara/scripts/rules/arara-rule-biber.yaml -2024/02/13 | 83169 | macros/latex/contrib/l3kernel/l3clist.dtx 2024/02/13 | 830 | support/arara/scripts/rules/arara-rule-nomencl.yaml 2024/02/13 | 8304 | macros/unicodetex/latex/fontspec/fontspec-code-msg.dtx -2024/02/13 | 82874 | macros/latex/contrib/l3kernel/l3msg.dtx -2024/02/13 | 82731 | macros/latex/contrib/l3kernel/l3prefixes.pdf -2024/02/13 | 82462 | macros/latex/contrib/l3kernel/l3str.dtx 2024/02/13 | 822 | macros/latex/contrib/xfrac/README.md 2024/02/13 | 812 | support/arara/scripts/rules/arara-rule-songidx.yaml 2024/02/13 | 810 | support/arara/scripts/rules/arara-rule-dvipdfmx.yaml 2024/02/13 | 807 | support/arara/scripts/rules/arara-rule-ps2pdf.yaml 2024/02/13 | 806 | support/arara/scripts/rules/arara-rule-dvipdfm.yaml -2024/02/13 | 80270 | macros/latex/contrib/l3kernel/l3names.dtx -2024/02/13 | 80215 | macros/latex/contrib/l3packages/xparse-generic.tex 2024/02/13 | 797 | support/arara/scripts/rules/arara-rule-dvips.yaml 2024/02/13 | 788 | support/arara/scripts/rules/arara-rule-copy.yaml -2024/02/13 | 7831 | macros/latex/contrib/l3kernel/l3fp-functions.dtx -2024/02/13 | 7813 | macros/latex/contrib/l3packages/CHANGELOG.md -2024/02/13 | 76534 | macros/latex/contrib/l3kernel/l3fp.dtx -2024/02/13 | 76368 | macros/latex/contrib/l3kernel/l3text-case.dtx 2024/02/13 | 7603 | support/arara/doc/htmlmanualtopdf.sh -2024/02/13 | 7574815 | macros/latex/contrib/l3kernel/source3.pdf 2024/02/13 | 75547 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX2.pdf 2024/02/13 | 7529 | macros/unicodetex/latex/fontspec/fontspec-doc-style.sty -2024/02/13 | 73845 | macros/latex/contrib/l3kernel/l3fp-trig.dtx -2024/02/13 | 7372 | macros/latex/contrib/l3packages/xfp.dtx 2024/02/13 | 732 | macros/unicodetex/latex/emotion/emotion.sty 2024/02/13 | 7233 | macros/unicodetex/latex/fontspec/fontspec-code-interfaces.dtx -2024/02/13 | 71193 | macros/latex/contrib/l3kernel/expl3.dtx -2024/02/13 | 70830 | macros/latex/contrib/l3kernel/l3prg.dtx -2024/02/13 | 7079 | macros/latex/contrib/l3kernel/l3term-glossary.tex 2024/02/13 | 680 | support/arara/scripts/rules/arara-rule-sketch.yaml 2024/02/13 | 672898 | macros/unicodetex/latex/fontspec/fontspec-code.pdf -2024/02/13 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex 2024/02/13 | 658541 | macros/latex/contrib/xfrac/xfrac.pdf 2024/02/13 | 6572 | macros/unicodetex/latex/fontspec/fontspec-code-scripts.dtx 2024/02/13 | 6541 | support/arara/doc/resources/manual.css 2024/02/13 | 650 | support/arara/scripts/rules/arara-rule-spix.yaml 2024/02/13 | 648838 | macros/latex/contrib/xfrac.zip -2024/02/13 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex 2024/02/13 | 647 | support/arara/scripts/rules/arara-rule-convert.yaml 2024/02/13 | 646 | support/arara/scripts/rules/arara-rule-makeglossarieslite.yaml -2024/02/13 | 6433 | macros/latex/contrib/l3kernel/l3news06.tex -2024/02/13 | 6393 | macros/latex/contrib/l3kernel/l3.ins -2024/02/13 | 62663 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx 2024/02/13 | 625 | support/arara/scripts/rules/arara-rule-upbibtex.yaml 2024/02/13 | 623 | macros/latex/contrib/xfrac/CHANGELOG.md 2024/02/13 | 6238 | macros/unicodetex/latex/fontspec/fontspec-code-opening.dtx -2024/02/13 | 6219 | macros/latex/contrib/l3kernel/l3syntax-changes.tex 2024/02/13 | 620 | support/arara/scripts/rules/arara-rule-bibtexu.yaml 2024/02/13 | 620 | support/arara/scripts/rules/arara-rule-bibtex8.yaml -2024/02/13 | 6195 | macros/latex/contrib/l3packages/xparse-2020-10-01.sty -2024/02/13 | 610363 | macros/latex/contrib/l3kernel/expl3.pdf 2024/02/13 | 6049 | graphics/pgf/contrib/pictochrono/doc/pictochrono-doc.tex 2024/02/13 | 5 | support/arara/doc/resources/version.txt 2024/02/13 | 5 | support/albatross/doc/version.tex -2024/02/13 | 59622 | macros/latex/contrib/l3packages/xparse.dtx 2024/02/13 | 595 | support/arara/scripts/rules/arara-rule-pbibtex.yaml 2024/02/13 | 591 | support/arara/scripts/rules/arara-rule-bibtex.yaml 2024/02/13 | 591860 | macros/latex/contrib/nicematrix/nicematrix-code.dtx @@ -1266,13 +2537,9 @@ 2024/02/13 | 578717 | macros/unicodetex/latex/fontspec/fontspec.pdf 2024/02/13 | 576 | support/arara/scripts/arara.sh 2024/02/13 | 576 | support/albatross/scripts/albatross.sh -2024/02/13 | 57438 | macros/latex/contrib/l3kernel/CHANGELOG.md -2024/02/13 | 565282 | macros/latex/contrib/l3kernel/l3doc.pdf 2024/02/13 | 549 | macros/unicodetex/latex/fontspec/fontspec.cfg 2024/02/13 | 546 | support/arara/scripts/rules/arara-rule-qpdf.yaml -2024/02/13 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex 2024/02/13 | 5420924 | support/albatross/scripts/albatross.jar -2024/02/13 | 534182 | macros/latex/contrib/l3packages/xparse.pdf 2024/02/13 | 53190 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX1.pdf 2024/02/13 | 5302 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex 2024/02/13 | 524840 | support/arara/doc/resources/firasans-italic.otf @@ -1282,80 +2549,51 @@ 2024/02/13 | 521796 | support/arara/doc/resources/firasans-bold.otf 2024/02/13 | 5159812 | install/support/albatross.tds.zip 2024/02/13 | 5158188 | support/albatross.zip -2024/02/13 | 51091 | macros/latex/contrib/l3kernel/l3fp-extended.dtx 2024/02/13 | 50840 | macros/jptex/latex/jlreq/jlreq-trimmarks.sty 2024/02/13 | 507828 | support/arara/doc/resources/firasans-regular.otf 2024/02/13 | 5065 | macros/unicodetex/latex/fontspec/fontspec-code-xfss.dtx 2024/02/13 | 505308 | support/arara/doc/resources/firasans-light.otf 2024/02/13 | 4980 | support/arara/README.md -2024/02/13 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex -2024/02/13 | 49753 | macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty 2024/02/13 | 4971 | macros/unicodetex/latex/fontspec/fontspec-code-enc.dtx -2024/02/13 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex -2024/02/13 | 49321 | macros/latex/contrib/l3kernel/l3fp-expo.dtx -2024/02/13 | 4911 | macros/latex/contrib/l3kernel/l3fp-types.dtx -2024/02/13 | 4890 | macros/latex/contrib/l3kernel/l3news.tex -2024/02/13 | 48900 | macros/latex/contrib/l3kernel/l3text.dtx 2024/02/13 | 48897 | macros/jptex/latex/jlreq/jfm-jlreq.lua -2024/02/13 | 48372 | macros/latex/contrib/l3kernel/l3prefixes.csv -2024/02/13 | 47237 | macros/latex/contrib/l3kernel/l3fp-aux.dtx -2024/02/13 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex 2024/02/13 | 470306 | macros/latex/contrib/verse.zip 2024/02/13 | 469138 | macros/latex/contrib/verse/verse.pdf 2024/02/13 | 460 | support/arara/scripts/rules/arara-rule-mkdir.yaml 2024/02/13 | 458 | support/arara/scripts/rules/arara-rule-rmdir.yaml -2024/02/13 | 4570 | macros/latex/contrib/l3kernel/l3legacy.dtx -2024/02/13 | 448106 | macros/latex/contrib/l3packages/xtemplate.pdf 2024/02/13 | 44661 | macros/unicodetex/latex/fontspec/fontspec-doc-opentype.tex 2024/02/13 | 4404 | graphics/pgf/contrib/pictochrono/tex/pictochrono.sty 2024/02/13 | 432 | macros/unicodetex/latex/emotion/emotion.def 2024/02/13 | 4253 | support/arara/scripts/rules/arara-rule-context.yaml 2024/02/13 | 42249 | macros/unicodetex/latex/fontspec/fontspec-code-internal.dtx -2024/02/13 | 41847 | macros/latex/contrib/l3kernel/l3debug.dtx 2024/02/13 | 4169 | macros/unicodetex/latex/fontspec/fontspec-doc-luatex.tex -2024/02/13 | 412717 | macros/latex/contrib/l3packages/l3keys2e.pdf 2024/02/13 | 4079 | macros/unicodetex/latex/fontspec/fontspec-code-fontload.dtx 2024/02/13 | 4074 | support/arara/scripts/rules/arara-rule-datatooltk.yaml -2024/02/13 | 40727 | macros/latex/contrib/l3kernel/l3sort.dtx 2024/02/13 | 4010 | macros/unicodetex/latex/fontspec/fontspec-code-graphite.dtx -2024/02/13 | 396222 | macros/latex/contrib/l3kernel/l3news.pdf 2024/02/13 | 3906 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex 2024/02/13 | 38703 | macros/latex/contrib/xfrac/xfrac.dtx 2024/02/13 | 3843 | support/arara/doc/resources/gitlab-icon.svg 2024/02/13 | 37950 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl.pdf 2024/02/13 | 36791 | macros/unicodetex/latex/emotion.zip 2024/02/13 | 3664 | macros/unicodetex/latex/fontspec/fontspec.dtx -2024/02/13 | 36608 | macros/latex/contrib/l3kernel/l3sys.dtx -2024/02/13 | 35639 | macros/latex/contrib/l3kernel/l3unicode.dtx -2024/02/13 | 35453 | macros/latex/contrib/l3kernel/l3quark.dtx 2024/02/13 | 35241 | support/albatross/doc/albatross-manual.tex 2024/02/13 | 342355 | macros/latex/contrib/exesheet/exesheet.pdf -2024/02/13 | 33772 | macros/latex/contrib/l3kernel/l3cctab.dtx 2024/02/13 | 335 | graphics/pgf/contrib/pictochrono/README.md -2024/02/13 | 332421 | macros/latex/contrib/l3packages/xfp.pdf 2024/02/13 | 3251 | support/arara/scripts/rules/arara-rule-pdfcrop.yaml 2024/02/13 | 32124 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand2.pdf 2024/02/13 | 320 | support/arara/scripts/rules/arara-rule-halt.yaml 2024/02/13 | 31060 | macros/unicodetex/latex/fontspec/fontspec-doc-fontsel.tex 2024/02/13 | 3099 | macros/unicodetex/latex/fontspec/fontspec-lua.dtx -2024/02/13 | 3078 | macros/latex/contrib/l3kernel/README.md 2024/02/13 | 30692 | macros/unicodetex/latex/fontspec/fontspec-doc-featset.tex 2024/02/13 | 30553 | macros/unicodetex/latex/emotion/doc/emotion-doc.pdf -2024/02/13 | 305486 | macros/latex/contrib/l3kernel/l3regex.dtx -2024/02/13 | 30504 | macros/latex/contrib/l3kernel/l3intarray.dtx 2024/02/13 | 3007 | macros/unicodetex/latex/emotion/doc/emotion-doc.tex 2024/02/13 | 3006687 | macros/latex/contrib/nicematrix.zip 2024/02/13 | 30051 | macros/unicodetex/latex/fontspec/fontspec-code-keyval.dtx 2024/02/13 | 300237 | macros/latex/contrib/exesheet.zip 2024/02/13 | 2990 | support/arara/scripts/rules/arara-rule-indent.yaml -2024/02/13 | 29836 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx 2024/02/13 | 29804 | support/albatross/README.md -2024/02/13 | 296657 | macros/latex/contrib/l3kernel/l3styleguide.pdf 2024/02/13 | 2929 | macros/unicodetex/latex/fontspec/README.md 2024/02/13 | 285336 | support/arara/doc/resources/CascadiaMono-Regular.otf 2024/02/13 | 282548 | support/arara/doc/resources/CascadiaMono-Light.otf -2024/02/13 | 28221 | macros/latex/contrib/l3packages/xtemplate.dtx -2024/02/13 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex 2024/02/13 | 2757360 | support/arara/doc/arara-7.1.3-docsrc.zip 2024/02/13 | 273200 | support/arara/doc/resources/CascadiaMono-ExtraLight.otf 2024/02/13 | 2728 | macros/latex/contrib/verse/README @@ -1363,24 +2601,14 @@ 2024/02/13 | 258355 | macros/latex/contrib/nicematrix/nicematrix.tex 2024/02/13 | 2543 | support/arara/scripts/rules/arara-rule-ltx2any.yaml 2024/02/13 | 25278 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl_en.pdf -2024/02/13 | 250159 | macros/latex/contrib/l3kernel/l3news09.pdf -2024/02/13 | 24987 | macros/latex/contrib/l3kernel/l3deprecation.dtx 2024/02/13 | 248570 | macros/latex/contrib/nicematrix/nicematrix-french.tex -2024/02/13 | 24830 | macros/latex/contrib/l3kernel/source3body.tex 2024/02/13 | 24731 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex 2024/02/13 | 2434 | support/arara/scripts/rules/arara-rule-makeglossaries.yaml 2024/02/13 | 2428 | support/arara/doc/htmlquickstarttopdf.sh -2024/02/13 | 242296 | macros/latex/contrib/l3kernel/l3term-glossary.pdf 2024/02/13 | 239299 | graphics/pgf/contrib/pictochrono/doc/pictochrono-doc.pdf 2024/02/13 | 238652 | graphics/pgf/contrib/pictochrono.zip -2024/02/13 | 2384 | macros/latex/contrib/l3kernel/l3docstrip.dtx -2024/02/13 | 23828 | macros/latex/contrib/l3kernel/l3luatex.dtx -2024/02/13 | 23581 | macros/latex/contrib/l3kernel/l3fp-random.dtx 2024/02/13 | 2326087 | macros/latex/contrib/nicematrix/nicematrix-code.pdf -2024/02/13 | 23206 | macros/latex/contrib/l3kernel/l3fp-logic.dtx -2024/02/13 | 231496 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf 2024/02/13 | 23043 | macros/unicodetex/latex/fontspec/CHANGES.md -2024/02/13 | 2282 | macros/latex/contrib/l3kernel/source3.tex 2024/02/13 | 2176 | macros/unicodetex/latex/fontspec/fontspec-code-load.dtx 2024/02/13 | 21600 | macros/unicodetex/latex/fontspec/fontspec-code-opentype.dtx 2024/02/13 | 2147 | macros/unicodetex/latex/fontspec/fontspec.ins @@ -1389,124 +2617,75 @@ 2024/02/13 | 21198 | macros/jptex/latex/jlreq/jlreq-helpers.sty 2024/02/13 | 2099 | support/arara/scripts/rules/arara-rule-perltex.yaml 2024/02/13 | 20810 | macros/unicodetex/latex/fontspec/fontspec-code-feat-opentype.dtx -2024/02/13 | 205020 | macros/latex/contrib/l3kernel/l3news12.pdf -2024/02/13 | 20460 | macros/latex/contrib/l3kernel/l3text-purify.dtx -2024/02/13 | 20310 | macros/latex/contrib/l3kernel/l3fp-symbolic.dtx 2024/02/13 | 1985 | support/arara/scripts/rules/arara-rule-frontespizio.yaml 2024/02/13 | 1974 | support/arara/scripts/rules/arara-rule-xindy.yaml 2024/02/13 | 1973 | support/arara/scripts/rules/arara-rule-texindy.yaml -2024/02/13 | 19637 | macros/latex/contrib/l3kernel/l3fp-convert.dtx -2024/02/13 | 19547 | macros/latex/contrib/l3kernel/l3bitset.dtx -2024/02/13 | 1949 | macros/latex/contrib/l3kernel/interface3.tex 2024/02/13 | 1923 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex 2024/02/13 | 191524 | support/arara/doc/arara-quickstart.pdf 2024/02/13 | 19106 | macros/unicodetex/latex/fontspec/LICENSE 2024/02/13 | 1883 | support/arara/scripts/rules/arara-rule-latexmk.yaml -2024/02/13 | 18528 | macros/latex/contrib/l3kernel/l3fp-round.dtx 2024/02/13 | 1836 | support/arara/scripts/rules/arara-rule-detex.yaml -2024/02/13 | 1792513 | macros/latex/contrib/l3kernel/interface3.pdf 2024/02/13 | 17612 | macros/unicodetex/latex/fontspec/fontspec-code-user.dtx -2024/02/13 | 1758079 | install/macros/latex/contrib/l3packages.tds.zip 2024/02/13 | 17497 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex 2024/02/13 | 1727 | support/arara/doc/arara.1 2024/02/13 | 1721 | support/arara/scripts/rules/arara-rule-pythontex.yaml -2024/02/13 | 17204 | macros/latex/contrib/l3kernel/l3pdf.dtx 2024/02/13 | 1708 | support/arara/scripts/rules/arara-rule-texcount.yaml -2024/02/13 | 170102 | macros/latex/contrib/l3kernel/l3news11.pdf 2024/02/13 | 1687 | macros/unicodetex/latex/fontspec/fontspec-example.tex 2024/02/13 | 168372 | support/arara/doc/resources/CascadiaMono-Italic.otf 2024/02/13 | 1671 | support/arara/scripts/rules/arara-rule-fig2dev.yaml 2024/02/13 | 16715492 | support/arara/scripts/arara.jar 2024/02/13 | 167028 | support/arara/doc/resources/CascadiaMono-LightItalic.otf -2024/02/13 | 16624 | macros/latex/contrib/l3kernel/l3text-map.dtx -2024/02/13 | 163484 | macros/latex/contrib/l3kernel/l3news08.pdf 2024/02/13 | 1624 | support/arara/scripts/rules/arara-rule-pdflatex.yaml 2024/02/13 | 1624 | support/arara/scripts/rules/arara-rule-lualatex.yaml 2024/02/13 | 161924 | support/arara/doc/resources/CascadiaMono-ExtraLightItalic.otf 2024/02/13 | 161121 | support/arara/source/arara-7.1.3-src.zip 2024/02/13 | 1609 | support/arara/scripts/rules/arara-rule-latex.yaml -2024/02/13 | 159767 | macros/latex/contrib/l3kernel/l3doc.dtx 2024/02/13 | 1570 | support/arara/scripts/rules/arara-rule-xelatex.yaml -2024/02/13 | 1561 | macros/latex/contrib/l3packages/xtemplate.ins 2024/02/13 | 1521 | support/arara/scripts/rules/arara-rule-uplatex.yaml 2024/02/13 | 1516 | support/arara/scripts/rules/arara-rule-platex.yaml -2024/02/13 | 151591 | macros/latex/contrib/l3kernel/l3news06.pdf -2024/02/13 | 151264 | macros/latex/contrib/l3kernel/l3docstrip.pdf 2024/02/13 | 1511 | support/arara/scripts/rules/arara-rule-xetex.yaml -2024/02/13 | 150919 | macros/latex/contrib/l3kernel/l3news02.pdf -2024/02/13 | 150302 | macros/latex/contrib/l3kernel/l3news10.pdf 2024/02/13 | 1502 | support/arara/scripts/rules/arara-rule-makeindex.yaml -2024/02/13 | 149691 | macros/latex/contrib/l3kernel/l3tl.dtx 2024/02/13 | 1493 | support/albatross/doc/albatross.1 -2024/02/13 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex -2024/02/13 | 148747 | macros/latex/contrib/l3kernel/l3news03.pdf 2024/02/13 | 1477 | support/arara/scripts/rules/arara-rule-asymptote.yaml 2024/02/13 | 1469 | support/arara/scripts/rules/arara-rule-knitr.yaml 2024/02/13 | 1447 | support/arara/scripts/rules/arara-rule-dvisvgm.yaml -2024/02/13 | 1444 | macros/latex/contrib/l3packages/l3keys2e-demo.tex -2024/02/13 | 144214 | macros/latex/contrib/l3kernel/l3file.dtx -2024/02/13 | 14314783 | install/macros/latex/contrib/l3kernel.tds.zip -2024/02/13 | 14100 | macros/latex/contrib/l3kernel/l3flag.dtx 2024/02/13 | 1396 | macros/unicodetex/latex/emotion/README.md 2024/02/13 | 1393093 | install/macros/unicodetex/latex/fontspec.tds.zip -2024/02/13 | 137539 | macros/latex/contrib/l3kernel/l3basics.dtx 2024/02/13 | 13716 | macros/unicodetex/latex/fontspec/fontspec-doc-api.tex 2024/02/13 | 1344 | macros/latex/contrib/exesheet/README.md 2024/02/13 | 1341 | support/arara/scripts/rules/arara-rule-clean.yaml 2024/02/13 | 1330044 | macros/unicodetex/latex/fontspec.zip -2024/02/13 | 13250 | macros/latex/contrib/l3kernel/l3tl-build.dtx 2024/02/13 | 1323 | support/arara/scripts/rules/arara-rule-sage.yaml 2024/02/13 | 13206 | support/albatross/source/albatross-0.5.1-src.zip 2024/02/13 | 1306 | macros/latex/contrib/xfrac/xfrac.ins -2024/02/13 | 130500 | macros/latex/contrib/l3kernel/l3keys.dtx -2024/02/13 | 12948 | macros/latex/contrib/l3kernel/l3bootstrap.dtx 2024/02/13 | 12937 | macros/unicodetex/latex/fontspec/fontspec-code-lang.dtx 2024/02/13 | 1288 | macros/unicodetex/latex/fontspec/fontspec.ltx 2024/02/13 | 1283 | support/arara/scripts/rules/arara-rule-pdfcsplain.yaml -2024/02/13 | 128344 | macros/latex/contrib/l3kernel/l3news07.pdf -2024/02/13 | 12832 | macros/latex/contrib/l3kernel/l3fp-traps.dtx 2024/02/13 | 1280 | support/arara/scripts/rules/arara-rule-llmk.yaml 2024/02/13 | 12785 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex 2024/02/13 | 1275 | support/arara/scripts/rules/arara-rule-luahbtex.yaml 2024/02/13 | 1274 | support/arara/scripts/rules/arara-rule-dvipspdf.yaml 2024/02/13 | 1273 | support/arara/scripts/rules/arara-rule-metapost.yaml -2024/02/13 | 1272 | macros/latex/contrib/l3packages/xparse.ins 2024/02/13 | 1271 | support/arara/scripts/rules/arara-rule-csplain.yaml 2024/02/13 | 1267 | support/arara/scripts/rules/arara-rule-pdftex.yaml 2024/02/13 | 1267 | support/arara/scripts/rules/arara-rule-luatex.yaml 2024/02/13 | 1259 | macros/unicodetex/latex/fontspec/fontspec-code-closing.dtx 2024/02/13 | 12507 | macros/unicodetex/latex/fontspec/fontspec-code-api.dtx 2024/02/13 | 12321 | macros/unicodetex/latex/fontspec/fontspec-code-math.dtx -2024/02/13 | 12304 | macros/latex/contrib/l3packages/l3keys2e.dtx -2024/02/13 | 122959 | macros/latex/contrib/l3kernel/l3news01.pdf -2024/02/13 | 1228 | macros/latex/contrib/l3packages/l3keys2e.ins 2024/02/13 | 1223 | macros/unicodetex/latex/fontspec/fontspec-code.ltx 2024/02/13 | 11984 | macros/unicodetex/latex/fontspec/fontspec-doc-xetex.tex 2024/02/13 | 11926 | macros/jptex/latex/jlreq/luajfm2pl.lua -2024/02/13 | 1191 | macros/latex/contrib/l3packages/xfp.ins -2024/02/13 | 11882 | macros/latex/contrib/l3kernel/l3styleguide.tex -2024/02/13 | 11778 | macros/latex/contrib/l3kernel/l3fparray.dtx -2024/02/13 | 116935 | macros/latex/contrib/l3kernel/l3token.dtx 2024/02/13 | 1165 | support/arara/scripts/rules/arara-rule-uptex.yaml 2024/02/13 | 1161 | support/arara/scripts/rules/arara-rule-ptex.yaml 2024/02/13 | 1157784 | support/arara/doc/arara-manual.pdf -2024/02/13 | 114754 | macros/latex/contrib/l3kernel/l3news04.pdf -2024/02/13 | 113735 | macros/latex/contrib/l3kernel/l3str-convert.dtx 2024/02/13 | 11357 | macros/unicodetex/latex/emotion/LICENSE -2024/02/13 | 112524 | macros/latex/contrib/l3kernel/l3news05.pdf -2024/02/13 | 112260 | macros/latex/contrib/l3kernel/l3color.dtx 2024/02/13 | 1109 | support/arara/scripts/rules/arara-rule-xdvipdfmx.yaml 2024/02/13 | 110765 | macros/latex/contrib/exesheet/exesheet.dtx 2024/02/13 | 1105 | support/arara/scripts/rules/arara-rule-animate.yaml 2024/02/13 | 1104 | support/arara/scripts/rules/arara-rule-authorindex.yaml 2024/02/13 | 10802 | macros/optex/base/others.opm -2024/02/13 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex 2024/02/13 | 1061 | support/arara/scripts/rules/arara-rule-etex.yaml -2024/02/13 | 105022 | macros/latex/contrib/l3kernel/l3fp-parse.dtx 2024/02/13 | 1049 | support/arara/scripts/rules/arara-rule-tex.yaml -2024/02/13 | 103074 | macros/latex/contrib/l3kernel/l3prop.dtx -2024/02/13 | 1005 | macros/latex/contrib/l3packages/README.md -2024/02/13 | 100486 | macros/latex/contrib/l3kernel/l3seq.dtx 2024/02/12 | 98392 | usergrps/dante/dtk.zip 2024/02/12 | 951 | macros/luatex/latex/lua-placeholders/doc/lua-placeholders-deps.bib 2024/02/12 | 9516 | macros/luatex/latex/gitinfo-lua/scripts/gitinfo-lua.lua @@ -1570,34 +2749,3 @@ 2024/02/12 | 115167 | macros/luatex/latex/gitinfo-lua/doc/gitinfo-lua.pdf 2024/02/12 | 1108 | macros/luatex/latex/gitinfo-lua/doc/git-scenario.sh 2024/02/12 | 1078435 | info/kaytannollista-latexia.zip -2024/02/11 | 95286 | systems/texlive/tlnet/tlpkg/translations/fr.po -2024/02/11 | 91474 | systems/texlive/tlnet/tlpkg/translations/vi.po -2024/02/11 | 90830 | systems/texlive/tlnet/tlpkg/translations/de.po -2024/02/11 | 90132 | systems/texlive/tlnet/tlpkg/translations/sk.po -2024/02/11 | 88795 | systems/texlive/tlnet/tlpkg/translations/it.po -2024/02/11 | 83641 | systems/texlive/tlnet/tlpkg/translations/pt_BR.po -2024/02/11 | 83312 | systems/texlive/tlnet/tlpkg/translations/cs.po -2024/02/11 | 82487 | systems/texlive/tlnet/tlpkg/translations/es.po -2024/02/11 | 81473 | systems/texlive/tlnet/tlpkg/translations/uk.po -2024/02/11 | 7700 | graphics/gastex/gastex-doc.tex -2024/02/11 | 76664 | graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex -2024/02/11 | 71328 | systems/texlive/tlnet/tlpkg/translations/sl.po -2024/02/11 | 68210 | systems/texlive/tlnet/tlpkg/translations/pl.po -2024/02/11 | 63796 | systems/texlive/tlnet/tlpkg/translations/zh_CN.po -2024/02/11 | 63064 | systems/texlive/tlnet/tlpkg/translations/ja.po -2024/02/11 | 62303 | systems/texlive/tlnet/tlpkg/translations/zh_TW.po -2024/02/11 | 59155 | systems/texlive/tlnet/tlpkg/translations/nl.po -2024/02/11 | 58581 | systems/texlive/tlnet/tlpkg/translations/da.po -2024/02/11 | 49262 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand1.pdf -2024/02/11 | 393 | macros/xetex/latex/exam-zh/doc/back/main-changelog.tex -2024/02/11 | 3504556 | macros/latex/contrib/proflycee.zip -2024/02/11 | 31545 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumDeva.pdf -2024/02/11 | 3060 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex -2024/02/11 | 25812 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex -2024/02/11 | 22087 | macros/optex/pkg/mte.opm -2024/02/11 | 208031 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty -2024/02/11 | 1835965 | macros/latex/contrib/proflycee/doc/ProfLycee-docctan.zip -2024/02/11 | 1393 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTgithub-mark.pdf -2024/02/11 | 134976 | graphics/gastex/gastex-doc.pdf -2024/02/11 | 108472 | systems/texlive/tlnet/tlpkg/translations/ru.po -2024/02/11 | 104362 | systems/texlive/tlnet/tlpkg/translations/sr.po diff --git a/biblio/ctan-bibdata/ctan.bib b/biblio/ctan-bibdata/ctan.bib index 2ccf9f3bb5..c0621c7270 100644 --- a/biblio/ctan-bibdata/ctan.bib +++ b/biblio/ctan-bibdata/ctan.bib @@ -1,7 +1,7 @@ %% bib file of all CTAN packages %% (C) Herbert Voß %% -%% created at 17-02-2024, 02:00:03 +%% created at 18-02-2024, 02:00:04 %% %% This file is provided under the terms of the LPPL v1.3 or @@ -13909,16 +13909,15 @@ @manual{ctan-codedescribe, title = {The \texttt{codedescribe} package}, - subtitle = {A minimalist set of commands (expl3 based) to describe - Document and Class level commands/functions}, + subtitle = {LaTeX code description and documentation}, author = {Alceu Frigeri}, - date = {2024-01-06}, - version = {1.3}, + date = {2024-02-17}, + version = {1.4}, license = {lppl1.3c,gpl}, mirror = {https://mirror.ctan.org/macros/latex/contrib/codedescribe}, url = {https://ctan.org/pkg/codedescribe}, - annotation = {This package aims to document both Document level - (i.e. final user) commands, as well Package/Class + annotation = {This package aims to document both document level + (i.e. final user) commands, as well package/class level commands. It is fully implemented using syntax and structures, in particular , and @@ -49702,8 +49701,8 @@ title = {The \texttt{novel} package}, subtitle = {Class for printing fiction, such as novels}, author = {Robert Allgeyer}, - date = {2024-02-16}, - version = {2.00}, + date = {2024-02-17}, + version = {2.1}, license = {lppl1.3c,ofl}, mirror = {https://mirror.ctan.org/macros/luatex/latex/novel}, url = {https://ctan.org/pkg/novel}, @@ -53804,7 +53803,7 @@ title = {The \texttt{pictochrono} package}, subtitle = {Insert “chronometer pictograms” with a duration}, author = {Cédric Pierquet}, - date = {2024-02-15}, + date = {2024-02-17}, version = {0.1.0}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/graphics/pgf/contrib/pictochrono}, @@ -54821,8 +54820,8 @@ title = {The \texttt{polyglossia} package}, subtitle = {An alternative to babel for \XeLaTeX{} and LuaLaTeX}, author = {François Charette and Arthur Rosendahl and Jürgen Spitzmüller}, - date = {2023-12-11}, - version = {1.66}, + date = {2024-02-17}, + version = {2.0}, license = {mit,lppl1.3,cc0}, mirror = {https://mirror.ctan.org/macros/unicodetex/latex/polyglossia}, url = {https://ctan.org/pkg/polyglossia}, @@ -58209,7 +58208,7 @@ title = {The \texttt{pynotebook} package}, subtitle = {pynotebook presents (raw, Markdown or Python) codes (and execution with LuaLaTeX) as in a Jupyter Notebook}, author = {Cédric Pierquet}, - date = {2024-02-16}, + date = {2024-02-17}, version = {0.1.0}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/contrib/pynotebook}, @@ -67367,7 +67366,7 @@ title = {The \texttt{tblr-extras} package}, subtitle = {Extra libraries for tabularray for caption and babel compatibility}, author = {Manuel Merino}, - date = {2024-02-13}, + date = {2024-02-17}, version = {1.0}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/contrib/tblr-extras}, @@ -78164,7 +78163,7 @@ title = {The \texttt{xfrac} package}, subtitle = {Split-level fractions}, author = {Morten Høgholm and Lars Madsen and Will Robertson and Joseph Wright and {The LaTeX Project Team}}, - date = {2024-02-15}, + date = {2024-02-17}, version = {}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/contrib/xfrac}, diff --git a/macros/generic/markdown/CHANGES.md b/macros/generic/markdown/CHANGES.md index 4e1e87e508..e0f893ab21 100644 --- a/macros/generic/markdown/CHANGES.md +++ b/macros/generic/markdown/CHANGES.md @@ -1,5 +1,323 @@ # Changes +## 3.4.1 (2024-02-16) + +Fixes: + +- Rename option `contentType` to `contentLevel`. (#300, #400, ca98e039) +- Correctly produce paragraph separators inside block-level elements. + (#376, #377, #403, contributed by @lostenderman) + +Deprecation: + +- Replace all instances of `\markdownInfo`, `\markdownWarning`, and + `\markdownError` with l3msg functions and deprecate `\markdownInfo`, + `\markdownWarning`, and `\markdownError`. (#383, #398, e3ca682c, 48002f84) +- Use the `TEXMF_OUTPUT_DIRECTORY` environmental variable to set + `\markdownOptionOutputDir` and deprecate `\markdownOptionOutputDir`. + (#405, #409, [matrix.org][matrix-405]) + + [matrix-405]: https://matrix.to/#/!efVbynJpCMjlOTfose:matrix.org/$8oUA2Bn3ch3q9K6RU-1EgpO9uQOd_3Mky4YwT325Ib0?via=matrix.org&via=im.f3l.de + +Docker: + +- Add support for TeX Live 2024 pretest. + (#404, #406, e51738ba, #410, 7ef64dd9, a7cff81d, contributed by @jspitz) + +## 3.4.0 (2024-01-31) + +Development: + +- Separate default token renderer prototype definitions to a universal theme + `witiko/markdown/defaults`. (#391, #392) +- Add format-independent options `noDefaults` and `plain`, which control the + loading of theme `witiko/markdown/defaults`. (#393, #394) +- Add `contentLevel` Lua option. + (#300, #375, #400, contributed by @lostenderman) + +Fixes: + +- Make Pandoc syntax extensions `tex_single_backslash_math` and + `tex_double_backslash_math` robust against extra spaces at the beginning / + end of inline / display math. (#386, #399, contributed by @lostenderman) + +Libraries: + +- Update `tinyyaml` to v0.4.4. (e2a59ba) + +Contributed Software: + +- Remove private GitHub repository `contributions/istqb_latex`. (cc21fe2) +- Add `contributions/37c3-beamer`. (f5bb26b, contributed by @TeXhackse) + +Default Renderer Prototypes: + +- Do not unnecessarily override math renderer prototypes in LaTeX/ConTeXt. + (#387, #396, contributed by @zousiyu1995) + +Unit Tests: + +- In pull requests, process added and modified testfiles first. + (feafe9b9, 9ff530da, 18deae73) + +Deprecation: + +- Replace all instances of `\markdownInfo`, `\markdownWarning`, and + `\markdownError` with l3msg functions and deprecate `\markdownInfo`, + `\markdownWarning`, and `\markdownError`. (#383, #398) + +Docker: + +- Uninstall the distribution Markdown package. (258a73d4) + +## 3.3.0 (2023-12-30) + +Development: + +- Add support for universal (cross-format) themes. (#276, #373) + +Fixes: + +- Prevent unwanted space tokens before `*ContextEnd` renderers. (#373) +- Make ConTeXt command `\inputmarkdown` properly process extra options. + (#389, #390, contributed by @ibotty) + +Documentation: + +- Improve the discoverability of the `\markdownInput` macro. + (#381, #382, contributed by @solernou) +- Encourage alternatives to the `hybrid` option in the user manual. (#382) + +Speed Improvements: + +- Optimize needless catcode switching in package code. (3eb7231) + +Default Renderer Prototypes: + +- Fix the typesetting of level four headings with attributes for LaTeX document + classes without the `\chapter` command such as `article` and level five + headings for LaTeX document classes with the `\chapter` command such as + `book`. (86eefc0) + +## 3.2.1 (2023-11-23) + +Fixes: + +- Remove the `options.cacheDir` directory if it is empty after conversion. + (5cfcea6) +- Allow tables inside lists. (#368, #371, contributed by @lostenderman, + sponsored by ISTQB) +- Check that shell access is unrestricted before attempting shell escape. + (#365, witiko/lt3luabridge#22, latex3/latex3#1339, #372) + +Documentation: + +- Add a link to a work-in-progress article for TUGboat 45:1 to `README.md`. + (1988a0c2, 3b85533d) +- Fix miscellaneous issues with the technical documentation. (#366, #367) +- In `README.md`, add a link to a GPT chatbot with background knowledge about + the Markdown Package for TeX. (59eb04d) + +Docker: + +- Include developer tools in the development Docker image. (#374) + +## 3.2.0 (2023-10-21) + +Development: + +- Add support for Pandoc `auto_identifiers` and `gfm_auto_identifiers` + syntax extensions. + (#237, #238, lostenderman/markdown#153, #315, #354, + contributed by @lostenderman) +- Add support for bulk redefinition of token renderers and token renderer + prototypes in the `\markdownSetup` command using enumeration. + (#232, #361..#363, [matrix.org][matrix-361]) + + [matrix-361]: https://matrix.to/#/!UeAwznpYwwsinVTetR:matrix.org/$k__vWylYp_L9eyZ0lXCPy26GokZ-Y9g5v8Xs9n47twQ?via=matrix.org&via=im.f3l.de + +Fixes: + +- Make the `import` LaTeX option correctly handle recursive imports. + (68c7a2f5, danopolan/istqb_latex#87) +- Support attributes on multi-line setext headings. + (#315, #355, #356, contributed by @lostenderman) +- Correctly process the combination of Lua options `fancyLists` and + `startNumber`. (59fb97e8) +- Properly parse emphasis at line endings in headings. + (#358, #360, contributed by @lostenderman) +- Fix fancy lists that use roman numerals as markers. + (danopolan/istqb_latex#87, #359, #364, + contributed by @lostenderman, sponsored by ISTQB) + +Documentation: + +- Add a link to a preprint from TUGboat 44:3 to `README.md`. + (cf6b3d7b, dc57af7) +- Measure the speed impact of test file batching. + (#357, b526fa65, 8c94ffc9, [matrix.org][matrix-357]) + + [matrix-357]: https://matrix.to/#/!efVbynJpCMjlOTfose:matrix.org/$WR3quuO1fyOl6w_KX6YFA4BACBcL-cWUWBpVfpPWDkI?via=matrix.org&via=im.f3l.de + +Unit Tests: + +- Restore CommonMark testfiles with trailing tabs and spaces. + (#348, #353, lostenderman/markdown#2, contributed by @lostenderman) +- Fail faster during batch bisection. (5177ef6) +- Speed up tests by running ConTeXt MkIV only once. (61f36e6d) +- Use `BEGIN document` and `END document` instead of `documentBegin` + and `documentEnd` for consistence with other renderers. (0be6be4) + +Continuous Integration: + +- Do not rebuild existing Docker images when we rerun the + continuous integration for the same commit multiple times. + (ae390ec, 70c5f2e5) + +Default Renderer Prototypes: + +- In LaTeX, correctly capitalize fancy list labels. (0a10053f) +- In LaTeX, properly indent fancy ordered lists when the Lua option + `startNumber` is enabled. (6a7649e8) + +## 3.1.0 (2023-09-27) + +Development: + +- Add `\markdownSetup` command to all TeX formats. + (#275, #349, [matrix.org][matrix-349]) +- Add an optional argument to the `markdown` LaTeX environment. + (#299, #351) +- Add support for Pandoc `mark` syntax extension. + (jgm/lunamark#67, #303, #352, [matrix.org][matrix-352], + contributed by @Omikhleia) + + [matrix-349]: https://matrix.to/#/!efVbynJpCMjlOTfose:matrix.org/$8JXGbDz0viyRyv6ySWQ3344BOhwd4dj5WYeawzEg_tU?via=matrix.org&via=im.f3l.de + [matrix-352]: https://matrix.to/#/!lWGKeMcpgwGHpfLYkf:matrix.org/$yVeWB0Yzfz6mgORv5VeG9IEl7a4xLogkAUmdNMSCxEg?via=matrix.org&via=im.f3l.de + +Deprecation: + +- Deprecate the `markdown*` LaTeX environment. + (#299, #351, [matrix.org][matrix-351]) + + [matrix-351]: https://matrix.to/#/!lWGKeMcpgwGHpfLYkf:matrix.org/$yVeWB0Yzfz6mgORv5VeG9IEl7a4xLogkAUmdNMSCxEg?via=matrix.org&via=im.f3l.de + +Unit Tests: + +- Add support for YAML metadata in testfiles. + (#345, #347, [matrix.org][matrix-347]) + + [matrix-347]: https://matrix.to/#/!efVbynJpCMjlOTfose:matrix.org/$8JXGbDz0viyRyv6ySWQ3344BOhwd4dj5WYeawzEg_tU?via=matrix.org&via=im.f3l.de + +Documentation: + +- Add a link to a preprint from CSTUG Bulletin to `README.md`. + (2c354f49) + +## 3.0.1 (2023-09-10) + +Fixes: + +- Correctly parse paragraphs with trailing spaces. + (danopolan/istqb_latex#77, #345, #347) + +## 3.0.0 (2023-08-25) + +Development: + +- Add support for TeX-like rich paragraphs. + (#30, #306, [matrix.org][matrix-306]) + + [matrix-306]: https://matrix.to/#/!lWGKeMcpgwGHpfLYkf:matrix.org/$g9ZTEyXP-V_5elJjcqRd-D9QyIfJuTw-TWlZIFoh72c?via=matrix.org&via=im.f3l.de + +Fixes: + +- Reset current heading level at the end of a markdown document. + (1261e6f) +- Fix out-of-memory issues with CommonMark implementation. + (#308, #318, 28650b8) +- Fix `rawAttribute` option being enabled in Lua by default. + (92c9ac2) +- Make our implementation of attributes compatible with jgm/pandoc. + (jgm/lunamark#68, #304, #343, contributed by @Omikhleia) + +Documentation: + +- Fix the link to @xvrabcov's talk at TUG 2022 in `README.md`. + (166c4506) +- Add a link to @writersglen's talk at TUG 2022 to `README.md`. + (f3efcb9) +- Document setting up catcodes in Lua. (#329, #342) + +Unit Tests: + +- Batch unit tests to improve speed. + (#245, #316, 8bfd0b3, #317, #319..#325, #327, #328, e3b31696, + #331, #332, #334, 0a230fa, 90cc428, 3be0013, dbe1808, a0108814) +- Use self-hosted GitHub runners for tests to improve speed. + (#326, #330, #331, a9948a86, 68b6216b, contributed by @TeXhackse, + [matrix.org][matrix-331]) + + [matrix-331]: https://matrix.to/#/!efVbynJpCMjlOTfose:matrix.org/$6qKDXlLxsaJnOl0muFX3K7Htj41B-7hL2PmSFTIm6NE?via=matrix.org&via=im.f3l.de + +Continuous Integration: + +- In draft pull requests, do not build documentation or examples + and do not run pkgcheck. (#337, #338, 189bb153) +- Push temporary Docker images to GitHub Packages. + (#340, #341, d15ae88a, 7e42e846) + +## 3.0.0-alpha.2 (2023-08-01) + +Development: + +- Add support for attributes on tables. (#310, #313, 8786408) + +Default Renderer Prototypes: + +- Correctly handle multiple heading identifiers. (3ae1b0d1) +- Add alt text to figures. (#312) + +Documentation: + +- Add a link to TUG 2023 slides and video to the README. + (ce6047b8, adb69e2f) + +Unit Tests: + +- Rewrite the unit testing framework from Bash to Python + and implement summarization. (#245, #314) + +## 3.0.0-alpha (2023-06-27) + +Development: + +- Comply with CommonMark 0.30 and increment `grammar_version` to `3`. + (contributed by @lostenderman, #29, #210, #212, #226) +- Add a demo of using the Markdown package in OpTeX. + (contributed by @olsak, #215, 109c1b5, #292) +- Add `singletonCache` Lua option. (#226) + +Documentation: + +- Add @lostenderman's thesis to `README.md`. (#226, 8a4536e) + +Default Renderer Prototypes: + +- Do not force line breaks after high-level headings in LaTeX. + Allow the text to follow the heading on the same line. (df8562c) + +Deprecation: + +- Remove deprecated parts of the package. (#309) +- Remove support for LuaMetaTeX. (#226) + +Fixes: + +- Allow references in fenced divs. (#307, jgm/lunamark#69) +- Prevent `eagerCache=false` from causing undefined behavior and make + it the new default. (#129) + ## 2.23.0 (2023-04-27) Development: @@ -55,9 +373,12 @@ Development: parens and brackets. (contributed by @lostenderman, #61, #235, #236, #270) - Add support for attributes on links, images, fenced code, - and inline code spans. (jgm#36, jgm#43, #50, #123, #256, #280) + and inline code spans. (jgm/lunamark#36, jgm/lunamark#43, + #50, #123, #256, #280, [matrix.org][matrix-256]) - Add `import` LaTeX option. (#107, #286) + [matrix-256]: https://matrix.to/#/!pznomuvubVyxElflTe:matrix.org/$mDATROtxOLOGBvH5Nt3o86iysRe1LCfZB-lw4PqjKJk?via=matrix.org&via=im.f3l.de + Documentation: - Unify how Pandoc syntax extensions are named and cited in @@ -107,9 +428,10 @@ Deprecation: Development: - Add support for line blocks. - (contributed by @Omikhleia and @lostenderman, jgm#41, #209, #248) + (contributed by @Omikhleia and @lostenderman, jgm/lunamark#41, + #209, #248) - Add support for attributes on fenced code blocks. - (contributed by @Omikhleia, jgm#36, #123, #211) + (contributed by @Omikhleia, jgm/lunamark#36, #123, #211) Documentation: @@ -126,7 +448,8 @@ Fixes: - Fix input normalization and move it from Lua CLI and plain TeX layers directly to the `convert()` Lua method. (#246, #253) - Allow fenced div closing tag to break out of a blockquote. - (contributed by @Omikhleia, jgm#60, jgm#61, #230, #259) + (contributed by @Omikhleia, jgm/lunamark#60, jgm/lunamark#61, + #230, #259) Default Renderer Prototypes: @@ -194,8 +517,7 @@ Development: - Rename the `footnotes` and `inlineFootnotes` options to `notes` and `inlineNotes`. - Rename the `HorizontalRule` rule to `ThematicBreak` and increment - `grammar_version` to `2`. This change is not backwards-compatible with the - `grammar_version` of `1`. + `grammar_version` to `2`. - Add `\markdownEscape` macro that inputs a TeX document in the middle of a markdown document fragment. (1478f7b) - Add support for raw attributes. (#173, #202) diff --git a/macros/generic/markdown/README.md b/macros/generic/markdown/README.md index 217cd6710e..5a87521f0f 100644 --- a/macros/generic/markdown/README.md +++ b/macros/generic/markdown/README.md @@ -4,24 +4,26 @@ Markdown [![license](https://img.shields.io/github/license/witiko/markdown)](LICENSE) [![ci](https://github.com/witiko/markdown/actions/workflows/main.yml/badge.svg)][ci] [![release](https://img.shields.io/github/release/witiko/markdown)][release] -  -[![matrix](https://img.shields.io/matrix/witiko-markdown:matrix.org?label=matrix%20chat)][matrix] -[![discord](https://img.shields.io/discord/1011667276908474440?label=discord%20chat&color=blueviolet)][discord] - - [release]: https://github.com/Witiko/markdown/releases/latest "Releases · Witiko/markdown" - [ci]: https://github.com/Witiko/markdown/actions "GitHub Actions" - [matrix]: https://matrix.to/#/#witiko-markdown:matrix.org "The Matrix Chat Space for the Markdown package" - [discord]: https://discord.gg/8xJsPghzSH "The Discord Chat Space for the Markdown package" - -The Markdown package converts [markdown][] markup to TeX commands. The +[![docker-witiko/markdown](https://img.shields.io/docker/v/witiko/markdown/latest?label=docker)][docker-witiko/markdown] +[![matrix](https://img.shields.io/matrix/witiko-markdown:matrix.org?label=matrix)][matrix] +[![discord](https://img.shields.io/discord/1011667276908474440?label=discord&color=blueviolet)][discord] +[![chatgpt](https://img.shields.io/badge/gpt-9cf)][chatgpt] + + [release]: https://github.com/Witiko/markdown/releases/latest "Releases · Witiko/markdown" + [ci]: https://github.com/Witiko/markdown/actions "GitHub Actions" + [matrix]: https://matrix.to/#/#witiko-markdown:matrix.org "The Matrix Chat Space for the Markdown package" + [discord]: https://discord.gg/8xJsPghzSH "The Discord Chat Space for the Markdown package" + [chatgpt]: https://chat.openai.com/g/g-I3K0DweJe-markdown-package-for-tex "ChatGPT - Markdown package for TeX" + +The Markdown package converts [CommonMark][] markup to TeX commands. The functionality is provided both as a Lua module, and as plain TeX, LaTeX, and ConTeXt macro packages that can be used to directly typeset TeX documents -containing markdown markup. Unlike other convertors, the Markdown package -does not require any external programs, and makes it easy to redefine how each -and every markdown element is rendered. Creative abuse of the markdown syntax -is encouraged. 😉 +containing markdown markup. Unlike other convertors, the Markdown package does +not require any external programs, and makes it easy to redefine how each and +every markdown element is rendered. Creative abuse of the markdown syntax is +encouraged. 😉 - [markdown]: https://daringfireball.net/projects/markdown/basics "Daring Fireball: Markdown Basics" + [commonmark]: https://commonmark.org/ "CommonMark: A strongly defined, highly compatible specification of Markdown" Your first Markdown document ---------------------------- @@ -56,12 +58,12 @@ Next, run the [LaTeXMK][] tool from [our official Docker image][docker-witiko/markdown] on `document.tex`: docker run --rm -v "$PWD"/workdir:/workdir -w /workdir witiko/markdown \ - latexmk -lualatex -silent document.tex + latexmk -pdf -shell-escape -silent document.tex Alternatively, you can install [TeX Live][tex-live] (can take up to several hours) and use its [LaTeXMK][] tool: - latexmk -cd -lualatex -silent workdir/document.tex + latexmk -cd -pdf -shell-escape -silent workdir/document.tex A PDF document named `workdir/document.pdf` should be produced and contain the following output: @@ -95,6 +97,8 @@ jobs: - uses: actions/checkout@v2 - run: latexmk -lualatex document.tex - uses: marvinpinto/action-automatic-releases@latest + permissions: + contents: write with: title: The latest typeset book automatic_release_tag: latest @@ -114,7 +118,7 @@ In fact, this is how we automatically produce Peek under the hood ------------------- -Remember how we said that the Markdown package converts [markdown][] markup to +Remember how we said that the Markdown package converts markdown markup to TeX commands? Let's see what that means and what we can do with this knowledge. Using a text editor, create an empty text document named `document.md` with @@ -180,26 +184,32 @@ For further information, consult one of the following: - [Writing Beamer Slides with Markdown][overleaf-4], - [Writing Posters with Markdown][overleaf-5], and - [Using Markdown in LaTeX documents][overleaf-6]. -4. My journal articles published by [TUGboat][]: +4. Journal articles published by [TUGboat][]: - [Using Markdown inside TeX documents][tb119], - [Markdown 2.7.0: Towards lightweight markup in TeX][tb124], - [Making Markdown into a Microwave Meal][tb129], - [Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX][tb131], - [Markdown 2.15.0: What's New?][tb133], - - [Markdown 2.17.1: What's New, What's Next?][tb135], and - - [Attributes in Markdown][tb136]. -5. Journal articles of me and my students published by [CSTUG Bulletin][csbul] (in Czech and Slovak): + - [Markdown 2.17.1: What's New, What's Next?][tb135], + - [Attributes in Markdown][tb136], + - Markdown 3 at TUG 2023: Reflections from the Q&A session ([preprint][tb138]), and + - Fast Regression Testing of TeX Packages: The Unreasonable Effectiveness of Batching ([work in progress][tb139]). +5. Journal articles published by [CSTUG Bulletin][csbul] (in Czech and Slovak): - [Rendering Markdown inside TeX Documents][10.5300/2016-1-4/78], - [Markdown 2.8.1: Boldly Unto the Throne of Lightweight Markup in TeX][10.5300/2020-1-2/48], - [Markdown 2.10.0: LaTeX Themes & Snippets][10.5300/2021-1-4/76], - - [Direct Typesetting of Various Document Formats in TeX Using the Pandoc Utility][10.5300/2021-1-4/83], and - - [High-Level Languages for TeX][10.5300/2022-1-4/35]. -6. Talks by me and my students: - - [Five Years of Markdown in LaTeX: What, Why, How, and Whereto][pv212-fall2020] (in Czech), and - - [Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX][tb131-video] ([slides][tb131-slides]). - - [A Gentle Introduction to Markdown for Writers][tb134-video] ([slides][tb134-slides], [example][tb134-example]). -7. Theses by my students: + - [Direct Typesetting of Various Document Formats in TeX Using the Pandoc Utility][10.5300/2021-1-4/83], + - [High-Level Languages for TeX][10.5300/2022-1-4/35], and + - Markdown 3: What's New, What's Next? ([preprint][10.5300/2023-?-?/??]). +6. Talks: + - [Five Years of Markdown in LaTeX: What, Why, How, and Whereto][pv212-fall2020] (in Czech), + - [Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX][tb131-video] ([slides][tb131-slides]), + - [A Self-Publisher's Take on Markdown and TeX][tb134-01-video] ([slides][tb134-01-slides]), and + - [A Gentle Introduction to Markdown for Writers][tb134-02-video] ([slides][tb134-02-slides], [example][tb134-02-example]), and + - [Markdown 3: What's New, What's Next?][tb137-video] ([slides][tb137-slides]). +7. Theses: - [Generic TeX Writer for the Pandoc Document Converter][thesis-umhg5] + - [An implementation of the CommonMark standard into the Markdown package for TeX][thesis-r7z7l] [overleaf-1]: https://www.overleaf.com/learn/latex/Articles/How_to_write_in_Markdown_on_Overleaf "How to write in Markdown on Overleaf" [overleaf-2]: https://www.overleaf.com/learn/latex/Articles/Markdown_into_LaTeX_with_Style "Markdown into LaTeX with Style" @@ -208,19 +218,25 @@ For further information, consult one of the following: [overleaf-5]: https://www.overleaf.com/latex/examples/writing-posters-with-markdown/jtbgmmgqrqmh "Writing Posters with Markdown" [overleaf-6]: https://www.overleaf.com/latex/examples/using-markdown-in-latex-documents/whdrnpcpnwrm "Using Markdown in LaTeX documents" - [tb119]: https://www.tug.org/TUGboat/tb38-2/tb119novotny.pdf "Using Markdown inside TeX documents" - [tb124]: https://www.tug.org/TUGboat/tb40-1/tb124novotny-markdown.pdf "Markdown 2.7.0: Towards lightweight markup in TeX" - [tb129]: https://www.tug.org/TUGboat/tb41-3/tb129novotny-frozen.pdf "Making Markdown into a Microwave Meal" - [tb131]: https://www.tug.org/TUGboat/tb42-2/tb131novotny-markdown.pdf "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX" - [tb133]: https://www.tug.org/TUGboat/tb43-1/tb133novotny-markdown.pdf "Markdown 2.15.0: What's New?" - [tb135]: https://www.overleaf.com/read/pgwrhhskmgfm "Markdown 2.17.1: What's New, What's Next?" - [tb136]: https://www.overleaf.com/read/dshtsnnmtshs "Attributes in Markdown" - - [tb131-slides]: https://tug.org/tug2021/assets/pdf/tug2021-novotny-slides.pdf "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX" - [tb131-video]: https://youtu.be/THmPkAncMnc "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX" - [tb134-slides]: https://tug.org/tug2022/assets/pdf/Tereza_Vrabcová-TUG2022-slides.pdf "A Gentle Introduction to Markdown for Writers" - [tb134-example]: https://tug.org/tug2022/assets/pdf/Tereza_Vrabcová-TUG2022-example.pdf "A Gentle Introduction to Markdown for Writers" - [tb134-video]: https://youtu.be/cqbKgjAlNjo?t=2h10m35s "A Gentle Introduction to Markdown for Writers" + [tb119]: https://www.tug.org/TUGboat/tb38-2/tb119novotny.pdf "Using Markdown inside TeX documents" + [tb124]: https://www.tug.org/TUGboat/tb40-1/tb124novotny-markdown.pdf "Markdown 2.7.0: Towards lightweight markup in TeX" + [tb129]: https://www.tug.org/TUGboat/tb41-3/tb129novotny-frozen.pdf "Making Markdown into a Microwave Meal" + [tb131]: https://www.tug.org/TUGboat/tb42-2/tb131novotny-markdown.pdf "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX" + [tb133]: https://www.tug.org/TUGboat/tb43-1/tb133novotny-markdown.pdf "Markdown 2.15.0: What's New?" + [tb135]: https://www.tug.org/TUGboat/tb43-3/tb135novotny-markdown.pdf "Markdown 2.17.1: What's New, What's Next?" + [tb136]: https://www.tug.org/TUGboat/tb44-1/tb136novotny-markdown-attr.pdf "Attributes in Markdown" + [tb138]: https://www.overleaf.com/read/mjghwhrbgmfj "Markdown 3 at TUG 2023: Reflections from the Q&A session" + [tb139]: https://github.com/witiko/fast-regression-testing/releases/download/latest/main.pdf "Fast Regression Testing of TeX Packages: The Unreasonable Effectiveness of Batching" + + [tb131-slides]: https://tug.org/tug2021/assets/pdf/tug2021-novotny-slides.pdf "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX" + [tb131-video]: https://youtu.be/i2GJMnLCZls "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX" + [tb134-01-slides]: https://tug.org/tug2022/assets/served/Lloyd_Prentice-TUG2022-prentice-selfpub-slides.pdf "A Self-Publisher's Take on Markdown and TeX" + [tb134-01-video]: https://youtu.be/OhwzT3TcLj8 "A Self-Publisher's Take on Markdown and TeX" + [tb134-02-slides]: https://tug.org/tug2022/assets/pdf/Tereza_Vrabcová-TUG2022-slides.pdf "A Gentle Introduction to Markdown for Writers" + [tb134-02-example]: https://tug.org/tug2022/assets/pdf/Tereza_Vrabcová-TUG2022-example.pdf "A Gentle Introduction to Markdown for Writers" + [tb134-02-video]: https://youtu.be/FhN_x9rsR4M "A Gentle Introduction to Markdown for Writers" + [tb137-slides]: https://tug.org/tug2023/files/sa-03-novotny-markdown3/novotny-markdown3-slides.pdf "Markdown 3: What's New, What's Next?" + [tb137-video]: https://youtu.be/U8XjTOhJkg0 "Markdown 3: What's New, What's Next?" [10.5300/2016-1-4/78]: https://www.doi.org/10.5300/2016-1-4/78 "Rendering Markdown inside TeX Documents" [10.5300/2020-1-2/48]: https://www.doi.org/10.5300/2020-1-2/48 "Markdown 2.8.1: Boldly Unto the Throne of Lightweight Markup in TeX" @@ -228,7 +244,9 @@ For further information, consult one of the following: [10.5300/2021-1-4/83]: https://www.doi.org/10.5300/2021-1-4/83 "Direct Typesetting of Various Document Formats in TeX Using the Pandoc Utility" [10.5300/2022-1-4/35]: https://www.doi.org/10.5300/2022-1-4/35 "High-Level Languages for TeX" - [pv212-fall2020]: https://is.muni.cz/elearning/warp?qurl=%2Fel%2Ffi%2Fpodzim2020%2FPV212%2Findex.qwarp;prejit=5595952 + [10.5300/2023-?-?/??]: https://github.com/witiko/markdown-3-whats-new-whats-next/releases/download/latest/main.pdf "Markdown 3: What's New, What's Next?" + + [pv212-fall2020]: https://is.muni.cz/elearning/io/?qurl=%2Fel%2Ffi%2Fpodzim2020%2FPV212%2Findex.qwarp;prejit=5595952 [install]: https://mirrors.ctan.org/macros/generic/markdown/markdown.html#installation "Markdown Package User Manual" [liantze]: http://liantze.penguinattack.org/ "Rants from the Lab" @@ -243,6 +261,7 @@ For further information, consult one of the following: [techdoc-tex-live]: https://mirrors.ctan.org/macros/generic/markdown/markdown.pdf "A Markdown Interpreter for TeX" [thesis-umhg5]: https://is.muni.cz/th/umhg5/?lang=en "Generic TeX Writer for the Pandoc Document Converter" + [thesis-r7z7l]: https://is.muni.cz/th/r7z7l/?lang=en "An implementation of the CommonMark standard into the Markdown package for TeX" Acknowledgements ---------------- @@ -252,12 +271,17 @@ Acknowledgements | [][fimu] | I gratefully acknowledge the funding from the [Faculty of Informatics][fimu] at the [Masaryk University][mu] in Brno, Czech Republic, for the development of the Markdown package in projects [MUNI/33/12/2015][], [MUNI/33/1784/2020][], [MUNI/33/0776/2021][], [MUNI/33/1654/2022][], and [MUNI/33/1658/2022][]. | | [][overleaf] | Extensive user documentation for the Markdown package was kindly written by [Lian Tze Lim][liantze] and published by [Overleaf][]. | | [][omedym] | Support for content slicing (Lua options [`shiftHeadings`][option-shift-headings] and [`slice`][option-slice]) and pipe tables (Lua options [`pipeTables`][option-pipe-tables] and [`tableCaptions`][option-table-captions]) was graciously sponsored by [David Vins][dvins] and [Omedym][]. | +| [][istqb] | Fixes for issues [#359][issue-359] and [#368][issue-368] were graciously sponsored by the [International Software Testing Qualifications Board (ISTQB)][istqb]. | [dvins]: https://github.com/dvins "David Vins" [fimu]: https://www.fi.muni.cz/index.html.en "Faculty of Informatics, Masaryk University" + [ISTQB]: https://www.istqb.org/ "International Software Testing Qualifications Board" [mu]: https://www.muni.cz/en "Masaryk University" [Omedym]: https://www.omedym.com/ "Omedym" + [issue-359]: https://github.com/witiko/markdown/issues/359 "First item of a fancy list forms a separate list" + [issue-368]: https://github.com/witiko/markdown/issues/368 "Tables nested in list items have empty lines" + [option-pipe-tables]: https://mirrors.ctan.org/macros/generic/markdown/markdown.html#pipe-tables "Markdown Package User Manual" [option-shift-headings]: https://mirrors.ctan.org/macros/generic/markdown/markdown.html#option-shiftheadings "Markdown Package User Manual" [option-slice]: https://mirrors.ctan.org/macros/generic/markdown/markdown.html#slice "Markdown Package User Manual" diff --git a/macros/generic/markdown/VERSION b/macros/generic/markdown/VERSION index 51e0f67329..941a04710b 100644 --- a/macros/generic/markdown/VERSION +++ b/macros/generic/markdown/VERSION @@ -1 +1 @@ -2.23.0-0-g0b22f91 (2023-04-27) +3.4.1-0-g457226ae (2024-02-16) diff --git a/macros/generic/markdown/docstrip.cfg b/macros/generic/markdown/docstrip.cfg index 853817bb0a..9dc5f65230 100644 --- a/macros/generic/markdown/docstrip.cfg +++ b/macros/generic/markdown/docstrip.cfg @@ -22,7 +22,7 @@ -- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE^^J% -- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.^^J% --^^J% --- Copyright (C) 2016-2023 Vít Novotný^^J% +-- Copyright (C) 2016-2024 Vít Starý Novotný^^J% --^^J% -- This work may be distributed and/or modified under the^^J% -- conditions of the LaTeX Project Public License, either version 1.3^^J% @@ -35,7 +35,7 @@ -- version 2005/12/01 or later.^^J% --^^J% -- This work has the LPPL maintenance status `maintained'.^^J% --- The Current Maintainer of this work is Vít Novotný.^^J% +-- The Current Maintainer of this work is Vít Starý Novotný.^^J% --^^J% -- Send bug reports, requests for additions and questions^^J% -- either to the GitHub issue tracker at^^J% @@ -62,7 +62,7 @@ \let\luapostamble\empty \declarepreamble\texpreamble -Copyright (C) 2016-2023 Vít Novotný +Copyright (C) 2016-2024 Vít Starý Novotný This work may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3c @@ -72,7 +72,7 @@ The latest version of this license is in http://www.latex-project.org/lppl.txt This work has the LPPL maintenance status `maintained'. -The Current Maintainer of this work is Vít Novotný. +The Current Maintainer of this work is Vít Starý Novotný. Send bug reports, requests for additions and questions either to the GitHub issue tracker at diff --git a/macros/generic/markdown/examples/context-mkiv.tex b/macros/generic/markdown/examples/context-mkiv.tex index 4c05059f3a..8b000e43ed 100644 --- a/macros/generic/markdown/examples/context-mkiv.tex +++ b/macros/generic/markdown/examples/context-mkiv.tex @@ -58,8 +58,10 @@ kpse.set_program_name("luatex") \starttext % Typeset the document `example.md` by letting the Markdown package handle -% the conversion internally. -\inputmarkdown{./example.md} +% the conversion internally. Optionally, we can specify additional options +% between the square brackets similarly to the command `\setupmarkdown`. +% Unlike `\setupmarkdown`, the options will only apply for this document. +\inputmarkdown[smart_ellipses = yes]{./example.md} % Typeset the document `example.tex` that we prepared separately using the % Lua command-line interface and that contains a plain TeX representation diff --git a/macros/generic/markdown/examples/example.md b/macros/generic/markdown/examples/example.md index 8819ef5b67..5e5457088e 100644 --- a/macros/generic/markdown/examples/example.md +++ b/macros/generic/markdown/examples/example.md @@ -41,9 +41,7 @@ This is a table: This is a bullet list: -* The first item of a bullet list - - that spans several paragraphs, +* The first item of a bullet list, * the second item of a bullet list, @@ -57,9 +55,7 @@ This is a compact bullet list: This is an ordered list: -5. The first item of an ordered list - - that spans several paragraphs, +5. The first item of an ordered list, 6. the second item of an ordered list, @@ -67,9 +63,7 @@ This is an ordered list: This is a fancy ordered list: -e) The first item of an ordered list - - that spans several paragraphs, +e) The first item of an ordered list, f) the second item of an ordered list, @@ -77,9 +71,7 @@ g) the third item of an ordered list. This is an ordered list using hash enumerators: -#. The first item of an ordered list - - that spans several paragraphs, +#. The first item of an ordered list, #. the second item of an ordered list, diff --git a/macros/generic/markdown/examples/latex-luatex.tex b/macros/generic/markdown/examples/latex-luatex.tex index 18b16bf776..9b2e623408 100644 --- a/macros/generic/markdown/examples/latex-luatex.tex +++ b/macros/generic/markdown/examples/latex-luatex.tex @@ -1,5 +1,15 @@ \documentclass{book} \usepackage{polyglossia} +% work around a bug in polyglossia +\makeatletter +\ExplSyntaxOn +\pretocmd\xpg@set@alias@values{% + \prop_if_exist:cF { xpg@alias@keyvals@#1@#4 } + { \prop_new:c {xpg@alias@keyvals@#1@#4} } +}{}{} +\ExplSyntaxOff +\makeatother +% end of workaround \setmainlanguage{english} \usepackage{fontspec} \usepackage{booktabs} @@ -28,13 +38,13 @@ texMathSingleBackslash, ]{markdown} % Set the document metadata using a YAML metadata block. -\begin{markdown*}{hybrid} +\begin{markdown}[hybrid] --- title: An Example *Markdown* Document -author: Vít Novotný +author: Vít Starý Novotný date: \today --- -\end{markdown*} +\end{markdown} \begin{document} % Typeset the document `example.md` by letting the Markdown package handle % the conversion internally. diff --git a/macros/generic/markdown/examples/latex-pdftex.tex b/macros/generic/markdown/examples/latex-pdftex.tex index db6cbea8c8..7d188d75f2 100644 --- a/macros/generic/markdown/examples/latex-pdftex.tex +++ b/macros/generic/markdown/examples/latex-pdftex.tex @@ -29,13 +29,13 @@ texMathSingleBackslash, ]{markdown} % Set the document metadata using a YAML metadata block. -\begin{markdown*}{hybrid} +\begin{markdown}[hybrid] --- title: An Example *Markdown* Document -author: Vít Novotný +author: Vít Starý Novotný date: \today --- -\end{markdown*} +\end{markdown} \begin{document} % Typeset the document `example.md` by letting the Markdown package handle % the conversion internally. @@ -55,7 +55,7 @@ date: \today Here are some non-ASCII characters: *ěščřžýáíé*. \end{markdown} -\begin{markdown*}{html, hybrid} +\begin{markdown}[hybrid] Here is some HTML code mixed *with Markdown*. In \TeX, the HTML code will be silently ignored, whereas in \TeX 4ht, the HTML code will be passed through to the output: @@ -72,5 +72,5 @@ through to the output: 10 -\end{markdown*} +\end{markdown} \end{document} diff --git a/macros/generic/markdown/examples/optex.tex b/macros/generic/markdown/examples/optex.tex new file mode 100644 index 0000000000..d39369f6b3 --- /dev/null +++ b/macros/generic/markdown/examples/optex.tex @@ -0,0 +1,379 @@ +\fontfam[lm] +\hyperlinks\Blue\Blue + +% Set options of the Markdown module +\_def \markdownOptions { + cacheDir="_markdown_example", + definitionLists=true, + fencedCode=true, + hashEnumerators=true, + smartEllipses=true, + strikeThrough=true, +} + +% Set renderers of the Markdown module +%% Attribute Renderers +%%% TODO + +%% Block Quote Renderers +\_def \markdownRendererBlockQuoteBegin {\_begblock} +\_def \markdownRendererBlockQuoteEnd {\_endblock} + +%% Bracketed Spans Attribute Context Renderers +%%% TODO + +%% Bullet List Renderers +\_def \markdownRendererUlBegin {\_begitems \_itemskipamount=\_olistskipamount} +\_def \markdownRendererUlBeginTight {\_begitems} +\_def \markdownRendererUlItem {\_startitem} +\_def \markdownRendererUlItemEnd {\_par} +\_def \markdownRendererUlEnd {\_enditems} +\_def \markdownRendererUlEndTight {\_enditems} + +%% Citations Renderers +%%% TODO + +%% Code Block Renderers +\_def \markdownRendererInputVerbatim #1{\_verbinput (-) {#1} } +\_def \markdownRendererInputFencedCode #1#2{\_verbinput \_hisyntax{#2} (-) {#1} } + +%% Code Span Renderer +\_def \markdownRendererCodeSpan #1{{\_ttfont #1}} + +%% Code Span Attribute Context Renderers +%%% TODO + +%% Content Block Renderers +%%% TODO + +%% Definition List Renderers +\_sdef{_item:d}{\_aftergroup\dword} +\_def \dword #1#2{{\bf#2 }\ignorespaces} +\_def \markdownRendererDlBegin {\_begitems \_style d \_itemskipamount=\_olistskipamount} +\_def \markdownRendererDlBeginTight {\_begitems \_style d} +\_def \markdownRendererDlItem {% + \_begingroup + \_def \markdownRendererInterblockSeparator {% + \_par + \_advance\_leftskip by\_iindent + \_def \markdownRendererInterblockSeparator {\_par}% + }% + \_startitem +} +\_def \markdownRendererDlItemEnd {% + \_par + \_endgroup +} +\_def \markdownRendererDlDefinitionBegin {} +\_def \markdownRendererDlDefinitionEnd #1{% + \_ifx #1\markdownRendererDlDefinitionBegin + \_firstnoindent + \markdownRendererInterblockSeparator + \_vskip\_itemskipamount + \_fi + #1% +} +\_def \markdownRendererDlEnd {\_enditems} +\_def \markdownRendererDlEndTight {\_enditems} + +%% Ellipsis Renderer +\_def \markdownRendererEllipsis {$\_ldots$} + +%% Emphasis Renderers +\_def \markdownRendererEmphasis #1{{\_em #1}} +\_def \markdownRendererStrongEmphasis #1{{\_bf #1}} + +%% Fenced Code Attribute Context Renderers +%%% TODO + +%% Fenced Div Attribute Context Renderers +%%% TODO + +%% Header Attribute Context Renderers +%%% TODO + +%% Heading Renderers +\_def \markdownRendererHeadingOne #1{\_printtit{#1}} +\_def \markdownRendererHeadingTwo #1{\_inchap{#1}} +\_def \markdownRendererHeadingThree #1{\_insec{#1}} +\_def \markdownRendererHeadingFour #1{\_insecc{#1}} +\_def \markdownRendererHeadingFive #1{{\_bf #1}\_firstnoindent} +\_def \markdownRendererHeadingSix #1{#1\_firstnoindent} + +%% HTML Comment Renderers +%%% TODO + +%% HTML Tag and Element Renderers +%%% TODO + +%% Image Renderer +\_def \markdownRendererImage #1#2#3#4{% + \_topinsert + \_centerline{\_inspic{#3}}% + \_cskip + \_caption/f #4% + \_par + \_endinsert +} + +%% Image Attribute Context Renderers +%%% TODO + +%% Interblock Separator Renderer +\_def \markdownRendererInterblockSeparator {\_par} +\_def \markdownRendererParagraphSeparator {\markdownRendererInterblockSeparator} + +%% Line Block Renderers +%%% TODO + +%% Line Break Renderers +\_def \markdownRendererSoftLineBreak { } +\_def \markdownRendererHardLineBreak {\_nl} + +%% Link Renderer +\_def \markdownRendererLink #1#2#3#4{\_ea\_ulink\_ea[\_expanded{#3}]{#1}} + +%% Link Attribute Context Renderers +%%% TODO + +%% Markdown Document Renderers +\_let \markdownRendererDocumentBegin \_relax +\_let \markdownRendererDocumentEnd \_relax + +%% Non-Breaking Space Renderer +\_def \markdownRendererNbsp {~} + +%% Note Renderer +%%% TODO + +%% Ordered List Renderers +\_def \markdownRendererOlBegin {\_begitems \_style n \_itemskipamount=\_olistskipamount} +\_def \markdownRendererOlBeginTight {\_begitems \_style n} +\_def \markdownRendererFancyOlBegin #1#2{\markdownRendererOlBegin} +\_def \markdownRendererFancyOlBeginTight #1#2{\markdownRendererOlBeginTight} +\_def \markdownRendererOlItem {\_startitem} +\_def \markdownRendererOlItemEnd {\_par} +\_def \markdownRendererOlItemWithNumber #1{\_itemnum=#1 \_advance\_itemnum by -1 \_startitem} +\_let \markdownRendererFancyOlItem \markdownRendererOlItem +\_let \markdownRendererFancyOlItemEnd \markdownRendererOlItemEnd +\_let \markdownRendererFancyOlItemWithNumber \markdownRendererOlItemWithNumber +\_def \markdownRendererOlEnd {\_enditems} +\_def \markdownRendererOlEndTight {\_enditems} +\_let \markdownRendererFancyOlEndTight \markdownRendererOlEndTight +\_let \markdownRendererFancyOlEnd \markdownRendererOlEnd + +%% Raw Content Renderers +%%% TODO + +%% Section Renderers +\_let \markdownRendererSectionBegin \_relax +\_let \markdownRendererSectionEnd \_relax + +%% Replacement Character Renderers +\_def \markdownRendererReplacementCharacter {^^^^fffd} + +%% Special Character Renderers +\_edef \markdownRendererAmpersand #1{\_csstring\&} +\_edef \markdownRendererBackslash #1{\_csstring\\} +\_edef \markdownRendererCircumflex #1{\_csstring\^} +\_edef \markdownRendererDollarSign #1{\_csstring\$} +\_edef \markdownRendererHash #1{\_csstring\#} +\_edef \markdownRendererLeftBrace #1{\_csstring\{} +\_edef \markdownRendererPercentSign #1{\_csstring\%} +\_def \markdownRendererPipe #1{|} +\_edef \markdownRendererRightBrace #1{\_csstring\}} +\_edef \markdownRendererTilde #1{\_csstring\~} +\_def \markdownRendererUnderscore #1{_} + +%% Strike-Through Renderer +\_def \markdownRendererStrikeThrough #1{% + \_setbox0=\_hbox {#1}% + \_leavevmode + \_rlap {\raise.5ex \_hbox to \_wd0 {\_hfil \_hrulefill \_hfil}}% + \_box0 +} + +%% Subscript Renderer +%%% TODO + +%% Superscript Renderer +%%% TODO + +%% Table Renderer +%%% TODO + +%% TeX Math Renderers +%%% TODO + +%% Thematic Break Renderer +\_def \markdownRendererThematicBreak {% + \_vskip 0.5\_baselineskip + \_hrule + \_par + \_vskip 0.5\_baselineskip + \_firstnoindent +} + +%% Tickbox Renderers +%%% TODO + +%% YAML Metadata Renderers +\_let \markdownRendererJekyllDataBegin \_relax +\_let \markdownRendererJekyllDataEnd \_relax +\_def \markdownRendererJekyllDataMappingBegin #1#2{} +\_let \markdownRendererJekyllDataMappingEnd \_relax +\_def \markdownRendererJekyllDataSequenceBegin #1#2{} +\_let \markdownRendererJekyllDataSequenceEnd \_relax +\_def \markdownRendererJekyllDataBoolean #1#2{} +\_def \markdownRendererJekyllDataNumber #1#2{} +\_def \markdownRendererJekyllDataString #1#2{} +\_def \markdownRendererJekyllDataEmpty #1{} + +% Load the Markdown module and set TeX macros for the Markdown module +\_directlua{ + kpse = require("kpse") + kpse.set_program_name("luatex") + markdown = require("markdown") +} + +\_eoldef \markdownBegin #1{% #1 includes the end of the current line, parameters can be here + \_def\_markdownParams{#1}% + \_bgroup \_setverb \_savemathsb \_endlinechar=`\^^J + \_markdownBeginA +} + +\_ea\_def \_ea\_markdownBeginA \_ea#\_ea1\_csstring\\markdownEnd#2^^J{% + \_restoremathsb \_egroup + \_bgroup + \_catcode`\%=12\_relax + \_catcode`\#=12\_relax + \_directlua { + % Prepare a table of options. + local defaultOptions = {\markdownOptions} + local currentOptions = {\_markdownParams} + local options = {} + for k,v in pairs(defaultOptions) do options[k] = v end + for k,v in pairs(currentOptions) do options[k] = v end + % Ensure that the cache directory exists. + if options.cacheDir then + local lfs = require("lfs") + if not lfs.isdir(options.cacheDir) then + assert(lfs.mkdir(options.cacheDir)) + end + end + % Convert Markdown to TeX and print it. + local convert = markdown.new(options) + local input = "\_luaescapestring{#1}" + local output = convert(input) + tex.print(output) + }% + \_egroup +} + +% Set the document metadata using a YAML metadata block +\markdownBegin hybrid=true,jekyllData=true +--- +title: An Example *Markdown* Document +author: Vít Starý Novotný +date: \today +--- + +# This is an H1 + +## This is an H2 + +### This is an H3 + +#### This is an H4 + +##### This is an H5 + +###### This is an H6 + +This is a text paragraph containing an ellipsis ... and followed by a +thematic break. + +*** + +This is inline `code`. This is a [link](http://google.cz "Google"). +This is an *emphasized* span of text. +This is a __strongly emphasized__ span of text. + + ![example image](example-image.png "An example image from Martin Scharrer's mwe package") + +This is a fenced code block: + +``` tex +\fontfam[LMfonts] +Hello World! \bye +``` + +This is a bullet list: + +* The first item of a bullet list, + +* the second item of a bullet list, + +* the third item of a bullet list. + +This is a compact bullet list: + +* The first item of a bullet list, +* the second item of a bullet list, +* the third item of a bullet list. + +This is an ordered list: + +5. The first item of an ordered list, + +6. the second item of an ordered list, + +7. the third item of an ordered list. + +This is an ordered list using hash enumerators: + +#. The first item of an ordered list, + +#. the second item of an ordered list, + +#. the third item of an ordered list. + +This is a compact ordered list: + +5. The first item of an ordered list, +6. the second item of an ordered list, +7. the third item of an ordered list. + +This is a compact ordered list using hash enumerators: + +#. The first item of an ordered list, +#. the second item of an ordered list, +#. the third item of an ordered list. + +This is a definition list: + +Term 1 + +: Definition 1 with some ~~removed text~~ + +Term 2 + +: Definition 2 + + Some code, part of Definition 2 + + Third paragraph of Definition 2. + +: Definition 3 + +This is a compact definition list: + +Term 1 +: Definition 1 +Term 2 +: Definition 2 +: Definition 3 + +\markdownEnd + +\bye diff --git a/macros/generic/markdown/libraries/markdown-tinyyaml.lua b/macros/generic/markdown/libraries/markdown-tinyyaml.lua index 074ad79446..36cef293ed 100644 --- a/macros/generic/markdown/libraries/markdown-tinyyaml.lua +++ b/macros/generic/markdown/libraries/markdown-tinyyaml.lua @@ -633,8 +633,10 @@ function Parser:parseseq(line, lines, indent) error("did not find expected alphabetic or numeric character") elseif rest then -- Array entry with a value + local nextline = lines[1] + local indent2 = countindent(nextline) tremove(lines, 1) - tinsert(seq, self:parsescalar(rest, lines)) + tinsert(seq, self:parsescalar(rest, lines, indent2)) end end return seq diff --git a/macros/generic/markdown/markdown.dtx b/macros/generic/markdown/markdown.dtx index 3edb022e15..26b5db62f1 100644 --- a/macros/generic/markdown/markdown.dtx +++ b/macros/generic/markdown/markdown.dtx @@ -104,13 +104,7 @@ \newunicodechar{☒}{\markdownRendererTickedBox} \newunicodechar{⌛}{\markdownRendererHalfTickedBox} \newunicodechar{☐}{\markdownRendererUntickedBox} -\usepackage{emoji} -\makeatletter -\@ifpackagelater{emoji}{2020/03/16}{ - \newunicodechar{😉}{\emoji{winking-face}} -}{ - \newunicodechar{😉}{;-)} -} +\newunicodechar{😉}{;-)} \makeatother % Set up the catcodes. @@ -122,7 +116,7 @@ --- title: A Markdown Interpreter for \TeX url: https://github.com/witiko/markdown -authors: [Vít Novotný] +authors: [Vít Starý Novotný] email: witiko@mail.muni.cz revision: \markdownVersion date: \markdownLastModified @@ -763,23 +757,17 @@ abbr { author = {Knuth, Donald Ervin}, year = {1986}, title = {\TeX: The Program}, - isbn = {0-201-13437-7}, + isbn = {978-0-201-13437-7}, pagetotal = {xvi, 594}, series = {Computers \& Typesetting}, volume = {B}, location = {Reading, MA}, publisher = {Addison-Wesley}} -@online{novotny21, - author = {Novotný, Vít}, - title = {\Hologo{LaTeX2e} no longer keys packages by pathnames}, - date = {2021-02-20}, - url = {https://github.com/latex3/latex2e/issues/510}, - urldate = {2021-02-21}} @book{eijkhout92, author = {Victor Eijkhout}, title = {\TeX{} by Topic}, subtitle = {A \TeX nician's Reference}, - isbn = {0-201-56882-0}, + isbn = {978-0-201-56882-0}, pagetotal = {307}, date = {1992-02-01}, location = {Wokingham, England}, @@ -792,50 +780,23 @@ abbr { pages = {196-205}, doi = {10.1109/ICPC.2010.41}} % -%<*latex-themes-witiko-markdown-techdoc> -\ProvidesPackage{markdownthemewitiko_markdown_techdoc}[2022/02/23] +%<@@=markdown> +%<*themes-witiko-markdown-techdoc> +\ProvidesPackage{markdownthemewitiko_markdown_techdoc}[2022/12/13] \RequirePackage{etoolbox} \markdownSetup{ renderers = { - head*Four = {% - \paragraph{#1}\leavevmode - \def\markdownRendererInterblockSeparator{% - \let\markdownRendererInterblockSeparator\par - }% - \noindent - }, + head*Four = {\paragraph{#1}\leavevmode}, }, rendererPrototypes = { codeSpan = {\inline{#1}}, - jek*llDataEnd = {% + jekyllData(End) = {% \AfterEndPreamble{% \printtitlepage \tableofcontents {\def\addcontentsline##1##2##3{}\listoffigures}% }% }, - headerAttributeContextBegin = { - \markdownSetup{ - rendererPrototypes = { - attributeIdentifier = {% - \begingroup - \def\next####1{% - \def####1########1{% - \endgroup - ####1{########1}% - \label{sec:##1}% - }% - }% - \next\markdownRendererHeadingOne - \next\markdownRendererHeadingTwo - \next\markdownRendererHeadingThree - \next\markdownRendererHeadingFour - \next\markdownRendererHeadingFive - \next\markdownRendererHeadingSix - }, - }, - }% - }, }, jekyllDataRenderers = { /authors/* = {% @@ -853,6 +814,17 @@ abbr { url = {\gdef\ltd@title@url{#1}}, } } +\ExplSyntaxOn +\markdownSetup{ + rendererPrototypes = { + headerAttributeContextEnd = { + \seq_map_inline:Nn + \l_@@_header_identifiers_seq + { \label { sec:##1 } } + }, + }, +} +\ExplSyntaxOff \renewcommand\markdownLaTeXRendererDirectOrIndirectLink[4]{% #1\footnote{See \url{#3}.}} \RequirePackage{varioref} @@ -884,12 +856,12 @@ abbr { dlEnd = {\end{optionlist}}, } } -% +% %<*manual> --- title: Markdown Package User Manual -author: Vít Novotný +author: Vít Starý Novotný date: \markdownVersion{} \markdownLastModified{} --- @@ -901,7 +873,7 @@ date: \markdownVersion{} \markdownLastModified{} Introduction ============ -The [Markdown package][pkg] converts [markdown][] markup to \TeX{} commands. The +The [Markdown package][pkg] converts [CommonMark][] markup to \TeX{} commands. The functionality is provided both as a Lua module and as plain \TeX{}, \LaTeX{}, and \Hologo{ConTeXt} macro packages that can be used to directly typeset \TeX{} documents containing markdown markup. Unlike other convertors, the Markdown package @@ -909,10 +881,10 @@ does not require any external programs, and makes it easy to redefine how each and every markdown element is rendered. Creative abuse of the markdown syntax is encouraged. 😉 - [markdown]: https://daringfireball.net/projects/markdown/basics - (Daring Fireball: Markdown Basics) - [pkg]: https://ctan.org/pkg/markdown - (CTAN: Package markdown) + [commonmark]: https://commonmark.org/ + (CommonMark: A strongly defined, highly compatible specification of Markdown) + [pkg]: https://ctan.org/pkg/markdown + (CTAN: Package markdown) % This document is a technical documentation for the \pkg{Markdown} package. It % consists of three sections. This section introduces the package and outlines @@ -942,9 +914,9 @@ documentation][techdoc]. local metadata = { version = "(((VERSION)))", comment = "A module for the conversion from markdown to plain TeX", - author = "John MacFarlane, Hans Hagen, Vít Novotný", + author = "John MacFarlane, Hans Hagen, Vít Starý Novotný", copyright = {"2009-2016 John MacFarlane, Hans Hagen", - "2016-2023 Vít Novotný"}, + "2016-2023 Vít Starý Novotný"}, license = "LPPL 1.3c" } @@ -994,15 +966,19 @@ make base `````` This should produce the following files: -* `markdown.lua`, the Lua module, -* `libraries/markdown-tinyyaml.lua`, an external library for reading \acro{yaml}, -* `markdown-cli.lua`, the Lua command-line interface, -* `markdown.tex`, the plain \TeX{} macro package, -* `markdown.sty`, the \LaTeX{} package, -* `markdownthemewitiko_dot.sty`, the `witiko/dot` \LaTeX{} theme, -* `markdownthemewitiko_graphicx_http.sty`, the `witiko/graphicx/http` \LaTeX{} theme, -* `markdownthemewitiko_tilde.sty`, the `witiko/tilde` \LaTeX{} theme, and -* `t-markdown.tex`, the \Hologo{ConTeXt} module. +* `markdown.lua`: The Lua module +* `libraries/markdown-tinyyaml.lua`: An external library for reading \acro{yaml} +* `markdown-cli.lua`: The Lua command-line interface +* `markdown.tex`: The plain \TeX{} macro package +* `markdown.sty`: The \LaTeX{} package +* `markdownthemewitiko_dot.sty`: The `witiko/dot` \LaTeX{} theme +* `markdownthemewitiko_graphicx_http.sty`: The `witiko/graphicx/http` \LaTeX{} theme +* `markdownthemewitiko_tilde.tex`: The `witiko/tilde` theme +* `markdownthemewitiko_markdown_defaults.tex`, + `markdownthemewitiko_markdown_defaults.sty`, and + `t-markdownthemewitiko_markdown_defaults.tex`: The `witiko/markdown/defaults` + theme +* `t-markdown.tex`: The \Hologo{ConTeXt} module ### Local Installation @@ -1014,11 +990,14 @@ placed: * `⟨TEXMF⟩/tex/luatex/markdown/markdown-tinyyaml.lua` * `⟨TEXMF⟩/scripts/markdown/markdown-cli.lua` * `⟨TEXMF⟩/tex/generic/markdown/markdown.tex` +* `⟨TEXMF⟩/tex/generic/markdown/markdownthemewitiko_tilde.tex` +* `⟨TEXMF⟩/tex/generic/markdown/markdownthemewitiko_markdown_defaults.tex` * `⟨TEXMF⟩/tex/latex/markdown/markdown.sty` * `⟨TEXMF⟩/tex/latex/markdown/markdownthemewitiko_dot.sty` * `⟨TEXMF⟩/tex/latex/markdown/markdownthemewitiko_graphicx_http.sty` -* `⟨TEXMF⟩/tex/latex/markdown/markdownthemewitiko_tilde.sty` +* `⟨TEXMF⟩/tex/latex/markdown/markdownthemewitiko_markdown_defaults.sty` * `⟨TEXMF⟩/tex/context/third/markdown/t-markdown.tex` +* `⟨TEXMF⟩/tex/context/third/markdown/t-markdownthemewitiko_markdown_defaults.tex` where `⟨TEXMF⟩` corresponds to a root of your \TeX{} distribution, such as `/usr/share/texmf` and `~/texmf` on UN\*X systems or @@ -1031,10 +1010,20 @@ Alternatively, you can also store the above files in the same folder as your \TeX{} document and distribute them together. This way your document can be portably typeset on legacy \TeX{} distributions. -Since Markdown version 2.10.0, the file `markdown.tex` must be placed in -a directory named `markdown` due to [issue #74][issue-74]. - - [issue-74]: https://github.com/witiko/markdown/issues/74 (Does not compile if user names own document markdown.tex) +This is where the individual files should be placed: + +* `./markdown.lua` +* `./markdown-tinyyaml.lua` +* `./markdown-cli.lua` +* `./markdown/markdown.tex` +* `./markdown.sty` +* `./t-markdown.tex` +* `./markdownthemewitiko_dot.sty` +* `./markdownthemewitiko_graphicx_http.sty` +* `./markdownthemewitiko_tilde.tex` +* `./markdownthemewitiko_markdown_defaults.tex` +* `./markdownthemewitiko_markdown_defaults.sty` +* `./t-markdownthemewitiko_markdown_defaults.tex` % %<*lua> @@ -1077,23 +1066,7 @@ local lpeg = require("lpeg") % % \end{markdown} % \begin{macrocode} -local unicode -(function() - local ran_ok - ran_ok, unicode = pcall(require, "unicode") -% \end{macrocode} -% \begin{markdown} -% -% If the Selene Unicode library is unavailable (could be because we are using -% LuaMeta\TeX) and we are using Lua${}\geq{}$5.3, we will use the built-in -% support for Unicode. -% -% \end{markdown} -% \begin{macrocode} - if not ran_ok then - unicode = {utf8 = {char=utf8.char}} - end -end)() +local unicode = require("unicode") % \end{macrocode} % \par % \begin{markdown} @@ -1133,22 +1106,10 @@ local md5 = require("md5"); % \begin{macrocode} local should_initialize = package.loaded.kpse == nil or tex.initialize ~= nil - local ran_ok - ran_ok, kpse = pcall(require, "kpse") - if ran_ok and should_initialize then + kpse = require("kpse") + if should_initialize then kpse.set_program_name("luatex") end -% \end{macrocode} -% \begin{markdown} -% -% If the \pkg{Kpathsea} library is unavailable, we will look up files only -% in the current working directory. -% -% \end{markdown} -% \begin{macrocode} - if not ran_ok then - kpse = {lookup = function(f, _) return f end} - end end)() % \end{macrocode} % \par @@ -1164,35 +1125,7 @@ end)() % % \end{markdown} % \begin{macrocode} -local uni_case -(function() - local ran_ok - ran_ok, uni_case = pcall(require, "lua-uni-case") -% \end{macrocode} -% \begin{markdown} -% -% If the lua-uni-algos library is unavailable but the Selene Unicode library -% is available, we will use its Unicode lower-casing support instead of -% the more proper case-folding. -% -% \end{markdown} -% \begin{macrocode} - if not ran_ok then - if unicode.utf8.lower then - uni_case = {casefold = unicode.utf8.lower} - else -% \end{macrocode} -% \begin{markdown} -% -% If the Selene Unicode library is also unavailable, we will defer to using -% ASCII lower-casing. -% -% \end{markdown} -% \begin{macrocode} - uni_case = {casefold = string.lower} - end - end -end)() +local uni_algos = require("lua-uni-algos") % \end{macrocode} % \par % \begin{markdown} @@ -1229,10 +1162,16 @@ end)() % % \end{markdown} % \begin{macrocode} -%<@@=markdown> +% +%<*context> +\unprotect +% +%<*context,tex> \ifx\ExplSyntaxOn\undefined - \input expl3-generic\relax + \input expl3-generic \fi +% +%<*tex> % \end{macrocode} % \begin{markdown} % @@ -1264,11 +1203,10 @@ end)() % \TeX{} part of the package will require that either the Lua\TeX{} % `\directlua` primitive or the shell access file stream 18 is available in % your \TeX{} engine. If only the shell access file stream is available in your -% \TeX{} engine (as is the case with \hologo{pdfTeX} and \Hologo{XeTeX}) or if -% you enforce the use of shell using the \mref{markdownMode} macro, then unless -% your \TeX{} engine is globally configured to enable shell access, you will -% need to provide the `-shell-escape` parameter to your engine when typesetting -% a document. +% \TeX{} engine (as is the case with \hologo{pdfTeX} and \Hologo{XeTeX}), then +% unless your \TeX{} engine is globally configured to enable shell access, you +% will need to provide the `-shell-escape` parameter to your engine when +% typesetting a document. % % \end{markdown} % \iffalse @@ -1284,13 +1222,13 @@ end)() % loaded, % \end{markdown} % \iffalse -%<*latex-themes-witiko-dot,latex-themes-witiko-graphicx-http,latex-themes-witiko-tilde> +%<*themes-witiko-dot,latex-themes-witiko-graphicx-http> % \fi % \begin{macrocode} \NeedsTeXFormat{LaTeX2e}% % \end{macrocode} % \iffalse -% +% % \fi % \begin{markdown} % a \TeX{} engine that extends \Hologo{eTeX}, and all the plain \TeX{} @@ -1299,9 +1237,9 @@ end)() % The following packages are soft prerequisites. They are only used to provide % default token renderer prototypes (see sections % <#sec:texrendererprototypes> and -% <#sec:latex-default-renderer-prototypes>) or \LaTeX{} themes (see Section -% <#sec:latexthemes>) and will not be loaded if the `plain` package option -% has been enabled (see Section <#sec:latexplain>): +% <#sec:latex-token-renderer-prototypes>) or \LaTeX{} themes (see Section +% <#sec:latexthemes>) and will not be loaded if the option `plain` has been +% enabled (see Section <#sec:plain>): % % \pkg{url} % @@ -1333,7 +1271,7 @@ end)() % \pkg{csvsimple} % %: A package that provides the `\csvautotabular` macro for typesetting -% \acro{csv} files in the default renderer prototypes for iA\,Writer +% \acro{csv} files in the default renderer prototypes for iA\\,Writer % content blocks. % % \pkg{gobble} @@ -1378,7 +1316,7 @@ end)() % \pkg{soulutf8} % %: A package that is used in the default renderer prototype for -% strike-throughs. +% strike-throughs and marked text. % % \pkg{ltxcmds} % @@ -1411,7 +1349,7 @@ end)() % \pkg{m-database} % %: A module that provides the default token renderer prototype for -% iA\,Writer content blocks with the \acro{csv} filename extension (see +% iA\\,Writer content blocks with the \acro{csv} filename extension (see % Section <#sec:texrendererprototypes>). % % Feedback @@ -1498,7 +1436,11 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown +\begingroup +\catcode`\%=12 +\catcode`\#=12 \input hello +\endgroup \bye ``````` @@ -1508,8 +1450,8 @@ Using a text editor, create a text document named `hello.lua` with the following content: ``` lua #!/usr/bin/env texlua -local ran_ok, kpse = pcall(require, "kpse") -if ran_ok then kpse.set_program_name("luatex") end +local kpse = require("kpse") +kpse.set_program_name("luatex") local markdown = require("markdown") local convert = markdown.new() print(convert("Hello *world*!")) @@ -1569,10 +1511,35 @@ Next, invoke LuaTeX from the terminal: luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the text -“Hello *world*!” Invoking pdfTeX should have the same effect: +“Hello *world*!” + +Instead of LuaTeX, you may also use pdfTeX: ``` sh pdftex --shell-escape document.tex ``````` +This should also produce a PDF document named `document.pdf` with the same content. + +*** + +Instead of writing your markdown document between `\markdownBegin` and +`\markdownEnd`, you can also include markdown documents using the +`\markdownInput` macro, similarly to how you might use the `\input` TeX +primitive to include \TeX{} documents. + +Using a text editor, create a text document named `hello.md` with the +following content: +``` md +Hello *world*! +`````` +Create also a text document named `document.tex` with the following content: +``` tex +\input markdown +\markdownInput{hello.md} +\bye +``````` +Next, invoke LuaTeX or pdfTeX from the terminal like in the previous example. +A PDF document named `document.pdf` should be produced and contain the text +“Hello *world*!” ### Using \LaTeX{} @@ -1592,10 +1559,39 @@ Next, invoke LuaTeX from the terminal: lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the text “Hello -*world*!” Invoking pdfTeX should have the same effect: +*world*!” + +Instead of LuaTeX, you may also use pdfTeX: ``` sh pdflatex --shell-escape document.tex `````` +This should also produce a PDF document named `document.pdf` with the same content. + +*** + +Instead of writing your markdown document between `\begin{markdown}` and +`\end{markdown}`, you can also include markdown documents using the +`\markdownInput` macro, similarly to how you might use the `\input` TeX +primitive to include \LaTeX{} documents. + +Using a text editor, create a text document named `hello.md` with the +following content: +``` md +Hello *world*! +`````` +Create also a text document named `document.tex` with the following content: +``` tex +\documentclass{article} +\usepackage{markdown} +\begin{document} +\begin{markdown} +\markdownInput{hello.md} +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX or pdfTeX from the terminal like in the previous example. +A PDF document named `document.pdf` should be produced and contain the text +“Hello *world*!” *** @@ -1629,25 +1625,48 @@ Hello *world*! ``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the text “Hello *world*!” *** +Instead of writing your markdown document between `\startmarkdown` and +`\stopmarkdown`, you can also include markdown documents using the +`\inputmarkdown` macro, similarly to how you might use the `\input` TeX +primitive to include \Hologo{ConTeXt} documents. + +Using a text editor, create a text document named `hello.md` with the +following content: +``` md +Hello *world*! +`````` +Create also a text document named `document.tex` with the following content: +``` tex +\usemodule[t][markdown] +\starttext +\inputmarkdown{hello.md} +\stoptext +``````` +Next, invoke LuaTeX from the terminal like in the previous example. +A PDF document named `document.pdf` should be produced and contain the text +“Hello *world*!” + +*** + As the next step, try typesetting the example documents distributed along with the Markdown package: ``` sh git clone https://github.com/witiko/markdown cd markdown/examples -context context.tex +context --luatex context.tex `````` A PDF document named `context.pdf` should be produced. Open the text documents `context.tex` and `example.md` in a text editor to see how the example documents are structured. Try changing the documents and typesetting them as follows: ``` sh -context context.tex +context --luatex context.tex `````` to see the effect of your changes. @@ -1674,6 +1693,7 @@ Each part will be shown by example, leaving the implementation details to the % Lua Interface {#luainterface} %--------------- % +% \end{markdown} % \iffalse % %<*manual-interfaces> @@ -1700,6 +1720,7 @@ module and a command-line interface (CLI). % %<*lua> % \fi +% \begin{markdown} % % The Lua interface provides the conversion from \acro{utf}-\oldstylenums8 % encoded markdown to plain \TeX{}. This interface is used by the plain \TeX{} @@ -1755,8 +1776,11 @@ local walkable_syntax = { "ThematicBreak", "BulletList", "OrderedList", - "Heading", "DisplayHtml", + "Heading", + }, + BlockOrParagraph = { + "Block", "Paragraph", "Plain", }, @@ -1764,11 +1788,8 @@ local walkable_syntax = { "Str", "Space", "Endline", - "UlOrStarLine", - "Strong", - "Emph", - "Link", - "Image", + "EndlineBreak", + "LinkAndEmph", "Code", "AutoLinkUrl", "AutoLinkEmail", @@ -1794,9 +1815,9 @@ local walkable_syntax = { % not be interpreted by the Markdown package; you can treat it as a comment. % % For example. if we'd like to insert `pattern` into the grammar between the -% `Inline -> Emph` and `Inline -> Link` rules, we would call -% \luamref{reader->insert_pattern} with `"Inline after Emph"` (or `"Inline -% before Link"`) and `pattern` as the arguments. +% `Inline -> LinkAndEmph` and `Inline -> Code` rules, we would call +% \luamref{reader->insert_pattern} with `"Inline after LinkAndEmph"` (or `"Inline +% before Code"`) and `pattern` as the arguments. % % The \luamref{reader->add_special_character} method adds a new character with % special meaning to the grammar of markdown. The method receives the character @@ -1824,26 +1845,30 @@ following content: ``` tex \input markdown \input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 \input example +\endgroup \bye ``````` Using a text editor, create a text document named `example.lua` with the following content: ``` lua #!/usr/bin/env texlua -local ran_ok, kpse = pcall(require, "kpse") -if ran_ok then kpse.set_program_name("luatex") end +local kpse = require("kpse") +kpse.set_program_name("luatex") local markdown = require("markdown") -local input, convert_safe, convert_unsafe, paragraph +local input, convert_nomath, convert_math, paragraph input = [[$\sqrt{-1}$ *equals* $i$.]] -convert_safe = markdown.new() -convert_unsafe = markdown.new({hybrid = true}) +convert_nomath = markdown.new() +convert_math = markdown.new({texMathDollars = true}) paragraph = [[\par]] print( - convert_safe(input) .. paragraph .. - convert_unsafe(input) + convert_nomath(input) .. paragraph .. + convert_math(input) ) ``````` Next, invoke LuaTeX from the terminal: @@ -1876,16 +1901,16 @@ named `document.tex` with the following content: \input lmfonts \directlua{ local markdown = require("markdown") - local input, convert_safe, convert_unsafe, paragraph + local input, convert_nomath, convert_math, paragraph input = [[$\string\sqrt{-1}$ *equals* $i$.]] - convert_safe = markdown.new() - convert_unsafe = markdown.new({hybrid = true}) + convert_nomath = markdown.new() + convert_math = markdown.new({texMathDollars = true}) paragraph = [[\par]] tex.sprint( - convert_safe(input) .. paragraph .. - convert_unsafe(input) + convert_nomath(input) .. paragraph .. + convert_math(input) ) } \bye @@ -1921,11 +1946,12 @@ following content: ``` tex \input markdown \input lmfonts -\input safe - \begingroup \catcode`\%=12 -\input unsafe +\catcode`\#=12 +\input nomath +\par +\input math \endgroup \bye ``````` @@ -1936,8 +1962,8 @@ $\sqrt{-1}$ *equals* $i$. `````` Next, invoke LuaTeX from the terminal: ``` sh -texlua ⟨CLI pathname⟩ -- example.md safe.tex -texlua ⟨CLI pathname⟩ hybrid=true -- example.md unsafe.tex +texlua ⟨CLI pathname⟩ -- example.md nomath.tex +texlua ⟨CLI pathname⟩ tex_math_dollars=true -- example.md math.tex luatex document.tex `````` where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, @@ -1957,8 +1983,8 @@ following text: Invoking pdfTeX should have the same effect: ``` sh -texlua ⟨CLI pathname⟩ -- example.md safe.tex -texlua ⟨CLI pathname⟩ hybrid=true -- example.md unsafe.tex +texlua ⟨CLI pathname⟩ -- example.md nomath.tex +texlua ⟨CLI pathname⟩ tex_math_dollars=true -- example.md math.tex pdftex document.tex `````` @@ -2331,74 +2357,55 @@ interfaces and all the way up to the \LaTeX{} and \Hologo{ConTeXt} interfaces. % \fi % \begin{markdown} % -%### File and Directory Names +%### General Behavior % % \end{markdown} % \par % \iffalse -#### Option `cacheDir` +#### Option `eagerCache` -`cacheDir` (default value: `"."`) +`eagerCache` (default value: `false`) % \fi % \begin{markdown} % -% \Valitem[.]{cacheDir}{path} +% \Optitem[false]{eagerCache}{\opt{true}, \opt{false}} % -: A path to the directory containing auxiliary cache files. If the last - segment of the path does not exist, it will be created by the Lua - command-line and plain \TeX{} implementations. The Lua implementation - expects that the entire path already exists. +: true - When iteratively writing and typesetting a markdown document, the cache - files are going to accumulate over time. You are advised to clean the - cache directory every now and then, or to set it to a temporary filesystem - (such as `/tmp` on UN*X systems), which gets periodically emptied. + : Converted markdown documents will be cached in \Opt{cacheDir}. This can be + useful for post-processing the converted documents and for recovering + historical versions of the documents from the cache. However, it also + produces a large number of auxiliary files on the disk and obscures the + output of the Lua command-line interface when it is used for plumbing. -% \end{markdown} -% \iffalse + This behavior will always be used if the \Opt{finalizeCache} option is + enabled. -##### Lua Module Example {.unnumbered} +: false -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\directlua{ - local markdown = require("markdown") - local convert = markdown.new({cacheDir = "cache"}) - local input = "Hello *world*!" - tex.sprint(convert(input)) } -\bye -``````` -Create an empty directory named `cache` next to our text document. Then, invoke -LuaTeX from the terminal: -``` sh -luatex document.tex -``````` -A PDF document named `document.pdf` should be produced and contain the text -“Hello *world*!” Several cache files of the Markdown package will also be -produced in the `cache` directory as we requested using the `cacheDir` option. + : Converted markdown documents will not be cached. This decreases the number + of auxiliary files that we produce and makes it easier to use the Lua + command-line interface for plumbing. + + This behavior will only be used when the \Opt{finalizeCache} option is + disabled. + +% \end{markdown} +% \iffalse ##### Lua CLI Example {.unnumbered} -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\input hello -\bye -``````` Using a text editor, create a text document named `hello.md` with the following content: ``` md Hello *world*! `````` -Next, invoke LuaTeX from the terminal: +Next, invoke LuaTeX from the terminal with the \Opt{eagerCache} option +disabled: ``` sh -texlua ⟨CLI pathname⟩ cacheDir=cache -- hello.md hello.tex -luatex document.tex +texlua ⟨CLI pathname⟩ eagerCache=false -- hello.md hello.tex ``````` where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or @@ -2406,50 +2413,283 @@ such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or systems. Use the command `kpsewhich -a markdown-cli.lua` to locate the Lua CLI script file using [Kpathsea][]. -A PDF document named `document.pdf` should be produced and contain the text -“Hello *world*!” A directory named `cache` containing several cache files of -the Markdown package will also be produced as we requested using the `cacheDir` -option. +A \TeX{} document named `hello.tex` should be produced and contain the +following code: +``` tex +Hello \markdownRendererEmphasis{world}!\relax +``` -##### Plain \TeX{} Example {.unnumbered} +*** + +Invoke LuaTeX from the terminal again, this time with the \Opt{eagerCache} +option enabled: -Using a text editor, create a text document named `document.tex` with the -following content: ``` tex -\input markdown -\def\markdownOptionCacheDir{cache} -\markdownBegin -Hello *world*! -\markdownEnd -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the text “Hello -*world*!” A directory named `cache` containing several cache files of the -Markdown package will also be produced as we requested using the `cacheDir` -option. +texlua ⟨CLI pathname⟩ eagerCache=true -- hello.md hello.tex +``` -##### \LaTeX{} Example {.unnumbered} +A \TeX{} document named `hello.tex` should be produced and contain the +following code: -Using a text editor, create a text document named `document.tex` with the -following content: ``` tex -\documentclass{article} -\usepackage[cacheDir=cache]{markdown} -\begin{document} -\begin{markdown} -Hello *world*! -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the text “Hello +\input ./⟨hash⟩.md.tex\relax +``` + +Additionally, a \TeX{} document named `⟨hash⟩.md.tex` should be produced and +contain the following code: + +``` tex +Hello \markdownRendererEmphasis{world}!\relax +``` + +% +%<*tex> +% \fi +% \begin{macrocode} +\@@_add_lua_option:nnn + { eagerCache } + { boolean } + { false } +% \end{macrocode} +% \iffalse +% +%<*lua,lua-cli> +% \fi +% \begin{macrocode} +defaultOptions.eagerCache = false +% \end{macrocode} +% \par +% \iffalse +% +%<*manual-options> + +#### Option `singletonCache` + +`singletonCache` (default value: `true`) + +% \fi +% \begin{markdown} +% +% \Optitem[true]{singletonCache}{\opt{true}, \opt{false}} +% +: true + + : Conversion functions produced by the function \luamref{new}`(options)` + will be cached in an LRU cache of size 1 keyed by `options`. This is + more time- and space-efficient than always producing a new conversion + function but may expose bugs related to the idempotence of conversion + functions. + + This has been the default behavior since version 3.0.0 of the Markdown + package. + +: false + + : Every call to the function \luamref{new}`(options)` will produce a new + conversion function that will not be cached. This is slower than + caching conversion functions and may expose bugs related to memory + leaks in the creation of conversion functions, see also issue [#226][1]. + + This was the default behavior until version 3.0.0 of the Markdown package. + + [1]: https://github.com/witiko/markdown/pull/226#issuecomment-1599641634 + +% \end{markdown} +% \iffalse + +##### Lua Module Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\directlua{ + local markdown = require("markdown") + local convert1 = markdown.new({}) + local convert2 = markdown.new({singletonCache=false}) + local convert3 = markdown.new({singletonCache=true}) + local newline = [[^^J^^J]] + tex.print(tostring(convert1) .. ", ") + tex.print(tostring(convert2) .. ", ") + tex.print(tostring(convert3)) +} +\endgroup +\bye +``````` +Then, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +``````` +A PDF document named `document.pdf` should be produced and contain the following text: + +> function: 0x1a4a038, function: 0x1a52b18, function: 0x1a4a038 + +As you can see, the caching causes `convert1` and `convert3` to be the same +conversion function. + +% +%<*tex> +% \fi +% \begin{macrocode} +\@@_add_lua_option:nnn + { singletonCache } + { boolean } + { true } +% \end{macrocode} +% \iffalse +% +%<*lua,lua-cli> +% \fi +% \begin{macrocode} +defaultOptions.singletonCache = true +% \end{macrocode} +% \iffalse +% +%<*lua> +% \fi +% \begin{macrocode} +local singletonCache = { + convert = nil, + options = nil, +} +% \end{macrocode} +% \par +% \iffalse +% +%<*manual-options> +% \fi +% \begin{markdown} +% +%### File and Directory Names +% +% \end{markdown} +% \par +% \iffalse + +#### Option `cacheDir` + +`cacheDir` (default value: `"."`) + +% \fi +% \begin{markdown} +% +% \Valitem[.]{cacheDir}{path} +% +: A path to the directory containing auxiliary cache files. If the last + segment of the path does not exist, it will be created by the Lua + command-line and plain \TeX{} implementations. The Lua implementation + expects that the entire path already exists. + + When iteratively writing and typesetting a markdown document, the cache + files are going to accumulate over time. You are advised to clean the + cache directory every now and then, or to set it to a temporary filesystem + (such as `/tmp` on UN*X systems), which gets periodically emptied. + +% \end{markdown} +% \iffalse + +##### Lua Module Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\directlua{ + local markdown = require("markdown") + local convert = markdown.new({cacheDir = "cache"}) + local input = "Hello *world*!" + tex.sprint(convert(input)) } +\endgroup +\bye +``````` +Create an empty directory named `cache` next to our text document. Then, invoke +LuaTeX from the terminal: +``` sh +luatex document.tex +``````` +A PDF document named `document.pdf` should be produced and contain the text +“Hello *world*!” Several cache files of the Markdown package will also be +produced in the `cache` directory as we requested using the `cacheDir` option. + +##### Lua CLI Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\input hello +\endgroup +\bye +``````` +Using a text editor, create a text document named `hello.md` with the +following content: +``` md +Hello *world*! +`````` +Next, invoke LuaTeX from the terminal: +``` sh +texlua ⟨CLI pathname⟩ cacheDir=cache -- hello.md hello.tex +luatex document.tex +``````` +where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, +such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or +`C:\Users\`\meta{Your username}`\texmf\scripts\markdown\markdown-cli.lua` on Windows +systems. Use the command `kpsewhich -a markdown-cli.lua` to locate the Lua CLI +script file using [Kpathsea][]. + +A PDF document named `document.pdf` should be produced and contain the text +“Hello *world*!” A directory named `cache` containing several cache files of +the Markdown package will also be produced as we requested using the `cacheDir` +option. + +##### Plain \TeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\def\markdownOptionCacheDir{cache} +\markdownBegin +Hello *world*! +\markdownEnd +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the text “Hello +*world*!” A directory named `cache` containing several cache files of the +Markdown package will also be produced as we requested using the `cacheDir` +option. + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[cacheDir=cache]{markdown} +\begin{document} +\begin{markdown} +Hello *world*! +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the text “Hello *world*!” A directory named `cache` containing several cache files of the Markdown package will also be produced as we requested using the `cacheDir` option. @@ -2469,7 +2709,7 @@ Hello *world*! ``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the text “Hello *world*!” A directory named `cache` containing several cache files of the @@ -2507,7 +2747,7 @@ defaultOptions.cacheDir = "." % \Valitem[markdown-languages.json]{contentBlocksLanguageMap}{filename} % : The filename of the \acro{JSON} file that maps filename extensions to - programming language names in the iA\,Writer content blocks when the + programming language names in the iA\\,Writer content blocks when the \Opt{contentBlocks} option is enabled. % See Section <#sec:texcontentblockrenderers> for more information. @@ -2621,7 +2861,7 @@ Create also a text document named `document.tex` with the following content: ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the following text: @@ -2739,11 +2979,15 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown +\begingroup +\catcode`\%=12 +\catcode`\#=12 \directlua{ local markdown = require("markdown") local convert = markdown.new({finalizeCache = true, frozenCacheFileName = "cache.tex"}) local input = "Hello *world*!" tex.sprint(convert(input)) } +\endgroup \bye ``````` Then, invoke LuaTeX from the terminal: @@ -2761,7 +3005,11 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown +\begingroup +\catcode`\%=12 +\catcode`\#=12 \input hello +\endgroup \bye ``````` Using a text editor, create a text document named `hello.md` with the @@ -2891,7 +3139,7 @@ Hello *world*! ``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the text “Hello *world*!” A frozen cache will also be produced in the `cache.tex` @@ -2913,9 +3161,9 @@ Hi *world*! \stopmarkdown \stoptext ``````` -Last, invoke pdfTeX without shell access from the terminal: +Last, invoke LuaTeX from the terminal: ``` sh -context frozen-document.tex +context --luatex frozen-document.tex `````` A PDF document named `frozen-document.pdf` should be produced and contain the text “Hello *world*!” Since we used the contents of the frozen cache using @@ -2952,39 +3200,91 @@ defaultOptions.frozenCacheFileName = "frozenCache.tex" % \par % \iffalse -#### Option `blankBeforeBlockquote` +#### Option `autoIdentifiers` -`blankBeforeBlockquote` (default value: `false`) +`autoIdentifiers` (default value: `false`) % \fi % \begin{markdown} -% \Optitem[false]{blankBeforeBlockquote}{\opt{true}, \opt{false}} +% \Optitem[false]{autoIdentifiers}{\opt{true}, \opt{false}} % : true - : Require a blank line between a paragraph and the following blockquote. + : Enable the Pandoc [auto identifiers syntax extension][pandoc-auto-identifiers]: - false + ``` md + The following heading received the identifier `sesame-street`: - : Do not require a blank line between a paragraph and the following - blockquote. + # 123 Sesame Street + `````` -% \end{markdown} -% \iffalse + false -##### Lua Module Example {.unnumbered} + : Disable the Pandoc auto identifiers syntax extension. -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\input lmfonts -\directlua{ - local markdown = require("markdown") - local newline = [[^^J^^J]] - local convert, input +See also the option \Opt{gfmAutoIdentifiers}. - convert = markdown.new() + [pandoc-auto-identifiers]: https://pandoc.org/MANUAL.html#extension-auto_identifiers + +% \end{markdown} +% \iffalse +% +%<*tex> +% \fi +% \begin{macrocode} +\@@_add_lua_option:nnn + { autoIdentifiers } + { boolean } + { false } +% \end{macrocode} +% \iffalse +% +%<*lua,lua-cli> +% \fi +% \begin{macrocode} +defaultOptions.autoIdentifiers = false +% \end{macrocode} +% \par +% \iffalse +% +%<*manual-options> + +#### Option `blankBeforeBlockquote` + +`blankBeforeBlockquote` (default value: `false`) + +% \fi +% \begin{markdown} +% \Optitem[false]{blankBeforeBlockquote}{\opt{true}, \opt{false}} +% +: true + + : Require a blank line between a paragraph and the following blockquote. + + false + + : Do not require a blank line between a paragraph and the following + blockquote. + +% \end{markdown} +% \iffalse + +##### Lua Module Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\directlua{ + local markdown = require("markdown") + local newline = [[^^J^^J]] + local convert, input + + convert = markdown.new() input = "A paragraph." .. newline .. "> A quote." .. newline tex.sprint(convert(input)) @@ -2993,6 +3293,7 @@ following content: input = "A paragraph." .. newline .. "> Not a quote." .. newline tex.sprint(convert(input)) } +\endgroup \bye ``````` Then, invoke LuaTeX from the terminal: @@ -3015,8 +3316,12 @@ following content: ``` tex \input markdown \input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 \input optionfalse \input optiontrue +\endgroup \bye ``````` Using a text editor, create a text document named `content.md` with the @@ -3093,10 +3398,10 @@ A paragraph. > A quote. \end{markdown} -\begin{markdown*}{blankBeforeBlockquote} +\begin{markdown}[blankBeforeBlockquote] A paragraph. > Not a quote. -\end{markdown*} +\end{markdown} \end{document} ``````` @@ -3136,7 +3441,7 @@ A paragraph. ``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: @@ -3197,6 +3502,9 @@ following content: ``` tex \input markdown \input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 \directlua{ local markdown = require("markdown") local newline = [[^^J^^J]] @@ -3216,6 +3524,7 @@ following content: "Not a fenced code." .. newline .. "```" .. newline tex.sprint(convert(input)) } +\endgroup \bye ``````` Then, invoke LuaTeX from the terminal: @@ -3240,8 +3549,12 @@ following content: ``` tex \input markdown \input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 \input optionfalse \input optiontrue +\endgroup \bye ``````` Using a text editor, create a text document named `content.md` with the @@ -3331,12 +3644,12 @@ A fenced code. ``` \end{markdown} -\begin{markdown*}{blankBeforeCodeFence} +\begin{markdown}[blankBeforeCodeFence] A paragraph. ``` Not a fenced code. ``` -\end{markdown*} +\end{markdown} \end{document} ```````` @@ -3383,7 +3696,7 @@ Not a fenced code. ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: @@ -3454,13 +3767,13 @@ A fenced div. ::: \end{markdown} -\begin{markdown*}{blankBeforeDivFence} +\begin{markdown}[blankBeforeDivFence] A paragraph. ::: {.identifier} Not a fenced div. ::: -\end{markdown*} +\end{markdown} \end{document} ```````` @@ -3529,6 +3842,9 @@ following content: \input markdown \input lmfonts \def\markdownRendererHeadingOne#1{{\bf #1}\par} +\begingroup +\catcode`\%=12 +\catcode`\#=12 \directlua{ local markdown = require("markdown") local newline = [[^^J^^J]] @@ -3545,6 +3861,7 @@ following content: "Not a heading." .. newline .. "==============" .. newline tex.sprint(convert(input)) } +\endgroup \bye ``````` Then, invoke LuaTeX from the terminal: @@ -3568,8 +3885,12 @@ following content: ``` tex \input markdown \input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 \input optionfalse \input optiontrue +\endgroup \bye ``````` Using a text editor, create a text document named `content.md` with the @@ -3652,11 +3973,11 @@ A heading. ========== \end{markdown} -\begin{markdown*}{blankBeforeHeading} +\begin{markdown}[blankBeforeHeading] A paragraph. Not a heading. ============== -\end{markdown*} +\end{markdown} \end{document} ``````` @@ -3699,7 +4020,7 @@ Not a heading. ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the following text: @@ -3732,118 +4053,23 @@ defaultOptions.blankBeforeHeading = false % %<*manual-options> -#### Option `bracketedSpans` - -`bracketedSpans` (default value: `false`) - -% \fi -% \begin{markdown} -% -% \Optitem[false]{bracketedSpans}{\opt{true}, \opt{false}} -% -: true - - : Enable the Pandoc [bracketed span syntax extension][pandoc-bracketed-spans]: - - ``` md - [This is *some text*]{.class key=val} - `````` - -: false - - : Disable the Pandoc bracketed span syntax extension. - - [pandoc-bracketed-spans]: https://pandoc.org/MANUAL.html#extension-bracketed_spans - -% \end{markdown} -% \iffalse - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -```` tex -\documentclass{article} -\usepackage[bracketedSpans]{markdown} -\usepackage{expl3} -\ExplSyntaxOn -\markdownSetup{ - renderers = { - bracketedSpanAttributeContextBegin = { - \group_begin: - \color_group_begin: - \markdownSetup{ - renderers = { - attributeKeyValue = { - \str_if_eq:nnT - { ##1 } - { color } - { - \color_select:n { ##2 } - } - }, - }, - } - }, - bracketedSpanAttributeContextEnd = { - \color_group_end: - \group_end: - }, - }, -} -\ExplSyntaxOff -\begin{document} -\begin{markdown} -Here is some [colored text]{color=red}. -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> Here is some colored text. - -% -%<*tex> -% \fi -% \begin{macrocode} -\@@_add_lua_option:nnn - { bracketedSpans } - { boolean } - { false } -% \end{macrocode} -% \iffalse -% -%<*lua,lua-cli> -% \fi -% \begin{macrocode} -defaultOptions.bracketedSpans = false -% \end{macrocode} -% \par -% \iffalse -% -%<*manual-options> - -#### Option `breakableBlockquotes` +#### Option `blankBeforeList` -`breakableBlockquotes` (default value: `false`) +`blankBeforeList` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{breakableBlockquotes}{\opt{true}, \opt{false}} +% \Optitem[false]{blankBeforeList}{\opt{true}, \opt{false}} % : true - : A blank line separates block quotes. + : Require a blank line between a paragraph and the following list. false - : Blank lines in the middle of a block quote are ignored. + : Do not require a blank line between a paragraph and the following + list. % \end{markdown} % \iffalse @@ -3855,21 +4081,25 @@ following content: ``` tex \input markdown \input lmfonts -\def\markdownRendererHeadingOne#1{{\bf #1}\par} +\begingroup +\catcode`\%=12 +\catcode`\#=12 \directlua{ local markdown = require("markdown") local newline = [[^^J^^J]] local convert, input convert = markdown.new() - input = "> A single" .. newline .. newline .. - "> block quote." .. newline + input = "A paragraph." .. newline .. + "- a list" .. newline tex.sprint(convert(input)) - convert = markdown.new({breakableBlockquotes = true}) - input = "> A block quote." .. newline .. newline .. - "> Another block quote." .. newline + convert = markdown.new({ + blankBeforeList = true}) + input = "A paragraph." .. newline .. + "- not a list" .. newline tex.sprint(convert(input)) } +\endgroup \bye ``````` Then, invoke LuaTeX from the terminal: @@ -3879,11 +4109,11 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> > A single block quote. +> A paragraph. > -> > A block quote. +> - a list > -> > Another block quote. +> A paragraph. - not a list ##### Lua CLI Example {.unnumbered} @@ -3892,21 +4122,24 @@ following content: ``` tex \input markdown \input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 \input optionfalse \input optiontrue +\endgroup \bye ``````` Using a text editor, create a text document named `content.md` with the following content: -``` md -> A single block quote - -> or two block quotes? -`````` +```` md +A paragraph. +- a list? +``````` Next, invoke LuaTeX from the terminal: ``` sh texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex -texlua ⟨CLI pathname⟩ breakableBlockquotes=true -- content.md optiontrue.tex +texlua ⟨CLI pathname⟩ blankBeforeList=true -- content.md optiontrue.tex luatex document.tex ``````` where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, @@ -3918,34 +4151,32 @@ script file using [Kpathsea][]. A PDF document named `document.pdf` should be produced and contain the following text: -> > A single block quote or two block quotes? +> A paragraph. > -> > A single block quote +> - a list? > -> > or two block quotes? +> A paragraph. - a list? ##### Plain \TeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: -``` tex +```` tex \input markdown \markdownBegin -> A single - -> block quote. +A paragraph. +- a list \markdownEnd -\def\markdownOptionBreakableBlockquotes{true} +\def\markdownOptionBlankBeforeList{true} \markdownBegin -> A block quote. - -> Another block quote. +A paragraph. +- not a list \markdownEnd \bye -``````` +```````` Next, invoke LuaTeX from the terminal: ``` sh luatex document.tex @@ -3953,35 +4184,33 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> > A single block quote. +> A paragraph. > -> > A block quote. +> - a list > -> > Another block quote. +> A paragraph. - not a list ##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: -``` tex +```` tex \documentclass{article} \usepackage{markdown} \begin{document} \begin{markdown} -> A single - -> block quote. +A paragraph. +- a list \end{markdown} -\begin{markdown*}{breakableBlockquotes} -> A block quote. - -> Another block quote. -\end{markdown*} +\begin{markdown}[blankBeforeList] +A paragraph. +- not a list +\end{markdown} \end{document} -``````` +```````` Next, invoke LuaTeX from the terminal: ``` sh lualatex document.tex @@ -3989,31 +4218,29 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> > A single block quote. +> A paragraph. > -> > A block quote. +> - a list > -> > Another block quote. +> A paragraph. - not a list ##### \Hologo{ConTeXt} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: -``` tex +```` tex \usemodule[t][markdown] \starttext \startmarkdown -> A single - -> block quote. +A paragraph. +- a list \stopmarkdown -\setupmarkdown[breakableBlockquotes = yes] +\setupmarkdown[blankBeforeList = yes] \startmarkdown -> A block quote. - -> Another block quote. +A paragraph. +- not a list \stopmarkdown \stoptext @@ -4021,22 +4248,22 @@ following content: Next, invoke LuaTeX from the terminal: ``` sh context document.tex -````` +`````` A PDF document named `document.pdf` should be produced and contain the following text: -> > A single block quote. +> A paragraph. > -> > A block quote. +> - a list > -> > Another block quote. +> A paragraph. - not a list % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { breakableBlockquotes } + { blankBeforeList } { boolean } { false } % \end{macrocode} @@ -4045,195 +4272,94 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.breakableBlockquotes = false -% \end{macrocode} -% \par -% \iffalse -% -%<*manual-options> - -#### Option `citationNbsps` - -`citationNbsps` (default value: `true`) - -% \fi -% \begin{markdown} -% -% \Optitem[false]{citationNbsps}{\opt{true}, \opt{false}} -% -: true - - : Replace regular spaces with non-breaking spaces inside the prenotes - and postnotes of citations produced via the pandoc citation syntax - extension. - - false - - : Do not replace regular spaces with non-breaking spaces inside the - prenotes and postnotes of citations produced via the pandoc citation - syntax extension. - -% \end{markdown} -% \iffalse - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.bib` with the -following content: -``` bib -@book{knuth:tex, - author = "Knuth, Donald Ervin", - title = "The \TeX book, volume A of Computers and typesetting", - publisher = "Addison-Wesley", - year = "1984" -} -``````` -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[citations]{markdown} -\begin{document} - -\begin{markdown} -The TeXbook [@knuth:tex, p. 123 and 130] is good. -\end{markdown} - -\begin{markdown*}{citationNbsps = false} -The TeXbook [@knuth:tex, p. 123 and 130] is good. -\end{markdown*} - -\bibliographystyle{plain} -\bibliography{document.bib} -\end{document} -``````` -Next, invoke LuaTeX and BibTeX from the terminal: -``` sh -lualatex document.tex -bibtex document.aux -lualatex document.tex -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text, where the middot (`·`) denotes a non-breaking space: - -> The TeXbook [1, p.·123·and·130] is good. -> -> The TeXbook [1, p. 123 and 130] is good. -> -> ### References -> [1] Donald·Ervin Knuth. _The TeXbook, volume A of Computers and typesetting._ -> Addison-Wesley, 1984. - -% -%<*tex> -% \fi -% \begin{macrocode} -\@@_add_lua_option:nnn - { citationNbsps } - { boolean } - { true } -% \end{macrocode} -% \iffalse -% -%<*lua,lua-cli> -% \fi -% \begin{macrocode} -defaultOptions.citationNbsps = true +defaultOptions.blankBeforeList = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `citations` +#### Option `bracketedSpans` -`citations` (default value: `false`) +`bracketedSpans` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{citations}{\opt{true}, \opt{false}} +% \Optitem[false]{bracketedSpans}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [citation syntax extension][pandoc-citations]: + : Enable the Pandoc [bracketed span syntax extension][pandoc-bracketed-spans]: ``` md - Here is a simple parenthetical citation [@doe99] and here - is a string of several [see @doe99, pp. 33-35; also - @smith04, chap. 1]. - - A parenthetical citation can have a [prenote @doe99] and - a [@smith04 postnote]. The name of the author can be - suppressed by inserting a dash before the name of an - author as follows [-@smith04]. - - Here is a simple text citation @doe99 and here is - a string of several @doe99 [pp. 33-35; also @smith04, - chap. 1]. Here is one with the name of the author - suppressed -@doe99. + [This is *some text*]{.class key=val} `````` : false - : Disable the Pandoc citation syntax extension. + : Disable the Pandoc bracketed span syntax extension. - [pandoc-citations]: https://pandoc.org/MANUAL.html#extension-citations + [pandoc-bracketed-spans]: https://pandoc.org/MANUAL.html#extension-bracketed_spans % \end{markdown} % \iffalse ##### \LaTeX{} Example {.unnumbered} -Using a text editor, create a text document named `document.bib` with the -following content: -``` bib -@book{knuth:tex, - author = "Knuth, Donald Ervin", - title = "The \TeX book, volume A of Computers and typesetting", - publisher = "Addison-Wesley", - year = "1984" -} -``````` Using a text editor, create a text document named `document.tex` with the following content: -``` tex +```` tex \documentclass{article} -\usepackage[backend=biber]{biblatex} -\addbibresource{document.bib} -\usepackage[citations]{markdown} +\usepackage[bracketedSpans]{markdown} +\usepackage{expl3} +\ExplSyntaxOn +\markdownSetup{ + renderers = { + bracketedSpanAttributeContextBegin = { + \group_begin: + \color_group_begin: + \markdownSetup{ + renderers = { + attributeKeyValue = { + \str_if_eq:nnT + { ##1 } + { color } + { + \color_select:n { ##2 } + } + }, + }, + } + }, + bracketedSpanAttributeContextEnd = { + \color_group_end: + \group_end: + }, + }, +} +\ExplSyntaxOff \begin{document} - \begin{markdown} -The TeXbook [@knuth:tex, p. 123 and 130] was written by @knuth:tex. +Here is some [colored text]{color=red}. \end{markdown} - -\printbibliography \end{document} ``````` -Next, invoke LuaTeX and Biber from the terminal: +Next, invoke LuaTeX from the terminal: ``` sh lualatex document.tex -biber document.bcf -lualatex document.tex -lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> The TeXbook [1, p.·123 and 130] was written by Knuth [1]. -> -> ### References -> [1] Donald Ervin Knuth. _The \TeX{}book, volume A of Computers and typesetting._ -> Addison-Wesley, 1984. +> Here is some colored text. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { citations } + { bracketedSpans } { boolean } { false } % \end{macrocode} @@ -4242,40 +4368,29 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.citations = false +defaultOptions.bracketedSpans = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `codeSpans` +#### Option `breakableBlockquotes` -`codeSpans` (default value: `true`) +`breakableBlockquotes` (default value: `true`) % \fi % \begin{markdown} % -% \Optitem[true]{codeSpans}{\opt{true}, \opt{false}} +% \Optitem[true]{breakableBlockquotes}{\opt{true}, \opt{false}} % : true - : Enable the code span syntax: - - ~~~ md - Use the `printf()` function. - ``There is a literal backtick (`) here.`` - ~~~ - -: false + : A blank line separates block quotes. - : Disable the code span syntax. This allows you to easily - use the quotation mark ligatures in texts that do not contain code - spans: + false - ~~~ - ``This is a quote.'' - ~~~~~~ + : Blank lines in the middle of a block quote are ignored. % \end{markdown} % \iffalse @@ -4287,21 +4402,25 @@ following content: ``` tex \input markdown \input lmfonts +\def\markdownRendererHeadingOne#1{{\bf #1}\par} +\begingroup +\catcode`\%=12 +\catcode`\#=12 \directlua{ local markdown = require("markdown") - local convert = markdown.new() - local input = - "``This is a code span.'' " .. - "``This is no longer a code span.''" - tex.sprint(convert(input)) } -\par -\directlua{ - local markdown = require("markdown") - local convert = markdown.new({codeSpans = false}) - local input = - "``This is a quote.'' " .. - "``This is another quote.''" + local newline = [[^^J^^J]] + local convert, input + + convert = markdown.new({breakableBlockquotes = false}) + input = "> A single" .. newline .. newline .. + "> block quote." .. newline + tex.sprint(convert(input)) + + convert = markdown.new() + input = "> A block quote." .. newline .. newline .. + "> Another block quote." .. newline tex.sprint(convert(input)) } +\endgroup \bye ``````` Then, invoke LuaTeX from the terminal: @@ -4311,9 +4430,11 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> ``This is a code span.'' ``This is no longer a code span.'' +> > A single block quote. > -> “This is a quote.” “This is another quote.” +> > A block quote. +> +> > Another block quote. ##### Lua CLI Example {.unnumbered} @@ -4322,20 +4443,25 @@ following content: ``` tex \input markdown \input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 \input optionfalse -\par \input optiontrue +\endgroup \bye ``````` Using a text editor, create a text document named `content.md` with the following content: ``` md -``Is this a code span?'' ``Or a quote?'' +> A single block quote + +> or two block quotes? `````` Next, invoke LuaTeX from the terminal: ``` sh -texlua ⟨CLI pathname⟩ codeSpans=false -- content.md optionfalse.tex -texlua ⟨CLI pathname⟩ -- content.md optiontrue.tex +texlua ⟨CLI pathname⟩ breakableBlockquotes=false -- content.md optionfalse.tex +texlua ⟨CLI pathname⟩ -- content.md optiontrue.tex luatex document.tex ``````` where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, @@ -4347,9 +4473,11 @@ script file using [Kpathsea][]. A PDF document named `document.pdf` should be produced and contain the following text: -> “Is this a code span?” “Or a quote?” +> > A single block quote or two block quotes? > -> ``Is this a code span?'' ``Or a quote?'' +> > A single block quote +> +> > or two block quotes? ##### Plain \TeX{} Example {.unnumbered} @@ -4358,15 +4486,18 @@ following content: ``` tex \input markdown +\def\markdownOptionBreakableBlockquotes{false} \markdownBegin -``This is a code span.'' -``This is no longer a code span.'' +> A single + +> block quote. \markdownEnd -\def\markdownOptionCodeSpans{false} +\def\markdownOptionBreakableBlockquotes{true} \markdownBegin -``This is a quote.'' -``This is another quote.'' +> A block quote. + +> Another block quote. \markdownEnd \bye @@ -4378,9 +4509,11 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> ``This is a code span.'' ``This is no longer a code span.'' +> > A single block quote. > -> “This is a quote.” “This is another quote.” +> > A block quote. +> +> > Another block quote. ##### \LaTeX{} Example {.unnumbered} @@ -4391,15 +4524,17 @@ following content: \usepackage{markdown} \begin{document} -\begin{markdown} -``This is a code span.'' -``This is no longer a code span.'' +\begin{markdown}[breakableBlockquotes = false] +> A single + +> block quote. \end{markdown} -\begin{markdown*}{codeSpans=false} -``This is a quote.'' -``This is another quote.'' -\end{markdown*} +\begin{markdown} +> A block quote. + +> Another block quote. +\end{markdown} \end{document} ``````` @@ -4410,9 +4545,11 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> ``This is a code span.'' ``This is no longer a code span.'' +> > A single block quote. > -> “This is a quote.” “This is another quote.” +> > A block quote. +> +> > Another block quote. ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -4422,36 +4559,41 @@ following content: \usemodule[t][markdown] \starttext +\setupmarkdown[breakableBlockquotes = no] \startmarkdown -``This is a code span.'' -``This is no longer a code span.'' +> A single + +> block quote. \stopmarkdown -\setupmarkdown[codeSpans = no] +\setupmarkdown[breakableBlockquotes = yes] \startmarkdown -``This is a quote.'' -``This is another quote.'' +> A block quote. + +> Another block quote. \stopmarkdown \stoptext ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the following text: -> ``This is a code span.'' ``This is no longer a code span.'' +> > A single block quote. > -> “This is a quote.” “This is another quote.” +> > A block quote. +> +> > Another block quote. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { codeSpans } + { breakableBlockquotes } { boolean } { true } % \end{macrocode} @@ -4460,323 +4602,195 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.codeSpans = true +defaultOptions.breakableBlockquotes = true % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `contentBlocks` +#### Option `citationNbsps` -`contentBlocks` (default value: `false`) +`citationNbsps` (default value: `true`) % \fi % \begin{markdown} % -% \Optitem[false]{contentBlocks}{\opt{true}, \opt{false}} +% \Optitem[false]{citationNbsps}{\opt{true}, \opt{false}} % : true - : Enable the -% iA\,Writer content blocks syntax extension~[@sotkov17]: -% \iffalse - iA\,Writer content blocks syntax extension: -% \fi - - ``` md - http://example.com/minard.jpg (Napoleon's - disastrous Russian campaign of 1812) - /Flowchart.png "Engineering Flowchart" - /Savings Account.csv 'Recent Transactions' - /Example.swift - /Lorem Ipsum.txt - `````` + : Replace regular spaces with non-breaking spaces inside the prenotes + and postnotes of citations produced via the pandoc citation syntax + extension. -: false + false - : Disable the - iA\,Writer content blocks syntax extension. + : Do not replace regular spaces with non-breaking spaces inside the + prenotes and postnotes of citations produced via the pandoc citation + syntax extension. % \end{markdown} % \iffalse ##### \LaTeX{} Example {.unnumbered} -Using a text editor, create a text document named `table.csv` with the +Using a text editor, create a text document named `document.bib` with the following content: -``` csv -Name,Surname,Born -Albert,Einstein,1879 -Marie,Curie,1867 -Thomas,Edison,1847 -``````` -Create also a text document named `markdown-languages.json` with the following -content: -``` js -{ - "tex": "LaTeX" +``` bib +@book{knuth:tex, + author = "Knuth, Donald Ervin", + title = "The \TeX book, volume A of Computers and typesetting", + publisher = "Addison-Wesley", + year = "1984" } -`````` -Create also a text document named `code.tex` with the following content: -``` tex -This is an example code listing in \LaTeX. ``````` -Create also a text document named `part.md` with the following content: -``` md -This is a *transcluded markdown document*. -`````` -Create also a text document named `document.tex` with the following content: +Using a text editor, create a text document named `document.tex` with the +following content: ``` tex \documentclass{article} -\usepackage{minted} -\usepackage[contentBlocks]{markdown} +\usepackage[citations]{markdown} \begin{document} + \begin{markdown} -/table.csv (An example table) -/code.tex (An example code listing) -/part.md (A file transclusion example) +The TeXbook [@knuth:tex, p. 123 and 130] is good. \end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex --shell-escape document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> | Name | Surname | Born | -> | ------ | ---------| ---- | -> | Albert | Einstein | 1879 | -> | Marie | Curie | 1867 | -> | Thomas | Edison | 1847 | -> -> Table 1: An example table -> -> ``` tex -> This is an example code listing in \LaTeX. -> ``````` -> -> This is a *transcluded markdown document*. -##### \Hologo{ConTeXt} Example {.unnumbered} +\begin{markdown}[citationNbsps = false] +The TeXbook [@knuth:tex, p. 123 and 130] is good. +\end{markdown} -Using a text editor, create a text document named `table.csv` with the -following content: -``` csv -Name,Surname,Born -Albert,Einstein,1879 -Marie,Curie,1867 -Thomas,Edison,1847 -``````` -Create also a text document named `markdown-languages.json` with the following -content: -``` js -{ - "tex": "ConTeXt" -} -`````` -Create also a text document named `code.tex` with the following content: -``` tex -This is an example code listing in \ConTeXt. +\bibliographystyle{plain} +\bibliography{document.bib} +\end{document} ``````` -Create also a text document named `part.md` with the following content: -``` md -This is a *transcluded markdown document*. -`````` -Create also a text document named `document.tex` with the following content: -``` tex -\usemodule[t][markdown] -\setupmarkdown[contentBlocks = yes] -\definetyping [ConTeXt] -\setuptyping [ConTeXt] [option=TEX] -\starttext -\startmarkdown -/table.csv (An example table) -/code.tex (An example code listing) -/part.md (A file transclusion example) -\stopmarkdown -\stoptext -```````` -Next, invoke LuaTeX from the terminal: +Next, invoke LuaTeX and BibTeX from the terminal: ``` sh -context document.tex -````` +lualatex document.tex +bibtex document.aux +lualatex document.tex +lualatex document.tex +`````` A PDF document named `document.pdf` should be produced and contain the -following text: +following text, where the middot (`·`) denotes a non-breaking space: -> | Name | Surname | Born | -> | ------ | ---------| ---- | -> | Albert | Einstein | 1879 | -> | Marie | Curie | 1867 | -> | Thomas | Edison | 1847 | -> -> Table 1: An example table +> The TeXbook [1, p.·123·and·130] is good. > -> ``` tex -> This is an example code listing in \ConTeXt. -> ``````` +> The TeXbook [1, p. 123 and 130] is good. > -> This is a *transcluded markdown document*. +> ### References +> [1] Donald·Ervin Knuth. _The TeXbook, volume A of Computers and typesetting._ +> Addison-Wesley, 1984. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { contentBlocks } + { citationNbsps } { boolean } - { false } + { true } % \end{macrocode} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.contentBlocks = false +defaultOptions.citationNbsps = true % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `debugExtensions` +#### Option `citations` -`debugExtensions` (default value: `false`) +`citations` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{debugExtensions}{\opt{true}, \opt{false}} +% \Optitem[false]{citations}{\opt{true}, \opt{false}} % : true - : Produce a \acro{JSON} file that will contain the - extensible subset of the \acro{peg} grammar of markdown -% (see the \luamref{walkable_syntax} hash table) - after built-in syntax extensions -% (see Section <#sec:lua-built-in-extensions>) -% \iffalse - (see options \Opt{citations}, \Opt{contentBlocks}, - \Opt{definitionLists}, etc.) -% \fi - and user-defined syntax extensions -% (see Section <#sec:lua-user-extensions>) -% \iffalse - (see option \Opt{extensions}) -% \fi - have been applied. This helps you to see how the different - extensions interact. The name of the produced \acro{JSON} file is - controlled by the \Opt{debugExtensionsFileName} option. + : Enable the Pandoc [citation syntax extension][pandoc-citations]: -: false + ``` md + Here is a simple parenthetical citation [@doe99] and here + is a string of several [see @doe99, pp. 33-35; also + @smith04, chap. 1]. - : Do not produce a \acro{JSON} file with the \acro{peg} grammar of - markdown. + A parenthetical citation can have a [prenote @doe99] and + a [@smith04 postnote]. The name of the author can be + suppressed by inserting a dash before the name of an + author as follows [-@smith04]. + + Here is a simple text citation @doe99 and here is + a string of several @doe99 [pp. 33-35; also @smith04, + chap. 1]. Here is one with the name of the author + suppressed -@doe99. + `````` + +: false + + : Disable the Pandoc citation syntax extension. + + [pandoc-citations]: https://pandoc.org/MANUAL.html#extension-citations % \end{markdown} % \iffalse ##### \LaTeX{} Example {.unnumbered} -Using a text editor, create a text document named `strike-through.lua` with the +Using a text editor, create a text document named `document.bib` with the following content: -``` lua -local strike_through = { - api_version = 2, - grammar_version = 2, - finalize_grammar = function(reader) - local nonspacechar = lpeg.P(1) - lpeg.S("\t ") - local doubleslashes = lpeg.P("//") - local function between(p, starter, ender) - ender = lpeg.B(nonspacechar) * ender - return (starter * #nonspacechar - * lpeg.Ct(p * (p - ender)^0) * ender) - end - - local read_strike_through = between( - lpeg.V("Inline"), doubleslashes, doubleslashes - ) / function(s) return {"\\st{", s, "}"} end - - reader.insert_pattern("Inline after Emph", read_strike_through, - "StrikeThrough") - reader.add_special_character("/") - end +``` bib +@book{knuth:tex, + author = "Knuth, Donald Ervin", + title = "The \TeX book, volume A of Computers and typesetting", + publisher = "Addison-Wesley", + year = "1984" } - -return strike_through ``````` -Using a text editor, create also a text document named `document.tex` with the +Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage{soul} -\usepackage[extension = strike-through.lua, - debugExtensions]{markdown} +\usepackage[backend=biber]{biblatex} +\addbibresource{document.bib} +\usepackage[citations]{markdown} \begin{document} + \begin{markdown} -This is //a lunar roving vehicle// strike-through text. +The TeXbook [@knuth:tex, p. 123 and 130] was written by @knuth:tex. \end{markdown} + +\printbibliography \end{document} ``````` -Next, invoke LuaTeX from the terminal: +Next, invoke LuaTeX and Biber from the terminal: ``` sh lualatex document.tex +biber document.bcf +lualatex document.tex +lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> This is ~~a lunar roving vehicle~~ strike-through text. - -Furthermore, a JSON document named `document.debug-extensions.json` should also -be produced and contain the following text: - -``` json -{ - "Block": [ - "Blockquote", - "Verbatim", - "ThematicBreak", - "BulletList", - "OrderedList", - "Heading", - "DisplayHtml", - "Paragraph", - "Plain" - ], - "Inline": [ - "Str", - "Space", - "Endline", - "UlOrStarLine", - "Strong", - "Emph", - "StrikeThrough (user-defined \"./strike-through.lua\" syntax extension)", - "Link", - "Image", - "Code", - "AutoLinkUrl", - "AutoLinkEmail", - "AutoLinkRelativeReference", - "InlineHtml", - "HtmlEntity", - "EscapedChar", - "Smart", - "Symbol" - ] -} -```````` - -This output shows us that our user-defined syntax extension has been correctly -inserted to the grammar of markdown. +> The TeXbook [1, p.·123 and 130] was written by Knuth [1]. +> +> ### References +> [1] Donald Ervin Knuth. _The \TeX{}book, volume A of Computers and typesetting._ +> Addison-Wesley, 1984. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { debugExtensions } + { citations } { boolean } { false } % \end{macrocode} @@ -4785,345 +4799,482 @@ inserted to the grammar of markdown. %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.debugExtensions = false +defaultOptions.citations = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `definitionLists` +#### Option `codeSpans` -`definitionLists` (default value: `false`) +`codeSpans` (default value: `true`) % \fi % \begin{markdown} % -% \Optitem[false]{definitionLists}{\opt{true}, \opt{false}} +% \Optitem[true]{codeSpans}{\opt{true}, \opt{false}} % : true - : Enable the pandoc definition list syntax extension: - - ``` md - Term 1 + : Enable the code span syntax: - : Definition 1 + ~~~ md + Use the `printf()` function. + ``There is a literal backtick (`) here.`` + ~~~ - Term 2 with *inline markup* +: false - : Definition 2 + : Disable the code span syntax. This allows you to easily + use the quotation mark ligatures in texts that do not contain code + spans: - { some code, part of Definition 2 } + ~~~ + ``This is a quote.'' + ~~~~~~ - Third paragraph of definition 2. - ````` +% \end{markdown} +% \iffalse -: false +##### Lua Module Example {.unnumbered} - : Disable the pandoc definition list syntax extension. +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\directlua{ + local markdown = require("markdown") + local convert = markdown.new() + local input = + "``This is a code span.'' " .. + "``This is no longer a code span.''" + tex.sprint(convert(input)) } +\par +\directlua{ + local markdown = require("markdown") + local convert = markdown.new({codeSpans = false}) + local input = + "``This is a quote.'' " .. + "``This is another quote.''" + tex.sprint(convert(input)) } +\endgroup +\bye +``````` +Then, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +``````` +A PDF document named `document.pdf` should be produced and contain the +following text: -% \end{markdown} -% \iffalse +> ``This is a code span.'' ``This is no longer a code span.'' +> +> “This is a quote.” “This is another quote.” -##### \LaTeX{} Example {.unnumbered} +##### Lua CLI Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex -\documentclass{article} -\usepackage[definitionLists]{markdown} -\begin{document} -\begin{markdown} -Term 1 +\input markdown +\input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\input optionfalse +\par +\input optiontrue +\endgroup +\bye +``````` +Using a text editor, create a text document named `content.md` with the +following content: +``` md +``Is this a code span?'' ``Or a quote?'' +`````` +Next, invoke LuaTeX from the terminal: +``` sh +texlua ⟨CLI pathname⟩ codeSpans=false -- content.md optionfalse.tex +texlua ⟨CLI pathname⟩ -- content.md optiontrue.tex +luatex document.tex +``````` +where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, +such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or +`C:\Users\`\meta{Your username}`\texmf\scripts\markdown\markdown-cli.lua` on Windows +systems. Use the command `kpsewhich -a markdown-cli.lua` to locate the Lua CLI +script file using [Kpathsea][]. -: Definition 1 +A PDF document named `document.pdf` should be produced and contain the +following text: -Term 2 with *inline markup* +> “Is this a code span?” “Or a quote?” +> +> ``Is this a code span?'' ``Or a quote?'' -: Definition 2 +##### Plain \TeX{} Example {.unnumbered} - { some code, part of Definition 2 } +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown - Third paragraph of definition 2. -\end{markdown} -\end{document} +\markdownBegin +``This is a code span.'' +``This is no longer a code span.'' +\markdownEnd + +\def\markdownOptionCodeSpans{false} +\markdownBegin +``This is a quote.'' +``This is another quote.'' +\markdownEnd + +\bye ``````` Next, invoke LuaTeX from the terminal: ``` sh -lualatex document.tex +luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> Term 1 -> -> : Definition 1 -> -> Term 2 with *inline markup* -> -> : Definition 2 -> -> { some code, part of Definition 2 } -> -> Third paragraph of definition 2. +> ``This is a code span.'' ``This is no longer a code span.'' +> +> “This is a quote.” “This is another quote.” -##### \Hologo{ConTeXt} Example {.unnumbered} +##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex -\usemodule[t][markdown] -\setupmarkdown[definitionLists = yes] -\starttext -\startmarkdown -Term 1 +\documentclass{article} +\usepackage{markdown} +\begin{document} -: Definition 1 +\begin{markdown} +``This is a code span.'' +``This is no longer a code span.'' +\end{markdown} -Term 2 with *inline markup* +\begin{markdown}[codeSpans=false] +``This is a quote.'' +``This is another quote.'' +\end{markdown} -: Definition 2 +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: - { some code, part of Definition 2 } +> ``This is a code span.'' ``This is no longer a code span.'' +> +> “This is a quote.” “This is another quote.” - Third paragraph of definition 2. +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\starttext + +\startmarkdown +``This is a code span.'' +``This is no longer a code span.'' \stopmarkdown + +\setupmarkdown[codeSpans = no] +\startmarkdown +``This is a quote.'' +``This is another quote.'' +\stopmarkdown + \stoptext ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the following text: -> Term 1 -> -> : Definition 1 -> -> Term 2 with *inline markup* -> -> : Definition 2 -> -> { some code, part of Definition 2 } -> -> Third paragraph of definition 2. +> ``This is a code span.'' ``This is no longer a code span.'' +> +> “This is a quote.” “This is another quote.” % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { definitionLists } + { codeSpans } { boolean } - { false } + { true } % \end{macrocode} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.definitionLists = false +defaultOptions.codeSpans = true % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `eagerCache` +#### Option `contentBlocks` -`eagerCache` (default value: `true`) +`contentBlocks` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[true]{eagerCache}{\opt{true}, \opt{false}} +% \Optitem[false]{contentBlocks}{\opt{true}, \opt{false}} % : true - : Converted markdown documents will be cached in \Opt{cacheDir}. This can be - useful for post-processing the converted documents and for recovering - historical versions of the documents from the cache. However, it also - produces a large number of auxiliary files on the disk and obscures the - output of the Lua command-line interface when it is used for plumbing. + : Enable the +% iA\\,Writer content blocks syntax extension~[@sotkov17]: +% \iffalse + iA\\,Writer content blocks syntax extension: +% \fi - This behavior will always be used if the \Opt{finalizeCache} option is - enabled. + ``` md + http://example.com/minard.jpg (Napoleon's + disastrous Russian campaign of 1812) + /Flowchart.png "Engineering Flowchart" + /Savings Account.csv 'Recent Transactions' + /Example.swift + /Lorem Ipsum.txt + `````` : false - : Converted markdown documents will not be cached. This decreases the number - of auxiliary files that we produce and makes it easier to use the Lua - command-line interface for plumbing. - - This behavior will only be used when the \Opt{finalizeCache} option is - disabled. Recursive nesting of markdown document fragments is undefined - behavior when \Opt{eagerCache} is disabled. + : Disable the + iA\\,Writer content blocks syntax extension. % \end{markdown} % \iffalse -##### Lua Module Example {.unnumbered} +##### \LaTeX{} Example {.unnumbered} -Using a text editor, create a text document named `hello.md` with the +Using a text editor, create a text document named `table.csv` with the following content: -``` md -Hello *world*! +``` csv +Name,Surname,Born +Albert,Einstein,1879 +Marie,Curie,1867 +Thomas,Edison,1847 +``````` +Create also a text document named `markdown-languages.json` with the following +content: +``` js +{ + "tex": "LaTeX" +} `````` -Next, invoke LuaTeX from the terminal with the \Opt{eagerCache} option -disabled: -``` sh -texlua ⟨CLI pathname⟩ eagerCache=false -- hello.md hello.tex +Create also a text document named `code.tex` with the following content: +``` tex +This is an example code listing in \LaTeX. ``````` -where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, -such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or -`C:\Users\`\meta{Your username}`\texmf\scripts\markdown\markdown-cli.lua` on Windows -systems. Use the command `kpsewhich -a markdown-cli.lua` to locate the Lua CLI -script file using [Kpathsea][]. - -A \TeX{} document named `hello.tex` should be produced and contain the -following code: +Create also a text document named `part.md` with the following content: +``` md +This is a *transcluded markdown document*. +`````` +Create also a text document named `document.tex` with the following content: ``` tex -Hello \markdownRendererEmphasis{world}!\relax -``` +\documentclass{article} +\usepackage{minted} +\usepackage[contentBlocks]{markdown} +\begin{document} +\begin{markdown} +/table.csv (An example table) +/code.tex (An example code listing) +/part.md (A file transclusion example) +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex --shell-escape document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: -*** +> | Name | Surname | Born | +> | ------ | ---------| ---- | +> | Albert | Einstein | 1879 | +> | Marie | Curie | 1867 | +> | Thomas | Edison | 1847 | +> +> Table 1: An example table +> +> ``` tex +> This is an example code listing in \LaTeX. +> ``````` +> +> This is a *transcluded markdown document*. -Invoke LuaTeX from the terminal again, this time with the \Opt{eagerCache} -option enabled: +##### \Hologo{ConTeXt} Example {.unnumbered} +Using a text editor, create a text document named `table.csv` with the +following content: +``` csv +Name,Surname,Born +Albert,Einstein,1879 +Marie,Curie,1867 +Thomas,Edison,1847 +``````` +Create also a text document named `markdown-languages.json` with the following +content: +``` js +{ + "tex": "ConTeXt" +} +`````` +Create also a text document named `code.tex` with the following content: ``` tex -texlua ⟨CLI pathname⟩ eagerCache=true -- hello.md hello.tex -``` - -A \TeX{} document named `hello.tex` should be produced and contain the -following code: - +This is an example code listing in \ConTeXt. +``````` +Create also a text document named `part.md` with the following content: +``` md +This is a *transcluded markdown document*. +`````` +Create also a text document named `document.tex` with the following content: ``` tex -\input ./⟨hash⟩.md.tex\relax -``` - -Additionally, a \TeX{} document named `⟨hash⟩.md.tex` should be produced and -contain the following code: +\usemodule[t][markdown] +\setupmarkdown[contentBlocks = yes] +\definetyping [ConTeXt] +\setuptyping [ConTeXt] [option=TEX] +\starttext +\startmarkdown +/table.csv (An example table) +/code.tex (An example code listing) +/part.md (A file transclusion example) +\stopmarkdown +\stoptext +```````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +````` +A PDF document named `document.pdf` should be produced and contain the +following text: -``` tex -Hello \markdownRendererEmphasis{world}!\relax -``` +> | Name | Surname | Born | +> | ------ | ---------| ---- | +> | Albert | Einstein | 1879 | +> | Marie | Curie | 1867 | +> | Thomas | Edison | 1847 | +> +> Table 1: An example table +> +> ``` tex +> This is an example code listing in \ConTeXt. +> ``````` +> +> This is a *transcluded markdown document*. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { eagerCache } + { contentBlocks } { boolean } - { true } + { false } % \end{macrocode} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.eagerCache = true +defaultOptions.contentBlocks = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `expectJekyllData` +#### Option `contentLevel` -`expectJekyllData` (default value: `false`) +`contentLevel` (default value: `block`) % \fi -% \markdownBegin +% \begin{markdown} % -% \Optitem[false]{expectJekyllData}{\opt{true}, \opt{false}} +% \Optitem[block]{contentLevel}{\opt{block}, \opt{inline}} % -: false +: block - : When the \Opt{jekyllData} option is enabled, then a markdown document - may begin with \acro{yaml} metadata if and only if the metadata begin - with the end-of-directives marker (`---`) and they end with either the - end-of-directives or the end-of-document marker (`...`): + : Treat content as a sequence of blocks. + ``` md + - this is a list + - it contains two items + `````` - ~~~~~ latex - \documentclass{article} - \usepackage[jekyllData]{markdown} - \begin{document} - \begin{markdown} - --- - - this - - is - - YAML - ... - - followed - - by - - Markdown - \end{markdown} - \begin{markdown} - - this - - is - - Markdown - \end{markdown} - \end{document} - ~~~~~~~~~~~ +: inline -: true + : Treat all content as inline content. + ``` md + - this is a text + - not a list + `````` - : When the \Opt{jekyllData} option is enabled, then a markdown document may - begin directly with \acro{yaml} metadata and may contain nothing but - \acro{yaml} metadata. +% \end{markdown} +% \iffalse - ~~~~~ latex - \documentclass{article} - \usepackage[jekyllData, expectJekyllData]{markdown} - \begin{document} - \begin{markdown} - - this - - is - - YAML - ... - - followed - - by - - Markdown - \end{markdown} - \begin{markdown} - - this - - is - - YAML - \end{markdown} - \end{document} - ~~~~~~~~~~~ +##### Plain \TeX{} Example {.unnumbered} -% \markdownEnd -% \iffalse +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\def\markdownOptionContentLevel{inline} +\markdownBegin +- this is +- a text +\markdownEnd +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> \- this is - a text ##### \LaTeX{} Example {.unnumbered} -Using a text editor, create a text document named `jane-doe.yml` with the -following content: -``` yaml -name: Jane Doe -age: 99 -``` -Using a text editor, create also a text document named `document.tex` with the +Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[jekyllData]{markdown} -\markdownSetup{ - jekyllDataRenderers = { - name = {\gdef\name{#1}}, - code = {\gdef\age{#1}}, - }, - renderers = { - jekyllDataEnd = {\name{} is \age{} years old.}, - } -} +\usepackage{markdown} \begin{document} -\markdownInput[expectJekyllData]{jane-doe.yml} + +\begin{markdown} +- this is +- a list +\end{markdown} + +\begin{markdown}[contentLevel=inline] +- this is +- a text +\end{markdown} + \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -5133,103 +5284,99 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> Jane Doe is 99 years old. +> - this is +> - a list +> +> \- this is - a text + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\starttext + +\startmarkdown +- this is +- a list +\stopmarkdown + +\setupmarkdown[contentLevel = inline] +\startmarkdown +- this is +- a text +\stopmarkdown + +\stoptext +```````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> - this is +> - a list +> +> \- this is - a text % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { expectJekyllData } - { boolean } - { false } + { contentLevel } + { string } + { block } % \end{macrocode} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.expectJekyllData = false +defaultOptions.contentLevel = "block" % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `extensions` +#### Option `debugExtensions` -`extensions` (default value: `{}`) +`debugExtensions` (default value: `false`) % \fi % \begin{markdown} % -% \Valitem[\{\}]{extensions}{filenames} +% \Optitem[false]{debugExtensions}{\opt{true}, \opt{false}} % -: The filenames of user-defined syntax extensions that will be applied to the - markdown reader. If the \pkg{kpathsea} library is available, files will be - searched for not only in the current working directory but also in the - \TeX{} directory structure. +: true + + : Produce a \acro{JSON} file that will contain the + extensible subset of the \acro{peg} grammar of markdown +% (see the \luamref{walkable_syntax} hash table) + after built-in syntax extensions +% (see Section <#sec:lua-built-in-extensions>) +% \iffalse + (see options \Opt{citations}, \Opt{contentBlocks}, + \Opt{definitionLists}, etc.) +% \fi + and user-defined syntax extensions +% (see Section <#sec:lua-user-extensions>) +% \iffalse + (see option \Opt{extensions}) +% \fi + have been applied. This helps you to see how the different + extensions interact. The name of the produced \acro{JSON} file is + controlled by the \Opt{debugExtensionsFileName} option. + +: false + + : Do not produce a \acro{JSON} file with the \acro{peg} grammar of + markdown. -% A user-defined syntax extension is a Lua file in the following format: -% -% ``` lua -% local strike_through = { -% api_version = 2, -% grammar_version = 2, -% finalize_grammar = function(reader) -% local nonspacechar = lpeg.P(1) - lpeg.S("\t ") -% local doubleslashes = lpeg.P("//") -% local function between(p, starter, ender) -% ender = lpeg.B(nonspacechar) * ender -% return (starter * #nonspacechar -% * lpeg.Ct(p * (p - ender)^0) * ender) -% end -% -% local read_strike_through = between( -% lpeg.V("Inline"), doubleslashes, doubleslashes -% ) / function(s) return {"\\st{", s, "}"} end -% -% reader.insert_pattern("Inline after Emph", read_strike_through, -% "StrikeThrough") -% reader.add_special_character("/") -% end -% } -% -% return strike_through -% ``````` -% -% The `api_version` and `grammar_version` fields specify the version of the -% user-defined syntax extension API and the markdown grammar for which -% the extension was written. See the current API and grammar versions -% below: -% -% \end{markdown} -% \iffalse -% -%<*lua> -% \fi -% \begin{macrocode} -metadata.user_extension_api_version = 2 -metadata.grammar_version = 2 -% \end{macrocode} -% \iffalse -% -%<*manual-options> -% \fi -% \begin{markdown} -% -% Any changes to the syntax extension API or grammar will cause the -% corresponding current version to be incremented. After Markdown 3.0.0, -% any changes to the API and the grammar will be either backwards-compatible -% or constitute a breaking change that will cause the major version of the -% Markdown package to increment (to 4.0.0). -% -% The `finalize_grammar` field is a function that finalizes the grammar of -% markdown using the interface of a Lua \luamref{reader} object, such as -% the \luamref{reader->insert_pattern} and -% \luamref{reader->add_special_character} methods, -% see Section <#lua-user-extensions>. -% % \end{markdown} % \iffalse @@ -5240,7 +5387,7 @@ following content: ``` lua local strike_through = { api_version = 2, - grammar_version = 2, + grammar_version = 4, finalize_grammar = function(reader) local nonspacechar = lpeg.P(1) - lpeg.S("\t ") local doubleslashes = lpeg.P("//") @@ -5254,7 +5401,7 @@ local strike_through = { lpeg.V("Inline"), doubleslashes, doubleslashes ) / function(s) return {"\\st{", s, "}"} end - reader.insert_pattern("Inline after Emph", read_strike_through, + reader.insert_pattern("Inline after LinkAndEmph", read_strike_through, "StrikeThrough") reader.add_special_character("/") end @@ -5267,7 +5414,8 @@ following content: ``` tex \documentclass{article} \usepackage{soul} -\usepackage[extension = strike-through.lua]{markdown} +\usepackage[extension = strike-through.lua, + debugExtensions]{markdown} \begin{document} \begin{markdown} This is //a lunar roving vehicle// strike-through text. @@ -5283,54 +5431,103 @@ following text: > This is ~~a lunar roving vehicle~~ strike-through text. +Furthermore, a JSON document named `document.debug-extensions.json` should also +be produced and contain the following text: + +``` json +{ + "Block": [ + "Blockquote", + "Verbatim", + "FencedCode (built-in fenced_code syntax extension)", + "ThematicBreak", + "BulletList", + "OrderedList", + "DisplayHtml", + "Heading" + ], + "BlockOrParagraph": [ + "Block", + "Paragraph", + "Plain" + ], + "EndlineExceptions": [ + "EndlineExceptions (built-in fenced_code syntax extension)" + ], + "Inline": [ + "Str", + "Space", + "Endline", + "EndlineBreak", + "LinkAndEmph", + "StrikeThrough (user-defined \"./strike-through.lua\" syntax extension)", + "Code", + "AutoLinkUrl", + "AutoLinkEmail", + "AutoLinkRelativeReference", + "InlineHtml", + "HtmlEntity", + "EscapedChar", + "Smart", + "Symbol" + ] +} +```````` + +This output shows us that our user-defined syntax extension has been correctly +inserted to the grammar of markdown. + % %<*tex> % \fi % \begin{macrocode} -\cs_generate_variant:Nn - \@@_add_lua_option:nnn - { nnV } -\@@_add_lua_option:nnV - { extensions } - { clist } - \c_empty_clist +\@@_add_lua_option:nnn + { debugExtensions } + { boolean } + { false } % \end{macrocode} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.extensions = {} +defaultOptions.debugExtensions = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `fancyLists` +#### Option `definitionLists` -`fancyLists` (default value: `false`) +`definitionLists` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{fancyLists}{\opt{true}, \opt{false}} +% \Optitem[false]{definitionLists}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [fancy list syntax extension][pandoc-fancy-lists]: + : Enable the pandoc definition list syntax extension: ``` md - a) first item - b) second item - c) third item - `````` + Term 1 -: false + : Definition 1 - : Disable the Pandoc fancy list syntax extension. + Term 2 with *inline markup* - [pandoc-fancy-lists]: https://pandoc.org/MANUAL.html#org-fancy-lists + : Definition 2 + + { some code, part of Definition 2 } + + Third paragraph of definition 2. + ````` + +: false + + : Disable the pandoc definition list syntax extension. % \end{markdown} % \iffalse @@ -5339,61 +5536,92 @@ defaultOptions.extensions = {} Using a text editor, create a text document named `document.tex` with the following content: -```` tex +``` tex \documentclass{article} -\usepackage{minted} -\usepackage[fancyLists]{markdown} +\usepackage[definitionLists]{markdown} \begin{document} \begin{markdown} -a) first item -b) second item -c) third item +Term 1 + +: Definition 1 + +Term 2 with *inline markup* + +: Definition 2 + + { some code, part of Definition 2 } + + Third paragraph of definition 2. \end{markdown} \end{document} ``````` Next, invoke LuaTeX from the terminal: ``` sh -lualatex --shell-escape document.tex +lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> a) first item -> b) second item -> c) third item +> Term 1 +> +> : Definition 1 +> +> Term 2 with *inline markup* +> +> : Definition 2 +> +> { some code, part of Definition 2 } +> +> Third paragraph of definition 2. ##### \Hologo{ConTeXt} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: -```` tex +``` tex \usemodule[t][markdown] -\setupmarkdown[fancyLists = yes] +\setupmarkdown[definitionLists = yes] \starttext \startmarkdown -a) first item -b) second item -c) third item +Term 1 + +: Definition 1 + +Term 2 with *inline markup* + +: Definition 2 + + { some code, part of Definition 2 } + + Third paragraph of definition 2. \stopmarkdown \stoptext ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the following text: -> a) first item -> b) second item -> c) third item +> Term 1 +> +> : Definition 1 +> +> Term 2 with *inline markup* +> +> : Definition 2 +> +> { some code, part of Definition 2 } +> +> Third paragraph of definition 2. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { fancyLists } + { definitionLists } { boolean } { false } % \end{macrocode} @@ -5402,166 +5630,122 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.fancyLists = false +defaultOptions.definitionLists = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `fencedCode` +#### Option `expectJekyllData` -`fencedCode` (default value: `false`) +`expectJekyllData` (default value: `false`) % \fi -% \begin{markdown} +% \markdownBegin % -% \Optitem[false]{fencedCode}{\opt{true}, \opt{false}} +% \Optitem[false]{expectJekyllData}{\opt{true}, \opt{false}} % -: true - - : Enable the commonmark fenced code block extension: +: false - ~~~~~~~~ md - ~~~ js - if (a > 3) { - moveShip(5 * gravity, DOWN); - } - ~~~~~~ + : When the \Opt{jekyllData} option is enabled, then a markdown document + may begin with \acro{yaml} metadata if and only if the metadata begin + with the end-of-directives marker (`---`) and they end with either the + end-of-directives or the end-of-document marker (`...`): - ``` html -
-            
-              // Some comments
-              line 1 of code
-              line 2 of code
-              line 3 of code
-            
-          
- ``` + ~~~~~ latex + \documentclass{article} + \usepackage[jekyllData]{markdown} + \begin{document} + \begin{markdown} + --- + - this + - is + - YAML + ... + - followed + - by + - Markdown + \end{markdown} + \begin{markdown} + - this + - is + - Markdown + \end{markdown} + \end{document} ~~~~~~~~~~~ -: false +: true - : Disable the commonmark fenced code block extension. + : When the \Opt{jekyllData} option is enabled, then a markdown document may + begin directly with \acro{yaml} metadata and may contain nothing but + \acro{yaml} metadata. -% \end{markdown} + ~~~~~ latex + \documentclass{article} + \usepackage[jekyllData, expectJekyllData]{markdown} + \begin{document} + \begin{markdown} + - this + - is + - YAML + ... + - followed + - by + - Markdown + \end{markdown} + \begin{markdown} + - this + - is + - YAML + \end{markdown} + \end{document} + ~~~~~~~~~~~ + +% \markdownEnd % \iffalse ##### \LaTeX{} Example {.unnumbered} -Using a text editor, create a text document named `document.tex` with the +Using a text editor, create a text document named `jane-doe.yml` with the following content: -```` tex +``` yaml +name: Jane Doe +age: 99 +``` +Using a text editor, create also a text document named `document.tex` with the +following content: +``` tex \documentclass{article} -\usepackage{minted} -\usepackage[fencedCode]{markdown} -\begin{document} -\begin{markdown} -~~~ js -if (a > 3) { - moveShip(5 * gravity, DOWN); +\usepackage[jekyllData]{markdown} +\markdownSetup{ + jekyllDataRenderers = { + name = {\gdef\name{#1}}, + code = {\gdef\age{#1}}, + }, + renderers = { + jekyllDataEnd = {\name{} is \age{} years old.}, + } } -~~~~~~ - - ``` html -
-    
-      // Some comments
-      line 1 of code
-      line 2 of code
-      line 3 of code
-    
-  
- ``` -\end{markdown} +\begin{document} +\markdownInput[expectJekyllData]{jane-doe.yml} \end{document} ``````` Next, invoke LuaTeX from the terminal: ``` sh -lualatex --shell-escape document.tex +lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> ``` js -> if (a > 3) { -> moveShip(5 * gravity, DOWN); -> } -> ``` -> -> ``` html ->
->   
->     // Some comments
->     line 1 of code
->     line 2 of code
->     line 3 of code
->   
-> 
-> ``` - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -```` tex -\usemodule[t][markdown] -\setupmarkdown[fencedCode = yes] -\definetyping [js] -\definetyping [html] -\setuptyping [html] [option=XML] -\starttext -\startmarkdown -~~~ js -if (a > 3) { - moveShip(5 * gravity, DOWN); -} -~~~~~~ - - ``` html -
-    
-      // Some comments
-      line 1 of code
-      line 2 of code
-      line 3 of code
-    
-  
- ``` -\stopmarkdown -\stoptext -```````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> ``` js -> if (a > 3) { -> moveShip(5 * gravity, DOWN); -> } -> ``` -> -> ``` html ->
->   
->     // Some comments
->     line 1 of code
->     line 2 of code
->     line 3 of code
->   
-> 
-> ``` +> Jane Doe is 99 years old. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { fencedCode } + { expectJekyllData } { boolean } { false } % \end{macrocode} @@ -5570,139 +5754,188 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.fencedCode = false +defaultOptions.expectJekyllData = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `fencedCodeAttributes` +#### Option `extensions` -`fencedCodeAttributes` (default value: `false`) +`extensions` (default value: `{}`) % \fi % \begin{markdown} % -% \Optitem[false]{fencedCodeAttributes}{\opt{true}, \opt{false}} +% \Valitem[\{\}]{extensions}{filenames} % -: true - - : Enable the Pandoc [fenced code attribute syntax extension][pandoc-fenced-code-attributes]: - - ```````` md - ~~~~ {#mycode .haskell .numberLines startFrom=100} - qsort [] = [] - qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ - qsort (filter (>= x) xs) - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``````````` - -: false - - : Disable the Pandoc fenced code attribute syntax extension. - - [pandoc-fenced-code-attributes]: https://pandoc.org/MANUAL.html#extension-fenced_code_attributes +: The filenames of user-defined syntax extensions that will be applied to the + markdown reader. If the \pkg{kpathsea} library is available, files will be + searched for not only in the current working directory but also in the + \TeX{} directory structure. +% A user-defined syntax extension is a Lua file in the following format: +% +% ``` lua +% local strike_through = { +% api_version = 2, +% grammar_version = 4, +% finalize_grammar = function(reader) +% local nonspacechar = lpeg.P(1) - lpeg.S("\t ") +% local doubleslashes = lpeg.P("//") +% local function between(p, starter, ender) +% ender = lpeg.B(nonspacechar) * ender +% return (starter * #nonspacechar +% * lpeg.Ct(p * (p - ender)^0) * ender) +% end +% +% local read_strike_through = between( +% lpeg.V("Inline"), doubleslashes, doubleslashes +% ) / function(s) return {"\\st{", s, "}"} end +% +% reader.insert_pattern("Inline after LinkAndEmph", read_strike_through, +% "StrikeThrough") +% reader.add_special_character("/") +% end +% } +% +% return strike_through +% ``````` +% +% The `api_version` and `grammar_version` fields specify the version of the +% user-defined syntax extension API and the markdown grammar for which +% the extension was written. See the current API and grammar versions +% below: +% +% \end{markdown} +% \iffalse +% +%<*lua> +% \fi +% \begin{macrocode} +metadata.user_extension_api_version = 2 +metadata.grammar_version = 4 +% \end{macrocode} +% \iffalse +% +%<*manual-options> +% \fi +% \begin{markdown} +% +% Any changes to the syntax extension API or grammar will cause the +% corresponding current version to be incremented. After Markdown 3.0.0, +% any changes to the API and the grammar will be either backwards-compatible +% or constitute a breaking change that will cause the major version of the +% Markdown package to increment (to 4.0.0). +% +% The `finalize_grammar` field is a function that finalizes the grammar of +% markdown using the interface of a Lua \luamref{reader} object, such as +% the \luamref{reader->insert_pattern} and +% \luamref{reader->add_special_character} methods, +% see Section <#sec:lua-user-extensions>. +% % \end{markdown} % \iffalse ##### \LaTeX{} Example {.unnumbered} -Using a text editor, create a text document named `document.tex` with the +Using a text editor, create a text document named `strike-through.lua` with the following content: -```` tex -\documentclass{article} -\usepackage[fencedCode, - fencedCodeAttributes]{markdown} -\usepackage{minted} -\markdownSetup{ - renderers = { - fencedCodeAttributeContextBegin = {% - \begingroup - \markdownSetup{ - renderers = { - attributeKeyValue = {% - \setminted{{#1} = {#2}}% - }, - }, - }% - }, - fencedCodeAttributeContextEnd = {% - \endgroup - }, - }, +``` lua +local strike_through = { + api_version = 2, + grammar_version = 4, + finalize_grammar = function(reader) + local nonspacechar = lpeg.P(1) - lpeg.S("\t ") + local doubleslashes = lpeg.P("//") + local function between(p, starter, ender) + ender = lpeg.B(nonspacechar) * ender + return (starter * #nonspacechar + * lpeg.Ct(p * (p - ender)^0) * ender) + end + + local read_strike_through = between( + lpeg.V("Inline"), doubleslashes, doubleslashes + ) / function(s) return {"\\st{", s, "}"} end + + reader.insert_pattern("Inline after LinkAndEmph", read_strike_through, + "StrikeThrough") + reader.add_special_character("/") + end } + +return strike_through +``````` +Using a text editor, create also a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage{soul} +\usepackage[extension = strike-through.lua]{markdown} \begin{document} \begin{markdown} -~~~ js {linenos=true} -if (a > 3) { - moveShip(5 * gravity, DOWN); -} -~~~~~~ +This is //a lunar roving vehicle// strike-through text. \end{markdown} \end{document} ``````` Next, invoke LuaTeX from the terminal: ``` sh -lualatex --shell-escape document.tex +lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> ``` js {.linenos} -> 1. if (a > 3) { -> 2. moveShip(5 * gravity, DOWN); -> 3. } -> `````` +> This is ~~a lunar roving vehicle~~ strike-through text. % %<*tex> % \fi % \begin{macrocode} -\@@_add_lua_option:nnn - { fencedCodeAttributes } - { boolean } - { false } +\cs_generate_variant:Nn + \@@_add_lua_option:nnn + { nnV } +\@@_add_lua_option:nnV + { extensions } + { clist } + \c_empty_clist % \end{macrocode} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.fencedCodeAttributes = false +defaultOptions.extensions = {} % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `fencedDivs` {#fenced-divs} +#### Option `fancyLists` -`fencedDivs` (default value: `false`) +`fancyLists` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{fencedDivs}{\opt{true}, \opt{false}} +% \Optitem[false]{fancyLists}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [fenced div syntax extension][pandoc-fenced-divs]: + : Enable the Pandoc [fancy list syntax extension][pandoc-fancy-lists]: ``` md - ::::: {#special .sidebar} - Here is a paragraph. - - And another. - ::::: + a) first item + b) second item + c) third item `````` : false - : Disable the Pandoc fenced div syntax extension. + : Disable the Pandoc fancy list syntax extension. - [pandoc-fenced-divs]: https://pandoc.org/MANUAL.html#extension-fenced_divs + [pandoc-fancy-lists]: https://pandoc.org/MANUAL.html#org-fancy-lists % \end{markdown} % \iffalse @@ -5713,16 +5946,13 @@ Using a text editor, create a text document named `document.tex` with the following content: ```` tex \documentclass{article} -\usepackage[fencedDivs]{markdown} +\usepackage{minted} +\usepackage[fancyLists]{markdown} \begin{document} -\begin{markdown}{slice=special} -Here is a regular paragraph. - -::::: {#special} -Here is a special paragraph. -::::: - -And here is another regular paragraph. +\begin{markdown} +a) first item +b) second item +c) third item \end{markdown} \end{document} ``````` @@ -5733,178 +5963,42 @@ lualatex --shell-escape document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> Here is a special paragraph. - -% -%<*tex> -% \fi -% \begin{macrocode} -\@@_add_lua_option:nnn - { fencedDivs } - { boolean } - { false } -% \end{macrocode} -% \iffalse -% -%<*lua,lua-cli> -% \fi -% \begin{macrocode} -defaultOptions.fencedDivs = false -% \end{macrocode} -% \par -% \iffalse -% -%<*manual-options> +> a) first item +> b) second item +> c) third item -#### Option `finalizeCache` - -`finalizeCache` (default value: `false`) - -% \fi -% \begin{markdown} -% -% \Optitem[false]{finalizeCache}{\opt{true}, \opt{false}} -% -: Whether an output file specified with the \Opt{frozenCacheFileName} option - (frozen cache) that contains a mapping between an enumeration of markdown - documents and their auxiliary cache files will be created. - - The frozen cache makes it possible to later typeset a plain \TeX{} - document that contains markdown documents without invoking Lua using - the \Opt{frozenCache} plain \TeX{} option. As a result, the - plain \TeX{} document becomes more portable, but further changes in the - order and the content of markdown documents will not be reflected. - -% \end{markdown} -% \iffalse - -##### Plain \TeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownOptionFinalizeCache{true} -\markdownBegin -Hello *world*! -\markdownEnd -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the text -“Hello *world*!” A frozen cache will also be produced as we requested using the -`finalizeCache` option. - -Next, change the content of `document.tex` as follows: -``` tex -\input markdown -\def\markdownOptionFrozenCache{true} -\markdownBegin -Hi *world*! -\markdownEnd -\bye -``````` -Last, invoke pdfTeX without shell access from the terminal: -``` sh -pdftex -no-shell-escape document.tex -`````` -A new PDF document named `document.pdf` should be produced and contain the -same text “Hello *world*!” Since we used the contents of the frozen cache using -the `\markdownOptionFrozenCache` option, we were able to typeset the document -without accessing the shell or invoking Lua, but the change in the content of -the markdown document from “Hello *world*!” to “Hi *world*!” was not reflected. - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass[finalizecache]{article} -\usepackage{markdown} -\begin{document} -\begin{markdown} -Hello *world*! -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the text -“Hello *world*!” A frozen cache will also be produced as we requested using the -`finalizecache` option. - -Next, change the content of `document.tex` as follows: -``` tex -\documentclass[frozencache]{article} -\usepackage{markdown} -\begin{document} -\begin{markdown} -Hi *world*! -\end{markdown} -\end{document} -``````` -Last, invoke pdfTeX without shell access from the terminal: -``` sh -pdflatex -no-shell-escape document.tex -`````` -A new PDF document named `document.pdf` should be produced and contain the -same text “Hello *world*!” Since we used the contents of the frozen cache using -the `\markdownOptionFrozenCache` option, we were able to typeset the document -without accessing the shell or invoking Lua, but the change in the content of -the markdown document from “Hello *world*!” to “Hi *world*!” was not reflected. - -##### \Hologo{ConTeXt} Example {.unnumbered} +##### \Hologo{ConTeXt} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: -``` tex +```` tex \usemodule[t][markdown] -\setupmarkdown[finalizeCache = yes] +\setupmarkdown[fancyLists = yes] \starttext \startmarkdown -Hello *world*! +a) first item +b) second item +c) third item \stopmarkdown \stoptext -``````` +```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the text -“Hello *world*!” A frozen cache will also be produced in the `cache.tex` -output file as we requested using the `finalizeCache` option. +context --luatex document.tex +````` +A PDF document named `document.pdf` should be produced and contain the +following text: -Next, change the content of `document.tex` as follows: -``` tex -\usemodule[t][markdown] -\setupmarkdown[frozenCache = yes] -\starttext -\startmarkdown -Hi *world*! -\stopmarkdown -\stoptext -``````` -Last, invoke pdfTeX without shell access from the terminal: -``` sh -context document.tex -`````` -A new PDF document named `document.pdf` should be produced and contain the -same text “Hello *world*!” Since we used the contents of the frozen cache using -the `\markdownOptionFrozenCache` option, we were able to typeset the document -without accessing the shell or invoking Lua, but the change in the content of -the markdown document from “Hello *world*!” to “Hi *world*!” was not reflected. +> a) first item +> b) second item +> c) third item % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { finalizeCache } + { fancyLists } { boolean } { false } % \end{macrocode} @@ -5913,95 +6007,48 @@ the markdown document from “Hello *world*!” to “Hi *world*!” was not ref %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.finalizeCache = false +defaultOptions.fancyLists = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `frozenCacheCounter` +#### Option `fencedCode` -`frozenCacheCounter` (default value: `0`) +`fencedCode` (default value: `true`) % \fi % \begin{markdown} % -% \Valitem[0]{frozenCacheCounter}{number} +% \Optitem[true]{fencedCode}{\opt{true}, \opt{false}} % -: The number of the current markdown document that will be stored in - an output file (frozen cache) when the \Opt{finalizeCache} is enabled. - When the document number is 0, then a new frozen cache will be created. - Otherwise, the frozen cache will be appended. - - Each frozen cache entry will define a \TeX{} macro - `\markdownFrozenCache`\meta{number} that will typeset markdown document - number \meta{number}. - -% \end{markdown} -% \iffalse - -##### Lua Module Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\directlua{ - local markdown = require("markdown") - local firstConvert = markdown.new({finalizeCache = true, frozenCacheCounter = 0}) - local firstInput = "Hello" - local secondConvert = markdown.new({finalizeCache = true, frozenCacheCounter = 1}) - local secondInput = "*world*!" - tex.sprint(firstConvert(firstInput) .. [[ ]] .. secondConvert(secondInput)) } -\bye -``````` -Then, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -``````` -A PDF document named `document.pdf` should be produced and contain the text -“Hello *world*!” A frozen cache with two entries will also be produced as we -requested using the `frozenCacheCounter` option. - -% -%<*tex> -% \fi -% \begin{macrocode} -\@@_add_lua_option:nnn - { frozenCacheCounter } - { counter } - { 0 } -% \end{macrocode} -% \iffalse -% -%<*lua,lua-cli> -% \fi -% \begin{macrocode} -defaultOptions.frozenCacheCounter = 0 -% \end{macrocode} -% \par -% \iffalse -% -%<*manual-options> - -#### Option `hardLineBreaks` +: true -`hardLineBreaks` (default value: `false`) + : Enable the commonmark fenced code block extension: -% \fi -% \begin{markdown} -% -% \Optitem[false]{hardLineBreaks}{\opt{true}, \opt{false}} -% -: true + ~~~~~~~~ md + ~~~ js + if (a > 3) { + moveShip(5 * gravity, DOWN); + } + ~~~~~~ - : Interpret all newlines within a paragraph as hard line breaks instead - of spaces. + ``` html +
+            
+              // Some comments
+              line 1 of code
+              line 2 of code
+              line 3 of code
+            
+          
+ ``` + ~~~~~~~~~~~ : false - : Interpret all newlines within a paragraph as spaces. + : Disable the commonmark fenced code block extension. % \end{markdown} % \iffalse @@ -6010,96 +6057,156 @@ defaultOptions.frozenCacheCounter = 0 Using a text editor, create a text document named `document.tex` with the following content: -``` tex +```` tex \documentclass{article} +\usepackage{minted} \usepackage{markdown} \begin{document} - \begin{markdown} -'Twas brillig, and the slithy toves -Did gyre and gimble in the wabe; -All mimsy were the borogoves, -And the mome raths outgrabe. -\end{markdown} - -\begin{markdown*}{hardLineBreaks} -'Twas brillig, and the slithy toves -Did gyre and gimble in the wabe; -All mimsy were the borogoves, -And the mome raths outgrabe. -\end{markdown*} +~~~ js +if (a > 3) { + moveShip(5 * gravity, DOWN); +} +~~~~~~ + ``` html +
+    
+      // Some comments
+      line 1 of code
+      line 2 of code
+      line 3 of code
+    
+  
+ ``` +\end{markdown} \end{document} ``````` Next, invoke LuaTeX from the terminal: ``` sh -lualatex document.tex +lualatex --shell-escape document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> 'Twas brillig, and the slithy toves -> Did gyre and gimble in the wabe; -> All mimsy were the borogoves, -> And the mome raths outgrabe. -> -> 'Twas brillig, and the slithy toves -> Did gyre and gimble in the wabe; -> All mimsy were the borogoves, -> And the mome raths outgrabe. - +> ``` js +> if (a > 3) { +> moveShip(5 * gravity, DOWN); +> } +> ``` +> +> ``` html +>
+>   
+>     // Some comments
+>     line 1 of code
+>     line 2 of code
+>     line 3 of code
+>   
+> 
+> ``` + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +```` tex +\usemodule[t][markdown] +\definetyping [js] +\definetyping [html] +\setuptyping [html] [option=XML] +\starttext +\startmarkdown +~~~ js +if (a > 3) { + moveShip(5 * gravity, DOWN); +} +~~~~~~ + + ``` html +
+    
+      // Some comments
+      line 1 of code
+      line 2 of code
+      line 3 of code
+    
+  
+ ``` +\stopmarkdown +\stoptext +```````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> ``` js +> if (a > 3) { +> moveShip(5 * gravity, DOWN); +> } +> ``` +> +> ``` html +>
+>   
+>     // Some comments
+>     line 1 of code
+>     line 2 of code
+>     line 3 of code
+>   
+> 
+> ``` + % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { hardLineBreaks } + { fencedCode } { boolean } - { false } + { true } % \end{macrocode} -% \begin{markdown} -% -% The hardLineBreaks option has been deprecated and will be removed in -% Markdown 3.0.0. From then on, all line breaks within a paragraph will -% be interpreted as soft line breaks. -% -% \end{markdown} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.hardLineBreaks = false +defaultOptions.fencedCode = true % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `hashEnumerators` +#### Option `fencedCodeAttributes` -`hashEnumerators` (default value: `false`) +`fencedCodeAttributes` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{hashEnumerators}{\opt{true}, \opt{false}} +% \Optitem[false]{fencedCodeAttributes}{\opt{true}, \opt{false}} % : true - : Enable the use of hash symbols (`#`) as ordered item list - markers: + : Enable the Pandoc [fenced code attribute syntax extension][pandoc-fenced-code-attributes]: - ``` md - #. Bird - #. McHale - #. Parish - `````` + ```````` md + ~~~~ {#mycode .haskell .numberLines startFrom=100} + qsort [] = [] + qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ + qsort (filter (>= x) xs) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ``````````` : false - : Disable the use of hash symbols (`#`) as ordered item list - markers. + : Disable the Pandoc fenced code attribute syntax extension. + + [pandoc-fenced-code-attributes]: https://pandoc.org/MANUAL.html#extension-fenced_code_attributes % \end{markdown} % \iffalse @@ -6108,90 +6215,57 @@ defaultOptions.hardLineBreaks = false Using a text editor, create a text document named `document.tex` with the following content: -``` tex +```` tex \documentclass{article} -\usepackage{markdown} +\usepackage[fencedCode, + fencedCodeAttributes]{markdown} +\usepackage{minted} +\markdownSetup{ + renderers = { + fencedCodeAttributeContextBegin = {% + \begingroup + \markdownSetup{ + renderers = { + attributeKeyValue = {% + \setminted{{#1} = {#2}}% + }, + }, + }% + }, + fencedCodeAttributeContextEnd = {% + \endgroup + }, + }, +} \begin{document} - \begin{markdown} -#. Bird -#. McHale -#. Parish +~~~ js {linenos=true} +if (a > 3) { + moveShip(5 * gravity, DOWN); +} +~~~~~~ \end{markdown} - -\begin{markdown*}{hashEnumerators} -#. Bird -#. McHale -#. Parish -\end{markdown*} - \end{document} ``````` Next, invoke LuaTeX from the terminal: ``` sh -lualatex document.tex +lualatex --shell-escape document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> . Bird -> ======== -> . McHale -> ======== -> . Parish -> ======== -> -> #. Bird -> #. McHale -> #. Parish - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\starttext - -\startmarkdown -#. Bird -#. McHale -#. Parish -\stopmarkdown - -\setupmarkdown[hashEnumerators = yes] -\startmarkdown -#. Bird -#. McHale -#. Parish -\stopmarkdown - -\stoptext -```````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> . Bird -> ======== -> . McHale -> ======== -> . Parish -> ======== -> -> #. Bird -> #. McHale -> #. Parish +> ``` js {.linenos} +> 1. if (a > 3) { +> 2. moveShip(5 * gravity, DOWN); +> 3. } +> `````` % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { hashEnumerators } + { fencedCodeAttributes } { boolean } { false } % \end{macrocode} @@ -6200,47 +6274,77 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.hashEnumerators = false +defaultOptions.fencedCodeAttributes = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `headerAttributes` {#header-attributes} +#### Option `fencedDivs` {#fenced-divs} -`headerAttributes` (default value: `false`) +`fencedDivs` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{headerAttributes}{\opt{true}, \opt{false}} +% \Optitem[false]{fencedDivs}{\opt{true}, \opt{false}} % : true - : Enable the assignment of HTML attributes to headings: + : Enable the Pandoc [fenced div syntax extension][pandoc-fenced-divs]: ``` md - # My first heading {#foo} - - ## My second heading ## {#bar .baz} + ::::: {#special .sidebar} + Here is a paragraph. - Yet another heading {key=value} - =================== + And another. + ::::: `````` : false - : Disable the assignment of HTML attributes to headings. + : Disable the Pandoc fenced div syntax extension. + + [pandoc-fenced-divs]: https://pandoc.org/MANUAL.html#extension-fenced_divs % \end{markdown} % \iffalse + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +```` tex +\documentclass{article} +\usepackage[fencedDivs]{markdown} +\begin{document} +\begin{markdown}{slice=special} +Here is a regular paragraph. + +::::: {#special} +Here is a special paragraph. +::::: + +And here is another regular paragraph. +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex --shell-escape document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> Here is a special paragraph. + % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { headerAttributes } + { fencedDivs } { boolean } { false } % \end{macrocode} @@ -6249,210 +6353,114 @@ defaultOptions.hashEnumerators = false %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.headerAttributes = false +defaultOptions.fencedDivs = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `html` +#### Option `finalizeCache` -`html` (default value: `false`) +`finalizeCache` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{html}{\opt{true}, \opt{false}} +% \Optitem[false]{finalizeCache}{\opt{true}, \opt{false}} % -: true - - : Enable the recognition of inline HTML tags, block HTML elements, - HTML comments, HTML instructions, and entities in the input. Inline - HTML tags, block HTML elements and HTML comments will be rendered, HTML - instructions will be ignored, and HTML entities will be replaced with - the corresponding Unicode codepoints. - -: false +: Whether an output file specified with the \Opt{frozenCacheFileName} option + (frozen cache) that contains a mapping between an enumeration of markdown + documents and their auxiliary cache files will be created. - : Disable the recognition of HTML markup. Any HTML markup in the input - will be rendered as plain text. + The frozen cache makes it possible to later typeset a plain \TeX{} + document that contains markdown documents without invoking Lua using + the \Opt{frozenCache} plain \TeX{} option. As a result, the + plain \TeX{} document becomes more portable, but further changes in the + order and the content of markdown documents will not be reflected. % \end{markdown} % \iffalse -##### Lua Module Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\input lmfonts -\directlua{ - local markdown = require("markdown") - local convert = markdown.new() - local newline = [[^^J^^J]] - local input = - "
*There is no block tag support.*
" .. newline .. - "*There is no support.*" .. newline .. - "_There is no support._" .. newline .. - "_There is no support._" - tex.sprint(convert(input)) } -\par -\directlua{ - local markdown = require("markdown") - local convert = markdown.new({html = true}) - local input = - "
*There is block tag support.*
" .. newline .. - "*There is support.*" .. newline .. - "_There is support._" .. newline .. - "_There is support._" - tex.sprint(convert(input)) } -\bye -``````` -Then, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -``````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> \
There is no block tag support.\
-> There is no \\ support. -> There is no \ support. -> There is no support. -> -> There is support. There is support. There is support. - -##### Lua CLI Example {.unnumbered} +##### Plain \TeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\input lmfonts -\input optionfalse -\par -\input optiontrue +\def\markdownOptionFinalizeCache{true} +\markdownBegin +Hello *world*! +\markdownEnd \bye ``````` -Using a text editor, create a text document named `content.md` with the -following content: -``` html -
-*Is there block tag support?* -
-*Is there support?* -_Is there support?_ -_Is there support?_ -```````` Next, invoke LuaTeX from the terminal: ``` sh -texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex -texlua ⟨CLI pathname⟩ html=true -- content.md optiontrue.tex luatex document.tex -``````` -where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, -such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or -`C:\Users\`\meta{Your username}`\texmf\scripts\markdown\markdown-cli.lua` on Windows -systems. Use the command `kpsewhich -a markdown-cli.lua` to locate the Lua CLI -script file using [Kpathsea][]. - -A PDF document named `document.pdf` should be produced and contain the -following text: - -> \
Is there block tag support?\
-> Is there \\ support? -> Is there \ support? -> Is there support? -> -> Is there support? Is there support? Is there support? - -##### Plain \TeX{} Example {.unnumbered} +`````` +A PDF document named `document.pdf` should be produced and contain the text +“Hello *world*!” A frozen cache will also be produced as we requested using the +`finalizeCache` option. -Using a text editor, create a text document named `document.tex` with the -following content: +Next, change the content of `document.tex` as follows: ``` tex \input markdown -\input lmfonts - -\markdownBegin -
-*There is no block tag support.* -
-*There is no support.* -_There is no support._ -_There is no support._ -\markdownEnd - -\def\markdownOptionHtml{true} +\def\markdownOptionFrozenCache{true} \markdownBegin -
-*There is block tag support.* -
-*There is support.* -_There is support._ -_There is support._ +Hi *world*! \markdownEnd - \bye ``````` -Next, invoke LuaTeX from the terminal: +Last, invoke pdfTeX without shell access from the terminal: ``` sh -luatex document.tex +pdftex -no-shell-escape document.tex `````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> \
There is no block tag support.\
-> There is no \\ support. -> There is no \ support. -> There is no support. -> -> There is support. There is support. There is support. +A new PDF document named `document.pdf` should be produced and contain the +same text “Hello *world*!” Since we used the contents of the frozen cache using +the `\markdownOptionFrozenCache` option, we were able to typeset the document +without accessing the shell or invoking Lua, but the change in the content of +the markdown document from “Hello *world*!” to “Hi *world*!” was not reflected. ##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex -\documentclass{article} +\documentclass[finalizecache]{article} \usepackage{markdown} \begin{document} - \begin{markdown} -
-*There is no block tag support.* -
-*There is no support.* -_There is no support._ -_There is no support._ +Hello *world*! \end{markdown} - -\begin{markdown*}{html} -
-*There is block tag support.* -
-*There is support.* -_There is support._ -_There is support._ -\end{markdown*} - \end{document} ``````` Next, invoke LuaTeX from the terminal: ``` sh lualatex document.tex `````` -A PDF document named `document.pdf` should be produced and contain the -following text: +A PDF document named `document.pdf` should be produced and contain the text +“Hello *world*!” A frozen cache will also be produced as we requested using the +`finalizecache` option. -> \
There is no block tag support.\
-> There is no \\ support. -> There is no \ support. -> There is no support. -> -> There is support. There is support. There is support. +Next, change the content of `document.tex` as follows: +``` tex +\documentclass[frozencache]{article} +\usepackage{markdown} +\begin{document} +\begin{markdown} +Hi *world*! +\end{markdown} +\end{document} +``````` +Last, invoke pdfTeX without shell access from the terminal: +``` sh +pdflatex -no-shell-escape document.tex +`````` +A new PDF document named `document.pdf` should be produced and contain the +same text “Hello *world*!” Since we used the contents of the frozen cache using +the `\markdownOptionFrozenCache` option, we were able to typeset the document +without accessing the shell or invoking Lua, but the change in the content of +the markdown document from “Hello *world*!” to “Hi *world*!” was not reflected. ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -6460,49 +6468,47 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] +\setupmarkdown[finalizeCache = yes] \starttext - \startmarkdown -
-*There is no block tag support.* -
-*There is no support.* -_There is no support._ -_There is no support._ +Hello *world*! \stopmarkdown +\stoptext +``````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the text +“Hello *world*!” A frozen cache will also be produced in the `cache.tex` +output file as we requested using the `finalizeCache` option. -\setupmarkdown[html = yes] +Next, change the content of `document.tex` as follows: +``` tex +\usemodule[t][markdown] +\setupmarkdown[frozenCache = yes] +\starttext \startmarkdown -
-*There is block tag support.* -
-*There is support.* -_There is support._ -_There is support._ +Hi *world*! \stopmarkdown - \stoptext -```````` -Next, invoke LuaTeX from the terminal: +``````` +Last, invoke LuaTeX from the terminal: ``` sh -context document.tex -````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> \
There is no block tag support.\
-> There is no \\ support. -> There is no \ support. -> There is no support. -> -> There is support. There is support. There is support. +context --luatex document.tex +`````` +A new PDF document named `document.pdf` should be produced and contain the +same text “Hello *world*!” Since we used the contents of the frozen cache using +the `\markdownOptionFrozenCache` option, we were able to typeset the document +without accessing the shell or invoking Lua, but the change in the content of +the markdown document from “Hello *world*!” to “Hi *world*!” was not reflected. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { html } + { finalizeCache } { boolean } { false } % \end{macrocode} @@ -6511,36 +6517,30 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.html = false +defaultOptions.finalizeCache = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `hybrid` +#### Option `frozenCacheCounter` -`hybrid` (default value: `false`) +`frozenCacheCounter` (default value: `0`) % \fi % \begin{markdown} % -% \Optitem[false]{hybrid}{\opt{true}, \opt{false}} +% \Valitem[0]{frozenCacheCounter}{number} % -: true - - : Disable the escaping of special plain \TeX{} characters, which makes it - possible to intersperse your markdown markup with \TeX{} code. The - intended usage is in documents prepared manually by a human author. - In such documents, it can often be desirable to mix \TeX{} and markdown - markup freely. - -: false +: The number of the current markdown document that will be stored in + an output file (frozen cache) when the \Opt{finalizeCache} is enabled. + When the document number is 0, then a new frozen cache will be created. + Otherwise, the frozen cache will be appended. - : Enable the escaping of special plain \TeX{} characters outside verbatim - environments, so that they are not interpretted by \TeX{}. This is - encouraged when typesetting automatically generated content or - markdown documents that were not prepared with this package in mind. + Each frozen cache entry will define a \TeX{} macro + `\markdownFrozenCache`\meta{number} that will typeset markdown document + number \meta{number}. % \end{markdown} % \iffalse @@ -6551,108 +6551,124 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 \directlua{ local markdown = require("markdown") - local input, convert_safe, convert_unsafe, paragraph - - input = [[$\string\sqrt{-1}$ *equals* $i$.]] - convert_safe = markdown.new() - convert_unsafe = markdown.new({hybrid = true}) - paragraph = [[\par]] - - tex.sprint( - convert_safe(input) .. paragraph .. - convert_unsafe(input) - ) -} + local firstConvert = markdown.new({finalizeCache = true, frozenCacheCounter = 0}) + local firstInput = "Hello" + local secondConvert = markdown.new({finalizeCache = true, frozenCacheCounter = 1}) + local secondInput = "*world*!" + tex.sprint(firstConvert(firstInput) .. [[ ]] .. secondConvert(secondInput)) } +\endgroup \bye ``````` Then, invoke LuaTeX from the terminal: ``` sh luatex document.tex ``````` -A PDF document named `document.pdf` should be produced and contain the -following text: +A PDF document named `document.pdf` should be produced and contain the text +“Hello *world*!” A frozen cache with two entries will also be produced as we +requested using the `frozenCacheCounter` option. -> \$\\sqrt {-1}\$ *equals* \$i\$. -> -> 1 -> *equals* -> i. +% +%<*tex> +% \fi +% \begin{macrocode} +\@@_add_lua_option:nnn + { frozenCacheCounter } + { counter } + { 0 } +% \end{macrocode} +% \iffalse +% +%<*lua,lua-cli> +% \fi +% \begin{macrocode} +defaultOptions.frozenCacheCounter = 0 +% \end{macrocode} +% \par +% \iffalse +% +%<*manual-options> -##### Lua CLI Example {.unnumbered} +#### Option `gfmAutoIdentifiers` -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\input lmfonts -\input optionfalse +`gfmAutoIdentifiers` (default value: `false`) -\begingroup -\catcode`\%=12 -\input optiontrue -\endgroup -\bye -``````` -Using a text editor, create a text document named `content.md` with the -following content: -``` md -$\sqrt{-1}$ *equals* $i$. -`````` -Next, invoke LuaTeX from the terminal: -``` sh -texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex -texlua ⟨CLI pathname⟩ hybrid=true -- content.md optiontrue.tex -luatex document.tex -``````` -where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, -such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or -`C:\Users\`\meta{Your username}`\texmf\scripts\markdown\markdown-cli.lua` on Windows -systems. Use the command `kpsewhich -a markdown-cli.lua` to locate the Lua CLI -script file using [Kpathsea][]. +% \fi +% \begin{markdown} +% \Optitem[false]{gfmAutoIdentifiers}{\opt{true}, \opt{false}} +% +: true -A PDF document named `document.pdf` should be produced and contain the -following text: + : Enable the Pandoc [GitHub-flavored auto identifiers syntax extension][pandoc-gfm-auto-identifiers]: -> \$\\sqrt {-1}\$ *equals* \$i\$. -> -> 1 -> *equals* -> i. + ``` md + The following heading received the identifier `123-sesame-street`: -##### Plain \TeX{} Example {.unnumbered} + # 123 Sesame Street + `````` -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\input lmfonts + false -\markdownBegin -$\sqrt{-1}$ *equals* $i$. -\markdownEnd + : Disable the Pandoc GitHub-flavored auto identifiers syntax extension. -\def\markdownOptionHybrid{true} -\markdownBegin -$\sqrt{-1}$ *equals* $i$. -\markdownEnd +See also the option \Opt{autoIdentifiers}. -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: + [pandoc-gfm-auto-identifiers]: https://pandoc.org/MANUAL.html#extension-gfm_auto_identifiers -> \$\\sqrt {-1}\$ *equals* \$i\$. -> -> 1 -> *equals* -> i. +% \end{markdown} +% \iffalse +% +%<*tex> +% \fi +% \begin{macrocode} +\@@_add_lua_option:nnn + { gfmAutoIdentifiers } + { boolean } + { false } +% \end{macrocode} +% \iffalse +% +%<*lua,lua-cli> +% \fi +% \begin{macrocode} +defaultOptions.gfmAutoIdentifiers = false +% \end{macrocode} +% \par +% \iffalse +% +%<*manual-options> + +#### Option `hashEnumerators` + +`hashEnumerators` (default value: `false`) + +% \fi +% \begin{markdown} +% +% \Optitem[false]{hashEnumerators}{\opt{true}, \opt{false}} +% +: true + + : Enable the use of hash symbols (`#`) as ordered item list + markers: + + ``` md + #. Bird + #. McHale + #. Parish + `````` + +: false + + : Disable the use of hash symbols (`#`) as ordered item list + markers. + +% \end{markdown} +% \iffalse ##### \LaTeX{} Example {.unnumbered} @@ -6664,12 +6680,16 @@ following content: \begin{document} \begin{markdown} -$\sqrt{-1}$ *equals* $i$. +#. Bird +#. McHale +#. Parish \end{markdown} -\begin{markdown*}{hybrid} -$\sqrt{-1}$ *equals* $i$. -\end{markdown*} +\begin{markdown}[hashEnumerators] +#. Bird +#. McHale +#. Parish +\end{markdown} \end{document} ``````` @@ -6680,11 +6700,16 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> \$\\sqrt {-1}\$ *equals* \$i\$. +> . Bird +> ======== +> . McHale +> ======== +> . Parish +> ======== > -> 1 -> *equals* -> i. +> #. Bird +> #. McHale +> #. Parish ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -6695,35 +6720,44 @@ following content: \starttext \startmarkdown -$\sqrt{-1}$ *equals* $i$. +#. Bird +#. McHale +#. Parish \stopmarkdown -\setupmarkdown[hybrid = yes] +\setupmarkdown[hashEnumerators = yes] \startmarkdown -$\sqrt{-1}$ *equals* $i$. +#. Bird +#. McHale +#. Parish \stopmarkdown \stoptext ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the following text: -> \$\\sqrt {-1}\$ *equals* \$i\$. +> . Bird +> ======== +> . McHale +> ======== +> . Parish +> ======== > -> 1 -> *equals* -> i. +> #. Bird +> #. McHale +> #. Parish % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { hybrid } + { hashEnumerators } { boolean } { false } % \end{macrocode} @@ -6732,94 +6766,47 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.hybrid = false +defaultOptions.hashEnumerators = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `inlineCodeAttributes` +#### Option `headerAttributes` {#header-attributes} -`inlineCodeAttributes` (default value: `false`) +`headerAttributes` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{inlineCodeAttributes}{\opt{true}, \opt{false}} +% \Optitem[false]{headerAttributes}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [inline code span attribute extension][pandoc-inline-code-attributes]: + : Enable the assignment of HTML attributes to headings: ``` md - `<$>`{.haskell} + # My first heading {#foo} + + ## My second heading ## {#bar .baz} + + Yet another heading {key=value} + =================== `````` : false - : Enable the Pandoc inline code span attribute extension. - - [pandoc-inline-code-attributes]: https://pandoc.org/MANUAL.html#extension-inline_code_attributes + : Disable the assignment of HTML attributes to headings. % \end{markdown} % \iffalse - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -```` tex -\documentclass{article} -\usepackage[inlineCodeAttributes]{markdown} -\usepackage{expl3} -\ExplSyntaxOn -\markdownSetup{ - renderers = { - codeSpanAttributeContextBegin = { - \group_begin: - \color_group_begin: - \markdownSetup{ - renderers = { - attributeKeyValue = { - \str_if_eq:nnT - { ##1 } - { color } - { - \color_select:n { ##2 } - } - }, - }, - } - }, - codeSpanAttributeContextEnd = { - \color_group_end: - \group_end: - }, - }, -} -\ExplSyntaxOff -\begin{document} -\begin{markdown} -Here is some `colored text`{color=red}. -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> Here is some `colored text`. - % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { inlineCodeAttributes } + { headerAttributes } { boolean } { false } % \end{macrocode} @@ -6828,54 +6815,204 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.inlineCodeAttributes = false +defaultOptions.headerAttributes = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `inlineNotes` +#### Option `html` -`inlineNotes` (default value: `false`) +`html` (default value: `true`) % \fi % \begin{markdown} % -% \Optitem[false]{inlineNotes}{\opt{true}, \opt{false}} +% \Optitem[true]{html}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [inline note syntax extension][pandoc-inline-notes]: - - ``` md - Here is an inline note.^[Inlines notes are easier to - write, since you don't have to pick an identifier and - move down to type the note.] - `````` + : Enable the recognition of inline HTML tags, block HTML elements, + HTML comments, HTML instructions, and entities in the input. Inline + HTML tags, block HTML elements and HTML comments will be rendered, HTML + instructions will be ignored, and HTML entities will be replaced with + the corresponding Unicode codepoints. : false - : Disable the Pandoc inline note syntax extension. - - [pandoc-inline-notes]: https://pandoc.org/MANUAL.html#extension-inline_notes + : Disable the recognition of HTML markup. Any HTML markup in the input + will be rendered as plain text. % \end{markdown} % \iffalse +##### Lua Module Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\directlua{ + local markdown = require("markdown") + local convert = markdown.new({html = false}) + local newline = [[^^J^^J]] + local input = + "
*There is no block tag support.*
" .. newline .. + "*There is no support.*" .. newline .. + "_There is no support._" .. newline .. + "_There is no support._" + tex.sprint(convert(input)) } +\par +\directlua{ + local markdown = require("markdown") + local convert = markdown.new() + local input = + "
*There is block tag support.*
" .. newline .. + "*There is support.*" .. newline .. + "_There is support._" .. newline .. + "_There is support._" + tex.sprint(convert(input)) } +\endgroup +\bye +``````` +Then, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +``````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> \
There is no block tag support.\
+> There is no \\ support. +> There is no \ support. +> There is no support. +> +> There is support. There is support. There is support. + +##### Lua CLI Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\input optionfalse +\par +\input optiontrue +\endgroup +\bye +``````` +Using a text editor, create a text document named `content.md` with the +following content: +``` html +
+*Is there block tag support?* +
+*Is there support?* +_Is there support?_ +_Is there support?_ +```````` +Next, invoke LuaTeX from the terminal: +``` sh +texlua ⟨CLI pathname⟩ html=false -- content.md optionfalse.tex +texlua ⟨CLI pathname⟩ -- content.md optiontrue.tex +luatex document.tex +``````` +where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, +such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or +`C:\Users\`\meta{Your username}`\texmf\scripts\markdown\markdown-cli.lua` on Windows +systems. Use the command `kpsewhich -a markdown-cli.lua` to locate the Lua CLI +script file using [Kpathsea][]. + +A PDF document named `document.pdf` should be produced and contain the +following text: + +> \
Is there block tag support?\
+> Is there \\ support? +> Is there \ support? +> Is there support? +> +> Is there support? Is there support? Is there support? + +##### Plain \TeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\input lmfonts + +\def\markdownOptionHtml{false} +\markdownBegin +
+*There is no block tag support.* +
+*There is no support.* +_There is no support._ +_There is no support._ +\markdownEnd + +\def\markdownOptionHtml{true} +\markdownBegin +
+*There is block tag support.* +
+*There is support.* +_There is support._ +_There is support._ +\markdownEnd + +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> \
There is no block tag support.\
+> There is no \\ support. +> There is no \ support. +> There is no support. +> +> There is support. There is support. There is support. + ##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[inlineNotes]{markdown} +\usepackage{markdown} \begin{document} + +\begin{markdown}[html = false] +
+*There is no block tag support.* +
+*There is no support.* +_There is no support._ +_There is no support._ +\end{markdown} + \begin{markdown} -Here is an inline note.^[Inlines notes are easier to -write, since you don't have to pick an identifier and -move down to type the note.] +
+*There is block tag support.* +
+*There is support.* +_There is support._ +_There is support._ \end{markdown} + \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -6885,9 +7022,12 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> Here is an inline note.^[Inlines notes are easier to -> write, since you don't have to pick an identifier and -> move down to type the note.] +> \
There is no block tag support.\
+> There is no \\ support. +> There is no \ support. +> There is no support. +> +> There is support. There is support. There is support. ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -6895,120 +7035,191 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[inlineNotes = yes] \starttext + +\setupmarkdown[html = no] \startmarkdown -Here is an inline note.^[Inlines notes are easier to -write, since you don't have to pick an identifier and -move down to type the note.] +
+*There is no block tag support.* +
+*There is no support.* +_There is no support._ +_There is no support._ \stopmarkdown -\stoptext -```````` -Next, invoke LuaTeX from the terminal: + +\setupmarkdown[html = yes] +\startmarkdown +
+*There is block tag support.* +
+*There is support.* +_There is support._ +_There is support._ +\stopmarkdown + +\stoptext +```````` +Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the following text: -> Here is an inline note.^[Inlines notes are easier to -> write, since you don't have to pick an identifier and -> move down to type the note.] +> \
There is no block tag support.\
+> There is no \\ support. +> There is no \ support. +> There is no support. +> +> There is support. There is support. There is support. % %<*tex> % \fi -% \begin{markdown} -% -% The inlineFootnotes option has been deprecated and will be removed in -% Markdown 3.0.0. -% -% \end{markdown} % \begin{macrocode} \@@_add_lua_option:nnn - { inlineFootnotes } - { boolean } - { false } -\@@_add_lua_option:nnn - { inlineNotes } + { html } { boolean } - { false } + { true } % \end{macrocode} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.inlineFootnotes = false -defaultOptions.inlineNotes = false +defaultOptions.html = true % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `jekyllData` +#### Option `hybrid` -`jekyllData` (default value: `false`) +`hybrid` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{jekyllData}{\opt{true}, \opt{false}} +% \Optitem[false]{hybrid}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [\acro{yaml} metadata block syntax - extension][pandoc-yaml-metadata-block] for entering - metadata in \acro{yaml}: - - ~~~~~~ yaml - --- - title: 'This is the title: it contains a colon' - author: - - Author One - - Author Two - keywords: [nothing, nothingness] - abstract: | - This is the abstract. - - It consists of two paragraphs. - --- - ~~~~~~~~~~~ + : Disable the escaping of special plain \TeX{} characters, which makes it + possible to intersperse your markdown markup with \TeX{} code. The + intended usage is in documents prepared manually by a human author. + In such documents, it can often be desirable to mix \TeX{} and markdown + markup freely. : false - : Disable the Pandoc \acro{yaml} metadata block syntax extension - for entering metadata in \acro{yaml}. - - [pandoc-yaml-metadata-block]: https://pandoc.org/MANUAL.html#extension-yaml_metadata_block + : Enable the escaping of special plain \TeX{} characters outside verbatim + environments, so that they are not interpretted by \TeX{}. This is + encouraged when typesetting automatically generated content or + markdown documents that were not prepared with this package in mind. % \end{markdown} % \iffalse +##### Lua Module Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\directlua{ + local markdown = require("markdown") + local input, convert_safe, convert_unsafe, paragraph + + input = [[$\string\sqrt{-1}$ *equals* $i$.]] + convert_safe = markdown.new() + convert_unsafe = markdown.new({hybrid = true}) + paragraph = [[\par]] + + tex.sprint( + convert_safe(input) .. paragraph .. + convert_unsafe(input) + ) +} +\endgroup +\bye +``````` +Then, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +``````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> \$\\sqrt {-1}\$ *equals* \$i\$. +> +> 1 +> *equals* +> i. + +##### Lua CLI Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\input optionfalse +\par +\input optiontrue +\endgroup +\bye +``````` +Using a text editor, create a text document named `content.md` with the +following content: +``` md +$\sqrt{-1}$ *equals* $i$. +`````` +Next, invoke LuaTeX from the terminal: +``` sh +texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex +texlua ⟨CLI pathname⟩ hybrid=true -- content.md optiontrue.tex +luatex document.tex +``````` +where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, +such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or +`C:\Users\`\meta{Your username}`\texmf\scripts\markdown\markdown-cli.lua` on Windows +systems. Use the command `kpsewhich -a markdown-cli.lua` to locate the Lua CLI +script file using [Kpathsea][]. + +A PDF document named `document.pdf` should be produced and contain the +following text: + +> \$\\sqrt {-1}\$ *equals* \$i\$. +> +> 1 +> *equals* +> i. + ##### Plain \TeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownOptionJekyllData{true} -\ExplSyntaxOn -\keys_define:nn - { markdown/jekyllData } - { - name .code:n = { \gdef\name{#1} }, - age .code:n = { \gdef\age{#1} }, - } -\ExplSyntaxOff -\def\markdownRendererJekyllDataEnd{% - \name{} is \age{} years old.} +\input lmfonts + \markdownBegin ---- -name: Jane Doe -age: 99 ---- +$\sqrt{-1}$ *equals* $i$. +\markdownEnd + +\def\markdownOptionHybrid{true} +\markdownBegin +$\sqrt{-1}$ *equals* $i$. \markdownEnd + \bye ``````` Next, invoke LuaTeX from the terminal: @@ -7018,7 +7229,11 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> Jane Doe is 99 years old. +> \$\\sqrt {-1}\$ *equals* \$i\$. +> +> 1 +> *equals* +> i. ##### \LaTeX{} Example {.unnumbered} @@ -7026,23 +7241,15 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[jekyllData]{markdown} -\markdownSetup{ - jekyllDataRenderers = { - name = {\gdef\name{#1}}, - code = {\gdef\age{#1}}, - }, - renderers = { - jekyllDataEnd = {\name{} is \age{} years old.}, - } -} +\usepackage{markdown} \begin{document} \begin{markdown} ---- -name: Jane Doe -age: 99 ---- +$\sqrt{-1}$ *equals* $i$. +\end{markdown} + +\begin{markdown}[hybrid] +$\sqrt{-1}$ *equals* $i$. \end{markdown} \end{document} @@ -7054,7 +7261,11 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> Jane Doe is 99 years old. +> \$\\sqrt {-1}\$ *equals* \$i\$. +> +> 1 +> *equals* +> i. ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -7062,43 +7273,38 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[jekyllData = yes] -\ExplSyntaxOn -\keys_define:nn - { markdown/jekyllData } - { - name .code:n = { \gdef\name{#1} }, - age .code:n = { \gdef\age{#1} }, - } -\ExplSyntaxOff -\def\markdownRendererJekyllDataEnd{% - \name{} is \age{} years old.} \starttext \startmarkdown ---- -name: Jane Doe -age: 99 ---- +$\sqrt{-1}$ *equals* $i$. +\stopmarkdown + +\setupmarkdown[hybrid = yes] +\startmarkdown +$\sqrt{-1}$ *equals* $i$. \stopmarkdown \stoptext -``````` +```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex -`````` +context --luatex document.tex +````` A PDF document named `document.pdf` should be produced and contain the following text: -> Jane Doe is 99 years old. +> \$\\sqrt {-1}\$ *equals* \$i\$. +> +> 1 +> *equals* +> i. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { jekyllData } + { hybrid } { boolean } { false } % \end{macrocode} @@ -7107,39 +7313,35 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.jekyllData = false +defaultOptions.hybrid = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `linkAttributes` +#### Option `inlineCodeAttributes` -`linkAttributes` (default value: `false`) +`inlineCodeAttributes` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{linkAttributes}{\opt{true}, \opt{false}} +% \Optitem[false]{inlineCodeAttributes}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [link and image attribute syntax - extension][pandoc-link-attributes]: + : Enable the Pandoc [inline code span attribute extension][pandoc-inline-code-attributes]: ``` md - An inline ![image](foo.jpg){#id .class width=30 height=20px} - and a reference ![image][ref] with attributes. - - [ref]: foo.jpg "optional title" {#id .class key=val key2=val2} - `````` + `<$>`{.haskell} + `````` : false - : Enable the Pandoc link and image attribute syntax extension. + : Enable the Pandoc inline code span attribute extension. - [pandoc-link-attributes]: https://pandoc.org/MANUAL.html#extension-link_attributes + [pandoc-inline-code-attributes]: https://pandoc.org/MANUAL.html#extension-inline_code_attributes % \end{markdown} % \iffalse @@ -7150,24 +7352,29 @@ Using a text editor, create a text document named `document.tex` with the following content: ```` tex \documentclass{article} -\usepackage[linkAttributes]{markdown} -\usepackage{expl3, graphicx} +\usepackage[inlineCodeAttributes]{markdown} +\usepackage{expl3} \ExplSyntaxOn \markdownSetup{ renderers = { - imageAttributeContextBegin = { + codeSpanAttributeContextBegin = { \group_begin: + \color_group_begin: \markdownSetup{ renderers = { attributeKeyValue = { - \setkeys - { Gin } - { { ##1 } = { ##2 } } + \str_if_eq:nnT + { ##1 } + { color } + { + \color_select:n { ##2 } + } }, }, } }, - imageAttributeContextEnd = { + codeSpanAttributeContextEnd = { + \color_group_end: \group_end: }, }, @@ -7175,9 +7382,7 @@ following content: \ExplSyntaxOff \begin{document} \begin{markdown} -Here is an example image: - - ![example image](example-image){width=5cm height=4cm} +Here is some `colored text`{color=red}. \end{markdown} \end{document} ``````` @@ -7185,17 +7390,17 @@ Next, invoke LuaTeX from the terminal: ``` sh lualatex document.tex `````` -A PDF document named `document.pdf` should be produced and contain an example -image (from [Martin Scharrer's mwe package][mwe]) displayed at size 5cm × 4cm. +A PDF document named `document.pdf` should be produced and contain the +following text: - [mwe]: https://ctan.org/pkg/mwe (mwe – Packages and image files for MWEs) +> Here is some `colored text`. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { linkAttributes } + { inlineCodeAttributes } { boolean } { false } % \end{macrocode} @@ -7204,84 +7409,53 @@ image (from [Martin Scharrer's mwe package][mwe]) displayed at size 5cm × 4cm. %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.linkAttributes = false +defaultOptions.inlineCodeAttributes = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `lineBlocks` +#### Option `inlineNotes` -`lineBlocks` (default value: `false`) +`inlineNotes` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{lineBlocks}{\opt{true}, \opt{false}} +% \Optitem[false]{inlineNotes}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [line block syntax - extension][pandoc-line-blocks]: + : Enable the Pandoc [inline note syntax extension][pandoc-inline-notes]: ``` md - | this is a line block that - | spans multiple - | even - discontinuous - | lines + Here is an inline note.^[Inlines notes are easier to + write, since you don't have to pick an identifier and + move down to type the note.] `````` : false - : Disable the Pandoc line block syntax extension. + : Disable the Pandoc inline note syntax extension. - [pandoc-line-blocks]: https://pandoc.org/MANUAL.html#extension-line_blocks + [pandoc-inline-notes]: https://pandoc.org/MANUAL.html#extension-inline_notes % \end{markdown} % \iffalse -##### Plain \TeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownOptionLineBlocks{true} -\markdownBegin -| I would spread the cloths under your feet: -| But I, being poor, have only my dreams; -| I have spread my dreams under your feet; -| Tread softly because you tread on my dreams. -\markdownEnd -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> | I would spread the cloths under your feet: -> | But I, being poor, have only my dreams; -> | I have spread my dreams under your feet; -> | Tread softly because you tread on my dreams. - ##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[lineBlocks]{markdown} +\usepackage[inlineNotes]{markdown} \begin{document} \begin{markdown} -| I would spread the cloths under your feet: -| But I, being poor, have only my dreams; -| I have spread my dreams under your feet; -| Tread softly because you tread on my dreams. +Here is an inline note.^[Inlines notes are easier to +write, since you don't have to pick an identifier and +move down to type the note.] \end{markdown} \end{document} ``````` @@ -7292,10 +7466,9 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> | I would spread the cloths under your feet: -> | But I, being poor, have only my dreams; -> | I have spread my dreams under your feet; -> | Tread softly because you tread on my dreams. +> Here is an inline note.^[Inlines notes are easier to +> write, since you don't have to pick an identifier and +> move down to type the note.] ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -7303,34 +7476,32 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[lineBlocks = yes] +\setupmarkdown[inlineNotes = yes] \starttext \startmarkdown -| I would spread the cloths under your feet: -| But I, being poor, have only my dreams; -| I have spread my dreams under your feet; -| Tread softly because you tread on my dreams. +Here is an inline note.^[Inlines notes are easier to +write, since you don't have to pick an identifier and +move down to type the note.] \stopmarkdown \stoptext -``````` +```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex -`````` +context --luatex document.tex +````` A PDF document named `document.pdf` should be produced and contain the following text: -> | I would spread the cloths under your feet: -> | But I, being poor, have only my dreams; -> | I have spread my dreams under your feet; -> | Tread softly because you tread on my dreams. +> Here is an inline note.^[Inlines notes are easier to +> write, since you don't have to pick an identifier and +> move down to type the note.] % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { lineBlocks } + { inlineNotes } { boolean } { false } % \end{macrocode} @@ -7339,82 +7510,111 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.lineBlocks = false +defaultOptions.inlineNotes = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `notes` +#### Option `jekyllData` -`notes` (default value: `false`) +`jekyllData` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{notes}{\opt{true}, \opt{false}} +% \Optitem[false]{jekyllData}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [note syntax extension][pandoc-footnotes]: - - ``` md - Here is a note reference,[^1] and another.[^longnote] - - [^1]: Here is the note. - - [^longnote]: Here's one with multiple blocks. - - Subsequent paragraphs are indented to show that they - belong to the previous note. - - { some.code } + : Enable the Pandoc [\acro{yaml} metadata block syntax + extension][pandoc-yaml-metadata-block] for entering + metadata in \acro{yaml}: - The whole paragraph can be indented, or just the - first line. In this way, multi-paragraph notes - work like multi-paragraph list items. + ~~~~~~ yaml + --- + title: 'This is the title: it contains a colon' + author: + - Author One + - Author Two + keywords: [nothing, nothingness] + abstract: | + This is the abstract. - This paragraph won't be part of the note, because it - isn't indented. - `````` + It consists of two paragraphs. + --- + ~~~~~~~~~~~ : false - : Disable the Pandoc note syntax extension. + : Disable the Pandoc \acro{yaml} metadata block syntax extension + for entering metadata in \acro{yaml}. - [pandoc-footnotes]: https://pandoc.org/MANUAL.html#extension-footnotes + [pandoc-yaml-metadata-block]: https://pandoc.org/MANUAL.html#extension-yaml_metadata_block % \end{markdown} % \iffalse -##### \LaTeX{} Example {.unnumbered} +##### Plain \TeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex -\documentclass{article} -\usepackage[notes]{markdown} -\begin{document} -\begin{markdown} -Here is a note reference,[^1] and another.[^longnote] - -[^1]: Here is the note. - -[^longnote]: Here's one with multiple blocks. +\input markdown +\def\markdownOptionJekyllData{true} +\ExplSyntaxOn +\keys_define:nn + { markdown/jekyllData } + { + name .code:n = { \gdef\name{#1} }, + age .code:n = { \gdef\age{#1} }, + } +\ExplSyntaxOff +\def\markdownRendererJekyllDataEnd{% + \name{} is \age{} years old.} +\markdownBegin +--- +name: Jane Doe +age: 99 +--- +\markdownEnd +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: - Subsequent paragraphs are indented to show that they -belong to the previous note. +> Jane Doe is 99 years old. - { some.code } +##### \LaTeX{} Example {.unnumbered} - The whole paragraph can be indented, or just the - first line. In this way, multi-paragraph notes - work like multi-paragraph list items. +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[jekyllData]{markdown} +\markdownSetup{ + jekyllDataRenderers = { + name = {\gdef\name{#1}}, + code = {\gdef\age{#1}}, + }, + renderers = { + jekyllDataEnd = {\name{} is \age{} years old.}, + } +} +\begin{document} -This paragraph won't be part of the note, because it -isn't indented. +\begin{markdown} +--- +name: Jane Doe +age: 99 +--- \end{markdown} + \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -7424,23 +7624,7 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> Here is a note reference,[^1] and another.[^longnote] -> -> [^1]: Here is the note. -> -> [^longnote]: Here's one with multiple blocks. -> -> Subsequent paragraphs are indented to show that they -> belong to the previous note. -> -> { some.code } -> -> The whole paragraph can be indented, or just the -> first line. In this way, multi-paragraph notes -> work like multi-paragraph list items. -> -> This paragraph won't be part of the note, because it -> isn't indented. +> Jane Doe is 99 years old. ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -7448,70 +7632,43 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[notes = yes] +\setupmarkdown[jekyllData = yes] +\ExplSyntaxOn +\keys_define:nn + { markdown/jekyllData } + { + name .code:n = { \gdef\name{#1} }, + age .code:n = { \gdef\age{#1} }, + } +\ExplSyntaxOff +\def\markdownRendererJekyllDataEnd{% + \name{} is \age{} years old.} \starttext -\startmarkdown -Here is a note reference,[^1] and another.[^longnote] - -[^1]: Here is the note. - -[^longnote]: Here's one with multiple blocks. - - Subsequent paragraphs are indented to show that they -belong to the previous note. - - { some.code } - - The whole paragraph can be indented, or just the - first line. In this way, multi-paragraph notes - work like multi-paragraph list items. -This paragraph won't be part of the note, because it -isn't indented. +\startmarkdown +--- +name: Jane Doe +age: 99 +--- \stopmarkdown + \stoptext -```````` +``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex -````` +context --luatex document.tex +`````` A PDF document named `document.pdf` should be produced and contain the following text: -> Here is a note reference,[^1] and another.[^longnote] -> -> [^1]: Here is the note. -> -> [^longnote]: Here's one with multiple blocks. -> -> Subsequent paragraphs are indented to show that they -> belong to the previous note. -> -> { some.code } -> -> The whole paragraph can be indented, or just the -> first line. In this way, multi-paragraph notes -> work like multi-paragraph list items. -> -> This paragraph won't be part of the note, because it -> isn't indented. +> Jane Doe is 99 years old. % %<*tex> % \fi -% \begin{markdown} -% -% The footnotes option has been deprecated and will be removed in -% Markdown 3.0.0. -% -% \end{markdown} % \begin{macrocode} \@@_add_lua_option:nnn - { footnotes } - { boolean } - { false } -\@@_add_lua_option:nnn - { notes } + { jekyllData } { boolean } { false } % \end{macrocode} @@ -7520,38 +7677,39 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.footnotes = false -defaultOptions.notes = false +defaultOptions.jekyllData = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `pipeTables` {#pipe-tables} +#### Option `linkAttributes` -`pipeTables` (default value: `false`) +`linkAttributes` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{pipeTables}{\opt{true}, \opt{false}} +% \Optitem[false]{linkAttributes}{\opt{true}, \opt{false}} % : true - : Enable the \acro{PHP} Markdown pipe table syntax extension: + : Enable the Pandoc [link and image attribute syntax + extension][pandoc-link-attributes]: ``` md - | Right | Left | Default | Center | - |------:|:-----|---------|:------:| - | 12 | 12 | 12 | 12 | - | 123 | 123 | 123 | 123 | - | 1 | 1 | 1 | 1 | + An inline ![image](foo.jpg){#id .class width=30 height=20px} + and a reference ![image][ref] with attributes. + + [ref]: foo.jpg "optional title" {#id .class key=val key2=val2} `````` : false - : Disable the \acro{PHP} Markdown pipe table syntax extension. + : Enable the Pandoc link and image attribute syntax extension. + + [pandoc-link-attributes]: https://pandoc.org/MANUAL.html#extension-link_attributes % \end{markdown} % \iffalse @@ -7560,16 +7718,36 @@ defaultOptions.notes = false Using a text editor, create a text document named `document.tex` with the following content: -``` tex +```` tex \documentclass{article} -\usepackage[pipeTables]{markdown} +\usepackage[linkAttributes]{markdown} +\usepackage{expl3, graphicx} +\ExplSyntaxOn +\markdownSetup{ + renderers = { + imageAttributeContextBegin = { + \group_begin: + \markdownSetup{ + renderers = { + attributeKeyValue = { + \setkeys + { Gin } + { { ##1 } = { ##2 } } + }, + }, + } + }, + imageAttributeContextEnd = { + \group_end: + }, + }, +} +\ExplSyntaxOff \begin{document} \begin{markdown} -| Right | Left | Default | Center | -|------:|:-----|---------|:------:| -| 12 | 12 | 12 | 12 | -| 123 | 123 | 123 | 123 | -| 1 | 1 | 1 | 1 | +Here is an example image: + + ![example image](example-image){width=5cm height=4cm} \end{markdown} \end{document} ``````` @@ -7577,91 +7755,17 @@ Next, invoke LuaTeX from the terminal: ``` sh lualatex document.tex `````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> | Right | Left | Default | Center | -> |------:|:-----|---------|:------:| -> | 12 | 12 | 12 | 12 | -> | 123 | 123 | 123 | 123 | -> | 1 | 1 | 1 | 1 | - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\setupmarkdown[pipeTables = yes] -\starttext -\startmarkdown -| Right | Left | Default | Center | -|------:|:-----|---------|:------:| -| 12 | 12 | 12 | 12 | -| 123 | 123 | 123 | 123 | -| 1 | 1 | 1 | 1 | -\stopmarkdown -\stoptext -```````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> | Right | Left | Default | Center | -> |------:|:-----|---------|:------:| -> | 12 | 12 | 12 | 12 | -> | 123 | 123 | 123 | 123 | -> | 1 | 1 | 1 | 1 | - -% -%<*tex> -% \fi -% \begin{macrocode} -\@@_add_lua_option:nnn - { pipeTables } - { boolean } - { false } -% \end{macrocode} -% \iffalse -% -%<*lua,lua-cli> -% \fi -% \begin{macrocode} -defaultOptions.pipeTables = false -% \end{macrocode} -% \par -% \iffalse -% -%<*manual-options> - -#### Option `preserveTabs` - -`preserveTabs` (default value: `false`) - -% \fi -% \begin{markdown} -% -% \Optitem[false]{preserveTabs}{\opt{true}, \opt{false}} -% -: true - - : Preserve tabs in code block and fenced code blocks. - -: false +A PDF document named `document.pdf` should be produced and contain an example +image (from [Martin Scharrer's mwe package][mwe]) displayed at size 5cm × 4cm. - : Convert any tabs in the input to spaces. + [mwe]: https://ctan.org/pkg/mwe (mwe – Packages and image files for MWEs) -% \end{markdown} -% \iffalse % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { preserveTabs } + { linkAttributes } { boolean } { false } % \end{macrocode} @@ -7670,78 +7774,87 @@ defaultOptions.pipeTables = false %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.preserveTabs = false +defaultOptions.linkAttributes = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `rawAttribute` +#### Option `lineBlocks` -`rawAttribute` (default value: `false`) +`lineBlocks` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{rawAttribute}{\opt{true}, \opt{false}} +% \Optitem[false]{lineBlocks}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [raw attribute syntax - extension][pandoc-raw-attribute]: + : Enable the Pandoc [line block syntax + extension][pandoc-line-blocks]: ``` md - `$H_2 O$`{=tex} is a liquid. - ``` - - To enable raw blocks, the \Opt{fencedCode} option must also - be enabled: - - ~~~~~~~~ md - Here is a mathematical formula: - ``` {=tex} - \[distance[i] = - \begin{dcases} - a & b \\ - c & d - \end{dcases} - \] - ``` - ~~~~~~~~~~~ - - The \Opt{rawAttribute} option is a good alternative to the \Opt{hybrid} - option. Unlike the \Opt{hybrid} option, which affects the entire - document, the \Opt{rawAttribute} option allows you to isolate the parts - of your documents that use TeX: + | this is a line block that + | spans multiple + | even + discontinuous + | lines + `````` : false - : Disable the Pandoc raw attribute syntax extension. + : Disable the Pandoc line block syntax extension. - [pandoc-raw-attribute]: https://pandoc.org/MANUAL.html#extension-raw_attribute + [pandoc-line-blocks]: https://pandoc.org/MANUAL.html#extension-line_blocks % \end{markdown} % \iffalse -##### \LaTeX{} Example {.unnumbered} +##### Plain \TeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: -```` tex -\documentclass{article} -\usepackage[rawAttribute, fencedCode]{markdown} -\usepackage{expl3} +``` tex +\input markdown +\def\markdownOptionLineBlocks{true} +\markdownBegin +| I would spread the cloths under your feet: +| But I, being poor, have only my dreams; +| I have spread my dreams under your feet; +| Tread softly because you tread on my dreams. +\markdownEnd +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> | I would spread the cloths under your feet: +> | But I, being poor, have only my dreams; +> | I have spread my dreams under your feet; +> | Tread softly because you tread on my dreams. + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[lineBlocks]{markdown} \begin{document} \begin{markdown} -`$H_2 O$`{=tex} is a liquid. - -``` {=html} -

Here is some HTML content that will be ignored.

-``` +| I would spread the cloths under your feet: +| But I, being poor, have only my dreams; +| I have spread my dreams under your feet; +| Tread softly because you tread on my dreams. \end{markdown} \end{document} -```````` +``````` Next, invoke LuaTeX from the terminal: ``` sh lualatex document.tex @@ -7749,14 +7862,45 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> H~2~O is a liquid. +> | I would spread the cloths under your feet: +> | But I, being poor, have only my dreams; +> | I have spread my dreams under your feet; +> | Tread softly because you tread on my dreams. + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\setupmarkdown[lineBlocks = yes] +\starttext +\startmarkdown +| I would spread the cloths under your feet: +| But I, being poor, have only my dreams; +| I have spread my dreams under your feet; +| Tread softly because you tread on my dreams. +\stopmarkdown +\stoptext +``````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> | I would spread the cloths under your feet: +> | But I, being poor, have only my dreams; +> | I have spread my dreams under your feet; +> | Tread softly because you tread on my dreams. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { rawAttribute } + { lineBlocks } { boolean } { false } % \end{macrocode} @@ -7765,41 +7909,35 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.rawAttribute = true +defaultOptions.lineBlocks = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `relativeReferences` +#### Option `mark` -`relativeReferences` (default value: `false`) +`mark` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{relativeReferences}{\opt{true}, \opt{false}} +% \Optitem[false]{mark}{\opt{true}, \opt{false}} % : true - : Enable [relative references][1] in autolinks: + : Enable the Pandoc [mark syntax extension][pandoc-mark]: ``` md - I conclude in Section <#conclusion>. - - Conclusion {#conclusion} - ========== - In this paper, we have discovered that most - grandmas would rather eat dinner with their - grandchildren than get eaten. Begone, wolf! - ``` + This ==is highlighted text.== + `````` : false - : Disable relative references in autolinks. + : Disable the Pandoc mark syntax extension. - [1]: https://datatracker.ietf.org/doc/html/rfc3986#section-4.2 + [pandoc-mark]: https://pandoc.org/MANUAL.html#extension-mark % \end{markdown} % \iffalse @@ -7810,42 +7948,30 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[headerAttributes, relativeReferences]{markdown} +\usepackage[mark]{markdown} \begin{document} \begin{markdown} -I conclude in Section <#conclusion>. - -Conclusion {#conclusion} -========== -In this paper, we have discovered that most -grandmas would rather eat dinner with their -grandchildren than get eaten. Begone, wolf! +This ==is highlighted text.== \end{markdown} \end{document} ``````` -Next, invoke LuaTeX twice from the terminal: +Next, invoke LuaTeX from the terminal: ``` sh lualatex document.tex -lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> I conclude in Section 1. -> -> # 1. Conclusion -> -> In this paper, we have discovered that most grandmas would rather eat dinner -> with their grandchildren than get eaten. Begone, wolf! +> This is highlighted text. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { relativeReferences } + { mark } { boolean } { false } % \end{macrocode} @@ -7854,72 +7980,54 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.relativeReferences = false +defaultOptions.mark = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `shiftHeadings` +#### Option `notes` -`shiftHeadings` (default value: `0`) +`notes` (default value: `false`) % \fi % \begin{markdown} % -% \Valitem[0]{shiftHeadings}{shift amount} +% \Optitem[false]{notes}{\opt{true}, \opt{false}} % -: All headings will be shifted by \meta{shift amount}, which can be both - positive and negative. Headings will not be shifted beyond level 6 or - below level 1. Instead, those headings will be shifted to level 6, when - \meta{shift amount} is positive, and to level 1, when \meta{shift amount} - is negative. +: true -% \end{markdown} -% \iffalse + : Enable the Pandoc [note syntax extension][pandoc-footnotes]: -##### Plain \TeX{} Example {.unnumbered} + ``` md + Here is a note reference,[^1] and another.[^longnote] -Using a text editor, create a text document named `example.md` with the -following content: + [^1]: Here is the note. -``` md -## A section -``` + [^longnote]: Here's one with multiple blocks. -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown + Subsequent paragraphs are indented to show that they + belong to the previous note. -\font\normal=cmr10\normal -\font\big=cmr10 at 12pt -\def\markdownRendererHeadingTwo#1{{\big #1\par}} -\font\bigger=cmr10 scaled 1440 -\def\markdownRendererHeadingOne#1{{\bigger #1\par}} + { some.code } -\def\markdownOptionShiftHeadings{-1} -\markdownInput{example.md} + The whole paragraph can be indented, or just the + first line. In this way, multi-paragraph notes + work like multi-paragraph list items. -\def\markdownOptionShiftHeadings{0} -\markdownInput{example.md} + This paragraph won't be part of the note, because it + isn't indented. + `````` -\def\markdownOptionShiftHeadings{+1} -\markdownInput{example.md} +: false -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: + : Disable the Pandoc note syntax extension. -> # A section -> ## A section -> ### A section + [pandoc-footnotes]: https://pandoc.org/MANUAL.html#extension-footnotes + +% \end{markdown} +% \iffalse ##### \LaTeX{} Example {.unnumbered} @@ -7927,14 +8035,27 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage{markdown} -\begin{filecontents}[overwrite,nosearch,noheader]{example.md} -## A section -\end{filecontents} +\usepackage[notes]{markdown} \begin{document} -\markdownInput[shiftHeadings=-1]{example.md} -\markdownInput{example.md} -\markdownInput[shiftHeadings=+1]{example.md} +\begin{markdown} +Here is a note reference,[^1] and another.[^longnote] + +[^1]: Here is the note. + +[^longnote]: Here's one with multiple blocks. + + Subsequent paragraphs are indented to show that they +belong to the previous note. + + { some.code } + + The whole paragraph can be indented, or just the + first line. In this way, multi-paragraph notes + work like multi-paragraph list items. + +This paragraph won't be part of the note, because it +isn't indented. +\end{markdown} \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -7944,163 +8065,126 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> # A section -> ## A section -> ### A section +> Here is a note reference,[^1] and another.[^longnote] +> +> [^1]: Here is the note. +> +> [^longnote]: Here's one with multiple blocks. +> +> Subsequent paragraphs are indented to show that they +> belong to the previous note. +> +> { some.code } +> +> The whole paragraph can be indented, or just the +> first line. In this way, multi-paragraph notes +> work like multi-paragraph list items. +> +> This paragraph won't be part of the note, because it +> isn't indented. ##### \Hologo{ConTeXt} Example {.unnumbered} -Using a text editor, create a text document named `example.md` with the -following content: - -``` md -## A section -``` - Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] +\setupmarkdown[notes = yes] \starttext +\startmarkdown +Here is a note reference,[^1] and another.[^longnote] -\inputmarkdown[shiftHeadings = -1]{example.md} -\inputmarkdown[shiftHeadings = 0]{example.md} -\inputmarkdown[shiftHeadings = +1]{example.md} +[^1]: Here is the note. + +[^longnote]: Here's one with multiple blocks. + + Subsequent paragraphs are indented to show that they +belong to the previous note. + + { some.code } + + The whole paragraph can be indented, or just the + first line. In this way, multi-paragraph notes + work like multi-paragraph list items. +This paragraph won't be part of the note, because it +isn't indented. +\stopmarkdown \stoptext ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the following text: -> # A section -> ## A section -> ### A section +> Here is a note reference,[^1] and another.[^longnote] +> +> [^1]: Here is the note. +> +> [^longnote]: Here's one with multiple blocks. +> +> Subsequent paragraphs are indented to show that they +> belong to the previous note. +> +> { some.code } +> +> The whole paragraph can be indented, or just the +> first line. In this way, multi-paragraph notes +> work like multi-paragraph list items. +> +> This paragraph won't be part of the note, because it +> isn't indented. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { shiftHeadings } - { number } - { 0 } + { notes } + { boolean } + { false } % \end{macrocode} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.shiftHeadings = 0 +defaultOptions.notes = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `slice` +#### Option `pipeTables` {#pipe-tables} -`slice` (default value: `^ $`) +`pipeTables` (default value: `false`) % \fi % \begin{markdown} % -% \Valitem[\textasciicircum{} \\$]{slice}{the beginning and the end of a slice} +% \Optitem[false]{pipeTables}{\opt{true}, \opt{false}} % -: Two space-separated selectors that specify the slice of a document that - will be processed, whereas the remainder of the document will be ignored. - The following selectors are recognized: - - - The circumflex (`^`) selects the beginning of a document. - - The dollar sign (`$`) selects the end of a document. - - `^`\meta{identifier} selects the beginning of -% a section (see the \Opt{headerAttributes} option) -% \iffalse - a [section](#header-attributes) -% \fi -% or a fenced div (see the \Opt{fencedDivs} option) with the \acro{HTML} -% attribute `#`\meta{identifier}. -% \iffalse - or a [fenced div](#fenced-divs) - with the \acro{HTML} attribute `#`\meta{identifier}. -% \fi - - `$`\meta{identifier} selects the end of a section with the \acro{HTML} - attribute `#`\meta{identifier}. - - \meta{identifier} corresponds to `^`\meta{identifier} for the first - selector and to `$`\meta{identifier} for the second selector. - - Specifying only a single selector, \meta{identifier}, is equivalent - to specifying the two selectors \meta{identifier} \meta{identifier}, - which is equivalent to `^`\meta{identifier} `$`\meta{identifier}, i.e. - the entire section with the \acro{HTML} attribute `#`\meta{identifier} will be - selected. - -% \end{markdown} -% \iffalse - -##### Plain \TeX{} Example {.unnumbered} - -Using a text editor, create a text document named `hamlet.md` with the -following content: - -``` md -# The Tragedy of Hamlet -Shakespeare's longest play. - -## Act III {#act-3} -Hamlet kills Polonius. - -## Act V {#act-5} -Hamlet dies. - -## Act I {#act-1} -Hamlet talks to ghost. -``` - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownOptionHeaderAttributes{true} - -\font\normal=cmr10\normal -\font\big=cmr10 at 12pt -\def\markdownRendererHeadingTwo#1{{\big #1\par}} -\font\bigger=cmr10 scaled 1440 -\def\markdownRendererHeadingOne#1{{\bigger #1\par}} +: true -\def\markdownOptionSlice{^ ^act-3} -\markdownInput{hamlet.md} + : Enable the \acro{PHP} Markdown pipe table syntax extension: -\def\markdownOptionSlice{act-1} -\markdownInput{hamlet.md} + ``` md + | Right | Left | Default | Center | + |------:|:-----|---------|:------:| + | 12 | 12 | 12 | 12 | + | 123 | 123 | 123 | 123 | + | 1 | 1 | 1 | 1 | + `````` -\def\markdownOptionSlice{act-3 act-5} -\markdownInput{hamlet.md} +: false -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: + : Disable the \acro{PHP} Markdown pipe table syntax extension. -> # The Tragedy of Hamlet -> Shakespeare's longest play. -> -> ## Act I -> Hamlet talks to ghost. -> -> ## Act III -> Hamlet kills Polonius. -> -> ## Act V -> Hamlet dies. +% \end{markdown} +% \iffalse ##### \LaTeX{} Example {.unnumbered} @@ -8108,24 +8192,15 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[headerAttributes]{markdown} -\begin{filecontents}[overwrite,nosearch,noheader]{hamlet.md} -# The Tragedy of Hamlet -Shakespeare's longest play. - -## Act III {#act-3} -Hamlet kills Polonius. - -## Act V {#act-5} -Hamlet dies. - -## Act I {#act-1} -Hamlet talks to ghost. -\end{filecontents} +\usepackage[pipeTables]{markdown} \begin{document} -\markdownInput[slice=^ ^act-3]{hamlet.md} -\markdownInput[slice=act-1]{hamlet.md} -\markdownInput[slice=act-3 act-5]{hamlet.md} +\begin{markdown} +| Right | Left | Default | Center | +|------:|:-----|---------|:------:| +| 12 | 12 | 12 | 12 | +| 123 | 123 | 123 | 123 | +| 1 | 1 | 1 | 1 | +\end{markdown} \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -8135,234 +8210,168 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> # The Tragedy of Hamlet -> Shakespeare's longest play. -> -> ## Act I -> Hamlet talks to ghost. -> -> ## Act III -> Hamlet kills Polonius. -> -> ## Act V -> Hamlet dies. +> | Right | Left | Default | Center | +> |------:|:-----|---------|:------:| +> | 12 | 12 | 12 | 12 | +> | 123 | 123 | 123 | 123 | +> | 1 | 1 | 1 | 1 | ##### \Hologo{ConTeXt} Example {.unnumbered} -Using a text editor, create a text document named `hamlet.md` with the -following content: - -``` md -# The Tragedy of Hamlet -Shakespeare's longest play. - -## Act III {#act-3} -Hamlet kills Polonius. - -## Act V {#act-5} -Hamlet dies. - -## Act I {#act-1} -Hamlet talks to ghost. -``` - Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[headerAttributes = yes] +\setupmarkdown[pipeTables = yes] \starttext - -\inputmarkdown[slice = ^ ^act-3]{example.md} -\inputmarkdown[slice = act-1]{example.md} -\inputmarkdown[slice = act-3 act-5]{example.md} - +\startmarkdown +| Right | Left | Default | Center | +|------:|:-----|---------|:------:| +| 12 | 12 | 12 | 12 | +| 123 | 123 | 123 | 123 | +| 1 | 1 | 1 | 1 | +\stopmarkdown \stoptext ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the following text: -> # The Tragedy of Hamlet -> Shakespeare's longest play. -> -> ## Act I -> Hamlet talks to ghost. -> -> ## Act III -> Hamlet kills Polonius. -> -> ## Act V -> Hamlet dies. +> | Right | Left | Default | Center | +> |------:|:-----|---------|:------:| +> | 12 | 12 | 12 | 12 | +> | 123 | 123 | 123 | 123 | +> | 1 | 1 | 1 | 1 | % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { slice } - { slice } - { ^~$ } + { pipeTables } + { boolean } + { false } % \end{macrocode} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.slice = "^ $" +defaultOptions.pipeTables = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `smartEllipses` +#### Option `preserveTabs` -`smartEllipses` (default value: `false`) +`preserveTabs` (default value: `true`) % \fi % \begin{markdown} % -% \Optitem[false]{smartEllipses}{\opt{true}, \opt{false}} +% \Optitem[true]{preserveTabs}{\opt{true}, \opt{false}} % : true - : Convert any ellipses in the input to the - \mref{markdownRendererEllipsis} \TeX{} macro. + : Preserve tabs in code block and fenced code blocks. : false - : Preserve all ellipses in the input. + : Convert any tabs in the input to spaces. % \end{markdown} % \iffalse +% +%<*tex> +% \fi +% \begin{macrocode} +\@@_add_lua_option:nnn + { preserveTabs } + { boolean } + { true } +% \end{macrocode} +% \iffalse +% +%<*lua,lua-cli> +% \fi +% \begin{macrocode} +defaultOptions.preserveTabs = true +% \end{macrocode} +% \par +% \iffalse +% +%<*manual-options> -##### Lua Module Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownRendererEllipsis{. . .} -\input lmfonts -\directlua{ - local markdown = require("markdown") - local convert = markdown.new() - local input = "These are just three regular dots ..." - tex.sprint(convert(input)) } -\par -\directlua{ - local markdown = require("markdown") - local convert = markdown.new({smartEllipses = true}) - local input = "... and this is a victorian ellipsis." - tex.sprint(convert(input)) } -\bye -``````` -Then, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -``````` -A PDF document named `document.pdf` should be produced and contain the -following text: +#### Option `rawAttribute` -> These are just three regular dots ... -> -> . . . and this is a victorian ellipsis. +`rawAttribute` (default value: `false`) -##### Lua CLI Example {.unnumbered} +% \fi +% \begin{markdown} +% +% \Optitem[false]{rawAttribute}{\opt{true}, \opt{false}} +% +: true -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownRendererEllipsis{. . .} -\input lmfonts -\input optionfalse -\par -\input optiontrue -\bye -``````` -Using a text editor, create a text document named `content.md` with the -following content: -``` md -Are these just three regular dots, a victorian ellipsis, or ... ? -`````` -Next, invoke LuaTeX from the terminal: -``` sh -texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex -texlua ⟨CLI pathname⟩ smartEllipses=true -- content.md optiontrue.tex -luatex document.tex -``````` -where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, -such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or -`C:\Users\`\meta{Your username}`\texmf\scripts\markdown\markdown-cli.lua` on Windows -systems. Use the command `kpsewhich -a markdown-cli.lua` to locate the Lua CLI -script file using [Kpathsea][]. + : Enable the Pandoc [raw attribute syntax + extension][pandoc-raw-attribute]: -A PDF document named `document.pdf` should be produced and contain the -following text: + ``` md + `$H_2 O$`{=tex} is a liquid. + ``` -> Are these just three regular dots, a victorian ellipsis, or ... ? -> -> Are these just three regular dots, a victorian ellipsis, or . . . ? + To enable raw blocks, the \Opt{fencedCode} option must also + be enabled: -##### Plain \TeX{} Example {.unnumbered} + ~~~~~~~~ md + Here is a mathematical formula: + ``` {=tex} + \[distance[i] = + \begin{dcases} + a & b \\ + c & d + \end{dcases} + \] + ``` + ~~~~~~~~~~~ -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownRendererEllipsis{. . .} + The \Opt{rawAttribute} option is a good alternative to the \Opt{hybrid} + option. Unlike the \Opt{hybrid} option, which affects the entire + document, the \Opt{rawAttribute} option allows you to isolate the parts + of your documents that use TeX: -\markdownBegin -These are just three regular dots ... -\markdownEnd +: false -\def\markdownOptionSmartEllipses{true} -\markdownBegin -... and this is a victorian ellipsis. -\markdownEnd + : Disable the Pandoc raw attribute syntax extension. -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: + [pandoc-raw-attribute]: https://pandoc.org/MANUAL.html#extension-raw_attribute -> These are just three regular dots ... -> -> . . . and this is a victorian ellipsis. +% \end{markdown} +% \iffalse ##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: -``` tex +```` tex \documentclass{article} -\usepackage{markdown} -\markdownSetup{ - renderers = { - ellipsis = {. . .} - } -} +\usepackage[rawAttribute, fencedCode]{markdown} +\usepackage{expl3} \begin{document} - \begin{markdown} -These are just three regular dots ... -\end{markdown} - -\begin{markdown*}{smartEllipses} -... and this is a victorian ellipsis. -\end{markdown*} +`$H_2 O$`{=tex} is a liquid. +``` {=html} +

Here is some HTML content that will be ignored.

+``` +\end{markdown} \end{document} -``````` +```````` Next, invoke LuaTeX from the terminal: ``` sh lualatex document.tex @@ -8370,47 +8379,14 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> These are just three regular dots ... -> -> . . . and this is a victorian ellipsis. - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\def\markdownRendererEllipsis{. . .} -\starttext - -\startmarkdown -These are just three regular dots ... -\stopmarkdown - -\setupmarkdown[smartEllipses = yes] -\startmarkdown -... and this is a victorian ellipsis. -\stopmarkdown - -\stoptext -```````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> These are just three regular dots ... -> -> . . . and this is a victorian ellipsis. +> H~2~O is a liquid. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { smartEllipses } + { rawAttribute } { boolean } { false } % \end{macrocode} @@ -8419,32 +8395,41 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.smartEllipses = false +defaultOptions.rawAttribute = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `startNumber` +#### Option `relativeReferences` -`startNumber` (default value: `true`) +`relativeReferences` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[true]{startNumber}{\opt{true}, \opt{false}} +% \Optitem[false]{relativeReferences}{\opt{true}, \opt{false}} % : true - : Make the number in the first item of an ordered lists significant. The - item numbers will be passed to the - \mref{markdownRendererOlItemWithNumber} \TeX{} macro. + : Enable [relative references][1] in autolinks: + + ``` md + I conclude in Section <#conclusion>. + + Conclusion {#conclusion} + ========== + In this paper, we have discovered that most + grandmas would rather eat dinner with their + grandchildren than get eaten. Begone, wolf! + ``` : false - : Ignore the numbers in the ordered list items. Each item will only - produce a \mref{markdownRendererOlItem} \TeX{} macro. + : Disable relative references in autolinks. + + [1]: https://datatracker.ietf.org/doc/html/rfc3986#section-4.2 % \end{markdown} % \iffalse @@ -8455,152 +8440,104 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage{markdown} +\usepackage[headerAttributes, relativeReferences]{markdown} \begin{document} - \begin{markdown} -The following list respects the numbers specified in the markup: - -3. third item -4. fourth item -5. fifth item -\end{markdown} -\begin{markdown*}{startNumber=false} -The following list does not respect the numbers specified in the -markup: +I conclude in Section <#conclusion>. -3. third item -4. fourth item -5. fifth item -\end{markdown*} +Conclusion {#conclusion} +========== +In this paper, we have discovered that most +grandmas would rather eat dinner with their +grandchildren than get eaten. Begone, wolf! +\end{markdown} \end{document} ``````` -Next, invoke LuaTeX from the terminal: +Next, invoke LuaTeX twice from the terminal: ``` sh lualatex document.tex +lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> The following list respects the numbers specified in the markup: -> -> 3. third item -> 4. fourth item -> 5. fifth item +> I conclude in Section 1. > -> The following list does not respect the numbers specified in the markup: -> -> 1. third item -> 2. fourth item -> 3. fifth item - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\starttext - -\startmarkdown -The following list respects the numbers specified in the markup: - -3. third item -4. fourth item -5. fifth item -\stopmarkdown - -\setupmarkdown[startNumber = no] -\startmarkdown -The following list respects the numbers specified in the markup: - -3. third item -4. fourth item -5. fifth item -\stopmarkdown -\stoptext -```````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> The following list respects the numbers specified in the markup: -> -> 3. third item -> 4. fourth item -> 5. fifth item -> -> The following list does not respect the numbers specified in the markup: -> -> 1. third item -> 2. fourth item -> 3. fifth item +> # 1. Conclusion +> +> In this paper, we have discovered that most grandmas would rather eat dinner +> with their grandchildren than get eaten. Begone, wolf! % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { startNumber } + { relativeReferences } { boolean } - { true } + { false } % \end{macrocode} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.startNumber = true +defaultOptions.relativeReferences = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `strikeThrough` +#### Option `shiftHeadings` -`strikeThrough` (default value: `false`) +`shiftHeadings` (default value: `0`) % \fi % \begin{markdown} % -% \Optitem[false]{strikeThrough}{\opt{true}, \opt{false}} +% \Valitem[0]{shiftHeadings}{shift amount} % -: true - - : Enable the Pandoc [strike-through syntax - extension][pandoc-strikeout]: - - ``` md - This ~~is deleted text.~~ - `````` - -: false - - : Disable the Pandoc strike-through syntax extension. - - [pandoc-strikeout]: https://pandoc.org/MANUAL.html#extension-strikeout +: All headings will be shifted by \meta{shift amount}, which can be both + positive and negative. Headings will not be shifted beyond level 6 or + below level 1. Instead, those headings will be shifted to level 6, when + \meta{shift amount} is positive, and to level 1, when \meta{shift amount} + is negative. % \end{markdown} % \iffalse ##### Plain \TeX{} Example {.unnumbered} +Using a text editor, create a text document named `example.md` with the +following content: + +``` md +## A section +``` + Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownOptionStrikeThrough{true} -\input soulutf8.sty -\def\markdownRendererStrikeThrough#1{\st{#1}} -\markdownBegin -This is ~~a lunar roving vehicle~~ strike-through text. -\markdownEnd + +\font\normal=cmr10\normal +\font\big=cmr10 at 12pt +\def\markdownRendererHeadingTwo#1{{\big #1\par}} +\font\bigger=cmr10 scaled 1440 +\def\markdownRendererHeadingOne#1{{\bigger #1\par}} + +\def\markdownOptionShiftHeadings{-1} +\markdownInput{example.md} + +\def\markdownOptionShiftHeadings{0} +\markdownInput{example.md} + +\def\markdownOptionShiftHeadings{+1} +\markdownInput{example.md} + \bye ``````` Next, invoke LuaTeX from the terminal: @@ -8610,7 +8547,9 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> This is ~~a lunar roving vehicle~~ strike-through text. +> # A section +> ## A section +> ### A section ##### \LaTeX{} Example {.unnumbered} @@ -8618,17 +8557,14 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[strikeThrough]{markdown} -\usepackage{soulutf8} -\markdownSetup{ - renderers = { - strikeThrough = {\st{#1}}, - }, -} +\usepackage{markdown} +\begin{filecontents}[overwrite,nosearch,noheader]{example.md} +## A section +\end{filecontents} \begin{document} -\begin{markdown} -This is ~~a lunar roving vehicle~~ strike-through text. -\end{markdown} +\markdownInput[shiftHeadings=-1]{example.md} +\markdownInput{example.md} +\markdownInput[shiftHeadings=+1]{example.md} \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -8638,115 +8574,188 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> This is ~~a lunar roving vehicle~~ strike-through text. +> # A section +> ## A section +> ### A section ##### \Hologo{ConTeXt} Example {.unnumbered} +Using a text editor, create a text document named `example.md` with the +following content: + +``` md +## A section +``` + Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[strikeThrough = yes] -\def\markdownRendererStrikeThrough#1{\overstrikes{#1}} \starttext -\startmarkdown -This is ~~a lunar roving vehicle~~ strike-through text. -\stopmarkdown + +\inputmarkdown[shiftHeadings = -1]{example.md} +\inputmarkdown[shiftHeadings = 0]{example.md} +\inputmarkdown[shiftHeadings = +1]{example.md} + \stoptext -``````` +```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex -`````` +context --luatex document.tex +````` A PDF document named `document.pdf` should be produced and contain the following text: -> This is ~~a lunar roving vehicle~~ strike-through text. +> # A section +> ## A section +> ### A section % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { strikeThrough } - { boolean } - { false } + { shiftHeadings } + { number } + { 0 } % \end{macrocode} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.strikeThrough = false +defaultOptions.shiftHeadings = 0 % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `stripIndent` +#### Option `slice` -`stripIndent` (default value: `false`) +`slice` (default value: `^ $`) % \fi -% \markdownBegin +% \begin{markdown} % -% \Optitem[false]{stripIndent}{\opt{true}, \opt{false}} +% \Valitem[\textasciicircum{} \\$]{slice}{the beginning and the end of a slice} % -: true - - : Strip the minimal indentation of non-blank lines from all - lines in a markdown document. Requires that the - \Opt{preserveTabs} Lua option is disabled: - - ``` tex - \documentclass{article} - \usepackage[stripIndent]{markdown} - \begin{document} - \begin{markdown} - Hello *world*! - \end{markdown} - \end{document} - ``````` +: Two space-separated selectors that specify the slice of a document that + will be processed, whereas the remainder of the document will be ignored. + The following selectors are recognized: -: false + - The circumflex (`^`) selects the beginning of a document. + - The dollar sign (`$`) selects the end of a document. + - `^`\meta{identifier} selects the beginning of +% a section (see the \Opt{headerAttributes} option) +% \iffalse + a [section](#header-attributes) +% \fi +% or a fenced div (see the \Opt{fencedDivs} option) with the \acro{HTML} +% attribute `#`\meta{identifier}. +% \iffalse + or a [fenced div](#fenced-divs) + with the \acro{HTML} attribute `#`\meta{identifier}. +% \fi + - `$`\meta{identifier} selects the end of a section with the \acro{HTML} + attribute `#`\meta{identifier}. + - \meta{identifier} corresponds to `^`\meta{identifier} for the first + selector and to `$`\meta{identifier} for the second selector. - : Do not strip any indentation from the lines in a markdown - document. + Specifying only a single selector, \meta{identifier}, is equivalent + to specifying the two selectors \meta{identifier} \meta{identifier}, + which is equivalent to `^`\meta{identifier} `$`\meta{identifier}, i.e. + the entire section with the \acro{HTML} attribute `#`\meta{identifier} will be + selected. -% \markdownEnd +% \end{markdown} % \iffalse ##### Plain \TeX{} Example {.unnumbered} +Using a text editor, create a text document named `hamlet.md` with the +following content: + +``` md +# The Tragedy of Hamlet +Shakespeare's longest play. + +## Act III {#act-3} +Hamlet kills Polonius. + +## Act V {#act-5} +Hamlet dies. + +## Act I {#act-1} +Hamlet talks to ghost. +``` + Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownOptionStripIndent{true} -\markdownBegin - Hello *world*! -\markdownEnd +\def\markdownOptionHeaderAttributes{true} + +\font\normal=cmr10\normal +\font\big=cmr10 at 12pt +\def\markdownRendererHeadingTwo#1{{\big #1\par}} +\font\bigger=cmr10 scaled 1440 +\def\markdownRendererHeadingOne#1{{\bigger #1\par}} + +\def\markdownOptionSlice{^ ^act-3} +\markdownInput{hamlet.md} + +\def\markdownOptionSlice{act-1} +\markdownInput{hamlet.md} + +\def\markdownOptionSlice{act-3 act-5} +\markdownInput{hamlet.md} + \bye ``````` Next, invoke LuaTeX from the terminal: ``` sh luatex document.tex `````` -A PDF document named `document.pdf` should be produced and contain the text -“Hello *world*!” - -##### \LaTeX{} Example {.unnumbered} +A PDF document named `document.pdf` should be produced and contain the +following text: -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[stripIndent]{markdown} +> # The Tragedy of Hamlet +> Shakespeare's longest play. +> +> ## Act I +> Hamlet talks to ghost. +> +> ## Act III +> Hamlet kills Polonius. +> +> ## Act V +> Hamlet dies. + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[headerAttributes]{markdown} +\begin{filecontents}[overwrite,nosearch,noheader]{hamlet.md} +# The Tragedy of Hamlet +Shakespeare's longest play. + +## Act III {#act-3} +Hamlet kills Polonius. + +## Act V {#act-5} +Hamlet dies. + +## Act I {#act-1} +Hamlet talks to ghost. +\end{filecontents} \begin{document} - \begin{markdown} - Hello *world*! - \end{markdown} +\markdownInput[slice=^ ^act-3]{hamlet.md} +\markdownInput[slice=act-1]{hamlet.md} +\markdownInput[slice=act-3 act-5]{hamlet.md} \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -8754,87 +8763,242 @@ Next, invoke LuaTeX from the terminal: lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the -text “Hello *world*!” +following text: + +> # The Tragedy of Hamlet +> Shakespeare's longest play. +> +> ## Act I +> Hamlet talks to ghost. +> +> ## Act III +> Hamlet kills Polonius. +> +> ## Act V +> Hamlet dies. ##### \Hologo{ConTeXt} Example {.unnumbered} +Using a text editor, create a text document named `hamlet.md` with the +following content: + +``` md +# The Tragedy of Hamlet +Shakespeare's longest play. + +## Act III {#act-3} +Hamlet kills Polonius. + +## Act V {#act-5} +Hamlet dies. + +## Act I {#act-1} +Hamlet talks to ghost. +``` + Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[stripIndent = yes] +\setupmarkdown[headerAttributes = yes] \starttext - \startmarkdown - Hello *world*! - \stopmarkdown + +\inputmarkdown[slice = ^ ^act-3]{example.md} +\inputmarkdown[slice = act-1]{example.md} +\inputmarkdown[slice = act-3 act-5]{example.md} + \stoptext ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the -text “Hello *world*!” +following text: + +> # The Tragedy of Hamlet +> Shakespeare's longest play. +> +> ## Act I +> Hamlet talks to ghost. +> +> ## Act III +> Hamlet kills Polonius. +> +> ## Act V +> Hamlet dies. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { stripIndent } - { boolean } - { false } + { slice } + { slice } + { ^~$ } % \end{macrocode} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.stripIndent = false +defaultOptions.slice = "^ $" % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `subscripts` +#### Option `smartEllipses` -`subscripts` (default value: `false`) +`smartEllipses` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{subscripts}{\opt{true}, \opt{false}} +% \Optitem[false]{smartEllipses}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [subscript syntax - extension][pandoc-subscript]: - - ``` md - H~2~O is a liquid. - `````` + : Convert any ellipses in the input to the + \mref{markdownRendererEllipsis} \TeX{} macro. : false - : Disable the Pandoc subscript syntax extension. - - [pandoc-subscript]: https://pandoc.org/MANUAL.html#extension-superscript-subscript + : Preserve all ellipses in the input. % \end{markdown} % \iffalse +##### Lua Module Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\input lmfonts +\def\markdownRendererEllipsis{. . .} +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\directlua{ + local markdown = require("markdown") + local convert = markdown.new() + local input = "These are just three regular dots ..." + tex.sprint(convert(input)) } +\par +\directlua{ + local markdown = require("markdown") + local convert = markdown.new({smartEllipses = true}) + local input = "... and this is a victorian ellipsis." + tex.sprint(convert(input)) } +\endgroup +\bye +``````` +Then, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +``````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> These are just three regular dots ... +> +> . . . and this is a victorian ellipsis. + +##### Lua CLI Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\input lmfonts +\def\markdownRendererEllipsis{. . .} +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\input optionfalse +\par +\input optiontrue +\endgroup +\bye +``````` +Using a text editor, create a text document named `content.md` with the +following content: +``` md +Are these just three regular dots, a victorian ellipsis, or ... ? +`````` +Next, invoke LuaTeX from the terminal: +``` sh +texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex +texlua ⟨CLI pathname⟩ smartEllipses=true -- content.md optiontrue.tex +luatex document.tex +``````` +where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, +such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or +`C:\Users\`\meta{Your username}`\texmf\scripts\markdown\markdown-cli.lua` on Windows +systems. Use the command `kpsewhich -a markdown-cli.lua` to locate the Lua CLI +script file using [Kpathsea][]. + +A PDF document named `document.pdf` should be produced and contain the +following text: + +> Are these just three regular dots, a victorian ellipsis, or ... ? +> +> Are these just three regular dots, a victorian ellipsis, or . . . ? + +##### Plain \TeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\def\markdownRendererEllipsis{. . .} + +\markdownBegin +These are just three regular dots ... +\markdownEnd + +\def\markdownOptionSmartEllipses{true} +\markdownBegin +... and this is a victorian ellipsis. +\markdownEnd + +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> These are just three regular dots ... +> +> . . . and this is a victorian ellipsis. + ##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[subscripts]{markdown} +\usepackage{markdown} +\markdownSetup{ + renderers = { + ellipsis = {. . .} + } +} \begin{document} + \begin{markdown} -H~2~O is a liquid. +These are just three regular dots ... +\end{markdown} + +\begin{markdown}[smartEllipses] +... and this is a victorian ellipsis. \end{markdown} + \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -8844,7 +9008,9 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> H~2~O is a liquid. +> These are just three regular dots ... +> +> . . . and this is a victorian ellipsis. ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -8852,28 +9018,37 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[subscripts = yes] +\def\markdownRendererEllipsis{. . .} \starttext + \startmarkdown -H~2~O is a liquid. +These are just three regular dots ... \stopmarkdown + +\setupmarkdown[smartEllipses = yes] +\startmarkdown +... and this is a victorian ellipsis. +\stopmarkdown + \stoptext -``````` +```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex -`````` +context --luatex document.tex +````` A PDF document named `document.pdf` should be produced and contain the following text: -> H~2~O is a liquid. +> These are just three regular dots ... +> +> . . . and this is a victorian ellipsis. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { subscripts } + { smartEllipses } { boolean } { false } % \end{macrocode} @@ -8882,36 +9057,32 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.subscripts = false +defaultOptions.smartEllipses = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `superscripts` +#### Option `startNumber` -`superscripts` (default value: `false`) +`startNumber` (default value: `true`) % \fi % \begin{markdown} % -% \Optitem[false]{superscripts}{\opt{true}, \opt{false}} +% \Optitem[true]{startNumber}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [superscript syntax - extension][pandoc-superscript]: - - ``` md - 2^10^ is 1024. - `````` + : Make the number in the first item of an ordered lists significant. The + item numbers will be passed to the + \mref{markdownRendererOlItemWithNumber} \TeX{} macro. : false - : Disable the Pandoc superscript syntax extension. - - [pandoc-superscript]: https://pandoc.org/MANUAL.html#extension-superscript-subscript + : Ignore the numbers in the ordered list items. Each item will only + produce a \mref{markdownRendererOlItem} \TeX{} macro. % \end{markdown} % \iffalse @@ -8922,11 +9093,26 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[superscripts]{markdown} +\usepackage{markdown} \begin{document} + \begin{markdown} -2^10^ is 1024. +The following list respects the numbers specified in the markup: + +3. third item +4. fourth item +5. fifth item +\end{markdown} + +\begin{markdown}[startNumber=false] +The following list does not respect the numbers specified in the +markup: + +3. third item +4. fourth item +5. fifth item \end{markdown} + \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -8936,7 +9122,17 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> 2^10^ is 1024. +> The following list respects the numbers specified in the markup: +> +> 3. third item +> 4. fourth item +> 5. fifth item +> +> The following list does not respect the numbers specified in the markup: +> +> 1. third item +> 2. fourth item +> 3. fifth item ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -8944,96 +9140,132 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[superscripts = yes] \starttext + \startmarkdown -2^10^ is 1024. +The following list respects the numbers specified in the markup: + +3. third item +4. fourth item +5. fifth item +\stopmarkdown + +\setupmarkdown[startNumber = no] +\startmarkdown +The following list respects the numbers specified in the markup: + +3. third item +4. fourth item +5. fifth item \stopmarkdown \stoptext -``````` +```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex -`````` +context --luatex document.tex +````` A PDF document named `document.pdf` should be produced and contain the following text: -> 2^10^ is 1024. +> The following list respects the numbers specified in the markup: +> +> 3. third item +> 4. fourth item +> 5. fifth item +> +> The following list does not respect the numbers specified in the markup: +> +> 1. third item +> 2. fourth item +> 3. fifth item % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { superscripts } + { startNumber } { boolean } - { false } + { true } % \end{macrocode} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.superscripts = false +defaultOptions.startNumber = true % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `tableCaptions` +#### Option `strikeThrough` -`tableCaptions` (default value: `false`) +`strikeThrough` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{tableCaptions}{\opt{true}, \opt{false}} +% \Optitem[false]{strikeThrough}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [table caption syntax - extension][pandoc-table-captions] for -% pipe tables (see the \Opt{pipeTables} option). -% \iffalse - [pipe tables](#pipe-tables). -% \fi + : Enable the Pandoc [strike-through syntax + extension][pandoc-strikeout]: ``` md - | Right | Left | Default | Center | - |------:|:-----|---------|:------:| - | 12 | 12 | 12 | 12 | - | 123 | 123 | 123 | 123 | - | 1 | 1 | 1 | 1 | - - : Demonstration of pipe table syntax. + This ~~is deleted text.~~ `````` : false - : Disable the Pandoc table caption syntax extension. + : Disable the Pandoc strike-through syntax extension. - [pandoc-table-captions]: https://pandoc.org/MANUAL.html#extension-table_captions + [pandoc-strikeout]: https://pandoc.org/MANUAL.html#extension-strikeout % \end{markdown} % \iffalse +##### Plain \TeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\def\markdownOptionStrikeThrough{true} +\input soulutf8.sty +\def\markdownRendererStrikeThrough#1{\st{#1}} +\markdownBegin +This is ~~a lunar roving vehicle~~ strike-through text. +\markdownEnd +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> This is ~~a lunar roving vehicle~~ strike-through text. + ##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[pipeTables, tableCaptions]{markdown} +\usepackage[strikeThrough]{markdown} +\usepackage{soulutf8} +\markdownSetup{ + renderers = { + strikeThrough = {\st{#1}}, + }, +} \begin{document} \begin{markdown} -| Right | Left | Default | Center | -|------:|:-----|---------|:------:| -| 12 | 12 | 12 | 12 | -| 123 | 123 | 123 | 123 | -| 1 | 1 | 1 | 1 | - -: Demonstration of pipe table syntax. +This is ~~a lunar roving vehicle~~ strike-through text. \end{markdown} \end{document} ``````` @@ -9044,13 +9276,7 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> | Right | Left | Default | Center | -> |------:|:-----|---------|:------:| -> | 12 | 12 | 12 | 12 | -> | 123 | 123 | 123 | 123 | -> | 1 | 1 | 1 | 1 | -> -> : Demonstration of pipe table syntax. +> This is ~~a lunar roving vehicle~~ strike-through text. ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -9058,44 +9284,29 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown - [ - pipeTables = yes, - tableCaptions = yes, - ] +\setupmarkdown[strikeThrough = yes] +\def\markdownRendererStrikeThrough#1{\overstrikes{#1}} \starttext \startmarkdown -| Right | Left | Default | Center | -|------:|:-----|---------|:------:| -| 12 | 12 | 12 | 12 | -| 123 | 123 | 123 | 123 | -| 1 | 1 | 1 | 1 | - -: Demonstration of pipe table syntax. +This is ~~a lunar roving vehicle~~ strike-through text. \stopmarkdown \stoptext -```````` +``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex -````` +context --luatex document.tex +`````` A PDF document named `document.pdf` should be produced and contain the following text: -> | Right | Left | Default | Center | -> |------:|:-----|---------|:------:| -> | 12 | 12 | 12 | 12 | -> | 123 | 123 | 123 | 123 | -> | 1 | 1 | 1 | 1 | -> -> : Demonstration of pipe table syntax. +> This is ~~a lunar roving vehicle~~ strike-through text. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { tableCaptions } + { strikeThrough } { boolean } { false } % \end{macrocode} @@ -9104,63 +9315,76 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.tableCaptions = false +defaultOptions.strikeThrough = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `taskLists` +#### Option `stripIndent` -`taskLists` (default value: `false`) +`stripIndent` (default value: `false`) % \fi -% \begin{markdown} +% \markdownBegin % -% \Optitem[false]{taskLists}{\opt{true}, \opt{false}} +% \Optitem[false]{stripIndent}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [task list syntax - extension][pandoc-task-lists]: - + : Strip the minimal indentation of non-blank lines from all + lines in a markdown document. Requires that the + \Opt{preserveTabs} Lua option is disabled: - ``` md - - [ ] an unticked task list item - - [/] a half-checked task list item - - [X] a ticked task list item - `````` + ``` tex + \documentclass{article} + \usepackage[stripIndent]{markdown} + \begin{document} + \begin{markdown} + Hello *world*! + \end{markdown} + \end{document} + ``````` : false - : Disable the Pandoc task list syntax extension. - - [pandoc-task-lists]: https://pandoc.org/MANUAL.html#extension-task_lists + : Do not strip any indentation from the lines in a markdown + document. -% \end{markdown} +% \markdownEnd % \iffalse -##### \LaTeX{} Example {.unnumbered} +##### Plain \TeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex -\documentclass{article} -\usepackage[taskLists]{markdown} -\markdownSetup{ - renderers = { - untickedBox = No, - halfTickedBox = Maybe, - tickedBox = Yes, - }, -} -\begin{document} -\begin{markdown} -- [ ] you can't. -- [/] I can? -- [X] I can! -\end{markdown} +\input markdown +\def\markdownOptionStripIndent{true} +\markdownBegin + Hello *world*! +\markdownEnd +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the text +“Hello *world*!” + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[stripIndent]{markdown} +\begin{document} + \begin{markdown} + Hello *world*! + \end{markdown} \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -9168,11 +9392,7 @@ Next, invoke LuaTeX from the terminal: lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the -following text: - -> - No you can't. -> - Maybe I can? -> - Yes I can! +text “Hello *world*!” ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -9180,35 +9400,26 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[taskLists = yes] -\def\markdownRendererUntickedBox{No} -\def\markdownRendererHalftickedBox{Maybe} -\def\markdownRendererTickedBox{Yes} +\setupmarkdown[stripIndent = yes] \starttext -\startmarkdown -- [ ] you can't. -- [/] I can? -- [X] I can! -\stopmarkdown + \startmarkdown + Hello *world*! + \stopmarkdown \stoptext ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the -following text: - -> - No you can't. -> - Maybe I can? -> - Yes I can! +text “Hello *world*!” % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { taskLists } + { stripIndent } { boolean } { false } % \end{macrocode} @@ -9217,65 +9428,39 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.taskLists = false +defaultOptions.stripIndent = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `texComments` +#### Option `subscripts` -`texComments` (default value: `false`) +`subscripts` (default value: `false`) % \fi -% \markdownBegin +% \begin{markdown} % -% \Optitem[false]{texComments}{\opt{true}, \opt{false}} +% \Optitem[false]{subscripts}{\opt{true}, \opt{false}} % : true - : Strip \TeX{}-style comments. - - ``` tex - \documentclass{article} - \usepackage[texComments]{markdown} - \begin{document} - \begin{markdown} - Hel% this is a comment - lo *world*! - \end{markdown} - \end{document} - ``````` + : Enable the Pandoc [subscript syntax + extension][pandoc-subscript]: - Always enabled when \Opt{hybrid} is enabled. + ``` md + H~2~O is a liquid. + `````` : false - : Do not strip \TeX{}-style comments. - -% \markdownEnd -% \iffalse + : Disable the Pandoc subscript syntax extension. -##### Plain \TeX{} Example {.unnumbered} + [pandoc-subscript]: https://pandoc.org/MANUAL.html#extension-superscript-subscript -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownOptionTexComments{true} -\markdownBegin -Hel% this is a comment - lo *world*! -\markdownEnd -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the text -“Hello *world*!” +% \end{markdown} +% \iffalse ##### \LaTeX{} Example {.unnumbered} @@ -9283,11 +9468,10 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[texComments]{markdown} +\usepackage[subscripts]{markdown} \begin{document} \begin{markdown} -Hel% this is a comment - lo *world*! +H~2~O is a liquid. \end{markdown} \end{document} ``````` @@ -9296,7 +9480,9 @@ Next, invoke LuaTeX from the terminal: lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the -text “Hello *world*!” +following text: + +> H~2~O is a liquid. ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -9304,27 +9490,28 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[texComments = yes] +\setupmarkdown[subscripts = yes] \starttext \startmarkdown -Hel% this is a comment - lo *world*! +H~2~O is a liquid. \stopmarkdown \stoptext -```````` +``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex -````` +context --luatex document.tex +`````` A PDF document named `document.pdf` should be produced and contain the -text “Hello *world*!” +following text: + +> H~2~O is a liquid. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { texComments } + { subscripts } { boolean } { false } % \end{macrocode} @@ -9333,138 +9520,266 @@ text “Hello *world*!” %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.texComments = false +defaultOptions.subscripts = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `texMathDollars` +#### Option `superscripts` -`texMathDollars` (default value: `false`) +`superscripts` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{texMathDollars}{\opt{true}, \opt{false}} +% \Optitem[false]{superscripts}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [dollar math syntax - extension][pandoc-tex-math-dollars]: + : Enable the Pandoc [superscript syntax + extension][pandoc-superscript]: ``` md - inline math: $E=mc^2$ - - display math: $$E=mc^2$$ - ``` + 2^10^ is 1024. + `````` : false - : Disable the Pandoc dollar math syntax extension. + : Disable the Pandoc superscript syntax extension. - [pandoc-tex-math-dollars]: https://pandoc.org/MANUAL.html#extension-tex_math_dollars + [pandoc-superscript]: https://pandoc.org/MANUAL.html#extension-superscript-subscript % \end{markdown} % \iffalse -##### Lua Module Example {.unnumbered} +##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex -\input markdown -\input lmfonts -\directlua{ - local markdown = require("markdown") - local newline = [[^^J^^J]] - local convert = markdown.new({texMathDollars = true}) - local input = - [[$E=mc^2$]] .. newline .. newline .. - [[$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$]] - tex.sprint(convert(input)) } -\bye +\documentclass{article} +\usepackage[superscripts]{markdown} +\begin{document} +\begin{markdown} +2^10^ is 1024. +\end{markdown} +\end{document} ``````` -Then, invoke LuaTeX from the terminal: +Next, invoke LuaTeX from the terminal: ``` sh -luatex document.tex -``````` +lualatex document.tex +`````` A PDF document named `document.pdf` should be produced and contain the following text: -> $E=mc^2$ -> -> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ +> 2^10^ is 1024. -##### Lua CLI Example {.unnumbered} +##### \Hologo{ConTeXt} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex -\input markdown -\input lmfonts -\input optionfalse -\par -\input optiontrue -\bye +\usemodule[t][markdown] +\setupmarkdown[superscripts = yes] +\starttext +\startmarkdown +2^10^ is 1024. +\stopmarkdown +\stoptext ``````` -Using a text editor, create a text document named `content.md` with the -following content: -``` md -$E=mc^2$ - -$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ -`````` Next, invoke LuaTeX from the terminal: ``` sh -texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex -texlua ⟨CLI pathname⟩ texMathDollars=true -- content.md optiontrue.tex -luatex document.tex -``````` -where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, -such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or -`C:\Users\`\meta{Your username}`\texmf\scripts\markdown\markdown-cli.lua` on Windows -systems. Use the command `kpsewhich -a markdown-cli.lua` to locate the Lua CLI -script file using [Kpathsea][]. - +context --luatex document.tex +`````` A PDF document named `document.pdf` should be produced and contain the following text: -> \$E=mc^2\$ -> -> \$\$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\$\$ -> -> $E=mc^2$ -> -> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ +> 2^10^ is 1024. -##### Plain \TeX{} Example {.unnumbered} +% +%<*tex> +% \fi +% \begin{macrocode} +\@@_add_lua_option:nnn + { superscripts } + { boolean } + { false } +% \end{macrocode} +% \iffalse +% +%<*lua,lua-cli> +% \fi +% \begin{macrocode} +defaultOptions.superscripts = false +% \end{macrocode} +% \par +% \iffalse +% +%<*manual-options> -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown +#### Option `tableAttributes` -\def\markdownOptionTexMathDollars{true} -\markdownBegin -$E=mc^2$ +`tableAttributes` (default value: `false`) -$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ -\markdownEnd +% \fi +% \begin{markdown} +% +% \Optitem[false]{tableAttributes}{\opt{true}, \opt{false}} +% +: true -\bye + : Enable the assignment of HTML attributes to +% table captions (see the \Opt{tableCaptions} option). +% \iffalse + [table captions](#table-captions). +% \fi + + ``` md + | Right | Left | Default | Center | + |------:|:-----|---------|:------:| + | 12 | 12 | 12 | 12 | + | 123 | 123 | 123 | 123 | + | 1 | 1 | 1 | 1 | + + : Demonstration of pipe table syntax. {#example-table} + ``` + +: false + + : Disable the assignment of HTML attributes to table captions. + +% \end{markdown} +% \iffalse + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[ + pipeTables, + tableCaptions, + tableAttributes, + relativeReferences, +]{markdown} +\usepackage{expl3} +\ExplSyntaxOn +\markdownSetup{ + renderers = { + tableAttributeContextBegin = { + \group_begin: + \markdownSetup{ + renderers = { + attributeIdentifier = { + \markdownSetup{ + renderers = { + tableAttributeContextEnd = { + \label{##1} + \group_end: + }, + }, + } + }, + }, + } + }, + tableAttributeContextEnd = { + \group_end: + }, + }, +} +\ExplSyntaxOff +\begin{document} +\begin{markdown} +See Table <#example-table>. + +| Right | Left | Default | Center | +|------:|:-----|---------|:------:| +| 12 | 12 | 12 | 12 | +| 123 | 123 | 123 | 123 | +| 1 | 1 | 1 | 1 | + + : Demonstration of pipe table syntax. {#example-table} +\end{markdown} +\end{document} ``````` Next, invoke LuaTeX from the terminal: ``` sh -luatex document.tex +lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> $E=mc^2$ -> -> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ +> See Table 1. +> +> | Right | Left | Default | Center | +> |------:|:-----|---------|:------:| +> | 12 | 12 | 12 | 12 | +> | 123 | 123 | 123 | 123 | +> | 1 | 1 | 1 | 1 | +> +> : Table 1. Demonstration of pipe table syntax. + +% +%<*tex> +% \fi +% \begin{macrocode} +\@@_add_lua_option:nnn + { tableAttributes } + { boolean } + { false } +% \end{macrocode} +% \iffalse +% +%<*lua,lua-cli> +% \fi +% \begin{macrocode} +defaultOptions.tableAttributes = false +% \end{macrocode} +% \par +% \iffalse +% +%<*manual-options> + +#### Option `tableCaptions` {#table-captions} + +`tableCaptions` (default value: `false`) + +% \fi +% \begin{markdown} +% +% \Optitem[false]{tableCaptions}{\opt{true}, \opt{false}} +% +: true + + : Enable the Pandoc [table caption syntax + extension][pandoc-table-captions] for +% pipe tables (see the \Opt{pipeTables} option). +% \iffalse + [pipe tables](#pipe-tables). +% \fi + + ``` md + | Right | Left | Default | Center | + |------:|:-----|---------|:------:| + | 12 | 12 | 12 | 12 | + | 123 | 123 | 123 | 123 | + | 1 | 1 | 1 | 1 | + + : Demonstration of pipe table syntax. + `````` + +: false + + : Disable the Pandoc table caption syntax extension. + + [pandoc-table-captions]: https://pandoc.org/MANUAL.html#extension-table_captions + +% \end{markdown} +% \iffalse ##### \LaTeX{} Example {.unnumbered} @@ -9472,15 +9787,17 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[texMathDollars]{markdown} +\usepackage[pipeTables, tableCaptions]{markdown} \begin{document} - \begin{markdown} -$E=mc^2$ +| Right | Left | Default | Center | +|------:|:-----|---------|:------:| +| 12 | 12 | 12 | 12 | +| 123 | 123 | 123 | 123 | +| 1 | 1 | 1 | 1 | -$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ +: Demonstration of pipe table syntax. \end{markdown} - \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -9490,9 +9807,13 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> $E=mc^2$ +> | Right | Left | Default | Center | +> |------:|:-----|---------|:------:| +> | 12 | 12 | 12 | 12 | +> | 123 | 123 | 123 | 123 | +> | 1 | 1 | 1 | 1 | > -> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ +> : Demonstration of pipe table syntax. ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -9500,34 +9821,44 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[texMathDollars = yes] +\setupmarkdown + [ + pipeTables = yes, + tableCaptions = yes, + ] \starttext - \startmarkdown -$E=mc^2$ +| Right | Left | Default | Center | +|------:|:-----|---------|:------:| +| 12 | 12 | 12 | 12 | +| 123 | 123 | 123 | 123 | +| 1 | 1 | 1 | 1 | -$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ +: Demonstration of pipe table syntax. \stopmarkdown - \stoptext ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the following text: -> $E=mc^2$ +> | Right | Left | Default | Center | +> |------:|:-----|---------|:------:| +> | 12 | 12 | 12 | 12 | +> | 123 | 123 | 123 | 123 | +> | 1 | 1 | 1 | 1 | > -> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ +> : Demonstration of pipe table syntax. % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { texMathDollars } + { tableCaptions } { boolean } { false } % \end{macrocode} @@ -9536,111 +9867,158 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.texMathDollars = false +defaultOptions.tableCaptions = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `texMathDoubleBackslash` +#### Option `taskLists` -`texMathDoubleBackslash` (default value: `false`) +`taskLists` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{texMathDoubleBackslash}{\opt{true}, \opt{false}} +% \Optitem[false]{taskLists}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [double backslash math syntax - extension][pandoc-tex-math-double-backslash]: + : Enable the Pandoc [task list syntax + extension][pandoc-task-lists]: - ``` md - inline math: \\(E=mc^2\\) - display math: \\[E=mc^2\\] - ``` + ``` md + - [ ] an unticked task list item + - [/] a half-checked task list item + - [X] a ticked task list item + `````` : false - : Disable the Pandoc double backslash math syntax extension. + : Disable the Pandoc task list syntax extension. - [pandoc-tex-math-double-backslash]: https://pandoc.org/MANUAL.html#extension-tex_math_double_backslash + [pandoc-task-lists]: https://pandoc.org/MANUAL.html#extension-task_lists % \end{markdown} % \iffalse -##### Lua Module Example {.unnumbered} +##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex -\input markdown -\input lmfonts -\directlua{ - local markdown = require("markdown") - local newline = [[^^J^^J]] - local convert = markdown.new({texMathDoubleBackslash = true}) - local input = - [[\\(E=mc^2\\)]] .. newline .. newline .. - [[\\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\]]] - tex.sprint(convert(input)) } -\bye +\documentclass{article} +\usepackage[taskLists]{markdown} +\markdownSetup{ + renderers = { + untickedBox = No, + halfTickedBox = Maybe, + tickedBox = Yes, + }, +} +\begin{document} +\begin{markdown} +- [ ] you can't. +- [/] I can? +- [X] I can! +\end{markdown} +\end{document} ``````` -Then, invoke LuaTeX from the terminal: +Next, invoke LuaTeX from the terminal: ``` sh -luatex document.tex -``````` +lualatex document.tex +`````` A PDF document named `document.pdf` should be produced and contain the following text: -> \\(E=mc^2\\) -> -> \\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] +> - No you can't. +> - Maybe I can? +> - Yes I can! -##### Lua CLI Example {.unnumbered} +##### \Hologo{ConTeXt} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex -\input markdown -\input lmfonts -\input optionfalse -\par -\input optiontrue -\bye -``````` -Using a text editor, create a text document named `content.md` with the -following content: -``` md -\\(E=mc^2\\) - -\\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] -`````` +\usemodule[t][markdown] +\setupmarkdown[taskLists = yes] +\def\markdownRendererUntickedBox{No} +\def\markdownRendererHalftickedBox{Maybe} +\def\markdownRendererTickedBox{Yes} +\starttext +\startmarkdown +- [ ] you can't. +- [/] I can? +- [X] I can! +\stopmarkdown +\stoptext +```````` Next, invoke LuaTeX from the terminal: ``` sh -texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex -texlua ⟨CLI pathname⟩ texMathDoubleBackslash=true -- content.md optiontrue.tex -luatex document.tex -``````` -where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, -such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or -`C:\Users\`\meta{Your username}`\texmf\scripts\markdown\markdown-cli.lua` on Windows -systems. Use the command `kpsewhich -a markdown-cli.lua` to locate the Lua CLI -script file using [Kpathsea][]. - +context --luatex document.tex +````` A PDF document named `document.pdf` should be produced and contain the following text: -> \\\(E=mc^2\\) -> -> \\\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] -> -> \\(E=mc^2\\) -> -> \\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] +> - No you can't. +> - Maybe I can? +> - Yes I can! + +% +%<*tex> +% \fi +% \begin{macrocode} +\@@_add_lua_option:nnn + { taskLists } + { boolean } + { false } +% \end{macrocode} +% \iffalse +% +%<*lua,lua-cli> +% \fi +% \begin{macrocode} +defaultOptions.taskLists = false +% \end{macrocode} +% \par +% \iffalse +% +%<*manual-options> + +#### Option `texComments` + +`texComments` (default value: `false`) + +% \fi +% \markdownBegin +% +% \Optitem[false]{texComments}{\opt{true}, \opt{false}} +% +: true + + : Strip \TeX{}-style comments. + + ``` tex + \documentclass{article} + \usepackage[texComments]{markdown} + \begin{document} + \begin{markdown} + Hel% this is a comment + lo *world*! + \end{markdown} + \end{document} + ``````` + + Always enabled when \Opt{hybrid} is enabled. + +: false + + : Do not strip \TeX{}-style comments. + +% \markdownEnd +% \iffalse ##### Plain \TeX{} Example {.unnumbered} @@ -9648,26 +10026,19 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown - -\def\markdownOptionTexMathDoubleBackslash{true} +\def\markdownOptionTexComments{true} \markdownBegin -\\(E=mc^2\\) - -\\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] +Hel% this is a comment + lo *world*! \markdownEnd - \bye ``````` Next, invoke LuaTeX from the terminal: ``` sh luatex document.tex `````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> \\(E=mc^2\\) -> -> \\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] +A PDF document named `document.pdf` should be produced and contain the text +“Hello *world*!” ##### \LaTeX{} Example {.unnumbered} @@ -9675,15 +10046,12 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[texMathDoubleBackslash]{markdown} +\usepackage[texComments]{markdown} \begin{document} - \begin{markdown} -\\(E=mc^2\\) - -\\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] +Hel% this is a comment + lo *world*! \end{markdown} - \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -9691,11 +10059,7 @@ Next, invoke LuaTeX from the terminal: lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the -following text: - -> \\(E=mc^2\\) -> -> \\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] +text “Hello *world*!” ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -9703,34 +10067,27 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[texMathDoubleBackslash = yes] +\setupmarkdown[texComments = yes] \starttext - \startmarkdown -\\(E=mc^2\\) - -\\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] +Hel% this is a comment + lo *world*! \stopmarkdown - \stoptext ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the -following text: - -> \\(E=mc^2\\) -> -> \\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] +text “Hello *world*!” % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { texMathDoubleBackslash } + { texComments } { boolean } { false } % \end{macrocode} @@ -9739,38 +10096,38 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.texMathDoubleBackslash = false +defaultOptions.texComments = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `texMathSingleBackslash` +#### Option `texMathDollars` -`texMathSingleBackslash` (default value: `false`) +`texMathDollars` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[false]{texMathSingleBackslash}{\opt{true}, \opt{false}} +% \Optitem[false]{texMathDollars}{\opt{true}, \opt{false}} % : true - : Enable the Pandoc [single backslash math syntax - extension][pandoc-tex-math-single-backslash]: + : Enable the Pandoc [dollar math syntax + extension][pandoc-tex-math-dollars]: ``` md - inline math: \(E=mc^2\) + inline math: $E=mc^2$ - display math: \[E=mc^2\] + display math: $$E=mc^2$$ ``` : false - : Disable the Pandoc single backslash math syntax extension. + : Disable the Pandoc dollar math syntax extension. - [pandoc-tex-math-single-backslash]: https://pandoc.org/MANUAL.html#extension-tex_math_single_backslash + [pandoc-tex-math-dollars]: https://pandoc.org/MANUAL.html#extension-tex_math_dollars % \end{markdown} % \iffalse @@ -9782,14 +10139,18 @@ following content: ``` tex \input markdown \input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 \directlua{ local markdown = require("markdown") local newline = [[^^J^^J]] - local convert = markdown.new({texMathSingleBackslash = true}) + local convert = markdown.new({texMathDollars = true}) local input = - [[\(E=mc^2\)]] .. newline .. newline .. - [[\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\]]] + [[$E=mc^2$]] .. newline .. newline .. + [[$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$]] tex.sprint(convert(input)) } +\endgroup \bye ``````` Then, invoke LuaTeX from the terminal: @@ -9799,9 +10160,9 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> \(E=mc^2\) +> $E=mc^2$ > -> \[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] +> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ ##### Lua CLI Example {.unnumbered} @@ -9810,22 +10171,26 @@ following content: ``` tex \input markdown \input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 \input optionfalse \par \input optiontrue +\endgroup \bye ``````` Using a text editor, create a text document named `content.md` with the following content: ``` md -\(E=mc^2\) +$E=mc^2$ -\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] +$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ `````` Next, invoke LuaTeX from the terminal: ``` sh texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex -texlua ⟨CLI pathname⟩ texMathSingleBackslash=true -- content.md optiontrue.tex +texlua ⟨CLI pathname⟩ texMathDollars=true -- content.md optiontrue.tex luatex document.tex ``````` where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, @@ -9837,13 +10202,13 @@ script file using [Kpathsea][]. A PDF document named `document.pdf` should be produced and contain the following text: -> (E=mc^2) -> -> [\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx] +> \$E=mc^2\$ > -> \(E=mc^2\) -> -> \[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] +> \$\$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\$\$ +> +> $E=mc^2$ +> +> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ ##### Plain \TeX{} Example {.unnumbered} @@ -9852,11 +10217,11 @@ following content: ``` tex \input markdown -\def\markdownOptionTexMathSingleBackslash{true} +\def\markdownOptionTexMathDollars{true} \markdownBegin -\(E=mc^2\) +$E=mc^2$ -\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] +$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ \markdownEnd \bye @@ -9868,9 +10233,9 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> \(E=mc^2\) +> $E=mc^2$ > -> \[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] +> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ ##### \LaTeX{} Example {.unnumbered} @@ -9878,13 +10243,13 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[texMathSingleBackslash]{markdown} +\usepackage[texMathDollars]{markdown} \begin{document} \begin{markdown} -\(E=mc^2\) +$E=mc^2$ -\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] +$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ \end{markdown} \end{document} @@ -9896,9 +10261,9 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> \(E=mc^2\) +> $E=mc^2$ > -> \[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] +> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -9906,34 +10271,34 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[texMathSingleBackslash = yes] +\setupmarkdown[texMathDollars = yes] \starttext \startmarkdown -\(E=mc^2\) +$E=mc^2$ -\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] +$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ \stopmarkdown \stoptext ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the following text: -> \(E=mc^2\) +> $E=mc^2$ > -> \[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] +> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { texMathSingleBackslash } + { texMathDollars } { boolean } { false } % \end{macrocode} @@ -9942,163 +10307,119 @@ following text: %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.texMathSingleBackslash = false +defaultOptions.texMathDollars = false % \end{macrocode} % \par % \iffalse % %<*manual-options> -#### Option `tightLists` +#### Option `texMathDoubleBackslash` -`tightLists` (default value: `true`) +`texMathDoubleBackslash` (default value: `false`) % \fi % \begin{markdown} % -% \Optitem[true]{tightLists}{\opt{true}, \opt{false}} +% \Optitem[false]{texMathDoubleBackslash}{\opt{true}, \opt{false}} % : true - : Unordered and ordered lists whose items do not consist of multiple - paragraphs will be considered *tight*. Tight lists will produce tight - renderers that may produce different output than lists that are not - tight: + : Enable the Pandoc [double backslash math syntax + extension][pandoc-tex-math-double-backslash]: ``` md - - This is - - a tight - - unordered list. - - - This is - - not a tight + inline math: \\(E=mc^2\\) - - unordered list. + display math: \\[E=mc^2\\] ``` : false - : Unordered and ordered lists whose items consist of multiple paragraphs - will be treated the same way as lists that consist of multiple paragraphs. + : Disable the Pandoc double backslash math syntax extension. + + [pandoc-tex-math-double-backslash]: https://pandoc.org/MANUAL.html#extension-tex_math_double_backslash % \end{markdown} % \iffalse -##### \LaTeX{} Example {.unnumbered} +##### Lua Module Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex -\documentclass{article} -\usepackage{markdown} -\begin{document} - -\begin{markdown} -The following list is tight: - -- first item -- second item -- third item - -The following list is loose: - -- first item -- second item that spans - - multiple paragraphs -- third item -\end{markdown} - -\begin{markdown*}{tightLists=false} -The following list is now also loose: - -- first item -- second item -- third item -\end{markdown*} - -\end{document} +\input markdown +\input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\directlua{ + local markdown = require("markdown") + local newline = [[^^J^^J]] + local convert = markdown.new({texMathDoubleBackslash = true}) + local input = + [[\\(E=mc^2\\)]] .. newline .. newline .. + [[\\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\]]] + tex.sprint(convert(input)) } +\endgroup +\bye ``````` -Next, invoke LuaTeX from the terminal: +Then, invoke LuaTeX from the terminal: ``` sh -lualatex document.tex -`````` +luatex document.tex +``````` A PDF document named `document.pdf` should be produced and contain the following text: -> The following list is tight: -> -> - first item -> - second item -> - third item -> -> The following list is loose: -> -> - first item -> - second item that spans -> -> multiple paragraphs -> - third item -> -> The following list is now also loose: -> -> - first item -> -> - second item +> \\(E=mc^2\\) > -> - third item - -% -%<*tex> -% \fi -% \begin{macrocode} -\@@_add_lua_option:nnn - { tightLists } - { boolean } - { true } -% \end{macrocode} -% \iffalse -% -%<*lua,lua-cli> -% \fi -% \begin{macrocode} -defaultOptions.tightLists = true -% \end{macrocode} -% \par -% \iffalse -% -%<*manual-options> - -#### Option `underscores` - -`underscores` (default value: `true`) - -% \fi -% \begin{markdown} -% -% \Optitem[true]{underscores}{\opt{true}, \opt{false}} -% -: true +> \\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] - : Both underscores and asterisks can be used to denote emphasis and - strong emphasis: +##### Lua CLI Example {.unnumbered} - ``` md - *single asterisks* - _single underscores_ - **double asterisks** - __double underscores__ - `````` +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\input optionfalse +\par +\input optiontrue +\endgroup +\bye +``````` +Using a text editor, create a text document named `content.md` with the +following content: +``` md +\\(E=mc^2\\) -: false +\\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] +`````` +Next, invoke LuaTeX from the terminal: +``` sh +texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex +texlua ⟨CLI pathname⟩ texMathDoubleBackslash=true -- content.md optiontrue.tex +luatex document.tex +``````` +where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, +such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or +`C:\Users\`\meta{Your username}`\texmf\scripts\markdown\markdown-cli.lua` on Windows +systems. Use the command `kpsewhich -a markdown-cli.lua` to locate the Lua CLI +script file using [Kpathsea][]. - : Only asterisks can be used to denote emphasis and strong emphasis. - This makes it easy to write math with the \Opt{hybrid} option - without the need to constantly escape subscripts. +A PDF document named `document.pdf` should be produced and contain the +following text: -% \end{markdown} -% \iffalse +> \\\(E=mc^2\\) +> +> \\\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] +> +> \\(E=mc^2\\) +> +> \\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] ##### Plain \TeX{} Example {.unnumbered} @@ -10106,15 +10427,12 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownOptionHybrid{true} +\def\markdownOptionTexMathDoubleBackslash{true} \markdownBegin -This is _emphasized text_ and this is a math subscript: $m\_n$. -\markdownEnd +\\(E=mc^2\\) -\def\markdownOptionUnderscores{false} -\markdownBegin -This is *emphasized text* and this is a math subscript: $m_n$. +\\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] \markdownEnd \bye @@ -10126,9 +10444,9 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> This is _emphasized text_ and this is a math subscript: *mₙ*. -> -> This is _emphasized text_ and this is a math subscript: *mₙ*. +> \\(E=mc^2\\) +> +> \\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] ##### \LaTeX{} Example {.unnumbered} @@ -10136,16 +10454,14 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[hybrid]{markdown} +\usepackage[texMathDoubleBackslash]{markdown} \begin{document} \begin{markdown} -This is _emphasized text_ and this is a math subscript: $m\_n$. -\end{markdown} +\\(E=mc^2\\) -\begin{markdown*}{underscores=false} -This is *emphasized text* and this is a math subscript: $m_n$. -\end{markdown*} +\\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] +\end{markdown} \end{document} ``````` @@ -10156,9 +10472,9 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> This is _emphasized text_ and this is a math subscript: *mₙ*. -> -> This is _emphasized text_ and this is a math subscript: *mₙ*. +> \\(E=mc^2\\) +> +> \\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -10166,1233 +10482,811 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[hybrid = yes] +\setupmarkdown[texMathDoubleBackslash = yes] \starttext \startmarkdown -This is _emphasized text_ and this is a math subscript: $m\_n$. -\stopmarkdown +\\(E=mc^2\\) -\setupmarkdown[underscores = yes] -\startmarkdown -This is *emphasized text* and this is a math subscript: $m_n$. +\\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] \stopmarkdown \stoptext ```````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex ````` A PDF document named `document.pdf` should be produced and contain the following text: -> This is _emphasized text_ and this is a math subscript: *mₙ*. -> -> This is _emphasized text_ and this is a math subscript: *mₙ*. +> \\(E=mc^2\\) +> +> \\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\\] % %<*tex> % \fi % \begin{macrocode} \@@_add_lua_option:nnn - { underscores } + { texMathDoubleBackslash } { boolean } - { true } -\ExplSyntaxOff + { false } % \end{macrocode} % \iffalse % %<*lua,lua-cli> % \fi % \begin{macrocode} -defaultOptions.underscores = true +defaultOptions.texMathDoubleBackslash = false % \end{macrocode} -% \endgroup +% \par % \iffalse % -%<*lua-cli> +%<*manual-options> + +#### Option `texMathSingleBackslash` + +`texMathSingleBackslash` (default value: `false`) + % \fi -% \par % \begin{markdown} % -%### Command-Line Interface {#lua-cli-interface} -% -% The high-level operation of the Markdown package involves the communication -% between several programming layers: the plain \TeX{} layer hands markdown -% documents to the Lua layer. Lua converts the documents to \TeX{}, and hands -% the converted documents back to plain \TeX{} layer for typesetting, see -% Figure <#fig:sequence-diagram-tex-interface>. -% -% This procedure has the advantage of being fully automated. However, it also -% has several important disadvantages: The converted \TeX{} documents are -% cached on the file system, taking up increasing amount of space. Unless the -% \TeX{} engine includes a Lua interpreter, the package also requires shell -% access, which opens the door for a malicious actor to access the system. -% Last, but not least, the complexity of the procedure impedes debugging. -% -% A solution to the above problems is to decouple the conversion from the -% typesetting. For this reason, a command-line Lua interface for converting a -% markdown document to \TeX{} is also provided, see -% Figure <#fig:sequence-diagram-lua-cli>. +% \Optitem[false]{texMathSingleBackslash}{\opt{true}, \opt{false}} % -% \end{markdown} -% \begin{figure} -% \centering -% \begin{sequencediagram} -% \newthread{user}{User}{} -% \newinst[4]{tex}{\TeX{}}{} -% \newinst[4]{lua}{Lua}{} -% \begin{call}{user}{\footnotesize\cs{jobname.tex}}{tex}{\footnotesize\cs{jobname.pdf}} -% \begin{call}{tex}{\footnotesize\cs{jobname.markdown.in}}{lua}{\footnotesize\cs{jobname.markdown.out}} -% \end{call} -% \begin{call}{tex}{\footnotesize\cs{input}\cs{jobname.markdown.out}}{tex}{} -% \end{call} -% \end{call} -% \end{sequencediagram} -% \caption[A sequence diagram of typesetting a document using the \TeX{} -% interface]{A sequence diagram of the Markdown package typesetting a -% markdown document using the \TeX{} interface} -% \label{fig:sequence-diagram-tex-interface} -% \end{figure} -% \begin{figure} -% \centering -% \begin{sequencediagram} -% \newthread{user}{User}{} -% \newinst[4]{tex}{\TeX{}}{} -% \newinst[4]{lua}{Lua}{} -% \begin{call}{user}{\footnotesize$\langle$\textit{document}$\rangle$\texttt{.md}}{lua}{\footnotesize$\langle$\textit{document}$\rangle$\texttt{.tex}} -% \end{call} -% \begin{call}{user}{\footnotesize\cs{jobname.tex}}{tex}{\footnotesize\cs{jobname.pdf}} -% \begin{call}{tex}{\footnotesize\cs{input} $\langle$\textit{document}$\rangle$}{tex}{} -% \end{call} -% \end{call} -% \end{sequencediagram} -% \caption[A sequence diagram of typesetting a document using the Lua CLI]% -% {A sequence diagram of the Markdown package typesetting a markdown document -% using the Lua command-line interface} -% \label{fig:sequence-diagram-lua-cli} -% \end{figure} -% \begin{macrocode} - -local HELP_STRING = [[ -Usage: texlua ]] .. arg[0] .. [[ [OPTIONS] -- [INPUT_FILE] [OUTPUT_FILE] -where OPTIONS are documented in the Lua interface section of the -technical Markdown package documentation. - -When OUTPUT_FILE is unspecified, the result of the conversion will be -written to the standard output. When INPUT_FILE is also unspecified, the -result of the conversion will be read from the standard input. - -Report bugs to: witiko@mail.muni.cz -Markdown package home page: ]] - -local VERSION_STRING = [[ -markdown-cli.lua (Markdown) ]] .. metadata.version .. [[ +: true -Copyright (C) ]] .. table.concat(metadata.copyright, - "\nCopyright (C) ") .. [[ + : Enable the Pandoc [single backslash math syntax + extension][pandoc-tex-math-single-backslash]: -License: ]] .. metadata.license + ``` md + inline math: \(E=mc^2\) -local function warn(s) - io.stderr:write("Warning: " .. s .. "\n") end + display math: \[E=mc^2\] + ``` -local function error(s) - io.stderr:write("Error: " .. s .. "\n") - os.exit(1) -end -% \end{macrocode} -% \begin{markdown} -% -% To make it easier to copy-and-paste options from Pandoc [@macfarlane22] such -% as `fancy_lists`, `header_attributes`, and `pipe_tables`, we accept -% snake\\\_case in addition to camelCase variants of options. As a bonus, -% studies [@sharif10] also show that snake\\\_case is faster to read than -% camelCase. -% -% \end{markdown} -% \begin{macrocode} -local function camel_case(option_name) - local cased_option_name = option_name:gsub("_(%l)", function(match) - return match:sub(2, 2):upper() - end) - return cased_option_name -end +: false -local function snake_case(option_name) - local cased_option_name = option_name:gsub("%l%u", function(match) - return match:sub(1, 1) .. "_" .. match:sub(2, 2):lower() - end) - return cased_option_name -end + : Disable the Pandoc single backslash math syntax extension. -local cases = {camel_case, snake_case} -local various_case_options = {} -for option_name, _ in pairs(defaultOptions) do - for _, case in ipairs(cases) do - various_case_options[case(option_name)] = option_name - end -end + [pandoc-tex-math-single-backslash]: https://pandoc.org/MANUAL.html#extension-tex_math_single_backslash -local process_options = true -local options = {} -local input_filename -local output_filename -for i = 1, #arg do - if process_options then -% \end{macrocode} -% \begin{markdown} -% After the optional `-`{}`-` argument has been specified, the remaining -% arguments are assumed to be input and output filenames. This argument is -% optional, but encouraged, because it helps resolve ambiguities when -% deciding whether an option or a filename has been specified. -% \end{markdown} -% \begin{macrocode} - if arg[i] == "--" then - process_options = false - goto continue -% \end{macrocode} -% \begin{markdown} -% Unless the `-`{}`-` argument has been specified before, an argument -% containing the equals sign (`=`) is assumed to be an option specification in -% a \meta{key}`=`\meta{value} format. The available options are listed in -% Section <#sec:lua-options>. -% \end{markdown} -% \begin{macrocode} - elseif arg[i]:match("=") then - local key, value = arg[i]:match("(.-)=(.*)") - if defaultOptions[key] == nil and - various_case_options[key] ~= nil then - key = various_case_options[key] - end -% \end{macrocode} -% \begin{markdown} -% The \luamref{defaultOptions} table is consulted to identify whether \meta{value} -% should be parsed as a string, number, table, or boolean. -% \end{markdown} -% \begin{macrocode} - local default_type = type(defaultOptions[key]) - if default_type == "boolean" then - options[key] = (value == "true") - elseif default_type == "number" then - options[key] = tonumber(value) - elseif default_type == "table" then - options[key] = {} - for item in value:gmatch("[^ ,]+") do - table.insert(options[key], item) - end - else - if default_type ~= "string" then - if default_type == "nil" then - warn('Option "' .. key .. '" not recognized.') - else - warn('Option "' .. key .. '" type not recognized, please file ' .. - 'a report to the package maintainer.') - end - warn('Parsing the ' .. 'value "' .. value ..'" of option "' .. - key .. '" as a string.') - end - options[key] = value - end - goto continue -% \end{macrocode} -% \begin{markdown} -% Unless the `-`{}`-` argument has been specified before, an argument -% `-`{}`-help`, or `-h` causes a brief documentation for how to invoke the -% program to be printed to the standard output. -% \end{markdown} -% \begin{macrocode} - elseif arg[i] == "--help" or arg[i] == "-h" then - print(HELP_STRING) - os.exit() -% \end{macrocode} -% \begin{markdown} -% Unless the `-`{}`-` argument has been specified before, an argument -% `-`{}`-version`, or `-v` causes the program to print information about its -% name, version, origin and legal status, all on standard output. -% \end{markdown} -% \begin{macrocode} - elseif arg[i] == "--version" or arg[i] == "-v" then - print(VERSION_STRING) - os.exit() - end - end -% \end{macrocode} -% \begin{markdown} -% The first argument that matches none of the above patters is assumed to be -% the input filename. The input filename should correspond to the Markdown -% document that is going to be converted to a \TeX{} document. -% \end{markdown} -% \begin{macrocode} - if input_filename == nil then - input_filename = arg[i] -% \end{macrocode} -% \begin{markdown} -% The first argument that matches none of the above patters is assumed to be -% the output filename. The output filename should correspond to the \TeX{} -% document that will result from the conversion. -% \end{markdown} -% \begin{macrocode} - elseif output_filename == nil then - output_filename = arg[i] - else - error('Unexpected argument: "' .. arg[i] .. '".') - end - ::continue:: -end -% \end{macrocode} -% \par -% \begin{markdown} -% -% The command-line Lua interface is implemented by the `markdown-cli.lua` -% file that can be invoked from the command line as follows: -% ``` sh -% texlua /path/to/markdown-cli.lua cacheDir=. -- hello.md hello.tex -% `````` -% \noindent to convert the Markdown document `hello.md` to a \TeX{} document -% `hello.tex`. After the Markdown package for our \TeX{} format has been -% loaded, the converted document can be typeset as follows: -% ``` tex -% \input hello -% ``````` -% % \end{markdown} % \iffalse -% -%<*tex> -% \fi -% \par -% \begin{markdown} -% -% Plain \TeX{} Interface {#texinterface} -%------------------------ -% -% \iffalse -% -%<*manual-interfaces> - -### Plain \TeX{} - -The plain \TeX{} interface provides \TeX{} commands that typeset markdown -documents by using the Lua interface behind the scenes. Unlike the Lua -interface, the plain TeX interface does not provide low-level tools for -converting markdown to \TeX{}. Instead, its goal is to provide high-level -typesetting capabilities. -The plain \TeX{} interface accepts the same options as the `markdown` Lua -module, in addition to its own options, but now the options are specified as -\TeX{} commands. +##### Lua Module Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown \input lmfonts - -\markdownBegin -$\sqrt{-1}$ *equals* $i$. -\markdownEnd - -\def\markdownOptionHybrid{true} -\markdownBegin -$\sqrt{-1}$ *equals* $i$. -\markdownEnd - +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\directlua{ + local markdown = require("markdown") + local newline = [[^^J^^J]] + local convert = markdown.new({texMathSingleBackslash = true}) + local input = + [[\(E=mc^2\)]] .. newline .. newline .. + [[\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\]]] + tex.sprint(convert(input)) } +\endgroup \bye ``````` -Next, invoke LuaTeX from the terminal: +Then, invoke LuaTeX from the terminal: ``` sh luatex document.tex +``````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> \(E=mc^2\) +> +> \[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] + +##### Lua CLI Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\input lmfonts +\begingroup +\catcode`\%=12 +\catcode`\#=12 +\input optionfalse +\par +\input optiontrue +\endgroup +\bye +``````` +Using a text editor, create a text document named `content.md` with the +following content: +``` md +\(E=mc^2\) + +\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] `````` +Next, invoke LuaTeX from the terminal: +``` sh +texlua ⟨CLI pathname⟩ -- content.md optionfalse.tex +texlua ⟨CLI pathname⟩ texMathSingleBackslash=true -- content.md optiontrue.tex +luatex document.tex +``````` +where \meta{CLI pathname} corresponds to the location of the Lua CLI script file, +such as `~/texmf/scripts/markdown/markdown-cli.lua` on UN\*X systems or +`C:\Users\`\meta{Your username}`\texmf\scripts\markdown\markdown-cli.lua` on Windows +systems. Use the command `kpsewhich -a markdown-cli.lua` to locate the Lua CLI +script file using [Kpathsea][]. + A PDF document named `document.pdf` should be produced and contain the following text: -> \$\\sqrt{-1}\$ *equals* \$i\$. +> (E=mc^2) > -> 1 -> *equals* -> i. +> [\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx] +> +> \(E=mc^2\) +> +> \[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] -Invoking pdfTeX should have the same effect: +##### Plain \TeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown + +\def\markdownOptionTexMathSingleBackslash{true} +\markdownBegin +\(E=mc^2\) + +\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] +\markdownEnd + +\bye +``````` +Next, invoke LuaTeX from the terminal: ``` sh -pdftex --shell-escape document.tex +luatex document.tex `````` +A PDF document named `document.pdf` should be produced and contain the +following text: -% +> \(E=mc^2\) +> +> \[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[texMathSingleBackslash]{markdown} +\begin{document} + +\begin{markdown} +\(E=mc^2\) + +\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] +\end{markdown} + +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> \(E=mc^2\) +> +> \[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\setupmarkdown[texMathSingleBackslash = yes] +\starttext + +\startmarkdown +\(E=mc^2\) + +\[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] +\stopmarkdown + +\stoptext +```````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> \(E=mc^2\) +> +> \[\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\] + +% %<*tex> % \fi -% -% The plain \TeX{} interface provides macros for the typesetting of markdown -% input from within plain \TeX{}, for setting the Lua interface options (see -% Section <#sec:lua-options>) used during the conversion from markdown to -% plain \TeX{} and for changing the way markdown the tokens are rendered. -% -% \end{markdown} % \begin{macrocode} -\def\markdownLastModified{(((LASTMODIFIED)))}% -\def\markdownVersion{(((VERSION)))}% +\@@_add_lua_option:nnn + { texMathSingleBackslash } + { boolean } + { false } % \end{macrocode} -% \par -% \begin{markdown} -% -% The plain \TeX{} interface is implemented by the `markdown.tex` file that can -% be loaded as follows: -% ``` tex -% \input markdown -% ``````` -% \noindent It is expected that the special plain \TeX{} characters have the -% expected category codes, when `\input`ting the file. -% -%### Typesetting Markdown {#tex-typesetting} -% -% The interface exposes the \mdef{markdownBegin}, \mdef{markdownEnd}, -% \mdef{markdownInput}, and \mdef{markdownEscape} macros. -% -% The \mref{markdownBegin} macro marks the beginning of a markdown document -% fragment and the \mref{markdownEnd} macro marks its end. -% -% \end{markdown} +% \iffalse +% +%<*lua,lua-cli> +% \fi % \begin{macrocode} -\let\markdownBegin\relax -\let\markdownEnd\relax +defaultOptions.texMathSingleBackslash = false % \end{macrocode} % \par +% \iffalse +% +%<*manual-options> + +#### Option `tightLists` + +`tightLists` (default value: `true`) + +% \fi % \begin{markdown} % -% You may prepend your own code to the \mref{markdownBegin} macro and redefine the -% \mref{markdownEnd} macro to produce special effects before and after the -% markdown block. -% -% There are several limitations to the macros you need to be aware of. -% The first limitation concerns the \mref{markdownEnd} macro, which must be -% visible directly from the input line buffer (it may not be produced as a -% result of input expansion). Otherwise, it will not be recognized as the end -% of the markdown string. As a corrolary, the \mref{markdownEnd} string -% may not appear anywhere inside the markdown input. -% -% Another limitation concerns spaces at the right end of an input line. In -% markdown, these are used to produce a forced line break. However, any such -% spaces are removed before the lines enter the input buffer of -% \TeX{}~[@knuth86a, p. 46]. As a corrolary, the \mref{markdownBegin} macro also -% ignores them. -% -% The \mref{markdownBegin} and \mref{markdownEnd} macros will also consume the rest -% of the lines at which they appear. In the following example plain \TeX{} -% code, the characters `c`, `e`, and `f` will not appear in the output. -% -% ``` tex -% \input markdown -% a -% b \markdownBegin c -% d -% e \markdownEnd f -% g -% \bye -% ``````` -% -% Note that you may also not nest the \mref{markdownBegin} and \mref{markdownEnd} -% macros. -% -% The following example plain \TeX{} code showcases the usage of the -% \mref{markdownBegin} and \mref{markdownEnd} macros: -% -% ``` tex -% \input markdown -% \markdownBegin -% _Hello_ **world** ... -% \markdownEnd -% \bye -% ``````` -% -% The \mref{markdownInput} macro accepts a single parameter with the filename -% of a markdown document and expands to the result of the conversion of the -% input markdown document to plain \TeX{}. +% \Optitem[true]{tightLists}{\opt{true}, \opt{false}} % +: true + + : Unordered and ordered lists whose items do not consist of multiple + paragraphs will be considered *tight*. Tight lists will produce tight + renderers that may produce different output than lists that are not + tight: + + ``` md + - This is + - a tight + - unordered list. + + - This is + + not a tight + + - unordered list. + ``` + +: false + + : Unordered and ordered lists whose items consist of multiple paragraphs + will be treated the same way as lists that consist of multiple paragraphs. + % \end{markdown} -% \begin{macrocode} -\let\markdownInput\relax -% \end{macrocode} -% \par -% \begin{markdown} -% -% This macro is not subject to the abovelisted limitations of the -% \mref{markdownBegin} and \mref{markdownEnd} macros. -% -% The following example plain \TeX{} code showcases the usage of the -% \mref{markdownInput} macro: -% -% ``` tex -% \input markdown -% \markdownInput{hello.md} -% \bye -% ``````` -% -% The \mref{markdownEscape} macro accepts a single parameter with the filename -% of a \TeX{} document and executes the \TeX{} document in the middle of a -% markdown document fragment. Unlike the `\input` built-in of \TeX, -% \mref{markdownEscape} guarantees that the standard catcode regime of your -% \TeX{} format will be used. -% -% \end{markdown} -% \begin{macrocode} -\let\markdownEscape\relax -% \end{macrocode} -% \par -% \begin{markdown} -% -%### Options {#tex-options} -% -% The plain \TeX{} options are represented by \TeX{} commands. Some of them map -% directly to the options recognized by the Lua interface (see -% Section <#sec:lua-options>), while some of them are specific to the plain -% \TeX{} interface. -% -% To enable the enumeration of plain \TeX{} options, we will maintain the -% \mdef{g_\@\@_plain_tex_options_seq} sequence. -% -% \end{markdown} -% \begin{macrocode} -\ExplSyntaxOn -\seq_new:N \g_@@_plain_tex_options_seq -% \end{macrocode} -% \begin{markdown} -% -% To enable the reflection of default plain \TeX{} options and their types, we -% will maintain the \mdef{g_\@\@_default_plain_tex_options_prop} and -% \mdef{g_\@\@_plain_tex_option_types_prop} property lists, respectively. -% -% \end{markdown} -% \begin{macrocode} -\prop_new:N \g_@@_plain_tex_option_types_prop -\prop_new:N \g_@@_default_plain_tex_options_prop -\tl_const:Nn \c_@@_option_layer_plain_tex_tl { plain_tex } -\seq_gput_right:NV \g_@@_option_layers_seq \c_@@_option_layer_plain_tex_tl -\cs_new:Nn - \@@_add_plain_tex_option:nnn - { - \@@_add_option:Vnnn - \c_@@_option_layer_plain_tex_tl - { #1 } - { #2 } - { #3 } - } -% \end{macrocode} % \iffalse -% -%<*manual-options> -### Plain \TeX{} +##### \LaTeX{} Example {.unnumbered} -Plain \TeX{} options control the communication between the \TeX{} interface and -the `markdown` Lua module. They are supported by all higher-level interfaces of -the Markdown package, i.e. the plain \TeX{}, \LaTeX{} and \Hologo{ConTeXt} -interfaces. +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage{markdown} +\begin{document} -#### Setting Lua options from plain \TeX{} +\begin{markdown} +The following list is tight: -As a rule of thumb, you can set all Lua options directly from plain \TeX{}. For -example, to set the \Opt{taskLists} Lua option to `true`, you would include the -following code in your plain \TeX{} document: +- first item +- second item +- third item -``` tex -\def\markdownOptionTaskLists{true} -``` +The following list is loose: -% -%<*tex> -% \fi -% \par -% \begin{markdown} -% -%#### Finalizing and Freezing the Cache -% The \mdef{markdownOptionFinalizeCache} option corresponds to the Lua -% interface \Opt{finalizeCache} option, which creates an output file -% \Opt{frozenCacheFileName} (frozen cache) that contains a mapping -% between an enumeration of the markdown documents in the plain \TeX{} document -% and their auxiliary files cached in the \Opt{cacheDir} directory. -% -% \iffalse -% -%<*manual-options> +- first item +- second item that spans -#### Finalizing and Freezing the Cache + multiple paragraphs +- third item +\end{markdown} -% \fi -% -The \mdef{markdownOptionFrozenCache} option uses the mapping previously -% created by the \Opt{finalizeCache} option, -% \iffalse -created by the Lua interface \Opt{finalizeCache} option, -% \fi -and uses it to typeset the plain \TeX{} document without invoking Lua. As a -result, the plain \TeX{} document becomes more portable, but further changes -in the order and the content of markdown documents will not be reflected. It -defaults to `false`. +\begin{markdown}[tightLists=false] +The following list is now also loose: + +- first item +- second item +- third item +\end{markdown} + +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> The following list is tight: +> +> - first item +> - second item +> - third item +> +> The following list is loose: +> +> - first item +> - second item that spans +> +> multiple paragraphs +> - third item +> +> The following list is now also loose: +> +> - first item +> +> - second item +> +> - third item -% \end{markdown} -% \iffalse % %<*tex> % \fi % \begin{macrocode} -\@@_add_plain_tex_option:nnn - { frozenCache } +\@@_add_lua_option:nnn + { tightLists } { boolean } - { false } + { true } % \end{macrocode} % \iffalse % -%<*manual-options> -% \fi -% \begin{markdown} -% -% The standard usage of the above two options is as follows: -% \iffalse -The standard usage of the \Opt{finalizeCache} and \Opt{frozenCache} -options is as follows: +%<*lua,lua-cli> % \fi - -1. Remove the \Opt{cacheDir} cache directory with stale auxiliary cache - files. -% 2. Enable the \Opt{finalizeCache} option. +% \begin{macrocode} +defaultOptions.tightLists = true +% \end{macrocode} +% \par % \iffalse -2. Enable the \Opt{finalizeCache} option. -% \fi -3. Typeset the plain \TeX{} document to populate and finalize the cache. -4. Enable the \Opt{frozenCache} option. -5. Publish the source code of the plain \TeX{} document and the - \Opt{cacheDir} directory. +% +%<*manual-options> -% \iffalse -For more information, see the examples for the \Opt{finalizeCache} option. -% \fi +#### Option `underscores` -#### File and Directory Names +`underscores` (default value: `true`) -% \end{markdown} -% \iffalse -% -%<*tex> % \fi % \begin{markdown} % -% The \mdef{markdownOptionHelperScriptFileName} macro sets the filename of the -% helper Lua script file that is created during the conversion from markdown to -% plain \TeX{} in \TeX{} engines without the `\directlua` primitive. It -% defaults to `\jobname.markdown.lua`, where `\jobname` is the base name -% of the document being typeset. -% -% The expansion of this macro must not contain quotation marks (`"`) or -% backslash symbols (`\`). Mind that \TeX{} engines tend to -% put quotation marks around `\jobname`, when it contains spaces. -% -% \end{markdown} -% \begin{macrocode} -\@@_add_plain_tex_option:nnn - { helperScriptFileName } - { path } - { \jobname.markdown.lua } -% \end{macrocode} -% \par -% \begin{markdown} -% -% The \Opt{helperScriptFileName} macro has been deprecated and -% will be removed in Markdown 3.0.0. To control the filename of the helper Lua -% script file, use the `\g_luabridge_helper_script_filename_str` macro from the -% \pkg{lt3luabridge} package. -% -% \end{markdown} -% \begin{macrocode} -\str_new:N - \g_luabridge_helper_script_filename_str -\tl_gset:Nn - \g_luabridge_helper_script_filename_str - { \markdownOptionHelperScriptFileName } -% \end{macrocode} -% \begin{markdown} -% -% The \mdef{markdownOptionInputTempFileName} macro sets the filename of the -% temporary input file that is created during the buffering of markdown text -% from a \TeX{} source. It defaults to `\jobname.markdown.in`. The same -% limitations as in the case of the \Opt{helperScriptFileName} -% macro apply here. +% \Optitem[true]{underscores}{\opt{true}, \opt{false}} % +: true + + : Both underscores and asterisks can be used to denote emphasis and + strong emphasis: + + ``` md + *single asterisks* + _single underscores_ + **double asterisks** + __double underscores__ + `````` + +: false + + : Only asterisks can be used to denote emphasis and strong emphasis. + This makes it easy to write math with the \Opt{hybrid} option + without the need to constantly escape subscripts. + % \end{markdown} -% \begin{macrocode} -\@@_add_plain_tex_option:nnn - { inputTempFileName } - { path } - { \jobname.markdown.in } -% \end{macrocode} -% \par -% \begin{markdown} -% -% The \mdef{markdownOptionOutputTempFileName} macro sets the filename of the -% temporary output file that is created during the conversion from markdown to -% plain \TeX{} in \mref{markdownMode} other than `2` It defaults to -% `\jobname.markdown.out`. The same limitations apply here as in the case -% of the \Opt{helperScriptFileName} macro. -% -% \end{markdown} -% \begin{macrocode} -\@@_add_plain_tex_option:nnn - { outputTempFileName } - { path } - { \jobname.markdown.out } -% \end{macrocode} -% \par -% \begin{markdown} -% -% The \Opt{outputTempFileName} macro has been deprecated and -% will be removed in Markdown 3.0.0. -% -% \end{markdown} -% \begin{macrocode} -\str_new:N - \g_luabridge_standard_output_filename_str -\tl_gset:Nn - \g_luabridge_standard_output_filename_str - { \markdownOptionOutputTempFileName } -% \end{macrocode} -% \begin{markdown} -% -% The \mdef{markdownOptionErrorTempFileName} macro sets the filename of the -% temporary output file that is created when a Lua error is encountered during -% the conversion from markdown to plain \TeX{} in \mref{markdownMode} other than -% `2`. It defaults to `\jobname.markdown.err`. The same limitations -% apply here as in the case of the \Opt{helperScriptFileName} -% macro. -% -% \end{markdown} -% \begin{macrocode} -\@@_add_plain_tex_option:nnn - { errorTempFileName } - { path } - { \jobname.markdown.err } -% \end{macrocode} -% \par -% \begin{markdown} -% -% The \Opt{errorTempFileName} macro has been deprecated and -% will be removed in Markdown 3.0.0. To control the filename of the temporary -% file for Lua errors, use the `\g_luabridge_error_output_filename_str` macro -% from the \pkg{lt3luabridge} package. -% -% \end{markdown} -% \begin{macrocode} -\str_new:N - \g_luabridge_error_output_filename_str -\tl_gset:Nn - \g_luabridge_error_output_filename_str - { \markdownOptionErrorTempFileName } -% \end{macrocode} -% \begin{markdown} -% -% The \mdef{markdownOptionOutputDir} macro sets the path to the directory that -% will contain the auxiliary cache files produced by the Lua implementation and -% also the auxiliary files produced by the plain \TeX{} implementation. The -% option defaults to `.`. -% -% The path must be set to the same value as the `-output-directory` option of -% your \TeX{} engine for the package to function correctly. We need this macro -% to make the Lua implementation aware where it should store the helper files. -% The same limitations apply here as in the case of the -% \Opt{helperScriptFileName} macro. -% -% \end{markdown} -% \begin{macrocode} -\@@_add_plain_tex_option:nnn - { outputDir } - { path } - { . } -% \end{macrocode} -% \begin{markdown} -% -% Here, we automatically define plain \TeX{} macros for the above plain \TeX{} -% options. -% -% Furthemore, we also define macros that map directly to the options recognized -% by the Lua interface, such as \mdef{markdownOptionHybrid} for the -% \Opt{hybrid} Lua option (see Section <#sec:lua-options>), which are not -% processed by the plain \TeX{} implementation, only passed along to Lua. -% -% For the macros that correspond to the non-boolean options recognized by the -% Lua interface, the same limitations apply here in the case of the -% \Opt{helperScriptFileName} macro. -% -% \end{markdown} -% \begin{macrocode} -\cs_new:Nn \@@_plain_tex_define_option_commands: - { - \seq_map_inline:Nn - \g_@@_option_layers_seq - { - \seq_map_inline:cn - { g_@@_ ##1 _options_seq } - { - \@@_plain_tex_define_option_command:n - { ####1 } - } - } - } -\cs_new:Nn \@@_plain_tex_define_option_command:n - { - \@@_get_default_option_value:nN - { #1 } - \l_tmpa_tl - \@@_set_option_value:nV - { #1 } - \l_tmpa_tl - } -\cs_new:Nn - \@@_set_option_value:nn - { - \@@_define_option:n - { #1 } - \@@_get_option_type:nN - { #1 } - \l_tmpa_tl - \str_if_eq:NNTF - \c_@@_option_type_counter_tl - \l_tmpa_tl - { - \@@_option_tl_to_csname:nN - { #1 } - \l_tmpa_tl - \int_gset:cn - { \l_tmpa_tl } - { #2 } - } - { - \@@_option_tl_to_csname:nN - { #1 } - \l_tmpa_tl - \cs_set:cpn - { \l_tmpa_tl } - { #2 } - } - } -\cs_generate_variant:Nn - \@@_set_option_value:nn - { nV } -\cs_new:Nn - \@@_define_option:n - { - \@@_option_tl_to_csname:nN - { #1 } - \l_tmpa_tl - \cs_if_free:cT - { \l_tmpa_tl } - { - \@@_get_option_type:nN - { #1 } - \l_tmpb_tl - \str_if_eq:NNT - \c_@@_option_type_counter_tl - \l_tmpb_tl - { - \@@_option_tl_to_csname:nN - { #1 } - \l_tmpa_tl - \int_new:c - { \l_tmpa_tl } - } - } - } -\@@_plain_tex_define_option_commands: -% \end{macrocode} -% % \iffalse -% -%<*manual-options> - -The plain \TeX{} interface provides the following commands that you can use to -specify the location of temporary files produced during the conversion from -Markdown to \TeX{}: -- `\markdownOptionHelperScriptFileName`, -- `\markdownOptionInputTempFileName`, -- `\markdownOptionOutputTempFileName`, -- `\markdownOptionErrorTempFileName`, -- `\markdownOptionOutputDir`, -- `\markdownOptionCacheDir`, and -- `\markdownOptionFrozenCacheFileName`. - -The `\markdownOptionCacheDir` and `\markdownOptionFrozenCacheFileName` commands -correspond to the `cacheDir` and `frozenCacheFileName` Lua options. +##### Plain \TeX{} Example {.unnumbered} -Using a text editor, create a folder named `output-directory` and a text -document named `document.tex` with the following content: +Using a text editor, create a text document named `document.tex` with the +following content: ``` tex -\input lmfonts \input markdown -\def\markdownOptionHelperScriptFileName{helper-script.lua} -\def\markdownOptionInputTempFileName{temporary-input.md} -\def\markdownOptionOutputTempFileName{temporary-output.tex} -\def\markdownOptionErrorTempFileName{error-output.txt} -\def\markdownOptionOutputDir{output-directory} -\def\markdownOptionCacheDir{output-directory/cache-directory} -\markdownOptionFinalizeCachetrue -\def\markdownOptionFrozenCacheFileName{output-directory/cache-directory/frozen-cache.tex} +\def\markdownOptionHybrid{true} + \markdownBegin -Hello *world*! +This is _emphasized text_ and this is a math subscript: $m\_n$. +\markdownEnd + +\def\markdownOptionUnderscores{false} +\markdownBegin +This is *emphasized text* and this is a math subscript: $m_n$. \markdownEnd + \bye ``````` Next, invoke LuaTeX from the terminal: ``` sh -luatex --output-directory output-directory document.tex +luatex document.tex `````` -A text document named `temporary-input.md` should be produced in the folder -named `output-directory` and contain the following text: +A PDF document named `document.pdf` should be produced and contain the +following text: -> Hello \*world\*! +> This is _emphasized text_ and this is a math subscript: *mₙ*. +> +> This is _emphasized text_ and this is a math subscript: *mₙ*. -A folder named `output-directory/cache-directory` should also be produced and -contain fragments of the converted markdown document. LuaTeX does not need -other temporary files to perform the conversion from markdown to \TeX{}. To -produce the remaining temporary files, invoke pdfTeX from the terminal: -``` sh -pdftex --output-directory output-directory --shell-escape document.tex -`````` -Text documents named `helper-script.lua`, and `temporary-output.md` should be -produced in the folder named `output-directory`. The document named -`helper-script.lua` will contain Lua code that was executed to convert markdown -to plain \TeX{}. The document named `temporary-output.tex` will contain the -input markdown document converted to \TeX{}. +##### \LaTeX{} Example {.unnumbered} -No document named `error-output.txt` should be produced in the folder named -`output-directory`. This document would only be produced if an error had occured -while executing the Lua code. If this happens, please [file a -bug](https://github.com/witiko/markdown/issues). +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[hybrid]{markdown} +\begin{document} -#### Package Documentation +\begin{markdown} +This is _emphasized text_ and this is a math subscript: $m\_n$. +\end{markdown} -The \mdef{markdownOptionStripPercentSigns} macro controls whether a percent -sign (`\%`) at the beginning of a line will be discarded when reading Markdown -input from a \TeX{} document. This enables the use of markdown when writing -\TeX{} package documentation using the [Doc \LaTeX{} package][doc] by Frank -Mittelbach. The recognized values of the macro are `true` (discard) and `false` -(retain). It defaults to `false`. +\begin{markdown}[underscores=false] +This is *emphasized text* and this is a math subscript: $m_n$. +\end{markdown} - [doc]: https://ctan.org/pkg/doc (doc – Format LaTeX documentation) +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: -Using a text editor, create a text document named `document.dtx` with the +> This is _emphasized text_ and this is a math subscript: *mₙ*. +> +> This is _emphasized text_ and this is a math subscript: *mₙ*. + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the following content: +``` tex +\usemodule[t][markdown] +\setupmarkdown[hybrid = yes] +\starttext - ``` tex - % \iffalse - \documentclass{ltxdoc} - \usepackage[stripPercentSigns]{markdown} - \begin{document} - \DocInput{document.dtx} - \end{document} - % \fi - % - % \begin{markdown} - % Hello *world*! - % \end{markdown} - ``````` +\startmarkdown +This is _emphasized text_ and this is a math subscript: $m\_n$. +\stopmarkdown + +\setupmarkdown[underscores = yes] +\startmarkdown +This is *emphasized text* and this is a math subscript: $m_n$. +\stopmarkdown +\stoptext +```````` Next, invoke LuaTeX from the terminal: ``` sh -lualatex document.dtx -`````` -A PDF document named `document.pdf` should be produced and contain the text -“Hello *world*!” +context --luatex document.tex +````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> This is _emphasized text_ and this is a math subscript: *mₙ*. +> +> This is _emphasized text_ and this is a math subscript: *mₙ*. % %<*tex> % \fi -% \begin{markdown} -% -%#### Miscellaneous Options -% -% The \mdef{markdownOptionStripPercentSigns} macro controls whether a percent -% sign (`\%`) at the beginning of a line will be discarded when buffering -% Markdown input (see Section <#sec:buffering>) or not. Notably, this -% enables the use of markdown when writing \TeX{} package documentation using -% the \pkg{Doc} \LaTeX{}~package~[@mittelbach17] or similar. The recognized -% values of the macro are `true` (discard) and `false` (retain). It defaults -% to `false`. -% -% \end{markdown} % \begin{macrocode} -\seq_gput_right:Nn - \g_@@_plain_tex_options_seq - { stripPercentSigns } -\prop_gput:Nnn - \g_@@_plain_tex_option_types_prop - { stripPercentSigns } +\@@_add_lua_option:nnn + { underscores } { boolean } -\prop_gput:Nnx - \g_@@_default_plain_tex_options_prop - { stripPercentSigns } - { false } + { true } \ExplSyntaxOff % \end{macrocode} % \iffalse % -%<*manual-tokens> - -## Markdown Tokens - -A key feature of the Markdown package is the support for manipulating markdown -tokens, such as headings, emphasized text, links, and lists, in \TeX{}. Instead -of reducing \TeX{} to a PDF document producer, the Markdown package allows the -user to specify how every markdown token should be processed and rendered. - +%<*lua,lua-cli> % \fi -% \begin{markdown} - -### Token Renderers {#texrenderersuser} - -% \end{markdown} +% \begin{macrocode} +defaultOptions.underscores = true +% \end{macrocode} +% \endgroup % \iffalse - -Token renderers are user-defined \TeX{} macros, which render markdown tokens. -In this section, I will describe the individual token renderers. - +% +%<*lua-cli> % \fi +% \par % \begin{markdown} % -% The following \TeX{} macros may occur inside the output of the -% converter functions exposed by the Lua interface (see Section -% <#sec:lua-conversion>) and represent the parsed markdown tokens. These -% macros are intended to be redefined by the user who is typesetting a -% document. By default, they point to the corresponding prototypes (see Section -% <#sec:texrendererprototypes>). -% -% \end{markdown} -% -% \iffalse -% -%<*tex> -% \fi -% \begin{markdown} +%### Command-Line Interface {#lua-cli-interface} % -% To enable the enumeration of token renderers, we will maintain the -% \mdef{g_\@\@_renderers_seq} sequence. +% The high-level operation of the Markdown package involves the communication +% between several programming layers: the plain \TeX{} layer hands markdown +% documents to the Lua layer. Lua converts the documents to \TeX{}, and hands +% the converted documents back to plain \TeX{} layer for typesetting, see +% Figure <#fig:sequence-diagram-tex-interface>. % -% \end{markdown} -% \begin{macrocode} -\ExplSyntaxOn -\seq_new:N \g_@@_renderers_seq -% \end{macrocode} -% \begin{markdown} +% This procedure has the advantage of being fully automated. However, it also +% has several important disadvantages: The converted \TeX{} documents are +% cached on the file system, taking up increasing amount of space. Unless the +% \TeX{} engine includes a Lua interpreter, the package also requires shell +% access, which opens the door for a malicious actor to access the system. +% Last, but not least, the complexity of the procedure impedes debugging. % -% To enable the reflection of token renderers and their parameters, we will -% maintain the \mdef{g_\@\@_renderer_arities_prop} property list. +% A solution to the above problems is to decouple the conversion from the +% typesetting. For this reason, a command-line Lua interface for converting a +% markdown document to \TeX{} is also provided, see +% Figure <#fig:sequence-diagram-lua-cli>. % % \end{markdown} +% \begin{figure} +% \centering +% \begin{sequencediagram} +% \newthread{user}{User}{} +% \newinst[4]{tex}{\TeX{}}{} +% \newinst[4]{lua}{Lua}{} +% \begin{call}{user}{\footnotesize\cs{jobname.tex}}{tex}{\footnotesize\cs{jobname.pdf}} +% \begin{call}{tex}{\footnotesize\cs{jobname.markdown.in}}{lua}{\footnotesize\cs{jobname.markdown.out}} +% \end{call} +% \begin{call}{tex}{\footnotesize\cs{input}\cs{jobname.markdown.out}}{tex}{} +% \end{call} +% \end{call} +% \end{sequencediagram} +% \caption[A sequence diagram of typesetting a document using the \TeX{} +% interface]{A sequence diagram of the Markdown package typesetting a +% markdown document using the \TeX{} interface} +% \label{fig:sequence-diagram-tex-interface} +% \end{figure} +% \begin{figure} +% \centering +% \begin{sequencediagram} +% \newthread{user}{User}{} +% \newinst[4]{tex}{\TeX{}}{} +% \newinst[4]{lua}{Lua}{} +% \begin{call}{user}{\footnotesize$\langle$\textit{document}$\rangle$\texttt{.md}}{lua}{\footnotesize$\langle$\textit{document}$\rangle$\texttt{.tex}} +% \end{call} +% \begin{call}{user}{\footnotesize\cs{jobname.tex}}{tex}{\footnotesize\cs{jobname.pdf}} +% \begin{call}{tex}{\footnotesize\cs{input} $\langle$\textit{document}$\rangle$}{tex}{} +% \end{call} +% \end{call} +% \end{sequencediagram} +% \caption[A sequence diagram of typesetting a document using the Lua CLI]% +% {A sequence diagram of the Markdown package typesetting a markdown document +% using the Lua command-line interface} +% \label{fig:sequence-diagram-lua-cli} +% \end{figure} % \begin{macrocode} -\prop_new:N \g_@@_renderer_arities_prop -\ExplSyntaxOff -% \end{macrocode} -% \par -% -% \iffalse -% -%<*manual-tokens> -% \fi -% -% \begin{markdown} - -#### Attribute Renderers -The following macros are only produced, when the \Opt{headerAttributes} option -is enabled. -\mdef{markdownRendererAttributeIdentifier} represents the \meta{identifier} of -a markdown element (`id="`\meta{identifier}`"` in HTML and `#`\meta{identifier} -in Markdown's \Opt{headerAttributes} syntax extension). The macro receives a -single attribute that corresponds to the \meta{identifier}. - -\mdef{markdownRendererAttributeClassName} represents the \meta{class name} of a -markdown element (`class="`\meta{class name} ...`"` in HTML and -`.`\meta{class name} in Markdown's \Opt{headerAttributes} syntax extension). -The macro receives a single attribute that corresponds to the \meta{class -name}. +local HELP_STRING = [[ +Usage: texlua ]] .. arg[0] .. [[ [OPTIONS] -- [INPUT_FILE] [OUTPUT_FILE] +where OPTIONS are documented in the Lua interface section of the +technical Markdown package documentation. -\mdef{markdownRendererAttributeKeyValue} represents a HTML attribute in the form -\meta{key}`=`\meta{value} that is neither an identifier nor a class name. -The macro receives two attributes that correspond to the \meta{key} and the -\meta{value}, respectively. +When OUTPUT_FILE is unspecified, the result of the conversion will be +written to the standard output. When INPUT_FILE is also unspecified, the +result of the conversion will be read from the standard input. -% \end{markdown} -% -% \iffalse +Report bugs to: witiko@mail.muni.cz +Markdown package home page: ]] -##### \LaTeX{} Example {.unnumbered} +local VERSION_STRING = [[ +markdown-cli.lua (Markdown) ]] .. metadata.version .. [[ -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[headerAttributes, underscores=false]{markdown} -\markdownSetup{ - renderers = { - attributeIdentifier = {% - \par - \emph{(Identifier: #1)} - \par - }, - attributeClassName = {% - \par - \emph{(Class name: #1)} - \par - }, - attributeKeyValue = {% - \par - \emph{(Key: #1, Value: #2)} - \par - }, - }, -} -\begin{document} -\begin{markdown} +Copyright (C) ]] .. table.concat(metadata.copyright, + "\nCopyright (C) ") .. [[ -# First top-level heading {jane=doe} +License: ]] .. metadata.license -## A subheading {#identifier} +local function warn(s) + io.stderr:write("Warning: " .. s .. "\n") end -# Second top-level heading {.class_name} +local function error(s) + io.stderr:write("Error: " .. s .. "\n") + os.exit(1) +end +% \end{macrocode} +% \begin{markdown} +% +% To make it easier to copy-and-paste options from Pandoc [@macfarlane22] such +% as `fancy_lists`, `header_attributes`, and `pipe_tables`, we accept +% snake\\\_case in addition to camelCase variants of options. As a bonus, +% studies [@sharif10] also show that snake\\\_case is faster to read than +% camelCase. +% +% \end{markdown} +% \begin{macrocode} +local function camel_case(option_name) + local cased_option_name = option_name:gsub("_(%l)", function(match) + return match:sub(2, 2):upper() + end) + return cased_option_name +end -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: +local function snake_case(option_name) + local cased_option_name = option_name:gsub("%l%u", function(match) + return match:sub(1, 1) .. "_" .. match:sub(2, 2):lower() + end) + return cased_option_name +end -> # First top-level heading -> -> *(Key: Jane, Value: Doe)* -> -> ## A subheading -> -> *(Identifier: identifier)* -> -> # Second top-level heading -> -> *(Class name: class\_name)* +local cases = {camel_case, snake_case} +local various_case_options = {} +for option_name, _ in pairs(defaultOptions) do + for _, case in ipairs(cases) do + various_case_options[case(option_name)] = option_name + end +end -% -%<*tex> -% \fi -% +local process_options = true +local options = {} +local input_filename +local output_filename +for i = 1, #arg do + if process_options then +% \end{macrocode} +% \begin{markdown} +% After the optional `-`{}`-` argument has been specified, the remaining +% arguments are assumed to be input and output filenames. This argument is +% optional, but encouraged, because it helps resolve ambiguities when +% deciding whether an option or a filename has been specified. +% \end{markdown} % \begin{macrocode} -\def\markdownRendererAttributeIdentifier{% - \markdownRendererAttributeIdentifierPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { attributeIdentifier } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { attributeIdentifier } - { 1 } -\ExplSyntaxOff -\def\markdownRendererAttributeClassName{% - \markdownRendererAttributeClassNamePrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { attributeClassName } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { attributeClassName } - { 1 } -\ExplSyntaxOff -\def\markdownRendererAttributeKeyValue{% - \markdownRendererAttributeKeyValuePrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { attributeKeyValue } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { attributeKeyValue } - { 2 } -\ExplSyntaxOff + if arg[i] == "--" then + process_options = false + goto continue +% \end{macrocode} +% \begin{markdown} +% Unless the `-`{}`-` argument has been specified before, an argument +% containing the equals sign (`=`) is assumed to be an option specification in +% a \meta{key}`=`\meta{value} format. The available options are listed in +% Section <#sec:lua-options>. +% \end{markdown} +% \begin{macrocode} + elseif arg[i]:match("=") then + local key, value = arg[i]:match("(.-)=(.*)") + if defaultOptions[key] == nil and + various_case_options[key] ~= nil then + key = various_case_options[key] + end +% \end{macrocode} +% \begin{markdown} +% The \luamref{defaultOptions} table is consulted to identify whether \meta{value} +% should be parsed as a string, number, table, or boolean. +% \end{markdown} +% \begin{macrocode} + local default_type = type(defaultOptions[key]) + if default_type == "boolean" then + options[key] = (value == "true") + elseif default_type == "number" then + options[key] = tonumber(value) + elseif default_type == "table" then + options[key] = {} + for item in value:gmatch("[^ ,]+") do + table.insert(options[key], item) + end + else + if default_type ~= "string" then + if default_type == "nil" then + warn('Option "' .. key .. '" not recognized.') + else + warn('Option "' .. key .. '" type not recognized, please file ' .. + 'a report to the package maintainer.') + end + warn('Parsing the ' .. 'value "' .. value ..'" of option "' .. + key .. '" as a string.') + end + options[key] = value + end + goto continue +% \end{macrocode} +% \begin{markdown} +% Unless the `-`{}`-` argument has been specified before, an argument +% `-`{}`-help`, or `-h` causes a brief documentation for how to invoke the +% program to be printed to the standard output. +% \end{markdown} +% \begin{macrocode} + elseif arg[i] == "--help" or arg[i] == "-h" then + print(HELP_STRING) + os.exit() +% \end{macrocode} +% \begin{markdown} +% Unless the `-`{}`-` argument has been specified before, an argument +% `-`{}`-version`, or `-v` causes the program to print information about its +% name, version, origin and legal status, all on standard output. +% \end{markdown} +% \begin{macrocode} + elseif arg[i] == "--version" or arg[i] == "-v" then + print(VERSION_STRING) + os.exit() + end + end +% \end{macrocode} +% \begin{markdown} +% The first argument that matches none of the above patters is assumed to be +% the input filename. The input filename should correspond to the Markdown +% document that is going to be converted to a \TeX{} document. +% \end{markdown} +% \begin{macrocode} + if input_filename == nil then + input_filename = arg[i] +% \end{macrocode} +% \begin{markdown} +% The first argument that matches none of the above patters is assumed to be +% the output filename. The output filename should correspond to the \TeX{} +% document that will result from the conversion. +% \end{markdown} +% \begin{macrocode} + elseif output_filename == nil then + output_filename = arg[i] + else + error('Unexpected argument: "' .. arg[i] .. '".') + end + ::continue:: +end % \end{macrocode} % \par +% \begin{markdown} % -% \iffalse -% -%<*manual-tokens> -% \fi +% The command-line Lua interface is implemented by the `markdown-cli.lua` +% file that can be invoked from the command line as follows: +% ``` sh +% texlua /path/to/markdown-cli.lua cacheDir=. -- hello.md hello.tex +% `````` +% \noindent to convert the Markdown document `hello.md` to a \TeX{} document +% `hello.tex`. After the Markdown package for our \TeX{} format has been +% loaded, the converted document can be typeset as follows: +% ``` tex +% \input hello +% ``````` % -% \begin{markdown} - -#### Block Quote Renderers -The \mdef{markdownRendererBlockQuoteBegin} macro represents the beginning of -a block quote. The macro receives no arguments. - % \end{markdown} -% % \iffalse -% +% %<*tex> % \fi -% -% \begin{macrocode} -\def\markdownRendererBlockQuoteBegin{% - \markdownRendererBlockQuoteBeginPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { blockQuoteBegin } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { blockQuoteBegin } - { 0 } -\ExplSyntaxOff -% \end{macrocode} % \par +% \begin{markdown} +% +% Plain \TeX{} Interface {#texinterface} +%------------------------ % +% \end{markdown} % \iffalse % -%<*manual-tokens> -% \fi -% -% \begin{markdown} +%<*manual-interfaces> -The \mdef{markdownRendererBlockQuoteEnd} macro represents the end of a block -quote. The macro receives no arguments. +### Plain \TeX{} -% \end{markdown} -% -% \iffalse +The plain \TeX{} interface provides \TeX{} commands that typeset markdown +documents by using the Lua interface behind the scenes. Unlike the Lua +interface, the plain TeX interface does not provide low-level tools for +converting markdown to \TeX{}. Instead, its goal is to provide high-level +typesetting capabilities. -##### Plain \TeX{} Example {.unnumbered} +The plain \TeX{} interface accepts the same options as the `markdown` Lua +module, in addition to its own options, but now the options are specified as +\TeX{} commands. Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownRendererBlockQuoteBegin{% - \begingroup - \vskip\parindent - \leftskip=2\parindent - \parindent=0pt -} -\def\markdownRendererBlockQuoteEnd{% - \par - \vskip\parindent - \endgroup -} +\input lmfonts + \markdownBegin -A quote from William Shakespeare's King Lear: +$\sqrt{-1}$ *equals* $i$. +\markdownEnd -> This is the excellent foppery of the world that when we are -> sick in fortune---often the surfeit of our own behavior---we -> make guilty of our disasters the sun, the moon, and the -> stars [...] +\def\markdownOptionTexMathDollars{true} +\markdownBegin +$\sqrt{-1}$ *equals* $i$. \markdownEnd + \bye ``````` Next, invoke LuaTeX from the terminal: @@ -11402,1362 +11296,1606 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> A quote from William Shakespeare's King Lear: +> \$\\sqrt{-1}\$ *equals* \$i\$. > -> > This is the excellent foppery of the world that when we are -> > sick in fortune—often the surfeit of our own behavior—we -> > make guilty of our disasters the sun, the moon, and the -> > stars [...] - -##### \LaTeX{} Example {.unnumbered} +> 1 +> *equals* +> i. -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage{markdown} -\markdownSetup{ - renderers = { - blockQuoteBegin = {\begin{quote}}, - blockQuoteEnd = {\end{quote}}, - }, -} -\begin{document} -\begin{markdown} -A quote from William Shakespeare's King Lear: +Invoking pdfTeX should have the same effect: +``` sh +pdftex --shell-escape document.tex +`````` -> This is the excellent foppery of the world that when we are -> sick in fortune---often the surfeit of our own behavior---we -> make guilty of our disasters the sun, the moon, and the -> stars [...] -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> A quote from William Shakespeare's King Lear: -> -> > This is the excellent foppery of the world that when we are -> > sick in fortune—often the surfeit of our own behavior—we -> > make guilty of our disasters the sun, the moon, and the -> > stars [...] - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\def\markdownRendererBlockQuoteBegin{\startquotation} -\def\markdownRendererBlockQuoteEnd{\stopquotation} -\starttext -\startmarkdown -A quote from William Shakespeare's King Lear: - -> This is the excellent foppery of the world that when we are -> sick in fortune---often the surfeit of our own behavior---we -> make guilty of our disasters the sun, the moon, and the -> stars [...] -\stopmarkdown -\stoptext -``````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> A quote from William Shakespeare's King Lear: -> -> > This is the excellent foppery of the world that when we are -> > sick in fortune—often the surfeit of our own behavior—we -> > make guilty of our disasters the sun, the moon, and the -> > stars [...] - -% +% %<*tex> % \fi +% \begin{markdown} % +% The plain \TeX{} interface provides macros for the typesetting of markdown +% input from within plain \TeX{}, for setting the Lua interface options (see +% Section <#sec:lua-options>) used during the conversion from markdown to +% plain \TeX{} and for changing the way markdown the tokens are rendered. +% +% \end{markdown} % \begin{macrocode} -\def\markdownRendererBlockQuoteEnd{% - \markdownRendererBlockQuoteEndPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { blockQuoteEnd } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { blockQuoteEnd } - { 0 } -\ExplSyntaxOff +\def\markdownLastModified{(((LASTMODIFIED)))}% +\def\markdownVersion{(((VERSION)))}% % \end{macrocode} % \par +% \begin{markdown} % -% \iffalse -% -%<*manual-tokens> -% \fi +% The plain \TeX{} interface is implemented by the `markdown.tex` file that can +% be loaded as follows: +% ``` tex +% \input markdown +% ``````` +% \noindent It is expected that the special plain \TeX{} characters have the +% expected category codes, when `\input`ting the file. % -% \begin{markdown} - -#### Bracketed Spans Attribute Context Renderers -The following macros are only produced, when the \Opt{bracketedSpans} option is -enabled. - -The \mdef{markdownRendererBracketedSpanAttributeContextBegin} and -\mdef{markdownRendererBracketedSpanAttributeContextEnd} macros represent the -beginning and the end of an inline bracketed span in which the attributes of -the span apply. The macros receive no arguments. - -% \end{markdown} +%### Typesetting Markdown {#tex-typesetting} % -% \iffalse - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[bracketedSpans]{markdown} -\markdownSetup{ - renderers = { - bracketedSpanAttributeContextBegin = {(}, - bracketedSpanAttributeContextEnd = {)}, - }, -} -\begin{document} -\begin{markdown} - -[foo [bar]{#identifier}]{key=value} [baz]{.class_name} - -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> (foo (bar)) (baz) - -% -%<*tex> -% \fi +% The interface exposes the \mdef{markdownBegin}, \mdef{markdownEnd}, +% \mdef{markdownInput}, and \mdef{markdownEscape} macros. +% +% The \mref{markdownBegin} macro marks the beginning of a markdown document +% fragment and the \mref{markdownEnd} macro marks its end. % +% \end{markdown} % \begin{macrocode} -\def\markdownRendererBracketedSpanAttributeContextBegin{% - \markdownRendererBracketedSpanAttributeContextBeginPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { bracketedSpanAttributeContextBegin } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { bracketedSpanAttributeContextBegin } - { 0 } -\ExplSyntaxOff -\def\markdownRendererBracketedSpanAttributeContextEnd{% - \markdownRendererBracketedSpanAttributeContextEndPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { bracketedSpanAttributeContextEnd } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { bracketedSpanAttributeContextEnd } - { 0 } -\ExplSyntaxOff +\let\markdownBegin\relax +\let\markdownEnd\relax % \end{macrocode} % \par +% \begin{markdown} % -% \iffalse -% -%<*manual-tokens> -% \fi +% You may prepend your own code to the \mref{markdownBegin} macro and redefine the +% \mref{markdownEnd} macro to produce special effects before and after the +% markdown block. % -% \begin{markdown} - -#### Bullet List Renderers -The \mdef{markdownRendererUlBegin} macro represents the beginning of a -bulleted list that contains an item with several paragraphs of text (the -list is not tight). The macro receives no arguments. - -% \end{markdown} +% There are several limitations to the macros you need to be aware of. +% The first limitation concerns the \mref{markdownEnd} macro, which must be +% visible directly from the input line buffer (it may not be produced as a +% result of input expansion). Otherwise, it will not be recognized as the end +% of the markdown string. As a corrolary, the \mref{markdownEnd} string +% may not appear anywhere inside the markdown input. % -% \iffalse -% -%<*tex> -% \fi +% Another limitation concerns spaces at the right end of an input line. In +% markdown, these are used to produce a forced line break. However, any such +% spaces are removed before the lines enter the input buffer of +% \TeX{}~[@knuth86a, p. 46]. As a corrolary, the \mref{markdownBegin} macro also +% ignores them. +% +% The \mref{markdownBegin} and \mref{markdownEnd} macros will also consume the rest +% of the lines at which they appear. In the following example plain \TeX{} +% code, the characters `c`, `e`, and `f` will not appear in the output. +% +% ``` tex +% \input markdown +% a +% b \markdownBegin c +% d +% e \markdownEnd f +% g +% \bye +% ``````` % +% Note that you may also not nest the \mref{markdownBegin} and \mref{markdownEnd} +% macros. +% +% The following example plain \TeX{} code showcases the usage of the +% \mref{markdownBegin} and \mref{markdownEnd} macros: +% +% ``` tex +% \input markdown +% \markdownBegin +% _Hello_ **world** ... +% \markdownEnd +% \bye +% ``````` +% +% You can use the \mref{markdownInput} macro to include markdown documents, +% similarly to how you might use the \mref{input} \TeX{} primitive to include +% \TeX{} documents. The \mref{markdownInput} macro accepts a single parameter +% with the filename of a markdown document and expands to the result of the +% conversion of the input markdown document to plain \TeX{}. +% +% \end{markdown} % \begin{macrocode} -\def\markdownRendererUlBegin{% - \markdownRendererUlBeginPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { ulBegin } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { ulBegin } - { 0 } -\ExplSyntaxOff +\let\markdownInput\relax % \end{macrocode} % \par -% -% \iffalse -% -%<*manual-tokens> -% \fi -% % \begin{markdown} - -The \mdef{markdownRendererUlBeginTight} macro represents the beginning of a -bulleted list that contains no item with several paragraphs of text (the list -is tight). This macro will only be produced, when the \Opt{tightLists} option -is disabled. The macro receives no arguments. - -% \end{markdown} % -% \iffalse -% -%<*tex> -% \fi +% This macro is not subject to the abovelisted limitations of the +% \mref{markdownBegin} and \mref{markdownEnd} macros. % -% \begin{macrocode} -\def\markdownRendererUlBeginTight{% - \markdownRendererUlBeginTightPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { ulBeginTight } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { ulBeginTight } - { 0 } -\ExplSyntaxOff +% The following example plain \TeX{} code showcases the usage of the +% \mref{markdownInput} macro: +% +% ``` tex +% \input markdown +% \markdownInput{hello.md} +% \bye +% ``````` +% +% The \mref{markdownEscape} macro accepts a single parameter with the filename +% of a \TeX{} document and executes the \TeX{} document in the middle of a +% markdown document fragment. Unlike the `\input` built-in of \TeX, +% \mref{markdownEscape} guarantees that the standard catcode regime of your +% \TeX{} format will be used. +% +% \end{markdown} +% \begin{macrocode} +\let\markdownEscape\relax % \end{macrocode} % \par +% \begin{markdown} % -% \iffalse -% -%<*manual-tokens> -% \fi +%### Options {#tex-options} +% +% The plain \TeX{} options are represented by \TeX{} commands. Some of them map +% directly to the options recognized by the Lua interface (see +% Section <#sec:lua-options>), while some of them are specific to the plain +% \TeX{} interface. % +% To determine whether plain \TeX{} is the top layer or if there are other +% layers above plain \TeX{}, we take a look on whether the +% \mdef{c_@@_top_layer_tl} token list has already been defined. If not, +% we will assume that plain \TeX{} is the top layer. +% +% \end{markdown} +% \begin{macrocode} +\ExplSyntaxOn +\tl_const:Nn \c_@@_option_layer_plain_tex_tl { plain_tex } +\cs_generate_variant:Nn + \tl_const:Nn + { NV } +\tl_if_exist:NF + \c_@@_top_layer_tl + { + \tl_const:NV + \c_@@_top_layer_tl + \c_@@_option_layer_plain_tex_tl + } +% \end{macrocode} % \begin{markdown} - -The \mdef{markdownRendererUlItem} macro represents an item in a bulleted -list. The macro receives no arguments. - +% +% To enable the enumeration of plain \TeX{} options, we will maintain the +% \mdef{g_\@\@_plain_tex_options_seq} sequence. +% % \end{markdown} +% \begin{macrocode} +\seq_new:N \g_@@_plain_tex_options_seq +% \end{macrocode} +% \begin{markdown} +% +% To enable the reflection of default plain \TeX{} options and their types, we +% will maintain the \mdef{g_\@\@_default_plain_tex_options_prop} and +% \mdef{g_\@\@_plain_tex_option_types_prop} property lists, respectively. % +% \end{markdown} +% \begin{macrocode} +\prop_new:N \g_@@_plain_tex_option_types_prop +\prop_new:N \g_@@_default_plain_tex_options_prop +\seq_gput_right:NV \g_@@_option_layers_seq \c_@@_option_layer_plain_tex_tl +\cs_new:Nn + \@@_add_plain_tex_option:nnn + { + \@@_add_option:Vnnn + \c_@@_option_layer_plain_tex_tl + { #1 } + { #2 } + { #3 } + } +% \end{macrocode} % \iffalse -% +% +%<*manual-options> + +### Plain \TeX{} + +Plain \TeX{} options control the communication between the \TeX{} interface and +the `markdown` Lua module. They are supported by all higher-level interfaces of +the Markdown package, i.e. the plain \TeX{}, \LaTeX{} and \Hologo{ConTeXt} +interfaces. + +#### Setting Lua options from plain \TeX{} + +As a rule of thumb, you can set all Lua options directly from plain \TeX{}. For +example, to set the \Opt{taskLists} Lua option to `true`, you would include the +following code in your plain \TeX{} document: + +``` tex +\def\markdownOptionTaskLists{true} +``` + +% %<*tex> % \fi +% \par +% \begin{markdown} % +% The plain \TeX{} options may be also be specified via the \mdef{markdownSetup} +% macro. Here, the plain \TeX{} options are represented by a comma-delimited +% list of \meta{key}`=`\meta{value} pairs. For boolean options, the +% `=`\meta{value} part is optional, and \meta{key} will be interpreted as +% \meta{key}`=true` if the `=`\meta{value} part has been omitted. +% The \mref{markdownSetup} macro receives the options to set up as its only +% argument. +% +% \end{markdown} % \begin{macrocode} -\def\markdownRendererUlItem{% - \markdownRendererUlItemPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { ulItem } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { ulItem } - { 0 } -\ExplSyntaxOff +\cs_new:Nn + \@@_setup:n + { + \keys_set:nn + { markdown/options } + { #1 } + } +\cs_gset_eq:NN + \markdownSetup + \@@_setup:n % \end{macrocode} -% \par -% % \iffalse % -%<*manual-tokens> -% \fi -% -% \begin{markdown} +%<*manual-options> -The \mdef{markdownRendererUlItemEnd} macro represents the end of an item in a -bulleted list. The macro receives no arguments. +Alternatively, you can also set plain \TeX{} options using the `\markdownSetup` +\TeX{} macro. For example, to set the \Opt{taskLists} Lua option to `true`, +you would include the following code in your plain \TeX{} document: -% \end{markdown} -% -% \iffalse -% +``` tex +\markdownSetup{taskLists = true} +``` + +% %<*tex> % \fi +% \par +% \begin{markdown} +% +% The +% \mdef{markdownIfOption}`{`\meta{name}`}{`\meta{iftrue}`}{`\meta{iffalse}`}` +% macro is provided for testing, whether the value of +% `\markdownOption`\meta{name} is `true`. If the value is `true`, then +% \meta{iftrue} is expanded, otherwise \meta{iffalse} is expanded. % +% \end{markdown} % \begin{macrocode} -\def\markdownRendererUlItemEnd{% - \markdownRendererUlItemEndPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { ulItemEnd } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { ulItemEnd } - { 0 } -\ExplSyntaxOff +\prg_new_conditional:Nnn + \@@_if_option:n + { TF, T, F } + { + \@@_get_option_type:nN + { #1 } + \l_tmpa_tl + \str_if_eq:NNF + \l_tmpa_tl + \c_@@_option_type_boolean_tl + { + \msg_error:nnxx + { markdown } + { expected-boolean-option } + { #1 } + { \l_tmpa_tl } + } + \@@_get_option_value:nN + { #1 } + \l_tmpa_tl + \str_if_eq:NNTF + \l_tmpa_tl + \c_@@_option_value_true_tl + { \prg_return_true: } + { \prg_return_false: } + } +\msg_new:nnn + { markdown } + { expected-boolean-option } + { + Option~#1~has~type~#2,~ + but~a~boolean~was~expected. + } +\let\markdownIfOption=\@@_if_option:nTF % \end{macrocode} -% \par +% \begin{markdown} +% +%#### Finalizing and Freezing the Cache +% The \mdef{markdownOptionFinalizeCache} option corresponds to the Lua +% interface \Opt{finalizeCache} option, which creates an output file +% \Opt{frozenCacheFileName} (frozen cache) that contains a mapping +% between an enumeration of the markdown documents in the plain \TeX{} document +% and their auxiliary files cached in the \Opt{cacheDir} directory. % % \iffalse % -%<*manual-tokens> +%<*manual-options> + +#### Finalizing and Freezing the Cache + % \fi % -% \begin{markdown} - -The \mdef{markdownRendererUlEnd} macro represents the end of a bulleted list -that contains an item with several paragraphs of text (the list is not -tight). The macro receives no arguments. +The \mdef{markdownOptionFrozenCache} option uses the mapping previously +% created by the \Opt{finalizeCache} option, +% \iffalse +created by the Lua interface \Opt{finalizeCache} option, +% \fi +and uses it to typeset the plain \TeX{} document without invoking Lua. As a +result, the plain \TeX{} document becomes more portable, but further changes +in the order and the content of markdown documents will not be reflected. It +defaults to `false`. % \end{markdown} -% % \iffalse -% +% %<*tex> % \fi -% % \begin{macrocode} -\def\markdownRendererUlEnd{% - \markdownRendererUlEndPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { ulEnd } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { ulEnd } - { 0 } -\ExplSyntaxOff +\@@_add_plain_tex_option:nnn + { frozenCache } + { boolean } + { false } % \end{macrocode} -% \par -% % \iffalse % -%<*manual-tokens> +%<*manual-options> % \fi -% % \begin{markdown} +% +% The standard usage of the above two options is as follows: +% \iffalse +The standard usage of the \Opt{finalizeCache} and \Opt{frozenCache} +options is as follows: +% \fi -The \mdef{markdownRendererUlEndTight} macro represents the end of a bulleted -list that contains no item with several paragraphs of text (the list is -tight). This macro will only be produced, when the \Opt{tightLists} option is -disabled. The macro receives no arguments. - -% \end{markdown} -% +1. Remove the \Opt{cacheDir} cache directory with stale auxiliary cache + files. +% 2. Enable the \Opt{finalizeCache} option. % \iffalse +2. Enable the \Opt{finalizeCache} option. +% \fi +3. Typeset the plain \TeX{} document to populate and finalize the cache. +4. Enable the \Opt{frozenCache} option. +5. Publish the source code of the plain \TeX{} document and the + \Opt{cacheDir} directory. -##### Plain \TeX{} Example {.unnumbered} +% \iffalse +For more information, see the examples for the \Opt{finalizeCache} option. +% \fi -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownOptionTightLists{true} +#### File and Directory Names -\def\markdownRendererInterblockSeparator{} -\def\markdownRendererUlBeginTight{ (} -\def\markdownRendererUlItem{% - \def\markdownRendererUlItem{% - , - \def\markdownRendererUlItem{, and }% - }% -} -\def\markdownRendererUlItemEnd{} -\def\markdownRendererUlEndTight{).} +% \end{markdown} +% \iffalse +% +%<*tex> +% \fi +% \begin{markdown} +% +% The \mdef{markdownOptionInputTempFileName} macro sets the filename of the +% temporary input file that is created during the buffering of markdown text +% from a \TeX{} source. It defaults to `\jobname.markdown.in`. +% +% The expansion of this macro must not contain quotation marks (`"`) or +% backslash symbols (`\`). Mind that \TeX{} engines tend to +% put quotation marks around `\jobname`, when it contains spaces. +% +% \end{markdown} +% \begin{macrocode} +\@@_add_plain_tex_option:nnn + { inputTempFileName } + { path } + { \jobname.markdown.in } +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \mdef{markdownOptionOutputDir} macro sets the path to the directory that +% will contain the auxiliary cache files produced by the Lua implementation and +% also the auxiliary files produced by the plain \TeX{} implementation. The +% option defaults to `.` or, since \TeX{} Live 2024, to the value of the +% `-output-directory` option of your \TeX{} engine. +% +% The path must be set to the same value as the `-output-directory` option of +% your \TeX{} engine for the package to function correctly. We need this macro +% to make the Lua implementation aware where it should store the helper files. +% The same limitations apply here as in the case of the +% \Opt{inputTempFileName} macro. +% +% The \mref{markdownOptionOutputDir} macro has been deprecated and will be +% removed in the next major version of the Markdown package. +% +% \end{markdown} +% \begin{macrocode} +\cs_generate_variant:Nn + \@@_add_plain_tex_option:nnn + { nnV } +% \end{macrocode} +% \begin{markdown} +% +% Use the \pkg{lt3luabridge} library to determine the default value of the +% \mref{markdownOptionOutputDir} macro by using the environmental variable +% `TEXMF_OUTPUT_DIRECTORY` that is available since TeX~Live 2024. +% +% \end{markdown} +% \begin{macrocode} +\ExplSyntaxOff +\input lt3luabridge.tex +\ExplSyntaxOn +\bool_if:nTF + { + \cs_if_exist_p:N + \luabridge_tl_set:Nn && + ( + \int_compare_p:nNn + { \g_luabridge_method_int } + = + { \c_luabridge_method_directlua_int } || + \sys_if_shell_unrestricted_p: + ) + } + { + \luabridge_tl_set:Nn + \l_tmpa_tl + { print(os.getenv("TEXMF_OUTPUT_DIRECTORY") or ".") } + } + { + \tl_set:Nn + \l_tmpa_tl + { . } + } +\@@_add_plain_tex_option:nnV + { outputDir } + { path } + \l_tmpa_tl +% \end{macrocode} +% \iffalse +% +%<*manual-options> -\markdownBegin -This is a tight list +The plain \TeX{} interface provides the following commands that you can use to +specify the location of temporary files produced during the conversion from +Markdown to \TeX{}: -- the first item -- the second item -- the third item -\markdownEnd +- `\markdownOptionInputTempFileName`, +- `\markdownOptionOutputDir`, +- `\markdownOptionCacheDir`, and +- `\markdownOptionFrozenCacheFileName`. -\def\markdownRendererInterblockSeparator{% - :\par - \def\markdownRendererInterblockSeparator{\par}% -} -\def\markdownRendererUlBegin{} -\def\markdownRendererUlItem{--\kern 0.5em} -\def\markdownRendererUlItemEnd{.\par} -\def\markdownRendererUlEnd{} +The `\markdownOptionCacheDir` and `\markdownOptionFrozenCacheFileName` commands +correspond to the `cacheDir` and `frozenCacheFileName` Lua options. +Using a text editor, create a folder named `output-directory` and a text +document named `document.tex` with the following content: +``` tex +\input lmfonts +\input markdown +\def\markdownOptionInputTempFileName{temporary-input.md} +\def\markdownOptionOutputDir{output-directory} +\def\markdownOptionCacheDir{output-directory/cache-directory} +\def\markdownOptionEagerCache{true} +\def\markdownOptionFinalizeCache{true} +\def\markdownOptionFrozenCacheFileName{output-directory/cache-directory/frozen-cache.tex} \markdownBegin -This is a loose list - -- This is the first item - -- This is the second item - -- This is the third item +Hello *world*! \markdownEnd - \bye ``````` Next, invoke LuaTeX from the terminal: ``` sh -luatex document.tex +luatex --output-directory output-directory document.tex `````` -A PDF document named `document.pdf` should be produced and contain the -following text: +A text document named `temporary-input.md` should be produced in the folder +named `output-directory` and contain the following text: -> This is a tight list (the first item, the second item, and the third item). -> -> This is a loose list: -> -> - This is the first item. -> -> - This is the second item. -> -> - This is the third item. +> Hello \*world\*! -##### \LaTeX{} Example {.unnumbered} +A folder named `output-directory/cache-directory` should also be produced and +contain fragments of the converted markdown document. LuaTeX does not need +other temporary files to perform the conversion from markdown to \TeX{}. To +produce the remaining temporary files, invoke pdfTeX from the terminal: +``` sh +pdftex --output-directory output-directory --shell-escape document.tex +`````` +Text document named `temporary-output.md` should be produced in the folder +named `output-directory`. The document will contain the input markdown +document converted to \TeX{}. -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[tightLists]{markdown} -\begin{document} +% \fi +% \begin{markdown} -\begin{markdown*}{ - renderers = { - interblockSeparator = {}, - ulBeginTight = { (}, - ulItem = {% - \def\markdownRendererUlItem{% - , - \def\markdownRendererUlItem{, and }% - }% - }, - ulItemEnd = {}, - ulEndTight = {).}, - }, -} -This is a tight list +#### No default token renderer prototypes {#plain} -- the first item -- the second item -- the third item -\end{markdown*} +The Markdown package provides default definitions for token renderer prototypes +using the `witiko/markdown/defaults` +% theme (see Section~). +% \iffalse +theme. +% \fi +Although these default definitions provide a useful starting point for authors, +they use extra resources, especially with higher-level \TeX{} formats such as +\LaTeX{} and \Hologo{ConTeXt}. Furthermore, the default definitions may change +at any time, which may pose a problem for maintainers of Markdown themes and +templates who may require a stable output. -\begin{markdown*}{ - renderers = { - interblockSeparator = {% - :\par - \def\markdownRendererInterblockSeparator{\par}% - }, - ulBeginTight = {\begin{itemize}}, - ulItem = {\item}, - ulItemEnd = {.}, - ulEnd = {\end{itemize}}, - }, -} -This is a loose list +The \mdef{markdownOptionPlain} macro specifies whether higher-level \TeX{} +formats should only use the plain \TeX{} default definitions or whether they +should also use the format-specific default definitions. Whereas plain \TeX{} +default definitions only provide definitions for simple elements such as +emphasis, strong emphasis, and paragraph separators, format-specific default +definitions add support for more complex elements such as lists, tables, and +citations. On the flip side, plain \TeX{} default definitions load no extra +resources and are rather stable, whereas format-specific default definitions +load extra resources and are subject to a more rapid change. -- This is the first item +Here is how you would enable the macro in a \LaTeX{} document: -- This is the second item +``` tex +\usepackage[plain]{markdown} +``````` -- This is the third item -\end{markdown*} +Here is how you would enable the macro in a \Hologo{ConTeXt} document: -\end{document} +``` tex +\def\markdownOptionPlain{true} +\usemodule[t][markdown] ``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: -> This is a tight list (the first item, the second item, and the third item). -> -> This is a loose list: -> -> - This is the first item. -> -> - This is the second item. -> -> - This is the third item. +The macro must be set before or during the loading of the package. Setting the +macro after loading the package has no effect. -##### \Hologo{ConTeXt} Example {.unnumbered} +% \end{markdown} +% \iffalse +% +%<*tex> +% \fi +% \begin{macrocode} +\@@_add_plain_tex_option:nnn + { plain } + { boolean } + { false } +% \end{macrocode} +% \iffalse +% +%<*manual-options> +% \fi +% \begin{markdown} + +The \mdef{markdownOptionNoDefaults} macro specifies whether we should prevent +the loading of default definitions or not. This is useful in contexts, where +we want to have total control over how all elements are rendered. + +Here is how you would enable the macro in a \LaTeX{} document: -Using a text editor, create a text document named `document.tex` with the -following content: ``` tex +\usepackage[noDefaults]{markdown} +``````` + +Here is how you would enable the macro in a \Hologo{ConTeXt} document: + +``` tex +\def\markdownOptionNoDefaults{true} \usemodule[t][markdown] -\setupmarkdown[tightLists = yes] -\starttext +``````` -\def\markdownRendererInterblockSeparator{} -\def\markdownRendererUlBeginTight{ (} -\def\markdownRendererUlItem{% - \def\markdownRendererUlItem{% - , - \def\markdownRendererUlItem{, and }% - }% -} -\def\markdownRendererUlItemEnd{} -\def\markdownRendererUlEndTight{).} - -\startmarkdown -This is a tight list - -- the first item -- the second item -- the third item -\stopmarkdown - -\def\markdownRendererInterblockSeparator{% - :\par - \def\markdownRendererInterblockSeparator{\par}% -} -\def\markdownRendererUlBegin{\startitemize} -\def\markdownRendererUlItem{\item} -\def\markdownRendererUlItemEnd{.} -\def\markdownRendererUlEnd{\stopitemize} - -\startmarkdown -This is a loose list - -- This is the first item - -- This is the second item - -- This is the third item -\stopmarkdown - -\stoptext -``````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> This is a tight list (the first item, the second item, and the third item). -> -> This is a loose list: -> -> - This is the first item. -> -> - This is the second item. -> -> - This is the third item. +The macro must be set before or during the loading of the package. Setting the +macro after loading the package has no effect. -% +% \end{markdown} +% \iffalse +% %<*tex> % \fi -% % \begin{macrocode} -\def\markdownRendererUlEndTight{% - \markdownRendererUlEndTightPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { ulEndTight } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { ulEndTight } - { 0 } -\ExplSyntaxOff +\@@_add_plain_tex_option:nnn + { noDefaults } + { boolean } + { false } % \end{macrocode} -% \par -% -% \iffalse -% -%<*manual-tokens> -% \fi -% % \begin{markdown} - -#### Code Block Renderers -The \mdef{markdownRendererInputVerbatim} macro represents a code -block. The macro receives a single argument that corresponds to the -filename of a file contaning the code block contents. - -% \end{markdown} % -% \iffalse -% -%<*tex> -% \fi +%#### Miscellaneous Options +% +% The \mdef{markdownOptionStripPercentSigns} macro controls whether a percent +% sign (`\%`) at the beginning of a line will be discarded when buffering +% Markdown input (see Section <#sec:buffering>) or not. Notably, this +% enables the use of markdown when writing \TeX{} package documentation using +% the \pkg{Doc} \LaTeX{}~package~[@mittelbach17] or similar. The recognized +% values of the macro are `true` (discard) and `false` (retain). It defaults +% to `false`. % +% \end{markdown} % \begin{macrocode} -\def\markdownRendererInputVerbatim{% - \markdownRendererInputVerbatimPrototype}% -\ExplSyntaxOn \seq_gput_right:Nn - \g_@@_renderers_seq - { inputVerbatim } + \g_@@_plain_tex_options_seq + { stripPercentSigns } \prop_gput:Nnn - \g_@@_renderer_arities_prop - { inputVerbatim } - { 1 } -\ExplSyntaxOff + \g_@@_plain_tex_option_types_prop + { stripPercentSigns } + { boolean } +\prop_gput:Nnx + \g_@@_default_plain_tex_options_prop + { stripPercentSigns } + { false } % \end{macrocode} -% \par -% % \iffalse % -%<*manual-tokens> -% \fi -% -% \begin{markdown} +%<*manual-options> -The \mdef{markdownRendererInputFencedCode} macro represents a fenced code -block. This macro will only be produced, when the \Opt{fencedCode} option is -enabled. The macro receives two arguments that correspond to the filename of -a file contaning the code block contents and to the code fence infostring. +#### Package Documentation -% \end{markdown} -% -% \iffalse +The \mdef{markdownOptionStripPercentSigns} macro controls whether a percent +sign (`\%`) at the beginning of a line will be discarded when reading Markdown +input from a \TeX{} document. This enables the use of markdown when writing +\TeX{} package documentation using the [Doc \LaTeX{} package][doc] by Frank +Mittelbach. The recognized values of the macro are `true` (discard) and `false` +(retain). It defaults to `false`. -##### \LaTeX{} Example {.unnumbered} + [doc]: https://ctan.org/pkg/doc (doc – Format LaTeX documentation) -Using a text editor, create a text document named `document.tex` with the +Using a text editor, create a text document named `document.dtx` with the following content: -``` tex -\documentclass{article} -\usepackage{verbatim} -\usepackage[hyphens]{url} -\usepackage[fencedCode]{markdown} -\markdownSetup{ - renderers = { - interblockSeparator = { - \def\markdownRendererInterblockSeparator{% - \par - \def\markdownRendererInterblockSeparator{% - \def\markdownRendererInterblockSeparator{% - \par - }% - }% - }% - }, - inputVerbatim = { - is contained in file \url{#1}:% - \verbatiminput{#1}% - }, - inputFencedCode = { - in #2 \markdownRendererInputVerbatim{#1}% - }, - }, -} -\begin{document} -\begin{markdown} -The following code - - def foo(bar): - if len(bar) <= 1: - return bar[0] - elif len(bar) == 2: - return sorted(bar) - else: - baz = len(bar) // 2 - return foo(bar[baz:], bar[:baz]) -The following code + ``` tex + % \iffalse + \documentclass{ltxdoc} + \usepackage[stripPercentSigns]{markdown} + \begin{document} + \DocInput{document.dtx} + \end{document} + % \fi + % + % \begin{markdown} + % Hello *world*! + % \end{markdown} + ``````` -~~~ Python ->>> foo([4, 2, 1, 3]) -[1, 2, 3, 4] -~~~~~~~~~~ -\end{markdown} -\end{document} -``````` Next, invoke LuaTeX from the terminal: ``` sh -lualatex document.tex +lualatex document.dtx `````` -A PDF document named `document.pdf` should be produced and contain the -following text except for the filename, which may differ: - -> The following code is contained in file -> `./_markdown_document/882453149edcf288976647f6fe147ada.verbatim`: -> ``` py -> def foo(bar): -> if len(bar) <= 1: -> return bar[:1] -> elif len(bar) == 2: -> return sorted(bar) -> else: -> baz = bar[len(bar) // 2] -> return ( -> foo([qux for qux in bar if qux < baz]) + [baz] + -> foo([qux for qux in bar if qux > baz]) -> ) -> `````` -> The following code in Python contained in file -> `./_markdown_document/cf2a96e2120cef5b1fae5fea36fcc27b.verbatim`: -> ``` py -> >>> foo([4, 2, 1, 3]) -> [1, 2, 3, 4] -> `````` +A PDF document named `document.pdf` should be produced and contain the text +“Hello *world*!” -% +% %<*tex> % \fi +% \begin{markdown} % -% \begin{macrocode} -\def\markdownRendererInputFencedCode{% - \markdownRendererInputFencedCodePrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { inputFencedCode } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { inputFencedCode } - { 2 } -\ExplSyntaxOff -% \end{macrocode} -% \par +%#### Generating Plain \TeX{} Option Macros and Key-Values % -% \iffalse -% -%<*manual-tokens> -% \fi -% \begin{markdown} - -#### Code Span Renderer -The \mdef{markdownRendererCodeSpan} macro represents inline code span in the -input text. It receives a single argument that corresponds to the inline -code span. - -% \end{markdown} +% We define the command \mdef{@@_define_option_commands_and_keyvals:} that +% defines plain \TeX{} macros and the key-value interface +% of the \mref{markdownSetup} macro for the above plain \TeX{} options. % -% \iffalse - -##### Plain \TeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\input lmfonts - -\def\markdownRendererCodeSpan#1{#1} - -\markdownBegin -`$\sqrt{-1}$ *equals* $i$` - -$\sqrt{-1}$ *equals* $i$ -\markdownEnd - -\def\markdownOptionHybrid{true} -\markdownBegin -$\sqrt{-1}$ *equals* $i$ -\markdownEnd - -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> \$\\sqrt{-1}\$ \*equals\* \$i\$. -> -> \$\\sqrt{-1}\$ *equals* \$i\$. -> -> 1 -> *equals* -> i. - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[smartEllipses]{markdown} -\markdownSetup{ - renderers = { - codeSpan = {#1}, - }, -} -\begin{document} - -\begin{markdown} -`$\sqrt{-1}$ *equals* $i$` - -$\sqrt{-1}$ *equals* $i$ -\end{markdown} - -\begin{markdown*}{hybrid} -$\sqrt{-1}$ *equals* $i$ -\end{markdown*} - -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> \$\\sqrt{-1}\$ \*equals\* \$i\$. -> -> \$\\sqrt{-1}\$ *equals* \$i\$. -> -> 1 -> *equals* -> i. - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\def\markdownRendererCodeSpan#1{#1} -\starttext - -\startmarkdown -`$\sqrt{-1}$ *equals* $i$` - -$\sqrt{-1}$ *equals* $i$ -\stopmarkdown - -\setupmarkdown[hybrid = yes] -\startmarkdown -$\sqrt{-1}$ *equals* $i$ -\stopmarkdown - -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> \$\\sqrt{-1}\$ \*equals\* \$i\$. -> -> \$\\sqrt{-1}\$ *equals* \$i\$. -> -> 1 -> *equals* -> i. - -% -%<*tex> -% \fi +% The command also defines macros and key-values that map +% directly to the options recognized by the Lua interface, such as +% \mdef{markdownOptionHybrid} for the \Opt{hybrid} Lua option (see Section +% <#sec:lua-options>), which are not processed by the plain \TeX{} +% implementation, only passed along to Lua. % -% \begin{macrocode} -\def\markdownRendererCodeSpan{% - \markdownRendererCodeSpanPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { codeSpan } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { codeSpan } - { 1 } -\ExplSyntaxOff -% \end{macrocode} -% \par +% Furthermore, the command also defines options and key-values +% for subsequently loaded layers that correspond to higher-level \TeX{} formats +% such as \LaTeX{} and \Hologo{ConTeXt}. % -% \iffalse -% -%<*manual-tokens> -% \fi +% For the macros that correspond to the non-boolean options recognized by the +% Lua interface, the same limitations apply here in the case of the +% \Opt{inputTempFileName} macro. % -% \begin{markdown} - -#### Code Span Attribute Context Renderers -The following macros are only produced, when the \Opt{inlineCodeAttributes} -option is enabled. - -The \mdef{markdownRendererCodeSpanAttributeContextBegin} and -\mdef{markdownRendererCodeSpanAttributeContextEnd} macros represent the beginning -and the end of an inline code span in which the attributes of the inline code -span apply. The macros receive no arguments. - % \end{markdown} +% \begin{macrocode} +\cs_new:Nn + \@@_define_option_commands_and_keyvals: + { + \seq_map_inline:Nn + \g_@@_option_layers_seq + { + \seq_map_inline:cn + { g_@@_ ##1 _options_seq } + { + \@@_define_option_command:n + { ####1 } +% \end{macrocode} +% \begin{markdown} % -% \iffalse - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[inlineCodeAttributes]{markdown} -\markdownSetup{ - renderers = { - codeSpanAttributeContextBegin = {(}, - codeSpan = {#1}, - codeSpanAttributeContextEnd = {)}, - }, -} -\begin{document} -\begin{markdown} - -foo `bar`{key=value} baz - -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> foo (bar) baz - -% -%<*tex> -% \fi +% To make it easier to copy-and-paste options from Pandoc [@macfarlane22] such +% as `fancy_lists`, `header_attributes`, and `pipe_tables`, we accept +% snake\\\_case in addition to camelCase variants of options. As a bonus, +% studies [@sharif10] also show that snake\\\_case is faster to read than +% camelCase. % +% \end{markdown} % \begin{macrocode} -\def\markdownRendererCodeSpanAttributeContextBegin{% - \markdownRendererCodeSpanAttributeContextBeginPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { codeSpanAttributeContextBegin } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { codeSpanAttributeContextBegin } - { 0 } -\ExplSyntaxOff -\def\markdownRendererCodeSpanAttributeContextEnd{% - \markdownRendererCodeSpanAttributeContextEndPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { codeSpanAttributeContextEnd } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { codeSpanAttributeContextEnd } - { 0 } -\ExplSyntaxOff + \@@_with_various_cases:nn + { ####1 } + { + \@@_define_option_keyval:nnn + { ##1 } + { ####1 } + { ########1 } + } + } + } + } +\cs_new:Nn + \@@_define_option_command:n + { % \end{macrocode} -% \par +% \begin{markdown} % -% \iffalse -% -%<*manual-tokens> -% \fi +% Do not override options defined before loading the package. % -% \begin{markdown} - -#### Content Block Renderers {#texcontentblockrenderers} - -The \mdef{markdownRendererContentBlock} macro represents an iA\,Writer content -block. It receives four arguments: the local file or online image filename -extension cast to the lower case, the fully escaped \acro{uri} that can be -directly typeset, the raw \acro{uri} that can be used outside typesetting, -and the title of the content block. - % \end{markdown} -% -% \iffalse -% -%<*tex> -% \fi -% % \begin{macrocode} -\def\markdownRendererContentBlock{% - \markdownRendererContentBlockPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { contentBlock } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { contentBlock } - { 4 } -\ExplSyntaxOff + \@@_option_tl_to_csname:nN + { #1 } + \l_tmpa_tl + \cs_if_exist:cF + { \l_tmpa_tl } + { + \@@_get_default_option_value:nN + { #1 } + \l_tmpa_tl + \@@_set_option_value:nV + { #1 } + \l_tmpa_tl + } + } +\cs_new:Nn + \@@_set_option_value:nn + { + \@@_define_option:n + { #1 } + \@@_get_option_type:nN + { #1 } + \l_tmpa_tl + \str_if_eq:NNTF + \c_@@_option_type_counter_tl + \l_tmpa_tl + { + \@@_option_tl_to_csname:nN + { #1 } + \l_tmpa_tl + \int_gset:cn + { \l_tmpa_tl } + { #2 } + } + { + \@@_option_tl_to_csname:nN + { #1 } + \l_tmpa_tl + \cs_set:cpn + { \l_tmpa_tl } + { #2 } + } + } +\cs_generate_variant:Nn + \@@_set_option_value:nn + { nV } +\cs_new:Nn + \@@_define_option:n + { + \@@_option_tl_to_csname:nN + { #1 } + \l_tmpa_tl + \cs_if_free:cT + { \l_tmpa_tl } + { + \@@_get_option_type:nN + { #1 } + \l_tmpb_tl + \str_if_eq:NNT + \c_@@_option_type_counter_tl + \l_tmpb_tl + { + \@@_option_tl_to_csname:nN + { #1 } + \l_tmpa_tl + \int_new:c + { \l_tmpa_tl } + } + } + } +\cs_new:Nn + \@@_define_option_keyval:nnn + { + \prop_get:cnN + { g_@@_ #1 _option_types_prop } + { #2 } + \l_tmpa_tl + \str_if_eq:VVTF + \l_tmpa_tl + \c_@@_option_type_boolean_tl + { + \keys_define:nn + { markdown/options } + { % \end{macrocode} -% \par +% \begin{markdown} % -% \iffalse -% -%<*manual-tokens> -% \fi +% For boolean options, we also accept `yes` as an alias for +% `true` and `no` as an alias for `false`. % +% \end{markdown} +% \begin{macrocode} + #3 .code:n = { + \tl_set:Nx + \l_tmpa_tl + { + \str_case:nnF + { ##1 } + { + { yes } { true } + { no } { false } + } + { ##1 } + } + \@@_set_option_value:nV + { #2 } + \l_tmpa_tl + }, + #3 .default:n = { true }, + } + } + { + \keys_define:nn + { markdown/options } + { + #3 .code:n = { + \@@_set_option_value:nn + { #2 } + { ##1 } + }, + } + } +% \end{macrocode} % \begin{markdown} - -The \mdef{markdownRendererContentBlockOnlineImage} macro represents an -iA\,Writer online image content block. The macro receives the same arguments -as \mref{markdownRendererContentBlock}. - +% +% For options of type `clist`, we assume that \meta{key} is a regular English +% noun in plural (such as `extensions`) and we also define the +% \meta{singular key}`=`\meta{value} interface, where \meta{singular key} is +% \meta{key} after stripping the trailing -s (such as `extension`). Rather +% than setting the option to \meta{value}, this interface appends \meta{value} +% to the current value as the rightmost item in the list. +% % \end{markdown} +% \begin{macrocode} + \str_if_eq:VVT + \l_tmpa_tl + \c_@@_option_type_clist_tl + { + \tl_set:Nn + \l_tmpa_tl + { #3 } + \tl_reverse:N + \l_tmpa_tl + \str_if_eq:enF + { + \tl_head:V + \l_tmpa_tl + } + { s } + { + \msg_error:nnn + { markdown } + { malformed-name-for-clist-option } + { #3 } + } + \tl_set:Nx + \l_tmpa_tl + { + \tl_tail:V + \l_tmpa_tl + } + \tl_reverse:N + \l_tmpa_tl + \tl_put_right:Nn + \l_tmpa_tl + { + .code:n = { + \@@_get_option_value:nN + { #2 } + \l_tmpa_tl + \clist_set:NV + \l_tmpa_clist + { \l_tmpa_tl, { ##1 } } + \@@_set_option_value:nV + { #2 } + \l_tmpa_clist + } + } + \keys_define:nV + { markdown/options } + \l_tmpa_tl + } + } +\cs_generate_variant:Nn + \clist_set:Nn + { NV } +\cs_generate_variant:Nn + \keys_define:nn + { nV } +\cs_generate_variant:Nn + \@@_set_option_value:nn + { nV } +\prg_generate_conditional_variant:Nnn + \str_if_eq:nn + { en } + { F } +\msg_new:nnn + { markdown } + { malformed-name-for-clist-option } + { + Clist~option~name~#1~does~not~end~with~-s. + } +% \end{macrocode} +% \begin{markdown} % -% \iffalse -% -%<*tex> -% \fi +% If plain \TeX{} is the top layer, we use the +% \mref{@@_define_option_commands_and_keyvals:} macro to define plain \TeX{} +% option macros and key-values immediately. Otherwise, we +% postpone the definition until the upper layers have been loaded. % +% \end{markdown} % \begin{macrocode} -\def\markdownRendererContentBlockOnlineImage{% - \markdownRendererContentBlockOnlineImagePrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { contentBlockOnlineImage } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { contentBlockOnlineImage } - { 4 } +\str_if_eq:VVT + \c_@@_top_layer_tl + \c_@@_option_layer_plain_tex_tl + { + \@@_define_option_commands_and_keyvals: + } \ExplSyntaxOff % \end{macrocode} -% \par -% % \iffalse % -%<*manual-tokens> +%<*manual-options> % \fi -% % \begin{markdown} -The \mdef{markdownRendererContentBlockCode} macro represents an iA\,Writer -content block that was recognized as a file in a known programming language -by its filename extension $s$. If any `markdown-languages.json` file found -by \pkg{kpathsea}^[Filenames other than `markdown-languages.json` may -be specified using the `contentBlocksLanguageMap` Lua option.] contains a -record $(k, v)$, then a non-online-image content block with the filename -extension $s, s$`:lower()`${}=k$ is considered to be in a known programming -language $v$. -The macro receives five arguments: the local file name extension $s$ cast to -the lower case, the language $v$, the fully escaped \acro{uri} that can be -directly typeset, the raw \acro{uri} that can be used outside typesetting, -and the title of the content block. +### Themes {#themes} -Note that you will need to place place a `markdown-languages.json` file -inside your working directory or inside your local \TeX{} directory -structure. In this file, you will define a mapping between filename -extensions and the language names recognized by your favorite syntax -highlighter; there may exist other creative uses beside syntax highlighting. -% The `Languages.json` file provided by @sotkov17 is a good starting point. -% \end{markdown} +User-defined themes for the Markdown package provide a domain-specific +interpretation of Markdown tokens. Themes allow the authors to achieve +a specific look and other high-level goals without low-level programming. + +% The key-values `theme`=\meta{theme name} and `import`=\meta{theme name} load +% a \TeX{} document (further referred to as *a theme*) named +% `markdowntheme`\meta{munged theme name}`.tex`, where the *munged theme name* +% is the *theme name* after the substitution of all forward slashes (`/`) for +% an underscore (`_`). The theme name is *qualified* and contains no +% underscores. A theme name is qualified if and only if it contains at least +% one forward slash. Themes are inspired by the Beamer \LaTeX{} package, which +% provides similar functionality with its `\usetheme` macro [@tantau21, Section +% 15.1]. +% +% Theme names must be qualified to minimize naming conflicts between different +% themes with a similar purpose. The preferred format of a theme name is +% \meta{theme author}`/`\meta{theme purpose}`/`\meta{private naming +% scheme}, where the *private naming scheme* may contain additional forward +% slashes. For example, a theme by a user `witiko` for the MU theme of the +% Beamer document class may have the name `witiko/beamer/MU`. % +% Theme names are munged to allow structure inside theme names without +% dictating where the themes should be located inside the \TeX{} directory +% structure. For example, loading a theme named `witiko/beamer/MU` would +% load a \TeX{} document package named `markdownthemewitiko_beamer_MU.tex`. +% +% \end{markdown} % \iffalse -[The `Languages.json` file provided by Anton Sotkov][sotkov17] is a good -starting point. - - [sotkov17]: https://github.com/iainc/Markdown-Content-Blocks - (File transclusion syntax for Markdown) - +% +%<*tex> +% \fi +% \begin{macrocode} +\ExplSyntaxOn +\keys_define:nn + { markdown/options } + { + theme .code:n = { + \@@_set_theme:n + { #1 } + }, + import .code:n = { + \tl_set:Nn + \l_tmpa_tl + { #1 } +% \end{macrocode} +% \begin{markdown} +% +% To ensure that keys containing forward slashes get passed correctly, we +% replace all forward slashes in the input with backslash tokens with category +% code letter and then undo the replacement. This means that if any unbraced +% backslash tokens with category code letter exist in the input, they will be +% replaced with forward slashes. However, this should be extremely rare. +% +% \end{markdown} +% \begin{macrocode} + \tl_replace_all:NnV + \l_tmpa_tl + { / } + \c_backslash_str + \keys_set:nV + { markdown/options/import } + \l_tmpa_tl + }, + } +% \end{macrocode} +% \begin{markdown} +% +% To keep track of the current theme when themes are nested, we will +% maintain the \mdef{g_\@\@_themes_seq} stack of theme names. +% For convenience, the name of the current theme is also available in the +% \mdef{g_@@_current_theme_tl} macro. +% +% \end{markdown} +% \begin{macrocode} +\seq_new:N + \g_@@_themes_seq +\tl_new:N + \g_@@_current_theme_tl +\tl_gset:Nn + \g_@@_current_theme_tl + { } +\seq_gput_right:NV + \g_@@_themes_seq + \g_@@_current_theme_tl +\cs_new:Nn + \@@_set_theme:n + { +% \end{macrocode} +% \begin{markdown} +% +% First, we validate the theme name. +% +% \end{markdown} +% \begin{macrocode} + \str_if_in:nnF + { #1 } + { / } + { + \msg_error:nnn + { markdown } + { unqualified-theme-name } + { #1 } + } + \str_if_in:nnT + { #1 } + { _ } + { + \msg_error:nnn + { markdown } + { underscores-in-theme-name } + { #1 } + } +% \end{macrocode} +% \begin{markdown} +% +% Next, we munge the theme name. +% +% \end{markdown} +% \begin{macrocode} + \str_set:Nn + \l_tmpa_str + { #1 } + \str_replace_all:Nnn + \l_tmpa_str + { / } + { _ } +% \end{macrocode} +% \begin{markdown} +% +% Finally, we load the theme. +% +% \end{markdown} +% \begin{macrocode} + \tl_gset:Nn + \g_@@_current_theme_tl + { #1 / } + \seq_gput_right:NV + \g_@@_themes_seq + \g_@@_current_theme_tl + \@@_load_theme:nV + { #1 } + \l_tmpa_str + \seq_gpop_right:NN + \g_@@_themes_seq + \l_tmpa_tl + \seq_get_right:NN + \g_@@_themes_seq + \l_tmpa_tl + \tl_gset:NV + \g_@@_current_theme_tl + \l_tmpa_tl + } +\msg_new:nnnn + { markdown } + { unqualified-theme-name } + { Won't~load~theme~with~unqualified~name~#1 } + { Theme~names~must~contain~at~least~one~forward~slash } +\msg_new:nnnn + { markdown } + { underscores-in-theme-name } + { Won't~load~theme~with~an~underscore~in~its~name~#1 } + { Theme~names~must~not~contain~underscores~in~their~names } +\cs_generate_variant:Nn + \tl_replace_all:Nnn + { NnV } +\ExplSyntaxOff +% \end{macrocode} +% \iffalse +% +%<*manual-options> +% \fi +% \par +% \begin{markdown} + +Built-in plain \TeX{} themes provided with the Markdown package include: + +\pkg{witiko/tilde} + +: A theme that makes tilde (`~`) always typeset the non-breaking space even + when the \Opt{hybrid} Lua option is disabled. +% ``` tex +% \input markdown +% \markdownSetup{import=witiko/tilde} +% \markdownBegin +% Bartel~Leendert van~der~Waerden +% \markdownEnd +% \bye +% ``````` +% Typesetting the above document produces the following text: +% “Bartel~Leendert van~der~Waerden”. +% +% \end{markdown} +% \iffalse + ##### Plain \TeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownOptionContentBlocks{true} -\def\markdownRendererContentBlock#1#2#3#4{% - This is {\tt #2}, #4. -} -\def\markdownRendererContentBlockOnlineImage#1#2#3#4{% - This is the image {\tt #2}, #4. -} -\def\markdownRendererContentBlockCode#1#2#3#4#5{% - This is the #2 (\uppercase{#1}) document {\tt #3}, #5. -} +\markdownSetup{import=witiko/tilde} \markdownBegin -/document.tex (the document that we are currently typesetting) -/markdown-languages.json (the mapping between filename extensions - and programming language names) -https://tug.org/tugboat/noword.jpg (the logotype of TUGboat) +Bartel~Leendert van~der~Waerden \markdownEnd \bye ``````` -Create also a text document named `markdown-languages.json` with the following -content: -``` js -{ - "json": "JavaScript Object Notation", -} -`````` Next, invoke LuaTeX from the terminal: ``` sh luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the -following text: +following text, where the middot (`·`) denotes a non-breaking space: -> This is `document.tex`, the document that we are currently typesetting. -> -> This is the JavaScript Object Notation (JSON) document -> `markdown-languages.json`, the mapping between filename extensions and -> programming language names. -> -> This is the image `https://tug.org/tugboat/noword.jpg`, the logotype of -> TUGboat. +> Bartel·Leendert van·der·Waerden -##### \LaTeX{} Example {.unnumbered} +% \fi +% \par +% \begin{markdown} -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\begin{filecontents}[overwrite,nosearch,noheader]{markdown-languages.json} -{ - "json": "JavaScript Object Notation", -} -\end{filecontents} -\usepackage[contentBlocks]{markdown} -\markdownSetup{ - renderers = { - contentBlock = {This is \texttt{#2}, #4.}, - contentBlockOnlineImage = {This is the image \texttt{#2}, #4.}, - contentBlockCode = {% - This is the #2 (\MakeUppercase{#1}) document \texttt{#3}, #5. - }, - }, -} -\begin{document} -\begin{markdown} -/document.tex (the document that we are currently typesetting) -/markdown-languages.json (the mapping between filename extensions - and programming language names) -https://tug.org/tugboat/noword.jpg (the logotype of TUGboat) -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: +\pkg{witiko/markdown/defaults} -> This is `document.tex`, the document that we are currently typesetting. -> -> This is the JavaScript Object Notation (JSON) document -> `markdown-languages.json`, the mapping between filename extensions and -> programming language names. -> -> This is the image `https://tug.org/tugboat/noword.jpg`, the logotype of -> TUGboat. +: A plain \TeX{} theme with the default definitions of token renderer + prototypes for plain \TeX{}. This theme is loaded automatically together + with the package and explicitly loading it has no effect. -##### \Hologo{ConTeXt} Example {.unnumbered} +% Please, see Section <#sec:themes-implementation> for implementation +% details of the built-in plain \TeX{} themes. -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\setupmarkdown[contentBlocks = yes] -\def\markdownRendererContentBlock#1#2#3#4{% - This is {\tt #2}, #4. -} -\def\markdownRendererContentBlockOnlineImage#1#2#3#4{% - This is the image {\tt #2}, #4. -} -\def\markdownRendererContentBlockCode#1#2#3#4#5{% - This is the #2 (\uppercase{#1}) document {\tt #3}, #5. -} -\starttext -\startmarkdown -/document.tex (the document that we are currently typesetting) -/markdown-languages.json (the mapping between filename extensions - and programming language names) -https://tug.org/tugboat/noword.jpg (the logotype of TUGboat) -\stopmarkdown -\stoptext -``````` -Create also a text document named `markdown-languages.json` with the following -content: -``` js -{ - "json": "JavaScript Object Notation", -} -`````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: +### Snippets {#snippets} -> This is `document.tex`, the document that we are currently typesetting. -> -> This is the JavaScript Object Notation (JSON) document -> `markdown-languages.json`, the mapping between filename extensions and -> programming language names. -> -> This is the image `https://tug.org/tugboat/noword.jpg`, the logotype of -> TUGboat. +% \end{markdown} +% \iffalse -% +User-defined themes provide global control over high-level goals. +However, it is often desirable to change only some local aspects of a document. +Snippets provide syntactic sugar for defining and invoking various +options locally. + +% %<*tex> % \fi +% \par +% \begin{markdown} +% +% We may set up options as *snippets* using the +% \mdef{markdownSetupSnippet} macro and invoke them later. The +% \mref{markdownSetupSnippet} macro receives two arguments: the name +% of the snippet and the options to store. % +% \end{markdown} % \begin{macrocode} -\def\markdownRendererContentBlockCode{% - \markdownRendererContentBlockCodePrototype}% \ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { contentBlockCode } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { contentBlockCode } - { 5 } -\ExplSyntaxOff +\prop_new:N + \g_@@_snippets_prop +\cs_new:Nn + \@@_setup_snippet:nn + { + \tl_if_empty:nT + { #1 } + { + \msg_error:nnn + { markdown } + { empty-snippet-name } + { #1 } + } + \tl_set:NV + \l_tmpa_tl + \g_@@_current_theme_tl + \tl_put_right:Nn + \l_tmpa_tl + { #1 } + \@@_if_snippet_exists:nT + { #1 } + { + \msg_warning:nnV + { markdown } + { redefined-snippet } + \l_tmpa_tl + } + \prop_gput:NVn + \g_@@_snippets_prop + \l_tmpa_tl + { #2 } + } +\cs_gset_eq:NN + \markdownSetupSnippet + \@@_setup_snippet:nn +\msg_new:nnnn + { markdown } + { empty-snippet-name } + { Empty~snippet~name~#1 } + { Pick~a~non-empty~name~for~your~snippet } +\msg_new:nnn + { markdown } + { redefined-snippet } + { Redefined~snippet~#1 } % \end{macrocode} -% \par +% \begin{markdown} % -% \iffalse -% -%<*manual-tokens> -% \fi +% To decide whether a snippet exists, we can use the +% \mdef{markdownIfSnippetExists} macro. % -% \begin{markdown} - -#### Definition List Renderers -The following macros are only produced, when the \Opt{definitionLists} option -is enabled. - -The \mdef{markdownRendererDlBegin} macro represents the beginning of a -definition list that contains an item with several paragraphs of text (the -list is not tight). The macro receives no arguments. - % \end{markdown} +% \begin{macrocode} +\prg_new_conditional:Nnn + \@@_if_snippet_exists:n + { TF, T, F } + { + \tl_set:NV + \l_tmpa_tl + \g_@@_current_theme_tl + \tl_put_right:Nn + \l_tmpa_tl + { #1 } + \prop_get:NVNTF + \g_@@_snippets_prop + \l_tmpa_tl + \l_tmpb_tl + { \prg_return_true: } + { \prg_return_false: } + } +\cs_gset_eq:NN + \markdownIfSnippetExists + \@@_if_snippet_exists:nTF +% \end{macrocode} +% \begin{markdown} % -% \iffalse -% -%<*tex> -% \fi +% The option with key `snippet` invokes a snippet named \meta{value}. % +% \end{markdown} % \begin{macrocode} -\def\markdownRendererDlBegin{% - \markdownRendererDlBeginPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { dlBegin } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { dlBegin } - { 0 } +\keys_define:nn + { markdown/options } + { + snippet .code:n = { + \tl_set:NV + \l_tmpa_tl + \g_@@_current_theme_tl + \tl_put_right:Nn + \l_tmpa_tl + { #1 } + \@@_if_snippet_exists:nTF + { #1 } + { + \prop_get:NVN + \g_@@_snippets_prop + \l_tmpa_tl + \l_tmpb_tl + \@@_setup:V + \l_tmpb_tl + } + { + \msg_error:nnV + { markdown } + { undefined-snippet } + \l_tmpa_tl + } + } + } +\msg_new:nnn + { markdown } + { undefined-snippet } + { Can't~invoke~undefined~snippet~#1 } +\cs_generate_variant:Nn + \@@_setup:n + { V } \ExplSyntaxOff % \end{macrocode} -% \par -% % \iffalse % -%<*manual-tokens> +%<*manual-options> % \fi -% -% \begin{markdown} +% \par +% \markdownBegin -The \mdef{markdownRendererDlBeginTight} macro represents the beginning of a -definition list that contains no item with several paragraphs of text (the -list is tight). This macro will only be produced, when the -\Opt{tightLists} option is disabled. The macro receives no arguments. +Here is how we can use snippets to store options and invoke them later +in \LaTeX{}: -% \end{markdown} -% +``` tex +\markdownSetupSnippet{romanNumerals}{ + renderers = { + olItemWithNumber = {% + \item[\romannumeral#1\relax.]% + }, + }, +} +\begin{markdown} + +The following ordered list will be preceded by arabic numerals: + +1. wahid +2. aithnayn + +\end{markdown} +\begin{markdown}[snippet=romanNumerals] + +The following ordered list will be preceded by roman numerals: + +3. tres +4. quattuor + +\end{markdown} +``````` + +If the `romanNumerals` snippet were defined in the `jdoe/lists` theme, +we could import the `jdoe/lists` theme and use the qualified name +`jdoe/lists/romanNumerals` to invoke the snippet: + +``` tex +\markdownSetup{import=jdoe/lists} +\begin{markdown}[snippet=jdoe/lists/romanNumerals] + +The following ordered list will be preceded by roman numerals: + +3. tres +4. quattuor + +\end{markdown} +``````` + +Alternatively, we can use the extended variant of the `import` \LaTeX{} +option that allows us to import the `romanNumerals` snippet to the +current namespace for easier access: + +``` tex +\markdownSetup{ + import = { + jdoe/lists = romanNumerals, + }, +} +\begin{markdown}[snippet=romanNumerals] + +The following ordered list will be preceded by roman numerals: + +3. tres +4. quattuor + +\end{markdown} +``````` + +Furthermore, we can also specify the name of the snippet in the current +namespace, which can be different from the name of the snippet in the +`jdoe/lists` theme. For example, we can make the snippet +`jdoe/lists/romanNumerals` available under the name `roman`. + +``` tex +\markdownSetup{ + import = { + jdoe/lists = romanNumerals as roman, + }, +} +\begin{markdown}[snippet=roman] + +The following ordered list will be preceded by roman numerals: + +3. tres +4. quattuor + +\end{markdown} +``````` + +Several themes and/or snippets can be loaded at once using the extended +variant of the `import` \LaTeX{} option: + +``` tex +\markdownSetup{ + import = { + jdoe/longpackagename/lists = { + arabic as arabic1, + roman, + alphabetic, + }, + jdoe/anotherlongpackagename/lists = { + arabic as arabic2, + }, + jdoe/yetanotherlongpackagename, + }, +} +``````` + +% \markdownEnd % \iffalse -% +% %<*tex> % \fi -% % \begin{macrocode} -\def\markdownRendererDlBeginTight{% - \markdownRendererDlBeginTightPrototype}% \ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { dlBeginTight } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { dlBeginTight } - { 0 } -\ExplSyntaxOff +\tl_new:N + \l_@@_import_current_theme_tl +\keys_define:nn + { markdown/options/import } + { % \end{macrocode} -% \par -% -% \iffalse -% -%<*manual-tokens> -% \fi -% % \begin{markdown} - -The \mdef{markdownRendererDlItem} macro represents a term in a definition -list. The macro receives a single argument that corresponds to the term -being defined. - -% \end{markdown} % -% \iffalse -% -%<*tex> -% \fi +% If a theme name is given without a list of snippets to import, +% we assume that an empty list was given. % +% \end{markdown} % \begin{macrocode} -\def\markdownRendererDlItem{% - \markdownRendererDlItemPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { dlItem } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { dlItem } - { 1 } -\ExplSyntaxOff + unknown .default:n = {}, + unknown .code:n = { % \end{macrocode} -% \par +% \begin{markdown} +% +% To ensure that keys containing forward slashes get passed correctly, we +% replace all forward slashes in the input with backslash tokens with category +% code letter and then undo the replacement. This means that if any unbraced +% backslash tokens with category code letter exist in the input, they will be +% replaced with forward slashes. However, this should be extremely rare. +% +% \end{markdown} +% \begin{macrocode} + \tl_set_eq:NN + \l_@@_import_current_theme_tl + \l_keys_key_str + \tl_replace_all:NVn + \l_@@_import_current_theme_tl + \c_backslash_str + { / } +% \end{macrocode} +% \begin{markdown} +% +% Here, we import the snippets. +% +% \end{markdown} +% \begin{macrocode} + \clist_map_inline:nn + { #1 } + { + \regex_extract_once:nnNTF + { ^(.*?)\s+as\s+(.*?)$ } + { ##1 } + \l_tmpa_seq + { + \seq_pop:NN + \l_tmpa_seq + \l_tmpa_tl + \seq_pop:NN + \l_tmpa_seq + \l_tmpa_tl + \seq_pop:NN + \l_tmpa_seq + \l_tmpb_tl + } + { + \tl_set:Nn + \l_tmpa_tl + { ##1 } + \tl_set:Nn + \l_tmpb_tl + { ##1 } + } + \tl_put_left:Nn + \l_tmpa_tl + { / } + \tl_put_left:NV + \l_tmpa_tl + \l_@@_import_current_theme_tl + \@@_setup_snippet:Vx + \l_tmpb_tl + { snippet = { \l_tmpa_tl } } + } +% \end{macrocode} +% \begin{markdown} +% +% Here, we load the theme. % +% \end{markdown} +% \begin{macrocode} + \@@_set_theme:V + \l_@@_import_current_theme_tl + }, + } +\cs_generate_variant:Nn + \tl_replace_all:Nnn + { NVn } +\cs_generate_variant:Nn + \@@_set_theme:n + { V } +\cs_generate_variant:Nn + \@@_setup_snippet:nn + { Vx } +% \end{macrocode} % \iffalse % %<*manual-tokens> + +## Markdown Tokens + +A key feature of the Markdown package is the support for manipulating markdown +tokens, such as headings, emphasized text, links, and lists, in \TeX{}. Instead +of reducing \TeX{} to a PDF document producer, the Markdown package allows the +user to specify how every markdown token should be processed and rendered. + % \fi -% % \begin{markdown} -The \mdef{markdownRendererDlItemEnd} macro represents the end of a list of -definitions for a single term. +### Token Renderers {#texrenderersuser} + +% \end{markdown} +% \iffalse + +Token renderers are user-defined \TeX{} macros, which render markdown tokens. +In this section, I will describe the individual token renderers. +% \fi +% \begin{markdown} +% +% The following \TeX{} macros may occur inside the output of the +% converter functions exposed by the Lua interface (see Section +% <#sec:lua-conversion>) and represent the parsed markdown tokens. These +% macros are intended to be redefined by the user who is typesetting a +% document. By default, they point to the corresponding prototypes (see Section +% <#sec:texrendererprototypes>). +% % \end{markdown} % % \iffalse % %<*tex> % \fi +% \begin{markdown} +% +% To enable the enumeration of token renderers, we will maintain the +% \mdef{g_\@\@_renderers_seq} sequence. % +% \end{markdown} % \begin{macrocode} -\def\markdownRendererDlItemEnd{% - \markdownRendererDlItemEndPrototype}% \ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { dlItemEnd } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { dlItemEnd } - { 0 } +\seq_new:N \g_@@_renderers_seq +% \end{macrocode} +% \begin{markdown} +% +% To enable the reflection of token renderers and their parameters, we will +% maintain the \mdef{g_\@\@_renderer_arities_prop} property list. +% +% \end{markdown} +% \begin{macrocode} +\prop_new:N \g_@@_renderer_arities_prop \ExplSyntaxOff % \end{macrocode} % \par @@ -12769,28 +12907,130 @@ definitions for a single term. % % \begin{markdown} -The \mdef{markdownRendererDlDefinitionBegin} macro represents the beginning -of a definition in a definition list. There can be several definitions for -a single term. +#### Attribute Renderers +The following macros are only produced, when at least one of the following +options for markdown attributes on different elements is enabled: + +- \Opt{autoIdentifiers} +- \Opt{fencedCodeAttributes} +- \Opt{gfmAutoIdentifiers} +- \Opt{headerAttributes} +- \Opt{inlineCodeAttributes} +- \Opt{linkAttributes} + +\mdef{markdownRendererAttributeIdentifier} represents the \meta{identifier} of +a markdown element (`id="`\meta{identifier}`"` in HTML and `#`\meta{identifier} +in markdown attributes). The macro receives a single attribute that corresponds +to the \meta{identifier}. + +\mdef{markdownRendererAttributeClassName} represents the \meta{class name} of a +markdown element (`class="`\meta{class name} ...`"` in HTML and +`.`\meta{class name} in markdown attributes). The macro receives a single +attribute that corresponds to the \meta{class name}. + +\mdef{markdownRendererAttributeKeyValue} represents a HTML attribute in the form +\meta{key}`=`\meta{value} that is neither an identifier nor a class name. +The macro receives two attributes that correspond to the \meta{key} and the +\meta{value}, respectively. % \end{markdown} % % \iffalse + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[headerAttributes, underscores=false]{markdown} +\markdownSetup{ + renderers = { + attributeIdentifier = {% + \par + \emph{(Identifier: #1)} + \par + }, + attributeClassName = {% + \par + \emph{(Class name: #1)} + \par + }, + attributeKeyValue = {% + \par + \emph{(Key: #1, Value: #2)} + \par + }, + }, +} +\begin{document} +\begin{markdown} + +# First top-level heading {jane=doe} + +## A subheading {#identifier} + +# Second top-level heading {.class_name} + +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> # First top-level heading +> +> *(Key: Jane, Value: Doe)* +> +> ## A subheading +> +> *(Identifier: identifier)* +> +> # Second top-level heading +> +> *(Class name: class\_name)* + % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererDlDefinitionBegin{% - \markdownRendererDlDefinitionBeginPrototype}% +\def\markdownRendererAttributeIdentifier{% + \markdownRendererAttributeIdentifierPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { dlDefinitionBegin } + { attributeIdentifier } \prop_gput:Nnn \g_@@_renderer_arities_prop - { dlDefinitionBegin } - { 0 } + { attributeIdentifier } + { 1 } +\ExplSyntaxOff +\def\markdownRendererAttributeClassName{% + \markdownRendererAttributeClassNamePrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { attributeClassName } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { attributeClassName } + { 1 } +\ExplSyntaxOff +\def\markdownRendererAttributeKeyValue{% + \markdownRendererAttributeKeyValuePrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { attributeKeyValue } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { attributeKeyValue } + { 2 } \ExplSyntaxOff % \end{macrocode} % \par @@ -12802,9 +13042,9 @@ a single term. % % \begin{markdown} -The \mdef{markdownRendererDlDefinitionEnd} macro represents the end of a -definition in a definition list. There can be several definitions for a -single term. +#### Block Quote Renderers +The \mdef{markdownRendererBlockQuoteBegin} macro represents the beginning of +a block quote. The macro receives no arguments. % \end{markdown} % @@ -12814,15 +13054,15 @@ single term. % \fi % % \begin{macrocode} -\def\markdownRendererDlDefinitionEnd{% - \markdownRendererDlDefinitionEndPrototype}% +\def\markdownRendererBlockQuoteBegin{% + \markdownRendererBlockQuoteBeginPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { dlDefinitionEnd } + { blockQuoteBegin } \prop_gput:Nnn \g_@@_renderer_arities_prop - { dlDefinitionEnd } + { blockQuoteBegin } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -12835,43 +13075,8 @@ single term. % % \begin{markdown} -The \mdef{markdownRendererDlEnd} macro represents the end of a definition -list that contains an item with several paragraphs of text (the list is not -tight). The macro receives no arguments. - -% \end{markdown} -% -% \iffalse -% -%<*tex> -% \fi -% -% \begin{macrocode} -\def\markdownRendererDlEnd{% - \markdownRendererDlEndPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { dlEnd } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { dlEnd } - { 0 } -\ExplSyntaxOff -% \end{macrocode} -% \par -% -% \iffalse -% -%<*manual-tokens> -% \fi -% -% \begin{markdown} - -The \mdef{markdownRendererDlEndTight} macro represents the end of a -definition list that contains no item with several paragraphs of text (the -list is tight). This macro will only be produced, when the \Opt{tightLists} -option is disabled. The macro receives no arguments. +The \mdef{markdownRendererBlockQuoteEnd} macro represents the end of a block +quote. The macro receives no arguments. % \end{markdown} % @@ -12883,82 +13088,25 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownOptionDefinitionLists{true} -\def\markdownOptionTightLists{true} - -\def\markdownRendererInterblockSeparator{% - :% - \def\markdownRendererInterblockSeparator{\par}% -} -\def\markdownRendererDlBeginTight{% +\def\markdownRendererBlockQuoteBegin{% \begingroup + \vskip\parindent + \leftskip=2\parindent \parindent=0pt } -\def\markdownRendererDlItem#1{% - \par{\bf#1}% - \def\markdownRendererDlDefinitionEnd{% - , - \def\markdownRendererDlDefinitionEnd{% - , and - \def\markdownRendererDlDefinitionEnd{.}% - }% - }% -} -\def\markdownRendererDlItemEnd{} -\def\markdownRendererDlDefinitionBegin{\par--\kern 0.5em} -\def\markdownRendererDlEndTight{\endgroup} - -\markdownBegin -This is a tight definition list - -Coffee -: black hot drink -: prepared from roasted coffee beans -: one of the most traded agricultural commodities in the world - -Milk -: white cold drink -: nutrient-rich -: produced on an industrial scale -\markdownEnd - -\def\markdownRendererInterblockSeparator{% - \def\markdownRendererInterblockSeparator{\par}% -} -\def\markdownRendererDlBegin{} -\def\markdownRendererDlItem#1{% - . #1 is a - \def\markdownRendererDlDefinitionBegin{% - \def\markdownRendererDlDefinitionBegin{% - , - \def\markdownRendererDlDefinitionBegin{, and }% - }% - }% +\def\markdownRendererBlockQuoteEnd{% + \par + \vskip\parindent + \endgroup } -\def\markdownRendererDlItemEnd{} -\def\markdownRendererDlDefinitionEnd{} -\def\markdownRendererDlEnd{.} - \markdownBegin -This is a loose definition list - -Coffee - -: black hot drink - -: prepared from roasted coffee beans - -: one of the most traded agricultural commodities in the world - -Milk - -: white cold drink - -: nutrient-rich +A quote from William Shakespeare's King Lear: -: produced on an industrial scale +> This is the excellent foppery of the world that when we are +> sick in fortune---often the surfeit of our own behavior---we +> make guilty of our disasters the sun, the moon, and the +> stars [...] \markdownEnd - \bye ``````` Next, invoke LuaTeX from the terminal: @@ -12968,24 +13116,12 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> This is a tight definition list: -> -> **Coffee** -> -> - black hot drink, -> - prepared from roasted coffee beans, and -> - one of the most traded agricultural commodities in the world. -> -> **Milk** -> -> - white cold drink, -> - nutrient-rich, and -> - produced on an industrial scale. +> A quote from William Shakespeare's King Lear: > -> This is a loose definition list. Coffee is a black hot drink, prepared from -> roasted coffee beans, and one of the most traded agricultural commodities in -> the world. Milk is a white cold drink, nutrient-rich, and produced on an -> industrial scale. +> > This is the excellent foppery of the world that when we are +> > sick in fortune—often the surfeit of our own behavior—we +> > make guilty of our disasters the sun, the moon, and the +> > stars [...] ##### \LaTeX{} Example {.unnumbered} @@ -12993,84 +13129,22 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[definitionLists, tightLists]{markdown} -\begin{document} - -\begin{markdown*}{ - renderers = { - interblockSeparator = {% - :% - \def\markdownRendererInterblockSeparator{\par}% - }, - dlBeginTight = {\begin{description}}, - dlItem = {% - \item[#1] - \begin{itemize} - \def\markdownRendererDlDefinitionEnd{% - , - \def\markdownRendererDlDefinitionEnd{% - , and - \def\markdownRendererDlDefinitionEnd{.}% - }% - }% - }, - dlItemEnd = {\end{itemize}}, - dlDefinitionBegin = \item, - dlEndTight = {\end{description}}, - }, -} -This is a tight definition list - -Coffee -: black hot drink -: prepared from roasted coffee beans -: one of the most traded agricultural commodities in the world - -Milk -: white cold drink -: nutrient-rich -: produced on an industrial scale -\end{markdown*} - -\begin{markdown*}{ +\usepackage{markdown} +\markdownSetup{ renderers = { - interblockSeparator = {% - \def\markdownRendererInterblockSeparator{\par}% - }, - dlBegin = {}, - dlItem = {% - . #1 is a - \def\markdownRendererDlDefinitionBegin{% - \def\markdownRendererDlDefinitionBegin{% - , - \def\markdownRendererDlDefinitionBegin{, and }% - }% - }% - }, - dlItemEnd = {}, - dlDefinitionEnd = {}, - dlEnd = {.}, + blockQuoteBegin = {\begin{quote}}, + blockQuoteEnd = {\end{quote}}, }, } -This is a loose definition list - -Coffee - -: black hot drink - -: prepared from roasted coffee beans - -: one of the most traded agricultural commodities in the world - -Milk - -: white cold drink - -: nutrient-rich - -: produced on an industrial scale -\end{markdown*} +\begin{document} +\begin{markdown} +A quote from William Shakespeare's King Lear: +> This is the excellent foppery of the world that when we are +> sick in fortune---often the surfeit of our own behavior---we +> make guilty of our disasters the sun, the moon, and the +> stars [...] +\end{markdown} \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -13080,24 +13154,12 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> This is a tight definition list: -> -> **Coffee** -> -> - black hot drink, -> - prepared from roasted coffee beans, and -> - one of the most traded agricultural commodities in the world. -> -> **Milk** -> -> - white cold drink, -> - nutrient-rich, and -> - produced on an industrial scale. +> A quote from William Shakespeare's King Lear: > -> This is a loose definition list. Coffee is a black hot drink, prepared from -> roasted coffee beans, and one of the most traded agricultural commodities in -> the world. Milk is a white cold drink, nutrient-rich, and produced on an -> industrial scale. +> > This is the excellent foppery of the world that when we are +> > sick in fortune—often the surfeit of our own behavior—we +> > make guilty of our disasters the sun, the moon, and the +> > stars [...] ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -13105,126 +13167,47 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown - [ - definitionLists = yes, - tightLists = yes, - ] +\def\markdownRendererBlockQuoteBegin{\startquotation} +\def\markdownRendererBlockQuoteEnd{\stopquotation} \starttext +\startmarkdown +A quote from William Shakespeare's King Lear: -\def\markdownRendererInterblockSeparator{% - :% - \def\markdownRendererInterblockSeparator{\par}% -} -\def\markdownRendererDlBeginTight{} -\def\markdownRendererDlItem#1{% - \par{\bf#1}% - \startitemize - \def\markdownRendererDlDefinitionEnd{% - , - \def\markdownRendererDlDefinitionEnd{% - , and - \def\markdownRendererDlDefinitionEnd{.}% - }% - }% -} -\def\markdownRendererDlItemEnd{\stopitemize} -\def\markdownRendererDlDefinitionBegin{\item} -\def\markdownRendererDlEndTight{} - -\startmarkdown -This is a tight definition list - -Coffee -: black hot drink -: prepared from roasted coffee beans -: one of the most traded agricultural commodities in the world - -Milk -: white cold drink -: nutrient-rich -: produced on an industrial scale -\stopmarkdown - -\def\markdownRendererInterblockSeparator{% - \def\markdownRendererInterblockSeparator{\par}% -} -\def\markdownRendererDlBegin{} -\def\markdownRendererDlItem#1{% - . #1 is a - \def\markdownRendererDlDefinitionBegin{% - \def\markdownRendererDlDefinitionBegin{% - , - \def\markdownRendererDlDefinitionBegin{, and }% - }% - }% -} -\def\markdownRendererDlItemEnd{} -\def\markdownRendererDlDefinitionEnd{} -\def\markdownRendererDlEnd{.} - -\startmarkdown -This is a loose definition list - -Coffee - -: black hot drink - -: prepared from roasted coffee beans - -: one of the most traded agricultural commodities in the world - -Milk - -: white cold drink - -: nutrient-rich - -: produced on an industrial scale +> This is the excellent foppery of the world that when we are +> sick in fortune---often the surfeit of our own behavior---we +> make guilty of our disasters the sun, the moon, and the +> stars [...] \stopmarkdown - \stoptext ``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> This is a tight definition list: -> -> **Coffee** -> -> - black hot drink, -> - prepared from roasted coffee beans, and -> - one of the most traded agricultural commodities in the world. -> -> **Milk** -> -> - white cold drink, -> - nutrient-rich, and -> - produced on an industrial scale. +> A quote from William Shakespeare's King Lear: > -> This is a loose definition list. Coffee is a black hot drink, prepared from -> roasted coffee beans, and one of the most traded agricultural commodities in -> the world. Milk is a white cold drink, nutrient-rich, and produced on an -> industrial scale. +> > This is the excellent foppery of the world that when we are +> > sick in fortune—often the surfeit of our own behavior—we +> > make guilty of our disasters the sun, the moon, and the +> > stars [...] % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererDlEndTight{% - \markdownRendererDlEndTightPrototype}% +\def\markdownRendererBlockQuoteEnd{% + \markdownRendererBlockQuoteEndPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { dlEndTight } + { blockQuoteEnd } \prop_gput:Nnn \g_@@_renderer_arities_prop - { dlEndTight } + { blockQuoteEnd } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -13237,52 +13220,37 @@ following text: % % \begin{markdown} -#### Ellipsis Renderer -The \mdef{markdownRendererEllipsis} macro replaces any occurance of ASCII -ellipses in the input text. This macro will only be produced, when the -\Opt{smartEllipses} option is enabled. The macro receives no arguments. +#### Bracketed Spans Attribute Context Renderers +The following macros are only produced, when the \Opt{bracketedSpans} option is +enabled. + +The \mdef{markdownRendererBracketedSpanAttributeContextBegin} and +\mdef{markdownRendererBracketedSpanAttributeContextEnd} macros represent the +beginning and the end of a context in which the attributes of +an inline bracketed span apply. The macros receive no arguments. % \end{markdown} % % \iffalse -##### Plain \TeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownOptionSmartEllipses{true} -\def\markdownRendererEllipsis{{\it SHAZAM}!} -\markdownBegin -The secret word is ... -\markdownEnd -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> The secret word is *SHAZAM*! - ##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[smartEllipses]{markdown} +\usepackage[bracketedSpans]{markdown} \markdownSetup{ renderers = { - ellipsis = \emph{SHAZAM}!, + bracketedSpanAttributeContextBegin = {(}, + bracketedSpanAttributeContextEnd = {)}, }, } \begin{document} \begin{markdown} -The secret word is ... + +[foo [bar]{#identifier}]{key=value} [baz]{.class_name} + \end{markdown} \end{document} ``````` @@ -13293,49 +13261,67 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> The secret word is *SHAZAM*! - -##### \Hologo{ConTeXt} Example {.unnumbered} +> (foo (bar)) (baz) -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\setupmarkdown[smartEllipses = yes] -\def\markdownRendererEllipsis{\emph{SHAZAM}!} -\starttext -\startmarkdown -The secret word is ... -\stopmarkdown -\stoptext -``````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererBracketedSpanAttributeContextBegin{% + \markdownRendererBracketedSpanAttributeContextBeginPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { bracketedSpanAttributeContextBegin } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { bracketedSpanAttributeContextBegin } + { 0 } +\ExplSyntaxOff +\def\markdownRendererBracketedSpanAttributeContextEnd{% + \markdownRendererBracketedSpanAttributeContextEndPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { bracketedSpanAttributeContextEnd } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { bracketedSpanAttributeContextEnd } + { 0 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +% +%<*manual-tokens> +% \fi +% +% \begin{markdown} -> Hello *world*! -> -> *(The end of a block)* -> -> _Foo_ bar! +#### Bullet List Renderers +The \mdef{markdownRendererUlBegin} macro represents the beginning of a +bulleted list that contains an item with several paragraphs of text (the +list is not tight). The macro receives no arguments. +% \end{markdown} +% +% \iffalse % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererEllipsis{% - \markdownRendererEllipsisPrototype}% +\def\markdownRendererUlBegin{% + \markdownRendererUlBeginPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { ellipsis } + { ulBegin } \prop_gput:Nnn \g_@@_renderer_arities_prop - { ellipsis } + { ulBegin } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -13348,115 +13334,61 @@ following text: % % \begin{markdown} -#### Emphasis Renderers -The \mdef{markdownRendererEmphasis} macro represents an emphasized span of -text. The macro receives a single argument that corresponds to the emphasized -span of text. +The \mdef{markdownRendererUlBeginTight} macro represents the beginning of a +bulleted list that contains no item with several paragraphs of text (the list +is tight). This macro will only be produced, when the \Opt{tightLists} option +is disabled. The macro receives no arguments. % \end{markdown} % % \iffalse +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererUlBeginTight{% + \markdownRendererUlBeginTightPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { ulBeginTight } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { ulBeginTight } + { 0 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +% +%<*manual-tokens> +% \fi +% +% \begin{markdown} -##### Plain \TeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownRendererEmphasis#1{{\it#1}} -\def\markdownRendererStrongEmphasis#1{{\bf#1}} -\markdownBegin -This is *emphasis*. - -This is **strong emphasis**. -\markdownEnd -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> This is *emphasis*. -> -> This is **strong emphasis**. - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage{markdown} -\markdownSetup{ - renderers = { - emphasis = {\emph{#1}}, - strongEmphasis = {\textbf{#1}}, - }, -} -\begin{document} -\begin{markdown} -This is *emphasis*. - -This is **strong emphasis**. -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> This is *emphasis*. -> -> This is **strong emphasis**. - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\def\markdownRendererEmphasis#1{\emph{#1}} -\def\markdownRendererStrongEmphasis#1{\bold{#1}} -\starttext -\startmarkdown -This is *emphasis*. - -This is **strong emphasis**. -\stopmarkdown -\stoptext -``````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> This is *emphasis*. -> -> This is **strong emphasis**. +The \mdef{markdownRendererUlItem} macro represents an item in a bulleted +list. The macro receives no arguments. +% \end{markdown} +% +% \iffalse % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererEmphasis{% - \markdownRendererEmphasisPrototype}% +\def\markdownRendererUlItem{% + \markdownRendererUlItemPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { emphasis } + { ulItem } \prop_gput:Nnn \g_@@_renderer_arities_prop - { emphasis } - { 1 } + { ulItem } + { 0 } \ExplSyntaxOff % \end{macrocode} % \par @@ -13468,9 +13400,8 @@ following text: % % \begin{markdown} -The \mdef{markdownRendererStrongEmphasis} macro represents a strongly -emphasized span of text. The macro receives a single argument that -corresponds to the emphasized span of text. +The \mdef{markdownRendererUlItemEnd} macro represents the end of an item in a +bulleted list. The macro receives no arguments. % \end{markdown} % @@ -13480,16 +13411,16 @@ corresponds to the emphasized span of text. % \fi % % \begin{macrocode} -\def\markdownRendererStrongEmphasis{% - \markdownRendererStrongEmphasisPrototype}% +\def\markdownRendererUlItemEnd{% + \markdownRendererUlItemEndPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { strongEmphasis } + { ulItemEnd } \prop_gput:Nnn \g_@@_renderer_arities_prop - { strongEmphasis } - { 1 } + { ulItemEnd } + { 0 } \ExplSyntaxOff % \end{macrocode} % \par @@ -13501,93 +13432,27 @@ corresponds to the emphasized span of text. % % \begin{markdown} -#### Fenced Code Attribute Context Renderers -The following macros are only produced, when the \Opt{fencedCode} option is -enabled. - -The \mdef{markdownRendererFencedCodeAttributeContextBegin} and -\mdef{markdownRendererFencedCodeAttributeContextEnd} macros represent the -beginning and the end of a context in which the attributes of a fenced code -apply. The macros receive no arguments. +The \mdef{markdownRendererUlEnd} macro represents the end of a bulleted list +that contains an item with several paragraphs of text (the list is not +tight). The macro receives no arguments. % \end{markdown} % % \iffalse - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -```` tex -\documentclass{article} -\usepackage[fencedCode, - fencedCodeAttributes]{markdown} -\usepackage{minted} -\markdownSetup{ - renderers = { - fencedCodeAttributeContextBegin = {% - \begingroup - \markdownSetup{ - renderers = { - attributeKeyValue = {% - \setminted{{#1} = {#2}}% - }, - }, - }% - }, - fencedCodeAttributeContextEnd = {% - \endgroup - }, - }, -} -\begin{document} -\begin{markdown} -~~~ js {linenos=true} -if (a > 3) { - moveShip(5 * gravity, DOWN); -} -~~~~~~ -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex --shell-escape document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> ``` js {.linenos} -> 1. if (a > 3) { -> 2. moveShip(5 * gravity, DOWN); -> 3. } -> `````` - % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererFencedCodeAttributeContextBegin{% - \markdownRendererFencedCodeAttributeContextBeginPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { fencedCodeAttributeContextBegin } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { fencedCodeAttributeContextBegin } - { 0 } -\ExplSyntaxOff -\def\markdownRendererFencedCodeAttributeContextEnd{% - \markdownRendererFencedCodeAttributeContextEndPrototype}% +\def\markdownRendererUlEnd{% + \markdownRendererUlEndPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { fencedCodeAttributeContextEnd } + { ulEnd } \prop_gput:Nnn \g_@@_renderer_arities_prop - { fencedCodeAttributeContextEnd } + { ulEnd } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -13600,62 +13465,131 @@ following text: % % \begin{markdown} -#### Fenced Div Attribute Context Renderers -The following macros are only produced, when the \Opt{fencedDiv} option is -enabled. - -The \mdef{markdownRendererFencedDivAttributeContextBegin} and -\mdef{markdownRendererFencedDivAttributeContextEnd} macros represent the beginning -and the end of a div in which the attributes of the div apply. The macros -receive no arguments. +The \mdef{markdownRendererUlEndTight} macro represents the end of a bulleted +list that contains no item with several paragraphs of text (the list is +tight). This macro will only be produced, when the \Opt{tightLists} option is +disabled. The macro receives no arguments. % \end{markdown} % % \iffalse -##### \LaTeX{} Example {.unnumbered} +##### Plain \TeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex -\documentclass{article} -\usepackage[fencedDivs]{markdown} -\markdownSetup{ - renderers = { - fencedDivAttributeContextBegin = {% - \par - \emph{(The beginning of a fenced div attribute context)} - \par - }, - fencedDivAttributeContextEnd = {% - \par - \emph{(The end of a fenced div attribute context)} - \par - }, - }, +\input markdown +\def\markdownOptionTightLists{true} + +\def\markdownRendererInterblockSeparator{} +\def\markdownRendererUlBeginTight{ (} +\def\markdownRendererUlItem{% + \def\markdownRendererUlItem{% + , + \def\markdownRendererUlItem{, and }% + }% } -\begin{document} -\begin{markdown} +\def\markdownRendererUlItemEnd{} +\def\markdownRendererUlEndTight{).} -::: {key=value} +\markdownBegin +This is a tight list -foo +- the first item +- the second item +- the third item +\markdownEnd -:::: {#identifier} +\def\markdownRendererInterblockSeparator{% + :\par + \def\markdownRendererInterblockSeparator{\par}% +} +\def\markdownRendererUlBegin{} +\def\markdownRendererUlItem{--\kern 0.5em} +\def\markdownRendererUlItemEnd{.\par} +\def\markdownRendererUlEnd{} -bar +\markdownBegin +This is a loose list -:::: +- This is the first item -::: +- This is the second item -::: {.class_name} +- This is the third item +\markdownEnd -baz +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: -::: +> This is a tight list (the first item, the second item, and the third item). +> +> This is a loose list: +> +> - This is the first item. +> +> - This is the second item. +> +> - This is the third item. + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[tightLists]{markdown} +\begin{document} + +\begin{markdown}[ + renderers = { + interblockSeparator = {}, + ulBeginTight = { (}, + ulItem = {% + \def\markdownRendererUlItem{% + , + \def\markdownRendererUlItem{, and }% + }% + }, + ulItemEnd = {}, + ulEndTight = {).}, + }, +] +This is a tight list + +- the first item +- the second item +- the third item +\end{markdown} + +\begin{markdown}[ + renderers = { + interblockSeparator = {% + :\par + \def\markdownRendererInterblockSeparator{\par}% + }, + ulBeginTight = {\begin{itemize}}, + ulItem = {\item}, + ulItemEnd = {.}, + ulEnd = {\end{itemize}}, + }, +] +This is a loose list + +- This is the first item +- This is the second item + +- This is the third item \end{markdown} + \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -13665,49 +13599,96 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> *(The beginning of a fenced div attribute context)* -> -> foo -> -> *(The beginning of a fenced div attribute context)* -> -> bar -> -> *(The end of a fenced div attribute context)* -> -> *(The end of a fenced div attribute context)* -> -> *(The beginning of a fenced div attribute context)* +> This is a tight list (the first item, the second item, and the third item). > -> baz +> This is a loose list: +> +> - This is the first item. +> +> - This is the second item. +> +> - This is the third item. + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\setupmarkdown[tightLists = yes] +\starttext + +\def\markdownRendererInterblockSeparator{} +\def\markdownRendererUlBeginTight{ (} +\def\markdownRendererUlItem{% + \def\markdownRendererUlItem{% + , + \def\markdownRendererUlItem{, and }% + }% +} +\def\markdownRendererUlItemEnd{} +\def\markdownRendererUlEndTight{).} + +\startmarkdown +This is a tight list + +- the first item +- the second item +- the third item +\stopmarkdown + +\def\markdownRendererInterblockSeparator{% + :\par + \def\markdownRendererInterblockSeparator{\par}% +} +\def\markdownRendererUlBegin{\startitemize} +\def\markdownRendererUlItem{\item} +\def\markdownRendererUlItemEnd{.} +\def\markdownRendererUlEnd{\stopitemize} + +\startmarkdown +This is a loose list + +- This is the first item + +- This is the second item + +- This is the third item +\stopmarkdown + +\stoptext +``````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> This is a tight list (the first item, the second item, and the third item). > -> *(The end of a fenced div attribute context)* +> This is a loose list: +> +> - This is the first item. +> +> - This is the second item. +> +> - This is the third item. % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererFencedDivAttributeContextBegin{% - \markdownRendererFencedDivAttributeContextBeginPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { fencedDivAttributeContextBegin } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { fencedDivAttributeContextBegin } - { 0 } -\ExplSyntaxOff -\def\markdownRendererFencedDivAttributeContextEnd{% - \markdownRendererFencedDivAttributeContextEndPrototype}% +\def\markdownRendererUlEndTight{% + \markdownRendererUlEndTightPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { fencedDivAttributeContextEnd } + { ulEndTight } \prop_gput:Nnn \g_@@_renderer_arities_prop - { fencedDivAttributeContextEnd } + { ulEndTight } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -13720,14 +13701,15 @@ following text: % % \begin{markdown} -#### Header Attribute Context Renderers -The following macros are only produced, when the \Opt{headerAttributes} option -is enabled. - -The \mdef{markdownRendererHeaderAttributeContextBegin} and -\mdef{markdownRendererHeaderAttributeContextEnd} macros represent the beginning -and the end of a section in which the attributes of a heading apply. The macros -receive no arguments. +#### Citation Renderers +The \mdef{markdownRendererCite} macro represents a string of one or more +parenthetical citations. This macro will only be produced, when the +\Opt{citations} option is enabled. The macro receives the parameter +`{`\meta{number of citations}`}` followed by \meta{suppress author} +`{`\meta{prenote}`}{`\meta{postnote}`}{`\meta{name}`}` repeated +\meta{number of citations} times. The \meta{suppress author} parameter is +either the token `-`, when the author's name is to be suppressed, or `+` +otherwise. % \end{markdown} % @@ -13739,30 +13721,43 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[headerAttributes]{markdown} +\usepackage[citations]{markdown} +\newcount\citationsCounter +\newcount\citationsTotal +\makeatletter +\def\citations#1#2#3#4{% + a parenthesized citation \emph{#4} + \advance\citationsCounter by 1\relax + \ifx\relax#2\relax + \ifx\relax#3\relax\else + with a postfix \emph{#3}% + \fi + \else + with a prefix \emph{#2}% + \ifx\relax#3\relax\else + \ and a postfix \emph{#3}% + \fi + \fi + \ifnum\citationsCounter>\citationsTotal\relax + .% + \expandafter\@gobble + \else + , and + \fi\citations} +\makeatother \markdownSetup{ renderers = { - headerAttributeContextBegin = {% - \par - \emph{(The beginning of a header attribute context)} - \par - }, - headerAttributeContextEnd = {% - \par - \emph{(The end of a header attribute context)} - \par + cite = {% + \citationsCounter=1% + \citationsTotal=#1% + This is + \expandafter\citations }, }, } \begin{document} \begin{markdown} - -# First top-level heading - -## A subheading {#identifier} - -# Second top-level heading {.class_name} - +[see @abrahams90, pp. 12; @eijkhout91, pp. 34] \end{markdown} \end{document} ``````` @@ -13773,52 +13768,25 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> # First top-level heading -> -> *(The beginning of a header attribute context)* -> -> ## A subheading -> -> *(The end of a header attribute context)* -> -> *(The beginning of a header attribute context)* -> -> # Second top-level heading -> -> *(The end of a header attribute context)* +> This is a parenthesized citation *abrahams90* with a prefix see +> and a postfix *pp. 12*, and a citation *eijkhout91* with a +> postfix *pp. 34*. % %<*tex> % \fi -% \begin{markdown} % -% These semantics have been deprecated and will be changed in Markdown 3.0.0. -% From then on, header attribute contexts will only span headings, not the -% surrounding sections. -% -% \end{markdown} % \begin{macrocode} -\def\markdownRendererHeaderAttributeContextBegin{% - \markdownRendererHeaderAttributeContextBeginPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { headerAttributeContextBegin } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { headerAttributeContextBegin } - { 0 } -\ExplSyntaxOff -\def\markdownRendererHeaderAttributeContextEnd{% - \markdownRendererHeaderAttributeContextEndPrototype}% +\def\markdownRendererCite{% + \markdownRendererCitePrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { headerAttributeContextEnd } + { cite } \prop_gput:Nnn \g_@@_renderer_arities_prop - { headerAttributeContextEnd } - { 0 } + { cite } + { 1 } \ExplSyntaxOff % \end{macrocode} % \par @@ -13830,60 +13798,85 @@ following text: % % \begin{markdown} -#### Heading Renderers -The \mdef{markdownRendererHeadingOne} macro represents a first level heading. -The macro receives a single argument that corresponds to the heading text. +The \mdef{markdownRendererTextCite} macro represents a string of one or more +text citations. This macro will only be produced, when the +\Opt{citations} option is enabled. The macro receives parameters in the same +format as the \mref{markdownRendererCite} macro. % \end{markdown} % % \iffalse -% -%<*tex> -% \fi -% -% \begin{macrocode} -\def\markdownRendererHeadingOne{% - \markdownRendererHeadingOnePrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { headingOne } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { headingOne } - { 1 } -\ExplSyntaxOff -% \end{macrocode} -% \par -% -% \iffalse -% -%<*manual-tokens> -% \fi -% -% \begin{markdown} -The \mdef{markdownRendererHeadingTwo} macro represents a second level -heading. The macro receives a single argument that corresponds to the heading -text. +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[citations]{markdown} +\newcount\citationsCounter +\newcount\citationsTotal +\makeatletter +\def\citations#1#2#3#4{% + a text citation \emph{#4} + \advance\citationsCounter by 1\relax + \ifx\relax#2\relax + \ifx\relax#3\relax\else + with a postfix \emph{#3}% + \fi + \else + with a prefix \emph{#2}% + \ifx\relax#3\relax\else + \ and a postfix \emph{#3}% + \fi + \fi + \ifnum\citationsCounter>\citationsTotal\relax + .% + \expandafter\@gobble + \else + , and + \fi\citations} +\makeatother +\markdownSetup{ + renderers = { + textCite = {% + \citationsCounter=1% + \citationsTotal=#1% + This is + \expandafter\citations + }, + }, +} +\begin{document} +\begin{markdown} +@abrahams90 [pp. 12; also @eijkhout91] +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> This is a text citation *abrahams90* with a postfix *pp. 12*, +> and a citation *eijkhout91* with a prefix *also*. -% \end{markdown} -% -% \iffalse % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererHeadingTwo{% - \markdownRendererHeadingTwoPrototype}% +\def\markdownRendererTextCite{% + \markdownRendererTextCitePrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { headingTwo } + { textCite } \prop_gput:Nnn \g_@@_renderer_arities_prop - { headingTwo } + { textCite } { 1 } \ExplSyntaxOff % \end{macrocode} @@ -13896,9 +13889,10 @@ text. % % \begin{markdown} -The \mdef{markdownRendererHeadingThree} macro represents a third level -heading. The macro receives a single argument that corresponds to the heading -text. +#### Code Block Renderers +The \mdef{markdownRendererInputVerbatim} macro represents a code +block. The macro receives a single argument that corresponds to the +filename of a file contaning the code block contents. % \end{markdown} % @@ -13908,15 +13902,15 @@ text. % \fi % % \begin{macrocode} -\def\markdownRendererHeadingThree{% - \markdownRendererHeadingThreePrototype}% +\def\markdownRendererInputVerbatim{% + \markdownRendererInputVerbatimPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { headingThree } + { inputVerbatim } \prop_gput:Nnn \g_@@_renderer_arities_prop - { headingThree } + { inputVerbatim } { 1 } \ExplSyntaxOff % \end{macrocode} @@ -13929,28 +13923,113 @@ text. % % \begin{markdown} -The \mdef{markdownRendererHeadingFour} macro represents a fourth level -heading. The macro receives a single argument that corresponds to the heading -text. +The \mdef{markdownRendererInputFencedCode} macro represents a fenced code +block. This macro will only be produced, when the \Opt{fencedCode} option is +enabled. The macro receives three arguments that correspond to the filename of +a file contaning the code block contents, the fully escaped code fence infostring +that can be directly typeset, and the raw code fence infostring that can be used +outside typesetting. % \end{markdown} % % \iffalse + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage{verbatim} +\usepackage[hyphens]{url} +\usepackage[fencedCode]{markdown} +\markdownSetup{ + renderers = { + interblockSeparator = { + \def\markdownRendererInterblockSeparator{% + \par + \def\markdownRendererInterblockSeparator{% + \def\markdownRendererInterblockSeparator{% + \par + }% + }% + }% + }, + inputVerbatim = { + is contained in file \url{#1}:% + \verbatiminput{#1}% + }, + inputFencedCode = { + in #2 \markdownRendererInputVerbatim{#1}% + }, + }, +} +\begin{document} +\begin{markdown} +The following code + + def foo(bar): + if len(bar) <= 1: + return bar[0] + elif len(bar) == 2: + return sorted(bar) + else: + baz = len(bar) // 2 + return foo(bar[baz:], bar[:baz]) + +The following code + +~~~ Python +>>> foo([4, 2, 1, 3]) +[1, 2, 3, 4] +~~~~~~~~~~ +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text except for the filename, which may differ: + +> The following code is contained in file +> `./_markdown_document/882453149edcf288976647f6fe147ada.verbatim`: +> ``` py +> def foo(bar): +> if len(bar) <= 1: +> return bar[:1] +> elif len(bar) == 2: +> return sorted(bar) +> else: +> baz = bar[len(bar) // 2] +> return ( +> foo([qux for qux in bar if qux < baz]) + [baz] + +> foo([qux for qux in bar if qux > baz]) +> ) +> `````` +> The following code in Python contained in file +> `./_markdown_document/cf2a96e2120cef5b1fae5fea36fcc27b.verbatim`: +> ``` py +> >>> foo([4, 2, 1, 3]) +> [1, 2, 3, 4] +> `````` + % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererHeadingFour{% - \markdownRendererHeadingFourPrototype}% +\def\markdownRendererInputFencedCode{% + \markdownRendererInputFencedCodePrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { headingFour } + { inputFencedCode } \prop_gput:Nnn \g_@@_renderer_arities_prop - { headingFour } - { 1 } + { inputFencedCode } + { 3 } \ExplSyntaxOff % \end{macrocode} % \par @@ -13959,45 +14038,12 @@ text. % %<*manual-tokens> % \fi -% % \begin{markdown} -The \mdef{markdownRendererHeadingFive} macro represents a fifth level -heading. The macro receives a single argument that corresponds to the heading -text. - -% \end{markdown} -% -% \iffalse -% -%<*tex> -% \fi -% -% \begin{macrocode} -\def\markdownRendererHeadingFive{% - \markdownRendererHeadingFivePrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { headingFive } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { headingFive } - { 1 } -\ExplSyntaxOff -% \end{macrocode} -% \par -% -% \iffalse -% -%<*manual-tokens> -% \fi -% -% \begin{markdown} - -The \mdef{markdownRendererHeadingSix} macro represents a sixth level -heading. The macro receives a single argument that corresponds to the heading -text. +#### Code Span Renderer +The \mdef{markdownRendererCodeSpan} macro represents inline code span in the +input text. It receives a single argument that corresponds to the inline +code span. % \end{markdown} % @@ -14009,20 +14055,21 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownRendererInterblockSeparator{} -\def\markdownRendererHeadingOne{1} -\def\markdownRendererHeadingTwo{2} -\def\markdownRendererHeadingThree{3} -\def\markdownRendererHeadingFour{4} -\def\markdownRendererHeadingFive{5} -\def\markdownRendererHeadingSix{6} +\input lmfonts + +\def\markdownRendererCodeSpan#1{#1} + \markdownBegin -###### -##### -##### -### -###### +`$\sqrt{-1}$ *equals* $i$` + +$\sqrt{-1}$ *equals* $i$ +\markdownEnd + +\def\markdownOptionHybrid{true} +\markdownBegin +$\sqrt{-1}$ *equals* $i$ \markdownEnd + \bye ``````` Next, invoke LuaTeX from the terminal: @@ -14032,7 +14079,13 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> 65536 +> \$\\sqrt{-1}\$ \*equals\* \$i\$. +> +> \$\\sqrt{-1}\$ *equals* \$i\$. +> +> 1 +> *equals* +> i. ##### \LaTeX{} Example {.unnumbered} @@ -14040,26 +14093,24 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage{markdown} +\usepackage[smartEllipses]{markdown} \markdownSetup{ renderers = { - interblockSeparator = {}, - headingOne = 1, - headingTwo = 2, - headingThree = 3, - headingFour = 4, - headingFive = 5, - headingSix = 6, + codeSpan = {#1}, }, } \begin{document} + \begin{markdown} -###### -##### -##### -### -###### +`$\sqrt{-1}$ *equals* $i$` + +$\sqrt{-1}$ *equals* $i$ +\end{markdown} + +\begin{markdown}[hybrid] +$\sqrt{-1}$ *equals* $i$ \end{markdown} + \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -14069,7 +14120,13 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> 65536 +> \$\\sqrt{-1}\$ \*equals\* \$i\$. +> +> \$\\sqrt{-1}\$ *equals* \$i\$. +> +> 1 +> *equals* +> i. ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -14077,46 +14134,51 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\def\markdownRendererInterblockSeparator{} -\def\markdownRendererHeadingOne{1} -\def\markdownRendererHeadingTwo{2} -\def\markdownRendererHeadingThree{3} -\def\markdownRendererHeadingFour{4} -\def\markdownRendererHeadingFive{5} -\def\markdownRendererHeadingSix{6} +\def\markdownRendererCodeSpan#1{#1} \starttext + \startmarkdown -###### -##### -##### -### -###### +`$\sqrt{-1}$ *equals* $i$` + +$\sqrt{-1}$ *equals* $i$ \stopmarkdown -\stoptext + +\setupmarkdown[hybrid = yes] +\startmarkdown +$\sqrt{-1}$ *equals* $i$ +\stopmarkdown + +\bye ``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> 65536 +> \$\\sqrt{-1}\$ \*equals\* \$i\$. +> +> \$\\sqrt{-1}\$ *equals* \$i\$. +> +> 1 +> *equals* +> i. % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererHeadingSix{% - \markdownRendererHeadingSixPrototype}% +\def\markdownRendererCodeSpan{% + \markdownRendererCodeSpanPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { headingSix } + { codeSpan } \prop_gput:Nnn \g_@@_renderer_arities_prop - { headingSix } + { codeSpan } { 1 } \ExplSyntaxOff % \end{macrocode} @@ -14129,16 +14191,14 @@ following text: % % \begin{markdown} -#### HTML Comment Renderers - -The \mdef{markdownRendererInlineHtmlComment} macro represents the contents of an -inline \acro{HTML} comment. This macro will only be produced, when the -\Opt{html} option is enabled. The macro receives a single argument that -corresponds to the contents of the \acro{HTML} comment. +#### Code Span Attribute Context Renderers +The following macros are only produced, when the \Opt{inlineCodeAttributes} +option is enabled. -The \mdef{markdownRendererBlockHtmlCommentBegin} and -\mdef{markdownRendererBlockHtmlCommentEnd} macros represent the beginning -and the end of a block \acro{HTML} comment. The macros receive no arguments. +The \mdef{markdownRendererCodeSpanAttributeContextBegin} and +\mdef{markdownRendererCodeSpanAttributeContextEnd} macros represent the beginning +and the end of a context in which the attributes of an inline code span apply. +The macros receive no arguments. % \end{markdown} % @@ -14150,89 +14210,56 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[html]{markdown} -\usepackage{marginnote} +\usepackage[inlineCodeAttributes]{markdown} \markdownSetup{ renderers = { - inlineHtmlComment = {\marginnote{#1}}, - blockHtmlCommentBegin = {\begin{quote}}, - blockHtmlCommentEnd = {\end{quote}}, + codeSpanAttributeContextBegin = {(}, + codeSpan = {#1}, + codeSpanAttributeContextEnd = {)}, }, } \begin{document} \begin{markdown} -A useful use of inline HTML comments are side notes. - -We can render block HTML comments as blockquotes: - - \end{markdown} \end{document} ``````` Next, invoke LuaTeX from the terminal: ``` sh lualatex document.tex -lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the -following body text: - -> A useful use of HTML comments are side notes. -> -> We can render block HTML comments as blockquotes: -> -> > Here is a block HTML comment with a code example that a programmer might -> > understand: -> > -> > foo = bar + baz - 42 - -The horizontal margins should contain the following text: +following text: -> Side notes are displayed in the horizontal margins next to the relevant -> passages, which makes them *easier for the reader to find* than notes. +> foo (bar) baz % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererInlineHtmlComment{% - \markdownRendererInlineHtmlCommentPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { inlineHtmlComment } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { inlineHtmlComment } - { 1 } -\ExplSyntaxOff -\def\markdownRendererBlockHtmlCommentBegin{% - \markdownRendererBlockHtmlCommentBeginPrototype}% +\def\markdownRendererCodeSpanAttributeContextBegin{% + \markdownRendererCodeSpanAttributeContextBeginPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { blockHtmlCommentBegin } + { codeSpanAttributeContextBegin } \prop_gput:Nnn \g_@@_renderer_arities_prop - { blockHtmlCommentBegin } + { codeSpanAttributeContextBegin } { 0 } \ExplSyntaxOff -\def\markdownRendererBlockHtmlCommentEnd{% - \markdownRendererBlockHtmlCommentEndPrototype}% +\def\markdownRendererCodeSpanAttributeContextEnd{% + \markdownRendererCodeSpanAttributeContextEndPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { blockHtmlCommentEnd } + { codeSpanAttributeContextEnd } \prop_gput:Nnn \g_@@_renderer_arities_prop - { blockHtmlCommentEnd } + { codeSpanAttributeContextEnd } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -14245,83 +14272,32 @@ The horizontal margins should contain the following text: % % \begin{markdown} -#### HTML Tag and Element Renderers - -The \mdef{markdownRendererInlineHtmlTag} macro represents an opening, closing, -or empty inline \acro{HTML} tag. This macro will only be produced, when the -\Opt{html} option is enabled. The macro receives a single argument that -corresponds to the contents of the \acro{HTML} tag. +#### Content Block Renderers {#texcontentblockrenderers} -The \mdef{markdownRendererInputBlockHtmlElement} macro represents a block -\acro{HTML} element. This macro will only be produced, when the \Opt{html} -option is enabled. The macro receives a single argument that filename of a file -containing the contents of the \acro{HTML} element. +The \mdef{markdownRendererContentBlock} macro represents an iA\\,Writer content +block. It receives four arguments: the local file or online image filename +extension cast to the lower case, the fully escaped \acro{uri} that can be +directly typeset, the raw \acro{uri} that can be used outside typesetting, +and the title of the content block. % \end{markdown} % % \iffalse - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[html]{markdown} -\usepackage{marginnote} -\usepackage{verbatim} -\markdownSetup{ - renderers = { - inlineHtmlTag = {\textbf{#1}}, - inputBlockHtmlElement = {\verbatiminput{#1}}, - }, -} -\begin{document} -\begin{markdown} -_Hello,_ world!
- -
_Hello,_ world!
-\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following body text: - -> ****_Hello,_ world!**
** -> ->
_Hello,_ world!
- % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererInlineHtmlTag{% - \markdownRendererInlineHtmlTagPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { inlineHtmlTag } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { inlineHtmlTag } - { 1 } -\ExplSyntaxOff -\def\markdownRendererInputBlockHtmlElement{% - \markdownRendererInputBlockHtmlElementPrototype}% +\def\markdownRendererContentBlock{% + \markdownRendererContentBlockPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { inputBlockHtmlElement } + { contentBlock } \prop_gput:Nnn \g_@@_renderer_arities_prop - { inputBlockHtmlElement } - { 1 } + { contentBlock } + { 4 } \ExplSyntaxOff % \end{macrocode} % \par @@ -14333,84 +14309,27 @@ following body text: % % \begin{markdown} -#### Image Renderer -The \mdef{markdownRendererImage} macro represents an image. It receives -four arguments: the label, the fully escaped \acro{uri} that can be directly -typeset, the raw \acro{uri} that can be used outside typesetting, and the -title of the link. +The \mdef{markdownRendererContentBlockOnlineImage} macro represents an +iA\\,Writer online image content block. The macro receives the same arguments +as \mref{markdownRendererContentBlock}. % \end{markdown} % % \iffalse - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage{markdown} -\begingroup -\catcode`\@=11 -\catcode`\%=12 -\catcode`\^^A=14 -\global\def\markdownRendererImage#1#2#3#4{^^A - \immediate\write18{^^A -``` -``` sh - if printf '%s' "#3" | grep -q ^http; then - OUTPUT="$(printf '%s' "#3" | md5sum | cut -d' ' -f1).^^A - $(printf '%s' "#3" | sed 's/.*[.]//')"; - if ! [ -e "$OUTPUT" ]; then - wget -O "$OUTPUT" '#3' || rm "$OUTPUT"; - convert "$OUTPUT" png:"$OUTPUT"; - fi; - printf '%s%%' "$OUTPUT" > \jobname.fetched; - else - printf '%s%%' "#3" > \jobname.fetched; - fi^^A -``` -``` tex - }^^A - {^^A - \everyeof={\noexpand}^^A - \edef\filename{\@@input"\jobname.fetched" }^^A - \includegraphics[width=\textwidth]{\filename}^^A - }^^A -} -\endgroup -\begin{document} -\begin{markdown} -![TUGboat](https://tug.org/tugboat/noword.jpg) -\end{markdown} -\end{document} -`````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex --shell-escape document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following content. This assumes that you use a Unix-like operating system with -Bourne or Bourne again shell as the default shell of the current user. It also -assumes that the `md5sum`, `wget`, and `convert` binaries are installed and -that the \TeX{} engine has shell access. - -> ![TUGboat](https://tug.org/tugboat/noword.jpg "The Communications of the TeX Users Group") - % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererImage{% - \markdownRendererImagePrototype}% +\def\markdownRendererContentBlockOnlineImage{% + \markdownRendererContentBlockOnlineImagePrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { image } + { contentBlockOnlineImage } \prop_gput:Nnn \g_@@_renderer_arities_prop - { image } + { contentBlockOnlineImage } { 4 } \ExplSyntaxOff % \end{macrocode} @@ -14423,94 +14342,33 @@ that the \TeX{} engine has shell access. % % \begin{markdown} -#### Image Attribute Context Renderers -The following macros are only produced, when the \Opt{linkAttributes} option -is enabled. - -The \mdef{markdownRendererImageAttributeContextBegin} and -\mdef{markdownRendererImageAttributeContextEnd} macros represent the beginning -and the end of an image in which the attributes of the image apply. The macros -receive no arguments. +The \mdef{markdownRendererContentBlockCode} macro represents an iA\\,Writer +content block that was recognized as a file in a known programming language +by its filename extension $s$. If any `markdown-languages.json` file found +by \pkg{kpathsea}^[Filenames other than `markdown-languages.json` may +be specified using the `contentBlocksLanguageMap` Lua option.] contains a +record $(k, v)$, then a non-online-image content block with the filename +extension $s, s$`:lower()`${}=k$ is considered to be in a known programming +language $v$. +The macro receives five arguments: the local file name extension $s$ cast to +the lower case, the language $v$, the fully escaped \acro{uri} that can be +directly typeset, the raw \acro{uri} that can be used outside typesetting, +and the title of the content block. +Note that you will need to place place a `markdown-languages.json` file +inside your working directory or inside your local \TeX{} directory +structure. In this file, you will define a mapping between filename +extensions and the language names recognized by your favorite syntax +highlighter; there may exist other creative uses beside syntax highlighting. +% The `Languages.json` file provided by @sotkov17 is a good starting point. % \end{markdown} % % \iffalse +[The `Languages.json` file provided by Anton Sotkov][sotkov17] is a good +starting point. -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[linkAttributes]{markdown} -\markdownSetup{ - renderers = { - imageAttributeContextBegin = {(}, - image = {#1}, - imageAttributeContextEnd = {)}, - }, -} -\begin{document} -\begin{markdown} - -foo ![bar](#bar){key=value} baz - -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> foo (bar) baz - -% -%<*tex> -% \fi -% -% \begin{macrocode} -\def\markdownRendererImageAttributeContextBegin{% - \markdownRendererImageAttributeContextBeginPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { imageAttributeContextBegin } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { imageAttributeContextBegin } - { 0 } -\ExplSyntaxOff -\def\markdownRendererImageAttributeContextEnd{% - \markdownRendererImageAttributeContextEndPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { imageAttributeContextEnd } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { imageAttributeContextEnd } - { 0 } -\ExplSyntaxOff -% \end{macrocode} -% \par -% -% \iffalse -% -%<*manual-tokens> -% \fi -% -% \begin{markdown} - -#### Interblock Separator Renderer -The \mdef{markdownRendererInterblockSeparator} macro represents a separator -between two markdown block elements. The macro receives no arguments. - -% \end{markdown} -% -% \iffalse + [sotkov17]: https://github.com/iainc/Markdown-Content-Blocks + (File transclusion syntax for Markdown) ##### Plain \TeX{} Example {.unnumbered} @@ -14518,18 +14376,31 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownRendererInterblockSeparator{% - \par - {\it(The end of a block)}% - \par +\def\markdownOptionContentBlocks{true} +\def\markdownRendererContentBlock#1#2#3#4{% + This is {\tt #2}, #4. +} +\def\markdownRendererContentBlockOnlineImage#1#2#3#4{% + This is the image {\tt #2}, #4. +} +\def\markdownRendererContentBlockCode#1#2#3#4#5{% + This is the #2 (\uppercase{#1}) document {\tt #3}, #5. } \markdownBegin -Hello *world*! - -_Foo_ bar! +/document.tex (the document that we are currently typesetting) +/markdown-languages.json (the mapping between filename extensions + and programming language names) +https://tug.org/tugboat/noword.jpg (the logotype of TUGboat) \markdownEnd \bye ``````` +Create also a text document named `markdown-languages.json` with the following +content: +``` js +{ + "json": "JavaScript Object Notation", +} +`````` Next, invoke LuaTeX from the terminal: ``` sh luatex document.tex @@ -14537,11 +14408,14 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> Hello *world*! +> This is `document.tex`, the document that we are currently typesetting. > -> *(The end of a block)* -> -> _Foo_ bar! +> This is the JavaScript Object Notation (JSON) document +> `markdown-languages.json`, the mapping between filename extensions and +> programming language names. +> +> This is the image `https://tug.org/tugboat/noword.jpg`, the logotype of +> TUGboat. ##### \LaTeX{} Example {.unnumbered} @@ -14549,21 +14423,27 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage{markdown} +\begin{filecontents}[overwrite,nosearch,noheader]{markdown-languages.json} +{ + "json": "JavaScript Object Notation", +} +\end{filecontents} +\usepackage[contentBlocks]{markdown} \markdownSetup{ renderers = { - interblockSeparator = {% - \par - \emph{(The end of a block)}% - \par + contentBlock = {This is \texttt{#2}, #4.}, + contentBlockOnlineImage = {This is the image \texttt{#2}, #4.}, + contentBlockCode = {% + This is the #2 (\MakeUppercase{#1}) document \texttt{#3}, #5. }, }, } \begin{document} \begin{markdown} -Hello *world*! - -_Foo_ bar! +/document.tex (the document that we are currently typesetting) +/markdown-languages.json (the mapping between filename extensions + and programming language names) +https://tug.org/tugboat/noword.jpg (the logotype of TUGboat) \end{markdown} \end{document} ``````` @@ -14574,11 +14454,14 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> Hello *world*! +> This is `document.tex`, the document that we are currently typesetting. > -> *(The end of a block)* -> -> _Foo_ bar! +> This is the JavaScript Object Notation (JSON) document +> `markdown-languages.json`, the mapping between filename extensions and +> programming language names. +> +> This is the image `https://tug.org/tugboat/noword.jpg`, the logotype of +> TUGboat. ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -14586,47 +14469,63 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\def\markdownRendererInterblockSeparator{% - \par - \emph{(The end of a block)}% - \par +\setupmarkdown[contentBlocks = yes] +\def\markdownRendererContentBlock#1#2#3#4{% + This is {\tt #2}, #4. +} +\def\markdownRendererContentBlockOnlineImage#1#2#3#4{% + This is the image {\tt #2}, #4. +} +\def\markdownRendererContentBlockCode#1#2#3#4#5{% + This is the #2 (\uppercase{#1}) document {\tt #3}, #5. } \starttext \startmarkdown -Hello *world*! - -_Foo_ bar! +/document.tex (the document that we are currently typesetting) +/markdown-languages.json (the mapping between filename extensions + and programming language names) +https://tug.org/tugboat/noword.jpg (the logotype of TUGboat) \stopmarkdown \stoptext ``````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex +Create also a text document named `markdown-languages.json` with the following +content: +``` js +{ + "json": "JavaScript Object Notation", +} +`````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> Hello *world*! +> This is `document.tex`, the document that we are currently typesetting. > -> *(The end of a block)* -> -> _Foo_ bar! +> This is the JavaScript Object Notation (JSON) document +> `markdown-languages.json`, the mapping between filename extensions and +> programming language names. +> +> This is the image `https://tug.org/tugboat/noword.jpg`, the logotype of +> TUGboat. % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererInterblockSeparator{% - \markdownRendererInterblockSeparatorPrototype}% +\def\markdownRendererContentBlockCode{% + \markdownRendererContentBlockCodePrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { interblockSeparator } + { contentBlockCode } \prop_gput:Nnn \g_@@_renderer_arities_prop - { interblockSeparator } - { 0 } + { contentBlockCode } + { 5 } \ExplSyntaxOff % \end{macrocode} % \par @@ -14638,125 +14537,31 @@ following text: % % \begin{markdown} -#### Line Block Renderer -The following macros are only produced, when the \Opt{lineBlocks} option +#### Definition List Renderers +The following macros are only produced, when the \Opt{definitionLists} option is enabled. -The \mdef{markdownRendererLineBlockBegin} and \mdef{markdownRendererLineBlockEnd} macros -represent the beginning and the end of a line block. The macros receive no arguments. +The \mdef{markdownRendererDlBegin} macro represents the beginning of a +definition list that contains an item with several paragraphs of text (the +list is not tight). The macro receives no arguments. % \end{markdown} % % \iffalse - -##### Plain \TeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownOptionLineBlocks{true} -\markdownBegin -| I would spread the cloths under your feet: -| But I, being poor, have only my dreams; -| I have spread my dreams under your feet; -| Tread softly because you tread on my dreams. -\markdownEnd -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> | I would spread the cloths under your feet: -> | But I, being poor, have only my dreams; -> | I have spread my dreams under your feet; -> | Tread softly because you tread on my dreams. - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[lineBlocks]{markdown} -\begin{document} -\begin{markdown} -| I would spread the cloths under your feet: -| But I, being poor, have only my dreams; -| I have spread my dreams under your feet; -| Tread softly because you tread on my dreams. -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> | I would spread the cloths under your feet: -> | But I, being poor, have only my dreams; -> | I have spread my dreams under your feet; -> | Tread softly because you tread on my dreams. - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\setupmarkdown[lineBlocks = yes] -\starttext -\startmarkdown -| I would spread the cloths under your feet: -| But I, being poor, have only my dreams; -| I have spread my dreams under your feet; -| Tread softly because you tread on my dreams. -\stopmarkdown -\stoptext -``````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> | I would spread the cloths under your feet: -> | But I, being poor, have only my dreams; -> | I have spread my dreams under your feet; -> | Tread softly because you tread on my dreams. - % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererLineBlockBegin{% - \markdownRendererLineBlockBeginPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { lineBlockBegin } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { lineBlockBegin } - { 0 } -\ExplSyntaxOff -\def\markdownRendererLineBlockEnd{% - \markdownRendererLineBlockEndPrototype}% +\def\markdownRendererDlBegin{% + \markdownRendererDlBeginPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { lineBlockEnd } + { dlBegin } \prop_gput:Nnn \g_@@_renderer_arities_prop - { lineBlockEnd } + { dlBegin } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -14769,144 +14574,28 @@ following text: % % \begin{markdown} -#### Line Break Renderer -The \mdef{markdownRendererHardLineBreak} macro represents a hard line break. -The macro receives no arguments. +The \mdef{markdownRendererDlBeginTight} macro represents the beginning of a +definition list that contains no item with several paragraphs of text (the +list is tight). This macro will only be produced, when the +\Opt{tightLists} option is disabled. The macro receives no arguments. % \end{markdown} % % \iffalse - -##### Plain \TeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownRendererHardLineBreak{% - \par - {\it(A hard line break)}% - \par -} -\markdownInput{example.md} -\bye -``````` -Using a text editor, create a text document named `example.md` with the -following content. Note the two spaces at the end of the first line, which -specify a hard line break. Due to the limitations of the \TeX{} input -processor, hard line breaks would be ignored if we typed them directly into the -`document.tex` document. - -
Hello world!  
_Foo_ bar!
- -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> Hello *world*! -> -> *(A hard line break)* -> -> _Foo_ bar! - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage{markdown} -\markdownSetup{ - renderers = { - hardLineBreak = {% - \par - \emph{(A hard line break)}% - \par - }, - }, -} -\begin{document} -\markdownInput{example.md} -\end{document} -``````` -Using a text editor, create a text document named `example.md` with the -following content. Note the two spaces at the end of the first line, which -specify a hard line break. Due to the limitations of the \TeX{} input -processor, hard line breaks would be ignored if we typed them directly into the -`document.tex` document. - -
Hello world!  
_Foo_ bar!
- -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> Hello *world*! -> -> *(A hard line break)* -> -> _Foo_ bar! - % %<*tex> % \fi -% \begin{markdown} -% -% The \mdef{markdownRendererLineBreak} and -% \mdef{markdownRendererLineBreakPrototype} macros have been deprecated -% and will be removed in Markdown 3.0.0. % -% \end{markdown} % \begin{macrocode} +\def\markdownRendererDlBeginTight{% + \markdownRendererDlBeginTightPrototype}% \ExplSyntaxOn -\cs_new:Npn - \markdownRendererHardLineBreak - { - \cs_if_exist:NTF - \markdownRendererLineBreak - { - \markdownWarning - { - Line~break~renderer~has~been~deprecated,~ - to~be~removed~in~Markdown~3.0.0 - } - \markdownRendererLineBreak - } - { - \cs_if_exist:NTF - \markdownRendererLineBreakPrototype - { - \markdownWarning - { - Line~break~renderer~prototype~has~been~deprecated,~ - to~be~removed~in~Markdown~3.0.0 - } - \markdownRendererLineBreakPrototype - } - { - \markdownRendererHardLineBreakPrototype - } - } - } -\seq_gput_right:Nn - \g_@@_renderers_seq - { lineBreak } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { lineBreak } - { 0 } \seq_gput_right:Nn \g_@@_renderers_seq - { hardLineBreak } + { dlBeginTight } \prop_gput:Nnn \g_@@_renderer_arities_prop - { hardLineBreak } + { dlBeginTight } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -14919,119 +14608,28 @@ following text: % % \begin{markdown} -#### Link Renderer -The \mdef{markdownRendererLink} macro represents a hyperlink. It receives -four arguments: the label, the fully escaped \acro{uri} that can be directly -typeset, the raw \acro{uri} that can be used outside typesetting, and the -title of the link. +The \mdef{markdownRendererDlItem} macro represents a term in a definition +list. The macro receives a single argument that corresponds to the term +being defined. % \end{markdown} % % \iffalse - -##### Plain \TeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownRendererLink#1#2#3#4{% - #1 {\tt#2} titled {\it#4}% -} -\markdownBegin -Please visit [the link][ctan]. - - [ctan]: https://ctan.org/ - (the Comprehensive TeX Archive Network) -\markdownEnd -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> Please visit the link titled *the Comprehensive TeX -> Archive Network*. - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage{markdown} -\markdownSetup{ - renderers = { - link = {% - #1 \texttt{#2} titled \emph{#4}% - }, - }, -} -\begin{document} -\begin{markdown} -Please visit [the link][ctan]. - - [ctan]: https://ctan.org/ - (the Comprehensive TeX Archive Network) -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> Please visit the link titled *the Comprehensive TeX -> Archive Network*. - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\def\markdownRendererLink#1#2#3#4{% - #1 {\tt#2} titled \emph{#4}% -} -\starttext -\startmarkdown -Please visit [the link][ctan]. - - [ctan]: https://ctan.org/ - (the Comprehensive TeX Archive Network) -\stopmarkdown -\stoptext -``````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> Please visit the link titled *the Comprehensive TeX -> Archive Network*. - % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererLink{% - \markdownRendererLinkPrototype}% +\def\markdownRendererDlItem{% + \markdownRendererDlItemPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { link } + { dlItem } \prop_gput:Nnn \g_@@_renderer_arities_prop - { link } - { 4 } + { dlItem } + { 1 } \ExplSyntaxOff % \end{macrocode} % \par @@ -15043,75 +14641,125 @@ following text: % % \begin{markdown} -#### Link Attribute Context Renderers -The following macros are only produced, when the \Opt{linkAttributes} option -is enabled. - -The \mdef{markdownRendererLinkAttributeContextBegin} and -\mdef{markdownRendererLinkAttributeContextEnd} macros represent the beginning -and the end of a hyperlink in which the attributes of the hyperlink apply. -The macros receive no arguments. +The \mdef{markdownRendererDlItemEnd} macro represents the end of a list of +definitions for a single term. % \end{markdown} % % \iffalse +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererDlItemEnd{% + \markdownRendererDlItemEndPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { dlItemEnd } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { dlItemEnd } + { 0 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +% +%<*manual-tokens> +% \fi +% +% \begin{markdown} -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[linkAttributes]{markdown} -\markdownSetup{ - renderers = { - linkAttributeContextBegin = {(}, - link = {#1}, - linkAttributeContextEnd = {)}, - }, -} -\begin{document} -\begin{markdown} - -foo [bar](#bar){key=value} baz +The \mdef{markdownRendererDlDefinitionBegin} macro represents the beginning +of a definition in a definition list. There can be several definitions for +a single term. -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: +% \end{markdown} +% +% \iffalse +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererDlDefinitionBegin{% + \markdownRendererDlDefinitionBeginPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { dlDefinitionBegin } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { dlDefinitionBegin } + { 0 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +% +%<*manual-tokens> +% \fi +% +% \begin{markdown} -> foo (bar) baz +The \mdef{markdownRendererDlDefinitionEnd} macro represents the end of a +definition in a definition list. There can be several definitions for a +single term. +% \end{markdown} +% +% \iffalse % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererLinkAttributeContextBegin{% - \markdownRendererLinkAttributeContextBeginPrototype}% +\def\markdownRendererDlDefinitionEnd{% + \markdownRendererDlDefinitionEndPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { linkAttributeContextBegin } + { dlDefinitionEnd } \prop_gput:Nnn \g_@@_renderer_arities_prop - { linkAttributeContextBegin } + { dlDefinitionEnd } { 0 } \ExplSyntaxOff -\def\markdownRendererLinkAttributeContextEnd{% - \markdownRendererLinkAttributeContextEndPrototype}% +% \end{macrocode} +% \par +% +% \iffalse +% +%<*manual-tokens> +% \fi +% +% \begin{markdown} + +The \mdef{markdownRendererDlEnd} macro represents the end of a definition +list that contains an item with several paragraphs of text (the list is not +tight). The macro receives no arguments. + +% \end{markdown} +% +% \iffalse +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererDlEnd{% + \markdownRendererDlEndPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { linkAttributeContextEnd } + { dlEnd } \prop_gput:Nnn \g_@@_renderer_arities_prop - { linkAttributeContextEnd } + { dlEnd } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -15124,93 +14772,209 @@ following text: % % \begin{markdown} -#### Markdown Document Renderers -The \mdef{markdownRendererDocumentBegin} and \mdef{markdownRendererDocumentEnd} -macros represent the beginning and the end of a *markdown* document. The macros -receive no arguments. - -A \TeX{} document may contain any number of markdown documents. Additionally, -markdown documents may appear not only in a sequence, but several markdown -documents may also be *nested*. Redefinitions of the macros should take this -into account. +The \mdef{markdownRendererDlEndTight} macro represents the end of a +definition list that contains no item with several paragraphs of text (the +list is tight). This macro will only be produced, when the \Opt{tightLists} +option is disabled. The macro receives no arguments. % \end{markdown} % % \iffalse -##### \LaTeX{} Example {.unnumbered} +##### Plain \TeX{} Example {.unnumbered} -Using a text editor, create a text document named `nested.md` with the +Using a text editor, create a text document named `document.tex` with the following content: -``` md -This is a *nested* markdown document. -``` +``` tex +\input markdown +\def\markdownOptionDefinitionLists{true} +\def\markdownOptionTightLists{true} + +\def\markdownRendererInterblockSeparator{% + :% + \def\markdownRendererInterblockSeparator{\par}% +} +\def\markdownRendererDlBeginTight{% + \begingroup + \parindent=0pt +} +\def\markdownRendererDlItem#1{% + \par{\bf#1}% + \def\markdownRendererDlDefinitionEnd{% + , + \def\markdownRendererDlDefinitionEnd{% + , and + \def\markdownRendererDlDefinitionEnd{.}% + }% + }% +} +\def\markdownRendererDlItemEnd{} +\def\markdownRendererDlDefinitionBegin{\par--\kern 0.5em} +\def\markdownRendererDlEndTight{\endgroup} + +\markdownBegin +This is a tight definition list + +Coffee +: black hot drink +: prepared from roasted coffee beans +: one of the most traded agricultural commodities in the world + +Milk +: white cold drink +: nutrient-rich +: produced on an industrial scale +\markdownEnd + +\def\markdownRendererInterblockSeparator{% + \def\markdownRendererInterblockSeparator{\par}% +} +\def\markdownRendererDlBegin{} +\def\markdownRendererDlItem#1{% + . #1 is a + \def\markdownRendererDlDefinitionBegin{% + \def\markdownRendererDlDefinitionBegin{% + , + \def\markdownRendererDlDefinitionBegin{, and }% + }% + }% +} +\def\markdownRendererDlItemEnd{} +\def\markdownRendererDlDefinitionEnd{} +\def\markdownRendererDlEnd{.} + +\markdownBegin +This is a loose definition list + +Coffee + +: black hot drink + +: prepared from roasted coffee beans + +: one of the most traded agricultural commodities in the world + +Milk + +: white cold drink + +: nutrient-rich + +: produced on an industrial scale +\markdownEnd + +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> This is a tight definition list: +> +> **Coffee** +> +> - black hot drink, +> - prepared from roasted coffee beans, and +> - one of the most traded agricultural commodities in the world. +> +> **Milk** +> +> - white cold drink, +> - nutrient-rich, and +> - produced on an industrial scale. +> +> This is a loose definition list. Coffee is a black hot drink, prepared from +> roasted coffee beans, and one of the most traded agricultural commodities in +> the world. Milk is a white cold drink, nutrient-rich, and produced on an +> industrial scale. + +##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[contentBlocks]{markdown} -\markdownSetup{ +\usepackage[definitionLists, tightLists]{markdown} +\begin{document} + +\begin{markdown}[ renderers = { - contentBlock = {% - \markdownInput{#3}% - }, - documentBegin = {% - \par - \emph{(The beginning of a document)} - \par - \begingroup - \markdownSetup{snippet=first-nesting-level}% - }, - documentEnd = {% - \endgroup - \par - \emph{(The end of a document)} - \par + interblockSeparator = {% + :% + \def\markdownRendererInterblockSeparator{\par}% }, - }, -} -\markdownSetupSnippet{first-nesting-level}{ - renderers = { - documentBegin = { - \par - \emph{(The beginning of a nested document)} - \par - \begingroup - \markdownSetup{snippet=second-nesting-level-and-below} + dlBeginTight = {\begin{description}}, + dlItem = {% + \item[#1] + \begin{itemize} + \def\markdownRendererDlDefinitionEnd{% + , + \def\markdownRendererDlDefinitionEnd{% + , and + \def\markdownRendererDlDefinitionEnd{.}% + }% + }% }, + dlItemEnd = {\end{itemize}}, + dlDefinitionBegin = \item, + dlEndTight = {\end{description}}, }, -} -\markdownSetupSnippet{second-nesting-level-and-below}{ +] +This is a tight definition list + +Coffee +: black hot drink +: prepared from roasted coffee beans +: one of the most traded agricultural commodities in the world + +Milk +: white cold drink +: nutrient-rich +: produced on an industrial scale +\end{markdown} + +\begin{markdown}[ renderers = { - documentBegin = { - \par - \emph{(The beginning of a nested document)} - \par - \begingroup + interblockSeparator = {% + \def\markdownRendererInterblockSeparator{\par}% }, - documentEnd = { - \endgroup - \par - \emph{(The end of a nested document)} - \par + dlBegin = {}, + dlItem = {% + . #1 is a + \def\markdownRendererDlDefinitionBegin{% + \def\markdownRendererDlDefinitionBegin{% + , + \def\markdownRendererDlDefinitionBegin{, and }% + }% + }% }, + dlItemEnd = {}, + dlDefinitionEnd = {}, + dlEnd = {.}, }, -} -\begin{document} -\begin{markdown} -Hello *world*! +] +This is a loose definition list -/nested.md +Coffee -_Foo_ bar! -\end{markdown} -\begin{markdown} +: black hot drink -Bar baz! +: prepared from roasted coffee beans + +: one of the most traded agricultural commodities in the world + +Milk + +: white cold drink + +: nutrient-rich +: produced on an industrial scale \end{markdown} + \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -15220,136 +14984,151 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> *(The beginning of a document)* -> -> Hello *world*! -> -> *(The beginning of a nested document)* -> -> This is a *nested* markdown document. -> -> *(The end of a nested document)* +> This is a tight definition list: > -> _Foo_ bar! +> **Coffee** > -> *(The end of a document)* +> - black hot drink, +> - prepared from roasted coffee beans, and +> - one of the most traded agricultural commodities in the world. > -> *(The beginning of a document)* +> **Milk** > -> Bar baz! +> - white cold drink, +> - nutrient-rich, and +> - produced on an industrial scale. > -> *(The end of a document)* +> This is a loose definition list. Coffee is a black hot drink, prepared from +> roasted coffee beans, and one of the most traded agricultural commodities in +> the world. Milk is a white cold drink, nutrient-rich, and produced on an +> industrial scale. -% -%<*tex> -% \fi -% -% \begin{macrocode} -\def\markdownRendererDocumentBegin{% - \markdownRendererDocumentBeginPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { documentBegin } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { documentBegin } - { 0 } -\ExplSyntaxOff -\def\markdownRendererDocumentEnd{% - \markdownRendererDocumentEndPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { documentEnd } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { documentEnd } - { 0 } -\ExplSyntaxOff -% \end{macrocode} -% \par -% -% \iffalse -% -%<*manual-tokens> -% \fi -% -% \begin{markdown} +##### \Hologo{ConTeXt} Example {.unnumbered} -#### Non-Breaking Space Renderer -The \mdef{markdownRendererNbsp} macro represents a non-breaking space. +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\setupmarkdown + [ + definitionLists = yes, + tightLists = yes, + ] +\starttext -% \end{markdown} -% -% \iffalse +\def\markdownRendererInterblockSeparator{% + :% + \def\markdownRendererInterblockSeparator{\par}% +} +\def\markdownRendererDlBeginTight{} +\def\markdownRendererDlItem#1{% + \par{\bf#1}% + \startitemize + \def\markdownRendererDlDefinitionEnd{% + , + \def\markdownRendererDlDefinitionEnd{% + , and + \def\markdownRendererDlDefinitionEnd{.}% + }% + }% +} +\def\markdownRendererDlItemEnd{\stopitemize} +\def\markdownRendererDlDefinitionBegin{\item} +\def\markdownRendererDlEndTight{} -##### \LaTeX{} Example {.unnumbered} +\startmarkdown +This is a tight definition list -Using a text editor, create a text document named `document.bib` with the -following content: -``` bib -@book{knuth:tex, - author = "Knuth, Donald Ervin", - title = "The \TeX book, volume A of Computers and typesetting", - publisher = "Addison-Wesley", - year = "1984" +Coffee +: black hot drink +: prepared from roasted coffee beans +: one of the most traded agricultural commodities in the world + +Milk +: white cold drink +: nutrient-rich +: produced on an industrial scale +\stopmarkdown + +\def\markdownRendererInterblockSeparator{% + \def\markdownRendererInterblockSeparator{\par}% } -``````` -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[ - citations, - citationNbsps, -]{markdown} -\markdownSetup{ - renderers = { - nbsp = {$\cdot$}, - }, +\def\markdownRendererDlBegin{} +\def\markdownRendererDlItem#1{% + . #1 is a + \def\markdownRendererDlDefinitionBegin{% + \def\markdownRendererDlDefinitionBegin{% + , + \def\markdownRendererDlDefinitionBegin{, and }% + }% + }% } -\begin{document} +\def\markdownRendererDlItemEnd{} +\def\markdownRendererDlDefinitionEnd{} +\def\markdownRendererDlEnd{.} -\begin{markdown} -The TeXbook [@knuth:tex, p. 123 and 130] is good. -\end{markdown} +\startmarkdown +This is a loose definition list -\bibliographystyle{plain} -\bibliography{document.bib} +Coffee -\end{document} +: black hot drink + +: prepared from roasted coffee beans + +: one of the most traded agricultural commodities in the world + +Milk + +: white cold drink + +: nutrient-rich + +: produced on an industrial scale +\stopmarkdown + +\stoptext ``````` -Next, invoke LuaTeX and BibTeX from the terminal: +Next, invoke LuaTeX from the terminal: ``` sh -lualatex document.tex -bibtex document.aux -lualatex document.tex -lualatex document.tex +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> The TeXbook [1, p.·123·and·130] is good. +> This is a tight definition list: > -> ### References -> [1] Donald Ervin Knuth. _The TeXbook, volume A of Computers and typesetting._ -> Addison-Wesley, 1984. +> **Coffee** +> +> - black hot drink, +> - prepared from roasted coffee beans, and +> - one of the most traded agricultural commodities in the world. +> +> **Milk** +> +> - white cold drink, +> - nutrient-rich, and +> - produced on an industrial scale. +> +> This is a loose definition list. Coffee is a black hot drink, prepared from +> roasted coffee beans, and one of the most traded agricultural commodities in +> the world. Milk is a white cold drink, nutrient-rich, and produced on an +> industrial scale. % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererNbsp{% - \markdownRendererNbspPrototype}% +\def\markdownRendererDlEndTight{% + \markdownRendererDlEndTightPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { nbsp } + { dlEndTight } \prop_gput:Nnn \g_@@_renderer_arities_prop - { nbsp } + { dlEndTight } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -15362,10 +15141,10 @@ following text: % % \begin{markdown} -#### Note Renderer -The \mdef{markdownRendererNote} macro represents a note. This macro -will only be produced, when the \Opt{notes} option is enabled. The -macro receives a single argument that corresponds to the note text. +#### Ellipsis Renderer +The \mdef{markdownRendererEllipsis} macro replaces any occurance of ASCII +ellipses in the input text. This macro will only be produced, when the +\Opt{smartEllipses} option is enabled. The macro receives no arguments. % \end{markdown} % @@ -15377,14 +15156,10 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownOptionNotes{true} -\def\markdownRendererNote#1{ (and \lowercase{#1})} +\def\markdownOptionSmartEllipses{true} +\def\markdownRendererEllipsis{{\it SHAZAM}!} \markdownBegin -This is some text[^1] and this is some other text[^2]. - - [^1]: this is a note - - [^2]: this is some other note +The secret word is ... \markdownEnd \bye ``````` @@ -15395,8 +15170,7 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> This is some text (and this is a note) and this is some other -> text (and this is some other note). +> The secret word is *SHAZAM*! ##### \LaTeX{} Example {.unnumbered} @@ -15404,19 +15178,15 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[notes]{markdown} +\usepackage[smartEllipses]{markdown} \markdownSetup{ renderers = { - note = { (and \MakeLowercase{#1})}, + ellipsis = \emph{SHAZAM}!, }, } \begin{document} \begin{markdown} -This is some text[^1] and this is some other text[^2]. - - [^1]: this is a note - - [^2]: this is some other note +The secret word is ... \end{markdown} \end{document} ``````` @@ -15427,8 +15197,7 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> This is some text (and this is a note) and this is some other -> text (and this is some other note). +> The secret word is *SHAZAM*! ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -15436,83 +15205,42 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[notes = yes] -\def\markdownRendererNote#1{ (and \lowercase{#1})} +\setupmarkdown[smartEllipses = yes] +\def\markdownRendererEllipsis{\emph{SHAZAM}!} \starttext \startmarkdown -This is some text[^1] and this is some other text[^2]. - - [^1]: this is a note - - [^2]: this is some other note +The secret word is ... \stopmarkdown \stoptext ``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> This is some text (and this is a note) and this is some other -> text (and this is some other note). +> Hello *world*! +> +> *(The end of a block)* +> +> _Foo_ bar! % %<*tex> % \fi -% \begin{markdown} % -% The \mdef{markdownRendererFootnote} and -% \mdef{markdownRendererFootnotePrototype} macros have been deprecated -% and will be removed in Markdown 3.0.0. -% -% \end{markdown} % \begin{macrocode} +\def\markdownRendererEllipsis{% + \markdownRendererEllipsisPrototype}% \ExplSyntaxOn -\cs_new:Npn - \markdownRendererNote - { - \cs_if_exist:NTF - \markdownRendererFootnote - { - \markdownWarning - { - Footnote~renderer~has~been~deprecated,~ - to~be~removed~in~Markdown~3.0.0 - } - \markdownRendererFootnote - } - { - \cs_if_exist:NTF - \markdownRendererFootnotePrototype - { - \markdownWarning - { - Footnote~renderer~prototype~has~been~deprecated,~ - to~be~removed~in~Markdown~3.0.0 - } - \markdownRendererFootnotePrototype - } - { - \markdownRendererNotePrototype - } - } - } -\seq_gput_right:Nn - \g_@@_renderers_seq - { footnote } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { footnote } - { 1 } \seq_gput_right:Nn \g_@@_renderers_seq - { note } + { ellipsis } \prop_gput:Nnn \g_@@_renderer_arities_prop - { note } - { 1 } + { ellipsis } + { 0 } \ExplSyntaxOff % \end{macrocode} % \par @@ -15524,11 +15252,10 @@ following text: % % \begin{markdown} -#### Ordered List Renderers -The \mdef{markdownRendererOlBegin} macro represents the beginning of an -ordered list that contains an item with several paragraphs of text (the -list is not tight). This macro will only be produced, when the \Opt{fancyLists} -option is disabled. The macro receives no arguments. +#### Emphasis Renderers +The \mdef{markdownRendererEmphasis} macro represents an emphasized span of +text. The macro receives a single argument that corresponds to the emphasized +span of text. % \end{markdown} % @@ -15538,16 +15265,16 @@ option is disabled. The macro receives no arguments. % \fi % % \begin{macrocode} -\def\markdownRendererOlBegin{% - \markdownRendererOlBeginPrototype}% +\def\markdownRendererEmphasis{% + \markdownRendererEmphasisPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { olBegin } + { emphasis } \prop_gput:Nnn \g_@@_renderer_arities_prop - { olBegin } - { 0 } + { emphasis } + { 1 } \ExplSyntaxOff % \end{macrocode} % \par @@ -15559,30 +15286,114 @@ option is disabled. The macro receives no arguments. % % \begin{markdown} -The \mdef{markdownRendererOlBeginTight} macro represents the beginning of an -ordered list that contains no item with several paragraphs of text (the -list is tight). This macro will only be produced, when the \Opt{tightLists} -option is enabled and the \Opt{fancyLists} option is disabled. The macro -receives no arguments. +The \mdef{markdownRendererStrongEmphasis} macro represents a strongly +emphasized span of text. The macro receives a single argument that +corresponds to the emphasized span of text. % \end{markdown} % % \iffalse + +##### Plain \TeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\def\markdownRendererEmphasis#1{{\it#1}} +\def\markdownRendererStrongEmphasis#1{{\bf#1}} +\markdownBegin +This is *emphasis*. + +This is **strong emphasis**. +\markdownEnd +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> This is *emphasis*. +> +> This is **strong emphasis**. + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage{markdown} +\markdownSetup{ + renderers = { + emphasis = {\emph{#1}}, + strongEmphasis = {\textbf{#1}}, + }, +} +\begin{document} +\begin{markdown} +This is *emphasis*. + +This is **strong emphasis**. +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> This is *emphasis*. +> +> This is **strong emphasis**. + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\def\markdownRendererEmphasis#1{\emph{#1}} +\def\markdownRendererStrongEmphasis#1{\bold{#1}} +\starttext +\startmarkdown +This is *emphasis*. + +This is **strong emphasis**. +\stopmarkdown +\stoptext +``````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> This is *emphasis*. +> +> This is **strong emphasis**. + % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererOlBeginTight{% - \markdownRendererOlBeginTightPrototype}% +\def\markdownRendererStrongEmphasis{% + \markdownRendererStrongEmphasisPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { olBeginTight } + { strongEmphasis } \prop_gput:Nnn \g_@@_renderer_arities_prop - { olBeginTight } - { 0 } + { strongEmphasis } + { 1 } \ExplSyntaxOff % \end{macrocode} % \par @@ -15594,69 +15405,94 @@ receives no arguments. % % \begin{markdown} -The \mdef{markdownRendererFancyOlBegin} macro represents the beginning of a -fancy ordered list that contains an item with several paragraphs of text (the -list is not tight). This macro will only be produced, when the \Opt{fancyLists} -option is enabled. The macro receives two arguments: the style of the list item -labels (`Decimal`, `LowerRoman`, `UpperRoman`, `LowerAlpha`, and `UpperAlpha`), -and the style of delimiters between list item labels and texts (`Default`, -`OneParen`, and `Period`). +#### Fenced Code Attribute Context Renderers +The following macros are only produced, when the \Opt{fencedCode} option is +enabled. + +The \mdef{markdownRendererFencedCodeAttributeContextBegin} and +\mdef{markdownRendererFencedCodeAttributeContextEnd} macros represent the +beginning and the end of a context in which the attributes of a fenced code +apply. The macros receive no arguments. % \end{markdown} % % \iffalse + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +```` tex +\documentclass{article} +\usepackage[fencedCode, + fencedCodeAttributes]{markdown} +\usepackage{minted} +\markdownSetup{ + renderers = { + fencedCodeAttributeContextBegin = {% + \begingroup + \markdownSetup{ + renderers = { + attributeKeyValue = {% + \setminted{{#1} = {#2}}% + }, + }, + }% + }, + fencedCodeAttributeContextEnd = {% + \endgroup + }, + }, +} +\begin{document} +\begin{markdown} +~~~ js {linenos=true} +if (a > 3) { + moveShip(5 * gravity, DOWN); +} +~~~~~~ +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex --shell-escape document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> ``` js {.linenos} +> 1. if (a > 3) { +> 2. moveShip(5 * gravity, DOWN); +> 3. } +> `````` + % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererFancyOlBegin{% - \markdownRendererFancyOlBeginPrototype}% +\def\markdownRendererFencedCodeAttributeContextBegin{% + \markdownRendererFencedCodeAttributeContextBeginPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { fancyOlBegin } + { fencedCodeAttributeContextBegin } \prop_gput:Nnn \g_@@_renderer_arities_prop - { fancyOlBegin } - { 2 } + { fencedCodeAttributeContextBegin } + { 0 } \ExplSyntaxOff -% \end{macrocode} -% \par -% -% \iffalse -% -%<*manual-tokens> -% \fi -% -% \begin{markdown} - -The \mdef{markdownRendererFancyOlBeginTight} macro represents the beginning of -a fancy ordered list that contains no item with several paragraphs of text (the -list is tight). This macro will only be produced, when the \Opt{fancyLists} -and \Opt{tightLists} options are enabled. The macro receives two arguments: the -style of the list item labels, and the style of delimiters between list -item labels and texts. See the \mref{markdownRendererFancyOlBegin} macro for -the valid style values. - -% \end{markdown} -% -% \iffalse -% -%<*tex> -% \fi -% -% \begin{macrocode} -\def\markdownRendererFancyOlBeginTight{% - \markdownRendererFancyOlBeginTightPrototype}% +\def\markdownRendererFencedCodeAttributeContextEnd{% + \markdownRendererFencedCodeAttributeContextEndPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { fancyOlBeginTight } + { fencedCodeAttributeContextEnd } \prop_gput:Nnn \g_@@_renderer_arities_prop - { fancyOlBeginTight } - { 2 } + { fencedCodeAttributeContextEnd } + { 0 } \ExplSyntaxOff % \end{macrocode} % \par @@ -15668,28 +15504,114 @@ the valid style values. % % \begin{markdown} -The \mdef{markdownRendererOlItem} macro represents an item in an ordered list. -This macro will only be produced, when the \Opt{startNumber} option is -disabled and the \Opt{fancyLists} option is disabled. The macro receives no -arguments. +#### Fenced Div Attribute Context Renderers +The following macros are only produced, when the \Opt{fencedDiv} option is +enabled. + +The \mdef{markdownRendererFencedDivAttributeContextBegin} and +\mdef{markdownRendererFencedDivAttributeContextEnd} macros represent the beginning +and the end of a context in which the attributes of a div apply. The macros +receive no arguments. % \end{markdown} % % \iffalse -% -%<*tex> -% \fi -% -% \begin{macrocode} -\def\markdownRendererOlItem{% - \markdownRendererOlItemPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { olItem } -\prop_gput:Nnn + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[fencedDivs]{markdown} +\markdownSetup{ + renderers = { + fencedDivAttributeContextBegin = {% + \par + \emph{(The beginning of a fenced div attribute context)} + \par + }, + fencedDivAttributeContextEnd = {% + \par + \emph{(The end of a fenced div attribute context)} + \par + }, + }, +} +\begin{document} +\begin{markdown} + +::: {key=value} + +foo + +:::: {#identifier} + +bar + +:::: + +::: + +::: {.class_name} + +baz + +::: + +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> *(The beginning of a fenced div attribute context)* +> +> foo +> +> *(The beginning of a fenced div attribute context)* +> +> bar +> +> *(The end of a fenced div attribute context)* +> +> *(The end of a fenced div attribute context)* +> +> *(The beginning of a fenced div attribute context)* +> +> baz +> +> *(The end of a fenced div attribute context)* + +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererFencedDivAttributeContextBegin{% + \markdownRendererFencedDivAttributeContextBeginPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { fencedDivAttributeContextBegin } +\prop_gput:Nnn \g_@@_renderer_arities_prop - { olItem } + { fencedDivAttributeContextBegin } + { 0 } +\ExplSyntaxOff +\def\markdownRendererFencedDivAttributeContextEnd{% + \markdownRendererFencedDivAttributeContextEndPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { fencedDivAttributeContextEnd } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { fencedDivAttributeContextEnd } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -15702,27 +15624,97 @@ arguments. % % \begin{markdown} -The \mdef{markdownRendererOlItemEnd} macro represents the end of an item in -an ordered list. This macro will only be produced, when the \Opt{fancyLists} -option is disabled. The macro receives no arguments. +#### Header Attribute Context Renderers +The following macros are only produced, when the \Opt{autoIdentifiers}, +\Opt{gfmAutoIdentifiers}, or \Opt{headerAttributes} options are enabled. + +The \mdef{markdownRendererHeaderAttributeContextBegin} and +\mdef{markdownRendererHeaderAttributeContextEnd} macros represent the beginning +and the end of a context in which the attributes of a heading apply. The macros +receive no arguments. % \end{markdown} % % \iffalse + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[headerAttributes]{markdown} +\markdownSetup{ + renderers = { + headerAttributeContextBegin = {% + \par + \emph{(The beginning of a header attribute context)} + \par + }, + headerAttributeContextEnd = {% + \par + \emph{(The end of a header attribute context)} + \par + }, + }, +} +\begin{document} +\begin{markdown} + +# First top-level heading + +## A subheading {#identifier} + +# Second top-level heading {.class_name} + +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> # First top-level heading +> +> *(The beginning of a header attribute context)* +> +> ## A subheading +> +> *(The end of a header attribute context)* +> +> *(The beginning of a header attribute context)* +> +> # Second top-level heading +> +> *(The end of a header attribute context)* + % %<*tex> % \fi -% % \begin{macrocode} -\def\markdownRendererOlItemEnd{% - \markdownRendererOlItemEndPrototype}% +\def\markdownRendererHeaderAttributeContextBegin{% + \markdownRendererHeaderAttributeContextBeginPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { olItemEnd } + { headerAttributeContextBegin } \prop_gput:Nnn \g_@@_renderer_arities_prop - { olItemEnd } + { headerAttributeContextBegin } + { 0 } +\ExplSyntaxOff +\def\markdownRendererHeaderAttributeContextEnd{% + \markdownRendererHeaderAttributeContextEndPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { headerAttributeContextEnd } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { headerAttributeContextEnd } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -15735,10 +15727,9 @@ option is disabled. The macro receives no arguments. % % \begin{markdown} -The \mdef{markdownRendererOlItemWithNumber} macro represents an item in an -ordered list. This macro will only be produced, when the \Opt{startNumber} -option is enabled and the \Opt{fancyLists} option is disabled. The macro -receives a single numeric argument that corresponds to the item number. +#### Heading Renderers +The \mdef{markdownRendererHeadingOne} macro represents a first level heading. +The macro receives a single argument that corresponds to the heading text. % \end{markdown} % @@ -15748,15 +15739,15 @@ receives a single numeric argument that corresponds to the item number. % \fi % % \begin{macrocode} -\def\markdownRendererOlItemWithNumber{% - \markdownRendererOlItemWithNumberPrototype}% +\def\markdownRendererHeadingOne{% + \markdownRendererHeadingOnePrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { olItemWithNumber } + { headingOne } \prop_gput:Nnn \g_@@_renderer_arities_prop - { olItemWithNumber } + { headingOne } { 1 } \ExplSyntaxOff % \end{macrocode} @@ -15769,10 +15760,9 @@ receives a single numeric argument that corresponds to the item number. % % \begin{markdown} -The \mdef{markdownRendererFancyOlItem} macro represents an item in a fancy -ordered list. This macro will only be produced, when the \Opt{startNumber} -option is disabled and the \Opt{fancyLists} option is enabled. The macro receives -no arguments. +The \mdef{markdownRendererHeadingTwo} macro represents a second level +heading. The macro receives a single argument that corresponds to the heading +text. % \end{markdown} % @@ -15782,16 +15772,16 @@ no arguments. % \fi % % \begin{macrocode} -\def\markdownRendererFancyOlItem{% - \markdownRendererFancyOlItemPrototype}% +\def\markdownRendererHeadingTwo{% + \markdownRendererHeadingTwoPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { fancyOlItem } + { headingTwo } \prop_gput:Nnn \g_@@_renderer_arities_prop - { fancyOlItem } - { 0 } + { headingTwo } + { 1 } \ExplSyntaxOff % \end{macrocode} % \par @@ -15803,9 +15793,9 @@ no arguments. % % \begin{markdown} -The \mdef{markdownRendererFancyOlItemEnd} macro represents the end of an item in -a fancy ordered list. This macro will only be produced, when the \Opt{fancyLists} -option is enabled. The macro receives no arguments. +The \mdef{markdownRendererHeadingThree} macro represents a third level +heading. The macro receives a single argument that corresponds to the heading +text. % \end{markdown} % @@ -15815,16 +15805,16 @@ option is enabled. The macro receives no arguments. % \fi % % \begin{macrocode} -\def\markdownRendererFancyOlItemEnd{% - \markdownRendererFancyOlItemEndPrototype}% +\def\markdownRendererHeadingThree{% + \markdownRendererHeadingThreePrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { fancyOlItemEnd } + { headingThree } \prop_gput:Nnn \g_@@_renderer_arities_prop - { fancyOlItemEnd } - { 0 } + { headingThree } + { 1 } \ExplSyntaxOff % \end{macrocode} % \par @@ -15836,10 +15826,9 @@ option is enabled. The macro receives no arguments. % % \begin{markdown} -The \mdef{markdownRendererFancyOlItemWithNumber} macro represents an item in a -fancy ordered list. This macro will only be produced, when the \Opt{startNumber} -and \Opt{fancyLists} options are enabled. The macro receives a single numeric -argument that corresponds to the item number. +The \mdef{markdownRendererHeadingFour} macro represents a fourth level +heading. The macro receives a single argument that corresponds to the heading +text. % \end{markdown} % @@ -15849,15 +15838,15 @@ argument that corresponds to the item number. % \fi % % \begin{macrocode} -\def\markdownRendererFancyOlItemWithNumber{% - \markdownRendererFancyOlItemWithNumberPrototype}% +\def\markdownRendererHeadingFour{% + \markdownRendererHeadingFourPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { fancyOlItemWithNumber } + { headingFour } \prop_gput:Nnn \g_@@_renderer_arities_prop - { fancyOlItemWithNumber } + { headingFour } { 1 } \ExplSyntaxOff % \end{macrocode} @@ -15870,10 +15859,9 @@ argument that corresponds to the item number. % % \begin{markdown} -The \mdef{markdownRendererOlEnd} macro represents the end of an ordered list -that contains an item with several paragraphs of text (the list is not -tight). This macro will only be produced, when the \Opt{fancyLists} option is -disabled. The macro receives no arguments. +The \mdef{markdownRendererHeadingFive} macro represents a fifth level +heading. The macro receives a single argument that corresponds to the heading +text. % \end{markdown} % @@ -15883,16 +15871,16 @@ disabled. The macro receives no arguments. % \fi % % \begin{macrocode} -\def\markdownRendererOlEnd{% - \markdownRendererOlEndPrototype}% +\def\markdownRendererHeadingFive{% + \markdownRendererHeadingFivePrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { olEnd } + { headingFive } \prop_gput:Nnn \g_@@_renderer_arities_prop - { olEnd } - { 0 } + { headingFive } + { 1 } \ExplSyntaxOff % \end{macrocode} % \par @@ -15904,30 +15892,129 @@ disabled. The macro receives no arguments. % % \begin{markdown} -The \mdef{markdownRendererOlEndTight} macro represents the end of an ordered -list that contains no item with several paragraphs of text (the list is -tight). This macro will only be produced, when the \Opt{tightLists} option is -enabled and the \Opt{fancyLists} option is disabled. The macro receives no -arguments. +The \mdef{markdownRendererHeadingSix} macro represents a sixth level +heading. The macro receives a single argument that corresponds to the heading +text. % \end{markdown} % % \iffalse + +##### Plain \TeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\def\markdownRendererInterblockSeparator{} +\def\markdownRendererHeadingOne{1} +\def\markdownRendererHeadingTwo{2} +\def\markdownRendererHeadingThree{3} +\def\markdownRendererHeadingFour{4} +\def\markdownRendererHeadingFive{5} +\def\markdownRendererHeadingSix{6} +\markdownBegin +###### +##### +##### +### +###### +\markdownEnd +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> 65536 + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage{markdown} +\markdownSetup{ + renderers = { + interblockSeparator = {}, + headingOne = 1, + headingTwo = 2, + headingThree = 3, + headingFour = 4, + headingFive = 5, + headingSix = 6, + }, +} +\begin{document} +\begin{markdown} +###### +##### +##### +### +###### +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> 65536 + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\def\markdownRendererInterblockSeparator{} +\def\markdownRendererHeadingOne{1} +\def\markdownRendererHeadingTwo{2} +\def\markdownRendererHeadingThree{3} +\def\markdownRendererHeadingFour{4} +\def\markdownRendererHeadingFive{5} +\def\markdownRendererHeadingSix{6} +\starttext +\startmarkdown +###### +##### +##### +### +###### +\stopmarkdown +\stoptext +``````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> 65536 + % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererOlEndTight{% - \markdownRendererOlEndTightPrototype}% +\def\markdownRendererHeadingSix{% + \markdownRendererHeadingSixPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { olEndTight } + { headingSix } \prop_gput:Nnn \g_@@_renderer_arities_prop - { olEndTight } - { 0 } + { headingSix } + { 1 } \ExplSyntaxOff % \end{macrocode} % \par @@ -15939,29 +16026,68 @@ arguments. % % \begin{markdown} -The \mdef{markdownRendererFancyOlEnd} macro represents the end of a fancy -ordered list that contains an item with several paragraphs of text (the list -is not tight). This macro will only be produced, when the \Opt{fancyLists} -option is enabled. The macro receives no arguments. +#### Inline HTML Comment Renderer + +The \mdef{markdownRendererInlineHtmlComment} macro represents the contents of an +inline \acro{HTML} comment. This macro will only be produced, when the +\Opt{html} option is enabled. The macro receives a single argument that +corresponds to the contents of the \acro{HTML} comment. % \end{markdown} % % \iffalse + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[html]{markdown} +\usepackage{marginnote} +\markdownSetup{ + renderers = { + inlineHtmlComment = {\marginnote{#1}}, + }, +} +\begin{document} +\begin{markdown} +A useful use of inline HTML comments are side notes. + +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following body text: + +> A useful use of HTML comments are side notes. + +The horizontal margins should contain the following text: + +> Side notes are displayed in the horizontal margins next to the relevant +> passages, which makes them *easier for the reader to find* than notes. + % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererFancyOlEnd{% - \markdownRendererFancyOlEndPrototype}% +\def\markdownRendererInlineHtmlComment{% + \markdownRendererInlineHtmlCommentPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { fancyOlEnd } + { inlineHtmlComment } \prop_gput:Nnn \g_@@_renderer_arities_prop - { fancyOlEnd } - { 0 } + { inlineHtmlComment } + { 1 } \ExplSyntaxOff % \end{macrocode} % \par @@ -15973,286 +16099,83 @@ option is enabled. The macro receives no arguments. % % \begin{markdown} -The \mdef{markdownRendererFancyOlEndTight} macro represents the end of a -fancy ordered list that contains no item with several paragraphs of text (the -list is tight). This macro will only be produced, when the \Opt{fancyLists} -and \Opt{tightLists} options are enabled. The macro receives no arguments. +#### HTML Tag and Element Renderers + +The \mdef{markdownRendererInlineHtmlTag} macro represents an opening, closing, +or empty inline \acro{HTML} tag. This macro will only be produced, when the +\Opt{html} option is enabled. The macro receives a single argument that +corresponds to the contents of the \acro{HTML} tag. + +The \mdef{markdownRendererInputBlockHtmlElement} macro represents a block +\acro{HTML} element. This macro will only be produced, when the \Opt{html} +option is enabled. The macro receives a single argument that filename of a file +containing the contents of the \acro{HTML} element. % \end{markdown} % % \iffalse -##### Plain \TeX{} Example {.unnumbered} +##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex -\input markdown -\def\markdownOptionTightLists{true} -\def\markdownOptionStartNumber{true} - -\def\markdownRendererInterblockSeparator{} -\def\markdownRendererOlBeginTight{ (} -\def\markdownRendererOlItemWithNumber#1{% - \ifnum #1=1\relax - the first - \else - \ifnum #1=2\relax - , the second - \else - , and the third - \fi - \fi +\documentclass{article} +\usepackage[html]{markdown} +\usepackage{marginnote} +\usepackage{verbatim} +\markdownSetup{ + renderers = { + inlineHtmlTag = {\textbf{#1}}, + inputBlockHtmlElement = {\verbatiminput{#1}}, + }, } -\def\markdownRendererOlItemEnd{} -\def\markdownRendererOlEndTight{).} +\begin{document} +\begin{markdown} +_Hello,_ world!
-\markdownBegin -This is a tight list +
_Hello,_ world!
+\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following body text: -1. item -2. item -3. item -\markdownEnd - -\def\markdownRendererInterblockSeparator{% - :\par - \def\markdownRendererInterblockSeparator{\par}% -} -\def\markdownRendererOlBegin{} -\def\markdownRendererOlItemWithNumber#1{% - #1.\kern 0.5em% - This is the - \ifnum #1=1\relax - first - \else - \ifnum #1=2\relax - second - \else - third - \fi - \fi -} -\def\markdownRendererOlItemEnd{.\par} -\def\markdownRendererOlEnd{} - -\markdownBegin -This is a loose list - -1. item - -2. item - -3. item -\markdownEnd - -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> This is a tight list (the first item, the second item, and the third item). -> -> This is a loose list: -> -> 1. This is the first item. -> -> 2. This is the second item. -> -> 3. This is the third item. - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[tightLists, startNumber]{markdown} -\begin{document} - -\begin{markdown*}{ - renderers = { - interblockSeparator = {}, - olBeginTight = { (}, - olItemWithNumber = {% - \ifnum #1=1\relax - the first - \else - \ifnum #1=2\relax - , the second - \else - , and the third - \fi - \fi - }, - olItemEnd = {}, - olEndTight = {).}, - }, -} -This is a tight list - -1. item -2. item -3. item -\end{markdown*} - -\begin{markdown*}{ - renderers = { - interblockSeparator = {% - :\par - \def\markdownRendererInterblockSeparator{\par}% - }, - olBeginTight = {\begin{enumerate}}, - olItemWithNumber = {% - \item This is the - \ifnum #1=1\relax - first - \else - \ifnum #1=2\relax - second - \else - third - \fi - \fi - }, - olItemEnd = {.}, - olEnd = {\end{enumerate}}, - }, -} -This is a loose list - -1. item - -2. item - -3. item -\end{markdown*} - -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> This is a tight list (the first item, the second item, and the third item). -> -> This is a loose list: -> -> 1. This is the first item. -> -> 2. This is the second item. -> -> 3. This is the third item. - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\setupmarkdown - [ - tightLists = yes, - startNumber = yes, - ] -\starttext - -\def\markdownRendererInterblockSeparator{} -\def\markdownRendererOlBeginTight{ (} -\def\markdownRendererOlItemWithNumber#1{% - \ifnum #1=1\relax - the first - \else - \ifnum #1=2\relax - , the second - \else - , and the third - \fi - \fi -} -\def\markdownRendererOlItemEnd{} -\def\markdownRendererOlEndTight{).} - -\startmarkdown -This is a tight list - -1. item -2. item -3. item -\stopmarkdown - -\def\markdownRendererInterblockSeparator{% - :\par - \def\markdownRendererInterblockSeparator{\par}% -} -\def\markdownRendererOlBegin{\startitemize} -\def\markdownRendererOlItemWithNumber#1{% - \sym{#1.} - This is the - \ifnum #1=1\relax - first - \else - \ifnum #1=2\relax - second - \else - third - \fi - \fi -} -\def\markdownRendererOlItemEnd{.\par} -\def\markdownRendererOlEnd{\stopitemize} - -\startmarkdown -This is a loose list - -1. item - -2. item - -3. item -\stopmarkdown - -\stoptext -``````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> This is a tight list (the first item, the second item, and the third item). -> -> This is a loose list: -> -> 1. This is the first item. -> -> 2. This is the second item. -> -> 3. This is the third item. +> ****_Hello,_ world!**
** +> +>
_Hello,_ world!
% %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererFancyOlEndTight{% - \markdownRendererFancyOlEndTightPrototype}% +\def\markdownRendererInlineHtmlTag{% + \markdownRendererInlineHtmlTagPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { fancyOlEndTight } + { inlineHtmlTag } \prop_gput:Nnn \g_@@_renderer_arities_prop - { fancyOlEndTight } - { 0 } + { inlineHtmlTag } + { 1 } +\ExplSyntaxOff +\def\markdownRendererInputBlockHtmlElement{% + \markdownRendererInputBlockHtmlElementPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { inputBlockHtmlElement } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { inputBlockHtmlElement } + { 1 } \ExplSyntaxOff % \end{macrocode} % \par @@ -16264,15 +16187,11 @@ following text: % % \begin{markdown} -#### Parenthesized Citations Renderer -The \mdef{markdownRendererCite} macro represents a string of one or more -parenthetical citations. This macro will only be produced, when the -\Opt{citations} option is enabled. The macro receives the parameter -`{`\meta{number of citations}`}` followed by \meta{suppress author} -`{`\meta{prenote}`}{`\meta{postnote}`}{`\meta{name}`}` repeated -\meta{number of citations} times. The \meta{suppress author} parameter is -either the token `-`, when the author's name is to be suppressed, or `+` -otherwise. +#### Image Renderer +The \mdef{markdownRendererImage} macro represents an image. It receives +four arguments: the label, the fully escaped \acro{uri} that can be directly +typeset, the raw \acro{uri} that can be used outside typesetting, and the +title of the link. % \end{markdown} % @@ -16284,72 +16203,69 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[citations]{markdown} -\newcount\citationsCounter -\newcount\citationsTotal -\makeatletter -\def\citations#1#2#3#4{% - a parenthesized citation \emph{#4} - \advance\citationsCounter by 1\relax - \ifx\relax#2\relax - \ifx\relax#3\relax\else - with a postfix \emph{#3}% - \fi - \else - with a prefix \emph{#2}% - \ifx\relax#3\relax\else - \ and a postfix \emph{#3}% - \fi - \fi - \ifnum\citationsCounter>\citationsTotal\relax - .% - \expandafter\@gobble - \else - , and - \fi\citations} -\makeatother -\markdownSetup{ - renderers = { - cite = {% - \citationsCounter=1% - \citationsTotal=#1% - This is - \expandafter\citations - }, - }, +\usepackage{markdown} +\begingroup +\catcode`\@=11 +\catcode`\%=12 +\catcode`\^^A=14 +\global\def\markdownRendererImage#1#2#3#4{^^A + \immediate\write18{^^A +``` +``` sh + if printf '%s' "#3" | grep -q ^http; then + OUTPUT="$(printf '%s' "#3" | md5sum | cut -d' ' -f1).^^A + $(printf '%s' "#3" | sed 's/.*[.]//')"; + if ! [ -e "$OUTPUT" ]; then + wget -O "$OUTPUT" '#3' || rm "$OUTPUT"; + convert "$OUTPUT" png:"$OUTPUT"; + fi; + printf '%s%%' "$OUTPUT" > \jobname.fetched; + else + printf '%s%%' "#3" > \jobname.fetched; + fi^^A +``` +``` tex + }^^A + {^^A + \everyeof={\noexpand}^^A + \edef\filename{\@@@@input"\jobname.fetched" }^^A + \includegraphics[width=\textwidth]{\filename}^^A + }^^A } +\endgroup \begin{document} \begin{markdown} -[see @abrahams90, pp. 12; @eijkhout91, pp. 34] +![TUGboat](https://tug.org/tugboat/noword.jpg) \end{markdown} \end{document} -``````` +`````` Next, invoke LuaTeX from the terminal: ``` sh -lualatex document.tex +lualatex --shell-escape document.tex `````` A PDF document named `document.pdf` should be produced and contain the -following text: +following content. This assumes that you use a Unix-like operating system with +Bourne or Bourne again shell as the default shell of the current user. It also +assumes that the `md5sum`, `wget`, and `convert` binaries are installed and +that the \TeX{} engine has shell access. -> This is a parenthesized citation *abrahams90* with a prefix see -> and a postfix *pp. 12*, and a citation *eijkhout91* with a -> postfix *pp. 34*. +> ![TUGboat](https://tug.org/tugboat/noword.jpg "The Communications of the TeX Users Group") % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererCite{% - \markdownRendererCitePrototype}% +\def\markdownRendererImage{% + \markdownRendererImagePrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { cite } + { image } \prop_gput:Nnn \g_@@_renderer_arities_prop - { cite } - { 1 } + { image } + { 4 } \ExplSyntaxOff % \end{macrocode} % \par @@ -16361,31 +16277,76 @@ following text: % % \begin{markdown} -#### Raw Content Renderers -The \mdef{markdownRendererInputRawInline} macro represents an inline raw span. -The macro receives two arguments: the filename of a file contaning the inline -raw span contents and the raw attribute that designates the format of the -inline raw span. This macro will only be produced, when the \Opt{rawAttribute} -option is enabled. +#### Image Attribute Context Renderers +The following macros are only produced, when the \Opt{linkAttributes} option +is enabled. + +The \mdef{markdownRendererImageAttributeContextBegin} and +\mdef{markdownRendererImageAttributeContextEnd} macros represent the beginning +and the end of a context in which the attributes of an image apply. The macros +receive no arguments. % \end{markdown} % % \iffalse + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[linkAttributes]{markdown} +\markdownSetup{ + renderers = { + imageAttributeContextBegin = {(}, + image = {#1}, + imageAttributeContextEnd = {)}, + }, +} +\begin{document} +\begin{markdown} + +foo ![bar](#bar){key=value} baz + +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> foo (bar) baz + % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererInputRawInline{% - \markdownRendererInputRawInlinePrototype}% +\def\markdownRendererImageAttributeContextBegin{% + \markdownRendererImageAttributeContextBeginPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { inputRawInline } + { imageAttributeContextBegin } \prop_gput:Nnn \g_@@_renderer_arities_prop - { inputRawInline } - { 2 } + { imageAttributeContextBegin } + { 0 } +\ExplSyntaxOff +\def\markdownRendererImageAttributeContextEnd{% + \markdownRendererImageAttributeContextEndPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { imageAttributeContextEnd } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { imageAttributeContextEnd } + { 0 } \ExplSyntaxOff % \end{macrocode} % \par @@ -16397,53 +16358,70 @@ option is enabled. % % \begin{markdown} -The \mdef{markdownRendererInputRawBlock} macro represents a raw block. The -macro receives two arguments: the filename of a file contaning the raw block -and the raw attribute that designates the format of the raw block. This macro -will only be produced, when the \Opt{rawAttribute} and \Opt{fencedCode} options -are enabled. +#### Interblock Separator Renderers +The \mdef{markdownRendererInterblockSeparator} macro represents an interblock +separator between two markdown block elements. The macro receives no +arguments. % \end{markdown} % % \iffalse +##### Plain \TeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\def\markdownRendererInterblockSeparator{% + \par + {\it(The end of a block)}% + \par +} +\markdownBegin +- Hello *world*! + +_Foo_ bar! +\markdownEnd +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> - Hello *world*! +> +> *(The end of a block)* +> +> _Foo_ bar! + ##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: -```` tex +``` tex \documentclass{article} -\usepackage[rawAttribute, fencedCode]{markdown} -\usepackage{expl3} -\ExplSyntaxOn -\cs_new:Nn - \display_raw_content:nn - { - % If the raw attribute is TeX, execute the content as a TeX document. - \str_if_eq:nnTF - { #2 } - { tex } - { \markdownEscape { #1 } } - % Otherwise, ignore the content. - { } - } +\usepackage{markdown} \markdownSetup{ renderers = { - rawInline = { \display_raw_content:nn { #1 } { #2 } }, - rawBlock = { \display_raw_content:nn { #1 } { #2 } } + interblockSeparator = {% + \par + \emph{(The end of a block)}% + \par + }, }, } -\ExplSyntaxOff \begin{document} \begin{markdown} -`$H_2 O$`{=tex} is a liquid. +- Hello *world*! -``` {=html} -

Here is some HTML content that will be ignored.

-``` +_Foo_ bar! \end{markdown} \end{document} -```` +``````` Next, invoke LuaTeX from the terminal: ``` sh lualatex document.tex @@ -16451,23 +16429,59 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> H~2~O is a liquid. +> - Hello *world*! +> +> *(The end of a block)* +> +> _Foo_ bar! + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\def\markdownRendererInterblockSeparator{% + \par + \emph{(The end of a block)}% + \par +} +\starttext +\startmarkdown +- Hello *world*! + +_Foo_ bar! +\stopmarkdown +\stoptext +``````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> - Hello *world*! +> +> *(The end of a block)* +> +> _Foo_ bar! % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererInputRawBlock{% - \markdownRendererInputRawBlockPrototype}% +\def\markdownRendererInterblockSeparator{% + \markdownRendererInterblockSeparatorPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { inputRawBlock } + { interblockSeparator } \prop_gput:Nnn \g_@@_renderer_arities_prop - { inputRawBlock } - { 2 } + { interblockSeparator } + { 0 } \ExplSyntaxOff % \end{macrocode} % \par @@ -16479,71 +16493,69 @@ following text: % % \begin{markdown} -#### Section Renderers -The \mdef{markdownRendererSectionBegin} and \mdef{markdownRendererSectionEnd} -macros represent the beginning and the end of a section based on headings. +Users can use more than one blank line to delimit two block to indicate the +end of a series of blocks that make up a logical paragraph. This produces a +paragraph separator instead of an interblock separator. Between some blocks, +such as markdown paragraphs, a paragraph separator is always produced. + +The \mdef{markdownRendererParagraphSeparator} macro represents a paragraph +separator. The macro receives no arguments. % \end{markdown} % % \iffalse -% -%<*tex> -% \fi -% -% \begin{macrocode} -\def\markdownRendererSectionBegin{% - \markdownRendererSectionBeginPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { sectionBegin } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { sectionBegin } - { 0 } -\ExplSyntaxOff -\def\markdownRendererSectionEnd{% - \markdownRendererSectionEndPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { sectionEnd } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { sectionEnd } - { 0 } -\ExplSyntaxOff -% \end{macrocode} -% \par -% -% \iffalse -% -%<*manual-tokens> -% \fi -% -% \begin{markdown} -#### Replacement Character Renderers -The \mdef{markdownRendererReplacementCharacter} macro represents the U+0000 -and U+FFFD Unicode characters. The macro receives no arguments. +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage{markdown} +\markdownSetup{ + renderers = { + paragraphSeparator = {% + \par + \emph{(The end of a paragraph)}% + \par + }, + }, +} +\begin{document} +\begin{markdown} +Hello *world*! + +_Foo_ bar! +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> Hello *world*! +> +> *(The end of a paragraph)* +> +> _Foo_ bar! -% \end{markdown} -% -% \iffalse % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererReplacementCharacter{% - \markdownRendererReplacementCharacterPrototype}% +\def\markdownRendererParagraphSeparator{% + \markdownRendererParagraphSeparatorPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { replacementCharacter } + { paragraphSeparator } \prop_gput:Nnn \g_@@_renderer_arities_prop - { replacementCharacter } + { paragraphSeparator } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -16556,27 +16568,12 @@ and U+FFFD Unicode characters. The macro receives no arguments. % % \begin{markdown} -#### Special Character Renderers -The following macros replace any special plain \TeX{} characters, including -% \iffalse -the active pipe character (`|`) of \Hologo{ConTeXt}, in the input text: - -- \mdef{markdownRendererAmpersand} replaces the ampersand (`&`). -- \mdef{markdownRendererBackslash} replaces the backslash (`\`). -- \mdef{markdownRendererCircumflex} replaces the circumflex (`^`). -- \mdef{markdownRendererDollarSign} replaces the dollar sign (`$`). -- \mdef{markdownRendererHash} replaces the hash sign (`#`). -- \mdef{markdownRendererLeftBrace} replaces the left brace (`{`). -- \mdef{markdownRendererPercentSign} replaces the percent sign (`%`). -- \mdef{markdownRendererPipe} replaces the pipe character (`|`). -- \mdef{markdownRendererRightBrace} replaces the right brace (`}`). -- \mdef{markdownRendererTilde} replaces the tilde (`~`). -- \mdef{markdownRendererUnderscore} replaces the underscore (`_`). +#### Line Block Renderers +The following macros are only produced, when the \Opt{lineBlocks} option +is enabled. -% \fi -% the active pipe character (`|`) of \Hologo{ConTeXt}, in the input text. -% These macros will only be produced, when the \Opt{hybrid} option is -% `false`. +The \mdef{markdownRendererLineBlockBegin} and \mdef{markdownRendererLineBlockEnd} macros +represent the beginning and the end of a line block. The macros receive no arguments. % \end{markdown} % @@ -16585,13 +16582,15 @@ the active pipe character (`|`) of \Hologo{ConTeXt}, in the input text: ##### Plain \TeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the -following content. We will make the tilde behave as if it were written in -\TeX{}, where it represents a non-breaking space. +following content: ``` tex \input markdown -\def\markdownRendererTilde{~} +\def\markdownOptionLineBlocks{true} \markdownBegin -Bartel~Leendert van~der~Waerden +| I would spread the cloths under your feet: +| But I, being poor, have only my dreams; +| I have spread my dreams under your feet; +| Tread softly because you tread on my dreams. \markdownEnd \bye ``````` @@ -16600,26 +16599,26 @@ Next, invoke LuaTeX from the terminal: luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the -following text, where the middot (`·`) denotes a non-breaking space: +following text: -> Bartel·Leendert van·der·Waerden +> | I would spread the cloths under your feet: +> | But I, being poor, have only my dreams; +> | I have spread my dreams under your feet; +> | Tread softly because you tread on my dreams. ##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the -following content. We will make the tilde behave as if it were written in -\TeX{}, where it represents a non-breaking space. +following content: ``` tex \documentclass{article} -\usepackage{markdown} -\markdownSetup{ - renderers = { - tilde = ~, - }, -} +\usepackage[lineBlocks]{markdown} \begin{document} \begin{markdown} -Bartel~Leendert van~der~Waerden +| I would spread the cloths under your feet: +| But I, being poor, have only my dreams; +| I have spread my dreams under your feet; +| Tread softly because you tread on my dreams. \end{markdown} \end{document} ``````` @@ -16628,157 +16627,66 @@ Next, invoke LuaTeX from the terminal: lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the -following text, where the middot (`·`) denotes a non-breaking space: +following text: -> Bartel·Leendert van·der·Waerden +> | I would spread the cloths under your feet: +> | But I, being poor, have only my dreams; +> | I have spread my dreams under your feet; +> | Tread softly because you tread on my dreams. ##### \Hologo{ConTeXt} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the -following content. We will make the tilde behave as if it were written in -\TeX{}, where it represents a non-breaking space. +following content: ``` tex \usemodule[t][markdown] -\def\markdownRendererTilde{~} +\setupmarkdown[lineBlocks = yes] \starttext \startmarkdown -Bartel~Leendert van~der~Waerden +| I would spread the cloths under your feet: +| But I, being poor, have only my dreams; +| I have spread my dreams under your feet; +| Tread softly because you tread on my dreams. \stopmarkdown \stoptext ``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the -following text, where the middot (`·`) denotes a non-breaking space: +following text: -> Bartel·Leendert van·der·Waerden +> | I would spread the cloths under your feet: +> | But I, being poor, have only my dreams; +> | I have spread my dreams under your feet; +> | Tread softly because you tread on my dreams. % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererLeftBrace{% - \markdownRendererLeftBracePrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { leftBrace } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { leftBrace } - { 0 } -\ExplSyntaxOff -\def\markdownRendererRightBrace{% - \markdownRendererRightBracePrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { rightBrace } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { rightBrace } - { 0 } -\ExplSyntaxOff -\def\markdownRendererDollarSign{% - \markdownRendererDollarSignPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { dollarSign } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { dollarSign } - { 0 } -\ExplSyntaxOff -\def\markdownRendererPercentSign{% - \markdownRendererPercentSignPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { percentSign } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { percentSign } - { 0 } -\ExplSyntaxOff -\def\markdownRendererAmpersand{% - \markdownRendererAmpersandPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { ampersand } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { ampersand } - { 0 } -\ExplSyntaxOff -\def\markdownRendererUnderscore{% - \markdownRendererUnderscorePrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { underscore } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { underscore } - { 0 } -\ExplSyntaxOff -\def\markdownRendererHash{% - \markdownRendererHashPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { hash } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { hash } - { 0 } -\ExplSyntaxOff -\def\markdownRendererCircumflex{% - \markdownRendererCircumflexPrototype}% +\def\markdownRendererLineBlockBegin{% + \markdownRendererLineBlockBeginPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { circumflex } + { lineBlockBegin } \prop_gput:Nnn \g_@@_renderer_arities_prop - { circumflex } + { lineBlockBegin } { 0 } \ExplSyntaxOff -\def\markdownRendererBackslash{% - \markdownRendererBackslashPrototype}% +\def\markdownRendererLineBlockEnd{% + \markdownRendererLineBlockEndPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { backslash } + { lineBlockEnd } \prop_gput:Nnn \g_@@_renderer_arities_prop - { backslash } - { 0 } -\ExplSyntaxOff -\def\markdownRendererTilde{% - \markdownRendererTildePrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { tilde } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { tilde } - { 0 } -\ExplSyntaxOff -\def\markdownRendererPipe{% - \markdownRendererPipePrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { pipe } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { pipe } + { lineBlockEnd } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -16791,11 +16699,10 @@ following text, where the middot (`·`) denotes a non-breaking space: % % \begin{markdown} -#### Strike-Through Renderer -The \mdef{markdownRendererStrikeThrough} macro represents a strike-through span of -text. The macro receives a single argument that corresponds to the striked-out -span of text. This macro will only be produced, when the \Opt{strikeThrough} -option is enabled. +#### Line Break Renderers + +The \mdef{markdownRendererSoftLineBreak} macro represents a soft line break. +The macro receives no arguments. % \end{markdown} % @@ -16807,14 +16714,21 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownOptionStrikeThrough{true} -\input soulutf8.sty -\def\markdownRendererStrikeThrough#1{\st{#1}} -\markdownBegin -This is ~~a lunar roving vehicle~~ strike-through text. -\markdownEnd +\def\markdownRendererSoftLineBreak{% + \par + {\it(A soft line break)}% + \par +} +\markdownInput{example.md} \bye ``````` +Using a text editor, create a text document named `example.md` with the +following content: + +``` md +Hello world! +_Foo_ bar! +`````` Next, invoke LuaTeX from the terminal: ``` sh luatex document.tex @@ -16822,7 +16736,11 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> This is ~~a lunar roving vehicle~~ strike-through text. +> Hello *world*! +> +> *(A soft line break)* +> +> _Foo_ bar! ##### \LaTeX{} Example {.unnumbered} @@ -16830,66 +16748,54 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[strikeThrough]{markdown} -\usepackage{soulutf8} +\usepackage{markdown} \markdownSetup{ renderers = { - strikeThrough = {\st{#1}}, + softLineBreak = {% + \par + \emph{(A soft line break)}% + \par + }, }, } \begin{document} -\begin{markdown} -This is ~~a lunar roving vehicle~~ strike-through text. -\end{markdown} +\markdownInput{example.md} \end{document} ``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> This is ~~a lunar roving vehicle~~ strike-through text. - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the +Using a text editor, create a text document named `example.md` with the following content: -``` tex -\usemodule[t][markdown] -\setupmarkdown[strikeThrough = yes] -\def\markdownRendererStrikeThrough#1{\overstrikes{#1}} -\starttext -\startmarkdown -This is ~~a lunar roving vehicle~~ strike-through text. -\stopmarkdown -\stoptext -``````` + +``` md +Hello world! +_Foo_ bar! +`````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> This is ~~a lunar roving vehicle~~ strike-through text. +> Hello *world*! +> +> *(A soft line break)* +> +> _Foo_ bar! % %<*tex> % \fi -% % \begin{macrocode} -\def\markdownRendererStrikeThrough{% - \markdownRendererStrikeThroughPrototype}% +\def\markdownRendererSoftLineBreak{% + \markdownRendererSoftLineBreakPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { strikeThrough } + { softLineBreak } \prop_gput:Nnn \g_@@_renderer_arities_prop - { strikeThrough } - { 1 } + { softLineBreak } + { 0 } \ExplSyntaxOff % \end{macrocode} % \par @@ -16901,11 +16807,8 @@ following text: % % \begin{markdown} -#### Subscript Renderer -The \mdef{markdownRendererSubscript} macro represents a subscript span of -text. The macro receives a single argument that corresponds to the subscript -span of text. This macro will only be produced, when the \Opt{subscripts} -option is enabled. +The \mdef{markdownRendererHardLineBreak} macro represents a hard line break. +The macro receives no arguments. % \end{markdown} % @@ -16917,13 +16820,22 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownOptionSubscripts{true} -\def\markdownRendererSubscript#1{ (#1 moles) and } -\markdownBegin -H~2~O is a liquid. -\markdownEnd +\def\markdownRendererHardLineBreak{% + \par + {\it(A hard line break)}% + \par +} +\markdownInput{example.md} \bye ``````` +Using a text editor, create a text document named `example.md` with the +following content. Note the two spaces at the end of the first line, which +specify a hard line break. Due to the limitations of the \TeX{} input +processor, hard line breaks would be ignored if we typed them directly into the +`document.tex` document. + +
Hello world!  
_Foo_ bar!
+ Next, invoke LuaTeX from the terminal: ``` sh luatex document.tex @@ -16931,7 +16843,11 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> H (2 moles) and O is a liquid. +> Hello *world*! +> +> *(A hard line break)* +> +> _Foo_ bar! ##### \LaTeX{} Example {.unnumbered} @@ -16939,65 +16855,56 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[subscripts]{markdown} +\usepackage{markdown} \markdownSetup{ renderers = { - subscript = { (#1 moles) and }, + hardLineBreak = {% + \par + \emph{(A hard line break)}% + \par + }, }, } \begin{document} -\begin{markdown} -H~2~O is a liquid. -\end{markdown} +\markdownInput{example.md} \end{document} ``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> H (2 moles) and O is a liquid. +Using a text editor, create a text document named `example.md` with the +following content. Note the two spaces at the end of the first line, which +specify a hard line break. Due to the limitations of the \TeX{} input +processor, hard line breaks would be ignored if we typed them directly into the +`document.tex` document. -##### \Hologo{ConTeXt} Example {.unnumbered} +
Hello world!  
_Foo_ bar!
-Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\setupmarkdown[subscripts = yes] -\def\markdownRendererSubscript#1{ (#1 moles) and } -\starttext -\startmarkdown -H~2~O is a liquid. -\stopmarkdown -\stoptext -``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> H (2 moles) and O is a liquid. +> Hello *world*! +> +> *(A hard line break)* +> +> _Foo_ bar! % %<*tex> % \fi -% % \begin{macrocode} -\def\markdownRendererSubscript{% - \markdownRendererSubscriptPrototype}% +\def\markdownRendererHardLineBreak{% + \markdownRendererHardLineBreakPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { subscript } + { hardLineBreak } \prop_gput:Nnn \g_@@_renderer_arities_prop - { subscript } - { 1 } + { hardLineBreak } + { 0 } +\ExplSyntaxOff % \end{macrocode} % \par % @@ -17008,11 +16915,11 @@ following text: % % \begin{markdown} -#### Superscript Renderer -The \mdef{markdownRendererSuperscript} macro represents a superscript span of -text. The macro receives a single argument that corresponds to the superscript -span of text. This macro will only be produced, when the \Opt{superscripts} -option is enabled. +#### Link Renderer +The \mdef{markdownRendererLink} macro represents a hyperlink. It receives +four arguments: the label, the fully escaped \acro{uri} that can be directly +typeset, the raw \acro{uri} that can be used outside typesetting, and the +title of the link. % \end{markdown} % @@ -17024,10 +16931,14 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownOptionSuperscripts{true} -\def\markdownRendererSuperscript#1{ taken to the power of #1} +\def\markdownRendererLink#1#2#3#4{% + #1 {\tt#2} titled {\it#4}% +} \markdownBegin -2^10^ is 1024. +Please visit [the link][ctan]. + + [ctan]: https://ctan.org/ + (the Comprehensive TeX Archive Network) \markdownEnd \bye ``````` @@ -17038,7 +16949,8 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> 2 taken to the power of 10 is 1024. +> Please visit the link titled *the Comprehensive TeX +> Archive Network*. ##### \LaTeX{} Example {.unnumbered} @@ -17046,15 +16958,20 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[superscripts]{markdown} +\usepackage{markdown} \markdownSetup{ renderers = { - superscript = { taken to the power of #1}, + link = {% + #1 \texttt{#2} titled \emph{#4}% + }, }, } \begin{document} \begin{markdown} -2^10^ is 1024. +Please visit [the link][ctan]. + + [ctan]: https://ctan.org/ + (the Comprehensive TeX Archive Network) \end{markdown} \end{document} ``````` @@ -17065,7 +16982,8 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> 2 taken to the power of 10 is 1024. +> Please visit the link titled *the Comprehensive TeX +> Archive Network*. ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -17073,38 +16991,43 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\setupmarkdown[superscripts = yes] -\def\markdownRendererSuperscript#1{ taken to the power of #1} +\def\markdownRendererLink#1#2#3#4{% + #1 {\tt#2} titled \emph{#4}% +} \starttext \startmarkdown -2^10^ is 1024. +Please visit [the link][ctan]. + + [ctan]: https://ctan.org/ + (the Comprehensive TeX Archive Network) \stopmarkdown \stoptext ``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> 2 taken to the power of 10 is 1024. +> Please visit the link titled *the Comprehensive TeX +> Archive Network*. % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererSuperscript{% - \markdownRendererSuperscriptPrototype}% +\def\markdownRendererLink{% + \markdownRendererLinkPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { superscript } + { link } \prop_gput:Nnn \g_@@_renderer_arities_prop - { superscript } - { 1 } + { link } + { 4 } \ExplSyntaxOff % \end{macrocode} % \par @@ -17116,19 +17039,14 @@ following text: % % \begin{markdown} -#### Table Renderer -The \mdef{markdownRendererTable} macro represents a table. This macro will only -be produced, when the \Opt{pipeTables} option is enabled. The macro receives the -parameters `{`\meta{caption}`}{`\meta{number of rows}`}{`\meta{number of columns}`}` -followed by `{`\meta{alignments}`}` and then by `{`\meta{row}`}` repeated -\meta{number of rows} times, where \meta{row} is `{`\meta{column}`}` repeated -\meta{number of columns} times, \meta{alignments} is \meta{alignment} repeated -\meta{number of columns} times, and \meta{alignment} is one of the following: - -- `d` -- The corresponding column has an unspecified (default) alignment. -- `l` -- The corresponding column is left-aligned. -- `c` -- The corresponding column is centered. -- `r` -- The corresponding column is right-aligned. +#### Link Attribute Context Renderers +The following macros are only produced, when the \Opt{linkAttributes} option +is enabled. + +The \mdef{markdownRendererLinkAttributeContextBegin} and +\mdef{markdownRendererLinkAttributeContextEnd} macros represent the beginning +and the end of a context in which the attributes of a hyperlink apply. +The macros receive no arguments. % \end{markdown} % @@ -17140,60 +17058,19 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[pipeTables, tableCaptions]{markdown} -\newcount\rowCounter -\newcount\columnCounter -\makeatletter -\def\processRow#1{% - \columnCounter=1% - \ifnum\rowCounter=0\relax - As for the alignment, - \else - In row \the\rowCounter, - \fi - \processColumn#1 - \advance\rowCounter by 1\relax - \ifnum\rowCounter>\rowTotal\relax - \expandafter\@gobble - \fi\processRow}% -\def\processColumn#1{% - column number \the\columnCounter{} - \ifnum\rowCounter=0\relax - \if#1d{}has default alignment\fi - \if#1l{}is left-aligned\fi - \if#1c{}is centered\fi - \if#1r{}is right-aligned\fi - \else - says \emph{#1}% - \fi - \advance\columnCounter by 1\relax - \ifnum\columnCounter<\columnTotal\relax, \fi - \ifnum\columnCounter=\columnTotal\relax, and \fi - \ifnum\columnCounter>\columnTotal\relax - .\expandafter\@gobble - \fi\processColumn}% -\makeatother +\usepackage[linkAttributes]{markdown} \markdownSetup{ renderers = { - table = {% - This is a table with caption \emph{#1} that is #3 colums wide - and #2 rows long. - \rowCounter=0% - \def\rowTotal{#2}% - \def\columnTotal{#3}% - \processRow - }, + linkAttributeContextBegin = {(}, + link = {#1}, + linkAttributeContextEnd = {)}, }, } \begin{document} \begin{markdown} -| Right | Left | Default | Center | -|------:|:-----|---------|:------:| -| 12 | 12 | 12 | 12 | -| 123 | 123 | 123 | 123 | -| 1 | 1 | 1 | 1 | - : Demonstration of pipe table syntax +foo [bar](#bar){key=value} baz + \end{markdown} \end{document} ``````` @@ -17204,34 +17081,34 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> This is a table with caption *Demonstration of pipe table syntax* that is 4 -> colums wide and 4 rows long. As for the alignment, column number 1 is -> right-aligned, column number 2 is left-aligned, column number 3 has default -> alignment, and column number 4 is centered. In row 1, column number 1 says -> *Right*, column number 2 says *Left*, column number 3 says *Default*, and -> column number 4 says *Center*. In row 2, column number 1 says *12*, column -> number 2 says *12*, column number 3 says *12*, and column number 4 says *12*. -> In row 3, column number 1 says *123*, column number 2 says *123*, column -> number 3 says *123*, and column number 4 says *123*. In row 4, column number -> 1 says *1*, column number 2 says *1*, column number 3 says *1*, and column -> number 4 says *1*. - +> foo (bar) baz % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererTable{% - \markdownRendererTablePrototype}% +\def\markdownRendererLinkAttributeContextBegin{% + \markdownRendererLinkAttributeContextBeginPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { table } + { linkAttributeContextBegin } \prop_gput:Nnn \g_@@_renderer_arities_prop - { table } - { 3 } + { linkAttributeContextBegin } + { 0 } +\ExplSyntaxOff +\def\markdownRendererLinkAttributeContextEnd{% + \markdownRendererLinkAttributeContextEndPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { linkAttributeContextEnd } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { linkAttributeContextEnd } + { 0 } \ExplSyntaxOff % \end{macrocode} % \par @@ -17243,59 +17120,35 @@ following text: % % \begin{markdown} -#### Tex Math Renderers -The \mdef{markdownRendererInlineMath} and \mdef{markdownRendererDisplayMath} macros -represent inline and display \TeX{} math. -Both macros receive a single argument that corresponds to the tex math content. -These macros will only be produced, when the \Opt{texMathDollars}, -\Opt{texMathSingleBackslash}, or \Opt{texMathDoubleBackslash} option are enabled. +#### Marked Text Renderer +The following macro is only produced, when the \Opt{mark} option is enabled. + +The \mdef{markdownRendererMark} macro represents a span of marked or +highlighted text. The macro receives a single argument that corresponds to +the marked text. % \end{markdown} % % \iffalse -##### Plain \TeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownOptionTexMathDollars{true} -\def\markdownRendererInlineMath#1{$#1\dots$} -\def\markdownRendererDisplayMath#1{$$#1\eqno(1)$$} -\markdownBegin -$E=mc^2$ - -$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ -\markdownEnd -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> $E=mc^2\dots$ -> -> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\eqno(1)$$ - ##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[texMathDollars]{markdown} -\usepackage{amsmath} -\def\markdownRendererInlineMath#1{\begin{math}#1\dots\end{math}} -\def\markdownRendererDisplayMath#1{\begin{equation}#1\end{equation}} +\usepackage[mark]{markdown} +\usepackage{soul} +\markdownSetup{ + renderers = { + mark = {\hl{#1}}, + }, +} \begin{document} \begin{markdown} -$E=mc^2$ -$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ +This ==is highlighted text.== + \end{markdown} \end{document} ``````` @@ -17306,63 +17159,22 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> $E=mc^2\dots$ -> -> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\quad(1)$$ - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\setupmarkdown[texMathDollars = yes] -\def\markdownRendererInlineMath#1{$#1\dots$}% -\def\markdownRendererDisplayMath#1{\placeformula\startformula#1\stopformula}% -\starttext -\startmarkdown -$E=mc^2$ - -$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ -\stopmarkdown -\stoptext -``````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> $E=mc^2\dots$ -> -> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\quad(1)$$ +> This is highlighted text. % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererInlineMath{% - \markdownRendererInlineMathPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { inlineMath } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { inlineMath } - { 1 } -\ExplSyntaxOff -\def\markdownRendererDisplayMath{% - \markdownRendererDisplayMathPrototype}% +\def\markdownRendererMark{% + \markdownRendererMarkPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { displayMath } + { mark } \prop_gput:Nnn \g_@@_renderer_arities_prop - { displayMath } + { mark } { 1 } \ExplSyntaxOff % \end{macrocode} @@ -17375,11 +17187,15 @@ following text: % % \begin{markdown} -#### Text Citations Renderer -The \mdef{markdownRendererTextCite} macro represents a string of one or more -text citations. This macro will only be produced, when the -\Opt{citations} option is enabled. The macro receives parameters in the same -format as the \mref{markdownRendererCite} macro. +#### Markdown Document Renderers +The \mdef{markdownRendererDocumentBegin} and \mdef{markdownRendererDocumentEnd} +macros represent the beginning and the end of a *markdown* document. The macros +receive no arguments. + +A \TeX{} document may contain any number of markdown documents. Additionally, +markdown documents may appear not only in a sequence, but several markdown +documents may also be *nested*. Redefinitions of the macros should take this +into account. % \end{markdown} % @@ -17387,49 +17203,78 @@ format as the \mref{markdownRendererCite} macro. ##### \LaTeX{} Example {.unnumbered} +Using a text editor, create a text document named `nested.md` with the +following content: +``` md +This is a *nested* markdown document. +``` + Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[citations]{markdown} -\newcount\citationsCounter -\newcount\citationsTotal -\makeatletter -\def\citations#1#2#3#4{% - a text citation \emph{#4} - \advance\citationsCounter by 1\relax - \ifx\relax#2\relax - \ifx\relax#3\relax\else - with a postfix \emph{#3}% - \fi - \else - with a prefix \emph{#2}% - \ifx\relax#3\relax\else - \ and a postfix \emph{#3}% - \fi - \fi - \ifnum\citationsCounter>\citationsTotal\relax - .% - \expandafter\@gobble - \else - , and - \fi\citations} -\makeatother +\usepackage[contentBlocks]{markdown} \markdownSetup{ renderers = { - textCite = {% - \citationsCounter=1% - \citationsTotal=#1% - This is - \expandafter\citations + contentBlock = {% + \markdownInput{#3}% + }, + documentBegin = {% + \par + \emph{(The beginning of a document)} + \par + \begingroup + \markdownSetup{snippet=first-nesting-level}% + }, + documentEnd = {% + \endgroup + \par + \emph{(The end of a document)} + \par }, }, } -\begin{document} -\begin{markdown} -@abrahams90 [pp. 12; also @eijkhout91] -\end{markdown} -\end{document} +\markdownSetupSnippet{first-nesting-level}{ + renderers = { + documentBegin = { + \par + \emph{(The beginning of a nested document)} + \par + \begingroup + \markdownSetup{snippet=second-nesting-level-and-below} + }, + }, +} +\markdownSetupSnippet{second-nesting-level-and-below}{ + renderers = { + documentBegin = { + \par + \emph{(The beginning of a nested document)} + \par + \begingroup + }, + documentEnd = { + \endgroup + \par + \emph{(The end of a nested document)} + \par + }, + }, +} +\begin{document} +\begin{markdown} +Hello *world*! + +/nested.md + +_Foo_ bar! +\end{markdown} +\begin{markdown} + +Bar baz! + +\end{markdown} +\end{document} ``````` Next, invoke LuaTeX from the terminal: ``` sh @@ -17438,24 +17283,52 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> This is a text citation *abrahams90* with a postfix *pp. 12*, -> and a citation *eijkhout91* with a prefix *also*. +> *(The beginning of a document)* +> +> Hello *world*! +> +> *(The beginning of a nested document)* +> +> This is a *nested* markdown document. +> +> *(The end of a nested document)* +> +> _Foo_ bar! +> +> *(The end of a document)* +> +> *(The beginning of a document)* +> +> Bar baz! +> +> *(The end of a document)* % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererTextCite{% - \markdownRendererTextCitePrototype}% +\def\markdownRendererDocumentBegin{% + \markdownRendererDocumentBeginPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { textCite } + { documentBegin } \prop_gput:Nnn \g_@@_renderer_arities_prop - { textCite } - { 1 } + { documentBegin } + { 0 } +\ExplSyntaxOff +\def\markdownRendererDocumentEnd{% + \markdownRendererDocumentEndPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { documentEnd } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { documentEnd } + { 0 } \ExplSyntaxOff % \end{macrocode} % \par @@ -17467,9 +17340,95 @@ following text: % % \begin{markdown} -#### Thematic Break Renderer -The \mdef{markdownRendererThematicBreak} macro represents a thematic break. -The macro receives no arguments. +#### Non-Breaking Space Renderer +The \mdef{markdownRendererNbsp} macro represents a non-breaking space. + +% \end{markdown} +% +% \iffalse + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.bib` with the +following content: +``` bib +@book{knuth:tex, + author = "Knuth, Donald Ervin", + title = "The \TeX book, volume A of Computers and typesetting", + publisher = "Addison-Wesley", + year = "1984" +} +``````` +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[ + citations, + citationNbsps, +]{markdown} +\markdownSetup{ + renderers = { + nbsp = {$\cdot$}, + }, +} +\begin{document} + +\begin{markdown} +The TeXbook [@knuth:tex, p. 123 and 130] is good. +\end{markdown} + +\bibliographystyle{plain} +\bibliography{document.bib} + +\end{document} +``````` +Next, invoke LuaTeX and BibTeX from the terminal: +``` sh +lualatex document.tex +bibtex document.aux +lualatex document.tex +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> The TeXbook [1, p.·123·and·130] is good. +> +> ### References +> [1] Donald Ervin Knuth. _The TeXbook, volume A of Computers and typesetting._ +> Addison-Wesley, 1984. + +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererNbsp{% + \markdownRendererNbspPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { nbsp } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { nbsp } + { 0 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +% +%<*manual-tokens> +% \fi +% +% \begin{markdown} + +#### Note Renderer +The \mdef{markdownRendererNote} macro represents a note. This macro +will only be produced, when the \Opt{notes} option is enabled. The +macro receives a single argument that corresponds to the note text. % \end{markdown} % @@ -17481,13 +17440,14 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownRendererThematicBreak{\vfil\break} +\def\markdownOptionNotes{true} +\def\markdownRendererNote#1{ (and \lowercase{#1})} \markdownBegin -This is the first page. +This is some text[^1] and this is some other text[^2]. -*** + [^1]: this is a note -This is the second page. + [^2]: this is some other note \markdownEnd \bye ``````` @@ -17498,11 +17458,8 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> This is the first page. -> -> *** -> -> This is the second page. +> This is some text (and this is a note) and this is some other +> text (and this is some other note). ##### \LaTeX{} Example {.unnumbered} @@ -17510,19 +17467,19 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage{markdown} +\usepackage[notes]{markdown} \markdownSetup{ renderers = { - thematicBreak = \newpage, + note = { (and \MakeLowercase{#1})}, }, } \begin{document} \begin{markdown} -This is the first page. +This is some text[^1] and this is some other text[^2]. -*** + [^1]: this is a note -This is the second page. + [^2]: this is some other note \end{markdown} \end{document} ``````` @@ -17533,11 +17490,8 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> This is the first page. -> -> *** -> -> This is the second page. +> This is some text (and this is a note) and this is some other +> text (and this is some other note). ##### \Hologo{ConTeXt} Example {.unnumbered} @@ -17545,85 +17499,42 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \usemodule[t][markdown] -\def\markdownRendererThematicBreak{\page[yes]} +\setupmarkdown[notes = yes] +\def\markdownRendererNote#1{ (and \lowercase{#1})} \starttext \startmarkdown -This is the first page. +This is some text[^1] and this is some other text[^2]. -*** + [^1]: this is a note -This is the second page. + [^2]: this is some other note \stopmarkdown \stoptext ``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> This is the first page. -> -> *** -> -> This is the second page. +> This is some text (and this is a note) and this is some other +> text (and this is some other note). % %<*tex> % \fi -% \begin{markdown} -% -% The \mdef{markdownRendererHorizontalRule} and -% \mdef{markdownRendererHorizontalRulePrototype} macros have been deprecated -% and will be removed in Markdown 3.0.0. -% -% \end{markdown} % \begin{macrocode} +\def\markdownRendererNote{% + \markdownRendererNotePrototype}% \ExplSyntaxOn -\cs_new:Npn - \markdownRendererThematicBreak - { - \cs_if_exist:NTF - \markdownRendererHorizontalRule - { - \markdownWarning - { - Horizontal~rule~renderer~has~been~deprecated,~ - to~be~removed~in~Markdown~3.0.0 - } - \markdownRendererHorizontalRule - } - { - \cs_if_exist:NTF - \markdownRendererHorizontalRulePrototype - { - \markdownWarning - { - Horizontal~rule~renderer~prototype~has~been~deprecated,~ - to~be~removed~in~Markdown~3.0.0 - } - \markdownRendererHorizontalRulePrototype - } - { - \markdownRendererThematicBreakPrototype - } - } - } -\seq_gput_right:Nn - \g_@@_renderers_seq - { horizontalRule } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { horizontalRule } - { 0 } \seq_gput_right:Nn \g_@@_renderers_seq - { thematicBreak } + { note } \prop_gput:Nnn \g_@@_renderer_arities_prop - { thematicBreak } - { 0 } + { note } + { 1 } \ExplSyntaxOff % \end{macrocode} % \par @@ -17635,110 +17546,29 @@ following text: % % \begin{markdown} -#### Tickbox Renderers -The macros named \mdef{markdownRendererTickedBox}, -\mdef{markdownRendererHalfTickedBox}, and \mdef{markdownRendererUntickedBox} -represent ticked and unticked boxes, respectively. These macros will either be -produced, when the \Opt{taskLists} option is enabled, or when the Ballot Box -with X (☒, U+2612), Hourglass (⌛, U+231B) or Ballot Box (☐, U+2610) Unicode -characters are encountered in the markdown input, respectively. +#### Ordered List Renderers +The \mdef{markdownRendererOlBegin} macro represents the beginning of an +ordered list that contains an item with several paragraphs of text (the +list is not tight). This macro will only be produced, when the \Opt{fancyLists} +option is disabled. The macro receives no arguments. % \end{markdown} % % \iffalse - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[taskLists]{markdown} -\markdownSetup{ - renderers = { - untickedBox = No, - tickedBox = Yes, - }, -} -\begin{document} -\begin{markdown} -- [ ] you can't. -- [x] I can! -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> - No you can't. -> - Yes I can! - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\setupmarkdown[taskLists = yes] -\def\markdownRendererUntickedBox{No} -\def\markdownRendererTickedBox{Yes} -\starttext -\startmarkdown -- [ ] you can't. -- [x] I can! -\stopmarkdown -\stoptext -```````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -````` -A PDF document named `document.pdf` should be produced and contain the -following text: - -> - No you can't. -> - Yes I can! - % %<*tex> % \fi % % \begin{macrocode} -\def\markdownRendererTickedBox{% - \markdownRendererTickedBoxPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { tickedBox } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { tickedBox } - { 0 } -\ExplSyntaxOff -\def\markdownRendererHalfTickedBox{% - \markdownRendererHalfTickedBoxPrototype}% -\ExplSyntaxOn -\seq_gput_right:Nn - \g_@@_renderers_seq - { halfTickedBox } -\prop_gput:Nnn - \g_@@_renderer_arities_prop - { halfTickedBox } - { 0 } -\ExplSyntaxOff -\def\markdownRendererUntickedBox{% - \markdownRendererUntickedBoxPrototype}% +\def\markdownRendererOlBegin{% + \markdownRendererOlBeginPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { untickedBox } + { olBegin } \prop_gput:Nnn \g_@@_renderer_arities_prop - { untickedBox } + { olBegin } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -17751,11 +17581,11 @@ following text: % % \begin{markdown} -#### YAML Metadata Renderers {#yamlmetadatarenderers} - -The \mdef{markdownRendererJekyllDataBegin} macro represents the beginning of a -\acro{yaml} document. This macro will only be produced when the \Opt{jekyllData} -option is enabled. The macro receives no arguments. +The \mdef{markdownRendererOlBeginTight} macro represents the beginning of an +ordered list that contains no item with several paragraphs of text (the +list is tight). This macro will only be produced, when the \Opt{tightLists} +option is enabled and the \Opt{fancyLists} option is disabled. The macro +receives no arguments. % \end{markdown} % @@ -17765,15 +17595,15 @@ option is enabled. The macro receives no arguments. % \fi % % \begin{macrocode} -\def\markdownRendererJekyllDataBegin{% - \markdownRendererJekyllDataBeginPrototype}% +\def\markdownRendererOlBeginTight{% + \markdownRendererOlBeginTightPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { jekyllDataBegin } + { olBeginTight } \prop_gput:Nnn \g_@@_renderer_arities_prop - { jekyllDataBegin } + { olBeginTight } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -17786,9 +17616,13 @@ option is enabled. The macro receives no arguments. % % \begin{markdown} -The \mdef{markdownRendererJekyllDataEnd} macro represents the end of a -\acro{yaml} document. This macro will only be produced when the -\Opt{jekyllData} option is enabled. The macro receives no arguments. +The \mdef{markdownRendererFancyOlBegin} macro represents the beginning of a +fancy ordered list that contains an item with several paragraphs of text (the +list is not tight). This macro will only be produced, when the \Opt{fancyLists} +option is enabled. The macro receives two arguments: the style of the list item +labels (`Decimal`, `LowerRoman`, `UpperRoman`, `LowerAlpha`, and `UpperAlpha`), +and the style of delimiters between list item labels and texts (`Default`, +`OneParen`, and `Period`). % \end{markdown} % @@ -17798,16 +17632,16 @@ The \mdef{markdownRendererJekyllDataEnd} macro represents the end of a % \fi % % \begin{macrocode} -\def\markdownRendererJekyllDataEnd{% - \markdownRendererJekyllDataEndPrototype}% +\def\markdownRendererFancyOlBegin{% + \markdownRendererFancyOlBeginPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { jekyllDataEnd } + { fancyOlBegin } \prop_gput:Nnn \g_@@_renderer_arities_prop - { jekyllDataEnd } - { 0 } + { fancyOlBegin } + { 2 } \ExplSyntaxOff % \end{macrocode} % \par @@ -17819,11 +17653,13 @@ The \mdef{markdownRendererJekyllDataEnd} macro represents the end of a % % \begin{markdown} -The \mdef{markdownRendererJekyllDataMappingBegin} macro represents the -beginning of a mapping in a \acro{yaml} document. This macro will only be -produced when the \Opt{jekyllData} option is enabled. The macro receives two -arguments: the scalar key in the parent structure, cast to a string following -\acro{yaml} serialization rules, and the number of items in the mapping. +The \mdef{markdownRendererFancyOlBeginTight} macro represents the beginning of +a fancy ordered list that contains no item with several paragraphs of text (the +list is tight). This macro will only be produced, when the \Opt{fancyLists} +and \Opt{tightLists} options are enabled. The macro receives two arguments: the +style of the list item labels, and the style of delimiters between list +item labels and texts. See the \mref{markdownRendererFancyOlBegin} macro for +the valid style values. % \end{markdown} % @@ -17833,15 +17669,15 @@ arguments: the scalar key in the parent structure, cast to a string following % \fi % % \begin{macrocode} -\def\markdownRendererJekyllDataMappingBegin{% - \markdownRendererJekyllDataMappingBeginPrototype}% +\def\markdownRendererFancyOlBeginTight{% + \markdownRendererFancyOlBeginTightPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { jekyllDataMappingBegin } + { fancyOlBeginTight } \prop_gput:Nnn \g_@@_renderer_arities_prop - { jekyllDataMappingBegin } + { fancyOlBeginTight } { 2 } \ExplSyntaxOff % \end{macrocode} @@ -17854,9 +17690,10 @@ arguments: the scalar key in the parent structure, cast to a string following % % \begin{markdown} -The \mdef{markdownRendererJekyllDataMappingEnd} macro represents the -end of a mapping in a \acro{yaml} document. This macro will only be produced -when the \Opt{jekyllData} option is enabled. The macro receives no arguments. +The \mdef{markdownRendererOlItem} macro represents an item in an ordered list. +This macro will only be produced, when the \Opt{startNumber} option is +disabled and the \Opt{fancyLists} option is disabled. The macro receives no +arguments. % \end{markdown} % @@ -17866,15 +17703,15 @@ when the \Opt{jekyllData} option is enabled. The macro receives no arguments. % \fi % % \begin{macrocode} -\def\markdownRendererJekyllDataMappingEnd{% - \markdownRendererJekyllDataMappingEndPrototype}% +\def\markdownRendererOlItem{% + \markdownRendererOlItemPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { jekyllDataMappingEnd } + { olItem } \prop_gput:Nnn \g_@@_renderer_arities_prop - { jekyllDataMappingEnd } + { olItem } { 0 } \ExplSyntaxOff % \end{macrocode} @@ -17887,11 +17724,9 @@ when the \Opt{jekyllData} option is enabled. The macro receives no arguments. % % \begin{markdown} -The \mdef{markdownRendererJekyllDataSequenceBegin} macro represents the -beginning of a sequence in a \acro{yaml} document. This macro will only be -produced when the \Opt{jekyllData} option is enabled. The macro receives two -arguments: the scalar key in the parent structure, cast to a string following -\acro{yaml} serialization rules, and the number of items in the sequence. +The \mdef{markdownRendererOlItemEnd} macro represents the end of an item in +an ordered list. This macro will only be produced, when the \Opt{fancyLists} +option is disabled. The macro receives no arguments. % \end{markdown} % @@ -17901,16 +17736,16 @@ arguments: the scalar key in the parent structure, cast to a string following % \fi % % \begin{macrocode} -\def\markdownRendererJekyllDataSequenceBegin{% - \markdownRendererJekyllDataSequenceBeginPrototype}% +\def\markdownRendererOlItemEnd{% + \markdownRendererOlItemEndPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { jekyllDataSequenceBegin } + { olItemEnd } \prop_gput:Nnn \g_@@_renderer_arities_prop - { jekyllDataSequenceBegin } - { 2 } + { olItemEnd } + { 0 } \ExplSyntaxOff % \end{macrocode} % \par @@ -17922,9 +17757,10 @@ arguments: the scalar key in the parent structure, cast to a string following % % \begin{markdown} -The \mdef{markdownRendererJekyllDataSequenceEnd} macro represents the -end of a sequence in a \acro{yaml} document. This macro will only be produced -when the \Opt{jekyllData} option is enabled. The macro receives no arguments. +The \mdef{markdownRendererOlItemWithNumber} macro represents an item in an +ordered list. This macro will only be produced, when the \Opt{startNumber} +option is enabled and the \Opt{fancyLists} option is disabled. The macro +receives a single numeric argument that corresponds to the item number. % \end{markdown} % @@ -17934,16 +17770,16 @@ when the \Opt{jekyllData} option is enabled. The macro receives no arguments. % \fi % % \begin{macrocode} -\def\markdownRendererJekyllDataSequenceEnd{% - \markdownRendererJekyllDataSequenceEndPrototype}% +\def\markdownRendererOlItemWithNumber{% + \markdownRendererOlItemWithNumberPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { jekyllDataSequenceEnd } + { olItemWithNumber } \prop_gput:Nnn \g_@@_renderer_arities_prop - { jekyllDataSequenceEnd } - { 0 } + { olItemWithNumber } + { 1 } \ExplSyntaxOff % \end{macrocode} % \par @@ -17955,11 +17791,10 @@ when the \Opt{jekyllData} option is enabled. The macro receives no arguments. % % \begin{markdown} -The \mdef{markdownRendererJekyllDataBoolean} macro represents a boolean scalar -value in a \acro{yaml} document. This macro will only be produced when the -\Opt{jekyllData} option is enabled. The macro receives two arguments: the -scalar key in the parent structure, and the scalar value, both cast to a string -following \acro{yaml} serialization rules. +The \mdef{markdownRendererFancyOlItem} macro represents an item in a fancy +ordered list. This macro will only be produced, when the \Opt{startNumber} +option is disabled and the \Opt{fancyLists} option is enabled. The macro receives +no arguments. % \end{markdown} % @@ -17969,16 +17804,16 @@ following \acro{yaml} serialization rules. % \fi % % \begin{macrocode} -\def\markdownRendererJekyllDataBoolean{% - \markdownRendererJekyllDataBooleanPrototype}% +\def\markdownRendererFancyOlItem{% + \markdownRendererFancyOlItemPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { jekyllDataBoolean } + { fancyOlItem } \prop_gput:Nnn \g_@@_renderer_arities_prop - { jekyllDataBoolean } - { 2 } + { fancyOlItem } + { 0 } \ExplSyntaxOff % \end{macrocode} % \par @@ -17990,11 +17825,9 @@ following \acro{yaml} serialization rules. % % \begin{markdown} -The \mdef{markdownRendererJekyllDataNumber} macro represents a numeric scalar -value in a \acro{yaml} document. This macro will only be produced when the -\Opt{jekyllData} option is enabled. The macro receives two arguments: the -scalar key in the parent structure, and the scalar value, both cast to a string -following \acro{yaml} serialization rules. +The \mdef{markdownRendererFancyOlItemEnd} macro represents the end of an item in +a fancy ordered list. This macro will only be produced, when the \Opt{fancyLists} +option is enabled. The macro receives no arguments. % \end{markdown} % @@ -18004,16 +17837,16 @@ following \acro{yaml} serialization rules. % \fi % % \begin{macrocode} -\def\markdownRendererJekyllDataNumber{% - \markdownRendererJekyllDataNumberPrototype}% +\def\markdownRendererFancyOlItemEnd{% + \markdownRendererFancyOlItemEndPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { jekyllDataNumber } + { fancyOlItemEnd } \prop_gput:Nnn \g_@@_renderer_arities_prop - { jekyllDataNumber } - { 2 } + { fancyOlItemEnd } + { 0 } \ExplSyntaxOff % \end{macrocode} % \par @@ -18025,11 +17858,10 @@ following \acro{yaml} serialization rules. % % \begin{markdown} -The \mdef{markdownRendererJekyllDataString} macro represents a string scalar -value in a \acro{yaml} document. This macro will only be produced when the -\Opt{jekyllData} option is enabled. The macro receives two arguments: the -scalar key in the parent structure, cast to a string following \acro{yaml} -serialization rules, and the scalar value. +The \mdef{markdownRendererFancyOlItemWithNumber} macro represents an item in a +fancy ordered list. This macro will only be produced, when the \Opt{startNumber} +and \Opt{fancyLists} options are enabled. The macro receives a single numeric +argument that corresponds to the item number. % \end{markdown} % @@ -18039,16 +17871,16 @@ serialization rules, and the scalar value. % \fi % % \begin{macrocode} -\def\markdownRendererJekyllDataString{% - \markdownRendererJekyllDataStringPrototype}% +\def\markdownRendererFancyOlItemWithNumber{% + \markdownRendererFancyOlItemWithNumberPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { jekyllDataString } + { fancyOlItemWithNumber } \prop_gput:Nnn \g_@@_renderer_arities_prop - { jekyllDataString } - { 2 } + { fancyOlItemWithNumber } + { 1 } \ExplSyntaxOff % \end{macrocode} % \par @@ -18060,16 +17892,46 @@ serialization rules, and the scalar value. % % \begin{markdown} -The \mdef{markdownRendererJekyllDataEmpty} macro represents an empty scalar -value in a \acro{yaml} document. This macro will only be produced when the -\Opt{jekyllData} option is enabled. The macro receives one argument: the -scalar key in the parent structure, cast to a string following \acro{yaml} -serialization rules. +The \mdef{markdownRendererOlEnd} macro represents the end of an ordered list +that contains an item with several paragraphs of text (the list is not +tight). This macro will only be produced, when the \Opt{fancyLists} option is +disabled. The macro receives no arguments. -% See also Section <#sec:expl3yamlmetadata> for the description of the -% high-level expl3 interface that you can also use to react to \acro{yaml} -% metadata. +% \end{markdown} +% +% \iffalse +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererOlEnd{% + \markdownRendererOlEndPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { olEnd } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { olEnd } + { 0 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +% +%<*manual-tokens> +% \fi % +% \begin{markdown} + +The \mdef{markdownRendererOlEndTight} macro represents the end of an ordered +list that contains no item with several paragraphs of text (the list is +tight). This macro will only be produced, when the \Opt{tightLists} option is +enabled and the \Opt{fancyLists} option is disabled. The macro receives no +arguments. + % \end{markdown} % % \iffalse @@ -18078,16 +17940,50 @@ serialization rules. % \fi % % \begin{macrocode} -\def\markdownRendererJekyllDataEmpty{% - \markdownRendererJekyllDataEmptyPrototype}% +\def\markdownRendererOlEndTight{% + \markdownRendererOlEndTightPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq - { jekyllDataEmpty } + { olEndTight } \prop_gput:Nnn \g_@@_renderer_arities_prop - { jekyllDataEmpty } - { 1 } + { olEndTight } + { 0 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +% +%<*manual-tokens> +% \fi +% +% \begin{markdown} + +The \mdef{markdownRendererFancyOlEnd} macro represents the end of a fancy +ordered list that contains an item with several paragraphs of text (the list +is not tight). This macro will only be produced, when the \Opt{fancyLists} +option is enabled. The macro receives no arguments. + +% \end{markdown} +% +% \iffalse +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererFancyOlEnd{% + \markdownRendererFancyOlEndPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { fancyOlEnd } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { fancyOlEnd } + { 0 } \ExplSyntaxOff % \end{macrocode} % \par @@ -18095,6 +17991,18 @@ serialization rules. % \iffalse % %<*manual-tokens> +% \fi +% +% \begin{markdown} + +The \mdef{markdownRendererFancyOlEndTight} macro represents the end of a +fancy ordered list that contains no item with several paragraphs of text (the +list is tight). This macro will only be produced, when the \Opt{fancyLists} +and \Opt{tightLists} options are enabled. The macro receives no arguments. + +% \end{markdown} +% +% \iffalse ##### Plain \TeX{} Example {.unnumbered} @@ -18102,17 +18010,64 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \input markdown -\def\markdownOptionJekyllData{true} -\def\markdownRendererJekyllDataString#1#2{\gdef\name{#2}} -\def\markdownRendererJekyllDataNumber#1#2{\gdef\age{#2}} -\def\markdownRendererJekyllDataEnd{% - \name{} is \age{} years old.} +\def\markdownOptionTightLists{true} +\def\markdownOptionStartNumber{true} + +\def\markdownRendererInterblockSeparator{} +\def\markdownRendererOlBeginTight{ (} +\def\markdownRendererOlItemWithNumber#1{% + \ifnum #1=1\relax + the first + \else + \ifnum #1=2\relax + , the second + \else + , and the third + \fi + \fi +} +\def\markdownRendererOlItemEnd{} +\def\markdownRendererOlEndTight{).} + \markdownBegin ---- -name: Jane Doe -age: 99 ---- +This is a tight list + +1. item +2. item +3. item +\markdownEnd + +\def\markdownRendererInterblockSeparator{% + :\par + \def\markdownRendererInterblockSeparator{\par}% +} +\def\markdownRendererOlBegin{} +\def\markdownRendererOlItemWithNumber#1{% + #1.\kern 0.5em% + This is the + \ifnum #1=1\relax + first + \else + \ifnum #1=2\relax + second + \else + third + \fi + \fi +} +\def\markdownRendererOlItemEnd{.\par} +\def\markdownRendererOlEnd{} + +\markdownBegin +This is a loose list + +1. item + +2. item + +3. item \markdownEnd + \bye ``````` Next, invoke LuaTeX from the terminal: @@ -18122,7 +18077,15 @@ luatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> Jane Doe is 99 years old. +> This is a tight list (the first item, the second item, and the third item). +> +> This is a loose list: +> +> 1. This is the first item. +> +> 2. This is the second item. +> +> 3. This is the third item. ##### \LaTeX{} Example {.unnumbered} @@ -18130,21 +18093,65 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[jekyllData]{markdown} -\markdownSetup{ - renderers = { - jekyllDataString = {\gdef\name{#2}}, - jekyllDataNumber = {\gdef\age{#2}}, - jekyllDataEnd = {\name{} is \age{} years old.}, - } -} +\usepackage[tightLists, startNumber]{markdown} \begin{document} -\begin{markdown} ---- -name: Jane Doe -age: 99 ---- +\begin{markdown}[ + renderers = { + interblockSeparator = {}, + olBeginTight = { (}, + olItemWithNumber = {% + \ifnum #1=1\relax + the first + \else + \ifnum #1=2\relax + , the second + \else + , and the third + \fi + \fi + }, + olItemEnd = {}, + olEndTight = {).}, + }, +] +This is a tight list + +1. item +2. item +3. item +\end{markdown} + +\begin{markdown}[ + renderers = { + interblockSeparator = {% + :\par + \def\markdownRendererInterblockSeparator{\par}% + }, + olBeginTight = {\begin{enumerate}}, + olItemWithNumber = {% + \item This is the + \ifnum #1=1\relax + first + \else + \ifnum #1=2\relax + second + \else + third + \fi + \fi + }, + olItemEnd = {.}, + olEnd = {\end{enumerate}}, + }, +] +This is a loose list + +1. item + +2. item + +3. item \end{markdown} \end{document} @@ -18156,109 +18163,212 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> Jane Doe is 99 years old. - -##### \Hologo{ConTeXt} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex +> This is a tight list (the first item, the second item, and the third item). +> +> This is a loose list: +> +> 1. This is the first item. +> +> 2. This is the second item. +> +> 3. This is the third item. + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex \usemodule[t][markdown] -\setupmarkdown[jekyllData = yes] -\def\markdownRendererJekyllDataString#1#2{\gdef\name{#2}} -\def\markdownRendererJekyllDataNumber#1#2{\gdef\age{#2}} -\def\markdownRendererJekyllDataEnd{% - \name{} is \age{} years old.} +\setupmarkdown + [ + tightLists = yes, + startNumber = yes, + ] \starttext +\def\markdownRendererInterblockSeparator{} +\def\markdownRendererOlBeginTight{ (} +\def\markdownRendererOlItemWithNumber#1{% + \ifnum #1=1\relax + the first + \else + \ifnum #1=2\relax + , the second + \else + , and the third + \fi + \fi +} +\def\markdownRendererOlItemEnd{} +\def\markdownRendererOlEndTight{).} + \startmarkdown ---- -name: Jane Doe -age: 99 ---- +This is a tight list + +1. item +2. item +3. item +\stopmarkdown + +\def\markdownRendererInterblockSeparator{% + :\par + \def\markdownRendererInterblockSeparator{\par}% +} +\def\markdownRendererOlBegin{\startitemize} +\def\markdownRendererOlItemWithNumber#1{% + \sym{#1.} + This is the + \ifnum #1=1\relax + first + \else + \ifnum #1=2\relax + second + \else + third + \fi + \fi +} +\def\markdownRendererOlItemEnd{.\par} +\def\markdownRendererOlEnd{\stopitemize} + +\startmarkdown +This is a loose list + +1. item + +2. item + +3. item \stopmarkdown \stoptext ``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> Jane Doe is 99 years old. +> This is a tight list (the first item, the second item, and the third item). +> +> This is a loose list: +> +> 1. This is the first item. +> +> 2. This is the second item. +> +> 3. This is the third item. +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererFancyOlEndTight{% + \markdownRendererFancyOlEndTightPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { fancyOlEndTight } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { fancyOlEndTight } + { 0 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +% +%<*manual-tokens> % \fi % % \begin{markdown} -### Token Renderer Prototypes {#texrendererprototypes} +#### Raw Content Renderers +The \mdef{markdownRendererInputRawInline} macro represents an inline raw span. +The macro receives two arguments: the filename of a file contaning the inline +raw span contents and the raw attribute that designates the format of the +inline raw span. This macro will only be produced, when the \Opt{rawAttribute} +option is enabled. % \end{markdown} +% % \iffalse +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererInputRawInline{% + \markdownRendererInputRawInlinePrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { inputRawInline } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { inputRawInline } + { 2 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +% +%<*manual-tokens> +% \fi +% +% \begin{markdown} -By default, token renderers point to package-defined \TeX{} macros, further -referred to as *prototypes*, which provide useful default definitions. - -##### Plain \TeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\input markdown -\def\markdownRendererTildePrototype{% - Packages can specify token renderer prototypes.% -} -\markdownBegin -~ -\markdownEnd - -\def\markdownRendererTilde{% - User-defined token renderers take precedence.% -} -\markdownBegin -~ -\markdownEnd -\bye -``````` -Next, invoke LuaTeX from the terminal: -``` sh -luatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: +The \mdef{markdownRendererInputRawBlock} macro represents a raw block. The +macro receives two arguments: the filename of a file contaning the raw block +and the raw attribute that designates the format of the raw block. This macro +will only be produced, when the \Opt{rawAttribute} and \Opt{fencedCode} options +are enabled. -> Packages can specify token renderer prototypes. -> -> User-defined token renderers take precedence. +% \end{markdown} +% +% \iffalse ##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: -``` tex +```` tex \documentclass{article} -\usepackage{markdown} +\usepackage[rawAttribute, fencedCode]{markdown} +\usepackage{expl3} +\ExplSyntaxOn +\cs_new:Nn + \display_raw_content:nn + { + % If the raw attribute is TeX, execute the content as a TeX document. + \str_if_eq:nnTF + { #2 } + { tex } + { \markdownEscape { #1 } } + % Otherwise, ignore the content. + { } + } \markdownSetup{ - rendererPrototypes = { - tilde = {Packages can specify token renderer prototypes.}, + renderers = { + rawInline = { \display_raw_content:nn { #1 } { #2 } }, + rawBlock = { \display_raw_content:nn { #1 } { #2 } } }, } +\ExplSyntaxOff \begin{document} \begin{markdown} -~ -\end{markdown} +`$H_2 O$`{=tex} is a liquid. -\begin{markdown*}{ - renderers = { - tilde = {User-defined token renderers take precedence.}, - }, -} -~ -\end{markdown*} +``` {=html} +

Here is some HTML content that will be ignored.

+``` +\end{markdown} \end{document} -``````` +```` Next, invoke LuaTeX from the terminal: ``` sh lualatex document.tex @@ -18266,78 +18376,147 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> Packages can specify token renderer prototypes. -> -> User-defined token renderers take precedence. +> H~2~O is a liquid. -##### \Hologo{ConTeXt} Example {.unnumbered} +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererInputRawBlock{% + \markdownRendererInputRawBlockPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { inputRawBlock } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { inputRawBlock } + { 2 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +% +%<*manual-tokens> +% \fi +% +% \begin{markdown} -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\usemodule[t][markdown] -\def\markdownRendererTildePrototype{% - Packages can specify token renderer prototypes.% -} -\starttext -\startmarkdown -~ -\stopmarkdown +#### Section Renderers +The \mdef{markdownRendererSectionBegin} and \mdef{markdownRendererSectionEnd} +macros represent the beginning and the end of a section based on headings. -\def\markdownRendererTilde{% - User-defined token renderers take precedence.% -} -\startmarkdown -~ -\stopmarkdown -\stoptext -``````` -Next, invoke LuaTeX from the terminal: -``` sh -context document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following text: +% \end{markdown} +% +% \iffalse +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererSectionBegin{% + \markdownRendererSectionBeginPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { sectionBegin } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { sectionBegin } + { 0 } +\ExplSyntaxOff +\def\markdownRendererSectionEnd{% + \markdownRendererSectionEndPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { sectionEnd } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { sectionEnd } + { 0 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +% +%<*manual-tokens> +% \fi +% +% \begin{markdown} -> Packages can specify token renderer prototypes. -> -> User-defined token renderers take precedence. +#### Replacement Character Renderers +The \mdef{markdownRendererReplacementCharacter} macro represents the U+0000 +and U+FFFD Unicode characters. The macro receives no arguments. +% \end{markdown} +% +% \iffalse +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererReplacementCharacter{% + \markdownRendererReplacementCharacterPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { replacementCharacter } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { replacementCharacter } + { 0 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +% +%<*manual-tokens> % \fi % % \begin{markdown} -#### YAML Metadata Renderer Prototypes {#expl3yamlmetadata} +#### Special Character Renderers +The following macros replace any special plain \TeX{} characters, including +% \iffalse +the active pipe character (`|`) of \Hologo{ConTeXt}, in the input text: -By default, the renderer prototypes for YAML metadata provide a high-level -interface that can be programmed using the `markdown/jekyllData` key--values -from the l3keys module of the \LaTeX{}3 kernel. +- \mdef{markdownRendererAmpersand} replaces the ampersand (`&`). +- \mdef{markdownRendererBackslash} replaces the backslash (`\`). +- \mdef{markdownRendererCircumflex} replaces the circumflex (`^`). +- \mdef{markdownRendererDollarSign} replaces the dollar sign (`$`). +- \mdef{markdownRendererHash} replaces the hash sign (`#`). +- \mdef{markdownRendererLeftBrace} replaces the left brace (`{`). +- \mdef{markdownRendererPercentSign} replaces the percent sign (`%`). +- \mdef{markdownRendererPipe} replaces the pipe character (`|`). +- \mdef{markdownRendererRightBrace} replaces the right brace (`}`). +- \mdef{markdownRendererTilde} replaces the tilde (`~`). +- \mdef{markdownRendererUnderscore} replaces the underscore (`_`). + +% \fi +% the active pipe character (`|`) of \Hologo{ConTeXt}, in the input text. +% These macros will only be produced, when the \Opt{hybrid} option is +% `false`. % \end{markdown} +% % \iffalse ##### Plain \TeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the -following content: +following content. We will make the tilde behave as if it were written in +\TeX{}, where it represents a non-breaking space. ``` tex \input markdown -\def\markdownOptionJekyllData{true} -\ExplSyntaxOn -\keys_define:nn - { markdown/jekyllData } - { - name .code:n = { \gdef\name{#1} }, - age .code:n = { \gdef\age{#1} }, - } -\ExplSyntaxOff -\def\markdownRendererJekyllDataEnd{% - \name{} is \age{} years old.} +\def\markdownRendererTilde{~} \markdownBegin ---- -name: Jane Doe -age: 99 ---- +Bartel~Leendert van~der~Waerden \markdownEnd \bye ``````` @@ -18346,35 +18525,27 @@ Next, invoke LuaTeX from the terminal: luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the -following text: +following text, where the middot (`·`) denotes a non-breaking space: -> Jane Doe is 99 years old. +> Bartel·Leendert van·der·Waerden ##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the -following content: +following content. We will make the tilde behave as if it were written in +\TeX{}, where it represents a non-breaking space. ``` tex \documentclass{article} -\usepackage[jekyllData]{markdown} +\usepackage{markdown} \markdownSetup{ - jekyllDataRenderers = { - name = {\gdef\name{#1}}, - code = {\gdef\age{#1}}, - }, renderers = { - jekyllDataEnd = {\name{} is \age{} years old.}, - } + tilde = ~, + }, } \begin{document} - \begin{markdown} ---- -name: Jane Doe -age: 99 ---- +Bartel~Leendert van~der~Waerden \end{markdown} - \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -18382,302 +18553,219 @@ Next, invoke LuaTeX from the terminal: lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the -following text: +following text, where the middot (`·`) denotes a non-breaking space: -> Jane Doe is 99 years old. +> Bartel·Leendert van·der·Waerden ##### \Hologo{ConTeXt} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the -following content: +following content. We will make the tilde behave as if it were written in +\TeX{}, where it represents a non-breaking space. ``` tex \usemodule[t][markdown] -\setupmarkdown[jekyllData = yes] -\ExplSyntaxOn -\keys_define:nn - { markdown/jekyllData } - { - name .code:n = { \gdef\name{#1} }, - age .code:n = { \gdef\age{#1} }, - } -\ExplSyntaxOff -\def\markdownRendererJekyllDataEnd{% - \name{} is \age{} years old.} +\def\markdownRendererTilde{~} \starttext - \startmarkdown ---- -name: Jane Doe -age: 99 ---- +Bartel~Leendert van~der~Waerden \stopmarkdown - \stoptext ``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +context --luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the -following text: +following text, where the middot (`·`) denotes a non-breaking space: -> Jane Doe is 99 years old. +> Bartel·Leendert van·der·Waerden % %<*tex> % \fi +% % \begin{macrocode} +\def\markdownRendererLeftBrace{% + \markdownRendererLeftBracePrototype}% \ExplSyntaxOn -\keys_define:nn - { markdown/jekyllData } - { } +\seq_gput_right:Nn + \g_@@_renderers_seq + { leftBrace } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { leftBrace } + { 0 } \ExplSyntaxOff -% \end{macrocode} -% \begin{markdown} -% -% The following \TeX{} macros provide definitions for the token renderers (see -% Section <#sec:texrenderersuser>) that have not been redefined by the -% user. These macros are intended to be redefined by macro package authors -% who wish to provide sensible default token renderers. They are also redefined -% by the \LaTeX{} and \Hologo{ConTeXt} implementations (see sections -% <#sec:lateximplementation> and <#sec:contextimplementation>). -% -% \end{markdown} -% \begin{macrocode} +\def\markdownRendererRightBrace{% + \markdownRendererRightBracePrototype}% \ExplSyntaxOn -\cs_new:Nn \@@_plaintex_define_renderer_prototypes: - { - \seq_map_function:NN - \g_@@_renderers_seq - \@@_plaintex_define_renderer_prototype:n - \let\markdownRendererBlockHtmlCommentBeginPrototype=\iffalse - \let\markdownRendererBlockHtmlCommentBegin=\iffalse - \let\markdownRendererBlockHtmlCommentEndPrototype=\fi - \let\markdownRendererBlockHtmlCommentEnd=\fi -% \end{macrocode} -% \begin{markdown} -% -% The \mref{markdownRendererFootnote} and -% \mref{markdownRendererFootnotePrototype} macros have been deprecated -% and will be removed in Markdown 3.0.0. -% -% \end{markdown} -% \begin{macrocode} - \cs_undefine:N \markdownRendererFootnote - \cs_undefine:N \markdownRendererFootnotePrototype -% \end{macrocode} -% \begin{markdown} -% -% The \mref{markdownRendererHorizontalRule} and -% \mref{markdownRendererHorizontalRulePrototype} macros have been deprecated -% and will be removed in Markdown 3.0.0. -% -% \end{markdown} -% \begin{macrocode} - \cs_undefine:N \markdownRendererHorizontalRule - \cs_undefine:N \markdownRendererHorizontalRulePrototype - } -\cs_new:Nn \@@_plaintex_define_renderer_prototype:n - { - \@@_renderer_prototype_tl_to_csname:nN - { #1 } - \l_tmpa_tl - \prop_get:NnN - \g_@@_renderer_arities_prop - { #1 } - \l_tmpb_tl - \@@_plaintex_define_renderer_prototype:cV - { \l_tmpa_tl } - \l_tmpb_tl - } -\cs_new:Nn \@@_renderer_prototype_tl_to_csname:nN - { - \tl_set:Nn - \l_tmpa_tl - { \str_uppercase:n { #1 } } - \tl_set:Nx - #2 - { - markdownRenderer - \tl_head:f { \l_tmpa_tl } - \tl_tail:n { #1 } - Prototype - } - } -\cs_new:Nn \@@_plaintex_define_renderer_prototype:Nn - { - \cs_generate_from_arg_count:NNnn - #1 - \cs_set:Npn - { #2 } - { } - } -\cs_generate_variant:Nn - \@@_plaintex_define_renderer_prototype:Nn - { cV } -\@@_plaintex_define_renderer_prototypes: +\seq_gput_right:Nn + \g_@@_renderers_seq + { rightBrace } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { rightBrace } + { 0 } \ExplSyntaxOff -% \end{macrocode} -% \par -% \begin{markdown} -% -%### Logging Facilities -% The \mdef{markdownInfo}, \mdef{markdownWarning}, and \mdef{markdownError} -% macros perform logging for the Markdown package. Their first argument -% specifies the text of the info, warning, or error message. -% The \mref{markdownError} macro receives a second argument that provides a help -% text. You may redefine these macros to redirect and process the info, -% warning, and error messages. -% -%### Miscellanea -% The \mdef{markdownMakeOther} macro is used by the package, when a \TeX{} -% engine that does not support direct Lua access is starting to buffer a text. -% The plain \TeX{} implementation changes the category code of plain \TeX{} -% special characters to other, but there may be other active characters that -% may break the output. This macro should temporarily change the category of -% these to *other*. -% -% \end{markdown} -% \begin{macrocode} -\let\markdownMakeOther\relax -% \end{macrocode} -% \par -% \begin{markdown} -% -% The \mdef{markdownReadAndConvert} macro implements the \mref{markdownBegin} -% macro. The first argument specifies the token sequence that will terminate -% the markdown input (\mref{markdownEnd} in the instance of the \mref{markdownBegin} -% macro) when the plain \TeX{} special characters have had their category -% changed to *other*. The second argument specifies the token sequence -% that will actually be inserted into the document, when the ending token -% sequence has been found. -% -% \end{markdown} -% \begin{macrocode} -\let\markdownReadAndConvert\relax -\begingroup -% \end{macrocode} -% \begin{markdown} -% Locally swap the category code of the backslash symbol (`\`) with the pipe -% symbol (`|`). This is required in order that all the special symbols in the -% first argument of the `markdownReadAndConvert` macro have the category code -% *other*. -% -% \end{markdown} -% \begin{macrocode} - \catcode`\|=0\catcode`\\=12% - |gdef|markdownBegin{% - |markdownReadAndConvert{\markdownEnd}% - {|markdownEnd}}% -|endgroup -% \end{macrocode} -% \begin{markdown} -% The macro is exposed in the interface, so that the user can create their own -% markdown environments. Due to the way the arguments are passed to Lua (see -% Section <#sec:direct-lua>), the first argument may not contain the -% string `]]` (regardless of the category code of the bracket symbol (`]`)). -% -% The \mdef{markdownMode} macro specifies how the plain \TeX{} implementation -% interfaces with the Lua interface. The valid values and their meaning are -% as follows: -% -% - `0` – Shell escape via the 18 output file stream -% - `1` – Shell escape via the Lua `os.execute` method -% - `2` – Direct Lua access -% - `3` – The \pkg{lt3luabridge} Lua package -% -% By defining the macro, the user can coerce the package to use a specific mode. -% If the user does not define the macro prior to loading the plain \TeX{} -% implementation, the correct value will be automatically detected. The outcome -% of changing the value of \mref{markdownMode} after the implementation has been -% loaded is undefined. -% -% The \mref{markdownMode} macro has been deprecated and will be removed in -% Markdown 3.0.0. The code that corresponds to \mref{markdownMode} value of `3` -% will be the only implementation. -% -% \end{markdown} -% \begin{macrocode} +\def\markdownRendererDollarSign{% + \markdownRendererDollarSignPrototype}% \ExplSyntaxOn -\cs_if_exist:NF - \markdownMode - { - \file_if_exist:nTF - { lt3luabridge.tex } - { - \cs_new:Npn - \markdownMode - { 3 } - } - { - \cs_if_exist:NTF - \directlua - { - \cs_new:Npn - \markdownMode - { 2 } - } - { - \cs_new:Npn - \markdownMode - { 0 } - } - } - } +\seq_gput_right:Nn + \g_@@_renderers_seq + { dollarSign } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { dollarSign } + { 0 } +\ExplSyntaxOff +\def\markdownRendererPercentSign{% + \markdownRendererPercentSignPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { percentSign } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { percentSign } + { 0 } +\ExplSyntaxOff +\def\markdownRendererAmpersand{% + \markdownRendererAmpersandPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { ampersand } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { ampersand } + { 0 } +\ExplSyntaxOff +\def\markdownRendererUnderscore{% + \markdownRendererUnderscorePrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { underscore } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { underscore } + { 0 } +\ExplSyntaxOff +\def\markdownRendererHash{% + \markdownRendererHashPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { hash } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { hash } + { 0 } +\ExplSyntaxOff +\def\markdownRendererCircumflex{% + \markdownRendererCircumflexPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { circumflex } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { circumflex } + { 0 } +\ExplSyntaxOff +\def\markdownRendererBackslash{% + \markdownRendererBackslashPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { backslash } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { backslash } + { 0 } +\ExplSyntaxOff +\def\markdownRendererTilde{% + \markdownRendererTildePrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { tilde } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { tilde } + { 0 } +\ExplSyntaxOff +\def\markdownRendererPipe{% + \markdownRendererPipePrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { pipe } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { pipe } + { 0 } \ExplSyntaxOff % \end{macrocode} % \par -% \begin{markdown} -% -% The \mdef{markdownLuaRegisterIBCallback} and -% \mdef{markdownLuaUnregisterIBCallback} macros have been deprecated and will -% be removed in Markdown 3.0.0: % -% \end{markdown} -% \begin{macrocode} -\def\markdownLuaRegisterIBCallback#1{\relax}% -\def\markdownLuaUnregisterIBCallback#1{\relax}% -% \end{macrocode} % \iffalse % +%<*manual-tokens> % \fi -% \par -% \begin{markdown} -% -% \LaTeX{} Interface {#latexinterface} -%-------------------- % +% \begin{markdown} + +#### Strike-Through Renderer +The \mdef{markdownRendererStrikeThrough} macro represents a strike-through span of +text. The macro receives a single argument that corresponds to the striked-out +span of text. This macro will only be produced, when the \Opt{strikeThrough} +option is enabled. + % \end{markdown} +% % \iffalse -%<*manual-interfaces> -### \LaTeX{} +##### Plain \TeX{} Example {.unnumbered} -The \LaTeX{} interface provides the same level of functionality as the plain -\TeX{} interface by using the plain \TeX{} interface behind the scenes. Unlike -the plain \TeX{} interface, the \LaTeX{} interface uses familiar \LaTeX{} -idioms, such as package options and environments. +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\def\markdownOptionStrikeThrough{true} +\input soulutf8.sty +\def\markdownRendererStrikeThrough#1{\st{#1}} +\markdownBegin +This is ~~a lunar roving vehicle~~ strike-through text. +\markdownEnd +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: -The \LaTeX{} interface accepts the same options as the plain \TeX{} interface, -but now the options are specified as \meta{key}${}={}$\meta{value} pairs and -they are passed either as package options, in the \mref{markdownSetup} command, or -as parameters for the \envmref{markdown*} \LaTeX{} environment. +> This is ~~a lunar roving vehicle~~ strike-through text. + +##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage{markdown} +\usepackage[strikeThrough]{markdown} +\usepackage{soulutf8} +\markdownSetup{ + renderers = { + strikeThrough = {\st{#1}}, + }, +} \begin{document} - \begin{markdown} -$\sqrt{-1}$ *equals* $i$ +This is ~~a lunar roving vehicle~~ strike-through text. \end{markdown} - -\begin{markdown*}{hybrid} -$\sqrt{-1}$ *equals* $i$ -\end{markdown*} - \end{document} ``````` Next, invoke LuaTeX from the terminal: @@ -18687,666 +18775,408 @@ lualatex document.tex A PDF document named `document.pdf` should be produced and contain the following text: -> \$\\sqrt{-1}\$ *equals* \$i\$. -> -> 1 -> *equals* -> i. +> This is ~~a lunar roving vehicle~~ strike-through text. -Invoking pdfTeX should have the same effect: +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\setupmarkdown[strikeThrough = yes] +\def\markdownRendererStrikeThrough#1{\overstrikes{#1}} +\starttext +\startmarkdown +This is ~~a lunar roving vehicle~~ strike-through text. +\stopmarkdown +\stoptext +``````` +Next, invoke LuaTeX from the terminal: ``` sh -pdflatex --shell-escape document.tex +context --luatex document.tex `````` +A PDF document named `document.pdf` should be produced and contain the +following text: -% -%<*latex> +> This is ~~a lunar roving vehicle~~ strike-through text. + +% +%<*tex> % \fi -% \begin{markdown} -% -% The \LaTeX{} interface provides \LaTeX{} environments for the typesetting of -% markdown input from within \LaTeX{}, facilities for setting Lua, plain \TeX, -% and \LaTeX{} options used during the conversion from markdown to plain -% \TeX{}, and facilities for changing the way markdown tokens are rendered. The -% rest of the interface is inherited from the plain \TeX{} interface (see -% Section <#sec:texinterface>). -% -% The \LaTeX{} implementation redefines the plain \TeX{} logging macros (see -% Section <#sec:tex-interface-logging>) to use the \LaTeX{} `\PackageInfo`, -% `\PackageWarning`, and `\PackageError` macros. -% -% \end{markdown} -% \begin{macrocode} -\newcommand\markdownInfo[1]{\PackageInfo{markdown}{#1}}% -\newcommand\markdownWarning[1]{\PackageWarning{markdown}{#1}}% -\newcommand\markdownError[2]{\PackageError{markdown}{#1}{#2.}}% -\input markdown/markdown -% \end{macrocode} -% \begin{markdown} -% -% The \LaTeX{} interface is implemented by the `markdown.sty` file, which -% can be loaded from the \LaTeX{} document preamble as follows: -% \end{markdown} -% \begin{Verbatim}[commandchars=\\\{\},gobble=2] -% \textbackslash{}usepackage[\textrm{\meta{options}}]\{markdown\} -% \end{Verbatim} -% \begin{markdown} -% where \meta{options} are the \LaTeX{} interface options (see Section -% <#sec:latex-options>). Note that \meta{options} inside the `\usepackage` -% macro may not set the `markdownRenderers` (see Section -% <#sec:latex-renderers>) and `markdownRendererPrototypes` (see Section -% <#sec:latex-renderer-prototypes>) keys. Furthermore, although the -% base variant of the `import` key that loads a single \LaTeX{} theme -% (see Section <#sec:latexthemes>) can be used, the extended variant -% that can load multiple themes and import snippets from them (see -% Section <#sec:latexsnippets>). This limitation is due to the way -% \Hologo{LaTeX2e} parses package options. -% -% \end{markdown} -% \par -% \begin{markdown} -% -%### Typesetting Markdown -% The interface exposes the \envmdef{markdown} and \envmdef{markdown*} -% \LaTeX{} environments, and redefines the \mref{markdownInput} command. -% -% The \envmref{markdown} and \envmref{markdown*} \LaTeX{} environments are used to -% typeset markdown document fragments. The starred version of the -% \envmref{markdown} environment accepts \LaTeX{} interface options (see -% Section <#sec:latex-options>) as its only argument. These options will -% only influence this markdown document fragment. -% -% \end{markdown} -% \begin{macrocode} -\newenvironment{markdown}\relax\relax -\newenvironment{markdown*}[1]\relax\relax -% \end{macrocode} -% \markdownBegin -% -% You may prepend your own code to the \mdef{markdown} macro and append your own -% code to the \mdef{endmarkdown} macro to produce special effects before and after -% the \envmref{markdown} \LaTeX{} environment (and likewise for the starred -% version). -% -% Note that the \envmref{markdown} and \envmref{markdown*} \LaTeX{} environments are -% subject to the same limitations as the \mref{markdownBegin} and \mref{markdownEnd} -% macros exposed by the plain \TeX{} interface. -% -% The following example \LaTeX{} code showcases the usage of the -% \envmref{markdown} and \envmref{markdown*} environments: -% ``` tex -% \documentclass{article} \documentclass{article} -% \usepackage{markdown} \usepackage{markdown} -% \begin{document} \begin{document} -% \% ... \% ... -% \begin{markdown} \begin{markdown*}{smartEllipses} -% _Hello_ **world** ... _Hello_ **world** ... -% \end{markdown} \end{markdown*} -% \% ... \% ... -% \end{document} \end{document} -% ``````` -% -% The \mref{markdownInput} macro accepts a single mandatory parameter containing -% the filename of a markdown document and expands to the result of the -% conversion of the input markdown document to plain \TeX{}. Unlike the -% \mref{markdownInput} macro provided by the plain \TeX{} interface, this macro -% also accepts \LaTeX{} interface options (see Section <#sec:latex-options>) -% as its optional argument. These options will only influnce this markdown -% document. -% -% The following example \LaTeX{} code showcases the usage of the -% \mref{markdownInput} macro: -% ``` tex -% \documentclass{article} -% \usepackage{markdown} -% \begin{document} -% % ... -% \markdownInput[smartEllipses]{hello.md} -% % ... -% \end{document} -% ``````` -% -%### Options {#latex-options} -% -% The \LaTeX{} options are represented by a comma-delimited list of -% \meta{key}`=`\meta{value} pairs. For boolean options, the `=`\meta{value} -% part is optional, and \meta{key} will be interpreted as \meta{key}`=true` -% if the `=`\meta{value} part has been omitted. -% -% Except for the `plain` option described in Section <#sec:latexplain>, and -% the \LaTeX{} themes described in Section <#sec:latexthemes>, and the -% \LaTeX{} snippets described in Section <#sec:latex-setup-snippets>, -% \LaTeX{} options map directly to the options recognized by the plain -% \TeX{} interface (see Section <#sec:tex-options>) and to the markdown token -% renderers and their prototypes recognized by the plain \TeX{} interface (see -% Sections <#sec:texrenderersuser> and <#sec:texrendererprototypes>). -% -% The \LaTeX{} options may be specified when loading the \LaTeX{} package, when -% using the \envmref{markdown*} \LaTeX{} environment or the \mref{markdownInput} -% macro (see Section <#sec:latexinterface>), or via the \mdef{markdownSetup} -% macro. The \mref{markdownSetup} macro receives the options to set up as its only -% argument: % -% \markdownEnd % \begin{macrocode} +\def\markdownRendererStrikeThrough{% + \markdownRendererStrikeThroughPrototype}% \ExplSyntaxOn -\cs_new:Nn - \@@_setup:n - { - \keys_set:nn - { markdown/latex-options } - { #1 } - } -\let\markdownSetup=\@@_setup:n +\seq_gput_right:Nn + \g_@@_renderers_seq + { strikeThrough } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { strikeThrough } + { 1 } \ExplSyntaxOff % \end{macrocode} -% \begin{markdown} -% -%#### \LaTeX{} snippets {#latex-setup-snippets} +% \par % -% We may also set up \LaTeX{} options as *snippets* using the -% \mdef{markdownSetupSnippet} macro and invoke them later. The -% \mref{markdownSetupSnippet} macro receives two arguments: the name -% of the snippet and the options to store: +% \iffalse +% +%<*manual-tokens> +% \fi % -% \end{markdown} -% \begin{macrocode} -\ExplSyntaxOn -\cs_new:Nn - \@@_latex_setup_snippet:nn - { - \markdownIfSnippetExists - { #1 } - { - \markdownWarning - {Redefined~snippet~\markdownLaTeXThemeName#1} - \csname markdownLaTeXSetupSnippet% - \markdownLaTeXThemeName#1\endcsname={#2} - } - { - \newtoks\next - \next={#2} - \expandafter\let\csname markdownLaTeXSetupSnippet% - \markdownLaTeXThemeName#1\endcsname=\next - } - } -\let\markdownSetupSnippet=\@@_latex_setup_snippet:nn -\ExplSyntaxOff -% \end{macrocode} % \begin{markdown} -% -% To decide whether a snippet exists, we can use the -% \mdef{markdownIfSnippetExists} macro: -% + +#### Subscript Renderer +The \mdef{markdownRendererSubscript} macro represents a subscript span of +text. The macro receives a single argument that corresponds to the subscript +span of text. This macro will only be produced, when the \Opt{subscripts} +option is enabled. + % \end{markdown} -% \begin{macrocode} -\newcommand\markdownIfSnippetExists[3]{% - \@ifundefined - {markdownLaTeXSetupSnippet\markdownLaTeXThemeName#1}% - {#3}{#2}}% -% \end{macrocode} -% \begin{markdown} -% -% See Section <#sec:latexthemes> for information on interactions between -% snippets and \LaTeX{} themes. See Section <#sec:latexsnippets> -% for information about invoking the set-up snippets. % -% \end{markdown} % \iffalse -% -%<*manual-options> -### \LaTeX{} +##### Plain \TeX{} Example {.unnumbered} -\LaTeX{} options allow us to disable the redefinition of the default renderer -prototypes from plain \TeX{}, load user-defined themes, and invoke user-defined -set-up snippets. +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\def\markdownOptionSubscripts{true} +\def\markdownRendererSubscript#1{ (#1 moles) and } +\markdownBegin +H~2~O is a liquid. +\markdownEnd +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: -#### Setting Lua and plain \TeX{} options from \LaTeX{} +> H (2 moles) and O is a liquid. -As a rule of thumb, we can set all Lua options directly from \LaTeX{}. For -example, to set the \Opt{taskLists} Lua option to `true`, we would include the -following code in our \LaTeX{} document: +##### \LaTeX{} Example {.unnumbered} +Using a text editor, create a text document named `document.tex` with the +following content: ``` tex +\documentclass{article} +\usepackage[subscripts]{markdown} \markdownSetup{ - taskLists = true, + renderers = { + subscript = { (#1 moles) and }, + }, } -``` +\begin{document} +\begin{markdown} +H~2~O is a liquid. +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: -We can also set all plain \TeX{} options directly from \LaTeX{}. For example, -to set the `\markdownOptionHelperScriptFileName` plain \TeX{} option to -`helper-script.lua`, we would inclde the following code in our \LaTeX{} -document: +> H (2 moles) and O is a liquid. -``` tex -\markdownSetup{ - helperScriptFileName = helper-script.lua, -} -``` +##### \Hologo{ConTeXt} Example {.unnumbered} -% -%<*latex> -% \fi -% \par -% \begin{markdown} -% -% To enable the enumeration of \LaTeX{} options, we will maintain the -% \mdef{g_\@\@_latex_options_seq} sequence. -% -% \end{markdown} -% \begin{macrocode} -\ExplSyntaxOn -\seq_new:N \g_@@_latex_options_seq -% \end{macrocode} -% \begin{markdown} -% -% To enable the reflection of default \LaTeX{} options and their types, we -% will maintain the \mdef{g_\@\@_default_latex_options_prop} and -% \mdef{g_\@\@_latex_option_types_prop} property lists, respectively. +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\setupmarkdown[subscripts = yes] +\def\markdownRendererSubscript#1{ (#1 moles) and } +\starttext +\startmarkdown +H~2~O is a liquid. +\stopmarkdown +\stoptext +``````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> H (2 moles) and O is a liquid. + +% +%<*tex> +% \fi % -% \end{markdown} % \begin{macrocode} -\prop_new:N \g_@@_latex_option_types_prop -\prop_new:N \g_@@_default_latex_options_prop -\tl_const:Nn \c_@@_option_layer_latex_tl { latex } -\seq_gput_right:NV \g_@@_option_layers_seq \c_@@_option_layer_latex_tl -\cs_new:Nn - \@@_add_latex_option:nnn - { - \@@_add_option:Vnnn - \c_@@_option_layer_latex_tl - { #1 } - { #2 } - { #3 } - } +\def\markdownRendererSubscript{% + \markdownRendererSubscriptPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { subscript } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { subscript } + { 1 } % \end{macrocode} +% \par +% % \iffalse -% -%<*manual-options> +% +%<*manual-tokens> % \fi +% % \begin{markdown} -#### No default token renderer prototypes {#latexplain} +#### Superscript Renderer +The \mdef{markdownRendererSuperscript} macro represents a superscript span of +text. The macro receives a single argument that corresponds to the superscript +span of text. This macro will only be produced, when the \Opt{superscripts} +option is enabled. + +% \end{markdown} +% +% \iffalse -Default token renderer prototypes require \LaTeX{} packages that may clash with -other packages used in a document. Additionally, if we redefine token -renderers and renderer prototypes ourselves, the default definitions will bring -no benefit to us. Using the `plain` package option, we can keep the default -definitions from the plain \TeX{} implementation -% (see Section <#sec:tex-token-renderer-prototypes>) -and prevent the soft \LaTeX{} prerequisites -% in Section <#sec:latex-prerequisites> -from being loaded: The plain option must be set before or when loading the -package. Setting the option after loading the package will have no effect. +##### Plain \TeX{} Example {.unnumbered} +Using a text editor, create a text document named `document.tex` with the +following content: ``` tex -\usepackage[plain]{markdown} +\input markdown +\def\markdownOptionSuperscripts{true} +\def\markdownRendererSuperscript#1{ taken to the power of #1} +\markdownBegin +2^10^ is 1024. +\markdownEnd +\bye ``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: -% \end{markdown} -% \iffalse -% -%<*latex> -% \fi -% \begin{macrocode} -\@@_add_latex_option:nnn - { plain } - { boolean } - { false } -\ExplSyntaxOff -% \end{macrocode} -% \iffalse -% -%<*manual-options> -% \fi -% \begin{markdown} - -#### \LaTeX{} themes {#latexthemes} +> 2 taken to the power of 10 is 1024. -User-defined \LaTeX{} themes for the Markdown package provide a domain-specific -interpretation of Markdown tokens. Similarly to \LaTeX{} packages, themes -allow the authors to achieve a specific look and other high-level goals -without low-level programming. +##### \LaTeX{} Example {.unnumbered} -% The \LaTeX{} option `import`=\meta{theme name} loads a \LaTeX{} package -% (further referred to as *a theme*) named `markdowntheme`\meta{munged theme -% name}`.sty`, where the *munged theme name* is the *theme name* after the -% substitution of all forward slashes (`/`) for an underscore (`_`), the theme -% *name* is *qualified* and contains no underscores, and a value is qualified -% if and only if it contains at least one forward slash. Themes are inspired -% by the Beamer \LaTeX{} package, which provides similar functionality with -% its `\usetheme` macro [@tantau21, Section 15.1]. -% -% Theme names must be qualified to minimize naming conflicts between different -% themes intended for a single \LaTeX{} document class or for a single \LaTeX{} -% package. The preferred format of a theme name is \meta{theme author}`/`\meta{target \LaTeX{} document class or package}`/`\meta{private naming -% scheme}, where the *private naming scheme* may contain additional forward -% slashes. For example, a theme by a user `witiko` for the MU theme of the -% Beamer document class may have the name `witiko/beamer/MU`. -% -% Theme names are munged, because \LaTeX{} packages are identified only by -% their filenames, not by their pathnames. [@novotny21] Therefore, we can't -% store the qualified theme names directly using directories, but we must -% encode the individual segments of the qualified theme in the filename. For -% example, loading a theme named `witiko/beamer/MU` would load a \LaTeX{} -% package named `markdownthemewitiko_beamer_MU.sty`. -% -% If the \LaTeX{} option with key `theme` is (repeatedly) specified in the -% `\usepackage` macro, the loading of the theme(s) will be postponed in -% first-in-first-out order until after the Markdown \LaTeX{} package has been -% loaded. Otherwise, the theme(s) will be loaded immediately. For example, -% there is a theme named `witiko/dot`, which typesets fenced code blocks with -% the `dot` infostring as images of directed graphs rendered by the Graphviz -% tools. The following code would first load the Markdown package, then the -% `markdownthemewitiko_beamer_MU.sty` \LaTeX{} package, and finally the -% `markdownthemewitiko_dot.sty` \LaTeX{} package: -% \end{markdown} -% \iffalse +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[superscripts]{markdown} +\markdownSetup{ + renderers = { + superscript = { taken to the power of #1}, + }, +} +\begin{document} +\begin{markdown} +2^10^ is 1024. +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: -For example, to load themes named `witiko/beamer/MU` and `witiko/dot`, you -would use the following code in the preamble of your document: +> 2 taken to the power of 10 is 1024. -% \fi -% \par -% \begin{markdown} +##### \Hologo{ConTeXt} Example {.unnumbered} +Using a text editor, create a text document named `document.tex` with the +following content: ``` tex -\usepackage[ - import=witiko/beamer/MU, - import=witiko/dot, -]{markdown} +\usemodule[t][markdown] +\setupmarkdown[superscripts = yes] +\def\markdownRendererSuperscript#1{ taken to the power of #1} +\starttext +\startmarkdown +2^10^ is 1024. +\stopmarkdown +\stoptext ``````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: -% \end{markdown} -% \iffalse -% -%<*latex> +> 2 taken to the power of 10 is 1024. + +% +%<*tex> % \fi -% \begin{macrocode} -\newif\ifmarkdownLaTeXLoaded - \markdownLaTeXLoadedfalse -\AtEndOfPackage{\markdownLaTeXLoadedtrue} -\ExplSyntaxOn -\tl_new:N \markdownLaTeXThemePackageName -\cs_new:Nn - \@@_set_latex_theme:n - { - \str_if_in:nnF - { #1 } - { / } - { - \markdownError - { Won't~load~theme~with~unqualified~name~#1 } - { Theme~names~must~contain~at~least~one~forward~slash } - } - \str_if_in:nnT - { #1 } - { _ } - { - \markdownError - { Won't~load~theme~with~an~underscore~in~its~name~#1 } - { Theme~names~must~not~contain~underscores~in~their~names } - } - \tl_set:Nn \markdownLaTeXThemePackageName { #1 } - \str_replace_all:Nnn - \markdownLaTeXThemePackageName - { / } - { _ } - \edef\markdownLaTeXThemePackageName{ - markdowntheme\markdownLaTeXThemePackageName} - \expandafter\markdownLaTeXThemeLoad\expandafter{ - \markdownLaTeXThemePackageName}{#1/} - } -\keys_define:nn - { markdown/latex-options } - { - import .code:n = { - \tl_set:Nn - \l_tmpa_tl - { #1 } -% \end{macrocode} -% \begin{markdown} -% -% To ensure that keys containing forward slashes get passed correctly, we -% replace all forward slashes in the input with backslash tokens with category -% code letter and then undo the replacement. This means that if any unbraced -% backslash tokens with category code letter exist in the input, they will be -% replaced with forward slashes. However, this should be extremely rare. -% -% \end{markdown} -% \begin{macrocode} - \tl_replace_all:NnV - \l_tmpa_tl - { / } - \c_backslash_str - \keys_set:nV - { markdown/latex-options/import } - \l_tmpa_tl - }, - } -\cs_generate_variant:Nn - \tl_replace_all:Nnn - { NnV } -% \end{macrocode} -% \begin{markdown} % -% The \LaTeX{} option `theme` has been deprecated and will be removed in -% Markdown 3.0.0. -% -% \end{markdown} % \begin{macrocode} -\keys_define:nn - { markdown/latex-options } - { - theme .code:n = { \@@_set_latex_theme:n { #1 } }, - } +\def\markdownRendererSuperscript{% + \markdownRendererSuperscriptPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { superscript } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { superscript } + { 1 } \ExplSyntaxOff % \end{macrocode} -% \begin{markdown} -% -% The \LaTeX{} themes have a useful synergy with snippets (see Section -% <#sec:latex-setup-snippets>): To make it less likely that different themes -% will set up snippets with the same name, we will prepend \meta{theme -% name}`/` before the snippet name and use the result as the snippet name. -% For example, if the `witiko/dot` theme sets up the `product` snippet, the -% snippet will be available under the name `witiko/dot/product`. +% \par % -% \end{markdown} % \iffalse -% -%<*manual-options> +% +%<*manual-tokens> % \fi +% % \begin{markdown} -Due to limitations of \LaTeX{}, themes may not be loaded after the -beginning of a \LaTeX{} document. +#### Table Attribute Context Renderers +The following macros are only produced, when the \Opt{tableCaptions} and +\Opt{tableAttributes} options are enabled. + +The \mdef{markdownRendererTableAttributeContextBegin} and +\mdef{markdownRendererTableAttributeContextEnd} macros represent the +beginning and the end of a context in which the attributes of a table +apply. The macros receive no arguments. % \end{markdown} +% % \iffalse -% -%<*latex> -% \fi -% \begin{macrocode} -\ExplSyntaxOn -\@onlypreamble - \@@_set_latex_theme:n -\ExplSyntaxOff -% \end{macrocode} -% \iffalse -% -%<*manual-options> -% \fi -% \par -% \markdownBegin -Example themes provided with the Markdown package include: - -\pkg{witiko/dot} - -: A theme that typesets fenced code blocks with the `dot …` infostring - as images of directed graphs rendered by the Graphviz tools. The - right tail of the infostring is used as the image title. -% ```` tex -% \documentclass{article} -% \usepackage[import=witiko/dot]{markdown} -% \setkeys{Gin}{ -% width = \columnwidth, -% height = 0.65\paperheight, -% keepaspectratio} -% \begin{document} -% \begin{markdown} -% ``` dot Various formats of mathemathical formulae -% digraph tree { -% margin = 0; -% rankdir = "LR"; -% -% latex -> pmml; -% latex -> cmml; -% pmml -> slt; -% cmml -> opt; -% cmml -> prefix; -% cmml -> infix; -% pmml -> mterms [style=dashed]; -% cmml -> mterms; -% -% latex [label = "LaTeX"]; -% pmml [label = "Presentation MathML"]; -% cmml [label = "Content MathML"]; -% slt [label = "Symbol Layout Tree"]; -% opt [label = "Operator Tree"]; -% prefix [label = "Prefix"]; -% infix [label = "Infix"]; -% mterms [label = "M-Terms"]; -% } -% ``` -% \end{markdown} -% \end{document} -% ```````` -% Typesetting the above document produces the output shown in -% Figure <#fig:witiko/dot>. -% ``` dot Various formats of mathemathical formulae \label{fig:witiko/dot} -% digraph tree { -% margin = 0; -% rankdir = "LR"; -% -% latex -> pmml; -% latex -> cmml; -% pmml -> slt; -% cmml -> opt; -% cmml -> prefix; -% cmml -> infix; -% pmml -> mterms [style=dashed]; -% cmml -> mterms; -% -% latex [label = "LaTeX"]; -% pmml [label = "Presentation MathML"]; -% cmml [label = "Content MathML"]; -% slt [label = "Symbol Layout Tree"]; -% opt [label = "Operator Tree"]; -% prefix [label = "Prefix"]; -% infix [label = "Infix"]; -% mterms [label = "M-Terms"]; -% } -% ``` - The theme requires a Unix-like operating system with GNU Diffutils and - Graphviz installed. The theme also requires shell access unless the - \Opt{frozenCache} plain \TeX{} option is enabled. - -% \markdownEnd -% \iffalse - -##### \LaTeX{} Example {.unnumbered} +##### \LaTeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: -```` tex +``` tex \documentclass{article} -\usepackage[import=witiko/dot]{markdown} -\setkeys{Gin}{ - width=\columnwidth, - height=0.65\paperheight, - keepaspectratio} +\usepackage[ + pipeTables, + tableCaptions, + tableAttributes, + relativeReferences, +]{markdown} +\usepackage{expl3} +\ExplSyntaxOn +\markdownSetup{ + renderers = { + tableAttributeContextBegin = { + \group_begin: + \markdownSetup{ + renderers = { + attributeIdentifier = { + \markdownSetup{ + renderers = { + tableAttributeContextEnd = { + \label{##1} + \group_end: + }, + }, + } + }, + }, + } + }, + tableAttributeContextEnd = { + \group_end: + }, + }, +} +\ExplSyntaxOff \begin{document} \begin{markdown} -``` dot Various formats of mathemathical formulae -digraph tree { - margin = 0; - rankdir = "LR"; +See Table <#example-table>. - latex -> pmml; - latex -> cmml; - pmml -> slt; - cmml -> opt; - cmml -> prefix; - cmml -> infix; - pmml -> mterms [style=dashed]; - cmml -> mterms; +| Right | Left | Default | Center | +|------:|:-----|---------|:------:| +| 12 | 12 | 12 | 12 | +| 123 | 123 | 123 | 123 | +| 1 | 1 | 1 | 1 | - latex [label = "LaTeX"]; - pmml [label = "Presentation MathML"]; - cmml [label = "Content MathML"]; - slt [label = "Symbol Layout Tree"]; - opt [label = "Operator Tree"]; - prefix [label = "Prefix"]; - infix [label = "Infix"]; - mterms [label = "M-Terms"]; -} -``` + : Demonstration of pipe table syntax. {#example-table} \end{markdown} \end{document} -```````` +``````` Next, invoke LuaTeX from the terminal: ``` sh lualatex document.tex `````` -A PDF document named `document.pdf` should be produced and contain -a drawing of a directed graph similar to Figure 1 from the following -conference article: +A PDF document named `document.pdf` should be produced and contain the +following text: -> NOVOTNÝ, Vít, Petr SOJKA, Michal ŠTEFÁNIK and Dávid LUPTÁK. Three is Better -> than One: Ensembling Math Information Retrieval Systems. *CEUR Workshop -> Proceedings*. Thessaloniki, Greece: M. Jeusfeld c/o Redaktion Sun SITE, -> Informatik V, RWTH Aachen., 2020, vol. 2020, No 2696, p. 1-30. ISSN 1613-0073. -> +> See Table 1. +> +> | Right | Left | Default | Center | +> |------:|:-----|---------|:------:| +> | 12 | 12 | 12 | 12 | +> | 123 | 123 | 123 | 123 | +> | 1 | 1 | 1 | 1 | +> +> : Table 1. Demonstration of pipe table syntax. -% -%<*latex-themes-witiko-dot> +% +%<*tex> % \fi +% % \begin{macrocode} -\ProvidesPackage{markdownthemewitiko_dot}[2021/03/09]% +\def\markdownRendererTableAttributeContextBegin{% + \markdownRendererTableAttributeContextBeginPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { tableAttributeContextBegin } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { tableAttributeContextBegin } + { 0 } +\ExplSyntaxOff +\def\markdownRendererTableAttributeContextEnd{% + \markdownRendererTableAttributeContextEndPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { tableAttributeContextEnd } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { tableAttributeContextEnd } + { 0 } +\ExplSyntaxOff % \end{macrocode} +% \par +% % \iffalse -% -%<*manual-options> +% +%<*manual-tokens> % \fi -% \par -% \markdownBegin +% +% \begin{markdown} -\pkg{witiko/graphicx/http} +#### Table Renderer +The \mdef{markdownRendererTable} macro represents a table. This macro will only +be produced, when the \Opt{pipeTables} option is enabled. The macro receives the +parameters `{`\meta{caption}`}{`\meta{number of rows}`}{`\meta{number of columns}`}` +followed by `{`\meta{alignments}`}` and then by `{`\meta{row}`}` repeated +\meta{number of rows} times, where \meta{row} is `{`\meta{column}`}` repeated +\meta{number of columns} times, \meta{alignments} is \meta{alignment} repeated +\meta{number of columns} times, and \meta{alignment} is one of the following: -: A theme that adds support for downloading images whose URL has the - http or https protocol. -% ``` tex -% \documentclass{article} -% \usepackage[import=witiko/graphicx/http]{markdown} -% \begin{document} -% \begin{markdown} -% ![img](https://github.com/witiko/markdown/raw/main/markdown.png -% "The banner of the Markdown package") -% \end{markdown} -% \end{document} -% ``````` -% Typesetting the above document produces the output shown in -% Figure <#fig:witiko/graphicx/http>. -% ![img](https://github.com/witiko/markdown/raw/main/markdown.png -% "The banner of the Markdown package \label{fig:witiko/graphicx/http}") - The theme requires the \pkg{catchfile} \LaTeX{} package and a Unix-like - operating system with GNU Coreutils `md5sum` and either GNU Wget or cURL - installed. The theme also requires shell access unless the - \Opt{frozenCache} plain \TeX{} option is enabled. +- `d` -- The corresponding column has an unspecified (default) alignment. +- `l` -- The corresponding column is left-aligned. +- `c` -- The corresponding column is centered. +- `r` -- The corresponding column is right-aligned. -% \markdownEnd +% \end{markdown} +% % \iffalse ##### \LaTeX{} Example {.unnumbered} @@ -19355,66 +19185,60 @@ Using a text editor, create a text document named `document.tex` with the following content: ``` tex \documentclass{article} -\usepackage[import=witiko/graphicx/http]{markdown} -\begin{document} -\begin{markdown} -![img](https://github.com/witiko/markdown/raw/main/markdown.png - "The banner of the Markdown package") -\end{markdown} -\end{document} -``````` -Next, invoke LuaTeX from the terminal: -``` sh -lualatex document.tex -`````` -A PDF document named `document.pdf` should be produced and contain the -following image: - -> ![img](https://github.com/witiko/markdown/raw/main/markdown.png -> "The banner of the Markdown package") - -% -%<*latex-themes-witiko-graphicx-http> -% \fi -% \begin{macrocode} -\ProvidesPackage{markdownthemewitiko_graphicx_http}[2021/03/22]% -% \end{macrocode} -% \iffalse -% -%<*manual-options> -% \fi -% \par -% \markdownBegin - -\pkg{witiko/tilde} - -: A theme that makes tilde (`~`) always typeset the non-breaking space even - when the \Opt{hybrid} Lua option is disabled. -% ``` tex -% \documentclass{article} -% \usepackage[import=witiko/tilde]{markdown} -% \begin{document} -% \begin{markdown} -% Bartel~Leendert van~der~Waerden -% \end{markdown} -% \end{document} -% ``````` -% Typesetting the above document produces the following text: -% “Bartel~Leendert van~der~Waerden”. -% -% \markdownEnd -% \iffalse - -##### \LaTeX{} Example {.unnumbered} - -Using a text editor, create a text document named `document.tex` with the -following content: -``` tex -\documentclass{article} -\usepackage[import=witiko/tilde]{markdown} +\usepackage[pipeTables, tableCaptions]{markdown} +\newcount\rowCounter +\newcount\columnCounter +\makeatletter +\def\processRow#1{% + \columnCounter=1% + \ifnum\rowCounter=0\relax + As for the alignment, + \else + In row \the\rowCounter, + \fi + \processColumn#1 + \advance\rowCounter by 1\relax + \ifnum\rowCounter>\rowTotal\relax + \expandafter\@gobble + \fi\processRow}% +\def\processColumn#1{% + column number \the\columnCounter{} + \ifnum\rowCounter=0\relax + \if#1d{}has default alignment\fi + \if#1l{}is left-aligned\fi + \if#1c{}is centered\fi + \if#1r{}is right-aligned\fi + \else + says \emph{#1}% + \fi + \advance\columnCounter by 1\relax + \ifnum\columnCounter<\columnTotal\relax, \fi + \ifnum\columnCounter=\columnTotal\relax, and \fi + \ifnum\columnCounter>\columnTotal\relax + .\expandafter\@gobble + \fi\processColumn}% +\makeatother +\markdownSetup{ + renderers = { + table = {% + This is a table with caption \emph{#1} that is #3 colums wide + and #2 rows long. + \rowCounter=0% + \def\rowTotal{#2}% + \def\columnTotal{#3}% + \processRow + }, + }, +} \begin{document} \begin{markdown} -Bartel~Leendert van~der~Waerden +| Right | Left | Default | Center | +|------:|:-----|---------|:------:| +| 12 | 12 | 12 | 12 | +| 123 | 123 | 123 | 123 | +| 1 | 1 | 1 | 1 | + + : Demonstration of pipe table syntax \end{markdown} \end{document} ``````` @@ -19423,1539 +19247,3082 @@ Next, invoke LuaTeX from the terminal: lualatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the -following text, where the middot (`·`) denotes a non-breaking space: +following text: -> Bartel·Leendert van·der·Waerden +> This is a table with caption *Demonstration of pipe table syntax* that is 4 +> colums wide and 4 rows long. As for the alignment, column number 1 is +> right-aligned, column number 2 is left-aligned, column number 3 has default +> alignment, and column number 4 is centered. In row 1, column number 1 says +> *Right*, column number 2 says *Left*, column number 3 says *Default*, and +> column number 4 says *Center*. In row 2, column number 1 says *12*, column +> number 2 says *12*, column number 3 says *12*, and column number 4 says *12*. +> In row 3, column number 1 says *123*, column number 2 says *123*, column +> number 3 says *123*, and column number 4 says *123*. In row 4, column number +> 1 says *1*, column number 2 says *1*, column number 3 says *1*, and column +> number 4 says *1*. -% -%<*latex-themes-witiko-tilde> + +% +%<*tex> % \fi +% % \begin{macrocode} -\ProvidesPackage{markdownthemewitiko_tilde}[2021/03/22]% +\def\markdownRendererTable{% + \markdownRendererTablePrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { table } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { table } + { 3 } +\ExplSyntaxOff % \end{macrocode} -% \iffalse -% -%<*manual-options> -% \fi % \par -% \begin{markdown} % -% Please, see Section <#sec:latex-themes-implementation> for implementation -% details of the example themes. - -#### \LaTeX{} snippets {#latexsnippets} - -% \end{markdown} % \iffalse - -User-defined \LaTeX{} themes provide global control over high-level goals. -However, it is often desirable to change only some local aspects of a document. -\LaTeX{} snippets provide syntactic sugar for defining and invoking various -options locally. - +% +%<*manual-tokens> % \fi +% % \begin{markdown} -% The \LaTeX{} option with key `snippet` invokes a snippet named \meta{value}: + +#### \TeX{} Math Renderers +The \mdef{markdownRendererInlineMath} and \mdef{markdownRendererDisplayMath} macros +represent inline and display \TeX{} math. +Both macros receive a single argument that corresponds to the \TeX{} math content. +These macros will only be produced, when the \Opt{texMathDollars}, +\Opt{texMathSingleBackslash}, or \Opt{texMathDoubleBackslash} option are enabled. + % \end{markdown} +% % \iffalse -% -%<*latex> -% \fi -% \begin{macrocode} -\ExplSyntaxOn -\keys_define:nn - { markdown/latex-options } - { - snippet .code:n = { - \markdownIfSnippetExists{#1} - { - \expandafter\markdownSetup\expandafter{ - \the\csname markdownLaTeXSetupSnippet - \markdownLaTeXThemeName#1\endcsname} - }{ - \markdownError - {Can't~invoke~setup~snippet~#1} - {The~setup~snippet~is~undefined} - } - } - } -\ExplSyntaxOff -% \end{macrocode} -% \iffalse -% -%<*manual-options> -% \fi -% \par -% \markdownBegin -Here is how we can use snippets to store options and invoke them later: +##### Plain \TeX{} Example {.unnumbered} +Using a text editor, create a text document named `document.tex` with the +following content: ``` tex -\markdownSetupSnippet{romanNumerals}{ - renderers = { - olItemWithNumber = {% - \item[\romannumeral#1\relax.]% - }, - }, -} -\begin{markdown} - -The following ordered list will be preceded by arabic numerals: - -1. wahid -2. aithnayn - -\end{markdown} -\begin{markdown*}{snippet=romanNumerals} - -The following ordered list will be preceded by roman numerals: - -3. tres -4. quattuor +\input markdown +\def\markdownOptionTexMathDollars{true} +\def\markdownRendererInlineMath#1{$#1\dots$} +\def\markdownRendererDisplayMath#1{$$#1\eqno(1)$$} +\markdownBegin +$E=mc^2$ -\end{markdown*} +$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ +\markdownEnd +\bye ``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: -If the `romanNumerals` snippet were defined in the `jdoe/lists` theme, -we could import the `jdoe/lists` theme and use the qualified name -`jdoe/lists/romanNumerals` to invoke the snippet: - -``` tex -\markdownSetup{import=jdoe/lists} -\begin{markdown*}{snippet=jdoe/lists/romanNumerals} +> $E=mc^2\dots$ +> +> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\eqno(1)$$ -The following ordered list will be preceded by roman numerals: +##### \LaTeX{} Example {.unnumbered} -3. tres -4. quattuor +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[texMathDollars]{markdown} +\usepackage{amsmath} +\def\markdownRendererInlineMath#1{\begin{math}#1\dots\end{math}} +\def\markdownRendererDisplayMath#1{\begin{equation}#1\end{equation}} +\begin{document} +\begin{markdown} +$E=mc^2$ -\end{markdown*} +$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ +\end{markdown} +\end{document} ``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: -Alternatively, we can use the extended variant of the `import` \LaTeX{} -option that allows us to import the `romanNumerals` snippet to the -current namespace for easier access: - -``` tex -\markdownSetup{ - import = { - jdoe/lists = romanNumerals, - }, -} -\begin{markdown*}{snippet=romanNumerals} +> $E=mc^2\dots$ +> +> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\quad(1)$$ -The following ordered list will be preceded by roman numerals: +##### \Hologo{ConTeXt} Example {.unnumbered} -3. tres -4. quattuor +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\setupmarkdown[texMathDollars = yes] +\def\markdownRendererInlineMath#1{$#1\dots$}% +\def\markdownRendererDisplayMath#1{\placeformula\startformula#1\stopformula}% +\starttext +\startmarkdown +$E=mc^2$ -\end{markdown*} +$$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx$$ +\stopmarkdown +\stoptext ``````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: -Furthermore, we can also specify the name of the snippet in the current -namespace, which can be different from the name of the snippet in the -`jdoe/lists` theme. For example, we can make the snippet -`jdoe/lists/romanNumerals` available under the name `roman`. - -``` tex -\markdownSetup{ - import = { - jdoe/lists = romanNumerals as roman, - }, -} -\begin{markdown*}{snippet=roman} +> $E=mc^2\dots$ +> +> $$\hat{f} \left ( \xi \right )= \int_{-\infty}^{\infty} f\left ( x \right ) e^{-i2\pi \xi x} dx\quad(1)$$ -The following ordered list will be preceded by roman numerals: +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererInlineMath{% + \markdownRendererInlineMathPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { inlineMath } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { inlineMath } + { 1 } +\ExplSyntaxOff +\def\markdownRendererDisplayMath{% + \markdownRendererDisplayMathPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { displayMath } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { displayMath } + { 1 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +% +%<*manual-tokens> +% \fi +% +% \begin{markdown} -3. tres -4. quattuor +#### Thematic Break Renderer +The \mdef{markdownRendererThematicBreak} macro represents a thematic break. +The macro receives no arguments. + +% \end{markdown} +% +% \iffalse + +##### Plain \TeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\def\markdownRendererThematicBreak{\vfil\break} +\markdownBegin +This is the first page. + +*** -\end{markdown*} +This is the second page. +\markdownEnd +\bye ``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: -Several themes and/or snippets can be loaded at once using the extended -variant of the `import` \LaTeX{} option: +> This is the first page. +> +> *** +> +> This is the second page. + +##### \LaTeX{} Example {.unnumbered} +Using a text editor, create a text document named `document.tex` with the +following content: ``` tex +\documentclass{article} +\usepackage{markdown} \markdownSetup{ - import = { - jdoe/longpackagename/lists = { - arabic as arabic1, - roman, - alphabetic, - }, - jdoe/anotherlongpackagename/lists = { - arabic as arabic2, - }, - jdoe/yetanotherlongpackagename, + renderers = { + thematicBreak = \newpage, }, } +\begin{document} +\begin{markdown} +This is the first page. + +*** + +This is the second page. +\end{markdown} +\end{document} ``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: -% \markdownEnd -% \iffalse -% -%<*latex> +> This is the first page. +> +> *** +> +> This is the second page. + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\def\markdownRendererThematicBreak{\page[yes]} +\starttext +\startmarkdown +This is the first page. + +*** + +This is the second page. +\stopmarkdown +\stoptext +``````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> This is the first page. +> +> *** +> +> This is the second page. + +% +%<*tex> % \fi % \begin{macrocode} +\def\markdownRendererThematicBreak{% + \markdownRendererThematicBreakPrototype}% \ExplSyntaxOn -\tl_new:N - \l_@@_latex_import_current_theme_tl -\keys_define:nn - { markdown/latex-options/import } - { +\seq_gput_right:Nn + \g_@@_renderers_seq + { thematicBreak } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { thematicBreak } + { 0 } +\ExplSyntaxOff % \end{macrocode} -% \begin{markdown} +% \par % -% If a theme name is given without a list of snippets to import, -% we assume that an empty list was given. +% \iffalse +% +%<*manual-tokens> +% \fi % -% \end{markdown} -% \begin{macrocode} - unknown .default:n = {}, - unknown .code:n = { -% \end{macrocode} % \begin{markdown} -% -% To ensure that keys containing forward slashes get passed correctly, we -% replace all forward slashes in the input with backslash tokens with category -% code letter and then undo the replacement. This means that if any unbraced -% backslash tokens with category code letter exist in the input, they will be -% replaced with forward slashes. However, this should be extremely rare. -% + +#### Tickbox Renderers +The macros named \mdef{markdownRendererTickedBox}, +\mdef{markdownRendererHalfTickedBox}, and \mdef{markdownRendererUntickedBox} +represent ticked and unticked boxes, respectively. These macros will either be +produced, when the \Opt{taskLists} option is enabled, or when the Ballot Box +with X (☒, U+2612), Hourglass (⌛, U+231B) or Ballot Box (☐, U+2610) Unicode +characters are encountered in the markdown input, respectively. + % \end{markdown} -% \begin{macrocode} - \tl_set_eq:NN - \l_@@_latex_import_current_theme_tl - \l_keys_key_str - \tl_replace_all:NVn - \l_@@_latex_import_current_theme_tl - \c_backslash_str - { / } -% \end{macrocode} -% \begin{markdown} % -% Here, we load the \LaTeX{} theme. +% \iffalse + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[taskLists]{markdown} +\markdownSetup{ + renderers = { + untickedBox = No, + tickedBox = Yes, + }, +} +\begin{document} +\begin{markdown} +- [ ] you can't. +- [x] I can! +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> - No you can't. +> - Yes I can! + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\setupmarkdown[taskLists = yes] +\def\markdownRendererUntickedBox{No} +\def\markdownRendererTickedBox{Yes} +\starttext +\startmarkdown +- [ ] you can't. +- [x] I can! +\stopmarkdown +\stoptext +```````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> - No you can't. +> - Yes I can! + +% +%<*tex> +% \fi % -% \end{markdown} % \begin{macrocode} - \@@_set_latex_theme:V - \l_@@_latex_import_current_theme_tl +\def\markdownRendererTickedBox{% + \markdownRendererTickedBoxPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { tickedBox } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { tickedBox } + { 0 } +\ExplSyntaxOff +\def\markdownRendererHalfTickedBox{% + \markdownRendererHalfTickedBoxPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { halfTickedBox } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { halfTickedBox } + { 0 } +\ExplSyntaxOff +\def\markdownRendererUntickedBox{% + \markdownRendererUntickedBoxPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { untickedBox } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { untickedBox } + { 0 } +\ExplSyntaxOff % \end{macrocode} -% \begin{markdown} +% \par % -% Here, we import the \LaTeX{} snippets. +% \iffalse +% +%<*manual-tokens> +% \fi % +% \begin{markdown} + +#### YAML Metadata Renderers {#yamlmetadatarenderers} + +The \mdef{markdownRendererJekyllDataBegin} macro represents the beginning of a +\acro{yaml} document. This macro will only be produced when the \Opt{jekyllData} +option is enabled. The macro receives no arguments. + % \end{markdown} +% +% \iffalse +% +%<*tex> +% \fi +% % \begin{macrocode} - \clist_map_inline:nn - { #1 } - { - \regex_extract_once:nnNTF - { ^(.*?)\s+as\s+(.*?)$ } - { ##1 } - \l_tmpa_seq - { - \seq_pop:NN - \l_tmpa_seq - \l_tmpa_tl - \seq_pop:NN - \l_tmpa_seq - \l_tmpa_tl - \seq_pop:NN - \l_tmpa_seq - \l_tmpb_tl - } - { - \tl_set:Nn - \l_tmpa_tl - { ##1 } - \tl_set:Nn - \l_tmpb_tl - { ##1 } - } - \tl_put_left:Nn - \l_tmpa_tl - { / } - \tl_put_left:NV - \l_tmpa_tl - \l_@@_latex_import_current_theme_tl - \@@_latex_setup_snippet:Vx - \l_tmpb_tl - { snippet = { \l_tmpa_tl } } - } - }, - } -\cs_generate_variant:Nn - \tl_replace_all:Nnn - { NVn } -\cs_generate_variant:Nn - \@@_set_latex_theme:n - { V } -\cs_generate_variant:Nn - \@@_latex_setup_snippet:nn - { Vx } +\def\markdownRendererJekyllDataBegin{% + \markdownRendererJekyllDataBeginPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { jekyllDataBegin } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { jekyllDataBegin } + { 0 } \ExplSyntaxOff % \end{macrocode} -% \begin{markdown} +% \par % -%#### Plain \TeX{} Interface Options -% Here, we automatically define plain \TeX{} macros and the -% \meta{key}`=`\meta{value} interface for the above \LaTeX{} options. +% \iffalse +% +%<*manual-tokens> +% \fi % +% \begin{markdown} + +The \mdef{markdownRendererJekyllDataEnd} macro represents the end of a +\acro{yaml} document. This macro will only be produced when the +\Opt{jekyllData} option is enabled. The macro receives no arguments. + % \end{markdown} +% +% \iffalse +% +%<*tex> +% \fi +% % \begin{macrocode} +\def\markdownRendererJekyllDataEnd{% + \markdownRendererJekyllDataEndPrototype}% \ExplSyntaxOn -\cs_new:Nn \@@_latex_define_option_commands_and_keyvals: - { - \seq_map_inline:Nn - \g_@@_latex_options_seq - { - \@@_plain_tex_define_option_command:n - { ##1 } - } +\seq_gput_right:Nn + \g_@@_renderers_seq + { jekyllDataEnd } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { jekyllDataEnd } + { 0 } +\ExplSyntaxOff % \end{macrocode} -% \begin{markdown} +% \par % -% Furthermore, we also define the \meta{key}`=`\meta{value} interface -% for all option macros recognized by the Lua and plain \TeX{} interfaces. +% \iffalse +% +%<*manual-tokens> +% \fi % +% \begin{markdown} + +The \mdef{markdownRendererJekyllDataMappingBegin} macro represents the +beginning of a mapping in a \acro{yaml} document. This macro will only be +produced when the \Opt{jekyllData} option is enabled. The macro receives two +arguments: the scalar key in the parent structure, cast to a string following +\acro{yaml} serialization rules, and the number of items in the mapping. + % \end{markdown} +% +% \iffalse +% +%<*tex> +% \fi +% % \begin{macrocode} - \seq_map_inline:Nn - \g_@@_option_layers_seq - { - \seq_map_inline:cn - { g_@@_ ##1 _options_seq } - { +\def\markdownRendererJekyllDataMappingBegin{% + \markdownRendererJekyllDataMappingBeginPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { jekyllDataMappingBegin } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { jekyllDataMappingBegin } + { 2 } +\ExplSyntaxOff % \end{macrocode} -% \begin{markdown} +% \par % -% To make it easier to copy-and-paste options from Pandoc [@macfarlane22] such -% as `fancy_lists`, `header_attributes`, and `pipe_tables`, we accept -% snake\\\_case in addition to camelCase variants of options. As a bonus, -% studies [@sharif10] also show that snake\\\_case is faster to read than -% camelCase. +% \iffalse +% +%<*manual-tokens> +% \fi % +% \begin{markdown} + +The \mdef{markdownRendererJekyllDataMappingEnd} macro represents the +end of a mapping in a \acro{yaml} document. This macro will only be produced +when the \Opt{jekyllData} option is enabled. The macro receives no arguments. + % \end{markdown} +% +% \iffalse +% +%<*tex> +% \fi +% % \begin{macrocode} - \@@_with_various_cases:nn - { ####1 } - { - \@@_latex_define_option_keyval:nnn - { ##1 } - { ####1 } - { ########1 } - } - } - } - } -\cs_new:Nn \@@_latex_define_option_keyval:nnn - { - \prop_get:cnN - { g_@@_ #1 _option_types_prop } - { #2 } - \l_tmpa_tl - \keys_define:nn - { markdown/latex-options } - { - #3 .code:n = { - \@@_set_option_value:nn - { #2 } - { ##1 } - }, - } - \str_if_eq:VVT - \l_tmpa_tl - \c_@@_option_type_boolean_tl - { - \keys_define:nn - { markdown/latex-options } - { - #3 .default:n = { true }, - } - } +\def\markdownRendererJekyllDataMappingEnd{% + \markdownRendererJekyllDataMappingEndPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { jekyllDataMappingEnd } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { jekyllDataMappingEnd } + { 0 } +\ExplSyntaxOff % \end{macrocode} -% \begin{markdown} +% \par % -% For options of type `clist`, we assume that \meta{key} is a regular English -% noun in plural (such as `extensions`) and we also define the -% \meta{singular key}`=`\meta{value} interface, where \meta{singular key} is -% \meta{key} after stripping the trailing -s (such as `extension`). Rather -% than setting the option to \meta{value}, this interface appends \meta{value} -% to the current value as the rightmost item in the list. +% \iffalse +% +%<*manual-tokens> +% \fi % -% \end{markdown} -% \begin{macrocode} - \str_if_eq:VVT - \l_tmpa_tl - \c_@@_option_type_clist_tl - { - \tl_set:Nn - \l_tmpa_tl - { #3 } - \tl_reverse:N - \l_tmpa_tl - \str_if_eq:enF - { - \tl_head:V - \l_tmpa_tl - } - { s } - { - \msg_error:nnn - { markdown } - { malformed-name-for-clist-option } - { #3 } - } - \tl_set:Nx - \l_tmpa_tl - { - \tl_tail:V - \l_tmpa_tl - } - \tl_reverse:N - \l_tmpa_tl - \tl_put_right:Nn - \l_tmpa_tl - { - .code:n = { - \@@_get_option_value:nN - { #2 } - \l_tmpa_tl - \clist_set:NV - \l_tmpa_clist - { \l_tmpa_tl, { ##1 } } - \@@_set_option_value:nV - { #2 } - \l_tmpa_clist - } - } - \keys_define:nV - { markdown/latex-options } - \l_tmpa_tl - } - } -\cs_generate_variant:Nn - \clist_set:Nn - { NV } -\cs_generate_variant:Nn - \keys_define:nn - { nV } -\cs_generate_variant:Nn - \@@_set_option_value:nn - { nV } -\prg_generate_conditional_variant:Nnn - \str_if_eq:nn - { en } - { F } -\msg_new:nnn - { markdown } - { malformed-name-for-clist-option } - { - Clist~option~name~#1~does~not~end~with~-s. - } -\@@_latex_define_option_commands_and_keyvals: +% \begin{markdown} + +The \mdef{markdownRendererJekyllDataSequenceBegin} macro represents the +beginning of a sequence in a \acro{yaml} document. This macro will only be +produced when the \Opt{jekyllData} option is enabled. The macro receives two +arguments: the scalar key in the parent structure, cast to a string following +\acro{yaml} serialization rules, and the number of items in the sequence. + +% \end{markdown} +% +% \iffalse +% +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererJekyllDataSequenceBegin{% + \markdownRendererJekyllDataSequenceBeginPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { jekyllDataSequenceBegin } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { jekyllDataSequenceBegin } + { 2 } \ExplSyntaxOff % \end{macrocode} % \par -% \begin{markdown} % -% The \Opt{finalizeCache} and \Opt{frozenCache} plain -% \TeX{} options are exposed through \LaTeX{} options with keys `finalizeCache` -% and `frozenCache`. -% -% To ensure compatibility with the `minted` package [@poore17, Section -% 5.1], which supports the `finalizecache` and `frozencache` package options -% with similar semantics, the Markdown package also recognizes these as aliases -% and recognizes them as document class options. By passing `finalizecache` and -% `frozencache` as document class options, you may conveniently control the -% behavior of both packages at once: +% \iffalse +% +%<*manual-tokens> +% \fi % -% ``` tex -% \documentclass[frozencache]{article} -% \usepackage{markdown,minted} -% \begin{document} -% % ... -% \end{document} -% ``````` +% \begin{markdown} + +The \mdef{markdownRendererJekyllDataSequenceEnd} macro represents the +end of a sequence in a \acro{yaml} document. This macro will only be produced +when the \Opt{jekyllData} option is enabled. The macro receives no arguments. + +% \end{markdown} % -% We hope that other packages will support the `finalizecache` and -% `frozencache` package options in the future, so that they can become a -% standard interface for preparing \LaTeX{} document sources for distribution. +% \iffalse +% +%<*tex> +% \fi % -% \end{markdown} % \begin{macrocode} -\DeclareOption{finalizecache}{\markdownSetup{finalizeCache}} -\DeclareOption{frozencache}{\markdownSetup{frozenCache}} +\def\markdownRendererJekyllDataSequenceEnd{% + \markdownRendererJekyllDataSequenceEndPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { jekyllDataSequenceEnd } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { jekyllDataSequenceEnd } + { 0 } +\ExplSyntaxOff % \end{macrocode} % \par -% \begin{markdown} % -% The following example \LaTeX{} code showcases a possible configuration of -% plain \TeX{} interface options \Opt{hybrid}, \Opt{smartEllipses}, and -% \Opt{cacheDir}. -% ``` tex -% \markdownSetup{ -% hybrid, -% smartEllipses, -% cacheDir = /tmp, -% } -% ``````` +% \iffalse +% +%<*manual-tokens> +% \fi % -%#### Plain \TeX{} Markdown Token Renderers {#latex-renderers} +% \begin{markdown} + +The \mdef{markdownRendererJekyllDataBoolean} macro represents a boolean scalar +value in a \acro{yaml} document. This macro will only be produced when the +\Opt{jekyllData} option is enabled. The macro receives two arguments: the +scalar key in the parent structure, and the scalar value, both cast to a string +following \acro{yaml} serialization rules. + +% \end{markdown} % -% The \LaTeX{} interface recognizes an option with the `renderers` key, -% whose value must be a list of key-values, where the keys correspond -% to the markdown token renderer macros exposed by the plain \TeX{} -% interface (see Section <#sec:texrenderersuser>) and the values are -% new definitions of these token renderers. +% \iffalse +% +%<*tex> +% \fi % -% \end{markdown} % \begin{macrocode} +\def\markdownRendererJekyllDataBoolean{% + \markdownRendererJekyllDataBooleanPrototype}% \ExplSyntaxOn -\cs_new:Nn \@@_latex_define_renderers: - { - \seq_map_function:NN - \g_@@_renderers_seq - \@@_latex_define_renderer:n - } -\cs_new:Nn \@@_latex_define_renderer:n - { - \@@_renderer_tl_to_csname:nN - { #1 } - \l_tmpa_tl - \prop_get:NnN - \g_@@_renderer_arities_prop - { #1 } - \l_tmpb_tl - \@@_latex_define_renderer:ncV - { #1 } - { \l_tmpa_tl } - \l_tmpb_tl - } -\cs_new:Nn \@@_renderer_tl_to_csname:nN - { - \tl_set:Nn - \l_tmpa_tl - { \str_uppercase:n { #1 } } - \tl_set:Nx - #2 - { - markdownRenderer - \tl_head:f { \l_tmpa_tl } - \tl_tail:n { #1 } - } - } -\cs_new:Nn \@@_latex_define_renderer:nNn - { - \@@_with_various_cases:nn - { #1 } - { - \keys_define:nn - { markdown/latex-options/renderers } - { - ##1 .code:n = { - \cs_generate_from_arg_count:NNnn - #2 - \cs_set:Npn - { #3 } - { ####1 } - }, - } - } - } -\cs_generate_variant:Nn - \@@_latex_define_renderer:nNn - { ncV } +\seq_gput_right:Nn + \g_@@_renderers_seq + { jekyllDataBoolean } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { jekyllDataBoolean } + { 2 } \ExplSyntaxOff % \end{macrocode} % \par -% \begin{markdown} -% -% The following example \LaTeX{} code showcases a possible configuration of the -% \mref{markdownRendererLink} and \mref{markdownRendererEmphasis} markdown token -% renderers. -% ``` tex -% \markdownSetup{ -% renderers = { -% link = {#4}, \% Render links as the link title. -% emphasis = {\emph{#1}}, \% Render emphasized text via `\emph`. -% } -% } -% ``````` % -% In addition to exact token renderer names, we also support wildcards -% that match multiple token renderer names. +% \iffalse +% +%<*manual-tokens> +% \fi % +% \begin{markdown} + +The \mdef{markdownRendererJekyllDataNumber} macro represents a numeric scalar +value in a \acro{yaml} document. This macro will only be produced when the +\Opt{jekyllData} option is enabled. The macro receives two arguments: the +scalar key in the parent structure, and the scalar value, both cast to a string +following \acro{yaml} serialization rules. + % \end{markdown} +% +% \iffalse +% +%<*tex> +% \fi +% % \begin{macrocode} +\def\markdownRendererJekyllDataNumber{% + \markdownRendererJekyllDataNumberPrototype}% \ExplSyntaxOn -\tl_new:N - \l_@@_renderer_definition_tl -\keys_define:nn - { markdown/latex-options/renderers } - { - unknown .code:n = { - \regex_match:nVTF - { \* } - \l_keys_key_str - { - \tl_set:Nn - \l_@@_renderer_definition_tl - { #1 } - \tl_set:NV - \l_tmpa_tl - \l_keys_key_str - \regex_replace_all:nnN - { \* } - { .* } - \l_tmpa_tl - \regex_set:NV - \l_tmpa_regex - \l_tmpa_tl - \int_zero:N - \l_tmpa_int - \seq_map_inline:Nn - \g_@@_renderers_seq - { - \@@_with_various_cases:nn - { ##1 } - { - \regex_match:NnT - \l_tmpa_regex - { ####1 } - { - \@@_renderer_tl_to_csname:nN - { ##1 } - \l_tmpa_tl - \prop_get:NnN - \g_@@_renderer_arities_prop - { ##1 } - \l_tmpb_tl - \cs_generate_from_arg_count:cNVV - { \l_tmpa_tl } - \cs_set:Npn - \l_tmpb_tl - \l_@@_renderer_definition_tl - \int_incr:N - \l_tmpa_int - \@@_with_various_cases_break: - } - } - } - \int_compare:nNnT - { \l_tmpa_int } = { 0 } - { - \msg_error:nnV - { markdown } - { nonmatched-renderer-wildcard } - \l_keys_key_str - } - } - { - \msg_error:nnV - { markdown } - { undefined-renderer } - \l_keys_key_str - } - }, - } -\msg_new:nnn - { markdown } - { undefined-renderer } - { - Renderer~#1~is~undefined. - } -\msg_new:nnn - { markdown } - { nonmatched-renderer-wildcard } - { - Wildcard~#1~matches~no~renderers. - } -\cs_generate_variant:Nn - \regex_set:Nn - { NV } -\cs_generate_variant:Nn - \cs_generate_from_arg_count:NNnn - { cNVV } -\cs_generate_variant:Nn - \msg_error:nnn - { nnV } -\prg_generate_conditional_variant:Nnn - \regex_match:nn - { nV } - { TF } +\seq_gput_right:Nn + \g_@@_renderers_seq + { jekyllDataNumber } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { jekyllDataNumber } + { 2 } \ExplSyntaxOff % \end{macrocode} -% \begin{markdown} -% -%#### Plain \TeX{} Markdown Token Renderer Prototypes {#latex-renderer-prototypes} +% \par % -% The \LaTeX{} interface recognizes an option with the -% `rendererPrototypes` key, whose value must be a list of key-values, -% where the keys correspond to the markdown token renderer prototype -% macros exposed by the plain \TeX{} interface (see Section -% <#sec:texrendererprototypes>) and the values are new definitions of -% these token renderer prototypes. +% \iffalse +% +%<*manual-tokens> +% \fi % +% \begin{markdown} + +The \mdef{markdownRendererJekyllDataString} macro represents a string scalar +value in a \acro{yaml} document. This macro will only be produced when the +\Opt{jekyllData} option is enabled. The macro receives two arguments: the +scalar key in the parent structure, cast to a string following \acro{yaml} +serialization rules, and the scalar value. + % \end{markdown} +% +% \iffalse +% +%<*tex> +% \fi +% % \begin{macrocode} +\def\markdownRendererJekyllDataString{% + \markdownRendererJekyllDataStringPrototype}% \ExplSyntaxOn -\cs_new:Nn \@@_latex_define_renderer_prototypes: - { - \seq_map_function:NN - \g_@@_renderers_seq - \@@_latex_define_renderer_prototype:n - } -\cs_new:Nn \@@_latex_define_renderer_prototype:n - { - \@@_renderer_prototype_tl_to_csname:nN - { #1 } - \l_tmpa_tl - \prop_get:NnN - \g_@@_renderer_arities_prop - { #1 } - \l_tmpb_tl - \@@_latex_define_renderer_prototype:ncV - { #1 } - { \l_tmpa_tl } - \l_tmpb_tl - } -\cs_new:Nn \@@_latex_define_renderer_prototype:nNn - { - \@@_with_various_cases:nn - { #1 } - { - \keys_define:nn - { markdown/latex-options/renderer-prototypes } - { - ##1 .code:n = { - \cs_generate_from_arg_count:NNnn - #2 - \cs_set:Npn - { #3 } - { ####1 } - }, - } - } - } -\cs_generate_variant:Nn - \@@_latex_define_renderer_prototype:nNn - { ncV } +\seq_gput_right:Nn + \g_@@_renderers_seq + { jekyllDataString } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { jekyllDataString } + { 2 } \ExplSyntaxOff % \end{macrocode} % \par -% \begin{markdown} % -% The following example \LaTeX{} code showcases a possible configuration of the -% `\markdownRendererImagePrototype` and `\markdownRendererCodeSpanPrototype` -% markdown token renderer prototypes. -% ``` tex -% \markdownSetup{ -% rendererPrototypes = { -% image = {\includegraphics{#2}}, -% codeSpan = {\texttt{#1}}, \% Render inline code via `\texttt`. -% } -% } -% ``````` +% \iffalse +% +%<*manual-tokens> +% \fi % -% In addition to exact token renderer prototype names, we also support -% wildcards that match multiple token renderer prototype names. +% \begin{markdown} + +The \mdef{markdownRendererJekyllDataEmpty} macro represents an empty scalar +value in a \acro{yaml} document. This macro will only be produced when the +\Opt{jekyllData} option is enabled. The macro receives one argument: the +scalar key in the parent structure, cast to a string following \acro{yaml} +serialization rules. + +% See also Section <#sec:expl3yamlmetadata> for the description of the +% high-level expl3 interface that you can also use to react to \acro{yaml} +% metadata. % % \end{markdown} -% \begin{macrocode} -\ExplSyntaxOn -\tl_new:N - \l_@@_renderer_prototype_definition_tl -\keys_define:nn - { markdown/latex-options/renderer-prototypes } - { - unknown .code:n = { - \regex_match:nVTF - { \* } - \l_keys_key_str - { - \tl_set:Nn - \l_@@_renderer_prototype_definition_tl - { #1 } - \tl_set:NV - \l_tmpa_tl - \l_keys_key_str - \regex_replace_all:nnN - { \* } - { .* } - \l_tmpa_tl - \regex_set:NV - \l_tmpa_regex - \l_tmpa_tl - \int_zero:N - \l_tmpa_int - \seq_map_inline:Nn - \g_@@_renderers_seq - { - \@@_with_various_cases:nn - { ##1 } - { - \regex_match:NnT - \l_tmpa_regex - { ####1 } - { - \@@_renderer_prototype_tl_to_csname:nN - { ##1 } - \l_tmpa_tl - \prop_get:NnN - \g_@@_renderer_arities_prop - { ##1 } - \l_tmpb_tl - \cs_generate_from_arg_count:cNVV - { \l_tmpa_tl } - \cs_set:Npn - \l_tmpb_tl - \l_@@_renderer_prototype_definition_tl - \int_incr:N - \l_tmpa_int - \@@_with_various_cases_break: - } - } - } - \int_compare:nNnT - { \l_tmpa_int } = { 0 } - { - \msg_error:nnV - { markdown } - { nonmatched-renderer-prototype-wildcard } - \l_keys_key_str - } - } - { - \msg_error:nnV - { markdown } - { undefined-renderer-prototype } - \l_keys_key_str - } - }, - } -\msg_new:nnn - { markdown } - { undefined-renderer-prototype } - { - Renderer~prototype~#1~is~undefined. - } -\msg_new:nnn - { markdown } - { nonmatched-renderer-prototype-wildcard } - { - Wildcard~#1~matches~no~renderer~prototypes. - } -\cs_generate_variant:Nn - \regex_set:Nn - { NV } -\cs_generate_variant:Nn - \cs_generate_from_arg_count:NNnn - { cNVV } -\cs_generate_variant:Nn - \msg_error:nnn - { nnV } -\prg_generate_conditional_variant:Nnn - \regex_match:nn - { nV } - { TF } -\ExplSyntaxOff -% \end{macrocode} -% \begin{markdown} % % \iffalse -% -%<*context> +% +%<*tex> % \fi % -% \Hologo{ConTeXt} Interface {#contextinterface} -%---------------------------- +% \begin{macrocode} +\def\markdownRendererJekyllDataEmpty{% + \markdownRendererJekyllDataEmptyPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { jekyllDataEmpty } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { jekyllDataEmpty } + { 1 } +\ExplSyntaxOff +% \end{macrocode} +% \par % % \iffalse -% -%<*manual-interfaces> - -### \Hologo{ConTeXt} - -The \Hologo{ConTeXt} interface provides the same level of functionality as the -plain \TeX{} interface by using the plain \TeX{} interface behind the scenes. -Unlike the plain \TeX{} interface, the \Hologo{ConTeXt} interface uses familiar -\Hologo{ConTeXt} idioms as syntactic sugar. +% +%<*manual-tokens> -The \Hologo{ConTeXt} interface accepts the same options as the plain \TeX{} -interface. +##### Plain \TeX{} Example {.unnumbered} Using a text editor, create a text document named `document.tex` with the following content: ``` tex -\usemodule[t][markdown] -\starttext - -\startmarkdown -$\sqrt{-1}$ *equals* $i$. -\stopmarkdown - -\setupmarkdown[hybrid = yes] -\startmarkdown -$\sqrt{-1}$ *equals* $i$. -\stopmarkdown - -\stoptext +\input markdown +\def\markdownOptionJekyllData{true} +\def\markdownRendererJekyllDataString#1#2{\gdef\name{#2}} +\def\markdownRendererJekyllDataNumber#1#2{\gdef\age{#2}} +\def\markdownRendererJekyllDataEnd{% + \name{} is \age{} years old.} +\markdownBegin +--- +name: Jane Doe +age: 99 +--- +\markdownEnd +\bye ``````` Next, invoke LuaTeX from the terminal: ``` sh -context document.tex +luatex document.tex `````` A PDF document named `document.pdf` should be produced and contain the following text: -> \$\\sqrt{-1}\$ *equals* \$i\$. -> -> 1 -> *equals* -> i. +> Jane Doe is 99 years old. -% -%<*context> +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[jekyllData]{markdown} +\markdownSetup{ + renderers = { + jekyllDataString = {\gdef\name{#2}}, + jekyllDataNumber = {\gdef\age{#2}}, + jekyllDataEnd = {\name{} is \age{} years old.}, + } +} +\begin{document} + +\begin{markdown} +--- +name: Jane Doe +age: 99 +--- +\end{markdown} + +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> Jane Doe is 99 years old. + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\setupmarkdown[jekyllData = yes] +\def\markdownRendererJekyllDataString#1#2{\gdef\name{#2}} +\def\markdownRendererJekyllDataNumber#1#2{\gdef\age{#2}} +\def\markdownRendererJekyllDataEnd{% + \name{} is \age{} years old.} +\starttext + +\startmarkdown +--- +name: Jane Doe +age: 99 +--- +\stopmarkdown + +\stoptext +``````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> Jane Doe is 99 years old. + +% +%<*tex> % \fi -% -% The \Hologo{ConTeXt} interface provides a start-stop macro pair for the -% typesetting of markdown input from within \Hologo{ConTeXt} and facilities for -% setting Lua, plain \TeX, and \Hologo{ConTeXt} options used during the -% conversion from markdown to plain \TeX{}. The rest of the interface is -% inherited from the plain \TeX{} interface (see Section <#sec:texinterface>). -% -% \end{markdown} -% \begin{macrocode} -\writestatus{loading}{ConTeXt User Module / markdown}% -\startmodule[markdown] -\unprotect -% \end{macrocode} -% \par % \begin{markdown} % -% The \Hologo{ConTeXt} implementation redefines the plain \TeX{} logging macros -% (see Section <#sec:tex-interface-logging>) to use the \Hologo{ConTeXt} -% `\writestatus` macro. +%#### Generating Plain \TeX{} Token Renderer Macros and Key-Values {#plain-tex-renderers} +% +% We define the command \mdef{@@_define_renderers:} that defines plain \TeX{} +% macros for token renderers. Futhermore, the `\markdownSetup` macro also accepts +% the `renderers` key, whose value must be a list of key-values, where the keys +% correspond to the markdown token renderer macros and the values are new +% definitions of these token renderers. % % \end{markdown} % \begin{macrocode} -\def\markdownInfo#1{\writestatus{markdown}{#1.}}% -\def\markdownWarning#1{\writestatus{markdown\space warn}{#1.}}% -\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&% - \do\#\do\^\do\_\do\%\do\~}% -\input markdown/markdown +\ExplSyntaxOn +\cs_new:Nn \@@_define_renderers: + { + \seq_map_function:NN + \g_@@_renderers_seq + \@@_define_renderer:n + } +\cs_new:Nn \@@_define_renderer:n + { + \@@_renderer_tl_to_csname:nN + { #1 } + \l_tmpa_tl + \prop_get:NnN + \g_@@_renderer_arities_prop + { #1 } + \l_tmpb_tl + \@@_define_renderer:ncV + { #1 } + { \l_tmpa_tl } + \l_tmpb_tl + } +\cs_new:Nn \@@_renderer_tl_to_csname:nN + { + \tl_set:Nn + \l_tmpa_tl + { \str_uppercase:n { #1 } } + \tl_set:Nx + #2 + { + markdownRenderer + \tl_head:f { \l_tmpa_tl } + \tl_tail:n { #1 } + } + } +\tl_new:N + \l_@@_renderer_definition_tl +\cs_new:Nn \@@_define_renderer:nNn + { + \keys_define:nn + { markdown/options/renderers } + { + #1 .code:n = { + \tl_set:Nn + \l_@@_renderer_definition_tl + { ##1 } + \regex_replace_all:nnN + { \cP\#0 } + { #1 } + \l_@@_renderer_definition_tl + \cs_generate_from_arg_count:NNnV + #2 + \cs_set:Npn + { #3 } + \l_@@_renderer_definition_tl + }, + } + } +\cs_generate_variant:Nn + \@@_define_renderer:nNn + { ncV } +\cs_generate_variant:Nn + \cs_generate_from_arg_count:NNnn + { NNnV } +\keys_define:nn + { markdown/options } + { + renderers .code:n = { + \keys_set:nn + { markdown/options/renderers } + { #1 } + }, + } +\ExplSyntaxOff % \end{macrocode} % \par % \begin{markdown} % -% The \Hologo{ConTeXt} interface is implemented by the -% `t-markdown.tex` \Hologo{ConTeXt} module file that can be loaded as follows: +% The following example code showcases a possible configuration of the +% \mref{markdownRendererLink} and \mref{markdownRendererEmphasis} token +% renderer macros. % ``` tex -% \usemodule[t][markdown] +% \markdownSetup{ +% renderers = { +% link = {#4}, \% Render links as the link title. +% emphasis = {{\it #1}}, \% Render emphasized text using italics. +% } +% } % ``````` -% \noindent It is expected that the special plain \TeX{} characters have the -% expected category codes, when `\input`ting the file. -% -%### Typesetting Markdown -% The interface exposes the \mdef{startmarkdown} and \mdef{stopmarkdown} macro -% pair for the typesetting of a markdown document fragment, and defines the -% \mdef{inputmarkdown} command. -% -% \end{markdown} -% \begin{macrocode} -\let\startmarkdown\relax -\let\stopmarkdown\relax -\let\inputmarkdown\relax -% \end{macrocode} -% \par -% \begin{markdown} -% -% You may prepend your own code to the \mref{startmarkdown} macro and redefine the -% \mref{stopmarkdown} macro to produce special effects before and after the -% markdown block. -% -% Note that the \mref{startmarkdown} and \mref{stopmarkdown} macros -% are subject to the same limitations as the \mref{markdownBegin} and -% \mref{markdownEnd} macros exposed by the plain \TeX{} interface. % -% The following example \Hologo{ConTeXt} code showcases the usage of the -% \mref{startmarkdown} and \mref{stopmarkdown} macros: +% In addition to exact token renderer names, we also support wildcards +% and enumerations that match multiple token renderer names: % ``` tex -% \usemodule[t][markdown] -% \starttext -% \startmarkdown -% _Hello_ **world** ... -% \stopmarkdown -% \stoptext +% \markdownSetup{ +% renderers = { +% heading* = {{\bf #1}}, \% Render headings using the bold face. +% jekyllData(String|Number) = { \% Render YAML string and numbers +% {\it #2}\% \% using italics. +% }, +% } +% } % ``````` % -% The \mref{inputmarkdown} macro accepts a single mandatory parameter -% containing the filename of a markdown document and expands to the result of -% the conversion of the input markdown document to plain \TeX{}. Unlike the -% \mref{markdownInput} macro provided by the plain \TeX{} interface, this macro -% also accepts \Hologo{ConTeXt} interface options (see Section -% <#sec:context-options>) as its optional argument. These options will only -% influnce this markdown document. -% -% The following example \LaTeX{} code showcases the usage of the -% \mref{markdownInput} macro: +% Wildcards and enumerations can be combined: % ``` tex -% \usemodule[t][markdown] -% \starttext -% % ... -% \inputmarkdown[smartEllipses]{hello.md} -% % ... -% \stoptext +% \markdownSetup{ +% renderers = { +% *lItem(|End) = {"}, \% Quote ordered/bullet list items. +% } +% } % ``````` % -%### Options {#context-options} -% -% The \Hologo{ConTeXt} options are represented by a comma-delimited list of -% \meta{key}`=`\meta{value} pairs. For boolean options, the `=`\meta{value} -% part is optional, and \meta{key} will be interpreted as \meta{key}`=true` -% (or, equivalently, \meta{key}`=yes`) if the `=`\meta{value} part has been -% omitted. -% -% \Hologo{ConTeXt} options map directly to the options recognized by the plain -% \TeX{} interface (see Section <#sec:tex-options>). -% -% The \Hologo{ConTeXt} options may be specified when using the -% \mref{inputmarkdown} macro (see Section <#sec:contextinterface>), or via the -% \mdef{setupmarkdown} macro. The \mref{setupmarkdown} macro receives the -% options to set up as its only argument: +% To determine the current token renderer, you can use the parameter `#0`: +% ``` tex +% \markdownSetup{ +% renderers = { +% heading* = {#0: #1}, \% Render headings as the renderer name +% } \% followed by the heading text. +% } +% ``````` % % \end{markdown} % \begin{macrocode} \ExplSyntaxOn +\prop_new:N + \g_@@_glob_cache_prop +\tl_new:N + \l_@@_current_glob_tl \cs_new:Nn - \@@_setup:n - { - \keys_set:nn - { markdown/context-options } - { #1 } - } -\long\def\setupmarkdown[#1] - { - \@@_setup:n - { #1 } - } -\ExplSyntaxOff -% \end{macrocode} -% \begin{markdown} -% -%#### \Hologo{ConTeXt} Interface Options -% We define the \meta{key}`=`\meta{value} interface for all option macros -% recognized by the Lua and plain \TeX{} interfaces. -% -% \end{markdown} -% \begin{macrocode} -\ExplSyntaxOn -\cs_new:Nn \@@_context_define_option_commands_and_keyvals: + \@@_glob_seq:nnN { - \seq_map_inline:Nn - \g_@@_option_layers_seq + \tl_set:Nn + \l_@@_current_glob_tl + { ^ #1 $ } + \prop_get:NeNTF + \g_@@_glob_cache_prop + { #2 / \l_@@_current_glob_tl } + \l_tmpa_clist + { + \seq_set_from_clist:NN + #3 + \l_tmpa_clist + } { + \seq_clear:N + #3 + \regex_replace_all:nnN + { \* } + { .* } + \l_@@_current_glob_tl + \regex_set:NV + \l_tmpa_regex + \l_@@_current_glob_tl \seq_map_inline:cn - { g_@@_ ##1 _options_seq } + { #2 } { -% \end{macrocode} -% \begin{markdown} -% -% To make it easier to copy-and-paste options from Pandoc [@macfarlane22] such -% as `fancy_lists`, `header_attributes`, and `pipe_tables`, we accept -% snake\\\_case in addition to camelCase variants of options. As a bonus, -% studies [@sharif10] also show that snake\\\_case is faster to read than -% camelCase. -% -% \end{markdown} -% \begin{macrocode} - \@@_with_various_cases:nn - { ####1 } - { - \@@_context_define_option_keyval:nnn - { ##1 } - { ####1 } - { ########1 } - } + \regex_match:NnT + \l_tmpa_regex + { ##1 } + { + \seq_put_right:Nn + #3 + { ##1 } + } } + \clist_set_from_seq:NN + \l_tmpa_clist + #3 + \prop_gput:NeV + \g_@@_glob_cache_prop + { #2 / \l_@@_current_glob_tl } + \l_tmpa_clist } } -% \end{macrocode} -% \begin{markdown} -% -% Furthermore, we also accept caseless variants of options in line with the -% style of \Hologo{ConTeXt}. -% -% \end{markdown} -% \begin{macrocode} -\cs_new:Nn \@@_caseless:N - { - \regex_replace_all:nnN - { ([a-z])([A-Z]) } - { \1 \c { str_lowercase:n } \cB\{ \2 \cE\} } - #1 - \tl_set:Nx - #1 - { #1 } - } -\seq_gput_right:Nn \g_@@_cases_seq { @@_caseless:N } -\cs_new:Nn \@@_context_define_option_keyval:nnn +% TODO: Remove in TeX Live 2023. +\prg_generate_conditional_variant:Nnn + \prop_get:NnN + { NeN } + { TF } +\cs_generate_variant:Nn + \regex_set:Nn + { NV } +\cs_generate_variant:Nn + \prop_gput:Nnn + { NeV } +\seq_new:N + \l_@@_renderer_glob_results_seq +\keys_define:nn + { markdown/options/renderers } { - \prop_get:cnN - { g_@@_ #1 _option_types_prop } - { #2 } - \l_tmpa_tl - \keys_define:nn - { markdown/context-options } - { - #3 .code:n = { - \tl_set:Nx - \l_tmpa_tl + unknown .code:n = { + \@@_glob_seq:VnN + \l_keys_key_str + { g_@@_renderers_seq } + \l_@@_renderer_glob_results_seq + \seq_if_empty:NTF + \l_@@_renderer_glob_results_seq + { + \msg_error:nnV + { markdown } + { undefined-renderer } + \l_keys_key_str + } + { + \tl_set:Nn + \l_@@_renderer_definition_tl + { #1 } + \seq_map_inline:Nn + \l_@@_renderer_glob_results_seq { - \str_case:nnF + \@@_renderer_tl_to_csname:nN { ##1 } - { - { yes } { true } - { no } { false } - } + \l_tmpa_tl + \prop_get:NnN + \g_@@_renderer_arities_prop + { ##1 } + \l_tmpb_tl + \int_set:Nn + \l_tmpa_int + \l_tmpb_tl + \tl_set:NV + \l_tmpb_tl + \l_@@_renderer_definition_tl + \regex_replace_all:nnN + { \cP\#0 } { ##1 } + \l_tmpb_tl + \cs_generate_from_arg_count:cNVV + { \l_tmpa_tl } + \cs_set:Npn + \l_tmpa_int + \l_tmpb_tl } - \@@_set_option_value:nV - { #2 } - \l_tmpa_tl - }, - } - \str_if_eq:VVT - \l_tmpa_tl - \c_@@_option_type_boolean_tl - { - \keys_define:nn - { markdown/context-options } - { - #3 .default:n = { true }, - } - } + } + }, + } +\msg_new:nnn + { markdown } + { undefined-renderer } + { + Renderer~#1~is~undefined. } \cs_generate_variant:Nn - \@@_set_option_value:nn - { nV } -\@@_context_define_option_commands_and_keyvals: -\ExplSyntaxOff -% \end{macrocode} -% \par -% \begin{markdown} -% -% Implementation {#implementation} -%================ -% -% This part of the documentation describes the implementation of the interfaces -% exposed by the package (see Section <#sec:interfaces>) and is aimed at the -% developers of the package, as well as the curious users. -% -% Figure <#fig:block-diagram> shows the high-level structure of the Markdown -% package: The translation from markdown to \TeX{} *token renderers* is -% performed by the Lua layer. The plain \TeX{} layer provides default -% definitions for the token renderers. The \LaTeX{} and \Hologo{ConTeXt} layers -% correct idiosyncrasies of the respective \TeX{} formats, and provide -% format-specific default definitions for the token renderers. -% -% \end{markdown} -% \iffalse -% -%<*lua> -% \fi -% \begin{markdown} -% -% Lua Implementation {#luaimplementation} -%-------------------- -% -% The Lua implementation implements \luamdef{writer} and \luamref{reader} -% objects, which provide the conversion from markdown to plain \TeX, and -% \luamdef{extensions} objects, which provide syntax extensions for the -% \luamref{writer} and \luamref{reader} objects. -% -% The Lunamark Lua module implements writers for the conversion to various -% other formats, such as DocBook, Groff, or \acro{HTML}. These were stripped -% from the module and the remaining markdown reader and plain \TeX{} writer -% were hidden behind the converter functions exposed by the Lua interface (see -% Section <#sec:luainterface>). -% -% \end{markdown} -% \begin{macrocode} -local upper, format, length = - string.upper, string.format, string.len -local P, R, S, V, C, Cg, Cb, Cmt, Cc, Ct, B, Cs, any = - lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.C, lpeg.Cg, lpeg.Cb, - lpeg.Cmt, lpeg.Cc, lpeg.Ct, lpeg.B, lpeg.Cs, lpeg.P(1) -% \end{macrocode} -% \par -% \begin{markdown} -% -%### Utility Functions -% This section documents the utility functions used by the plain \TeX{} -% writer and the markdown reader. These functions are encapsulated in the -% `util` object. The functions were originally located in the -% `lunamark/util.lua` file in the Lunamark Lua module. -% -% \end{markdown} -% \begin{macrocode} -local util = {} -% \end{macrocode} -% \par -% \begin{markdown} -% -% The \luamdef{util.err} method prints an error message `msg` and exits. -% If `exit_code` is provided, it specifies the exit code. Otherwise, the -% exit code will be 1. -% -% \end{markdown} -% \begin{macrocode} -function util.err(msg, exit_code) - io.stderr:write("markdown.lua: " .. msg .. "\n") - os.exit(exit_code or 1) -end -% \end{macrocode} -% \par -% \begin{markdown} -% -% The \luamdef{util.cache} method computes the digest of `string` and -% `salt`, adds the `suffix` and looks into the directory `dir`, whether a -% file with such a name exists. If it does not, it gets created with -% `transform(string)` as its content. The filename is then returned. -% -% \end{markdown} -% \begin{macrocode} -function util.cache(dir, string, salt, transform, suffix) - local digest = md5.sumhexa(string .. (salt or "")) - local name = util.pathname(dir, digest .. suffix) - local file = io.open(name, "r") - if file == nil then -- If no cache entry exists, then create a new one. - file = assert(io.open(name, "w"), - [[Could not open file "]] .. name .. [[" for writing]]) - local result = string - if transform ~= nil then - result = transform(result) - end - assert(file:write(result)) - assert(file:close()) - end - return name -end -% \end{macrocode} -% \par -% \begin{markdown} -% -% The \luamdef{util.cache_verbatim} method strips whitespaces from the -% end of `string` and calls \luamref{util.cache} with `dir`, `string`, -% no salt or transformations, and the `.verbatim` suffix. -% -% \end{markdown} -% \begin{macrocode} -function util.cache_verbatim(dir, string) - local name = util.cache(dir, string, nil, nil, ".verbatim") - return name -end + \@@_glob_seq:nnN + { VnN } +\cs_generate_variant:Nn + \cs_generate_from_arg_count:NNnn + { cNVV } +\cs_generate_variant:Nn + \msg_error:nnn + { nnV } % \end{macrocode} -% \par % \begin{markdown} % -% The \luamdef{util.table_copy} method creates a shallow copy of a table `t` -% and its metatable. +% If plain \TeX{} is the top layer, we use the \mref{@@_define_renderers:} +% macro to define plain \TeX{} token renderer macros and key-values +% immediately. Otherwise, we postpone the definition until the upper layers +% have been loaded. % % \end{markdown} % \begin{macrocode} -function util.table_copy(t) - local u = { } - for k, v in pairs(t) do u[k] = v end - return setmetatable(u, getmetatable(t)) -end +\str_if_eq:VVT + \c_@@_top_layer_tl + \c_@@_option_layer_plain_tex_tl + { + \@@_define_renderers: + } +\ExplSyntaxOff % \end{macrocode} -% \par +% \iffalse +% +%<*manual-tokens> +% \fi % \begin{markdown} -% -% The \luamdef{util.encode_json_string} method encodes a string `s` in -% \acro{JSON}. -% + +### Token Renderer Prototypes {#texrendererprototypes} + % \end{markdown} -% \begin{macrocode} -function util.encode_json_string(s) - s = s:gsub([[\]], [[\\]]) - s = s:gsub([["]], [[\"]]) - return [["]] .. s .. [["]] -end -% \end{macrocode} -% \par -% \begin{markdown} -% -% The \luamdef{util.lookup_files} method looks up files with filename `f` -% and returns their paths. Further options for the \pkg{Kpathsea} library -% can be specified in table `options`. [@luatex21, Section 10.7.4] -% +% \iffalse + +By default, token renderers point to package-defined \TeX{} macros, further +referred to as *prototypes*, which provide useful default definitions. + +##### Plain \TeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\def\markdownRendererTildePrototype{% + Packages can specify token renderer prototypes.% +} +\markdownBegin +~ +\markdownEnd + +\def\markdownRendererTilde{% + User-defined token renderers take precedence.% +} +\markdownBegin +~ +\markdownEnd +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> Packages can specify token renderer prototypes. +> +> User-defined token renderers take precedence. + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage{markdown} +\markdownSetup{ + rendererPrototypes = { + tilde = {Packages can specify token renderer prototypes.}, + }, +} +\begin{document} +\begin{markdown} +~ +\end{markdown} + +\begin{markdown}[ + renderers = { + tilde = {User-defined token renderers take precedence.}, + }, +] +~ +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> Packages can specify token renderer prototypes. +> +> User-defined token renderers take precedence. + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\def\markdownRendererTildePrototype{% + Packages can specify token renderer prototypes.% +} +\starttext +\startmarkdown +~ +\stopmarkdown + +\def\markdownRendererTilde{% + User-defined token renderers take precedence.% +} +\startmarkdown +~ +\stopmarkdown +\stoptext +``````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> Packages can specify token renderer prototypes. +> +> User-defined token renderers take precedence. + +% \fi +% +% \begin{markdown} + +#### YAML Metadata Renderer Prototypes {#expl3yamlmetadata} + +By default, the renderer prototypes for YAML metadata provide a high-level +interface that can be programmed using the `markdown/jekyllData` key--values +from the l3keys module of the \LaTeX{}3 kernel. + % \end{markdown} +% \iffalse + +##### Plain \TeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\input markdown +\def\markdownOptionJekyllData{true} +\ExplSyntaxOn +\keys_define:nn + { markdown/jekyllData } + { + name .code:n = { \gdef\name{#1} }, + age .code:n = { \gdef\age{#1} }, + } +\ExplSyntaxOff +\def\markdownRendererJekyllDataEnd{% + \name{} is \age{} years old.} +\markdownBegin +--- +name: Jane Doe +age: 99 +--- +\markdownEnd +\bye +``````` +Next, invoke LuaTeX from the terminal: +``` sh +luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> Jane Doe is 99 years old. + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[jekyllData]{markdown} +\markdownSetup{ + jekyllDataRenderers = { + name = {\gdef\name{#1}}, + code = {\gdef\age{#1}}, + }, + renderers = { + jekyllDataEnd = {\name{} is \age{} years old.}, + } +} +\begin{document} + +\begin{markdown} +--- +name: Jane Doe +age: 99 +--- +\end{markdown} + +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> Jane Doe is 99 years old. + +##### \Hologo{ConTeXt} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\setupmarkdown[jekyllData = yes] +\ExplSyntaxOn +\keys_define:nn + { markdown/jekyllData } + { + name .code:n = { \gdef\name{#1} }, + age .code:n = { \gdef\age{#1} }, + } +\ExplSyntaxOff +\def\markdownRendererJekyllDataEnd{% + \name{} is \age{} years old.} +\starttext + +\startmarkdown +--- +name: Jane Doe +age: 99 +--- +\stopmarkdown + +\stoptext +``````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> Jane Doe is 99 years old. + +% +%<*tex> +% \fi % \begin{macrocode} -function util.lookup_files(f, options) - return kpse.lookup(f, options) -end +\ExplSyntaxOn +\keys_define:nn + { markdown/jekyllData } + { } +\ExplSyntaxOff % \end{macrocode} -% \par % \begin{markdown} % -% The \luamdef{util.expand_tabs_in_line} expands tabs in string `s`. If -% `tabstop` is specified, it is used as the tab stop width. Otherwise, -% the tab stop width of 4 characters is used. The method is a copy of the tab -% expansion algorithm from @ierusalimschy13 [Chapter 21]. +% The `jekyllDataRenderers` key can be used as a syntactic sugar for setting +% the `markdown/jekyllData` key--values without using the expl3 language. % % \end{markdown} % \begin{macrocode} -function util.expand_tabs_in_line(s, tabstop) - local tab = tabstop or 4 - local corr = 0 - return (s:gsub("()\t", function(p) - local sp = tab - (p - 1 + corr) % tab - corr = corr - 1 + sp - return string.rep(" ", sp) - end)) -end -% \end{macrocode} -% \par -% \begin{markdown} -% -% The \luamdef{util.walk} method walks a rope `t`, applying a function `f` -% to each leaf element in order. A rope is an array whose elements may be -% ropes, strings, numbers, or functions. If a leaf element is a function, call -% it and get the return value before proceeding. -% -% \end{markdown} -% \begin{macrocode} -function util.walk(t, f) - local typ = type(t) - if typ == "string" then - f(t) - elseif typ == "table" then - local i = 1 - local n - n = t[i] - while n do - util.walk(n, f) - i = i + 1 - n = t[i] - end - elseif typ == "function" then - local ok, val = pcall(t) - if ok then - util.walk(val,f) - end - else - f(tostring(t)) - end -end +\ExplSyntaxOn +\@@_with_various_cases:nn + { jekyllDataRenderers } + { + \keys_define:nn + { markdown/options } + { + #1 .code:n = { + \tl_set:Nn + \l_tmpa_tl + { ##1 } % \end{macrocode} -% \par % \begin{markdown} % -% The \luamdef{util.flatten} method flattens an array `ary` that does not -% contain cycles and returns the result. +% To ensure that keys containing forward slashes get passed correctly, we +% replace all forward slashes in the input with backslash tokens with category +% code letter and then undo the replacement. This means that if any unbraced +% backslash tokens with category code letter exist in the input, they will be +% replaced with forward slashes. However, this should be extremely rare. % % \end{markdown} % \begin{macrocode} -function util.flatten(ary) - local new = {} - for _,v in ipairs(ary) do - if type(v) == "table" then - for _,w in ipairs(util.flatten(v)) do - new[#new + 1] = w - end - else - new[#new + 1] = v - end - end - return new -end + \tl_replace_all:NnV + \l_tmpa_tl + { / } + \c_backslash_str + \keys_set:nV + { markdown/options/jekyll-data-renderers } + \l_tmpa_tl + }, + } + } +\keys_define:nn + { markdown/options/jekyll-data-renderers } + { + unknown .code:n = { + \tl_set_eq:NN + \l_tmpa_tl + \l_keys_key_str + \tl_replace_all:NVn + \l_tmpa_tl + \c_backslash_str + { / } + \tl_put_right:Nn + \l_tmpa_tl + { + .code:n = { #1 } + } + \keys_define:nV + { markdown/jekyllData } + \l_tmpa_tl + } + } +\cs_generate_variant:Nn + \keys_define:nn + { nV } +\ExplSyntaxOff % \end{macrocode} -% \par % \begin{markdown} % -% The \luamdef{util.rope_to_string} method converts a rope `rope` to a -% string and returns it. For the definition of a rope, see the definition of -% the \luamref{util.walk} method. -% -% \end{markdown} -% \begin{macrocode} -function util.rope_to_string(rope) - local buffer = {} - util.walk(rope, function(x) buffer[#buffer + 1] = x end) - return table.concat(buffer) -end -% \end{macrocode} -% \par -% \begin{markdown} +%#### Generating Plain \TeX{} Token Renderer Prototype Macros and Key-Values {#plain-tex-renderer-prototypes} % -% The \luamdef{util.rope_last} method retrieves the last item in a rope. For -% the definition of a rope, see the definition of the \luamref{util.walk} method. +% We define the command \mdef{@@_define_renderer_prototypes:} that defines plain \TeX{} +% macros for token renderer prototypes. Futhermore, the `\markdownSetup` macro also accepts +% the `rendererPrototype` key, whose value must be a list of key-values, where the keys +% correspond to the markdown token renderer prototype macros and the values are new +% definitions of these token renderer prototypes. % % \end{markdown} % \begin{macrocode} -function util.rope_last(rope) - if #rope == 0 then - return nil - else - local l = rope[#rope] - if type(l) == "table" then - return util.rope_last(l) - else - return l - end - end -end +\ExplSyntaxOn +\cs_new:Nn \@@_define_renderer_prototypes: + { + \seq_map_function:NN + \g_@@_renderers_seq + \@@_define_renderer_prototype:n + } +\cs_new:Nn \@@_define_renderer_prototype:n + { + \@@_renderer_prototype_tl_to_csname:nN + { #1 } + \l_tmpa_tl + \prop_get:NnN + \g_@@_renderer_arities_prop + { #1 } + \l_tmpb_tl + \@@_define_renderer_prototype:ncV + { #1 } + { \l_tmpa_tl } + \l_tmpb_tl + } +\cs_new:Nn \@@_renderer_prototype_tl_to_csname:nN + { + \tl_set:Nn + \l_tmpa_tl + { \str_uppercase:n { #1 } } + \tl_set:Nx + #2 + { + markdownRenderer + \tl_head:f { \l_tmpa_tl } + \tl_tail:n { #1 } + Prototype + } + } +\tl_new:N + \l_@@_renderer_prototype_definition_tl +\cs_new:Nn \@@_define_renderer_prototype:nNn + { + \keys_define:nn + { markdown/options/renderer-prototypes } + { + #1 .code:n = { + \tl_set:Nn + \l_@@_renderer_prototype_definition_tl + { ##1 } + \regex_replace_all:nnN + { \cP\#0 } + { #1 } + \l_@@_renderer_prototype_definition_tl + \cs_generate_from_arg_count:NNnV + #2 + \cs_set:Npn + { #3 } + \l_@@_renderer_prototype_definition_tl + }, + } % \end{macrocode} -% \par % \begin{markdown} % -% Given an array `ary` and a string `x`, the \luamdef{util.intersperse} -% method returns an array `new`, such that `ary[i] == new[2*(i-1)+1]` and -% `new[2*i] == x` for all $1\leq`i`\leq`#ary`$. +% Unless the token renderer prototype macro has already been defined, +% we provide an empty definition. % % \end{markdown} % \begin{macrocode} -function util.intersperse(ary, x) - local new = {} - local l = #ary - for i,v in ipairs(ary) do - local n = #new - new[n + 1] = v - if i ~= l then - new[n + 2] = x - end - end - return new -end + \cs_if_free:NT + #2 + { + \cs_generate_from_arg_count:NNnn + #2 + \cs_set:Npn + { #3 } + { } + } + } +\cs_generate_variant:Nn + \@@_define_renderer_prototype:nNn + { ncV } +\ExplSyntaxOff % \end{macrocode} % \par % \begin{markdown} % -% Given an array `ary` and a function `f`, the \luamdef{util.map} method -% returns an array `new`, such that `new[i] == f(ary[i])` for all -% $1\leq`i`\leq`#ary`$. +% The following example code showcases a possible configuration of the +% `\markdownRendererImagePrototype` and `\markdownRendererCodeSpanPrototype` +% token renderer prototype macros. +% ``` tex +% \markdownSetup{ +% rendererPrototypes = { +% image = {\pdfximage{#2}}, \% Embed PDF images in the document. +% codeSpan = {{\tt #1}}, \% Render inline code using monospace. +% } +% } +% ``````` % -% \end{markdown} -% \begin{macrocode} -function util.map(ary, f) - local new = {} - for i,v in ipairs(ary) do - new[i] = f(v) - end - return new -end -% \end{macrocode} -% \par -% \begin{markdown} +% In addition to exact token renderer names, we also support wildcards +% and enumerations that match multiple token renderer prototype names: +% ``` tex +% \markdownSetup{ +% rendererPrototypes = { +% heading* = {{\bf #1}}, \% Render headings using the bold face. +% jekyllData(String|Number) = { \% Render YAML string and numbers +% {\it #2}\% \% using italics. +% }, +% } +% } +% ``````` % -% Given a table `char_escapes` mapping escapable characters to escaped -% strings and optionally a table `string_escapes` mapping escapable strings -% to escaped strings, the \luamdef{util.escaper} method returns an escaper -% function that escapes all occurances of escapable strings and characters (in -% this order). +% Wildcards and enumerations can be combined: +% ``` tex +% \markdownSetup{ +% rendererPrototypes = { +% *lItem(|End) = {"}, \% Quote ordered/bullet list items. +% } +% } +% ``````` % -% The method uses \pkg{LPeg}, which is faster than the Lua `string.gsub` -% built-in method. +% To determine the current token renderer prototype, you can use the +% parameter `#0`: +% ``` tex +% \markdownSetup{ +% rendererPrototypes = { +% heading* = {#0: #1}, \% Render headings as the renderer prototype +% } \% name followed by the heading text. +% } +% ``````` % % \end{markdown} % \begin{macrocode} -function util.escaper(char_escapes, string_escapes) -% \end{macrocode} -% \begin{markdown} -% Build a string of escapable characters. -% \end{markdown} -% \begin{macrocode} - local char_escapes_list = "" - for i,_ in pairs(char_escapes) do - char_escapes_list = char_escapes_list .. i - end -% \end{macrocode} -% \begin{markdown} -% Create an \pkg{LPeg} capture `escapable` that produces the escaped string -% corresponding to the matched escapable character. -% \end{markdown} -% \begin{macrocode} - local escapable = S(char_escapes_list) / char_escapes -% \end{macrocode} -% \begin{markdown} -% If `string_escapes` is provided, turn `escapable` into the -% $$\sum^^B{(`k`, `v`)\in`string_escapes`}`P(k) / v` + `escapable`$$ -% capture that replaces any occurance of the string `k` with the string -% `v` for each $(`k`, `v`)\in`string_escapes`$. Note that the pattern -% summation is not commutative and its operands are inspected in the -% summation order during the matching. As a corrolary, the strings always -% take precedence over the characters. +\ExplSyntaxOn +\seq_new:N + \l_@@_renderer_prototype_glob_results_seq +\keys_define:nn + { markdown/options/renderer-prototypes } + { + unknown .code:n = { + \@@_glob_seq:VnN + \l_keys_key_str + { g_@@_renderers_seq } + \l_@@_renderer_prototype_glob_results_seq + \seq_if_empty:NTF + \l_@@_renderer_prototype_glob_results_seq + { + \msg_error:nnV + { markdown } + { undefined-renderer-prototype } + \l_keys_key_str + } + { + \tl_set:Nn + \l_@@_renderer_prototype_definition_tl + { #1 } + \seq_map_inline:Nn + \l_@@_renderer_prototype_glob_results_seq + { + \@@_renderer_prototype_tl_to_csname:nN + { ##1 } + \l_tmpa_tl + \prop_get:NnN + \g_@@_renderer_arities_prop + { ##1 } + \l_tmpb_tl + \int_set:Nn + \l_tmpa_int + \l_tmpb_tl + \tl_set:NV + \l_tmpb_tl + \l_@@_renderer_prototype_definition_tl + \regex_replace_all:nnN + { \cP\#0 } + { ##1 } + \l_tmpb_tl + \cs_generate_from_arg_count:cNVV + { \l_tmpa_tl } + \cs_set:Npn + \l_tmpa_int + \l_tmpb_tl + } + } + }, + } +\msg_new:nnn + { markdown } + { undefined-renderer-prototype } + { + Renderer~prototype~#1~is~undefined. + } +\@@_with_various_cases:nn + { rendererPrototypes } + { + \keys_define:nn + { markdown/options } + { + #1 .code:n = { + \keys_set:nn + { markdown/options/renderer-prototypes } + { ##1 } + }, + } + } +% \end{macrocode} +% \begin{markdown} +% +% If plain \TeX{} is the top layer, we use the \mref{@@_define_renderer_prototypes:} +% macro to define plain \TeX{} token renderer prototype macros and key-values +% immediately. Otherwise, we postpone the definition until the upper layers +% have been loaded. % % \end{markdown} % \begin{macrocode} - if string_escapes then - for k,v in pairs(string_escapes) do - escapable = P(k) / v + escapable - end - end +\str_if_eq:VVT + \c_@@_top_layer_tl + \c_@@_option_layer_plain_tex_tl + { + \@@_define_renderer_prototypes: + } +\ExplSyntaxOff % \end{macrocode} % \begin{markdown} -% Create an \pkg{LPeg} capture `escape_string` that captures anything -% `escapable` does and matches any other unmatched characters. +% +%### Logging Facilities +% The \mdef{markdownInfo}, \mdef{markdownWarning}, and \mdef{markdownError} +% macros perform logging for the Markdown package. Their first argument +% specifies the text of the info, warning, or error message. +% The \mref{markdownError} macro receives a second argument that provides a help +% text. You may redefine these macros to redirect and process the info, +% warning, and error messages. +% +% The \mref{markdownInfo}, \mref{markdownWarning}, and \mref{markdownError} +% macros have been deprecated and will be removed in the next major version of +% the Markdown package. +% +%### Miscellanea +% The \mdef{markdownMakeOther} macro is used by the package, when a \TeX{} +% engine that does not support direct Lua access is starting to buffer a text. +% The plain \TeX{} implementation changes the category code of plain \TeX{} +% special characters to other, but there may be other active characters that +% may break the output. This macro should temporarily change the category of +% these to *other*. +% % \end{markdown} % \begin{macrocode} - local escape_string = Cs((escapable + any)^0) +\let\markdownMakeOther\relax % \end{macrocode} +% \par % \begin{markdown} -% Return a function that matches the input string `s` against the -% `escape_string` capture. +% +% The \mdef{markdownReadAndConvert} macro implements the \mref{markdownBegin} +% macro. The first argument specifies the token sequence that will terminate +% the markdown input (\mref{markdownEnd} in the instance of the \mref{markdownBegin} +% macro) when the plain \TeX{} special characters have had their category +% changed to *other*. The second argument specifies the token sequence +% that will actually be inserted into the document, when the ending token +% sequence has been found. +% % \end{markdown} % \begin{macrocode} - return function(s) - return lpeg.match(escape_string, s) - end -end +\let\markdownReadAndConvert\relax +\begingroup +% \end{macrocode} +% \begin{markdown} +% Locally swap the category code of the backslash symbol (`\`) with the pipe +% symbol (`|`). This is required in order that all the special symbols in the +% first argument of the `markdownReadAndConvert` macro have the category code +% *other*. +% +% \end{markdown} +% \begin{macrocode} + \catcode`\|=0\catcode`\\=12% + |gdef|markdownBegin{% + |markdownReadAndConvert{\markdownEnd}% + {|markdownEnd}}% +|endgroup +% \end{macrocode} +% \begin{markdown} +% The macro is exposed in the interface, so that users can create their own +% markdown environments. Due to the way the arguments are passed to Lua, the +% first argument may not contain the string `]]` (regardless of the category +% code of the bracket symbol). +% +% The `code` key, which can be used to immediately expand and execute code. +% \end{markdown} +% \begin{macrocode} +\ExplSyntaxOn +\keys_define:nn + { markdown/options } + { + code .code:n = { #1 }, + } +\ExplSyntaxOff % \end{macrocode} +% \begin{markdown} +% This can be especially useful in snippets. +% +% \end{markdown} +% \iffalse +% +% \fi % \par % \begin{markdown} % -% The \luamdef{util.pathname} method produces a pathname out of a directory -% name `dir` and a filename `file` and returns it. +% \LaTeX{} Interface {#latexinterface} +%-------------------- +% +% \end{markdown} +% \iffalse +%<*manual-interfaces> + +### \LaTeX{} + +The \LaTeX{} interface provides the same level of functionality as the plain +\TeX{} interface by using the plain \TeX{} interface behind the scenes. Unlike +the plain \TeX{} interface, the \LaTeX{} interface uses familiar \LaTeX{} +idioms, such as package options and environments. + +The \LaTeX{} interface accepts the same options as the plain \TeX{} interface, +but now the options are specified as \meta{key}${}={}$\meta{value} pairs and +they are passed either as package options, in the \mref{markdownSetup} command, or +as parameters for the \envmref{markdown*} \LaTeX{} environment. + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage{markdown} +\begin{document} + +\begin{markdown} +$\sqrt{-1}$ *equals* $i$ +\end{markdown} + +\begin{markdown}[texMathDollars] +$\sqrt{-1}$ *equals* $i$ +\end{markdown} + +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> \$\\sqrt{-1}\$ *equals* \$i\$. +> +> 1 +> *equals* +> i. + +Invoking pdfTeX should have the same effect: +``` sh +pdflatex --shell-escape document.tex +`````` + +% +%<*latex> +% \fi +% \begin{markdown} +% +% The \LaTeX{} interface provides \LaTeX{} environments for the typesetting of +% markdown input from within \LaTeX{}, facilities for setting Lua, plain \TeX, +% and \LaTeX{} options used during the conversion from markdown to plain +% \TeX{}, and facilities for changing the way markdown tokens are rendered. The +% rest of the interface is inherited from the plain \TeX{} interface (see +% Section <#sec:texinterface>). +% +% To determine whether \LaTeX{} is the top layer or if there are other +% layers above \LaTeX{}, we take a look on whether the +% \mref{c_@@_top_layer_tl} token list has already been defined. If not, +% we will assume that \LaTeX{} is the top layer. % % \end{markdown} % \begin{macrocode} -function util.pathname(dir, file) - if #dir == 0 then - return file - else - return dir .. "/" .. file - end -end +\ExplSyntaxOn +\tl_const:Nn \c_@@_option_layer_latex_tl { latex } +\cs_generate_variant:Nn + \tl_const:Nn + { NV } +\tl_if_exist:NF + \c_@@_top_layer_tl + { + \tl_const:NV + \c_@@_top_layer_tl + \c_@@_option_layer_latex_tl + } +\ExplSyntaxOff +\input markdown/markdown % \end{macrocode} +% \begin{markdown} +% +% The \LaTeX{} interface is implemented by the `markdown.sty` file, which +% can be loaded from the \LaTeX{} document preamble as follows: +% \end{markdown} +% \begin{Verbatim}[commandchars=\\\{\},gobble=2] +% \textbackslash{}usepackage[\textrm{\meta{options}}]\{markdown\} +% \end{Verbatim} +% \begin{markdown} +% where \meta{options} are the \LaTeX{} interface options (see Section +% <#sec:latex-options>). Note that \meta{options} inside the `\usepackage` +% macro may not set the `markdownRenderers` (see Section +% <#sec:plain-tex-renderers>) and `markdownRendererPrototypes` (see Section +% <#sec:plain-tex-renderer-prototypes>) keys. Furthermore, although the +% base variant of the `import` key that loads a single \LaTeX{} theme +% (see Section <#sec:latexthemes>) can be used, the extended variant +% that can load multiple themes and import snippets from them (see +% Section <#sec:snippets>) cannot. This limitation is due to the way +% \Hologo{LaTeX2e} parses package options. +% +% \end{markdown} % \par % \begin{markdown} % -%### HTML Entities -% This section documents the \acro{HTML} entities recognized by the -% markdown reader. These functions are encapsulated in the `entities` -% object. The functions were originally located in the -% `lunamark/entities.lua` file in the Lunamark Lua module. +%### Typesetting Markdown +% The interface exposes the \envmdef{markdown} and \envmdef{markdown*} +% \LaTeX{} environments, and redefines the \mref{markdownInput} command. +% +% The \envmref{markdown} and \envmref{markdown*} \LaTeX{} environments are used +% to typeset markdown document fragments. Both \LaTeX{} environments accept +% \LaTeX{} interface options (see ection <#sec:latex-options>) as the only +% argument. This argument is optional for the \envmref{markdown} environment +% and mandatory for the \envmref{markdown*} environment. +% +% The \envmref{markdown*} environment has been deprecated and will be removed +% in the next major version of the Markdown package. % % \end{markdown} % \begin{macrocode} -local entities = {} - -local character_entities = { - ["Tab"] = 9, - ["NewLine"] = 10, - ["excl"] = 33, - ["quot"] = 34, - ["QUOT"] = 34, - ["num"] = 35, +\newenvironment{markdown}\relax\relax +\newenvironment{markdown*}[1]\relax\relax +% \end{macrocode} +% \markdownBegin +% +% You may prepend your own code to the \mdef{markdown} macro and append your own +% code to the \mref{markdownEnd} macro to produce special effects before and after +% the \envmref{markdown} \LaTeX{} environment (and likewise for the starred +% version). +% +% Note that the \envmref{markdown} and \envmref{markdown*} \LaTeX{} environments are +% subject to the same limitations as the \mref{markdownBegin} and \mref{markdownEnd} +% macros exposed by the plain \TeX{} interface. +% +% The following example \LaTeX{} code showcases the usage of the +% \envmref{markdown} and \envmref{markdown*} environments: +% ``` tex +% \documentclass{article} \documentclass{article} +% \usepackage{markdown} \usepackage{markdown} +% \begin{document} \begin{document} +% \% ... \% ... +% \begin{markdown}[smartEllipses] \begin{markdown*}{smartEllipses} +% _Hello_ **world** ... _Hello_ **world** ... +% \end{markdown} \end{markdown*} +% \% ... \% ... +% \end{document} \end{document} +% ``````` +% +% The \mref{markdownInput} macro accepts a single mandatory parameter containing +% the filename of a markdown document and expands to the result of the +% conversion of the input markdown document to plain \TeX{}. Unlike the +% \mref{markdownInput} macro provided by the plain \TeX{} interface, this macro +% also accepts \LaTeX{} interface options (see Section <#sec:latex-options>) +% as its optional argument. These options will only influnce this markdown +% document. +% +% The following example \LaTeX{} code showcases the usage of the +% \mref{markdownInput} macro: +% ``` tex +% \documentclass{article} +% \usepackage{markdown} +% \begin{document} +% % ... +% \markdownInput[smartEllipses]{hello.md} +% % ... +% \end{document} +% ``````` +% +%### Options {#latex-options} +% +% The \LaTeX{} options are represented by a comma-delimited list of +% \meta{key}`=`\meta{value} pairs. For boolean options, the `=`\meta{value} +% part is optional, and \meta{key} will be interpreted as \meta{key}`=true` +% if the `=`\meta{value} part has been omitted. +% +% \LaTeX{} options map directly to the options recognized by the plain +% \TeX{} interface (see Section <#sec:tex-options>) and to the markdown token +% renderers and their prototypes recognized by the plain \TeX{} interface (see +% Sections <#sec:texrenderersuser> and <#sec:texrendererprototypes>). +% +% The \LaTeX{} options may be specified when loading the \LaTeX{} package, when +% using the \envmref{markdown*} \LaTeX{} environment or the \mref{markdownInput} +% macro (see Section <#sec:latexinterface>), or via the \mref{markdownSetup} +% macro. +% +%#### Finalizing and Freezing the Cache +% +% To ensure compatibility with the `minted` package [@poore17, Section +% 5.1], which supports the `finalizecache` and `frozencache` package options +% with similar semantics to the \Opt{finalizeCache} and \Opt{frozenCache} plain +% \TeX{} options, the Markdown package also recognizes these as aliases +% and accepts them as document class options. By passing `finalizecache` and +% `frozencache` as document class options, you may conveniently control the +% behavior of both packages at once: +% +% ``` tex +% \documentclass[frozencache]{article} +% \usepackage{markdown,minted} +% \begin{document} +% % ... +% \end{document} +% ``````` +% +% We hope that other packages will support the `finalizecache` and +% `frozencache` package options in the future, so that they can become a +% standard interface for preparing \LaTeX{} document sources for distribution. +% +% \markdownEnd +% \begin{macrocode} +\DeclareOption{finalizecache}{\markdownSetup{finalizeCache}} +\DeclareOption{frozencache}{\markdownSetup{frozenCache}} +% \end{macrocode} +% \iffalse +% +%<*manual-options> + +### \LaTeX{} + +\LaTeX{} options allow us to disable the redefinition of the default renderer +prototypes from plain \TeX{}, load user-defined themes, and invoke user-defined +set-up snippets. + +#### Setting Lua and plain \TeX{} options from \LaTeX{} + +As a rule of thumb, we can set all Lua options directly from \LaTeX{}. For +example, to set the \Opt{taskLists} Lua option to `true`, we would include the +following code in our \LaTeX{} document: + +``` tex +\markdownSetup{ + taskLists = true, +} +``` + +We can also set all plain \TeX{} options directly from \LaTeX{}. For example, +to set the `\markdownOptionInputTempFileName` plain \TeX{} option to +`helper-script.lua`, we would inclde the following code in our \LaTeX{} +document: + +``` tex +\markdownSetup{ + inputTempFileName = temporary-input.md, +} +``` + +% +%<*latex> +% \fi +% \begin{markdown} +% +%#### Generating Plain \TeX{} Option, Token Renderer, and Token Renderer Prototype Macros and Key-Values +% +% If \LaTeX{} is the top layer, we use the +% \mref{@@_define_option_commands_and_keyvals:}, \mref{@@_define_renderers:}, +% and \mref{@@_define_renderer_prototypes:} macro to define plain \TeX{} +% option, token renderer, and token renderer prototype macros and key-values +% immediately. Otherwise, we postpone the definition until the upper layers +% have been loaded. +% +% \end{markdown} +% \begin{macrocode} +\ExplSyntaxOn +\str_if_eq:VVT + \c_@@_top_layer_tl + \c_@@_option_layer_latex_tl + { + \@@_define_option_commands_and_keyvals: + \@@_define_renderers: + \@@_define_renderer_prototypes: + } +\ExplSyntaxOff +% \end{macrocode} +% \par +% \begin{markdown} +% +% The following example \LaTeX{} code showcases a possible configuration of +% plain \TeX{} interface options \Opt{hybrid}, \Opt{smartEllipses}, and +% \Opt{cacheDir}. +% ``` tex +% \markdownSetup{ +% hybrid, +% smartEllipses, +% cacheDir = /tmp, +% } +% ``````` +% +% \end{markdown} +% \iffalse +% +%<*manual-options> +% \fi +% \begin{markdown} + +### Themes {#latexthemes} + +% In Section~\ref{sec:themes}, we described the concept of themes. +In \LaTeX{}, we expand on the concept of +% themes\iffalse +[themes](#themes) +% \fi +by allowing a theme to be a full-blown \LaTeX{} package. Specifically, the +key-values `theme`=\meta{theme name} and `import`=\meta{theme name} load a +\LaTeX{} package named `markdowntheme`\meta{munged theme name}`.sty` if it +exists and a \TeX{} document named `markdowntheme`\meta{munged theme +name}`.tex` otherwise. + +Having the Markdown package automatically load either the generic `.tex` +*theme file* or the \LaTeX{}-specific `.sty` theme file allows developers +to have a single *theme file*, when the theme is small or the difference +between \TeX{} formats is unimportant, and scale up to separate theme files +native to different \TeX{} formats for large multi-format themes, where +different code is needed for different \TeX{} formats. To enable code reuse, +developers can load the `.tex` theme file from the `.sty` theme file using the +\mdef{markdownLoadPlainTeXTheme} macro. + +% If the \LaTeX{} option with keys `theme` or `import` is (repeatedly) +% specified in the `\usepackage` macro, the loading of the theme(s) will be +% postponed in first-in-first-out order until after the Markdown \LaTeX{} +% package has been loaded. Otherwise, the theme(s) will be loaded immediately. +% For example, there is a theme named `witiko/dot`, which typesets fenced code +% blocks with the `dot` infostring as images of directed graphs rendered by the +% Graphviz tools. The following code would first load the Markdown package, +% then the `markdownthemewitiko_beamer_MU.sty` \LaTeX{} package, and finally +% the `markdownthemewitiko_dot.sty` \LaTeX{} package: +% \end{markdown} +% \iffalse + +For example, to load themes named `witiko/beamer/MU` and `witiko/dot`, you +would use the following code in the preamble of your document: + +% \fi +% \par +% \begin{markdown} + +``` tex +\usepackage[ + import=witiko/beamer/MU, + import=witiko/dot, +]{markdown} +``````` + +% \end{markdown} +% \iffalse +% +%<*latex> +% \fi +% \begin{macrocode} +\newif\ifmarkdownLaTeXLoaded + \markdownLaTeXLoadedfalse +% \end{macrocode} +% \iffalse +% +%<*manual-options> +% \fi +% \par +% \begin{markdown} + +Due to limitations of \LaTeX{}, themes may not be loaded after the +beginning of a \LaTeX{} document. + +% \end{markdown} +% \par +% \markdownBegin + +Built-in \LaTeX{} themes provided with the Markdown package include: + +\pkg{witiko/dot} + +: A theme that typesets fenced code blocks with the `dot …` infostring + as images of directed graphs rendered by the Graphviz tools. The + right tail of the infostring is used as the image title. +% ```` tex +% \documentclass{article} +% \usepackage[import=witiko/dot]{markdown} +% \setkeys{Gin}{ +% width = \columnwidth, +% height = 0.65\paperheight, +% keepaspectratio} +% \begin{document} +% \begin{markdown} +% ``` dot Various formats of mathemathical formulae +% digraph tree { +% margin = 0; +% rankdir = "LR"; +% +% latex -> pmml; +% latex -> cmml; +% pmml -> slt; +% cmml -> opt; +% cmml -> prefix; +% cmml -> infix; +% pmml -> mterms [style=dashed]; +% cmml -> mterms; +% +% latex [label = "LaTeX"]; +% pmml [label = "Presentation MathML"]; +% cmml [label = "Content MathML"]; +% slt [label = "Symbol Layout Tree"]; +% opt [label = "Operator Tree"]; +% prefix [label = "Prefix"]; +% infix [label = "Infix"]; +% mterms [label = "M-Terms"]; +% } +% ``` +% \end{markdown} +% \end{document} +% ```````` +% Typesetting the above document produces the output shown in +% Figure <#fig:witiko/dot>. +% ``` dot Various formats of mathemathical formulae \label{fig:witiko/dot} +% digraph tree { +% margin = 0; +% rankdir = "LR"; +% +% latex -> pmml; +% latex -> cmml; +% pmml -> slt; +% cmml -> opt; +% cmml -> prefix; +% cmml -> infix; +% pmml -> mterms [style=dashed]; +% cmml -> mterms; +% +% latex [label = "LaTeX"]; +% pmml [label = "Presentation MathML"]; +% cmml [label = "Content MathML"]; +% slt [label = "Symbol Layout Tree"]; +% opt [label = "Operator Tree"]; +% prefix [label = "Prefix"]; +% infix [label = "Infix"]; +% mterms [label = "M-Terms"]; +% } +% ``` + The theme requires a Unix-like operating system with GNU Diffutils and + Graphviz installed. The theme also requires shell access unless the + \Opt{frozenCache} plain \TeX{} option is enabled. + +% \markdownEnd +% \iffalse + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +```` tex +\documentclass{article} +\usepackage[import=witiko/dot]{markdown} +\setkeys{Gin}{ + width=\columnwidth, + height=0.65\paperheight, + keepaspectratio} +\begin{document} +\begin{markdown} +``` dot Various formats of mathemathical formulae +digraph tree { + margin = 0; + rankdir = "LR"; + + latex -> pmml; + latex -> cmml; + pmml -> slt; + cmml -> opt; + cmml -> prefix; + cmml -> infix; + pmml -> mterms [style=dashed]; + cmml -> mterms; + + latex [label = "LaTeX"]; + pmml [label = "Presentation MathML"]; + cmml [label = "Content MathML"]; + slt [label = "Symbol Layout Tree"]; + opt [label = "Operator Tree"]; + prefix [label = "Prefix"]; + infix [label = "Infix"]; + mterms [label = "M-Terms"]; +} +``` +\end{markdown} +\end{document} +```````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain +a drawing of a directed graph similar to Figure 1 from the following +conference article: + +> NOVOTNÝ, Vít, Petr SOJKA, Michal ŠTEFÁNIK and Dávid LUPTÁK. Three is Better +> than One: Ensembling Math Information Retrieval Systems. *CEUR Workshop +> Proceedings*. Thessaloniki, Greece: M. Jeusfeld c/o Redaktion Sun SITE, +> Informatik V, RWTH Aachen., 2020, vol. 2020, No 2696, p. 1-30. ISSN 1613-0073. +> + +% +%<*themes-witiko-dot> +% \fi +% \begin{macrocode} +\ProvidesPackage{markdownthemewitiko_dot}[2021/03/09]% +% \end{macrocode} +% \iffalse +% +%<*manual-options> +% \fi +% \par +% \markdownBegin + +\pkg{witiko/graphicx/http} + +: A theme that adds support for downloading images whose URL has the + http or https protocol. +% ``` tex +% \documentclass{article} +% \usepackage[import=witiko/graphicx/http]{markdown} +% \begin{document} +% \begin{markdown} +% ![img](https://github.com/witiko/markdown/raw/main/markdown.png +% "The banner of the Markdown package") +% \end{markdown} +% \end{document} +% ``````` +% Typesetting the above document produces the output shown in +% Figure <#fig:witiko/graphicx/http>. +% ![img](https://github.com/witiko/markdown/raw/main/markdown.png +% "The banner of the Markdown package \label{fig:witiko/graphicx/http}") + The theme requires the \pkg{catchfile} \LaTeX{} package and a Unix-like + operating system with GNU Coreutils `md5sum` and either GNU Wget or cURL + installed. The theme also requires shell access unless the + \Opt{frozenCache} plain \TeX{} option is enabled. + +% \markdownEnd +% \iffalse + +##### \LaTeX{} Example {.unnumbered} + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\documentclass{article} +\usepackage[import=witiko/graphicx/http]{markdown} +\begin{document} +\begin{markdown} +![img](https://github.com/witiko/markdown/raw/main/markdown.png + "The banner of the Markdown package") +\end{markdown} +\end{document} +``````` +Next, invoke LuaTeX from the terminal: +``` sh +lualatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following image: + +> ![img](https://github.com/witiko/markdown/raw/main/markdown.png "The banner of the Markdown package") + +% +%<*themes-witiko-graphicx-http> +% \fi +% \begin{macrocode} +\ProvidesPackage{markdownthemewitiko_graphicx_http}[2021/03/22]% +% \end{macrocode} +% \iffalse +% +%<*manual-options> +% \fi +% \par +% \begin{markdown} + +\pkg{witiko/markdown/defaults} + +: A \LaTeX{} theme with the default definitions of token renderer prototypes + for plain \TeX{}. This theme is loaded automatically together with the + package and explicitly loading it has no effect. + +% \end{markdown} +% \iffalse +% +%<*latex> +% \fi +% \begin{macrocode} +\AtEndOfPackage{ + \markdownLaTeXLoadedtrue +% \end{macrocode} +% \begin{markdown} +% +% At the end of the \LaTeX{} module, we load the +% `witiko/markdown/defaults` \LaTeX{} theme (see Section <#sec:themes>) with +% the default definitions for token renderer prototypes unless the option +% `noDefaults` has been enabled (see Section <#sec:plain>). +% +% \end{markdown} +% \begin{macrocode} + \markdownIfOption{noDefaults}{}{ + \markdownSetup{theme=witiko/markdown/defaults} + } +} +% \end{macrocode} +% \iffalse +% +%<*themes-witiko-markdown-defaults-latex> +% \fi +% \begin{macrocode} +\ProvidesPackage{markdownthemewitiko_markdown_defaults}[2024/01/03]% +% \end{macrocode} +% \iffalse +% +%<*context> +% \fi +% \par +% \begin{markdown} +% +% Please, see Section <#sec:latex-themes-implementation> for implementation +% details of the built-in \LaTeX{} themes. +% +% \Hologo{ConTeXt} Interface {#contextinterface} +%---------------------------- +% +% \end{markdown} +% \iffalse +% +%<*manual-interfaces> + +### \Hologo{ConTeXt} + +The \Hologo{ConTeXt} interface provides the same level of functionality as the +plain \TeX{} interface by using the plain \TeX{} interface behind the scenes. +Unlike the plain \TeX{} interface, the \Hologo{ConTeXt} interface uses familiar +\Hologo{ConTeXt} idioms as syntactic sugar. + +The \Hologo{ConTeXt} interface accepts the same options as the plain \TeX{} +interface. + +Using a text editor, create a text document named `document.tex` with the +following content: +``` tex +\usemodule[t][markdown] +\starttext + +\startmarkdown +$\sqrt{-1}$ *equals* $i$. +\stopmarkdown + +\setupmarkdown[texmathdollars = yes] +\startmarkdown +$\sqrt{-1}$ *equals* $i$. +\stopmarkdown + +\stoptext +``````` +Next, invoke LuaTeX from the terminal: +``` sh +context --luatex document.tex +`````` +A PDF document named `document.pdf` should be produced and contain the +following text: + +> \$\\sqrt{-1}\$ *equals* \$i\$. +> +> 1 +> *equals* +> i. + +% +%<*context> +% \fi +% \begin{markdown} +% +% To determine whether \Hologo{ConTeXt} is the top layer or if there are other +% layers above \Hologo{ConTeXt}, we take a look on whether the +% \mref{c_@@_top_layer_tl} token list has already been defined. If not, +% we will assume that \Hologo{ConTeXt} is the top layer. +% +% \end{markdown} +% \begin{macrocode} +\ExplSyntaxOn +\tl_const:Nn \c_@@_option_layer_context_tl { context } +\cs_generate_variant:Nn + \tl_const:Nn + { NV } +\tl_if_exist:NF + \c_@@_top_layer_tl + { + \tl_const:NV + \c_@@_top_layer_tl + \c_@@_option_layer_context_tl + } +\ExplSyntaxOff +% \end{macrocode} +% \begin{markdown} +% +% The \Hologo{ConTeXt} interface provides a start-stop macro pair for the +% typesetting of markdown input from within \Hologo{ConTeXt} and facilities for +% setting Lua, plain \TeX, and \Hologo{ConTeXt} options used during the +% conversion from markdown to plain \TeX{}. The rest of the interface is +% inherited from the plain \TeX{} interface (see Section <#sec:texinterface>). +% +% \end{markdown} +% \begin{macrocode} +\writestatus{loading}{ConTeXt User Module / markdown}% +\startmodule[markdown] +\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\_\do\%\do\~}% +\input markdown/markdown +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \Hologo{ConTeXt} interface is implemented by the +% `t-markdown.tex` \Hologo{ConTeXt} module file that can be loaded as follows: +% ``` tex +% \usemodule[t][markdown] +% ``````` +% \noindent It is expected that the special plain \TeX{} characters have the +% expected category codes, when `\input`ting the file. +% +%### Typesetting Markdown +% The interface exposes the \mdef{startmarkdown} and \mdef{stopmarkdown} macro +% pair for the typesetting of a markdown document fragment, and defines the +% \mdef{inputmarkdown} macro. +% +% \end{markdown} +% \begin{macrocode} +\let\startmarkdown\relax +\let\stopmarkdown\relax +\let\inputmarkdown\relax +% \end{macrocode} +% \par +% \begin{markdown} +% +% You may prepend your own code to the \mref{startmarkdown} macro and redefine the +% \mref{stopmarkdown} macro to produce special effects before and after the +% markdown block. +% +% Note that the \mref{startmarkdown} and \mref{stopmarkdown} macros +% are subject to the same limitations as the \mref{markdownBegin} and +% \mref{markdownEnd} macros exposed by the plain \TeX{} interface. +% +% The following example \Hologo{ConTeXt} code showcases the usage of the +% \mref{startmarkdown} and \mref{stopmarkdown} macros: +% ``` tex +% \usemodule[t][markdown] +% \starttext +% \startmarkdown +% _Hello_ **world** ... +% \stopmarkdown +% \stoptext +% ``````` +% +% The \mref{inputmarkdown} macro accepts a single mandatory parameter +% containing the filename of a markdown document and expands to the result of +% the conversion of the input markdown document to plain \TeX{}. Unlike the +% \mref{markdownInput} macro provided by the plain \TeX{} interface, this macro +% also accepts \Hologo{ConTeXt} interface options (see Section +% <#sec:context-options>) as its optional argument. These options will only +% influnce this markdown document. +% +% The following example \LaTeX{} code showcases the usage of the +% \mref{markdownInput} macro: +% ``` tex +% \usemodule[t][markdown] +% \starttext +% % ... +% \inputmarkdown[smartEllipses]{hello.md} +% % ... +% \stoptext +% ``````` +% +%### Options {#context-options} +% +% The \Hologo{ConTeXt} options are represented by a comma-delimited list of +% \meta{key}`=`\meta{value} pairs. For boolean options, the `=`\meta{value} +% part is optional, and \meta{key} will be interpreted as \meta{key}`=true` +% (or, equivalently, \meta{key}`=yes`) if the `=`\meta{value} part has been +% omitted. +% +% \Hologo{ConTeXt} options map directly to the options recognized by the plain +% \TeX{} interface (see Section <#sec:tex-options>). +% +% The \Hologo{ConTeXt} options may be specified when using the +% \mref{inputmarkdown} macro (see Section <#sec:contextinterface>), +% via the \mref{markdownSetup} macro, or via the \mdef{setupmarkdown}`[#1]` +% macro, which is an alias for \mref{markdownSetup}`{#1}`. +% +% \end{markdown} +% \begin{macrocode} +\ExplSyntaxOn +\cs_new:Npn + \setupmarkdown + [ #1 ] + { + \@@_setup:n + { #1 } + } +\ExplSyntaxOff +% \end{macrocode} +% \begin{markdown} +% +%#### Generating Plain \TeX{} Option Macros and Key-Values +% +% Unlike plain \TeX{}, we also accept caseless variants of options +% in line with the style of \Hologo{ConTeXt}. +% +% \end{markdown} +% \begin{macrocode} +\ExplSyntaxOn +\cs_new:Nn \@@_caseless:N + { + \regex_replace_all:nnN + { ([a-z])([A-Z]) } + { \1 \c { str_lowercase:n } \cB\{ \2 \cE\} } + #1 + \tl_set:Nx + #1 + { #1 } + } +\seq_gput_right:Nn \g_@@_cases_seq { @@_caseless:N } +% \end{macrocode} +% \begin{markdown} +% +% If \Hologo{ConTeXt} is the top layer, we use the +% \mref{@@_define_option_commands_and_keyvals:}, \mref{@@_define_renderers:}, +% and \mref{@@_define_renderer_prototypes:} macro to define plain \TeX{} +% option, token renderer, and token renderer prototype macros and key-values +% immediately. Otherwise, we postpone the definition until the upper layers +% have been loaded. +% +% \end{markdown} +% \begin{macrocode} +\str_if_eq:VVT + \c_@@_top_layer_tl + \c_@@_option_layer_context_tl + { + \@@_define_option_commands_and_keyvals: + \@@_define_renderers: + \@@_define_renderer_prototypes: + } +\ExplSyntaxOff +% \end{macrocode} +% \iffalse +% +%<*manual-options> +% \fi +% \begin{markdown} + +### Themes + +% In Section~\ref{sec:themes}, we described the concept of themes. +In \Hologo{ConTeXt}, we expand on the concept of +% themes\iffalse +[themes](#themes) +% \fi +by allowing a theme to be a full-blown \Hologo{ConTeXt} module. Specifically, +the key-values `theme`=\meta{theme name} and `import`=\meta{theme name} load a +\Hologo{ConTeXt} module named `t-markdowntheme`\meta{munged theme name}`.tex` +if it exists and a \TeX{} document named `markdowntheme`\meta{munged theme +name}`.tex` otherwise. + +Having the Markdown package automatically load either the generic `.tex` +*theme file* or the \Hologo{ConTeXt}-specific `t-*.tex` theme file allows +developers to have a single *theme file*, when the theme is small or the +difference between \TeX{} formats is unimportant, and scale up to separate +theme files native to different \TeX{} formats for large multi-format themes, +where different code is needed for different \TeX{} formats. To enable code +reuse, developers can load the `.tex` theme file from the `t-*.tex` theme file +using the \mref{markdownLoadPlainTeXTheme} macro. + +For example, to load a theme named `witiko/tilde` in your document: + +``` tex +\usemodule[t][markdown] +\setupmarkdown[import=witiko/tilde] +``````` + +Built-in \Hologo{ConTeXt} themes provided with the Markdown package include: + +\pkg{witiko/markdown/defaults} + +: A \Hologo{ConTeXt} theme with the default definitions of token renderer + prototypes for plain \TeX{}. This theme is loaded automatically together + with the package and explicitly loading it has no effect. + +% \end{markdown} +% \iffalse +% +%<*themes-witiko-markdown-defaults-context> +% \fi +% \begin{macrocode} +\startmodule[markdownthemewitiko_markdown_defaults] +\unprotect +% \end{macrocode} +% \iffalse +% +%<*manual-options> +% \fi +% \begin{markdown} +% +% Please, see Section <#sec:context-themes-implementation> for implementation +% details of the built-in \Hologo{ConTeXt} themes. +% +% Implementation {#implementation} +%================ +% +% This part of the documentation describes the implementation of the interfaces +% exposed by the package (see Section <#sec:interfaces>) and is aimed at the +% developers of the package, as well as the curious users. +% +% Figure <#fig:block-diagram> shows the high-level structure of the Markdown +% package: The translation from markdown to \TeX{} *token renderers* is +% performed by the Lua layer. The plain \TeX{} layer provides default +% definitions for the token renderers. The \LaTeX{} and \Hologo{ConTeXt} layers +% correct idiosyncrasies of the respective \TeX{} formats, and provide +% format-specific default definitions for the token renderers. +% +% \end{markdown} +% \iffalse +% +%<*lua> +% \fi +% \begin{markdown} +% +% Lua Implementation {#luaimplementation} +%-------------------- +% +% The Lua implementation implements \luamdef{writer} and \luamref{reader} +% objects, which provide the conversion from markdown to plain \TeX, and +% \luamdef{extensions} objects, which provide syntax extensions for the +% \luamref{writer} and \luamref{reader} objects. +% +% The Lunamark Lua module implements writers for the conversion to various +% other formats, such as DocBook, Groff, or \acro{HTML}. These were stripped +% from the module and the remaining markdown reader and plain \TeX{} writer +% were hidden behind the converter functions exposed by the Lua interface (see +% Section <#sec:luainterface>). +% +% \end{markdown} +% \begin{macrocode} +local upper, format, length = + string.upper, string.format, string.len +local P, R, S, V, C, Cg, Cb, Cmt, Cc, Ct, B, Cs, Cp, any = + lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.C, lpeg.Cg, lpeg.Cb, + lpeg.Cmt, lpeg.Cc, lpeg.Ct, lpeg.B, lpeg.Cs, lpeg.Cp, lpeg.P(1) +% \end{macrocode} +% \par +% \begin{markdown} +% +%### Utility Functions +% This section documents the utility functions used by the plain \TeX{} +% writer and the markdown reader. These functions are encapsulated in the +% `util` object. The functions were originally located in the +% `lunamark/util.lua` file in the Lunamark Lua module. +% +% \end{markdown} +% \begin{macrocode} +local util = {} +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \luamdef{util.err} method prints an error message `msg` and exits. +% If `exit_code` is provided, it specifies the exit code. Otherwise, the +% exit code will be 1. +% +% \end{markdown} +% \begin{macrocode} +function util.err(msg, exit_code) + io.stderr:write("markdown.lua: " .. msg .. "\n") + os.exit(exit_code or 1) +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \luamdef{util.cache} method computes the digest of `string` and +% `salt`, adds the `suffix` and looks into the directory `dir`, whether a +% file with such a name exists. If it does not, it gets created with +% `transform(string)` as its content. The filename is then returned. +% +% \end{markdown} +% \begin{macrocode} +function util.cache(dir, string, salt, transform, suffix) + local digest = md5.sumhexa(string .. (salt or "")) + local name = util.pathname(dir, digest .. suffix) + local file = io.open(name, "r") + if file == nil then -- If no cache entry exists, then create a new one. + file = assert(io.open(name, "w"), + [[Could not open file "]] .. name .. [[" for writing]]) + local result = string + if transform ~= nil then + result = transform(result) + end + assert(file:write(result)) + assert(file:close()) + end + return name +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \luamdef{util.cache_verbatim} method strips whitespaces from the +% end of `string` and calls \luamref{util.cache} with `dir`, `string`, +% no salt or transformations, and the `.verbatim` suffix. +% +% \end{markdown} +% \begin{macrocode} +function util.cache_verbatim(dir, string) + local name = util.cache(dir, string, nil, nil, ".verbatim") + return name +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \luamdef{util.table_copy} method creates a shallow copy of a table `t` +% and its metatable. +% +% \end{markdown} +% \begin{macrocode} +function util.table_copy(t) + local u = { } + for k, v in pairs(t) do u[k] = v end + return setmetatable(u, getmetatable(t)) +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \luamdef{util.encode_json_string} method encodes a string `s` in +% \acro{JSON}. +% +% \end{markdown} +% \begin{macrocode} +function util.encode_json_string(s) + s = s:gsub([[\]], [[\\]]) + s = s:gsub([["]], [[\"]]) + return [["]] .. s .. [["]] +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \luamdef{util.lookup_files} method looks up files with filename `f` +% and returns their paths. Further options for the \pkg{Kpathsea} library +% can be specified in table `options`. [@luatex21, Section 10.7.4] +% +% \end{markdown} +% \begin{macrocode} +function util.lookup_files(f, options) + return kpse.lookup(f, options) +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \luamdef{util.expand_tabs_in_line} expands tabs in string `s`. If +% `tabstop` is specified, it is used as the tab stop width. Otherwise, +% the tab stop width of 4 characters is used. The method is a copy of the tab +% expansion algorithm from @ierusalimschy13 [Chapter 21]. +% +% \end{markdown} +% \begin{macrocode} +function util.expand_tabs_in_line(s, tabstop) + local tab = tabstop or 4 + local corr = 0 + return (s:gsub("()\t", function(p) + local sp = tab - (p - 1 + corr) % tab + corr = corr - 1 + sp + return string.rep(" ", sp) + end)) +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \luamdef{util.walk} method walks a rope `t`, applying a function `f` +% to each leaf element in order. A rope is an array whose elements may be +% ropes, strings, numbers, or functions. If a leaf element is a function, call +% it and get the return value before proceeding. +% +% \end{markdown} +% \begin{macrocode} +function util.walk(t, f) + local typ = type(t) + if typ == "string" then + f(t) + elseif typ == "table" then + local i = 1 + local n + n = t[i] + while n do + util.walk(n, f) + i = i + 1 + n = t[i] + end + elseif typ == "function" then + local ok, val = pcall(t) + if ok then + util.walk(val,f) + end + else + f(tostring(t)) + end +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \luamdef{util.flatten} method flattens an array `ary` that does not +% contain cycles and returns the result. +% +% \end{markdown} +% \begin{macrocode} +function util.flatten(ary) + local new = {} + for _,v in ipairs(ary) do + if type(v) == "table" then + for _,w in ipairs(util.flatten(v)) do + new[#new + 1] = w + end + else + new[#new + 1] = v + end + end + return new +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \luamdef{util.rope_to_string} method converts a rope `rope` to a +% string and returns it. For the definition of a rope, see the definition of +% the \luamref{util.walk} method. +% +% \end{markdown} +% \begin{macrocode} +function util.rope_to_string(rope) + local buffer = {} + util.walk(rope, function(x) buffer[#buffer + 1] = x end) + return table.concat(buffer) +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \luamdef{util.rope_last} method retrieves the last item in a rope. For +% the definition of a rope, see the definition of the \luamref{util.walk} method. +% +% \end{markdown} +% \begin{macrocode} +function util.rope_last(rope) + if #rope == 0 then + return nil + else + local l = rope[#rope] + if type(l) == "table" then + return util.rope_last(l) + else + return l + end + end +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Given an array `ary` and a string `x`, the \luamdef{util.intersperse} +% method returns an array `new`, such that `ary[i] == new[2*(i-1)+1]` and +% `new[2*i] == x` for all $1\leq`i`\leq`#ary`$. +% +% \end{markdown} +% \begin{macrocode} +function util.intersperse(ary, x) + local new = {} + local l = #ary + for i,v in ipairs(ary) do + local n = #new + new[n + 1] = v + if i ~= l then + new[n + 2] = x + end + end + return new +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Given an array `ary` and a function `f`, the \luamdef{util.map} method +% returns an array `new`, such that `new[i] == f(ary[i])` for all +% $1\leq`i`\leq`#ary`$. +% +% \end{markdown} +% \begin{macrocode} +function util.map(ary, f) + local new = {} + for i,v in ipairs(ary) do + new[i] = f(v) + end + return new +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Given a table `char_escapes` mapping escapable characters to escaped +% strings and optionally a table `string_escapes` mapping escapable strings +% to escaped strings, the \luamdef{util.escaper} method returns an escaper +% function that escapes all occurances of escapable strings and characters (in +% this order). +% +% The method uses \pkg{LPeg}, which is faster than the Lua `string.gsub` +% built-in method. +% +% \end{markdown} +% \begin{macrocode} +function util.escaper(char_escapes, string_escapes) +% \end{macrocode} +% \begin{markdown} +% Build a string of escapable characters. +% \end{markdown} +% \begin{macrocode} + local char_escapes_list = "" + for i,_ in pairs(char_escapes) do + char_escapes_list = char_escapes_list .. i + end +% \end{macrocode} +% \begin{markdown} +% Create an \pkg{LPeg} capture `escapable` that produces the escaped string +% corresponding to the matched escapable character. +% \end{markdown} +% \begin{macrocode} + local escapable = S(char_escapes_list) / char_escapes +% \end{macrocode} +% \begin{markdown} +% If `string_escapes` is provided, turn `escapable` into the +% $$\sum^^B{(`k`, `v`)\in`string_escapes`}`P(k) / v` + `escapable`$$ +% capture that replaces any occurance of the string `k` with the string +% `v` for each $(`k`, `v`)\in`string_escapes`$. Note that the pattern +% summation is not commutative and its operands are inspected in the +% summation order during the matching. As a corrolary, the strings always +% take precedence over the characters. +% +% \end{markdown} +% \begin{macrocode} + if string_escapes then + for k,v in pairs(string_escapes) do + escapable = P(k) / v + escapable + end + end +% \end{macrocode} +% \begin{markdown} +% Create an \pkg{LPeg} capture `escape_string` that captures anything +% `escapable` does and matches any other unmatched characters. +% \end{markdown} +% \begin{macrocode} + local escape_string = Cs((escapable + any)^0) +% \end{macrocode} +% \begin{markdown} +% Return a function that matches the input string `s` against the +% `escape_string` capture. +% \end{markdown} +% \begin{macrocode} + return function(s) + return lpeg.match(escape_string, s) + end +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \luamdef{util.pathname} method produces a pathname out of a directory +% name `dir` and a filename `file` and returns it. +% +% \end{markdown} +% \begin{macrocode} +function util.pathname(dir, file) + if #dir == 0 then + return file + else + return dir .. "/" .. file + end +end +% \end{macrocode} +% \par +% \begin{markdown} +% +%### HTML Entities +% This section documents the \acro{HTML} entities recognized by the +% markdown reader. These functions are encapsulated in the `entities` +% object. The functions were originally located in the +% `lunamark/entities.lua` file in the Lunamark Lua module. +% +% \end{markdown} +% \begin{macrocode} +local entities = {} + +local character_entities = { + ["Tab"] = 9, + ["NewLine"] = 10, + ["excl"] = 33, + ["QUOT"] = 34, + ["quot"] = 34, + ["num"] = 35, ["dollar"] = 36, ["percnt"] = 37, - ["amp"] = 38, ["AMP"] = 38, + ["amp"] = 38, ["apos"] = 39, ["lpar"] = 40, ["rpar"] = 41, @@ -20967,31 +22334,36 @@ local character_entities = { ["sol"] = 47, ["colon"] = 58, ["semi"] = 59, - ["lt"] = 60, ["LT"] = 60, + ["lt"] = 60, + ["nvlt"] = {60, 8402}, + ["bne"] = {61, 8421}, ["equals"] = 61, - ["gt"] = 62, ["GT"] = 62, + ["gt"] = 62, + ["nvgt"] = {62, 8402}, ["quest"] = 63, ["commat"] = 64, - ["lsqb"] = 91, ["lbrack"] = 91, + ["lsqb"] = 91, ["bsol"] = 92, - ["rsqb"] = 93, ["rbrack"] = 93, + ["rsqb"] = 93, ["Hat"] = 94, + ["UnderBar"] = 95, ["lowbar"] = 95, - ["grave"] = 96, ["DiacriticalGrave"] = 96, - ["lcub"] = 123, + ["grave"] = 96, + ["fjlig"] = {102, 106}, ["lbrace"] = 123, + ["lcub"] = 123, + ["VerticalLine"] = 124, ["verbar"] = 124, ["vert"] = 124, - ["VerticalLine"] = 124, - ["rcub"] = 125, ["rbrace"] = 125, - ["nbsp"] = 160, + ["rcub"] = 125, ["NonBreakingSpace"] = 160, + ["nbsp"] = 160, ["iexcl"] = 161, ["cent"] = 162, ["pound"] = 163, @@ -21000,36 +22372,35 @@ local character_entities = { ["brvbar"] = 166, ["sect"] = 167, ["Dot"] = 168, - ["die"] = 168, ["DoubleDot"] = 168, + ["die"] = 168, ["uml"] = 168, - ["copy"] = 169, ["COPY"] = 169, + ["copy"] = 169, ["ordf"] = 170, ["laquo"] = 171, ["not"] = 172, ["shy"] = 173, - ["reg"] = 174, - ["circledR"] = 174, ["REG"] = 174, + ["circledR"] = 174, + ["reg"] = 174, ["macr"] = 175, - ["OverBar"] = 175, ["strns"] = 175, ["deg"] = 176, + ["PlusMinus"] = 177, ["plusmn"] = 177, ["pm"] = 177, - ["PlusMinus"] = 177, ["sup2"] = 178, ["sup3"] = 179, - ["acute"] = 180, ["DiacriticalAcute"] = 180, + ["acute"] = 180, ["micro"] = 181, ["para"] = 182, - ["middot"] = 183, - ["centerdot"] = 183, ["CenterDot"] = 183, - ["cedil"] = 184, + ["centerdot"] = 183, + ["middot"] = 183, ["Cedilla"] = 184, + ["cedil"] = 184, ["sup1"] = 185, ["ordm"] = 186, ["raquo"] = 187, @@ -21044,6 +22415,7 @@ local character_entities = { ["Atilde"] = 195, ["Auml"] = 196, ["Aring"] = 197, + ["angst"] = 197, ["AElig"] = 198, ["Ccedil"] = 199, ["Egrave"] = 200, @@ -21093,8 +22465,8 @@ local character_entities = { ["ocirc"] = 244, ["otilde"] = 245, ["ouml"] = 246, - ["divide"] = 247, ["div"] = 247, + ["divide"] = 247, ["oslash"] = 248, ["ugrave"] = 249, ["uacute"] = 250, @@ -21229,20 +22601,19 @@ local character_entities = { ["gacute"] = 501, ["jmath"] = 567, ["circ"] = 710, - ["caron"] = 711, ["Hacek"] = 711, - ["breve"] = 728, + ["caron"] = 711, ["Breve"] = 728, - ["dot"] = 729, + ["breve"] = 728, ["DiacriticalDot"] = 729, + ["dot"] = 729, ["ring"] = 730, ["ogon"] = 731, - ["tilde"] = 732, ["DiacriticalTilde"] = 732, - ["dblac"] = 733, + ["tilde"] = 732, ["DiacriticalDoubleAcute"] = 733, + ["dblac"] = 733, ["DownBreve"] = 785, - ["UnderBar"] = 818, ["Alpha"] = 913, ["Beta"] = 914, ["Gamma"] = 915, @@ -21267,12 +22638,12 @@ local character_entities = { ["Chi"] = 935, ["Psi"] = 936, ["Omega"] = 937, + ["ohm"] = 937, ["alpha"] = 945, ["beta"] = 946, ["gamma"] = 947, ["delta"] = 948, - ["epsiv"] = 949, - ["varepsilon"] = 949, + ["epsi"] = 949, ["epsilon"] = 949, ["zeta"] = 950, ["eta"] = 951, @@ -21286,38 +22657,39 @@ local character_entities = { ["omicron"] = 959, ["pi"] = 960, ["rho"] = 961, + ["sigmaf"] = 962, ["sigmav"] = 962, ["varsigma"] = 962, - ["sigmaf"] = 962, ["sigma"] = 963, ["tau"] = 964, ["upsi"] = 965, ["upsilon"] = 965, ["phi"] = 966, - ["phiv"] = 966, - ["varphi"] = 966, ["chi"] = 967, ["psi"] = 968, ["omega"] = 969, + ["thetasym"] = 977, ["thetav"] = 977, ["vartheta"] = 977, - ["thetasym"] = 977, ["Upsi"] = 978, ["upsih"] = 978, + ["phiv"] = 981, ["straightphi"] = 981, + ["varphi"] = 981, ["piv"] = 982, ["varpi"] = 982, ["Gammad"] = 988, - ["gammad"] = 989, ["digamma"] = 989, + ["gammad"] = 989, ["kappav"] = 1008, ["varkappa"] = 1008, ["rhov"] = 1009, ["varrho"] = 1009, - ["epsi"] = 1013, + ["epsiv"] = 1013, ["straightepsilon"] = 1013, - ["bepsi"] = 1014, + ["varepsilon"] = 1013, ["backepsilon"] = 1014, + ["bepsi"] = 1014, ["IOcy"] = 1025, ["DJcy"] = 1026, ["GJcy"] = 1027, @@ -21416,40 +22788,40 @@ local character_entities = { ["emsp14"] = 8197, ["numsp"] = 8199, ["puncsp"] = 8200, - ["thinsp"] = 8201, ["ThinSpace"] = 8201, - ["hairsp"] = 8202, + ["thinsp"] = 8201, ["VeryThinSpace"] = 8202, - ["ZeroWidthSpace"] = 8203, - ["NegativeVeryThinSpace"] = 8203, - ["NegativeThinSpace"] = 8203, + ["hairsp"] = 8202, ["NegativeMediumSpace"] = 8203, ["NegativeThickSpace"] = 8203, + ["NegativeThinSpace"] = 8203, + ["NegativeVeryThinSpace"] = 8203, + ["ZeroWidthSpace"] = 8203, ["zwnj"] = 8204, ["zwj"] = 8205, ["lrm"] = 8206, ["rlm"] = 8207, - ["hyphen"] = 8208, ["dash"] = 8208, + ["hyphen"] = 8208, ["ndash"] = 8211, ["mdash"] = 8212, ["horbar"] = 8213, ["Verbar"] = 8214, ["Vert"] = 8214, - ["lsquo"] = 8216, ["OpenCurlyQuote"] = 8216, + ["lsquo"] = 8216, + ["CloseCurlyQuote"] = 8217, ["rsquo"] = 8217, ["rsquor"] = 8217, - ["CloseCurlyQuote"] = 8217, ["lsquor"] = 8218, ["sbquo"] = 8218, - ["ldquo"] = 8220, ["OpenCurlyDoubleQuote"] = 8220, + ["ldquo"] = 8220, + ["CloseCurlyDoubleQuote"] = 8221, ["rdquo"] = 8221, ["rdquor"] = 8221, - ["CloseCurlyDoubleQuote"] = 8221, - ["ldquor"] = 8222, ["bdquo"] = 8222, + ["ldquor"] = 8222, ["dagger"] = 8224, ["Dagger"] = 8225, ["ddagger"] = 8225, @@ -21463,10 +22835,11 @@ local character_entities = { ["prime"] = 8242, ["Prime"] = 8243, ["tprime"] = 8244, - ["bprime"] = 8245, ["backprime"] = 8245, + ["bprime"] = 8245, ["lsaquo"] = 8249, ["rsaquo"] = 8250, + ["OverBar"] = 8254, ["oline"] = 8254, ["caret"] = 8257, ["hybull"] = 8259, @@ -21474,6 +22847,7 @@ local character_entities = { ["bsemi"] = 8271, ["qprime"] = 8279, ["MediumSpace"] = 8287, + ["ThickSpace"] = {8287, 8202}, ["NoBreak"] = 8288, ["ApplyFunction"] = 8289, ["af"] = 8289, @@ -21482,34 +22856,34 @@ local character_entities = { ["InvisibleComma"] = 8291, ["ic"] = 8291, ["euro"] = 8364, - ["tdot"] = 8411, ["TripleDot"] = 8411, + ["tdot"] = 8411, ["DotDot"] = 8412, ["Copf"] = 8450, ["complexes"] = 8450, ["incare"] = 8453, ["gscr"] = 8458, - ["hamilt"] = 8459, ["HilbertSpace"] = 8459, ["Hscr"] = 8459, + ["hamilt"] = 8459, ["Hfr"] = 8460, ["Poincareplane"] = 8460, - ["quaternions"] = 8461, ["Hopf"] = 8461, + ["quaternions"] = 8461, ["planckh"] = 8462, - ["planck"] = 8463, ["hbar"] = 8463, - ["plankv"] = 8463, ["hslash"] = 8463, + ["planck"] = 8463, + ["plankv"] = 8463, ["Iscr"] = 8464, ["imagline"] = 8464, - ["image"] = 8465, + ["Ifr"] = 8465, ["Im"] = 8465, + ["image"] = 8465, ["imagpart"] = 8465, - ["Ifr"] = 8465, + ["Laplacetrf"] = 8466, ["Lscr"] = 8466, ["lagran"] = 8466, - ["Laplacetrf"] = 8466, ["ell"] = 8467, ["Nopf"] = 8469, ["naturals"] = 8469, @@ -21519,40 +22893,38 @@ local character_entities = { ["wp"] = 8472, ["Popf"] = 8473, ["primes"] = 8473, - ["rationals"] = 8474, ["Qopf"] = 8474, + ["rationals"] = 8474, ["Rscr"] = 8475, ["realine"] = 8475, - ["real"] = 8476, ["Re"] = 8476, - ["realpart"] = 8476, ["Rfr"] = 8476, - ["reals"] = 8477, + ["real"] = 8476, + ["realpart"] = 8476, ["Ropf"] = 8477, + ["reals"] = 8477, ["rx"] = 8478, - ["trade"] = 8482, ["TRADE"] = 8482, - ["integers"] = 8484, + ["trade"] = 8482, ["Zopf"] = 8484, - ["ohm"] = 8486, + ["integers"] = 8484, ["mho"] = 8487, ["Zfr"] = 8488, ["zeetrf"] = 8488, ["iiota"] = 8489, - ["angst"] = 8491, - ["bernou"] = 8492, ["Bernoullis"] = 8492, ["Bscr"] = 8492, - ["Cfr"] = 8493, + ["bernou"] = 8492, ["Cayleys"] = 8493, + ["Cfr"] = 8493, ["escr"] = 8495, ["Escr"] = 8496, ["expectation"] = 8496, - ["Fscr"] = 8497, ["Fouriertrf"] = 8497, - ["phmmat"] = 8499, + ["Fscr"] = 8497, ["Mellintrf"] = 8499, ["Mscr"] = 8499, + ["phmmat"] = 8499, ["order"] = 8500, ["orderof"] = 8500, ["oscr"] = 8500, @@ -21566,8 +22938,8 @@ local character_entities = { ["DifferentialD"] = 8518, ["dd"] = 8518, ["ExponentialE"] = 8519, - ["exponentiale"] = 8519, ["ee"] = 8519, + ["exponentiale"] = 8519, ["ImaginaryI"] = 8520, ["ii"] = 8520, ["frac13"] = 8531, @@ -21582,46 +22954,47 @@ local character_entities = { ["frac38"] = 8540, ["frac58"] = 8541, ["frac78"] = 8542, + ["LeftArrow"] = 8592, + ["ShortLeftArrow"] = 8592, ["larr"] = 8592, ["leftarrow"] = 8592, - ["LeftArrow"] = 8592, ["slarr"] = 8592, - ["ShortLeftArrow"] = 8592, + ["ShortUpArrow"] = 8593, + ["UpArrow"] = 8593, ["uarr"] = 8593, ["uparrow"] = 8593, - ["UpArrow"] = 8593, - ["ShortUpArrow"] = 8593, + ["RightArrow"] = 8594, + ["ShortRightArrow"] = 8594, ["rarr"] = 8594, ["rightarrow"] = 8594, - ["RightArrow"] = 8594, ["srarr"] = 8594, - ["ShortRightArrow"] = 8594, - ["darr"] = 8595, - ["downarrow"] = 8595, ["DownArrow"] = 8595, ["ShortDownArrow"] = 8595, + ["darr"] = 8595, + ["downarrow"] = 8595, + ["LeftRightArrow"] = 8596, ["harr"] = 8596, ["leftrightarrow"] = 8596, - ["LeftRightArrow"] = 8596, - ["varr"] = 8597, - ["updownarrow"] = 8597, ["UpDownArrow"] = 8597, - ["nwarr"] = 8598, + ["updownarrow"] = 8597, + ["varr"] = 8597, ["UpperLeftArrow"] = 8598, + ["nwarr"] = 8598, ["nwarrow"] = 8598, - ["nearr"] = 8599, ["UpperRightArrow"] = 8599, + ["nearr"] = 8599, ["nearrow"] = 8599, + ["LowerRightArrow"] = 8600, ["searr"] = 8600, ["searrow"] = 8600, - ["LowerRightArrow"] = 8600, + ["LowerLeftArrow"] = 8601, ["swarr"] = 8601, ["swarrow"] = 8601, - ["LowerLeftArrow"] = 8601, ["nlarr"] = 8602, ["nleftarrow"] = 8602, ["nrarr"] = 8603, ["nrightarrow"] = 8603, + ["nrarrw"] = {8605, 824}, ["rarrw"] = 8605, ["rightsquigarrow"] = 8605, ["Larr"] = 8606, @@ -21638,27 +23011,27 @@ local character_entities = { ["mapstoleft"] = 8612, ["UpTeeArrow"] = 8613, ["mapstoup"] = 8613, - ["map"] = 8614, ["RightTeeArrow"] = 8614, + ["map"] = 8614, ["mapsto"] = 8614, ["DownTeeArrow"] = 8615, ["mapstodown"] = 8615, - ["larrhk"] = 8617, ["hookleftarrow"] = 8617, - ["rarrhk"] = 8618, + ["larrhk"] = 8617, ["hookrightarrow"] = 8618, + ["rarrhk"] = 8618, ["larrlp"] = 8619, ["looparrowleft"] = 8619, - ["rarrlp"] = 8620, ["looparrowright"] = 8620, + ["rarrlp"] = 8620, ["harrw"] = 8621, ["leftrightsquigarrow"] = 8621, ["nharr"] = 8622, ["nleftrightarrow"] = 8622, - ["lsh"] = 8624, ["Lsh"] = 8624, - ["rsh"] = 8625, + ["lsh"] = 8624, ["Rsh"] = 8625, + ["rsh"] = 8625, ["ldsh"] = 8626, ["rdsh"] = 8627, ["crarr"] = 8629, @@ -21666,456 +23039,505 @@ local character_entities = { ["curvearrowleft"] = 8630, ["curarr"] = 8631, ["curvearrowright"] = 8631, - ["olarr"] = 8634, ["circlearrowleft"] = 8634, - ["orarr"] = 8635, + ["olarr"] = 8634, ["circlearrowright"] = 8635, - ["lharu"] = 8636, + ["orarr"] = 8635, ["LeftVector"] = 8636, ["leftharpoonup"] = 8636, - ["lhard"] = 8637, - ["leftharpoondown"] = 8637, + ["lharu"] = 8636, ["DownLeftVector"] = 8637, + ["leftharpoondown"] = 8637, + ["lhard"] = 8637, + ["RightUpVector"] = 8638, ["uharr"] = 8638, ["upharpoonright"] = 8638, - ["RightUpVector"] = 8638, + ["LeftUpVector"] = 8639, ["uharl"] = 8639, ["upharpoonleft"] = 8639, - ["LeftUpVector"] = 8639, - ["rharu"] = 8640, ["RightVector"] = 8640, + ["rharu"] = 8640, ["rightharpoonup"] = 8640, + ["DownRightVector"] = 8641, ["rhard"] = 8641, ["rightharpoondown"] = 8641, - ["DownRightVector"] = 8641, - ["dharr"] = 8642, ["RightDownVector"] = 8642, + ["dharr"] = 8642, ["downharpoonright"] = 8642, - ["dharl"] = 8643, ["LeftDownVector"] = 8643, + ["dharl"] = 8643, ["downharpoonleft"] = 8643, - ["rlarr"] = 8644, - ["rightleftarrows"] = 8644, ["RightArrowLeftArrow"] = 8644, - ["udarr"] = 8645, + ["rightleftarrows"] = 8644, + ["rlarr"] = 8644, ["UpArrowDownArrow"] = 8645, - ["lrarr"] = 8646, - ["leftrightarrows"] = 8646, + ["udarr"] = 8645, ["LeftArrowRightArrow"] = 8646, - ["llarr"] = 8647, + ["leftrightarrows"] = 8646, + ["lrarr"] = 8646, ["leftleftarrows"] = 8647, - ["uuarr"] = 8648, + ["llarr"] = 8647, ["upuparrows"] = 8648, - ["rrarr"] = 8649, + ["uuarr"] = 8648, ["rightrightarrows"] = 8649, + ["rrarr"] = 8649, ["ddarr"] = 8650, ["downdownarrows"] = 8650, - ["lrhar"] = 8651, ["ReverseEquilibrium"] = 8651, ["leftrightharpoons"] = 8651, - ["rlhar"] = 8652, - ["rightleftharpoons"] = 8652, + ["lrhar"] = 8651, ["Equilibrium"] = 8652, - ["nlArr"] = 8653, + ["rightleftharpoons"] = 8652, + ["rlhar"] = 8652, ["nLeftarrow"] = 8653, - ["nhArr"] = 8654, + ["nlArr"] = 8653, ["nLeftrightarrow"] = 8654, - ["nrArr"] = 8655, + ["nhArr"] = 8654, ["nRightarrow"] = 8655, - ["lArr"] = 8656, - ["Leftarrow"] = 8656, + ["nrArr"] = 8655, ["DoubleLeftArrow"] = 8656, - ["uArr"] = 8657, - ["Uparrow"] = 8657, + ["Leftarrow"] = 8656, + ["lArr"] = 8656, ["DoubleUpArrow"] = 8657, - ["rArr"] = 8658, - ["Rightarrow"] = 8658, - ["Implies"] = 8658, + ["Uparrow"] = 8657, + ["uArr"] = 8657, ["DoubleRightArrow"] = 8658, - ["dArr"] = 8659, - ["Downarrow"] = 8659, + ["Implies"] = 8658, + ["Rightarrow"] = 8658, + ["rArr"] = 8658, ["DoubleDownArrow"] = 8659, - ["hArr"] = 8660, - ["Leftrightarrow"] = 8660, + ["Downarrow"] = 8659, + ["dArr"] = 8659, ["DoubleLeftRightArrow"] = 8660, + ["Leftrightarrow"] = 8660, + ["hArr"] = 8660, ["iff"] = 8660, - ["vArr"] = 8661, - ["Updownarrow"] = 8661, ["DoubleUpDownArrow"] = 8661, + ["Updownarrow"] = 8661, + ["vArr"] = 8661, ["nwArr"] = 8662, ["neArr"] = 8663, ["seArr"] = 8664, ["swArr"] = 8665, - ["lAarr"] = 8666, ["Lleftarrow"] = 8666, - ["rAarr"] = 8667, + ["lAarr"] = 8666, ["Rrightarrow"] = 8667, + ["rAarr"] = 8667, ["zigrarr"] = 8669, - ["larrb"] = 8676, ["LeftArrowBar"] = 8676, - ["rarrb"] = 8677, + ["larrb"] = 8676, ["RightArrowBar"] = 8677, - ["duarr"] = 8693, + ["rarrb"] = 8677, ["DownArrowUpArrow"] = 8693, + ["duarr"] = 8693, ["loarr"] = 8701, ["roarr"] = 8702, ["hoarr"] = 8703, - ["forall"] = 8704, ["ForAll"] = 8704, + ["forall"] = 8704, ["comp"] = 8705, ["complement"] = 8705, - ["part"] = 8706, ["PartialD"] = 8706, - ["exist"] = 8707, + ["npart"] = {8706, 824}, + ["part"] = 8706, ["Exists"] = 8707, - ["nexist"] = 8708, + ["exist"] = 8707, ["NotExists"] = 8708, + ["nexist"] = 8708, ["nexists"] = 8708, ["empty"] = 8709, ["emptyset"] = 8709, ["emptyv"] = 8709, ["varnothing"] = 8709, - ["nabla"] = 8711, ["Del"] = 8711, - ["isin"] = 8712, - ["isinv"] = 8712, + ["nabla"] = 8711, ["Element"] = 8712, ["in"] = 8712, - ["notin"] = 8713, + ["isin"] = 8712, + ["isinv"] = 8712, ["NotElement"] = 8713, + ["notin"] = 8713, ["notinva"] = 8713, - ["niv"] = 8715, ["ReverseElement"] = 8715, - ["ni"] = 8715, ["SuchThat"] = 8715, + ["ni"] = 8715, + ["niv"] = 8715, + ["NotReverseElement"] = 8716, ["notni"] = 8716, ["notniva"] = 8716, - ["NotReverseElement"] = 8716, - ["prod"] = 8719, ["Product"] = 8719, - ["coprod"] = 8720, + ["prod"] = 8719, ["Coproduct"] = 8720, - ["sum"] = 8721, + ["coprod"] = 8720, ["Sum"] = 8721, + ["sum"] = 8721, ["minus"] = 8722, + ["MinusPlus"] = 8723, ["mnplus"] = 8723, ["mp"] = 8723, - ["MinusPlus"] = 8723, - ["plusdo"] = 8724, ["dotplus"] = 8724, - ["setmn"] = 8726, - ["setminus"] = 8726, + ["plusdo"] = 8724, ["Backslash"] = 8726, - ["ssetmn"] = 8726, + ["setminus"] = 8726, + ["setmn"] = 8726, ["smallsetminus"] = 8726, + ["ssetmn"] = 8726, ["lowast"] = 8727, - ["compfn"] = 8728, ["SmallCircle"] = 8728, - ["radic"] = 8730, + ["compfn"] = 8728, ["Sqrt"] = 8730, + ["radic"] = 8730, + ["Proportional"] = 8733, ["prop"] = 8733, ["propto"] = 8733, - ["Proportional"] = 8733, - ["vprop"] = 8733, ["varpropto"] = 8733, + ["vprop"] = 8733, ["infin"] = 8734, ["angrt"] = 8735, ["ang"] = 8736, ["angle"] = 8736, + ["nang"] = {8736, 8402}, ["angmsd"] = 8737, ["measuredangle"] = 8737, ["angsph"] = 8738, - ["mid"] = 8739, ["VerticalBar"] = 8739, - ["smid"] = 8739, + ["mid"] = 8739, ["shortmid"] = 8739, - ["nmid"] = 8740, + ["smid"] = 8739, ["NotVerticalBar"] = 8740, - ["nsmid"] = 8740, + ["nmid"] = 8740, ["nshortmid"] = 8740, + ["nsmid"] = 8740, + ["DoubleVerticalBar"] = 8741, ["par"] = 8741, ["parallel"] = 8741, - ["DoubleVerticalBar"] = 8741, - ["spar"] = 8741, ["shortparallel"] = 8741, + ["spar"] = 8741, + ["NotDoubleVerticalBar"] = 8742, ["npar"] = 8742, ["nparallel"] = 8742, - ["NotDoubleVerticalBar"] = 8742, - ["nspar"] = 8742, ["nshortparallel"] = 8742, + ["nspar"] = 8742, ["and"] = 8743, ["wedge"] = 8743, ["or"] = 8744, ["vee"] = 8744, ["cap"] = 8745, + ["caps"] = {8745, 65024}, ["cup"] = 8746, - ["int"] = 8747, + ["cups"] = {8746, 65024}, ["Integral"] = 8747, + ["int"] = 8747, ["Int"] = 8748, - ["tint"] = 8749, ["iiint"] = 8749, + ["tint"] = 8749, + ["ContourIntegral"] = 8750, ["conint"] = 8750, ["oint"] = 8750, - ["ContourIntegral"] = 8750, ["Conint"] = 8751, ["DoubleContourIntegral"] = 8751, ["Cconint"] = 8752, ["cwint"] = 8753, - ["cwconint"] = 8754, ["ClockwiseContourIntegral"] = 8754, - ["awconint"] = 8755, + ["cwconint"] = 8754, ["CounterClockwiseContourIntegral"] = 8755, + ["awconint"] = 8755, + ["Therefore"] = 8756, ["there4"] = 8756, ["therefore"] = 8756, - ["Therefore"] = 8756, + ["Because"] = 8757, ["becaus"] = 8757, ["because"] = 8757, - ["Because"] = 8757, ["ratio"] = 8758, ["Colon"] = 8759, ["Proportion"] = 8759, - ["minusd"] = 8760, ["dotminus"] = 8760, + ["minusd"] = 8760, ["mDDot"] = 8762, ["homtht"] = 8763, - ["sim"] = 8764, ["Tilde"] = 8764, - ["thksim"] = 8764, + ["nvsim"] = {8764, 8402}, + ["sim"] = 8764, ["thicksim"] = 8764, - ["bsim"] = 8765, + ["thksim"] = 8764, ["backsim"] = 8765, + ["bsim"] = 8765, + ["race"] = {8765, 817}, ["ac"] = 8766, + ["acE"] = {8766, 819}, ["mstpos"] = 8766, ["acd"] = 8767, - ["wreath"] = 8768, ["VerticalTilde"] = 8768, ["wr"] = 8768, - ["nsim"] = 8769, + ["wreath"] = 8768, ["NotTilde"] = 8769, - ["esim"] = 8770, + ["nsim"] = 8769, ["EqualTilde"] = 8770, + ["NotEqualTilde"] = {8770, 824}, ["eqsim"] = 8770, - ["sime"] = 8771, + ["esim"] = 8770, + ["nesim"] = {8770, 824}, ["TildeEqual"] = 8771, + ["sime"] = 8771, ["simeq"] = 8771, + ["NotTildeEqual"] = 8772, ["nsime"] = 8772, ["nsimeq"] = 8772, - ["NotTildeEqual"] = 8772, - ["cong"] = 8773, ["TildeFullEqual"] = 8773, + ["cong"] = 8773, ["simne"] = 8774, - ["ncong"] = 8775, ["NotTildeFullEqual"] = 8775, - ["asymp"] = 8776, - ["ap"] = 8776, + ["ncong"] = 8775, ["TildeTilde"] = 8776, + ["ap"] = 8776, ["approx"] = 8776, - ["thkap"] = 8776, + ["asymp"] = 8776, ["thickapprox"] = 8776, - ["nap"] = 8777, + ["thkap"] = 8776, ["NotTildeTilde"] = 8777, + ["nap"] = 8777, ["napprox"] = 8777, ["ape"] = 8778, ["approxeq"] = 8778, ["apid"] = 8779, - ["bcong"] = 8780, + ["napid"] = {8779, 824}, ["backcong"] = 8780, - ["asympeq"] = 8781, + ["bcong"] = 8780, ["CupCap"] = 8781, - ["bump"] = 8782, - ["HumpDownHump"] = 8782, + ["asympeq"] = 8781, + ["nvap"] = {8781, 8402}, ["Bumpeq"] = 8782, - ["bumpe"] = 8783, + ["HumpDownHump"] = 8782, + ["NotHumpDownHump"] = {8782, 824}, + ["bump"] = 8782, + ["nbump"] = {8782, 824}, ["HumpEqual"] = 8783, + ["NotHumpEqual"] = {8783, 824}, + ["bumpe"] = 8783, ["bumpeq"] = 8783, - ["esdot"] = 8784, + ["nbumpe"] = {8783, 824}, ["DotEqual"] = 8784, ["doteq"] = 8784, - ["eDot"] = 8785, + ["esdot"] = 8784, + ["nedot"] = {8784, 824}, ["doteqdot"] = 8785, + ["eDot"] = 8785, ["efDot"] = 8786, ["fallingdotseq"] = 8786, ["erDot"] = 8787, ["risingdotseq"] = 8787, + ["Assign"] = 8788, ["colone"] = 8788, ["coloneq"] = 8788, - ["Assign"] = 8788, ["ecolon"] = 8789, ["eqcolon"] = 8789, ["ecir"] = 8790, ["eqcirc"] = 8790, - ["cire"] = 8791, ["circeq"] = 8791, + ["cire"] = 8791, ["wedgeq"] = 8793, ["veeeq"] = 8794, - ["trie"] = 8796, ["triangleq"] = 8796, + ["trie"] = 8796, ["equest"] = 8799, ["questeq"] = 8799, - ["ne"] = 8800, ["NotEqual"] = 8800, - ["equiv"] = 8801, + ["ne"] = 8800, ["Congruent"] = 8801, - ["nequiv"] = 8802, + ["bnequiv"] = {8801, 8421}, + ["equiv"] = 8801, ["NotCongruent"] = 8802, + ["nequiv"] = 8802, ["le"] = 8804, ["leq"] = 8804, - ["ge"] = 8805, + ["nvle"] = {8804, 8402}, ["GreaterEqual"] = 8805, + ["ge"] = 8805, ["geq"] = 8805, - ["lE"] = 8806, + ["nvge"] = {8805, 8402}, ["LessFullEqual"] = 8806, + ["lE"] = 8806, ["leqq"] = 8806, - ["gE"] = 8807, + ["nlE"] = {8806, 824}, + ["nleqq"] = {8806, 824}, ["GreaterFullEqual"] = 8807, + ["NotGreaterFullEqual"] = {8807, 824}, + ["gE"] = 8807, ["geqq"] = 8807, + ["ngE"] = {8807, 824}, + ["ngeqq"] = {8807, 824}, ["lnE"] = 8808, ["lneqq"] = 8808, + ["lvertneqq"] = {8808, 65024}, + ["lvnE"] = {8808, 65024}, ["gnE"] = 8809, ["gneqq"] = 8809, + ["gvertneqq"] = {8809, 65024}, + ["gvnE"] = {8809, 65024}, ["Lt"] = 8810, ["NestedLessLess"] = 8810, + ["NotLessLess"] = {8810, 824}, ["ll"] = 8810, + ["nLt"] = {8810, 8402}, + ["nLtv"] = {8810, 824}, ["Gt"] = 8811, ["NestedGreaterGreater"] = 8811, + ["NotGreaterGreater"] = {8811, 824}, ["gg"] = 8811, - ["twixt"] = 8812, + ["nGt"] = {8811, 8402}, + ["nGtv"] = {8811, 824}, ["between"] = 8812, + ["twixt"] = 8812, ["NotCupCap"] = 8813, - ["nlt"] = 8814, ["NotLess"] = 8814, ["nless"] = 8814, - ["ngt"] = 8815, + ["nlt"] = 8814, ["NotGreater"] = 8815, + ["ngt"] = 8815, ["ngtr"] = 8815, - ["nle"] = 8816, ["NotLessEqual"] = 8816, + ["nle"] = 8816, ["nleq"] = 8816, - ["nge"] = 8817, ["NotGreaterEqual"] = 8817, + ["nge"] = 8817, ["ngeq"] = 8817, - ["lsim"] = 8818, ["LessTilde"] = 8818, ["lesssim"] = 8818, + ["lsim"] = 8818, + ["GreaterTilde"] = 8819, ["gsim"] = 8819, ["gtrsim"] = 8819, - ["GreaterTilde"] = 8819, - ["nlsim"] = 8820, ["NotLessTilde"] = 8820, - ["ngsim"] = 8821, + ["nlsim"] = 8820, ["NotGreaterTilde"] = 8821, - ["lg"] = 8822, - ["lessgtr"] = 8822, + ["ngsim"] = 8821, ["LessGreater"] = 8822, + ["lessgtr"] = 8822, + ["lg"] = 8822, + ["GreaterLess"] = 8823, ["gl"] = 8823, ["gtrless"] = 8823, - ["GreaterLess"] = 8823, - ["ntlg"] = 8824, ["NotLessGreater"] = 8824, - ["ntgl"] = 8825, + ["ntlg"] = 8824, ["NotGreaterLess"] = 8825, - ["pr"] = 8826, + ["ntgl"] = 8825, ["Precedes"] = 8826, + ["pr"] = 8826, ["prec"] = 8826, - ["sc"] = 8827, ["Succeeds"] = 8827, + ["sc"] = 8827, ["succ"] = 8827, - ["prcue"] = 8828, ["PrecedesSlantEqual"] = 8828, + ["prcue"] = 8828, ["preccurlyeq"] = 8828, - ["sccue"] = 8829, ["SucceedsSlantEqual"] = 8829, + ["sccue"] = 8829, ["succcurlyeq"] = 8829, - ["prsim"] = 8830, - ["precsim"] = 8830, ["PrecedesTilde"] = 8830, + ["precsim"] = 8830, + ["prsim"] = 8830, + ["NotSucceedsTilde"] = {8831, 824}, + ["SucceedsTilde"] = 8831, ["scsim"] = 8831, ["succsim"] = 8831, - ["SucceedsTilde"] = 8831, + ["NotPrecedes"] = 8832, ["npr"] = 8832, ["nprec"] = 8832, - ["NotPrecedes"] = 8832, + ["NotSucceeds"] = 8833, ["nsc"] = 8833, ["nsucc"] = 8833, - ["NotSucceeds"] = 8833, + ["NotSubset"] = {8834, 8402}, + ["nsubset"] = {8834, 8402}, ["sub"] = 8834, ["subset"] = 8834, + ["vnsub"] = {8834, 8402}, + ["NotSuperset"] = {8835, 8402}, + ["Superset"] = 8835, + ["nsupset"] = {8835, 8402}, ["sup"] = 8835, ["supset"] = 8835, - ["Superset"] = 8835, + ["vnsup"] = {8835, 8402}, ["nsub"] = 8836, ["nsup"] = 8837, - ["sube"] = 8838, ["SubsetEqual"] = 8838, + ["sube"] = 8838, ["subseteq"] = 8838, + ["SupersetEqual"] = 8839, ["supe"] = 8839, ["supseteq"] = 8839, - ["SupersetEqual"] = 8839, + ["NotSubsetEqual"] = 8840, ["nsube"] = 8840, ["nsubseteq"] = 8840, - ["NotSubsetEqual"] = 8840, + ["NotSupersetEqual"] = 8841, ["nsupe"] = 8841, ["nsupseteq"] = 8841, - ["NotSupersetEqual"] = 8841, ["subne"] = 8842, ["subsetneq"] = 8842, + ["varsubsetneq"] = {8842, 65024}, + ["vsubne"] = {8842, 65024}, ["supne"] = 8843, ["supsetneq"] = 8843, + ["varsupsetneq"] = {8843, 65024}, + ["vsupne"] = {8843, 65024}, ["cupdot"] = 8845, - ["uplus"] = 8846, ["UnionPlus"] = 8846, - ["sqsub"] = 8847, + ["uplus"] = 8846, + ["NotSquareSubset"] = {8847, 824}, ["SquareSubset"] = 8847, + ["sqsub"] = 8847, ["sqsubset"] = 8847, - ["sqsup"] = 8848, + ["NotSquareSuperset"] = {8848, 824}, ["SquareSuperset"] = 8848, + ["sqsup"] = 8848, ["sqsupset"] = 8848, - ["sqsube"] = 8849, ["SquareSubsetEqual"] = 8849, + ["sqsube"] = 8849, ["sqsubseteq"] = 8849, - ["sqsupe"] = 8850, ["SquareSupersetEqual"] = 8850, + ["sqsupe"] = 8850, ["sqsupseteq"] = 8850, - ["sqcap"] = 8851, ["SquareIntersection"] = 8851, - ["sqcup"] = 8852, + ["sqcap"] = 8851, + ["sqcaps"] = {8851, 65024}, ["SquareUnion"] = 8852, - ["oplus"] = 8853, + ["sqcup"] = 8852, + ["sqcups"] = {8852, 65024}, ["CirclePlus"] = 8853, - ["ominus"] = 8854, + ["oplus"] = 8853, ["CircleMinus"] = 8854, - ["otimes"] = 8855, + ["ominus"] = 8854, ["CircleTimes"] = 8855, + ["otimes"] = 8855, ["osol"] = 8856, - ["odot"] = 8857, ["CircleDot"] = 8857, - ["ocir"] = 8858, + ["odot"] = 8857, ["circledcirc"] = 8858, - ["oast"] = 8859, + ["ocir"] = 8858, ["circledast"] = 8859, - ["odash"] = 8861, + ["oast"] = 8859, ["circleddash"] = 8861, - ["plusb"] = 8862, + ["odash"] = 8861, ["boxplus"] = 8862, - ["minusb"] = 8863, + ["plusb"] = 8862, ["boxminus"] = 8863, - ["timesb"] = 8864, + ["minusb"] = 8863, ["boxtimes"] = 8864, - ["sdotb"] = 8865, + ["timesb"] = 8864, ["dotsquare"] = 8865, - ["vdash"] = 8866, + ["sdotb"] = 8865, ["RightTee"] = 8866, - ["dashv"] = 8867, + ["vdash"] = 8866, ["LeftTee"] = 8867, - ["top"] = 8868, + ["dashv"] = 8867, ["DownTee"] = 8868, - ["bottom"] = 8869, + ["top"] = 8868, + ["UpTee"] = 8869, ["bot"] = 8869, + ["bottom"] = 8869, ["perp"] = 8869, - ["UpTee"] = 8869, ["models"] = 8871, - ["vDash"] = 8872, ["DoubleRightTee"] = 8872, + ["vDash"] = 8872, ["Vdash"] = 8873, ["Vvdash"] = 8874, ["VDash"] = 8875, @@ -22124,22 +23546,24 @@ local character_entities = { ["nVdash"] = 8878, ["nVDash"] = 8879, ["prurel"] = 8880, - ["vltri"] = 8882, - ["vartriangleleft"] = 8882, ["LeftTriangle"] = 8882, - ["vrtri"] = 8883, - ["vartriangleright"] = 8883, + ["vartriangleleft"] = 8882, + ["vltri"] = 8882, ["RightTriangle"] = 8883, + ["vartriangleright"] = 8883, + ["vrtri"] = 8883, + ["LeftTriangleEqual"] = 8884, ["ltrie"] = 8884, + ["nvltrie"] = {8884, 8402}, ["trianglelefteq"] = 8884, - ["LeftTriangleEqual"] = 8884, + ["RightTriangleEqual"] = 8885, + ["nvrtrie"] = {8885, 8402}, ["rtrie"] = 8885, ["trianglerighteq"] = 8885, - ["RightTriangleEqual"] = 8885, ["origof"] = 8886, ["imof"] = 8887, - ["mumap"] = 8888, ["multimap"] = 8888, + ["mumap"] = 8888, ["hercon"] = 8889, ["intcal"] = 8890, ["intercal"] = 8890, @@ -22147,39 +23571,39 @@ local character_entities = { ["barvee"] = 8893, ["angrtvb"] = 8894, ["lrtri"] = 8895, - ["xwedge"] = 8896, ["Wedge"] = 8896, ["bigwedge"] = 8896, - ["xvee"] = 8897, + ["xwedge"] = 8896, ["Vee"] = 8897, ["bigvee"] = 8897, - ["xcap"] = 8898, + ["xvee"] = 8897, ["Intersection"] = 8898, ["bigcap"] = 8898, - ["xcup"] = 8899, + ["xcap"] = 8898, ["Union"] = 8899, ["bigcup"] = 8899, + ["xcup"] = 8899, + ["Diamond"] = 8900, ["diam"] = 8900, ["diamond"] = 8900, - ["Diamond"] = 8900, ["sdot"] = 8901, - ["sstarf"] = 8902, ["Star"] = 8902, - ["divonx"] = 8903, + ["sstarf"] = 8902, ["divideontimes"] = 8903, + ["divonx"] = 8903, ["bowtie"] = 8904, ["ltimes"] = 8905, ["rtimes"] = 8906, - ["lthree"] = 8907, ["leftthreetimes"] = 8907, - ["rthree"] = 8908, + ["lthree"] = 8907, ["rightthreetimes"] = 8908, - ["bsime"] = 8909, + ["rthree"] = 8908, ["backsimeq"] = 8909, - ["cuvee"] = 8910, + ["bsime"] = 8909, ["curlyvee"] = 8910, - ["cuwed"] = 8911, + ["cuvee"] = 8910, ["curlywedge"] = 8911, + ["cuwed"] = 8911, ["Sub"] = 8912, ["Subset"] = 8912, ["Sup"] = 8913, @@ -22189,49 +23613,53 @@ local character_entities = { ["fork"] = 8916, ["pitchfork"] = 8916, ["epar"] = 8917, - ["ltdot"] = 8918, ["lessdot"] = 8918, + ["ltdot"] = 8918, ["gtdot"] = 8919, ["gtrdot"] = 8919, ["Ll"] = 8920, + ["nLl"] = {8920, 824}, ["Gg"] = 8921, ["ggg"] = 8921, - ["leg"] = 8922, + ["nGg"] = {8921, 824}, ["LessEqualGreater"] = 8922, + ["leg"] = 8922, + ["lesg"] = {8922, 65024}, ["lesseqgtr"] = 8922, + ["GreaterEqualLess"] = 8923, ["gel"] = 8923, + ["gesl"] = {8923, 65024}, ["gtreqless"] = 8923, - ["GreaterEqualLess"] = 8923, ["cuepr"] = 8926, ["curlyeqprec"] = 8926, ["cuesc"] = 8927, ["curlyeqsucc"] = 8927, - ["nprcue"] = 8928, ["NotPrecedesSlantEqual"] = 8928, - ["nsccue"] = 8929, + ["nprcue"] = 8928, ["NotSucceedsSlantEqual"] = 8929, - ["nsqsube"] = 8930, + ["nsccue"] = 8929, ["NotSquareSubsetEqual"] = 8930, - ["nsqsupe"] = 8931, + ["nsqsube"] = 8930, ["NotSquareSupersetEqual"] = 8931, + ["nsqsupe"] = 8931, ["lnsim"] = 8934, ["gnsim"] = 8935, - ["prnsim"] = 8936, ["precnsim"] = 8936, + ["prnsim"] = 8936, ["scnsim"] = 8937, ["succnsim"] = 8937, + ["NotLeftTriangle"] = 8938, ["nltri"] = 8938, ["ntriangleleft"] = 8938, - ["NotLeftTriangle"] = 8938, + ["NotRightTriangle"] = 8939, ["nrtri"] = 8939, ["ntriangleright"] = 8939, - ["NotRightTriangle"] = 8939, + ["NotLeftTriangleEqual"] = 8940, ["nltrie"] = 8940, ["ntrianglelefteq"] = 8940, - ["NotLeftTriangleEqual"] = 8940, + ["NotRightTriangleEqual"] = 8941, ["nrtrie"] = 8941, ["ntrianglerighteq"] = 8941, - ["NotRightTriangleEqual"] = 8941, ["vellip"] = 8942, ["ctdot"] = 8943, ["utdot"] = 8944, @@ -22240,9 +23668,11 @@ local character_entities = { ["isinsv"] = 8947, ["isins"] = 8948, ["isindot"] = 8949, + ["notindot"] = {8949, 824}, ["notinvc"] = 8950, ["notinvb"] = 8951, ["isinE"] = 8953, + ["notinE"] = {8953, 824}, ["nisd"] = 8954, ["xnis"] = 8955, ["nis"] = 8956, @@ -22252,14 +23682,14 @@ local character_entities = { ["barwedge"] = 8965, ["Barwed"] = 8966, ["doublebarwedge"] = 8966, - ["lceil"] = 8968, ["LeftCeiling"] = 8968, - ["rceil"] = 8969, + ["lceil"] = 8968, ["RightCeiling"] = 8969, - ["lfloor"] = 8970, + ["rceil"] = 8969, ["LeftFloor"] = 8970, - ["rfloor"] = 8971, + ["lfloor"] = 8970, ["RightFloor"] = 8971, + ["rfloor"] = 8971, ["drcrop"] = 8972, ["dlcrop"] = 8973, ["urcrop"] = 8974, @@ -22291,10 +23721,10 @@ local character_entities = { ["lmoustache"] = 9136, ["rmoust"] = 9137, ["rmoustache"] = 9137, - ["tbrk"] = 9140, ["OverBracket"] = 9140, - ["bbrk"] = 9141, + ["tbrk"] = 9140, ["UnderBracket"] = 9141, + ["bbrk"] = 9141, ["bbrktbrk"] = 9142, ["OverParenthesis"] = 9180, ["UnderParenthesis"] = 9181, @@ -22303,10 +23733,10 @@ local character_entities = { ["trpezium"] = 9186, ["elinters"] = 9191, ["blank"] = 9251, - ["oS"] = 9416, ["circledS"] = 9416, - ["boxh"] = 9472, + ["oS"] = 9416, ["HorizontalLine"] = 9472, + ["boxh"] = 9472, ["boxv"] = 9474, ["boxdr"] = 9484, ["boxdl"] = 9488, @@ -22352,50 +23782,50 @@ local character_entities = { ["blk14"] = 9617, ["blk12"] = 9618, ["blk34"] = 9619, + ["Square"] = 9633, ["squ"] = 9633, ["square"] = 9633, - ["Square"] = 9633, - ["squf"] = 9642, - ["squarf"] = 9642, - ["blacksquare"] = 9642, ["FilledVerySmallSquare"] = 9642, + ["blacksquare"] = 9642, + ["squarf"] = 9642, + ["squf"] = 9642, ["EmptyVerySmallSquare"] = 9643, ["rect"] = 9645, ["marker"] = 9646, ["fltns"] = 9649, - ["xutri"] = 9651, ["bigtriangleup"] = 9651, - ["utrif"] = 9652, + ["xutri"] = 9651, ["blacktriangle"] = 9652, - ["utri"] = 9653, + ["utrif"] = 9652, ["triangle"] = 9653, - ["rtrif"] = 9656, + ["utri"] = 9653, ["blacktriangleright"] = 9656, + ["rtrif"] = 9656, ["rtri"] = 9657, ["triangleright"] = 9657, - ["xdtri"] = 9661, ["bigtriangledown"] = 9661, - ["dtrif"] = 9662, + ["xdtri"] = 9661, ["blacktriangledown"] = 9662, + ["dtrif"] = 9662, ["dtri"] = 9663, ["triangledown"] = 9663, - ["ltrif"] = 9666, ["blacktriangleleft"] = 9666, + ["ltrif"] = 9666, ["ltri"] = 9667, ["triangleleft"] = 9667, ["loz"] = 9674, ["lozenge"] = 9674, ["cir"] = 9675, ["tridot"] = 9708, - ["xcirc"] = 9711, ["bigcirc"] = 9711, + ["xcirc"] = 9711, ["ultri"] = 9720, ["urtri"] = 9721, ["lltri"] = 9722, ["EmptySmallSquare"] = 9723, ["FilledSmallSquare"] = 9724, - ["starf"] = 9733, ["bigstar"] = 9733, + ["starf"] = 9733, ["star"] = 9734, ["phone"] = 9742, ["female"] = 9792, @@ -22406,8 +23836,8 @@ local character_entities = { ["clubsuit"] = 9827, ["hearts"] = 9829, ["heartsuit"] = 9829, - ["diams"] = 9830, ["diamondsuit"] = 9830, + ["diams"] = 9830, ["sung"] = 9834, ["flat"] = 9837, ["natur"] = 9838, @@ -22422,51 +23852,53 @@ local character_entities = { ["VerticalSeparator"] = 10072, ["lbbrk"] = 10098, ["rbbrk"] = 10099, - ["lobrk"] = 10214, + ["bsolhsub"] = 10184, + ["suphsol"] = 10185, ["LeftDoubleBracket"] = 10214, - ["robrk"] = 10215, + ["lobrk"] = 10214, ["RightDoubleBracket"] = 10215, - ["lang"] = 10216, + ["robrk"] = 10215, ["LeftAngleBracket"] = 10216, + ["lang"] = 10216, ["langle"] = 10216, - ["rang"] = 10217, ["RightAngleBracket"] = 10217, + ["rang"] = 10217, ["rangle"] = 10217, ["Lang"] = 10218, ["Rang"] = 10219, ["loang"] = 10220, ["roang"] = 10221, - ["xlarr"] = 10229, - ["longleftarrow"] = 10229, ["LongLeftArrow"] = 10229, - ["xrarr"] = 10230, - ["longrightarrow"] = 10230, + ["longleftarrow"] = 10229, + ["xlarr"] = 10229, ["LongRightArrow"] = 10230, - ["xharr"] = 10231, - ["longleftrightarrow"] = 10231, + ["longrightarrow"] = 10230, + ["xrarr"] = 10230, ["LongLeftRightArrow"] = 10231, - ["xlArr"] = 10232, - ["Longleftarrow"] = 10232, + ["longleftrightarrow"] = 10231, + ["xharr"] = 10231, ["DoubleLongLeftArrow"] = 10232, - ["xrArr"] = 10233, - ["Longrightarrow"] = 10233, + ["Longleftarrow"] = 10232, + ["xlArr"] = 10232, ["DoubleLongRightArrow"] = 10233, - ["xhArr"] = 10234, - ["Longleftrightarrow"] = 10234, + ["Longrightarrow"] = 10233, + ["xrArr"] = 10233, ["DoubleLongLeftRightArrow"] = 10234, - ["xmap"] = 10236, + ["Longleftrightarrow"] = 10234, + ["xhArr"] = 10234, ["longmapsto"] = 10236, + ["xmap"] = 10236, ["dzigrarr"] = 10239, ["nvlArr"] = 10498, ["nvrArr"] = 10499, ["nvHarr"] = 10500, ["Map"] = 10501, ["lbarr"] = 10508, - ["rbarr"] = 10509, ["bkarow"] = 10509, + ["rbarr"] = 10509, ["lBarr"] = 10510, - ["rBarr"] = 10511, ["dbkarow"] = 10511, + ["rBarr"] = 10511, ["RBarr"] = 10512, ["drbkarow"] = 10512, ["DDotrahd"] = 10513, @@ -22483,16 +23915,17 @@ local character_entities = { ["rarrbfs"] = 10528, ["nwarhk"] = 10531, ["nearhk"] = 10532, - ["searhk"] = 10533, ["hksearow"] = 10533, - ["swarhk"] = 10534, + ["searhk"] = 10533, ["hkswarow"] = 10534, + ["swarhk"] = 10534, ["nwnear"] = 10535, ["nesear"] = 10536, ["toea"] = 10536, ["seswar"] = 10537, ["tosa"] = 10537, ["swnwar"] = 10538, + ["nrarrc"] = {10547, 824}, ["rarrc"] = 10547, ["cudarrr"] = 10549, ["ldca"] = 10550, @@ -22538,10 +23971,10 @@ local character_entities = { ["llhard"] = 10603, ["rharul"] = 10604, ["lrhard"] = 10605, - ["udhar"] = 10606, ["UpEquilibrium"] = 10606, - ["duhar"] = 10607, + ["udhar"] = 10606, ["ReverseUpEquilibrium"] = 10607, + ["duhar"] = 10607, ["RoundImplies"] = 10608, ["erarr"] = 10609, ["simrarr"] = 10610, @@ -22608,30 +24041,31 @@ local character_entities = { ["trisb"] = 10701, ["rtriltri"] = 10702, ["LeftTriangleBar"] = 10703, + ["NotLeftTriangleBar"] = {10703, 824}, + ["NotRightTriangleBar"] = {10704, 824}, ["RightTriangleBar"] = 10704, - ["race"] = 10714, ["iinfin"] = 10716, ["infintie"] = 10717, ["nvinfin"] = 10718, ["eparsl"] = 10723, ["smeparsl"] = 10724, ["eqvparsl"] = 10725, - ["lozf"] = 10731, ["blacklozenge"] = 10731, + ["lozf"] = 10731, ["RuleDelayed"] = 10740, ["dsol"] = 10742, - ["xodot"] = 10752, ["bigodot"] = 10752, - ["xoplus"] = 10753, + ["xodot"] = 10752, ["bigoplus"] = 10753, - ["xotime"] = 10754, + ["xoplus"] = 10753, ["bigotimes"] = 10754, - ["xuplus"] = 10756, + ["xotime"] = 10754, ["biguplus"] = 10756, - ["xsqcup"] = 10758, + ["xuplus"] = 10756, ["bigsqcup"] = 10758, - ["qint"] = 10764, + ["xsqcup"] = 10758, ["iiiint"] = 10764, + ["qint"] = 10764, ["fpartint"] = 10765, ["cirfnint"] = 10768, ["awint"] = 10769, @@ -22663,8 +24097,8 @@ local character_entities = { ["triplus"] = 10809, ["triminus"] = 10810, ["tritime"] = 10811, - ["iprod"] = 10812, ["intprod"] = 10812, + ["iprod"] = 10812, ["amalg"] = 10815, ["capdot"] = 10816, ["ncup"] = 10818, @@ -22694,27 +24128,35 @@ local character_entities = { ["sdote"] = 10854, ["simdot"] = 10858, ["congdot"] = 10861, + ["ncongdot"] = {10861, 824}, ["easter"] = 10862, ["apacir"] = 10863, ["apE"] = 10864, + ["napE"] = {10864, 824}, ["eplus"] = 10865, ["pluse"] = 10866, ["Esim"] = 10867, ["Colone"] = 10868, ["Equal"] = 10869, - ["eDDot"] = 10871, ["ddotseq"] = 10871, + ["eDDot"] = 10871, ["equivDD"] = 10872, ["ltcir"] = 10873, ["gtcir"] = 10874, ["ltquest"] = 10875, ["gtquest"] = 10876, - ["les"] = 10877, ["LessSlantEqual"] = 10877, + ["NotLessSlantEqual"] = {10877, 824}, ["leqslant"] = 10877, - ["ges"] = 10878, + ["les"] = 10877, + ["nleqslant"] = {10877, 824}, + ["nles"] = {10877, 824}, ["GreaterSlantEqual"] = 10878, + ["NotGreaterSlantEqual"] = {10878, 824}, ["geqslant"] = 10878, + ["ges"] = 10878, + ["ngeqslant"] = {10878, 824}, + ["nges"] = {10878, 824}, ["lesdot"] = 10879, ["gesdot"] = 10880, ["lesdoto"] = 10881, @@ -22758,7 +24200,9 @@ local character_entities = { ["simlE"] = 10911, ["simgE"] = 10912, ["LessLess"] = 10913, + ["NotNestedLessLess"] = {10913, 824}, ["GreaterGreater"] = 10914, + ["NotNestedGreaterGreater"] = {10914, 824}, ["glj"] = 10916, ["gla"] = 10917, ["ltcc"] = 10918, @@ -22768,26 +24212,34 @@ local character_entities = { ["smt"] = 10922, ["lat"] = 10923, ["smte"] = 10924, + ["smtes"] = {10924, 65024}, ["late"] = 10925, + ["lates"] = {10925, 65024}, ["bumpE"] = 10926, + ["NotPrecedesEqual"] = {10927, 824}, + ["PrecedesEqual"] = 10927, + ["npre"] = {10927, 824}, + ["npreceq"] = {10927, 824}, ["pre"] = 10927, ["preceq"] = 10927, - ["PrecedesEqual"] = 10927, + ["NotSucceedsEqual"] = {10928, 824}, + ["SucceedsEqual"] = 10928, + ["nsce"] = {10928, 824}, + ["nsucceq"] = {10928, 824}, ["sce"] = 10928, ["succeq"] = 10928, - ["SucceedsEqual"] = 10928, ["prE"] = 10931, ["scE"] = 10932, - ["prnE"] = 10933, ["precneqq"] = 10933, + ["prnE"] = 10933, ["scnE"] = 10934, ["succneqq"] = 10934, ["prap"] = 10935, ["precapprox"] = 10935, ["scap"] = 10936, ["succapprox"] = 10936, - ["prnap"] = 10937, ["precnapprox"] = 10937, + ["prnap"] = 10937, ["scnap"] = 10938, ["succnapprox"] = 10938, ["Pr"] = 10939, @@ -22800,16 +24252,24 @@ local character_entities = { ["supmult"] = 10946, ["subedot"] = 10947, ["supedot"] = 10948, + ["nsubE"] = {10949, 824}, + ["nsubseteqq"] = {10949, 824}, ["subE"] = 10949, ["subseteqq"] = 10949, + ["nsupE"] = {10950, 824}, + ["nsupseteqq"] = {10950, 824}, ["supE"] = 10950, ["supseteqq"] = 10950, ["subsim"] = 10951, ["supsim"] = 10952, ["subnE"] = 10955, ["subsetneqq"] = 10955, + ["varsubsetneqq"] = {10955, 65024}, + ["vsubnE"] = {10955, 65024}, ["supnE"] = 10956, ["supsetneqq"] = 10956, + ["varsupsetneqq"] = {10956, 65024}, + ["vsupnE"] = {10956, 65024}, ["csub"] = 10959, ["csup"] = 10960, ["csube"] = 10961, @@ -22838,6 +24298,7 @@ local character_entities = { ["topcir"] = 10993, ["nhpar"] = 10994, ["parsim"] = 10995, + ["nparsl"] = {11005, 8421}, ["parsl"] = 11005, ["fflig"] = 64256, ["filig"] = 64257, @@ -22982,1955 +24443,4233 @@ local character_entities = { % \par % \begin{markdown} % -% Given a string `s` of decimal digits, the \luamdef{entities.dec_entity} -% returns the corresponding \acro{utf}8-encoded Unicode codepoint. +% Given a string `s` of decimal digits, the \luamdef{entities.dec_entity} +% returns the corresponding \acro{utf}8-encoded Unicode codepoint. +% +% \end{markdown} +% \begin{macrocode} +function entities.dec_entity(s) + local n = tonumber(s) + if n == nil then + return "&#" .. s .. ";" -- fallback for unknown entities + end + return unicode.utf8.char(n) +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Given a string `s` of hexadecimal digits, the +% \luamdef{entities.hex_entity} returns the corresponding +% \acro{utf}8-encoded Unicode codepoint. +% +% \end{markdown} +% \begin{macrocode} +function entities.hex_entity(s) + local n = tonumber("0x"..s) + if n == nil then + return "&#x" .. s .. ";" -- fallback for unknown entities + end + return unicode.utf8.char(n) +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Given a captured character `x` and a string `s` of hexadecimal digits, the +% \luamdef{entities.hex_entity_with_x_char} returns the corresponding +% \acro{utf}8-encoded Unicode codepoint or fallback with the `x` character. +% +% \end{markdown} +% \begin{macrocode} +function entities.hex_entity_with_x_char(x, s) + local n = tonumber("0x"..s) + if n == nil then + return "&#" .. x .. s .. ";" -- fallback for unknown entities + end + return unicode.utf8.char(n) +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Given a character entity name `s` (like `ouml`), the +% \luamdef{entities.char_entity} returns the corresponding +% \acro{utf}8-encoded Unicode codepoint. +% +% \end{markdown} +% \begin{macrocode} +function entities.char_entity(s) + local code_points = character_entities[s] + if code_points == nil then + return "&" .. s .. ";" + end + if type(code_points) ~= 'table' then + code_points = {code_points} + end + local char_table = {} + for _, code_point in ipairs(code_points) do + table.insert(char_table, unicode.utf8.char(code_point)) + end + return table.concat(char_table) +end +% \end{macrocode} +% \par +% \begin{markdown} +% +%### Plain \TeX{} Writer {#tex-writer} +% +% This section documents the \luamref{writer} object, which implements the +% routines for producing the \TeX{} output. The object is an amalgamate of the +% generic, \TeX{}, \LaTeX{} writer objects that were located in the +% `lunamark/writer/generic.lua`, `lunamark/writer/tex.lua`, and +% `lunamark/writer/latex.lua` files in the Lunamark Lua module. +% +% Although not specified in the Lua interface (see Section +% <#sec:luainterface>), the \luamref{writer} object is exported, so that the +% curious user could easily tinker with the methods of the objects produced by +% the \luamref{writer.new} method described below. The user should be aware, +% however, that the implementation may change in a future revision. +% +% \end{markdown} +% \begin{macrocode} +M.writer = {} +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \luamdef{writer.new} method creates and returns a new \TeX{} writer +% object associated with the Lua interface options (see Section +% <#sec:lua-options>) `options`. When `options` are unspecified, it is +% assumed that an empty table was passed to the method. +% +% The objects produced by the \luamref{writer.new} method expose instance methods +% and variables of their own. As a convention, I will refer to these +% \meta{member}s as `writer->`\meta{member}. All member variables are +% immutable unless explicitly stated otherwise. +% +% \end{markdown} +% \begin{macrocode} +function M.writer.new(options) + local self = {} +% \end{macrocode} +% \par +% \begin{markdown} +% +% Make `options` available as \luamdef{writer->options}, so that it is +% accessible from extensions. +% +% \end{markdown} +% \begin{macrocode} + self.options = options +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->flatten\_inlines}, which indicates whether or not the +% writer should produce raw text rather than text in the output format for +% inline elements. The \luamref{writer->flatten\_inlines} member variable is +% mutable. +% +% \end{markdown} +% \begin{macrocode} + self.flatten_inlines = false +% \end{macrocode} +% \par +% \begin{markdown} +% +% Parse the \Opt{slice} option and define \luamdef{writer->slice\_begin}, +% \luamdef{writer->slice\_end}, and \luamdef{writer->is\_writing}. The +% \luamref{writer->is\_writing} member variable is mutable. +% +% \end{markdown} +% \begin{macrocode} + local slice_specifiers = {} + for specifier in options.slice:gmatch("[^%s]+") do + table.insert(slice_specifiers, specifier) + end + + if #slice_specifiers == 2 then + self.slice_begin, self.slice_end = table.unpack(slice_specifiers) + local slice_begin_type = self.slice_begin:sub(1, 1) + if slice_begin_type ~= "^" and slice_begin_type ~= "$" then + self.slice_begin = "^" .. self.slice_begin + end + local slice_end_type = self.slice_end:sub(1, 1) + if slice_end_type ~= "^" and slice_end_type ~= "$" then + self.slice_end = "$" .. self.slice_end + end + elseif #slice_specifiers == 1 then + self.slice_begin = "^" .. slice_specifiers[1] + self.slice_end = "$" .. slice_specifiers[1] + end + + self.slice_begin_type = self.slice_begin:sub(1, 1) + self.slice_begin_identifier = self.slice_begin:sub(2) or "" + self.slice_end_type = self.slice_end:sub(1, 1) + self.slice_end_identifier = self.slice_end:sub(2) or "" + + if self.slice_begin == "^" and self.slice_end ~= "^" then + self.is_writing = true + else + self.is_writing = false + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->suffix} as the suffix of the produced cache files. +% +% \end{markdown} +% \begin{macrocode} + self.suffix = ".tex" +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->space} as the output format of a space character. +% +% \end{markdown} +% \begin{macrocode} + self.space = " " +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->nbsp} as the output format of a non-breaking space +% character. +% +% \end{markdown} +% \begin{macrocode} + self.nbsp = "\\markdownRendererNbsp{}" +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->plain} as a function that will transform an input +% plain text block `s` to the output format. +% +% \end{markdown} +% \begin{macrocode} + function self.plain(s) + return s + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->paragraph} as a function that will transform an +% input paragraph `s` to the output format. +% +% \end{markdown} +% \begin{macrocode} + function self.paragraph(s) + if not self.is_writing then return "" end + return s + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->pack} as a function that will take the filename +% `name` of the output file prepared by the reader and transform it to the +% output format. +% +% \end{markdown} +% \begin{macrocode} + function self.pack(name) + return [[\input{]] .. name .. [[}\relax]] + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->interblocksep} as the output format of a block +% element separator. +% +% \end{markdown} +% \begin{macrocode} + function self.interblocksep() + if not self.is_writing then return "" end + return "\\markdownRendererInterblockSeparator\n{}" + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->paragraphsep} as the output format of a paragraph +% separator. Users can use more than one blank line to delimit two blocks to +% indicate the end of a series of blocks that make up a paragraph. This +% produces a paragraph separator instead of an interblock separator. +% +% \end{markdown} +% \begin{macrocode} + function self.paragraphsep() + if not self.is_writing then return "" end + return "\\markdownRendererParagraphSeparator\n{}" + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->soft_line_break} as the output format of a soft +% line break. +% +% \end{markdown} +% \begin{macrocode} + self.soft_line_break = function() + if self.flatten_inlines then return "\n" end + return "\\markdownRendererSoftLineBreak\n{}" + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->hard_line_break} as the output format of a hard +% line break. +% +% \end{markdown} +% \begin{macrocode} + self.hard_line_break = function() + if self.flatten_inlines then return "\n" end + return "\\markdownRendererHardLineBreak\n{}" + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->ellipsis} as the output format of an ellipsis. +% +% \end{markdown} +% \begin{macrocode} + self.ellipsis = "\\markdownRendererEllipsis{}" +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->thematic_break} as the output format of a thematic +% break. +% +% \end{markdown} +% \begin{macrocode} + function self.thematic_break() + if not self.is_writing then return "" end + return "\\markdownRendererThematicBreak{}" + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define tables \luamdef{writer->escaped_uri_chars} and +% \luamdef{writer->escaped_minimal_strings} containing the mapping from +% special plain characters and character strings that always need to be +% escaped. +% +% \end{markdown} +% \begin{macrocode} + self.escaped_uri_chars = { + ["{"] = "\\markdownRendererLeftBrace{}", + ["}"] = "\\markdownRendererRightBrace{}", + ["\\"] = "\\markdownRendererBackslash{}", + } + self.escaped_minimal_strings = { + ["^^"] = "\\markdownRendererCircumflex\\markdownRendererCircumflex ", + ["☒"] = "\\markdownRendererTickedBox{}", + ["⌛"] = "\\markdownRendererHalfTickedBox{}", + ["☐"] = "\\markdownRendererUntickedBox{}", + [entities.hex_entity('FFFD')] = "\\markdownRendererReplacementCharacter{}", + } +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define table \luamdef{writer->escaped_strings} containing the mapping from +% character strings that need to be escaped in typeset content. +% +% \end{markdown} +% \begin{macrocode} + self.escaped_strings = util.table_copy(self.escaped_minimal_strings) + self.escaped_strings[entities.hex_entity('00A0')] = self.nbsp +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define a table \luamdef{writer->escaped_chars} containing the mapping from +% special plain \TeX{} characters (including the active pipe character (`|`) +% of \Hologo{ConTeXt}) that need to be escaped in typeset content. +% +% \end{markdown} +% \begin{macrocode} + self.escaped_chars = { + ["{"] = "\\markdownRendererLeftBrace{}", + ["}"] = "\\markdownRendererRightBrace{}", + ["%"] = "\\markdownRendererPercentSign{}", + ["\\"] = "\\markdownRendererBackslash{}", + ["#"] = "\\markdownRendererHash{}", + ["$"] = "\\markdownRendererDollarSign{}", + ["&"] = "\\markdownRendererAmpersand{}", + ["_"] = "\\markdownRendererUnderscore{}", + ["^"] = "\\markdownRendererCircumflex{}", + ["~"] = "\\markdownRendererTilde{}", + ["|"] = "\\markdownRendererPipe{}", + [entities.hex_entity('0000')] = "\\markdownRendererReplacementCharacter{}", + } +% \end{macrocode} +% \par +% \begin{markdown} +% +% Use the \luamref{writer->escaped_chars}, \luamref{writer->escaped_uri_chars}, +% and \luamref{writer->escaped_minimal_strings} tables to create the +% \luamdef{writer->escape_typographic_text}, +% \luamdef{writer->escape_programmatic_text}, and +% \luamdef{writer->escape_minimal} escaper functions. +% +% \end{markdown} +% \begin{macrocode} + local function create_escaper(char_escapes, string_escapes) + local escape = util.escaper(char_escapes, string_escapes) + return function(s) + if self.flatten_inlines then return s end + return escape(s) + end + end + local escape_typographic_text = create_escaper( + self.escaped_chars, self.escaped_strings) + local escape_programmatic_text = create_escaper( + self.escaped_uri_chars, self.escaped_minimal_strings) + local escape_minimal = create_escaper( + {}, self.escaped_minimal_strings) +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define the following semantic aliases for the escaper functions: +% +% - \luamdef{writer->escape} transforms a text string that should always be +% made printable. +% - \luamdef{writer->string} transforms a text string that should be made +% printable only when the \Opt{hybrid} Lua option is disabled. When \Opt{hybrid} +% is enabled, the text string should be kept as-is. +% - \luamdef{writer->math} transforms a math span. +% - \luamdef{writer->identifier} transforms an input programmatic identifier. +% - \luamdef{writer->uri} transforms an input \acro{uri}. +% - \luamdef{writer->infostring} transforms a fence code infostring. +% +% \end{markdown} +% \begin{macrocode} + self.escape = escape_typographic_text + self.math = escape_minimal + if options.hybrid then + self.identifier = escape_minimal + self.string = escape_minimal + self.uri = escape_minimal + self.infostring = escape_minimal + else + self.identifier = escape_programmatic_text + self.string = escape_typographic_text + self.uri = escape_programmatic_text + self.infostring = escape_programmatic_text + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->code} as a function that will transform an input +% inline code span `s` with optional attributes `attributes` to the output +% format. +% +% \end{markdown} +% \begin{macrocode} + function self.code(s, attributes) + if self.flatten_inlines then return s end + local buf = {} + if attributes ~= nil then + table.insert(buf, + "\\markdownRendererCodeSpanAttributeContextBegin\n") + table.insert(buf, self.attributes(attributes)) + end + table.insert(buf, + {"\\markdownRendererCodeSpan{", self.escape(s), "}"}) + if attributes ~= nil then + table.insert(buf, + "\\markdownRendererCodeSpanAttributeContextEnd{}") + end + return buf + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->link} as a function that will transform an input +% hyperlink to the output format, where `lab` corresponds to the label, +% `src` to \acro{uri}, `tit` to the title of the link, and `attributes` to +% optional attributes. +% +% \end{markdown} +% \begin{macrocode} + function self.link(lab, src, tit, attributes) + if self.flatten_inlines then return lab end + local buf = {} + if attributes ~= nil then + table.insert(buf, + "\\markdownRendererLinkAttributeContextBegin\n") + table.insert(buf, self.attributes(attributes)) + end + table.insert(buf, {"\\markdownRendererLink{",lab,"}", + "{",self.escape(src),"}", + "{",self.uri(src),"}", + "{",self.string(tit or ""),"}"}) + if attributes ~= nil then + table.insert(buf, + "\\markdownRendererLinkAttributeContextEnd{}") + end + return buf + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->image} as a function that will transform an input +% image to the output format, where `lab` corresponds to the label, `src` +% to the \acro{url}, `tit` to the title of the image, and `attributes` to +% optional attributes. +% +% \end{markdown} +% \begin{macrocode} + function self.image(lab, src, tit, attributes) + if self.flatten_inlines then return lab end + local buf = {} + if attributes ~= nil then + table.insert(buf, + "\\markdownRendererImageAttributeContextBegin\n") + table.insert(buf, self.attributes(attributes)) + end + table.insert(buf, {"\\markdownRendererImage{",lab,"}", + "{",self.string(src),"}", + "{",self.uri(src),"}", + "{",self.string(tit or ""),"}"}) + if attributes ~= nil then + table.insert(buf, + "\\markdownRendererImageAttributeContextEnd{}") + end + return buf + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->bulletlist} as a function that will transform an input +% bulleted list to the output format, where `items` is an array of the list +% items and `tight` specifies, whether the list is tight or not. +% +% \end{markdown} +% \begin{macrocode} + function self.bulletlist(items,tight) + if not self.is_writing then return "" end + local buffer = {} + for _,item in ipairs(items) do + if item ~= "" then + buffer[#buffer + 1] = self.bulletitem(item) + end + end + local contents = util.intersperse(buffer,"\n") + if tight and options.tightLists then + return {"\\markdownRendererUlBeginTight\n",contents, + "\n\\markdownRendererUlEndTight "} + else + return {"\\markdownRendererUlBegin\n",contents, + "\n\\markdownRendererUlEnd "} + end + end +% \end{macrocode} +% \begin{markdown} +% +% Define \luamdef{writer->bulletitem} as a function that will transform an +% input bulleted list item to the output format, where `s` is the text of +% the list item. +% +% \end{markdown} +% \begin{macrocode} + function self.bulletitem(s) + return {"\\markdownRendererUlItem ",s, + "\\markdownRendererUlItemEnd "} + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->orderedlist} as a function that will transform an +% input ordered list to the output format, where `items` is an array of the +% list items and `tight` specifies, whether the list is tight or not. If the +% optional parameter `startnum` is present, it is the number of the first list +% item. +% +% \end{markdown} +% \begin{macrocode} + function self.orderedlist(items,tight,startnum) + if not self.is_writing then return "" end + local buffer = {} + local num = startnum + for _,item in ipairs(items) do + if item ~= "" then + buffer[#buffer + 1] = self.ordereditem(item,num) + end + if num ~= nil and item ~= "" then + num = num + 1 + end + end + local contents = util.intersperse(buffer,"\n") + if tight and options.tightLists then + return {"\\markdownRendererOlBeginTight\n",contents, + "\n\\markdownRendererOlEndTight "} + else + return {"\\markdownRendererOlBegin\n",contents, + "\n\\markdownRendererOlEnd "} + end + end +% \end{macrocode} +% \begin{markdown} +% +% Define \luamdef{writer->ordereditem} as a function that will transform an +% input ordered list item to the output format, where `s` is the text of +% the list item. If the optional parameter `num` is present, it is the number +% of the list item. +% +% \end{markdown} +% \begin{macrocode} + function self.ordereditem(s,num) + if num ~= nil then + return {"\\markdownRendererOlItemWithNumber{",num,"}",s, + "\\markdownRendererOlItemEnd "} + else + return {"\\markdownRendererOlItem ",s, + "\\markdownRendererOlItemEnd "} + end + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->inline_html_comment} as a function that will +% transform the contents of an inline \acro{HTML} comment, to the output +% format, where `contents` are the contents of the \acro{HTML} comment. +% +% \end{markdown} +% \begin{macrocode} + function self.inline_html_comment(contents) + if self.flatten_inlines then return contents end + return {"\\markdownRendererInlineHtmlComment{",contents,"}"} + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->inline_html_tag} as a function that will +% transform the contents of an opening, closing, or empty inline \acro{HTML} +% tag to the output format, where `contents` are the contents of the +% \acro{HTML} tag. +% +% \end{markdown} +% \begin{macrocode} + function self.inline_html_tag(contents) + if self.flatten_inlines then return contents end + return {"\\markdownRendererInlineHtmlTag{",self.string(contents),"}"} + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->block_html_element} as a function that will +% transform the contents of a block \acro{HTML} element to the output format, +% where `s` are the contents of the \acro{HTML} element. +% +% \end{markdown} +% \begin{macrocode} + function self.block_html_element(s) + if not self.is_writing then return "" end + local name = util.cache(options.cacheDir, s, nil, nil, ".verbatim") + return {"\\markdownRendererInputBlockHtmlElement{",name,"}"} + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->emphasis} as a function that will transform an +% emphasized span `s` of input text to the output format. +% +% \end{markdown} +% \begin{macrocode} + function self.emphasis(s) + if self.flatten_inlines then return s end + return {"\\markdownRendererEmphasis{",s,"}"} + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->tickbox} as a function that will transform a +% number `f` to the output format. +% +% \end{markdown} +% \begin{macrocode} + function self.tickbox(f) + if f == 1.0 then + return "☒ " + elseif f == 0.0 then + return "☐ " + else + return "⌛ " + end + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->strong} as a function that will transform a strongly +% emphasized span `s` of input text to the output format. +% +% \end{markdown} +% \begin{macrocode} + function self.strong(s) + if self.flatten_inlines then return s end + return {"\\markdownRendererStrongEmphasis{",s,"}"} + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->blockquote} as a function that will transform an +% input block quote `s` to the output format. +% +% \end{markdown} +% \begin{macrocode} + function self.blockquote(s) + if not self.is_writing then return "" end + return {"\\markdownRendererBlockQuoteBegin\n",s, + "\n\\markdownRendererBlockQuoteEnd "} + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->verbatim} as a function that will transform an +% input code block `s` to the output format. +% +% \end{markdown} +% \begin{macrocode} + function self.verbatim(s) + if not self.is_writing then return "" end + s = s:gsub("\n$", "") + local name = util.cache_verbatim(options.cacheDir, s) + return {"\\markdownRendererInputVerbatim{",name,"}"} + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->document} as a function that will transform a +% document `d` to the output format. +% +% \end{markdown} +% \begin{macrocode} + function self.document(d) + local buf = {"\\markdownRendererDocumentBegin\n", d} + + -- pop all attributes + table.insert(buf, self.pop_attributes()) + + table.insert(buf, "\\markdownRendererDocumentEnd") + + return buf + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->attributes} as a function that will transform +% input attributes `attrs` to the output format. +% +% \end{markdown} +% \begin{macrocode} + local seen_identifiers = {} + local key_value_regex = "([^= ]+)%s*=%s*(.*)" + local function normalize_attributes(attributes, auto_identifiers) + -- normalize attributes + local normalized_attributes = {} + local has_explicit_identifiers = false + local key, value + for _, attribute in ipairs(attributes or {}) do + if attribute:sub(1, 1) == "#" then + table.insert(normalized_attributes, attribute) + has_explicit_identifiers = true + seen_identifiers[attribute:sub(2)] = true + elseif attribute:sub(1, 1) == "." then + table.insert(normalized_attributes, attribute) + else + key, value = attribute:match(key_value_regex) + if key:lower() == "id" then + table.insert(normalized_attributes, "#" .. value) + elseif key:lower() == "class" then + local classes = {} + for class in value:gmatch("%S+") do + table.insert(classes, class) + end + table.sort(classes) + for _, class in ipairs(classes) do + table.insert(normalized_attributes, "." .. class) + end + else + table.insert(normalized_attributes, attribute) + end + end + end + + -- if no explicit identifiers exist, add auto identifiers + if not has_explicit_identifiers and auto_identifiers ~= nil then + local seen_auto_identifiers = {} + for _, auto_identifier in ipairs(auto_identifiers) do + if seen_auto_identifiers[auto_identifier] == nil then + seen_auto_identifiers[auto_identifier] = true + if seen_identifiers[auto_identifier] == nil then + seen_identifiers[auto_identifier] = true + table.insert(normalized_attributes, + "#" .. auto_identifier) + else + local auto_identifier_number = 1 + while true do + local numbered_auto_identifier = auto_identifier .. "-" + .. auto_identifier_number + if seen_identifiers[numbered_auto_identifier] == nil then + seen_identifiers[numbered_auto_identifier] = true + table.insert(normalized_attributes, + "#" .. numbered_auto_identifier) + break + end + auto_identifier_number = auto_identifier_number + 1 + end + end + end + end + end + + -- sort and deduplicate normalized attributes + table.sort(normalized_attributes) + local seen_normalized_attributes = {} + local deduplicated_normalized_attributes = {} + for _, attribute in ipairs(normalized_attributes) do + if seen_normalized_attributes[attribute] == nil then + seen_normalized_attributes[attribute] = true + table.insert(deduplicated_normalized_attributes, attribute) + end + end + + return deduplicated_normalized_attributes + end + + function self.attributes(attributes, should_normalize_attributes) + local normalized_attributes + if should_normalize_attributes == false then + normalized_attributes = attributes + else + normalized_attributes = normalize_attributes(attributes) + end + + local buf = {} + local key, value + for _, attribute in ipairs(normalized_attributes) do + if attribute:sub(1, 1) == "#" then + table.insert(buf, {"\\markdownRendererAttributeIdentifier{", + attribute:sub(2), "}"}) + elseif attribute:sub(1, 1) == "." then + table.insert(buf, {"\\markdownRendererAttributeClassName{", + attribute:sub(2), "}"}) + else + key, value = attribute:match(key_value_regex) + table.insert(buf, {"\\markdownRendererAttributeKeyValue{", + key, "}{", value, "}"}) + end + end + + return buf + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->active\_attributes} as a stack of block-level +% attributes that are currently active. The +% \luamref{writer->active\_attributes} member variable is mutable. +% +% \end{markdown} +% \begin{macrocode} + self.active_attributes = {} +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->attribute\_type\_levels} as a hash table that +% maps attribute types to the number of attributes of said type in +% \luamref{writer->active\_attributes}. +% +% \end{markdown} +% \begin{macrocode} + self.attribute_type_levels = {} + setmetatable(self.attribute_type_levels, + { __index = function() return 0 end }) +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->push\_attributes} and +% \luamdef{writer->pop\_attributes} as functions that will add a new set +% of active block-level attributes or remove the most current attributes +% from \luamref{writer->active\_attributes}. +% +% \end{markdown} +% \begin{macrocode} + local function apply_attributes() + local buf = {} + for i = 1, #self.active_attributes do + local start_output = self.active_attributes[i][3] + if start_output ~= nil then + table.insert(buf, start_output) + end + end + return buf + end + + local function tear_down_attributes() + local buf = {} + for i = #self.active_attributes, 1, -1 do + local end_output = self.active_attributes[i][4] + if end_output ~= nil then + table.insert(buf, end_output) + end + end + return buf + end +% \end{macrocode} +% \begin{markdown} +% +% The \luamref{writer->push\_attributes} method adds `attributes` +% of type `attribute_type` to \luamref{writer->active\_attributes}. The +% `start_output` string is used to construct a rope that will be returned by +% this function, together with output produced as a result of slicing (see +% \Opt{slice}). The `end_output` string is stored together with `attributes` +% and is used to construct the return value of the +% \luamref{writer->pop\_attributes} +% method. +% +% \end{markdown} +% \begin{macrocode} + function self.push_attributes(attribute_type, attributes, + start_output, end_output) + local attribute_type_level = self.attribute_type_levels[attribute_type] + self.attribute_type_levels[attribute_type] = attribute_type_level + 1 + + -- index attributes in a hash table for easy lookup + attributes = attributes or {} + for i = 1, #attributes do + attributes[attributes[i]] = true + end + + local buf = {} + -- handle slicing + if attributes["#" .. self.slice_end_identifier] ~= nil and + self.slice_end_type == "^" then + if self.is_writing then + table.insert(buf, tear_down_attributes()) + end + self.is_writing = false + end + if attributes["#" .. self.slice_begin_identifier] ~= nil and + self.slice_begin_type == "^" then + table.insert(buf, apply_attributes()) + self.is_writing = true + end + if self.is_writing and start_output ~= nil then + table.insert(buf, start_output) + end + table.insert(self.active_attributes, + {attribute_type, attributes, + start_output, end_output}) + return buf + end + +% \end{macrocode} +% \begin{markdown} +% +% The \luamref{writer->pop\_attributes} method removes the most current of +% active block-level attributes from \luamref{writer->active\_attributes} +% until attributes of type `attribute_type` have been removed. The method +% returns a rope constructed from the `end_output` string specified +% in the calls of \luamref{writer->push\_attributes} that produced the most +% current attributes, and also from output produced as a result of slicing +% (see \Opt{slice}). +% +% \end{markdown} +% \begin{macrocode} + function self.pop_attributes(attribute_type) + local buf = {} + -- pop attributes until we find attributes of correct type + -- or until no attributes remain + local current_attribute_type = false + while current_attribute_type ~= attribute_type and + #self.active_attributes > 0 do + local attributes, _, end_output + current_attribute_type, attributes, _, end_output = table.unpack( + self.active_attributes[#self.active_attributes]) + local attribute_type_level = self.attribute_type_levels[current_attribute_type] + self.attribute_type_levels[current_attribute_type] = attribute_type_level - 1 + if self.is_writing and end_output ~= nil then + table.insert(buf, end_output) + end + table.remove(self.active_attributes, #self.active_attributes) + -- handle slicing + if attributes["#" .. self.slice_end_identifier] ~= nil + and self.slice_end_type == "$" then + if self.is_writing then + table.insert(buf, tear_down_attributes()) + end + self.is_writing = false + end + if attributes["#" .. self.slice_begin_identifier] ~= nil and + self.slice_begin_type == "$" then + self.is_writing = true + table.insert(buf, apply_attributes()) + end + end + return buf + end +% \end{macrocode} +% \begin{markdown} +% +% Create an auto identifier string by stripping and converting characters from string `s`. +% +% \end{markdown} +% \begin{macrocode} +local function create_auto_identifier(s) + local buffer = {} + local prev_space = false + local letter_found = false + + for _, code in utf8.codes(uni_algos.normalize.NFC(s)) do + local char = utf8.char(code) + + -- Remove everything up to the first letter. + if not letter_found then + local is_letter = unicode.utf8.match(char, "%a") + if is_letter then + letter_found = true + else + goto continue + end + end + + -- Remove all non-alphanumeric characters, except underscores, hyphens, and periods. + if not unicode.utf8.match(char, "[%w_%-%.%s]") then + goto continue + end + + -- Replace all spaces and newlines with hyphens. + if unicode.utf8.match(char, "[%s\n]") then + char = "-" + if prev_space then + goto continue + else + prev_space = true + end + else + -- Convert all alphabetic characters to lowercase. + char = unicode.utf8.lower(char) + prev_space = false + end + + table.insert(buffer, char) + + ::continue:: + end + + if prev_space then + table.remove(buffer) + end + + local identifier = #buffer == 0 and "section" or table.concat(buffer, "") + return identifier +end +% \end{macrocode} +% \begin{markdown} +% +% Create an GitHub-flavored auto identifier string by stripping and converting characters from string `s`. +% +% \end{markdown} +% \begin{macrocode} +local function create_gfm_auto_identifier(s) + local buffer = {} + local prev_space = false + local letter_found = false + + for _, code in utf8.codes(uni_algos.normalize.NFC(s)) do + local char = utf8.char(code) + + -- Remove everything up to the first non-space. + if not letter_found then + local is_letter = unicode.utf8.match(char, "%S") + if is_letter then + letter_found = true + else + goto continue + end + end + + -- Remove all non-alphanumeric characters, except underscores and hyphens. + if not unicode.utf8.match(char, "[%w_%-%s]") then + prev_space = false + goto continue + end + + -- Replace all spaces and newlines with hyphens. + if unicode.utf8.match(char, "[%s\n]") then + char = "-" + if prev_space then + goto continue + else + prev_space = true + end + else + -- Convert all alphabetic characters to lowercase. + char = unicode.utf8.lower(char) + prev_space = false + end + + table.insert(buffer, char) + + ::continue:: + end + + if prev_space then + table.remove(buffer) + end + + local identifier = #buffer == 0 and "section" or table.concat(buffer, "") + return identifier +end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->heading} as a function that will transform an +% input heading `s` at level `level` with attributes `attributes` to the +% output format. +% +% \end{markdown} +% \begin{macrocode} + function self.heading(s, level, attributes) + local buf = {} + local flat_text, inlines = table.unpack(s) + + -- push empty attributes for implied sections + while self.attribute_type_levels["heading"] < level - 1 do + table.insert(buf, + self.push_attributes("heading", + nil, + "\\markdownRendererSectionBegin\n", + "\n\\markdownRendererSectionEnd ")) + end + + -- pop attributes for sections that have ended + while self.attribute_type_levels["heading"] >= level do + table.insert(buf, self.pop_attributes("heading")) + end + + -- construct attributes for the new section + local auto_identifiers = {} + if self.options.autoIdentifiers then + table.insert(auto_identifiers, create_auto_identifier(flat_text)) + end + if self.options.gfmAutoIdentifiers then + table.insert(auto_identifiers, create_gfm_auto_identifier(flat_text)) + end + local normalized_attributes = normalize_attributes(attributes, auto_identifiers) + + -- push attributes for the new section + local start_output = {} + local end_output = {} + table.insert(start_output, "\\markdownRendererSectionBegin\n") + table.insert(end_output, "\n\\markdownRendererSectionEnd ") + + table.insert(buf, self.push_attributes("heading", + normalized_attributes, + start_output, + end_output)) + assert(self.attribute_type_levels["heading"] == level) + + -- render the heading and its attributes + if self.is_writing and #normalized_attributes > 0 then + table.insert(buf, "\\markdownRendererHeaderAttributeContextBegin\n") + table.insert(buf, self.attributes(normalized_attributes, false)) + end + + local cmd + level = level + options.shiftHeadings + if level <= 1 then + cmd = "\\markdownRendererHeadingOne" + elseif level == 2 then + cmd = "\\markdownRendererHeadingTwo" + elseif level == 3 then + cmd = "\\markdownRendererHeadingThree" + elseif level == 4 then + cmd = "\\markdownRendererHeadingFour" + elseif level == 5 then + cmd = "\\markdownRendererHeadingFive" + elseif level >= 6 then + cmd = "\\markdownRendererHeadingSix" + else + cmd = "" + end + if self.is_writing then + table.insert(buf, {cmd, "{", inlines, "}"}) + end + + if self.is_writing and #normalized_attributes > 0 then + table.insert(buf, "\\markdownRendererHeaderAttributeContextEnd ") + end + + return buf + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->get_state} as a function that returns the current +% state of the writer, where the state of a writer are its mutable member +% variables. +% +% \end{markdown} +% \begin{macrocode} + function self.get_state() + return { + is_writing=self.is_writing, + flatten_inlines=self.flatten_inlines, + active_attributes={table.unpack(self.active_attributes)}, + } + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->set_state} as a function that restores the input +% state `s` and returns the previous state of the writer. +% +% \end{markdown} +% \begin{macrocode} + function self.set_state(s) + local previous_state = self.get_state() + for key, value in pairs(s) do + self[key] = value + end + return previous_state + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->defer_call} as a function that will encapsulate the +% input function `f`, so that `f` is called with the state of the writer at the +% time of calling \luamref{writer->defer_call}. % % \end{markdown} % \begin{macrocode} -function entities.dec_entity(s) - return unicode.utf8.char(tonumber(s)) + function self.defer_call(f) + local previous_state = self.get_state() + return function(...) + local state = self.set_state(previous_state) + local return_value = f(...) + self.set_state(state) + return return_value + end + end + + return self end % \end{macrocode} % \par % \begin{markdown} % -% Given a string `s` of hexadecimal digits, the -% \luamdef{entities.hex_entity} returns the corresponding -% \acro{utf}8-encoded Unicode codepoint. +%### Parsers +% The \luamdef{parsers} hash table stores \acro{peg} patterns that are +% static and can be reused between different \luamref{reader} objects. % % \end{markdown} % \begin{macrocode} -function entities.hex_entity(s) - return unicode.utf8.char(tonumber("0x"..s)) -end +local parsers = {} % \end{macrocode} % \par % \begin{markdown} % -% Given a character entity name `s` (like `ouml`), the -% \luamdef{entities.char_entity} returns the corresponding -% \acro{utf}8-encoded Unicode codepoint. +%#### Basic Parsers % % \end{markdown} % \begin{macrocode} -function entities.char_entity(s) - local n = character_entities[s] - if n == nil then - return "&" .. s .. ";" - end - return unicode.utf8.char(n) -end +parsers.percent = P("%") +parsers.at = P("@") +parsers.comma = P(",") +parsers.asterisk = P("*") +parsers.dash = P("-") +parsers.plus = P("+") +parsers.underscore = P("_") +parsers.period = P(".") +parsers.hash = P("#") +parsers.dollar = P("$") +parsers.ampersand = P("&") +parsers.backtick = P("`") +parsers.less = P("<") +parsers.more = P(">") +parsers.space = P(" ") +parsers.squote = P("'") +parsers.dquote = P('"') +parsers.lparent = P("(") +parsers.rparent = P(")") +parsers.lbracket = P("[") +parsers.rbracket = P("]") +parsers.lbrace = P("{") +parsers.rbrace = P("}") +parsers.circumflex = P("^") +parsers.slash = P("/") +parsers.equal = P("=") +parsers.colon = P(":") +parsers.semicolon = P(";") +parsers.exclamation = P("!") +parsers.pipe = P("|") +parsers.tilde = P("~") +parsers.backslash = P("\\") +parsers.tab = P("\t") +parsers.newline = P("\n") + +parsers.digit = R("09") +parsers.hexdigit = R("09","af","AF") +parsers.letter = R("AZ","az") +parsers.alphanumeric = R("AZ","az","09") +parsers.keyword = parsers.letter + * (parsers.alphanumeric + parsers.dash)^0 +parsers.internal_punctuation = S(":;,.?") + +parsers.doubleasterisks = P("**") +parsers.doubleunderscores = P("__") +parsers.doubletildes = P("~~") +parsers.fourspaces = P(" ") + +parsers.any = P(1) +parsers.succeed = P(true) +parsers.fail = P(false) + +parsers.escapable = S("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~") +parsers.anyescaped = parsers.backslash / "" * parsers.escapable + + parsers.any + +parsers.spacechar = S("\t ") +parsers.spacing = S(" \n\r\t") +parsers.nonspacechar = parsers.any - parsers.spacing +parsers.optionalspace = parsers.spacechar^0 + +parsers.normalchar = parsers.any - (V("SpecialChar") + + parsers.spacing) +parsers.eof = -parsers.any +parsers.nonindentspace = parsers.space^-3 * - parsers.spacechar +parsers.indent = parsers.space^-3 * parsers.tab + + parsers.fourspaces / "" +parsers.linechar = P(1 - parsers.newline) + +parsers.blankline = parsers.optionalspace + * parsers.newline / "\n" +parsers.blanklines = parsers.blankline^0 +parsers.skipblanklines = (parsers.optionalspace * parsers.newline)^0 +parsers.indentedline = parsers.indent /"" + * C(parsers.linechar^1 * parsers.newline^-1) +parsers.optionallyindentedline = parsers.indent^-1 /"" + * C(parsers.linechar^1 * parsers.newline^-1) +parsers.sp = parsers.spacing^0 +parsers.spnl = parsers.optionalspace + * (parsers.newline * parsers.optionalspace)^-1 +parsers.line = parsers.linechar^0 * parsers.newline +parsers.nonemptyline = parsers.line - parsers.blankline % \end{macrocode} -% \par +% \par % \begin{markdown} % -%### Plain \TeX{} Writer {#tex-writer} -% -% This section documents the \luamref{writer} object, which implements the -% routines for producing the \TeX{} output. The object is an amalgamate of the -% generic, \TeX{}, \LaTeX{} writer objects that were located in the -% `lunamark/writer/generic.lua`, `lunamark/writer/tex.lua`, and -% `lunamark/writer/latex.lua` files in the Lunamark Lua module. -% -% Although not specified in the Lua interface (see Section -% <#sec:luainterface>), the \luamref{writer} object is exported, so that the -% curious user could easily tinker with the methods of the objects produced by -% the \luamref{writer.new} method described below. The user should be aware, -% however, that the implementation may change in a future revision. +%#### Parsers Used for Indentation % % \end{markdown} % \begin{macrocode} -M.writer = {} + +parsers.leader = parsers.space^-3 + % \end{macrocode} -% \par % \begin{markdown} % -% The \luamdef{writer.new} method creates and returns a new \TeX{} writer -% object associated with the Lua interface options (see Section -% <#sec:lua-options>) `options`. When `options` are unspecified, it is -% assumed that an empty table was passed to the method. -% -% The objects produced by the \luamref{writer.new} method expose instance methods -% and variables of their own. As a convention, I will refer to these -% \meta{member}s as `writer->`\meta{member}. All member variables are -% immutable unless explicitly stated otherwise. +% Check if a trail exists and is non-empty in the indent table `indent_table`. % % \end{markdown} % \begin{macrocode} -function M.writer.new(options) - local self = {} +local function has_trail(indent_table) + return indent_table ~= nil and + indent_table.trail ~= nil and + next(indent_table.trail) ~= nil +end + % \end{macrocode} -% \par % \begin{markdown} % -% Make `options` available as \luamdef{writer->options}, so that it is -% accessible from extensions. +% Check if indent table `indent_table` has any indents. % % \end{markdown} % \begin{macrocode} - self.options = options +local function has_indents(indent_table) + return indent_table ~= nil and + indent_table.indents ~= nil and + next(indent_table.indents) ~= nil +end + % \end{macrocode} -% \par % \begin{markdown} % -% Parse the \Opt{slice} option and define \luamdef{writer->slice\_begin}, -% \luamdef{writer->slice\_end}, and \luamdef{writer->is\_writing}. The -% \luamref{writer->is\_writing} member variable is mutable. +% Add a trail `trail_info` to the indent table `indent_table`. % % \end{markdown} % \begin{macrocode} - local slice_specifiers = {} - for specifier in options.slice:gmatch("[^%s]+") do - table.insert(slice_specifiers, specifier) - end - - if #slice_specifiers == 2 then - self.slice_begin, self.slice_end = table.unpack(slice_specifiers) - local slice_begin_type = self.slice_begin:sub(1, 1) - if slice_begin_type ~= "^" and slice_begin_type ~= "$" then - self.slice_begin = "^" .. self.slice_begin - end - local slice_end_type = self.slice_end:sub(1, 1) - if slice_end_type ~= "^" and slice_end_type ~= "$" then - self.slice_end = "$" .. self.slice_end - end - elseif #slice_specifiers == 1 then - self.slice_begin = "^" .. slice_specifiers[1] - self.slice_end = "$" .. slice_specifiers[1] - end - - self.slice_begin_type = self.slice_begin:sub(1, 1) - self.slice_begin_identifier = self.slice_begin:sub(2) or "" - self.slice_end_type = self.slice_end:sub(1, 1) - self.slice_end_identifier = self.slice_end:sub(2) or "" +local function add_trail(indent_table, trail_info) + indent_table.trail = trail_info + return indent_table +end - if self.slice_begin == "^" and self.slice_end ~= "^" then - self.is_writing = true - else - self.is_writing = false - end % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->suffix} as the suffix of the produced cache files. +% Remove a trail `trail_info` from the indent table `indent_table`. % % \end{markdown} % \begin{macrocode} - self.suffix = ".tex" +local function remove_trail(indent_table) + indent_table.trail = nil + return indent_table +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->space} as the output format of a space character. +% Update the indent table `indent_table` by adding or removing a new +% indent `add`. % % \end{markdown} % \begin{macrocode} - self.space = " " +local function update_indent_table(indent_table, new_indent, add) + indent_table = remove_trail(indent_table) + + if not has_indents(indent_table) then + indent_table.indents = {} + end + + + if add then + indent_table.indents[#indent_table.indents + 1] = new_indent + else + if indent_table.indents[#indent_table.indents].name == new_indent.name then + indent_table.indents[#indent_table.indents] = nil + end + end + + return indent_table +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->nbsp} as the output format of a non-breaking space -% character. +% Remove an indent by its name `name`. % % \end{markdown} % \begin{macrocode} - self.nbsp = "\\markdownRendererNbsp{}" +local function remove_indent(name) + local function remove_indent_level(s, i, indent_table) -- luacheck: ignore s i + indent_table = update_indent_table(indent_table, {name=name}, false) + return true, indent_table + end + + return Cg(Cmt(Cb("indent_info"), remove_indent_level), "indent_info") +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->plain} as a function that will transform an input -% plain text block `s` to the output format. +% Process the spacing of a string of spaces and tabs `spacing` with preceding indent width from +% the start of the line `indent` and strip up to `left_strip_length` spaces. Return the remainder +% `remainder` and whether there is enough spaces to produce a code `is_code`. Return how many +% spaces were stripped, as well as if the minimum was met `is_minimum` and what remainder it +% left `minimum_remainder`. % % \end{markdown} % \begin{macrocode} - function self.plain(s) - return s +local function process_starter_spacing(indent, spacing, minimum, left_strip_length) + left_strip_length = left_strip_length or 0 + + local count = 0 + local tab_value = 4 - (indent) % 4 + + local code_started, minimum_found = false, false + local code_start, minimum_remainder = "", "" + + local left_total_stripped = 0 + local full_remainder = "" + + if spacing ~= nil then + for i = 1, #spacing do + local character = spacing:sub(i, i) + + if character == "\t" then + count = count + tab_value + tab_value = 4 + elseif character == " " then + count = count + 1 + tab_value = 4 - (1 - tab_value) % 4 + end + + if (left_strip_length ~= 0) then + local possible_to_strip = math.min(count, left_strip_length) + count = count - possible_to_strip + left_strip_length = left_strip_length - possible_to_strip + left_total_stripped = left_total_stripped + possible_to_strip + else + full_remainder = full_remainder .. character + end + + if (minimum_found) then + minimum_remainder = minimum_remainder .. character + elseif (count >= minimum) then + minimum_found = true + minimum_remainder = minimum_remainder .. string.rep(" ", count - minimum) + end + + if (code_started) then + code_start = code_start .. character + elseif (count >= minimum + 4) then + code_started = true + code_start = code_start .. string.rep(" ", count - (minimum + 4)) + end + end + end + + local remainder + if (code_started) then + remainder = code_start + else + remainder = string.rep(" ", count - minimum) end + + local is_minimum = count >= minimum + return { + is_code = code_started, + remainder = remainder, + left_total_stripped = left_total_stripped, + is_minimum = is_minimum, + minimum_remainder = minimum_remainder, + total_length = count, + full_remainder = full_remainder + } +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->paragraph} as a function that will transform an -% input paragraph `s` to the output format. +% Count the total width of all indents in the indent table `indent_table`. % % \end{markdown} % \begin{macrocode} - function self.paragraph(s) - if not self.is_writing then return "" end - return s +local function count_indent_tab_level(indent_table) + local count = 0 + if not has_indents(indent_table) then + return count + end + + for i=1, #indent_table.indents do + count = count + indent_table.indents[i].length end + return count +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->pack} as a function that will take the filename -% `name` of the output file prepared by the reader and transform it to the -% output format. +% Count the total width of a delimiter `delimiter`. % % \end{markdown} % \begin{macrocode} - function self.pack(name) - return [[\input{]] .. name .. [[}\relax]] +local function total_delimiter_length(delimiter) + local count = 0 + if type(delimiter) == "string" then return #delimiter end + for _, value in pairs(delimiter) do + count = count + total_delimiter_length(value) end + return count +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->interblocksep} as the output format of a block -% element separator. +% Process the container starter `starter` of a type `indent_type`. Adjust the width of the indent +% if the delimiter is followed only by whitespaces `is_blank`. % % \end{markdown} % \begin{macrocode} - function self.interblocksep() - if not self.is_writing then return "" end - return "\\markdownRendererInterblockSeparator\n{}" +local function process_starter_indent(_, _, indent_table, starter, is_blank, indent_type, breakable) + local last_trail = starter[1] + local delimiter = starter[2] + local raw_new_trail = starter[3] + + if indent_type == "bq" and not breakable then + indent_table.ignore_blockquote_blank = true + end + + if has_trail(indent_table) then + local trail = indent_table.trail + if trail.is_code then + return false + end + last_trail = trail.remainder + else + local sp = process_starter_spacing(0, last_trail, 0, 0) + + if sp.is_code then + return false + end + last_trail = sp.remainder + end + + local preceding_indentation = count_indent_tab_level(indent_table) % 4 + local last_trail_length = #last_trail + local delimiter_length = total_delimiter_length(delimiter) + + local total_indent_level = preceding_indentation + last_trail_length + delimiter_length + + local sp = {} + if not is_blank then + sp = process_starter_spacing(total_indent_level, raw_new_trail, 0, 1) end + + local del_trail_length = sp.left_total_stripped + if is_blank then + del_trail_length = 1 + elseif not sp.is_code then + del_trail_length = del_trail_length + #sp.remainder + end + + local indent_length = last_trail_length + delimiter_length + del_trail_length + local new_indent_info = {name=indent_type, length=indent_length} + + indent_table = update_indent_table(indent_table, new_indent_info, true) + indent_table = add_trail(indent_table, {is_code=sp.is_code, remainder=sp.remainder, total_length=sp.total_length, + full_remainder=sp.full_remainder}) + + return true, indent_table +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->hard_line_break} as the output format of a forced -% line break. +% Return the pattern corresponding with the indent name `name`. % % \end{markdown} % \begin{macrocode} - self.hard_line_break = "\\markdownRendererHardLineBreak\n{}" +local function decode_pattern(name) + local delimeter = parsers.succeed + if name == "bq" then + delimeter = parsers.more + end + + return C(parsers.optionalspace) * C(delimeter) * C(parsers.optionalspace) * Cp() +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->ellipsis} as the output format of an ellipsis. +% Find the first blank-only indent of the indent table `indent_table` followed +% by blank-only indents. % % \end{markdown} % \begin{macrocode} - self.ellipsis = "\\markdownRendererEllipsis{}" +local function left_blank_starter(indent_table) + local blank_starter_index + + if not has_indents(indent_table) then + return + end + + for i = #indent_table.indents,1,-1 do + local value = indent_table.indents[i] + if value.name == "li" then + blank_starter_index = i + else + break + end + end + + return blank_starter_index +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->thematic_break} as the output format of a thematic -% break. +% Apply the patterns decoded from the indents of the indent table `indent_table` +% iteratively starting at position `index` of the string `s`. If the `is_optional` +% mode is selected, match as many patterns as possible, else match all or fail. +% With the option `is_blank`, the parsing behaves as optional after the position +% of a blank-only indent has been surpassed. % % \end{markdown} % \begin{macrocode} - function self.thematic_break() - if not self.is_writing then return "" end - return "\\markdownRendererThematicBreak{}" +local function traverse_indent(s, i, indent_table, is_optional, is_blank) + local new_index = i + + local preceding_indentation = 0 + local current_trail = {} + + local blank_starter = left_blank_starter(indent_table) + + for index = 1,#indent_table.indents do + local value = indent_table.indents[index] + local pattern = decode_pattern(value.name) + + -- match decoded pattern + local new_indent_info = lpeg.match(Ct(pattern), s, new_index) + if new_indent_info == nil then + local blankline_end = lpeg.match(Ct(parsers.blankline * Cg(Cp(), "pos")), s, new_index) + if is_optional or not indent_table.ignore_blockquote_blank or not blankline_end then + return is_optional, new_index, current_trail + end + + return traverse_indent(s, tonumber(blankline_end.pos), indent_table, is_optional, is_blank) + end + + local raw_last_trail = new_indent_info[1] + local delimiter = new_indent_info[2] + local raw_new_trail = new_indent_info[3] + local next_index = new_indent_info[4] + + local space_only = delimiter == "" + + -- check previous trail + if not space_only and next(current_trail) == nil then + local sp = process_starter_spacing(0, raw_last_trail, 0, 0) + current_trail = {is_code=sp.is_code, remainder=sp.remainder, total_length=sp.total_length, + full_remainder=sp.full_remainder} + end + + if next(current_trail) ~= nil then + if not space_only and current_trail.is_code then + return is_optional, new_index, current_trail + end + if current_trail.internal_remainder ~= nil then + raw_last_trail = current_trail.internal_remainder + end + end + + local raw_last_trail_length = 0 + local delimiter_length = 0 + + if not space_only then + delimiter_length = #delimiter + raw_last_trail_length = #raw_last_trail + end + + local total_indent_level = preceding_indentation + raw_last_trail_length + delimiter_length + + local spacing_to_process + local minimum = 0 + local left_strip_length = 0 + + if not space_only then + spacing_to_process = raw_new_trail + left_strip_length = 1 + else + spacing_to_process = raw_last_trail + minimum = value.length + end + + local sp = process_starter_spacing(total_indent_level, spacing_to_process, minimum, left_strip_length) + + if space_only and not sp.is_minimum then + return is_optional or (is_blank and blank_starter <= index), new_index, current_trail + end + + local indent_length = raw_last_trail_length + delimiter_length + sp.left_total_stripped + + -- update info for the next pattern + if not space_only then + preceding_indentation = preceding_indentation + indent_length + else + preceding_indentation = preceding_indentation + value.length + end + + current_trail = {is_code=sp.is_code, remainder=sp.remainder, internal_remainder=sp.minimum_remainder, + total_length=sp.total_length, full_remainder=sp.full_remainder} + new_index = next_index end + + return true, new_index, current_trail +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define tables \luamdef{writer->escaped_uri_chars} and -% \luamdef{writer->escaped_minimal_strings} containing the mapping from -% special plain characters and character strings that always need to be -% escaped. +% Check if a code trail is expected. % % \end{markdown} % \begin{macrocode} - self.escaped_uri_chars = { - ["{"] = "\\markdownRendererLeftBrace{}", - ["}"] = "\\markdownRendererRightBrace{}", - ["\\"] = "\\markdownRendererBackslash{}", - } - self.escaped_minimal_strings = { - ["^^"] = "\\markdownRendererCircumflex\\markdownRendererCircumflex ", - ["☒"] = "\\markdownRendererTickedBox{}", - ["⌛"] = "\\markdownRendererHalfTickedBox{}", - ["☐"] = "\\markdownRendererUntickedBox{}", - [entities.hex_entity('FFFD')] = "\\markdownRendererReplacementCharacter{}", - } +local function check_trail(expect_code, is_code) + return (expect_code and is_code) or (not expect_code and not is_code) +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define table \luamdef{writer->escaped_strings} containing the mapping from -% character strings that need to be escaped in typeset content. +% Check if the current trail of the `indent_table` would produce code if it is expected `expect_code` +% or it would not if it is not. If there is no trail, process and check the current spacing `spacing`. % % \end{markdown} % \begin{macrocode} - self.escaped_strings = util.table_copy(self.escaped_minimal_strings) - self.escaped_strings[entities.hex_entity('00A0')] = self.nbsp +local function check_trail_joined(s, i, indent_table, spacing, expect_code, omit_remainder) -- luacheck: ignore s i + local is_code + local remainder + + if has_trail(indent_table) then + local trail = indent_table.trail + is_code = trail.is_code + if is_code then + remainder = trail.remainder + else + remainder = trail.full_remainder + end + else + local sp = process_starter_spacing(0, spacing, 0, 0) + is_code = sp.is_code + if is_code then + remainder = sp.remainder + else + remainder = sp.full_remainder + end + end + + local result = check_trail(expect_code, is_code) + if omit_remainder then + return result + end + return result, remainder +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define a table \luamdef{writer->escaped_chars} containing the mapping from -% special plain \TeX{} characters (including the active pipe character (`|`) -% of \Hologo{ConTeXt}) that need to be escaped in typeset content. +% Check if the current trail of the `indent_table` is of length between `min` and `max`. % % \end{markdown} % \begin{macrocode} - self.escaped_chars = { - ["{"] = "\\markdownRendererLeftBrace{}", - ["}"] = "\\markdownRendererRightBrace{}", - ["%"] = "\\markdownRendererPercentSign{}", - ["\\"] = "\\markdownRendererBackslash{}", - ["#"] = "\\markdownRendererHash{}", - ["$"] = "\\markdownRendererDollarSign{}", - ["&"] = "\\markdownRendererAmpersand{}", - ["_"] = "\\markdownRendererUnderscore{}", - ["^"] = "\\markdownRendererCircumflex{}", - ["~"] = "\\markdownRendererTilde{}", - ["|"] = "\\markdownRendererPipe{}", - [entities.hex_entity('0000')] = "\\markdownRendererReplacementCharacter{}", - } +local function check_trail_length(s, i, indent_table, spacing, min, max) -- luacheck: ignore s i + local trail + + if has_trail(indent_table) then + trail = indent_table.trail + else + trail = process_starter_spacing(0, spacing, 0, 0) + end + + local total_length = trail.total_length + if total_length == nil then + return false + end + + return min <= total_length and total_length <= max +end + % \end{macrocode} -% \par % \begin{markdown} % -% Use the \luamref{writer->escaped_chars}, \luamref{writer->escaped_uri_chars}, -% and \luamref{writer->escaped_minimal_strings} tables to create the -% \luamdef{writer->escape_typographic_text}, -% \luamdef{writer->escape_programmatic_text}, and -% \luamdef{writer->escape_minimal} escaper functions. +% Check the indentation of the continuation line, optionally with +% the mode `is_optional` selected. Check blank line exclusively with `is_blank`. % % \end{markdown} % \begin{macrocode} - local escape_typographic_text = util.escaper( - self.escaped_chars, self.escaped_strings) - local escape_programmatic_text = util.escaper( - self.escaped_uri_chars, self.escaped_minimal_strings) - local escape_minimal = util.escaper( - {}, self.escaped_minimal_strings) +local function check_continuation_indentation(s, i, indent_table, is_optional, is_blank) + if not has_indents(indent_table) then + return true + end + + local passes, new_index, current_trail = traverse_indent(s, i, indent_table, is_optional, is_blank) + + if passes then + indent_table = add_trail(indent_table, current_trail) + return new_index, indent_table + end + return false +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define the following semantic aliases for the escaper functions: -% -% - \luamdef{writer->escape} transforms a text string that should always be -% made printable. -% - \luamdef{writer->string} transforms a text string that should be made -% printable only when the \Opt{hybrid} Lua option is disabled. When \Opt{hybrid} -% is enabled, the text string should be kept as-is. -% - \luamdef{writer->math} transforms a math span. -% - \luamdef{writer->identifier} transforms an input programmatic identifier. -% - \luamdef{writer->uri} transforms an input \acro{uri}. +% Get name of the last indent from the `indent_table`. % % \end{markdown} % \begin{macrocode} - self.escape = escape_typographic_text - self.math = escape_minimal - if options.hybrid then - self.identifier = escape_minimal - self.string = escape_minimal - self.uri = escape_minimal - else - self.identifier = escape_programmatic_text - self.string = escape_typographic_text - self.uri = escape_programmatic_text +local function get_last_indent_name(indent_table) + if has_indents(indent_table) then + return indent_table.indents[#indent_table.indents].name end +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->code} as a function that will transform an input -% inline code span `s` with optional attributes `attributes` to the output -% format. +% Remove the remainder altogether if the last indent from the `indent_table` +% is blank-only. % % \end{markdown} % \begin{macrocode} - function self.code(s, attributes) - local buf = {} - if attributes ~= nil then - table.insert(buf, - "\\markdownRendererCodeSpanAttributeContextBegin\n") - table.insert(buf, self.attributes(attributes)) - end - table.insert(buf, - {"\\markdownRendererCodeSpan{", self.escape(s), "}"}) - if attributes ~= nil then - table.insert(buf, - "\\markdownRendererCodeSpanAttributeContextEnd{}") - end - return buf +local function remove_remainder_if_blank(indent_table, remainder) + if get_last_indent_name(indent_table) == "li" then + return "" end + return remainder +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->link} as a function that will transform an input -% hyperlink to the output format, where `lab` corresponds to the label, -% `src` to \acro{uri}, `tit` to the title of the link, and `attributes` to -% optional attributes. +% Take the trail `trail` or create a new one from `spacing` and comapre it +% with the expected `trail_type`. On success return the index `i` and the +% remainder of the trail. % % \end{markdown} % \begin{macrocode} - function self.link(lab, src, tit, attributes) - local buf = {} - if attributes ~= nil then - table.insert(buf, - "\\markdownRendererLinkAttributeContextBegin\n") - table.insert(buf, self.attributes(attributes)) - end - table.insert(buf, {"\\markdownRendererLink{",lab,"}", - "{",self.escape(src),"}", - "{",self.uri(src),"}", - "{",self.string(tit or ""),"}"}) - if attributes ~= nil then - table.insert(buf, - "\\markdownRendererLinkAttributeContextEnd{}") +local function check_trail_type(s, i, trail, spacing, trail_type) -- luacheck: ignore s i + if trail == nil then + trail = process_starter_spacing(0, spacing, 0, 0) + end + + if trail_type == "non-code" then + return check_trail(false, trail.is_code) + end + if trail_type == "code" then + return check_trail(true, trail.is_code) + end + if trail_type == "full-code" then + if (trail.is_code) then + return i, trail.remainder end - return buf + return i, "" + end + if trail_type == "full-any" then + return i, trail.internal_remainder end +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->image} as a function that will transform an input -% image to the output format, where `lab` corresponds to the label, `src` -% to the \acro{url}, `tit` to the title of the image, and `attributes` to -% optional attributes. +% Stores or restores an `is_freezing` trail from indent table `indent_table`. % % \end{markdown} -% \begin{macrocode} - function self.image(lab, src, tit, attributes) - local buf = {} - if attributes ~= nil then - table.insert(buf, - "\\markdownRendererImageAttributeContextBegin\n") - table.insert(buf, self.attributes(attributes)) - end - table.insert(buf, {"\\markdownRendererImage{",lab,"}", - "{",self.string(src),"}", - "{",self.uri(src),"}", - "{",self.string(tit or ""),"}"}) - if attributes ~= nil then - table.insert(buf, - "\\markdownRendererImageAttributeContextEnd{}") +% \begin{macrocode} +local function trail_freezing(s, i, indent_table, is_freezing) -- luacheck: ignore s i + if is_freezing then + if indent_table.is_trail_frozen then + indent_table.trail = indent_table.frozen_trail + else + indent_table.frozen_trail = indent_table.trail + indent_table.is_trail_frozen = true end - return buf + else + indent_table.frozen_trail = nil + indent_table.is_trail_frozen = false end + return true, indent_table +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->bulletlist} as a function that will transform an input -% bulleted list to the output format, where `items` is an array of the list -% items and `tight` specifies, whether the list is tight or not. +% Check the indentation of the continuation line, optionally with +% the mode `is_optional` selected. Check blank line specifically with `is_blank`. +% Additionally, also directly check the new trail with a type `trail_type`. % % \end{markdown} % \begin{macrocode} - function self.bulletlist(items,tight) - if not self.is_writing then return "" end - local buffer = {} - for _,item in ipairs(items) do - buffer[#buffer + 1] = self.bulletitem(item) +local function check_continuation_indentation_and_trail(s, i, indent_table, is_optional, is_blank, trail_type, + reset_rem, omit_remainder) + if not has_indents(indent_table) then + local spacing, new_index = lpeg.match(C(parsers.spacechar^0) * Cp(), s, i) + local result, remainder = check_trail_type(s, i, indent_table.trail, spacing, trail_type) + if remainder == nil then + if result then + return new_index + end + return false end - local contents = util.intersperse(buffer,"\n") - if tight and options.tightLists then - return {"\\markdownRendererUlBeginTight\n",contents, - "\n\\markdownRendererUlEndTight "} + if result then + return new_index, remainder + end + return false + end + + local passes, new_index, current_trail = traverse_indent(s, i, indent_table, is_optional, is_blank) + + if passes then + local spacing + if current_trail == nil then + local newer_spacing, newer_index = lpeg.match(C(parsers.spacechar^0) * Cp(), s, i) + current_trail = process_starter_spacing(0, newer_spacing, 0, 0) + new_index = newer_index + spacing = newer_spacing else - return {"\\markdownRendererUlBegin\n",contents, - "\n\\markdownRendererUlEnd "} + spacing = current_trail.remainder + end + local result, remainder = check_trail_type(s, new_index, current_trail, spacing, trail_type) + if remainder == nil or omit_remainder then + if result then + return new_index + end + return false + end + + if is_blank and reset_rem then + remainder = remove_remainder_if_blank(indent_table, remainder) end + if result then + return new_index, remainder + end + return false end + return false +end + % \end{macrocode} % \begin{markdown} % -% Define \luamdef{writer->bulletitem} as a function that will transform an -% input bulleted list item to the output format, where `s` is the text of -% the list item. +% The following patterns check whitespace indentation at the start of a block. % % \end{markdown} % \begin{macrocode} - function self.bulletitem(s) - return {"\\markdownRendererUlItem ",s, - "\\markdownRendererUlItemEnd "} - end +parsers.check_trail = Cmt(Cb("indent_info") * C(parsers.spacechar^0) * Cc(false), check_trail_joined) + +parsers.check_trail_no_rem = Cmt(Cb("indent_info") * C(parsers.spacechar^0) * Cc(false) * Cc(true), check_trail_joined) + +parsers.check_code_trail = Cmt(Cb("indent_info") * C(parsers.spacechar^0) * Cc(true), check_trail_joined) + +parsers.check_trail_length_range = function(min, max) + return Cmt(Cb("indent_info") * C(parsers.spacechar^0) * Cc(min) * Cc(max), check_trail_length) +end + +parsers.check_trail_length = function(n) + return parsers.check_trail_length_range(n, n) +end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->orderedlist} as a function that will transform an -% input ordered list to the output format, where `items` is an array of the -% list items and `tight` specifies, whether the list is tight or not. If the -% optional parameter `startnum` is present, it is the number of the first list -% item. +% The following patterns handle trail backup, to prevent a failing pattern to modify it before +% passing it to the next. % % \end{markdown} % \begin{macrocode} - function self.orderedlist(items,tight,startnum) - if not self.is_writing then return "" end - local buffer = {} - local num = startnum - for _,item in ipairs(items) do - buffer[#buffer + 1] = self.ordereditem(item,num) - if num ~= nil then - num = num + 1 - end - end - local contents = util.intersperse(buffer,"\n") - if tight and options.tightLists then - return {"\\markdownRendererOlBeginTight\n",contents, - "\n\\markdownRendererOlEndTight "} - else - return {"\\markdownRendererOlBegin\n",contents, - "\n\\markdownRendererOlEnd "} - end - end +parsers.freeze_trail = Cg(Cmt(Cb("indent_info") * Cc(true), trail_freezing), "indent_info") + +parsers.unfreeze_trail = Cg(Cmt(Cb("indent_info") * Cc(false), trail_freezing), "indent_info") + % \end{macrocode} % \begin{markdown} % -% Define \luamdef{writer->ordereditem} as a function that will transform an -% input ordered list item to the output format, where `s` is the text of -% the list item. If the optional parameter `num` is present, it is the number -% of the list item. +% The following patterns check indentation in continuation lines as defined by the container start. % % \end{markdown} % \begin{macrocode} - function self.ordereditem(s,num) - if num ~= nil then - return {"\\markdownRendererOlItemWithNumber{",num,"}",s, - "\\markdownRendererOlItemEnd "} - else - return {"\\markdownRendererOlItem ",s, - "\\markdownRendererOlItemEnd "} - end - end +parsers.check_minimal_indent = Cmt(Cb("indent_info") * Cc(false), check_continuation_indentation) + +parsers.check_optional_indent = Cmt(Cb("indent_info") * Cc(true), check_continuation_indentation) + +parsers.check_minimal_blank_indent = Cmt(Cb("indent_info") * Cc(false) * Cc(true), check_continuation_indentation) + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->inline_html_comment} as a function that will -% transform the contents of an inline \acro{HTML} comment, to the output -% format, where `contents` are the contents of the \acro{HTML} comment. +% The following patterns check indentation in continuation lines as defined by the container start. +% Additionally the subsequent trail is also directly checked. % % \end{markdown} % \begin{macrocode} - function self.inline_html_comment(contents) - return {"\\markdownRendererInlineHtmlComment{",contents,"}"} - end + +parsers.check_minimal_indent_and_trail = Cmt( Cb("indent_info") + * Cc(false) * Cc(false) * Cc("non-code") * Cc(true), + check_continuation_indentation_and_trail) + +parsers.check_minimal_indent_and_code_trail = Cmt( Cb("indent_info") + * Cc(false) * Cc(false) * Cc("code") * Cc(false), + check_continuation_indentation_and_trail) + +parsers.check_minimal_blank_indent_and_full_code_trail = Cmt( Cb("indent_info") + * Cc(false) * Cc(true) * Cc("full-code") * Cc(true), + check_continuation_indentation_and_trail) + +parsers.check_minimal_indent_and_any_trail = Cmt( Cb("indent_info") + * Cc(false) * Cc(false) * Cc("full-any") * Cc(true) * Cc(false), + check_continuation_indentation_and_trail) + +parsers.check_minimal_blank_indent_and_any_trail = Cmt( Cb("indent_info") + * Cc(false) * Cc(true) * Cc("full-any") * Cc(true) * Cc(false), + check_continuation_indentation_and_trail) + +parsers.check_minimal_blank_indent_and_any_trail_no_rem = Cmt( Cb("indent_info") + * Cc(false) * Cc(true) * Cc("full-any") * Cc(true) * Cc(true), + check_continuation_indentation_and_trail) + +parsers.check_optional_indent_and_any_trail = Cmt( Cb("indent_info") + * Cc(true) * Cc(false) * Cc("full-any") * Cc(true) * Cc(false), + check_continuation_indentation_and_trail) + +parsers.check_optional_blank_indent_and_any_trail = Cmt( Cb("indent_info") + * Cc(true) * Cc(true) * Cc("full-any") * Cc(true) * Cc(false), + check_continuation_indentation_and_trail) + +% \end{macrocode} +% \begin{markdown} +% +% The following patterns specify behaviour around newlines. +% +% \end{markdown} +% \begin{macrocode} + +parsers.spnlc_noexc = parsers.optionalspace + * (parsers.newline * parsers.check_minimal_indent_and_any_trail)^-1 + +parsers.spnlc = parsers.optionalspace + * (V("EndlineNoSub"))^-1 + +parsers.spnlc_sep = parsers.optionalspace * V("EndlineNoSub") + + parsers.spacechar^1 + +parsers.only_blank = parsers.spacechar^0 * (parsers.newline + parsers.eof) + +% \end{macrocode} +% \begin{figure} +% \hspace*{-0.1\textwidth} +% \begin{minipage}{1.2\textwidth} +% \centering +% \begin{tikzpicture}[shorten >=1pt, line width=0.1mm, >={Stealth[length=2mm]}, node distance=4.5cm, on grid, auto] +% \node[state, initial by diamond, accepting] (noop) {initial}; +% \node[state] (odd_backslash) [above right=of noop] {odd backslash}; +% \node[state] (even_backslash) [below right=of odd_backslash] {even backslash}; +% \node[state] (comment) [below=of noop] {comment}; +% \node[state] (leading_spaces) [below=of even_backslash, align=center] {leading tabs\\and spaces}; +% \node[state] (blank_line) [below right=of comment] {blank line}; +% \path[->] +% (noop) edge [in=150, out=180, loop] node [align=center, yshift=-0.75cm] {match [$^\wedge$\textbackslash\%]\\capture \textbackslash$\!^{2k}$\meta{match}\\reset $k$} () +% edge [bend right=10] node [below right=-0.2cm] {match \textbackslash} (odd_backslash) +% edge [bend left=30] node [left, align=center] {match \%\\capture \textbackslash$\!^k$\\reset $k$} (comment) +% (comment) edge [in=305, out=325, loop] node [xshift=-1.2cm] {match [$^\wedge$$\drsh$]} () +% edge [bend left=10] node {match $\drsh$} (leading_spaces) +% (leading_spaces) edge [loop below] node {match [\textvisiblespace$\rightleftarrows$]} () +% edge [bend right=90] node [right] {match \textbackslash} (odd_backslash) +% edge [bend left=10] node {match \%} (comment) +% edge [bend right=10] node {$\epsilon$} (blank_line) +% edge [bend left=10] node [align=center, right=0.3cm] {match [$^\wedge$\textvisiblespace$\rightleftarrows$$\drsh$\textbackslash\%]\\capture \meta{match}} (noop) +% (blank_line) edge [loop below] node {match [\textvisiblespace$\rightleftarrows$]} () +% edge [bend left=90] node [align=center, below=1.2cm] {match $\drsh$\\ capture $\drsh\drsh$} (noop) +% (odd_backslash) edge [bend right=10] node [align=center, xshift=-0.3cm, yshift=0.2cm] {match \textbackslash\\increment $k$} (even_backslash) +% edge [bend right=10] node [align=center, above left=-0.3cm, xshift=0.1cm] {match [$^\wedge$\textbackslash]\\for \%, capture \textbackslash$\!^k$\%\\for [$^\wedge$\%], capture \textbackslash$\!^{2k+1}$\meta{match}\\reset $k$} (noop) +% (even_backslash) edge [bend left=10] node {$\epsilon$} (noop); +% \end{tikzpicture} +% \caption{A pushdown automaton that recognizes \TeX{} comments} +% \label{fig:commented_line} +% \end{minipage} +% \end{figure} +% \begin{markdown} +% +% The \luamdef{parsers.commented_line}`^1` parser recognizes the regular +% language of \TeX{} comments, see an equivalent finite automaton in Figure +% <#fig:commented_line>. +% +% \end{markdown} +% \begin{macrocode} +parsers.commented_line_letter = parsers.linechar + + parsers.newline + - parsers.backslash + - parsers.percent +parsers.commented_line = Cg(Cc(""), "backslashes") + * ((#(parsers.commented_line_letter + - parsers.newline) + * Cb("backslashes") + * Cs(parsers.commented_line_letter + - parsers.newline)^1 -- initial + * Cg(Cc(""), "backslashes")) + + #(parsers.backslash * parsers.backslash) + * Cg((parsers.backslash -- even backslash + * parsers.backslash)^1, "backslashes") + + (parsers.backslash + * (#parsers.percent + * Cb("backslashes") + / function(backslashes) + return string.rep("\\", #backslashes / 2) + end + * C(parsers.percent) + + #parsers.commented_line_letter + * Cb("backslashes") + * Cc("\\") + * C(parsers.commented_line_letter)) + * Cg(Cc(""), "backslashes")))^0 + * (#parsers.percent + * Cb("backslashes") + / function(backslashes) + return string.rep("\\", #backslashes / 2) + end + * ((parsers.percent -- comment + * parsers.line + * #parsers.blankline) -- blank line + / "\n" + + parsers.percent -- comment + * parsers.line + * parsers.optionalspace) -- leading tabs and spaces + + #(parsers.newline) + * Cb("backslashes") + * C(parsers.newline)) + +parsers.chunk = parsers.line * (parsers.optionallyindentedline + - parsers.blankline)^0 + +parsers.attribute_key_char = parsers.alphanumeric + S("-_:.") +parsers.attribute_raw_char = parsers.alphanumeric + S("-_") +parsers.attribute_key = (parsers.attribute_key_char + - parsers.dash - parsers.digit) + * parsers.attribute_key_char^0 +parsers.attribute_value = ( (parsers.dquote / "") + * (parsers.anyescaped - parsers.dquote)^0 + * (parsers.dquote / "")) + + ( (parsers.squote / "") + * (parsers.anyescaped - parsers.squote)^0 + * (parsers.squote / "")) + + ( parsers.anyescaped - parsers.dquote - parsers.rbrace + - parsers.space)^0 +parsers.attribute_identifier = parsers.attribute_key_char^1 +parsers.attribute_classname = parsers.letter + * parsers.attribute_key_char^0 +parsers.attribute_raw = parsers.attribute_raw_char^1 + +parsers.attribute = (parsers.dash * Cc(".unnumbered")) + + C( parsers.hash + * parsers.attribute_identifier) + + C( parsers.period + * parsers.attribute_classname) + + Cs( parsers.attribute_key + * parsers.optionalspace * parsers.equal * parsers.optionalspace + * parsers.attribute_value) +parsers.attributes = parsers.lbrace + * parsers.optionalspace + * parsers.attribute + * (parsers.spacechar^1 + * parsers.attribute)^0 + * parsers.optionalspace + * parsers.rbrace + + +parsers.raw_attribute = parsers.lbrace + * parsers.optionalspace + * parsers.equal + * C(parsers.attribute_raw) + * parsers.optionalspace + * parsers.rbrace + +-- block followed by 0 or more optionally +-- indented blocks with first line indented. +parsers.indented_blocks = function(bl) + return Cs( bl + * (parsers.blankline^1 * parsers.indent * -parsers.blankline * bl)^0 + * (parsers.blankline^1 + parsers.eof) ) +end % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->block_html_comment} as a function that will -% transform the contents of a block \acro{HTML} comment, to the output -% format, where `contents` are the contents of the \acro{HTML} comment. +%#### Parsers Used for HTML Entities % % \end{markdown} % \begin{macrocode} - function self.block_html_comment(contents) - if not self.is_writing then return "" end - return {"\\markdownRendererBlockHtmlCommentBegin\n",contents, - "\n\\markdownRendererBlockHtmlCommentEnd "} - end +local function repeat_between(pattern, min, max) + return -pattern^(max + 1) * pattern^min +end + +parsers.hexentity = parsers.ampersand * parsers.hash * C(S("Xx")) + * C(repeat_between(parsers.hexdigit, 1, 6)) * parsers.semicolon +parsers.decentity = parsers.ampersand * parsers.hash + * C(repeat_between(parsers.digit, 1, 7)) * parsers.semicolon +parsers.tagentity = parsers.ampersand * C(parsers.alphanumeric^1) + * parsers.semicolon + +parsers.html_entities = parsers.hexentity / entities.hex_entity_with_x_char + + parsers.decentity / entities.dec_entity + + parsers.tagentity / entities.char_entity % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->inline_html_tag} as a function that will -% transform the contents of an opening, closing, or empty inline \acro{HTML} -% tag to the output format, where `contents` are the contents of the -% \acro{HTML} tag. +%#### Parsers Used for Markdown Lists % % \end{markdown} % \begin{macrocode} - function self.inline_html_tag(contents) - return {"\\markdownRendererInlineHtmlTag{",self.string(contents),"}"} +parsers.bullet = function(bullet_char, interrupting) + local allowed_end + if interrupting then + allowed_end = C(parsers.spacechar^1) * #parsers.linechar + else + allowed_end = C(parsers.spacechar^1) + #(parsers.newline + parsers.eof) end + return parsers.check_trail + * Ct(C(bullet_char) * Cc("")) + * allowed_end +end + +local function tickbox(interior) + return parsers.optionalspace * parsers.lbracket + * interior * parsers.rbracket * parsers.spacechar^1 +end + +parsers.ticked_box = tickbox(S("xX")) * Cc(1.0) +parsers.halfticked_box = tickbox(S("./")) * Cc(0.5) +parsers.unticked_box = tickbox(parsers.spacechar^1) * Cc(0.0) + % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->block_html_element} as a function that will -% transform the contents of a block \acro{HTML} element to the output format, -% where `s` are the contents of the \acro{HTML} element. +%#### Parsers Used for Markdown Code Spans % % \end{markdown} % \begin{macrocode} - function self.block_html_element(s) - if not self.is_writing then return "" end - local name = util.cache(options.cacheDir, s, nil, nil, ".verbatim") - return {"\\markdownRendererInputBlockHtmlElement{",name,"}"} - end +parsers.openticks = Cg(parsers.backtick^1, "ticks") + +local function captures_equal_length(_,i,a,b) + return #a == #b and i +end + +parsers.closeticks = Cmt(C(parsers.backtick^1) + * Cb("ticks"), captures_equal_length) + +parsers.intickschar = (parsers.any - S("\n\r`")) + + V("NoSoftLineBreakEndline") + + (parsers.backtick^1 - parsers.closeticks) + +local function process_inticks(s) + s = s:gsub("\n", " ") + s = s:gsub("^ (.*) $", "%1") + return s +end + +parsers.inticks = parsers.openticks + * C(parsers.space^0) + * parsers.closeticks + + parsers.openticks + * Cs(Cs(parsers.intickschar^0) / process_inticks) + * parsers.closeticks + % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->emphasis} as a function that will transform an -% emphasized span `s` of input text to the output format. +%#### Parsers Used for HTML % % \end{markdown} % \begin{macrocode} - function self.emphasis(s) - return {"\\markdownRendererEmphasis{",s,"}"} +-- case-insensitive match (we assume s is lowercase). must be single byte encoding +parsers.keyword_exact = function(s) + local parser = P(0) + for i=1,#s do + local c = s:sub(i,i) + local m = c .. upper(c) + parser = parser * S(m) end + return parser +end + +parsers.special_block_keyword = + parsers.keyword_exact("pre") + + parsers.keyword_exact("script") + + parsers.keyword_exact("style") + + parsers.keyword_exact("textarea") + +parsers.block_keyword = + parsers.keyword_exact("address") + + parsers.keyword_exact("article") + + parsers.keyword_exact("aside") + + parsers.keyword_exact("base") + + parsers.keyword_exact("basefont") + + parsers.keyword_exact("blockquote") + + parsers.keyword_exact("body") + + parsers.keyword_exact("caption") + + parsers.keyword_exact("center") + + parsers.keyword_exact("col") + + parsers.keyword_exact("colgroup") + + parsers.keyword_exact("dd") + + parsers.keyword_exact("details") + + parsers.keyword_exact("dialog") + + parsers.keyword_exact("dir") + + parsers.keyword_exact("div") + + parsers.keyword_exact("dl") + + parsers.keyword_exact("dt") + + parsers.keyword_exact("fieldset") + + parsers.keyword_exact("figcaption") + + parsers.keyword_exact("figure") + + parsers.keyword_exact("footer") + + parsers.keyword_exact("form") + + parsers.keyword_exact("frame") + + parsers.keyword_exact("frameset") + + parsers.keyword_exact("h1") + + parsers.keyword_exact("h2") + + parsers.keyword_exact("h3") + + parsers.keyword_exact("h4") + + parsers.keyword_exact("h5") + + parsers.keyword_exact("h6") + + parsers.keyword_exact("head") + + parsers.keyword_exact("header") + + parsers.keyword_exact("hr") + + parsers.keyword_exact("html") + + parsers.keyword_exact("iframe") + + parsers.keyword_exact("legend") + + parsers.keyword_exact("li") + + parsers.keyword_exact("link") + + parsers.keyword_exact("main") + + parsers.keyword_exact("menu") + + parsers.keyword_exact("menuitem") + + parsers.keyword_exact("nav") + + parsers.keyword_exact("noframes") + + parsers.keyword_exact("ol") + + parsers.keyword_exact("optgroup") + + parsers.keyword_exact("option") + + parsers.keyword_exact("p") + + parsers.keyword_exact("param") + + parsers.keyword_exact("section") + + parsers.keyword_exact("source") + + parsers.keyword_exact("summary") + + parsers.keyword_exact("table") + + parsers.keyword_exact("tbody") + + parsers.keyword_exact("td") + + parsers.keyword_exact("tfoot") + + parsers.keyword_exact("th") + + parsers.keyword_exact("thead") + + parsers.keyword_exact("title") + + parsers.keyword_exact("tr") + + parsers.keyword_exact("track") + + parsers.keyword_exact("ul") + +-- end conditions +parsers.html_blankline_end_condition = parsers.linechar^0 + * ( parsers.newline + * (parsers.check_minimal_blank_indent_and_any_trail + * #parsers.blankline + + parsers.check_minimal_indent_and_any_trail) + * parsers.linechar^1)^0 + * (parsers.newline^-1 / "") + +local function remove_trailing_blank_lines(s) + return s:gsub("[\n\r]+%s*$", "") +end + +parsers.html_until_end = function(end_marker) + return Cs(Cs((parsers.newline + * (parsers.check_minimal_blank_indent_and_any_trail + * #parsers.blankline + + parsers.check_minimal_indent_and_any_trail) + + parsers.linechar - end_marker)^0 + * parsers.linechar^0 * parsers.newline^-1) + / remove_trailing_blank_lines) +end + +-- attributes +parsers.html_attribute_spacing = parsers.optionalspace + * V("NoSoftLineBreakEndline") + * parsers.optionalspace + + parsers.spacechar^1 + +parsers.html_attribute_name = (parsers.letter + parsers.colon + parsers.underscore) + * (parsers.alphanumeric + parsers.colon + parsers.underscore + + parsers.period + parsers.dash)^0 + +parsers.html_attribute_value = parsers.squote + * (parsers.linechar - parsers.squote)^0 + * parsers.squote + + parsers.dquote + * (parsers.linechar - parsers.dquote)^0 + * parsers.dquote + + ( parsers.any - parsers.spacechar - parsers.newline + - parsers.dquote - parsers.squote - parsers.backtick + - parsers.equal - parsers.less - parsers.more)^1 + +parsers.html_inline_attribute_value = parsers.squote + * (V("NoSoftLineBreakEndline") + + parsers.any + - parsers.blankline^2 + - parsers.squote)^0 + * parsers.squote + + parsers.dquote + * (V("NoSoftLineBreakEndline") + + parsers.any + - parsers.blankline^2 + - parsers.dquote)^0 + * parsers.dquote + + (parsers.any - parsers.spacechar - parsers.newline + - parsers.dquote - parsers.squote - parsers.backtick + - parsers.equal - parsers.less - parsers.more)^1 + +parsers.html_attribute_value_specification = parsers.optionalspace + * parsers.equal + * parsers.optionalspace + * parsers.html_attribute_value + +parsers.html_spnl = parsers.optionalspace + * (V("NoSoftLineBreakEndline") * parsers.optionalspace)^-1 + +parsers.html_inline_attribute_value_specification = parsers.html_spnl + * parsers.equal + * parsers.html_spnl + * parsers.html_inline_attribute_value + +parsers.html_attribute = parsers.html_attribute_spacing + * parsers.html_attribute_name + * parsers.html_inline_attribute_value_specification^-1 + +parsers.html_non_newline_attribute = parsers.spacechar^1 + * parsers.html_attribute_name + * parsers.html_attribute_value_specification^-1 + +parsers.nested_breaking_blank = parsers.newline + * parsers.check_minimal_blank_indent + * parsers.blankline + +parsers.html_comment_start = P("") + +parsers.html_comment = Cs( parsers.html_comment_start + * parsers.html_until_end(parsers.html_comment_end)) + +parsers.html_inline_comment = (parsers.html_comment_start / "") + * -P(">") * -P("->") + * Cs((V("NoSoftLineBreakEndline") + parsers.any - P("--") + - parsers.nested_breaking_blank - parsers.html_comment_end)^0) + * (parsers.html_comment_end / "") + +parsers.html_cdatasection_start = P("") + +parsers.html_cdatasection = Cs( parsers.html_cdatasection_start + * parsers.html_until_end(parsers.html_cdatasection_end)) + +parsers.html_inline_cdatasection = parsers.html_cdatasection_start + * Cs(V("NoSoftLineBreakEndline") + parsers.any + - parsers.nested_breaking_blank - parsers.html_cdatasection_end)^0 + * parsers.html_cdatasection_end + +parsers.html_declaration_start = P("") + +parsers.html_declaration = Cs( parsers.html_declaration_start + * parsers.html_until_end(parsers.html_declaration_end)) + +parsers.html_inline_declaration = parsers.html_declaration_start + * Cs(V("NoSoftLineBreakEndline") + parsers.any + - parsers.nested_breaking_blank - parsers.html_declaration_end)^0 + * parsers.html_declaration_end + +parsers.html_instruction_start = P("") + +parsers.html_instruction = Cs( parsers.html_instruction_start + * parsers.html_until_end(parsers.html_instruction_end)) + +parsers.html_inline_instruction = parsers.html_instruction_start + * Cs(V("NoSoftLineBreakEndline") + parsers.any + - parsers.nested_breaking_blank - parsers.html_instruction_end)^0 + * parsers.html_instruction_end + +parsers.html_blankline = parsers.newline + * parsers.optionalspace + * parsers.newline + +parsers.html_tag_start = parsers.less + +parsers.html_tag_closing_start = parsers.less + * parsers.slash + +parsers.html_tag_end = parsers.html_spnl + * parsers.more + +parsers.html_empty_tag_end = parsers.html_spnl + * parsers.slash + * parsers.more + +-- opening tags +parsers.html_any_open_inline_tag = parsers.html_tag_start + * parsers.keyword + * parsers.html_attribute^0 + * parsers.html_tag_end + +parsers.html_any_open_tag = parsers.html_tag_start + * parsers.keyword + * parsers.html_non_newline_attribute^0 + * parsers.html_tag_end + +parsers.html_open_tag = parsers.html_tag_start + * parsers.block_keyword + * parsers.html_attribute^0 + * parsers.html_tag_end + +parsers.html_open_special_tag = parsers.html_tag_start + * parsers.special_block_keyword + * parsers.html_attribute^0 + * parsers.html_tag_end + +-- incomplete tags +parsers.incomplete_tag_following = parsers.spacechar + + parsers.more + + parsers.slash * parsers.more + + #(parsers.newline + parsers.eof) + +parsers.incomplete_special_tag_following = parsers.spacechar + + parsers.more + + #(parsers.newline + parsers.eof) + +parsers.html_incomplete_open_tag = parsers.html_tag_start + * parsers.block_keyword + * parsers.incomplete_tag_following + +parsers.html_incomplete_open_special_tag = parsers.html_tag_start + * parsers.special_block_keyword + * parsers.incomplete_special_tag_following + +parsers.html_incomplete_close_tag = parsers.html_tag_closing_start + * parsers.block_keyword + * parsers.incomplete_tag_following + +parsers.html_incomplete_close_special_tag = parsers.html_tag_closing_start + * parsers.special_block_keyword + * parsers.incomplete_tag_following + +-- closing tags +parsers.html_close_tag = parsers.html_tag_closing_start + * parsers.block_keyword + * parsers.html_tag_end + +parsers.html_any_close_tag = parsers.html_tag_closing_start + * parsers.keyword + * parsers.html_tag_end + +parsers.html_close_special_tag = parsers.html_tag_closing_start + * parsers.special_block_keyword + * parsers.html_tag_end + +-- empty tags +parsers.html_any_empty_inline_tag = parsers.html_tag_start + * parsers.keyword + * parsers.html_attribute^0 + * parsers.html_empty_tag_end + +parsers.html_any_empty_tag = parsers.html_tag_start + * parsers.keyword + * parsers.html_non_newline_attribute^0 + * parsers.optionalspace + * parsers.slash + * parsers.more + +parsers.html_empty_tag = parsers.html_tag_start + * parsers.block_keyword + * parsers.html_attribute^0 + * parsers.html_empty_tag_end + +parsers.html_empty_special_tag = parsers.html_tag_start + * parsers.special_block_keyword + * parsers.html_attribute^0 + * parsers.html_empty_tag_end + +parsers.html_incomplete_blocks = parsers.html_incomplete_open_tag + + parsers.html_incomplete_open_special_tag + + parsers.html_incomplete_close_tag + +-- parse special html blocks +parsers.html_blankline_ending_special_block_opening = (parsers.html_close_special_tag + + parsers.html_empty_special_tag) + * #(parsers.optionalspace + * (parsers.newline + parsers.eof)) + +parsers.html_blankline_ending_special_block = parsers.html_blankline_ending_special_block_opening + * parsers.html_blankline_end_condition + +parsers.html_special_block_opening = parsers.html_incomplete_open_special_tag + - parsers.html_empty_special_tag + +parsers.html_closing_special_block = parsers.html_special_block_opening + * parsers.html_until_end(parsers.html_close_special_tag) + +parsers.html_special_block = parsers.html_blankline_ending_special_block + + parsers.html_closing_special_block + +-- parse html blocks +parsers.html_block_opening = parsers.html_incomplete_open_tag + + parsers.html_incomplete_close_tag + +parsers.html_block = parsers.html_block_opening + * parsers.html_blankline_end_condition + +-- parse any html blocks +parsers.html_any_block_opening = (parsers.html_any_open_tag + + parsers.html_any_close_tag + + parsers.html_any_empty_tag) + * #(parsers.optionalspace * (parsers.newline + parsers.eof)) + +parsers.html_any_block = parsers.html_any_block_opening + * parsers.html_blankline_end_condition + +parsers.html_inline_comment_full = parsers.html_comment_start + * -P(">") * -P("->") + * Cs((V("NoSoftLineBreakEndline") + parsers.any - P("--") + - parsers.nested_breaking_blank - parsers.html_comment_end)^0) + * parsers.html_comment_end + +parsers.html_inline_tags = parsers.html_inline_comment_full + + parsers.html_any_empty_inline_tag + + parsers.html_inline_instruction + + parsers.html_inline_cdatasection + + parsers.html_inline_declaration + + parsers.html_any_open_inline_tag + + parsers.html_any_close_tag + % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->tickbox} as a function that will transform a -% number `f` to the output format. +%#### Parsers Used for Markdown Tags and Links % % \end{markdown} % \begin{macrocode} - function self.tickbox(f) - if f == 1.0 then - return "☒ " - elseif f == 0.0 then - return "☐ " - else - return "⌛ " - end - end +parsers.urlchar = parsers.anyescaped + - parsers.newline + - parsers.more + +parsers.auto_link_scheme_part = parsers.alphanumeric + + parsers.plus + + parsers.period + + parsers.dash + +parsers.auto_link_scheme = parsers.letter + * parsers.auto_link_scheme_part + * parsers.auto_link_scheme_part^-30 + +parsers.absolute_uri = parsers.auto_link_scheme * parsers.colon + * (parsers.any - parsers.spacing - parsers.less - parsers.more)^0 + +parsers.printable_characters = S(".!#$%&'*+/=?^_`{|}~-") + +parsers.email_address_local_part_char = parsers.alphanumeric + + parsers.printable_characters + +parsers.email_address_local_part = parsers.email_address_local_part_char^1 + +parsers.email_address_dns_label = parsers.alphanumeric + * (parsers.alphanumeric + parsers.dash)^-62 + * B(parsers.alphanumeric) + +parsers.email_address_domain = parsers.email_address_dns_label + * (parsers.period * parsers.email_address_dns_label)^0 + +parsers.email_address = parsers.email_address_local_part + * parsers.at + * parsers.email_address_domain + +parsers.auto_link_url = parsers.less + * C(parsers.absolute_uri) + * parsers.more + +parsers.auto_link_email = parsers.less + * C(parsers.email_address) + * parsers.more + +parsers.auto_link_relative_reference = parsers.less + * C(parsers.urlchar^1) + * parsers.more + +parsers.autolink = parsers.auto_link_url + + parsers.auto_link_email + +-- content in balanced brackets, parentheses, or quotes: +parsers.bracketed = P{ parsers.lbracket + * (( parsers.backslash / "" * parsers.rbracket + + parsers.any - (parsers.lbracket + + parsers.rbracket + + parsers.blankline^2) + ) + V(1))^0 + * parsers.rbracket } + +parsers.inparens = P{ parsers.lparent + * ((parsers.anyescaped - (parsers.lparent + + parsers.rparent + + parsers.blankline^2) + ) + V(1))^0 + * parsers.rparent } + +parsers.squoted = P{ parsers.squote * parsers.alphanumeric + * ((parsers.anyescaped - (parsers.squote + + parsers.blankline^2) + ) + V(1))^0 + * parsers.squote } + +parsers.dquoted = P{ parsers.dquote * parsers.alphanumeric + * ((parsers.anyescaped - (parsers.dquote + + parsers.blankline^2) + ) + V(1))^0 + * parsers.dquote } + +parsers.link_text = parsers.lbracket + * Cs((parsers.alphanumeric^1 + + parsers.bracketed + + parsers.inticks + + parsers.autolink + + V("InlineHtml") + + ( parsers.backslash * parsers.backslash) + + ( parsers.backslash * (parsers.lbracket + parsers.rbracket) + + V("NoSoftLineBreakSpace") + + V("NoSoftLineBreakEndline") + + (parsers.any + - (parsers.newline + parsers.lbracket + parsers.rbracket + parsers.blankline^2))))^0) + * parsers.rbracket + +parsers.link_label = parsers.lbracket + * -#(parsers.sp * parsers.rbracket) + * #((parsers.any - parsers.rbracket)^-999 * parsers.rbracket) + * Cs((parsers.alphanumeric^1 + + parsers.inticks + + parsers.autolink + + V("InlineHtml") + + ( parsers.backslash * parsers.backslash) + + ( parsers.backslash * (parsers.lbracket + parsers.rbracket) + + V("NoSoftLineBreakSpace") + + V("NoSoftLineBreakEndline") + + (parsers.any + - (parsers.newline + parsers.lbracket + parsers.rbracket + parsers.blankline^2))))^1) + * parsers.rbracket + +parsers.inparens_url = P{ parsers.lparent + * ((parsers.anyescaped - (parsers.lparent + + parsers.rparent + + parsers.spacing) + ) + V(1))^0 + * parsers.rparent } + +-- url for markdown links, allowing nested brackets: +parsers.url = parsers.less * Cs((parsers.anyescaped + - parsers.newline + - parsers.less + - parsers.more)^0) + * parsers.more + + -parsers.less + * Cs((parsers.inparens_url + (parsers.anyescaped + - parsers.spacing + - parsers.lparent + - parsers.rparent))^1) + +-- quoted text: +parsers.title_s = parsers.squote + * Cs((parsers.html_entities + + V("NoSoftLineBreakSpace") + + V("NoSoftLineBreakEndline") + + (parsers.anyescaped - parsers.newline - parsers.squote - parsers.blankline^2))^0) + * parsers.squote + +parsers.title_d = parsers.dquote + * Cs((parsers.html_entities + + V("NoSoftLineBreakSpace") + + V("NoSoftLineBreakEndline") + + (parsers.anyescaped - parsers.newline - parsers.dquote - parsers.blankline^2))^0) + * parsers.dquote + +parsers.title_p = parsers.lparent + * Cs((parsers.html_entities + + V("NoSoftLineBreakSpace") + + V("NoSoftLineBreakEndline") + + (parsers.anyescaped - parsers.newline - parsers.lparent - parsers.rparent + - parsers.blankline^2))^0) + * parsers.rparent + +parsers.title = parsers.title_d + parsers.title_s + parsers.title_p + +parsers.optionaltitle + = parsers.spnlc * parsers.title * parsers.spacechar^0 + + Cc("") + % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->strong} as a function that will transform a strongly -% emphasized span `s` of input text to the output format. +%#### Helpers for Links and Link Reference Definitions % % \end{markdown} % \begin{macrocode} - function self.strong(s) - return {"\\markdownRendererStrongEmphasis{",s,"}"} - end +-- parse a reference definition: [foo]: /bar "title" +parsers.define_reference_parser = (parsers.check_trail / "") * parsers.link_label * parsers.colon + * parsers.spnlc * parsers.url + * ( parsers.spnlc_sep * parsers.title * parsers.only_blank + + Cc("") * parsers.only_blank) % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->blockquote} as a function that will transform an -% input block quote `s` to the output format. +%#### Inline Elements % % \end{markdown} % \begin{macrocode} - function self.blockquote(s) - if #util.rope_to_string(s) == 0 then return "" end - return {"\\markdownRendererBlockQuoteBegin\n",s, - "\n\\markdownRendererBlockQuoteEnd "} - end +parsers.Inline = V("Inline") + +-- parse many p between starter and ender +parsers.between = function(p, starter, ender) + local ender2 = B(parsers.nonspacechar) * ender + return (starter * #parsers.nonspacechar * Ct(p * (p - ender2)^0) * ender2) +end + % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->verbatim} as a function that will transform an -% input code block `s` to the output format. +%#### Block Elements % % \end{markdown} % \begin{macrocode} - function self.verbatim(s) - if not self.is_writing then return "" end - s = s:gsub("\n$", "") - local name = util.cache_verbatim(options.cacheDir, s) - return {"\\markdownRendererInputVerbatim{",name,"}"} - end +parsers.lineof = function(c) + return (parsers.check_trail_no_rem * (P(c) * parsers.optionalspace)^3 + * (parsers.newline + parsers.eof)) +end + +parsers.thematic_break_lines = parsers.lineof(parsers.asterisk) + + parsers.lineof(parsers.dash) + + parsers.lineof(parsers.underscore) % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->document} as a function that will transform a -% document `d` to the output format. +%#### Headings % % \end{markdown} % \begin{macrocode} - function self.document(d) - local buf = {"\\markdownRendererDocumentBegin\n", d} +-- parse Atx heading start and return level +parsers.heading_start = #parsers.hash * C(parsers.hash^-6) + * -parsers.hash / length - -- pop all attributes - table.insert(buf, self.pop_attributes()) +-- parse setext header ending and return level +parsers.heading_level = parsers.nonindentspace * parsers.equal^1 * parsers.optionalspace * #parsers.newline * Cc(1) + + parsers.nonindentspace * parsers.dash^1 * parsers.optionalspace * #parsers.newline * Cc(2) - table.insert(buf, "\\markdownRendererDocumentEnd") +local function strip_atx_end(s) + return s:gsub("%s+#*%s*\n$","") +end - return buf - end +parsers.atx_heading = parsers.check_trail_no_rem + * Cg(parsers.heading_start, "level") + * (C( parsers.optionalspace + * parsers.hash^0 + * parsers.optionalspace + * parsers.newline) + + parsers.spacechar^1 + * C(parsers.line)) % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->attributes} as a function that will transform -% input attributes `attrs` to the output format. +%### Markdown Reader {#markdown-reader} +% +% This section documents the \luamref{reader} object, which implements the +% routines for parsing the markdown input. The object corresponds to the +% markdown reader object that was located in the +% `lunamark/reader/markdown.lua` file in the Lunamark Lua module. +% +% The \luamdef{reader.new} method creates and returns a new \TeX{} reader +% object associated with the Lua interface options (see Section +% <#sec:lua-options>) `options` and with a writer object `writer`. When +% `options` are unspecified, it is assumed that an empty table was passed to +% the method. +% +% The objects produced by the \luamref{reader.new} method expose instance methods +% and variables of their own. As a convention, I will refer to these +% \meta{member}s as `reader->`\meta{member}. % % \end{markdown} % \begin{macrocode} - function self.attributes(attributes) - local expanded_attributes = {} - local key_value_regex = "([^= ]+)%s*=%s*(.*)" - local key, value - for _, attribute in ipairs(attributes) do - if attribute:sub(1, 1) == "#" or attribute:sub(1, 1) == "." then - table.insert(expanded_attributes, attribute) - else - key, value = attribute:match(key_value_regex) - if key:lower() == "id" then - table.insert(expanded_attributes, "#" .. value) - elseif key:lower() == "class" then - local classes = {} - for class in value:gmatch("%S+") do - table.insert(classes, class) - end - table.sort(classes) - for _, class in ipairs(classes) do - table.insert(expanded_attributes, "." .. class) - end - else - table.insert(expanded_attributes, attribute) - end - end - end - table.sort(expanded_attributes) - - local buf = {} - local seen = {} - for _, attribute in ipairs(expanded_attributes) do - if seen[attribute] ~= nil then - goto continue -- prevent duplicate attributes - else - seen[attribute] = true - end - if attribute:sub(1, 1) == "#" then - table.insert(buf, {"\\markdownRendererAttributeIdentifier{", - attribute:sub(2), "}"}) - elseif attribute:sub(1, 1) == "." then - table.insert(buf, {"\\markdownRendererAttributeClassName{", - attribute:sub(2), "}"}) - else - key, value = attribute:match(key_value_regex) - table.insert(buf, {"\\markdownRendererAttributeKeyValue{", - key, "}{", value, "}"}) - end - ::continue:: - end - - return buf - end +M.reader = {} +function M.reader.new(writer, options) + local self = {} +% \end{macrocode} +% \par +% \begin{markdown} +% +% Make the `writer` and `options` parameters available as +% \luamdef{reader->writer} and \luamdef{reader->options}, respectively, so +% that they are accessible from extensions. +% +% \end{markdown} +% \begin{macrocode} + self.writer = writer + self.options = options % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->active\_attributes} as a stack of block-level -% attributes that are currently active. The -% \luamref{writer->active\_attributes} member variable is mutable. +% Create a \luamdef{reader->parsers} hash table that stores \acro{peg} patterns +% that depend on the received `options`. Make \luamref{reader->parsers} inherit +% from the global \luamref{parsers} table. % % \end{markdown} % \begin{macrocode} - self.active_attributes = {} + self.parsers = {} + (function(parsers) + setmetatable(self.parsers, { + __index = function (_, key) + return parsers[key] + end + }) + end)(parsers) % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{writer->push\_attributes} and -% \luamdef{writer->pop\_attributes} as functions that will add a new set -% of active block-level attributes or remove the most current attributes -% from \luamref{writer->active\_attributes}. +% Make \luamref{reader->parsers} available as a local `parsers` variable that +% will shadow the global \luamref{parsers} table and will make +% \luamref{reader->parsers} easier to type in the rest of the reader code. % % \end{markdown} % \begin{macrocode} - local function apply_attributes() - local buf = {} - for i = 1, #self.active_attributes do - local start_output = self.active_attributes[i][3] - if start_output ~= nil then - table.insert(buf, start_output) - end - end - return buf - end - - local function tear_down_attributes() - local buf = {} - for i = #self.active_attributes, 1, -1 do - local end_output = self.active_attributes[i][4] - if end_output ~= nil then - table.insert(buf, end_output) - end - end - return buf - end + local parsers = self.parsers % \end{macrocode} +% \par % \begin{markdown} % -% The \luamref{writer->push\_attributes} method adds `attributes` -% of type `attribute_type` to \luamref{writer->active\_attributes}. The -% `start_output` string is used to construct a rope that will be returned by -% this function, together with output produced as a result of slicing (see -% \Opt{slice}). The `end_output` string is stored together with `attributes` -% and is used to construct the return value of the -% \luamref{writer->pop\_attributes} -% method. +%#### Top-Level Helper Functions +% Define \luamdef{reader->normalize_tag} as a function that normalizes a +% markdown reference tag by lowercasing it, and by collapsing any adjacent +% whitespace characters. % % \end{markdown} % \begin{macrocode} - function self.push_attributes(attribute_type, attributes, - start_output, end_output) - -- index attributes in a hash table for easy lookup - attributes = attributes or {} - for i = 1, #attributes do - attributes[attributes[i]] = true - end - - local buf = {} - -- handle slicing - if attributes["#" .. self.slice_end_identifier] ~= nil and - self.slice_end_type == "^" then - if self.is_writing then - table.insert(buf, tear_down_attributes()) - end - self.is_writing = false - end - if attributes["#" .. self.slice_begin_identifier] ~= nil and - self.slice_begin_type == "^" then - self.is_writing = true - table.insert(buf, apply_attributes()) - self.is_writing = true - end - if self.is_writing and start_output ~= nil then - table.insert(buf, start_output) - end - table.insert(self.active_attributes, - {attribute_type, attributes, - start_output, end_output}) - return buf + function self.normalize_tag(tag) + tag = util.rope_to_string(tag) + tag = tag:gsub("[ \n\r\t]+", " ") + tag = tag:gsub("^ ", ""):gsub(" $", "") + tag = uni_algos.case.casefold(tag, true, false) + return tag end - % \end{macrocode} +% \par % \begin{markdown} % -% The \luamref{writer->pop\_attributes} method removes the most current of -% active block-level attributes from \luamref{writer->active\_attributes} -% until attributes of type `attribute_type` have been removed. The method -% returns a rope constructed from the `end_output` string specified -% in the calls of \luamref{writer->push\_attributes} that produced the most -% current attributes, and also from output produced as a result of slicing -% (see \Opt{slice}). +% Define \luamdef{iterlines} as a function that iterates over the lines of +% the input string `s`, transforms them using an input function `f`, and +% reassembles them into a new string, which it returns. % % \end{markdown} % \begin{macrocode} - function self.pop_attributes(attribute_type) - local buf = {} - -- pop attributes until we find attributes of correct type - -- or until no attributes remain - local current_attribute_type = false - while current_attribute_type ~= attribute_type and - #self.active_attributes > 0 do - local attributes, _, end_output - current_attribute_type, attributes, _, end_output = table.unpack( - self.active_attributes[#self.active_attributes]) - if self.is_writing and end_output ~= nil then - table.insert(buf, end_output) - end - table.remove(self.active_attributes, #self.active_attributes) - -- handle slicing - if attributes["#" .. self.slice_end_identifier] ~= nil - and self.slice_end_type == "$" then - if self.is_writing then - table.insert(buf, tear_down_attributes()) - end - self.is_writing = false - end - if attributes["#" .. self.slice_begin_identifier] ~= nil and - self.slice_begin_type == "$" then - self.is_writing = true - table.insert(buf, apply_attributes()) - end - end - return buf + local function iterlines(s, f) + local rope = lpeg.match(Ct((parsers.line / f)^1), s) + return util.rope_to_string(rope) end % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->heading} as a function that will transform an -% input heading `s` at level `level` with attributes `attributes` to the -% output format. +% Define \luamdef{expandtabs} either as an identity function, when the +% \Opt{preserveTabs} Lua interface option is enabled, or to a function that +% expands tabs into spaces otherwise. % % \end{markdown} % \begin{macrocode} - local current_heading_level = 0 - function self.heading(s, level, attributes) - local buf = {} - - -- push empty attributes for implied sections - while current_heading_level < level - 1 do - table.insert(buf, - self.push_attributes("heading", - nil, - "\\markdownRendererSectionBegin\n", - "\n\\markdownRendererSectionEnd ")) - current_heading_level = current_heading_level + 1 - end - - -- pop attributes for sections that have ended - while current_heading_level >= level do - table.insert(buf, self.pop_attributes("heading")) - current_heading_level = current_heading_level - 1 - end - - -- push attributes for the new section - local start_output = {} - local end_output = {} - table.insert(start_output, "\\markdownRendererSectionBegin\n") - if options.headerAttributes and attributes ~= nil and #attributes > 0 then - table.insert(start_output, - "\\markdownRendererHeaderAttributeContextBegin\n") - table.insert(start_output, self.attributes(attributes)) - table.insert(end_output, - "\n\\markdownRendererHeaderAttributeContextEnd ") - end - table.insert(end_output, "\n\\markdownRendererSectionEnd ") - - table.insert(buf, self.push_attributes("heading", - attributes, - start_output, - end_output)) - current_heading_level = current_heading_level + 1 - assert(current_heading_level == level) - - -- produce the renderer - local cmd - level = level + options.shiftHeadings - if level <= 1 then - cmd = "\\markdownRendererHeadingOne" - elseif level == 2 then - cmd = "\\markdownRendererHeadingTwo" - elseif level == 3 then - cmd = "\\markdownRendererHeadingThree" - elseif level == 4 then - cmd = "\\markdownRendererHeadingFour" - elseif level == 5 then - cmd = "\\markdownRendererHeadingFive" - elseif level >= 6 then - cmd = "\\markdownRendererHeadingSix" - else - cmd = "" - end - if self.is_writing then - table.insert(buf, {cmd, "{", s, "}"}) - end - - return buf + if options.preserveTabs then + self.expandtabs = function(s) return s end + else + self.expandtabs = function(s) + if s:find("\t") then + return iterlines(s, util.expand_tabs_in_line) + else + return s + end + end end % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->get_state} as a function that returns the current -% state of the writer, where the state of a writer are its mutable member -% variables. +%#### High-Level Parser Functions +% +% Create a \luamdef{reader->parser_functions} hash table that stores high-level +% parser functions. Define \luamdef{reader->create_parser} as a function that +% will create a high-level parser function \luamdef{reader->parser_functions.name}, +% that matches input using grammar `grammar`. If `toplevel` is true, the input +% is expected to come straight from the user, not from a recursive call, and +% will be preprocessed. % % \end{markdown} % \begin{macrocode} - function self.get_state() - return { - is_writing=self.is_writing, - active_attributes={table.unpack(self.active_attributes)}, - } - end + self.parser_functions = {} + self.create_parser = function(name, grammar, toplevel) + self.parser_functions[name] = function(str) % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->set_state} as a function that restores the input -% state `s` and returns the previous state of the writer. +% If the parser function is top-level and the \Opt{stripIndent} Lua option is +% enabled, we will first expand tabs in the input string `str` into spaces +% and then we will count the minimum indent across all lines, skipping +% blank lines. Next, we will remove the minimum indent from all lines. % % \end{markdown} % \begin{macrocode} - function self.set_state(s) - local previous_state = self.get_state() - for key, value in pairs(s) do - self[key] = value - end - return previous_state - end + if toplevel and options.stripIndent then + local min_prefix_length, min_prefix = nil, '' + str = iterlines(str, function(line) + if lpeg.match(parsers.nonemptyline, line) == nil then + return line + end + line = util.expand_tabs_in_line(line) + local prefix = lpeg.match(C(parsers.optionalspace), line) + local prefix_length = #prefix + local is_shorter = min_prefix_length == nil + is_shorter = is_shorter or prefix_length < min_prefix_length + if is_shorter then + min_prefix_length, min_prefix = prefix_length, prefix + end + return line + end) + str = str:gsub('^' .. min_prefix, '') + end % \end{macrocode} % \par % \begin{markdown} % -% Define \luamdef{writer->defer_call} as a function that will encapsulate the -% input function `f`, so that `f` is called with the state of the writer at the -% time of calling \luamref{writer->defer_call}. +% If the parser is top-level and the \Opt{texComments} or \Opt{hybrid} Lua +% options are enabled, we will strip all plain \TeX{} comments from the input +% string `str` together with the trailing newline characters. % % \end{markdown} % \begin{macrocode} - function self.defer_call(f) - local previous_state = self.get_state() - return function(...) - local state = self.set_state(previous_state) - local return_value = f(...) - self.set_state(state) - return return_value + if toplevel and (options.texComments or options.hybrid) then + str = lpeg.match(Ct(parsers.commented_line^1), str) + str = util.rope_to_string(str) + end + local res = lpeg.match(grammar(), str) + if res == nil then + error(format("%s failed on:\n%s", name, str:sub(1,20))) + else + return res + end end end - return self -end + self.create_parser("parse_blocks", + function() + return parsers.blocks + end, true) + + self.create_parser("parse_blocks_nested", + function() + return parsers.blocks_nested + end, false) + + self.create_parser("parse_inlines", + function() + return parsers.inlines + end, false) + + self.create_parser("parse_inlines_no_inline_note", + function() + return parsers.inlines_no_inline_note + end, false) + + self.create_parser("parse_inlines_no_html", + function() + return parsers.inlines_no_html + end, false) + + self.create_parser("parse_inlines_nbsp", + function() + return parsers.inlines_nbsp + end, false) + self.create_parser("parse_inlines_no_link_or_emphasis", + function() + return parsers.inlines_no_link_or_emphasis + end, false) % \end{macrocode} % \par % \begin{markdown} % -%### Parsers -% The \luamdef{parsers} hash table stores \acro{peg} patterns that are -% static and can be reused between different \luamref{reader} objects. -% -% \end{markdown} -% \begin{macrocode} -local parsers = {} -% \end{macrocode} -% \par -% \begin{markdown} +%#### Parsers Used for Indentation (local) % -%#### Basic Parsers +% The following patterns represent basic building blocks of indented content. % % \end{markdown} % \begin{macrocode} -parsers.percent = P("%") -parsers.at = P("@") -parsers.comma = P(",") -parsers.asterisk = P("*") -parsers.dash = P("-") -parsers.plus = P("+") -parsers.underscore = P("_") -parsers.period = P(".") -parsers.hash = P("#") -parsers.dollar = P("$") -parsers.ampersand = P("&") -parsers.backtick = P("`") -parsers.less = P("<") -parsers.more = P(">") -parsers.space = P(" ") -parsers.squote = P("'") -parsers.dquote = P('"') -parsers.lparent = P("(") -parsers.rparent = P(")") -parsers.lbracket = P("[") -parsers.rbracket = P("]") -parsers.lbrace = P("{") -parsers.rbrace = P("}") -parsers.circumflex = P("^") -parsers.slash = P("/") -parsers.equal = P("=") -parsers.colon = P(":") -parsers.semicolon = P(";") -parsers.exclamation = P("!") -parsers.pipe = P("|") -parsers.tilde = P("~") -parsers.backslash = P("\\") -parsers.tab = P("\t") -parsers.newline = P("\n") -parsers.tightblocksep = P("\001") + parsers.minimally_indented_blankline = parsers.check_minimal_indent * (parsers.blankline / "") -parsers.digit = R("09") -parsers.hexdigit = R("09","af","AF") -parsers.letter = R("AZ","az") -parsers.alphanumeric = R("AZ","az","09") -parsers.keyword = parsers.letter - * parsers.alphanumeric^0 -parsers.internal_punctuation = S(":;,.?") + parsers.minimally_indented_block = parsers.check_minimal_indent * V("Block") -parsers.doubleasterisks = P("**") -parsers.doubleunderscores = P("__") -parsers.doubletildes = P("~~") -parsers.fourspaces = P(" ") + parsers.minimally_indented_block_or_paragraph = parsers.check_minimal_indent * V("BlockOrParagraph") -parsers.any = P(1) -parsers.succeed = P(true) -parsers.fail = P(false) + parsers.minimally_indented_paragraph = parsers.check_minimal_indent * V("Paragraph") -parsers.escapable = S("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~") -parsers.anyescaped = parsers.backslash / "" * parsers.escapable - + parsers.any + parsers.minimally_indented_plain = parsers.check_minimal_indent * V("Plain") -parsers.spacechar = S("\t ") -parsers.spacing = S(" \n\r\t") -parsers.nonspacechar = parsers.any - parsers.spacing -parsers.optionalspace = parsers.spacechar^0 + parsers.minimally_indented_par_or_plain = parsers.minimally_indented_paragraph + + parsers.minimally_indented_plain -parsers.normalchar = parsers.any - (V("SpecialChar") - + parsers.spacing - + parsers.tightblocksep) -parsers.eof = -parsers.any -parsers.nonindentspace = parsers.space^-3 * - parsers.spacechar -parsers.indent = parsers.space^-3 * parsers.tab - + parsers.fourspaces / "" -parsers.linechar = P(1 - parsers.newline) + parsers.minimally_indented_par_or_plain_no_blank = parsers.minimally_indented_par_or_plain + - parsers.minimally_indented_blankline + + parsers.minimally_indented_ref = parsers.check_minimal_indent * V("Reference") + + parsers.minimally_indented_blank = parsers.check_minimal_indent * V("Blank") + + parsers.conditionally_indented_blankline = parsers.check_minimal_blank_indent * (parsers.blankline / "") + + parsers.minimally_indented_ref_or_block = parsers.minimally_indented_ref + + parsers.minimally_indented_block + - parsers.minimally_indented_blankline + + parsers.minimally_indented_ref_or_block_or_par = parsers.minimally_indented_ref + + parsers.minimally_indented_block_or_paragraph + - parsers.minimally_indented_blankline -parsers.blankline = parsers.optionalspace - * parsers.newline / "\n" -parsers.blanklines = parsers.blankline^0 -parsers.skipblanklines = (parsers.optionalspace * parsers.newline)^0 -parsers.indentedline = parsers.indent /"" - * C(parsers.linechar^1 * parsers.newline^-1) -parsers.optionallyindentedline = parsers.indent^-1 /"" - * C(parsers.linechar^1 * parsers.newline^-1) -parsers.sp = parsers.spacing^0 -parsers.spnl = parsers.optionalspace - * (parsers.newline * parsers.optionalspace)^-1 -parsers.line = parsers.linechar^0 * parsers.newline -parsers.nonemptyline = parsers.line - parsers.blankline % \end{macrocode} -% \begin{figure} -% \hspace*{-0.1\textwidth} -% \begin{minipage}{1.2\textwidth} -% \centering -% \begin{tikzpicture}[shorten >=1pt, line width=0.1mm, >={Stealth[length=2mm]}, node distance=4.5cm, on grid, auto] -% \node[state, initial by diamond, accepting] (noop) {initial}; -% \node[state] (odd_backslash) [above right=of noop] {odd backslash}; -% \node[state] (even_backslash) [below right=of odd_backslash] {even backslash}; -% \node[state] (comment) [below=of noop] {comment}; -% \node[state] (leading_spaces) [below=of even_backslash, align=center] {leading tabs\\and spaces}; -% \node[state] (blank_line) [below right=of comment] {blank line}; -% \path[->] -% (noop) edge [in=150, out=180, loop] node [align=center, yshift=-0.75cm] {match [$^\wedge$\textbackslash\%]\\capture \textbackslash$\!^{2k}$\meta{match}\\reset $k$} () -% edge [bend right=10] node [below right=-0.2cm] {match \textbackslash} (odd_backslash) -% edge [bend left=30] node [left, align=center] {match \%\\capture \textbackslash$\!^k$\\reset $k$} (comment) -% (comment) edge [in=305, out=325, loop] node [xshift=-1.2cm] {match [$^\wedge$$\drsh$]} () -% edge [bend left=10] node {match $\drsh$} (leading_spaces) -% (leading_spaces) edge [loop below] node {match [\textvisiblespace$\rightleftarrows$]} () -% edge [bend right=90] node [right] {match \textbackslash} (odd_backslash) -% edge [bend left=10] node {match \%} (comment) -% edge [bend right=10] node {$\epsilon$} (blank_line) -% edge [bend left=10] node [align=center, right=0.3cm] {match [$^\wedge$\textvisiblespace$\rightleftarrows$$\drsh$\textbackslash\%]\\capture \meta{match}} (noop) -% (blank_line) edge [loop below] node {match [\textvisiblespace$\rightleftarrows$]} () -% edge [bend left=90] node [align=center, below=1.2cm] {match $\drsh$\\ capture $\drsh\drsh$} (noop) -% (odd_backslash) edge [bend right=10] node [align=center, xshift=-0.3cm, yshift=0.2cm] {match \textbackslash\\increment $k$} (even_backslash) -% edge [bend right=10] node [align=center, above left=-0.3cm, xshift=0.1cm] {match [$^\wedge$\textbackslash]\\for \%, capture \textbackslash$\!^k$\%\\for [$^\wedge$\%], capture \textbackslash$\!^{2k+1}$\meta{match}\\reset $k$} (noop) -% (even_backslash) edge [bend left=10] node {$\epsilon$} (noop); -% \end{tikzpicture} -% \caption{A pushdown automaton that recognizes \TeX{} comments} -% \label{fig:commented_line} -% \end{minipage} -% \end{figure} % \begin{markdown} % -% The \luamdef{parsers.commented_line}`^1` parser recognizes the regular -% language of \TeX{} comments, see an equivalent finite automaton in Figure -% <#fig:commented_line>. +% The following pattern parses the properly indented content that follows the initial container start. % % \end{markdown} % \begin{macrocode} -parsers.commented_line_letter = parsers.linechar - + parsers.newline - - parsers.backslash - - parsers.percent -parsers.commented_line = Cg(Cc(""), "backslashes") - * ((#(parsers.commented_line_letter - - parsers.newline) - * Cb("backslashes") - * Cs(parsers.commented_line_letter - - parsers.newline)^1 -- initial - * Cg(Cc(""), "backslashes")) - + #(parsers.backslash * parsers.backslash) - * Cg((parsers.backslash -- even backslash - * parsers.backslash)^1, "backslashes") - + (parsers.backslash - * (#parsers.percent - * Cb("backslashes") - / function(backslashes) - return string.rep("\\", #backslashes / 2) - end - * C(parsers.percent) - + #parsers.commented_line_letter - * Cb("backslashes") - * Cc("\\") - * C(parsers.commented_line_letter)) - * Cg(Cc(""), "backslashes")))^0 - * (#parsers.percent - * Cb("backslashes") - / function(backslashes) - return string.rep("\\", #backslashes / 2) - end - * ((parsers.percent -- comment - * parsers.line - * #parsers.blankline) -- blank line - / "\n" - + parsers.percent -- comment - * parsers.line - * parsers.optionalspace) -- leading tabs and spaces - + #(parsers.newline) - * Cb("backslashes") - * C(parsers.newline)) -parsers.chunk = parsers.line * (parsers.optionallyindentedline - - parsers.blankline)^0 + parsers.separator_loop = function(separated_block, paragraph, block_separator, paragraph_separator) + return separated_block + + block_separator + * paragraph + * separated_block + + paragraph_separator + * paragraph + end -parsers.attribute_key_char = parsers.alphanumeric + S("-_:.") -parsers.attribute_key = (parsers.attribute_key_char - - parsers.dash - parsers.digit) - * parsers.attribute_key_char^0 -parsers.attribute_value = ( (parsers.dquote / "") - * (parsers.anyescaped - parsers.dquote)^0 - * (parsers.dquote / "")) - + ( (parsers.squote / "") - * (parsers.anyescaped - parsers.squote)^0 - * (parsers.squote / "")) - + ( parsers.anyescaped - parsers.dquote - parsers.rbrace - - parsers.space)^0 + parsers.create_loop_body_pair = function(separated_block, paragraph, block_separator, paragraph_separator) + return { + block = parsers.separator_loop(separated_block, paragraph, block_separator, block_separator), + par = parsers.separator_loop(separated_block, paragraph, block_separator, paragraph_separator) + } + end -parsers.attribute = (parsers.dash * Cc(".unnumbered")) - + C((parsers.hash + parsers.period) - * parsers.attribute_key) - + Cs( parsers.attribute_key - * parsers.optionalspace * parsers.equal * parsers.optionalspace - * parsers.attribute_value) -parsers.attributes = parsers.lbrace - * parsers.optionalspace - * parsers.attribute - * (parsers.spacechar^1 - * parsers.attribute)^0 - * parsers.optionalspace - * parsers.rbrace + parsers.block_sep_group = function(blank) + return blank^0 * parsers.eof + + ( blank^2 / writer.paragraphsep + + blank^0 / writer.interblocksep + ) + end + + parsers.par_sep_group = function(blank) + return blank^0 * parsers.eof + + blank^0 / writer.paragraphsep + end + + parsers.sep_group_no_output = function(blank) + return blank^0 * parsers.eof + + blank^0 + end + parsers.content_blank = parsers.minimally_indented_blankline + + parsers.ref_or_block_separated = parsers.sep_group_no_output(parsers.content_blank) + * ( parsers.minimally_indented_ref + - parsers.content_blank) + + parsers.block_sep_group(parsers.content_blank) + * ( parsers.minimally_indented_block + - parsers.content_blank) + + parsers.loop_body_pair = + parsers.create_loop_body_pair(parsers.ref_or_block_separated, + parsers.minimally_indented_par_or_plain_no_blank, + parsers.block_sep_group(parsers.content_blank), + parsers.par_sep_group(parsers.content_blank)) + + parsers.content_loop = ( V("Block") + * parsers.loop_body_pair.block^0 + + (V("Paragraph") + V("Plain")) + * parsers.ref_or_block_separated + * parsers.loop_body_pair.block^0 + + (V("Paragraph") + V("Plain")) + * parsers.loop_body_pair.par^0) + * parsers.content_blank^0 + + parsers.indented_content = function() + return Ct( (V("Reference") + (parsers.blankline / "")) + * parsers.content_blank^0 + * parsers.check_minimal_indent + * parsers.content_loop + + (V("Reference") + (parsers.blankline / "")) + * parsers.content_blank^0 + + parsers.content_loop) + end -parsers.raw_attribute = parsers.lbrace - * parsers.optionalspace - * parsers.equal - * C(parsers.attribute_key) - * parsers.optionalspace - * parsers.rbrace + parsers.add_indent = function(pattern, name, breakable) + return Cg(Cmt( Cb("indent_info") + * Ct(pattern) + * (#parsers.linechar * Cc(false) + Cc(true)) -- check if starter is blank + * Cc(name) + * Cc(breakable), + process_starter_indent), "indent_info") + end --- block followed by 0 or more optionally --- indented blocks with first line indented. -parsers.indented_blocks = function(bl) - return Cs( bl - * (parsers.blankline^1 * parsers.indent * -parsers.blankline * bl)^0 - * (parsers.blankline^1 + parsers.eof) ) -end % \end{macrocode} % \par % \begin{markdown} % -%#### Parsers Used for Markdown Lists +%#### Parsers Used for Markdown Lists (local) % % \end{markdown} % \begin{macrocode} -parsers.bulletchar = C(parsers.plus + parsers.asterisk + parsers.dash) + if options.hashEnumerators then + parsers.dig = parsers.digit + parsers.hash + else + parsers.dig = parsers.digit + end -parsers.bullet = ( parsers.bulletchar * #parsers.spacing - * (parsers.tab + parsers.space^-3) - + parsers.space * parsers.bulletchar * #parsers.spacing - * (parsers.tab + parsers.space^-2) - + parsers.space * parsers.space * parsers.bulletchar - * #parsers.spacing - * (parsers.tab + parsers.space^-1) - + parsers.space * parsers.space * parsers.space - * parsers.bulletchar * #parsers.spacing - ) + parsers.enumerator = function(delimiter_type, interrupting) + local delimiter_range + local allowed_end + if interrupting then + delimiter_range = P("1") + allowed_end = C(parsers.spacechar^1) * #parsers.linechar + else + delimiter_range = parsers.dig * parsers.dig^-8 + allowed_end = C(parsers.spacechar^1) + #(parsers.newline + parsers.eof) + end -local function tickbox(interior) - return parsers.optionalspace * parsers.lbracket - * interior * parsers.rbracket * parsers.spacechar^1 -end + return parsers.check_trail + * Ct(C(delimiter_range) * C(delimiter_type)) + * allowed_end + end -parsers.ticked_box = tickbox(S("xX")) * Cc(1.0) -parsers.halfticked_box = tickbox(S("./")) * Cc(0.5) -parsers.unticked_box = tickbox(parsers.spacechar^1) * Cc(0.0) + parsers.starter = parsers.bullet(parsers.dash) + + parsers.bullet(parsers.asterisk) + + parsers.bullet(parsers.plus) + + parsers.enumerator(parsers.period) + + parsers.enumerator(parsers.rparent) % \end{macrocode} % \par % \begin{markdown} % -%#### Parsers Used for Markdown Code Spans +%#### Parsers Used for Blockquotes (local) % % \end{markdown} % \begin{macrocode} -parsers.openticks = Cg(parsers.backtick^1, "ticks") - -local function captures_equal_length(_,i,a,b) - return #a == #b and i -end + parsers.blockquote_start = parsers.check_trail * C(parsers.more) * C(parsers.spacechar^0) -parsers.closeticks = parsers.space^-1 - * Cmt(C(parsers.backtick^1) - * Cb("ticks"), captures_equal_length) - -parsers.intickschar = (parsers.any - S(" \n\r`")) - + (parsers.newline * -parsers.blankline) - + (parsers.space - parsers.closeticks) - + (parsers.backtick^1 - parsers.closeticks) + parsers.blockquote_body = parsers.add_indent(parsers.blockquote_start, "bq", true) + * parsers.indented_content() + * remove_indent("bq") -parsers.inticks = parsers.openticks * parsers.space^-1 - * C(parsers.intickschar^0) * parsers.closeticks + if not options.breakableBlockquotes then + parsers.blockquote_body = parsers.add_indent(parsers.blockquote_start, "bq", false) + * parsers.indented_content() + * remove_indent("bq") + end % \end{macrocode} % \par % \begin{markdown} % -%#### Parsers Used for Markdown Tags and Links +%#### Helpers for Emphasis and Strong Emphasis (local) +% +% Parse the content of a table `content_part` with links, images and emphasis disabled. % % \end{markdown} % \begin{macrocode} -parsers.leader = parsers.space^-3 - --- content in balanced brackets, parentheses, or quotes: -parsers.bracketed = P{ parsers.lbracket - * (( parsers.backslash / "" * parsers.rbracket - + parsers.any - (parsers.lbracket - + parsers.rbracket - + parsers.blankline^2) - ) + V(1))^0 - * parsers.rbracket } - -parsers.inparens = P{ parsers.lparent - * ((parsers.anyescaped - (parsers.lparent - + parsers.rparent - + parsers.blankline^2) - ) + V(1))^0 - * parsers.rparent } - -parsers.squoted = P{ parsers.squote * parsers.alphanumeric - * ((parsers.anyescaped - (parsers.squote - + parsers.blankline^2) - ) + V(1))^0 - * parsers.squote } - -parsers.dquoted = P{ parsers.dquote * parsers.alphanumeric - * ((parsers.anyescaped - (parsers.dquote - + parsers.blankline^2) - ) + V(1))^0 - * parsers.dquote } - --- bracketed tag for markdown links, allowing nested brackets: -parsers.tag = parsers.lbracket - * Cs((parsers.alphanumeric^1 - + parsers.bracketed - + parsers.inticks - + ( parsers.backslash / "" * parsers.rbracket - + parsers.any - - (parsers.rbracket + parsers.blankline^2)))^0) - * parsers.rbracket - --- url for markdown links, allowing nested brackets: -parsers.url = parsers.less * Cs((parsers.anyescaped - - parsers.more)^0) - * parsers.more - + Cs((parsers.inparens + (parsers.anyescaped - - parsers.spacing - - parsers.rparent))^1) + local function parse_content_part(content_part) + local rope = util.rope_to_string(content_part) + local parsed = self.parser_functions.parse_inlines_no_link_or_emphasis(rope) + parsed.indent_info = nil + return parsed + end --- quoted text, possibly with nested quotes: -parsers.title_s = parsers.squote * Cs(((parsers.anyescaped-parsers.squote) - + parsers.squoted)^0) - * parsers.squote +% \end{macrocode} +% \begin{markdown} +% +% Collect the content between the `opening_index` and `closing_index` in the delimiter table `t`. +% +% \end{markdown} +% \begin{macrocode} + local function collect_emphasis_content(t, opening_index, closing_index) + local content = {} -parsers.title_d = parsers.dquote * Cs(((parsers.anyescaped-parsers.dquote) - + parsers.dquoted)^0) - * parsers.dquote + local content_part = {} + for i = opening_index, closing_index do + local value = t[i] -parsers.title_p = parsers.lparent - * Cs((parsers.inparens + (parsers.anyescaped-parsers.rparent))^0) - * parsers.rparent + if value.rendered ~= nil then + content[#content + 1] = parse_content_part(content_part) + content_part = {} + content[#content + 1] = value.rendered + value.rendered = nil + else + if value.type == "delimiter" and value.element == "emphasis" then + if value.is_active then + content_part[#content_part + 1] = string.rep(value.character, value.current_count) + end + else + content_part[#content_part + 1] = value.content + end + value.content = '' + value.is_active = false + end + end -parsers.title = parsers.title_d + parsers.title_s + parsers.title_p + if next(content_part) ~= nil then + content[#content + 1] = parse_content_part(content_part) + end -parsers.optionaltitle - = parsers.spnl * parsers.title * parsers.spacechar^0 - + Cc("") + return content + end -parsers.indirect_link - = parsers.tag - * ( C(parsers.spnl) * parsers.tag - + Cc(nil) * Cc(nil) -- always produce exactly two captures - ) +% \end{macrocode} +% \begin{markdown} +% +% Render content between the `opening_index` and `closing_index` in the delimiter table `t` +% as emphasis. +% +% \end{markdown} +% \begin{macrocode} + local function fill_emph(t, opening_index, closing_index) + local content = collect_emphasis_content(t, opening_index + 1, closing_index - 1) + t[opening_index + 1].is_active = true + t[opening_index + 1].rendered = writer.emphasis(content) + end -parsers.indirect_image - = parsers.exclamation * parsers.indirect_link % \end{macrocode} -% \par % \begin{markdown} % -%#### Parsers Used for HTML +% Render content between the `opening_index` and `closing_index` in the delimiter table `t` +% as strong emphasis. % % \end{markdown} % \begin{macrocode} --- case-insensitive match (we assume s is lowercase). must be single byte encoding -parsers.keyword_exact = function(s) - local parser = P(0) - for i=1,#s do - local c = s:sub(i,i) - local m = c .. upper(c) - parser = parser * S(m) + local function fill_strong(t, opening_index, closing_index) + local content = collect_emphasis_content(t, opening_index + 1, closing_index - 1) + t[opening_index + 1].is_active = true + t[opening_index + 1].rendered = writer.strong(content) end - return parser -end -parsers.block_keyword = - parsers.keyword_exact("address") + parsers.keyword_exact("blockquote") + - parsers.keyword_exact("center") + parsers.keyword_exact("del") + - parsers.keyword_exact("dir") + parsers.keyword_exact("div") + - parsers.keyword_exact("p") + parsers.keyword_exact("pre") + - parsers.keyword_exact("li") + parsers.keyword_exact("ol") + - parsers.keyword_exact("ul") + parsers.keyword_exact("dl") + - parsers.keyword_exact("dd") + parsers.keyword_exact("form") + - parsers.keyword_exact("fieldset") + parsers.keyword_exact("isindex") + - parsers.keyword_exact("ins") + parsers.keyword_exact("menu") + - parsers.keyword_exact("noframes") + parsers.keyword_exact("frameset") + - parsers.keyword_exact("h1") + parsers.keyword_exact("h2") + - parsers.keyword_exact("h3") + parsers.keyword_exact("h4") + - parsers.keyword_exact("h5") + parsers.keyword_exact("h6") + - parsers.keyword_exact("hr") + parsers.keyword_exact("script") + - parsers.keyword_exact("noscript") + parsers.keyword_exact("table") + - parsers.keyword_exact("tbody") + parsers.keyword_exact("tfoot") + - parsers.keyword_exact("thead") + parsers.keyword_exact("th") + - parsers.keyword_exact("td") + parsers.keyword_exact("tr") - --- There is no reason to support bad html, so we expect quoted attributes -parsers.htmlattributevalue - = parsers.squote * (parsers.any - (parsers.blankline - + parsers.squote))^0 - * parsers.squote - + parsers.dquote * (parsers.any - (parsers.blankline - + parsers.dquote))^0 - * parsers.dquote - -parsers.htmlattribute = parsers.spacing^1 - * (parsers.alphanumeric + S("_-"))^1 - * parsers.sp * parsers.equal * parsers.sp - * parsers.htmlattributevalue - -parsers.htmlcomment = P(""))^0) - * parsers.optionalspace - * P("-->") +% \end{macrocode} +% \begin{markdown} +% +% Check whether the opening delimiter `opening_delimiter` and closing delimiter `closing_delimiter` break +% rule three together. +% +% \end{markdown} +% \begin{macrocode} + local function breaks_three_rule(opening_delimiter, closing_delimiter) + return (opening_delimiter.is_closing or closing_delimiter.is_opening) and + ((opening_delimiter.original_count + closing_delimiter.original_count) % 3 == 0) and + (opening_delimiter.original_count % 3 ~= 0 or closing_delimiter.original_count % 3 ~= 0) + end -parsers.htmlinstruction = P(""))^0 * P("?>") +% \end{macrocode} +% \begin{markdown} +% +% Look for the first potential emphasis opener in the delimiter table `t` in the range from +% `bottom_index` to `latest_index` that has the same character `character` as the closing +% delimiter `closing_delimiter`. +% +% \end{markdown} +% \begin{macrocode} + local function find_emphasis_opener(t, bottom_index, latest_index, character, closing_delimiter) + for i = latest_index, bottom_index, -1 do + local value = t[i] + if value.is_active and + value.is_opening and + value.type == "delimiter" and + value.element == "emphasis" and + (value.character == character) and + (value.current_count > 0) then + if not breaks_three_rule(value, closing_delimiter) then + return i + end + end + end + end -parsers.openelt_any = parsers.less * parsers.keyword * parsers.htmlattribute^0 - * parsers.sp * parsers.more +% \end{macrocode} +% \begin{markdown} +% +% Iterate over the delimiters in the delimiter table `t`, producing emphasis or strong emphasis macros. +% +% \end{markdown} +% \begin{macrocode} + local function process_emphasis(t, opening_index, closing_index) + for i = opening_index, closing_index do + local value = t[i] + if value.type == "delimiter" and value.element == "emphasis" then + local delimiter_length = string.len(value.content) + value.character = string.sub(value.content, 1, 1) + value.current_count = delimiter_length + value.original_count = delimiter_length + end + end -parsers.openelt_exact = function(s) - return parsers.less * parsers.sp * parsers.keyword_exact(s) - * parsers.htmlattribute^0 * parsers.sp * parsers.more -end + local openers_bottom = { + ['*'] = { + [true] = {opening_index, opening_index, opening_index}, + [false] = {opening_index, opening_index, opening_index} + }, + ['_'] = { + [true] = {opening_index, opening_index, opening_index}, + [false] = {opening_index, opening_index, opening_index} + } + } -parsers.openelt_block = parsers.sp * parsers.block_keyword - * parsers.htmlattribute^0 * parsers.sp * parsers.more + local current_position = opening_index + local max_position = closing_index + + while current_position <= max_position do + local value = t[current_position] + + if value.type ~= "delimiter" or + value.element ~= "emphasis" or + not value.is_active or + not value.is_closing or + (value.current_count <= 0) then + current_position = current_position + 1 + goto continue + end -parsers.closeelt_any = parsers.less * parsers.sp * parsers.slash - * parsers.keyword * parsers.sp * parsers.more + local character = value.character + local is_opening = value.is_opening + local closing_length_modulo_three = value.original_count % 3 -parsers.closeelt_exact = function(s) - return parsers.less * parsers.sp * parsers.slash * parsers.keyword_exact(s) - * parsers.sp * parsers.more -end + local current_openers_bottom = openers_bottom[character][is_opening][closing_length_modulo_three + 1] -parsers.emptyelt_any = parsers.less * parsers.sp * parsers.keyword - * parsers.htmlattribute^0 * parsers.sp * parsers.slash - * parsers.more + local opener_position = find_emphasis_opener(t, current_openers_bottom, current_position - 1, character, value) -parsers.emptyelt_block = parsers.less * parsers.sp * parsers.block_keyword - * parsers.htmlattribute^0 * parsers.sp * parsers.slash - * parsers.more + if (opener_position == nil) then + openers_bottom[character][is_opening][closing_length_modulo_three + 1] = current_position + current_position = current_position + 1 + goto continue + end -parsers.displaytext = (parsers.any - parsers.less)^1 + local opening_delimiter = t[opener_position] --- return content between two matched HTML tags -parsers.in_matched = function(s) - return { parsers.openelt_exact(s) - * (V(1) + parsers.displaytext - + (parsers.less - parsers.closeelt_exact(s)))^0 - * parsers.closeelt_exact(s) } -end + local current_opening_count = opening_delimiter.current_count + local current_closing_count = t[current_position].current_count -local function parse_matched_tags(s,pos) - local t = string.lower(lpeg.match(C(parsers.keyword),s,pos)) - return lpeg.match(parsers.in_matched(t),s,pos-1) -end + if (current_opening_count >= 2) and (current_closing_count >= 2) then + opening_delimiter.current_count = current_opening_count - 2 + t[current_position].current_count = current_closing_count - 2 + fill_strong(t, opener_position, current_position) + else + opening_delimiter.current_count = current_opening_count - 1 + t[current_position].current_count = current_closing_count - 1 + fill_emph(t, opener_position, current_position) + end + + ::continue:: + end + end -parsers.in_matched_block_tags = parsers.less - * Cmt(#parsers.openelt_block, parse_matched_tags) + local cont = lpeg.R("\128\191") -- continuation byte % \end{macrocode} -% \par % \begin{markdown} % -%#### Parsers Used for HTML Entities +% Match a UTF-8 character of byte length `n`. % % \end{markdown} % \begin{macrocode} -parsers.hexentity = parsers.ampersand * parsers.hash * S("Xx") - * C(parsers.hexdigit^1) * parsers.semicolon -parsers.decentity = parsers.ampersand * parsers.hash - * C(parsers.digit^1) * parsers.semicolon -parsers.tagentity = parsers.ampersand * C(parsers.alphanumeric^1) - * parsers.semicolon + local function utf8_by_byte_count(n) + if (n == 1) then + return lpeg.R("\0\127") + end + if (n == 2) then + return lpeg.R("\194\223") * cont + end + if (n == 3) then + return lpeg.R("\224\239") * cont * cont + end + if (n == 4) then + return lpeg.R("\240\244") * cont * cont * cont + end + end + % \end{macrocode} -% \par % \begin{markdown} % -%#### Helpers for Link Reference Definitions +% Check if a there is a character of a type `chartype` between the start position `start_pos` +% and end position `end_pos` in a string `s` relative to current index `i`. % % \end{markdown} % \begin{macrocode} --- parse a reference definition: [foo]: /bar "title" -parsers.define_reference_parser = parsers.leader * parsers.tag * parsers.colon - * parsers.spacechar^0 * parsers.url - * parsers.optionaltitle + local function check_unicode_type(s, i, start_pos, end_pos, chartype) + local c + local char_length + for pos = start_pos, end_pos, 1 do + if (start_pos < 0) then + char_length = -pos + else + char_length = pos + 1 + end + c = lpeg.match({ C(utf8_by_byte_count(char_length)) },s,i+pos) + if (c ~= nil) and (unicode.utf8.match(c, chartype)) then + return i + end + end + end + + local function check_preceding_unicode_punctuation(s, i) + return check_unicode_type(s, i, -4, -1, "%p") + end + + local function check_preceding_unicode_whitespace(s, i) + return check_unicode_type(s, i, -4, -1, "%s") + end + + local function check_following_unicode_punctuation(s, i) + return check_unicode_type(s, i, 0, 3, "%p") + end + + local function check_following_unicode_whitespace(s, i) + return check_unicode_type(s, i, 0, 3, "%s") + end + + parsers.unicode_preceding_punctuation = B(parsers.escapable) + + Cmt(parsers.succeed, check_preceding_unicode_punctuation) + + parsers.unicode_preceding_whitespace = Cmt(parsers.succeed, check_preceding_unicode_whitespace) + + parsers.unicode_following_punctuation = #parsers.escapable + + Cmt(parsers.succeed, check_following_unicode_punctuation) + + parsers.unicode_following_whitespace = Cmt(parsers.succeed, check_following_unicode_whitespace) + + parsers.delimiter_run = function(character) + return (B(parsers.backslash * character) + -B(character)) + * character^1 + * -#character + end + + parsers.left_flanking_delimiter_run = function(character) + return (B( parsers.any) + * (parsers.unicode_preceding_punctuation + parsers.unicode_preceding_whitespace) + + -B(parsers.any)) + * parsers.delimiter_run(character) + * parsers.unicode_following_punctuation + + parsers.delimiter_run(character) + * -#(parsers.unicode_following_punctuation + parsers.unicode_following_whitespace + + parsers.eof) + end + + parsers.right_flanking_delimiter_run = function(character) + return parsers.unicode_preceding_punctuation + * parsers.delimiter_run(character) + * (parsers.unicode_following_punctuation + parsers.unicode_following_whitespace + + parsers.eof) + + (B(parsers.any) + * -(parsers.unicode_preceding_punctuation + parsers.unicode_preceding_whitespace)) + * parsers.delimiter_run(character) + end + + if options.underscores then + parsers.emph_start = parsers.left_flanking_delimiter_run(parsers.asterisk) + + (-#parsers.right_flanking_delimiter_run(parsers.underscore) + + (parsers.unicode_preceding_punctuation + * #parsers.right_flanking_delimiter_run(parsers.underscore))) + * parsers.left_flanking_delimiter_run(parsers.underscore) + + parsers.emph_end = parsers.right_flanking_delimiter_run(parsers.asterisk) + + (-#parsers.left_flanking_delimiter_run(parsers.underscore) + + #(parsers.left_flanking_delimiter_run(parsers.underscore) + * parsers.unicode_following_punctuation)) + * parsers.right_flanking_delimiter_run(parsers.underscore) + else + parsers.emph_start = parsers.left_flanking_delimiter_run(parsers.asterisk) + + parsers.emph_end = parsers.right_flanking_delimiter_run(parsers.asterisk) + end + + parsers.emph_capturing_open_and_close = #parsers.emph_start * #parsers.emph_end + * Ct( Cg(Cc("delimiter"), "type") + * Cg(Cc("emphasis"), "element") + * Cg(C(parsers.emph_start), "content") + * Cg(Cc(true), "is_opening") + * Cg(Cc(true), "is_closing")) + + parsers.emph_capturing_open = Ct( Cg(Cc("delimiter"), "type") + * Cg(Cc("emphasis"), "element") + * Cg(C(parsers.emph_start), "content") + * Cg(Cc(true), "is_opening") + * Cg(Cc(false), "is_closing")) + + parsers.emph_capturing_close = Ct( Cg(Cc("delimiter"), "type") + * Cg(Cc("emphasis"), "element") + * Cg(C(parsers.emph_end), "content") + * Cg(Cc(false), "is_opening") + * Cg(Cc(true), "is_closing")) + + parsers.emph_open_or_close = parsers.emph_capturing_open_and_close + + parsers.emph_capturing_open + + parsers.emph_capturing_close + + parsers.emph_open = parsers.emph_capturing_open_and_close + + parsers.emph_capturing_open + + parsers.emph_close = parsers.emph_capturing_open_and_close + + parsers.emph_capturing_close + % \end{macrocode} % \par % \begin{markdown} % -%#### Inline Elements +%#### Helpers for Links and Link Reference Definitions (local) % % \end{markdown} % \begin{macrocode} -parsers.Inline = V("Inline") -parsers.IndentedInline = V("IndentedInline") - --- parse many p between starter and ender -parsers.between = function(p, starter, ender) - local ender2 = B(parsers.nonspacechar) * ender - return (starter * #parsers.nonspacechar * Ct(p * (p - ender2)^0) * ender2) -end - -parsers.urlchar = parsers.anyescaped - - parsers.newline - - parsers.more - -parsers.auto_link_url = parsers.less - * C( parsers.alphanumeric^1 * P("://") - * parsers.urlchar^1) - * parsers.more - -parsers.auto_link_email - = parsers.less - * C((parsers.alphanumeric + S("-._+"))^1 - * P("@") * parsers.urlchar^1) - * parsers.more - -parsers.auto_link_relative_reference - = parsers.less - * C(parsers.urlchar^1) - * parsers.more + -- List of references defined in the document + local references % \end{macrocode} % \par % \begin{markdown} % -%#### Block Elements +% The \luamdef{reader->register_link} method registers +% a link reference, where `tag` is the link label, `url` +% is the link destination, `title` is the optional link +% title, and `attributes` are the optional attributes. % % \end{markdown} % \begin{macrocode} -parsers.lineof = function(c) - return (parsers.leader * (P(c) * parsers.optionalspace)^3 - * (parsers.newline * parsers.blankline^1 - + parsers.newline^-1 * parsers.eof)) -end + function self.register_link(_, tag, url, title, + attributes) + local normalized_tag = self.normalize_tag(tag) + if references[normalized_tag] == nil then + references[normalized_tag] = { + url = url, + title = title, + attributes = attributes + } + end + return "" + end + % \end{macrocode} % \par % \begin{markdown} % -%#### Headings +% The \luamdef{reader->lookup_reference} method looks up a +% reference with link label `tag`. % % \end{markdown} % \begin{macrocode} --- parse Atx heading start and return level -parsers.heading_start = #parsers.hash * C(parsers.hash^-6) - * -parsers.hash / length + function self.lookup_reference(tag) + return references[self.normalize_tag(tag)] + end --- parse setext header ending and return level -parsers.heading_level = parsers.equal^1 * Cc(1) + parsers.dash^1 * Cc(2) + parsers.title_s_direct_ref = parsers.squote + * Cs((parsers.html_entities + + (parsers.anyescaped - parsers.squote - parsers.blankline^2))^0) + * parsers.squote + + parsers.title_d_direct_ref = parsers.dquote + * Cs((parsers.html_entities + + (parsers.anyescaped - parsers.dquote - parsers.blankline^2))^0) + * parsers.dquote + + parsers.title_p_direct_ref = parsers.lparent + * Cs((parsers.html_entities + + (parsers.anyescaped - parsers.lparent - parsers.rparent - parsers.blankline^2))^0) + * parsers.rparent + + parsers.title_direct_ref = parsers.title_s_direct_ref + + parsers.title_d_direct_ref + + parsers.title_p_direct_ref + + parsers.inline_direct_ref_inside = parsers.lparent * parsers.spnl + * Cg(parsers.url + Cc(""), "url") + * parsers.spnl + * Cg(parsers.title_direct_ref + Cc(""), "title") + * parsers.spnl * parsers.rparent + + parsers.inline_direct_ref = parsers.lparent * parsers.spnlc + * Cg(parsers.url + Cc(""), "url") + * parsers.spnlc + * Cg(parsers.title + Cc(""), "title") + * parsers.spnlc * parsers.rparent + + parsers.empty_link = parsers.lbracket + * parsers.rbracket + + parsers.inline_link = parsers.link_text + * parsers.inline_direct_ref + + parsers.full_link = parsers.link_text + * parsers.link_label + + parsers.shortcut_link = parsers.link_label + * -(parsers.empty_link + parsers.link_label) + + parsers.collapsed_link = parsers.link_label + * parsers.empty_link + + parsers.image_opening = #(parsers.exclamation * parsers.inline_link) + * Cg(Cc("inline"), "link_type") + + #(parsers.exclamation * parsers.full_link) + * Cg(Cc("full"), "link_type") + + #(parsers.exclamation * parsers.collapsed_link) + * Cg(Cc("collapsed"), "link_type") + + #(parsers.exclamation * parsers.shortcut_link) + * Cg(Cc("shortcut"), "link_type") + + #(parsers.exclamation * parsers.empty_link) + * Cg(Cc("empty"), "link_type") + + parsers.link_opening = #parsers.inline_link + * Cg(Cc("inline"), "link_type") + + #parsers.full_link + * Cg(Cc("full"), "link_type") + + #parsers.collapsed_link + * Cg(Cc("collapsed"), "link_type") + + #parsers.shortcut_link + * Cg(Cc("shortcut"), "link_type") + + #parsers.empty_link + * Cg(Cc("empty_link"), "link_type") + + #parsers.link_text + * Cg(Cc("link_text"), "link_type") + + parsers.link_image_opening = Ct( Cg(Cc("delimiter"), "type") + * Cg(Cc(true), "is_opening") + * Cg(Cc(false), "is_closing") + * ( Cg(Cc("image"), "element") + * parsers.image_opening + * Cg(parsers.exclamation * parsers.lbracket, "content") + + Cg(Cc("link"), "element") + * parsers.link_opening + * Cg(parsers.lbracket, "content"))) + + parsers.link_image_closing = Ct( Cg(Cc("delimiter"), "type") + * Cg(Cc("link"), "element") + * Cg(Cc(false), "is_opening") + * Cg(Cc(true), "is_closing") + * ( Cg(Cc(true), "is_direct") + * Cg(parsers.rbracket * #parsers.inline_direct_ref, "content") + + Cg(Cc(false), "is_direct") + * Cg(parsers.rbracket, "content"))) + + parsers.link_image_open_or_close = parsers.link_image_opening + + parsers.link_image_closing + + if options.html then + parsers.link_emph_precedence = parsers.inticks + + parsers.autolink + + parsers.html_inline_tags + else + parsers.link_emph_precedence = parsers.inticks + + parsers.autolink + end + + parsers.link_and_emph_endline = parsers.newline + * ((parsers.check_minimal_indent + * -V("EndlineExceptions") + + parsers.check_optional_indent + * -V("EndlineExceptions") + * -parsers.starter) / "") + * parsers.spacechar^0 / "\n" + + parsers.link_and_emph_content = Ct( Cg(Cc("content"), "type") + * Cg(Cs(( parsers.link_emph_precedence + + parsers.backslash * parsers.any + + parsers.link_and_emph_endline + + (parsers.linechar + - parsers.blankline^2 + - parsers.link_image_open_or_close + - parsers.emph_open_or_close))^0), "content")) + + parsers.link_and_emph_table = (parsers.link_image_opening + parsers.emph_open) + * parsers.link_and_emph_content + * ((parsers.link_image_open_or_close + parsers.emph_open_or_close) + * parsers.link_and_emph_content)^1 -local function strip_atx_end(s) - return s:gsub("[#%s]*\n$","") -end % \end{macrocode} -% \par % \begin{markdown} % -%### Markdown Reader {#markdown-reader} -% -% This section documents the \luamref{reader} object, which implements the -% routines for parsing the markdown input. The object corresponds to the -% markdown reader object that was located in the -% `lunamark/reader/markdown.lua` file in the Lunamark Lua module. -% -% The \luamdef{reader.new} method creates and returns a new \TeX{} reader -% object associated with the Lua interface options (see Section -% <#sec:lua-options>) `options` and with a writer object `writer`. When -% `options` are unspecified, it is assumed that an empty table was passed to -% the method. -% -% The objects produced by the \luamref{reader.new} method expose instance methods -% and variables of their own. As a convention, I will refer to these -% \meta{member}s as `reader->`\meta{member}. +% Collect the content between the `opening_index` and `closing_index` in the delimiter table `t`. % % \end{markdown} % \begin{macrocode} -M.reader = {} -function M.reader.new(writer, options) - local self = {} + local function collect_link_content(t, opening_index, closing_index) + local content = {} + for i = opening_index, closing_index do + content[#content + 1] = t[i].content + end + return util.rope_to_string(content) + end + % \end{macrocode} -% \par % \begin{markdown} % -% Make the `writer` and `options` parameters available as -% \luamdef{reader->writer} and \luamdef{reader->options}, respectively, so -% that they are accessible from extensions. +% Look for the closest potential link opener in the delimiter table `t` in the range from +% `bottom_index` to `latest_index`. % % \end{markdown} % \begin{macrocode} - self.writer = writer - self.options = options + local function find_link_opener(t, bottom_index, latest_index) + for i = latest_index, bottom_index, -1 do + local value = t[i] + if value.type == "delimiter" and + value.is_opening and + (value.element == "link" or value.element == "image") + and not value.removed then + if value.is_active then + return i + end + value.removed = true + return nil + end + end + end + % \end{macrocode} -% \par % \begin{markdown} % -% Create a \luamdef{reader->parsers} hash table that stores \acro{peg} patterns -% that depend on the received `options`. Make \luamref{reader->parsers} inherit -% from the global \luamref{parsers} table. +% Find the position of a delimiter that closes a full link after an an index `latest_index` +% in the delimiter table `t`. % % \end{markdown} % \begin{macrocode} - self.parsers = {} - (function(parsers) - setmetatable(self.parsers, { - __index = function (_, key) - return parsers[key] + local function find_next_link_closing_index(t, latest_index) + for i = latest_index, #t do + local value = t[i] + if value.is_closing and + value.element == "link" and + not value.removed then + return i end - }) - end)(parsers) + end + end + % \end{macrocode} % \begin{markdown} % -% Make \luamref{reader->parsers} available as a local `parsers` variable that -% will shadow the global \luamref{parsers} table and will make -% \luamref{reader->parsers} easier to type in the rest of the reader code. +% Disable all preceding opening link delimiters by marking them inactive with the `is_active` property +% to prevent links within links. Images within links are allowed. % % \end{markdown} % \begin{macrocode} - local parsers = self.parsers + local function disable_previous_link_openers(t, opening_index) + if t[opening_index].element == "image" then + return + end + + for i = opening_index, 1, -1 do + local value = t[i] + if value.is_active and + value.type == "delimiter" and + value.is_opening and + value.element == "link" then + value.is_active = false + end + end + end + % \end{macrocode} -% \par % \begin{markdown} % -%#### Top-Level Helper Functions -% Define \luamdef{reader->normalize_tag} as a function that normalizes a -% markdown reference tag by lowercasing it, and by collapsing any adjacent -% whitespace characters. +% Disable the delimiters between the `opening_index` and `closing_index` in the delimiter table `t` +% by marking them inactive with the `is_active` property. % % \end{markdown} % \begin{macrocode} - function self.normalize_tag(tag) - tag = util.rope_to_string(tag) - tag = tag:gsub("[ \n\r\t]+", " ") - tag = tag:gsub("^ ", ""):gsub(" $", "") - tag = uni_case.casefold(tag, true, false) - return tag + local function disable_range(t, opening_index, closing_index) + for i = opening_index, closing_index do + local value = t[i] + if value.is_active then + value.is_active = false + if value.type == "delimiter" then + value.removed = true + end + end + end end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{iterlines} as a function that iterates over the lines of -% the input string `s`, transforms them using an input function `f`, and -% reassembles them into a new string, which it returns. +% Clear the parsed content between the `opening_index` and `closing_index` in the delimiter table `t`. % % \end{markdown} % \begin{macrocode} - local function iterlines(s, f) - local rope = lpeg.match(Ct((parsers.line / f)^1), s) - return util.rope_to_string(rope) + local function delete_parsed_content_in_range(t, opening_index, closing_index) + for i = opening_index, closing_index do + t[i].rendered = nil + end end + % \end{macrocode} -% \par % \begin{markdown} % -% Define \luamdef{expandtabs} either as an identity function, when the -% \Opt{preserveTabs} Lua interface option is enabled, or to a function that -% expands tabs into spaces otherwise. +% Clear the content between the `opening_index` and `closing_index` in the delimiter table `t`. % % \end{markdown} % \begin{macrocode} - if options.preserveTabs then - self.expandtabs = function(s) return s end - else - self.expandtabs = function(s) - if s:find("\t") then - return iterlines(s, util.expand_tabs_in_line) - else - return s - end - end + local function empty_content_in_range(t, opening_index, closing_index) + for i = opening_index, closing_index do + t[i].content = '' + end end + % \end{macrocode} -% \par % \begin{markdown} % -%#### High-Level Parser Functions -% -% Create a \luamdef{reader->parser_functions} hash table that stores high-level -% parser functions. Define \luamdef{reader->create_parser} as a function that -% will create a high-level parser function \luamdef{reader->parser_functions.name}, -% that matches input using grammar `grammar`. If `toplevel` is true, the input -% is expected to come straight from the user, not from a recursive call, and -% will be preprocessed. +% Join the attributes from the link reference definition `reference_attributes` with the link's own +% attributes `own_attributes`. % % \end{markdown} % \begin{macrocode} - self.parser_functions = {} - self.create_parser = function(name, grammar, toplevel) - self.parser_functions[name] = function(str) + local function join_attributes(reference_attributes, own_attributes) + local merged_attributes = {} + for _, attribute in ipairs(reference_attributes or {}) do + table.insert(merged_attributes, attribute) + end + for _, attribute in ipairs(own_attributes or {}) do + table.insert(merged_attributes, attribute) + end + if next(merged_attributes) == nil then + merged_attributes = nil + end + return merged_attributes + end + % \end{macrocode} -% \par % \begin{markdown} % -% If the parser function is top-level and the \Opt{stripIndent} Lua option is -% enabled, we will first expand tabs in the input string `str` into spaces -% and then we will count the minimum indent across all lines, skipping -% blank lines. Next, we will remove the minimum indent from all lines. +% Parse content between two delimiters in the delimiter table `t`. Produce the respective link and image +% macros. % % \end{markdown} % \begin{macrocode} - if toplevel and options.stripIndent then - local min_prefix_length, min_prefix = nil, '' - str = iterlines(str, function(line) - if lpeg.match(parsers.nonemptyline, line) == nil then - return line - end - line = util.expand_tabs_in_line(line) - local prefix = lpeg.match(C(parsers.optionalspace), line) - local prefix_length = #prefix - local is_shorter = min_prefix_length == nil - is_shorter = is_shorter or prefix_length < min_prefix_length - if is_shorter then - min_prefix_length, min_prefix = prefix_length, prefix - end - return line - end) - str = str:gsub('^' .. min_prefix, '') - end + local function render_link_or_image(t, opening_index, closing_index, content_end_index, reference) + process_emphasis(t, opening_index, content_end_index) + local mapped = collect_emphasis_content(t, opening_index + 1, content_end_index - 1) + + local rendered = {} + if (t[opening_index].element == "link") then + rendered = writer.link(mapped, reference.url, reference.title, reference.attributes) + end + + if (t[opening_index].element == "image") then + rendered = writer.image(mapped, reference.url, reference.title, reference.attributes) + end + + t[opening_index].rendered = rendered + delete_parsed_content_in_range(t, opening_index + 1, closing_index) + empty_content_in_range(t, opening_index, closing_index) + disable_previous_link_openers(t, opening_index) + disable_range(t, opening_index, closing_index) + end + % \end{macrocode} -% \par % \begin{markdown} % -% If the parser is top-level and the \Opt{texComments} or \Opt{hybrid} Lua -% options are enabled, we will strip all plain \TeX{} comments from the input -% string `str` together with the trailing newline characters. +% Match the link destination of an inline link at index `closing_index` in table `t` +% when `match_reference` is true. Additionally, match attributes when the option +% \Opt{linkAttributes} is enabled. % % \end{markdown} % \begin{macrocode} - if toplevel and (options.texComments or options.hybrid) then - str = lpeg.match(Ct(parsers.commented_line^1), str) - str = util.rope_to_string(str) - end - local res = lpeg.match(grammar(), str) - if res == nil then - error(format("%s failed on:\n%s", name, str:sub(1,20))) - else - return res - end + local function resolve_inline_following_content(t, closing_index, match_reference, match_link_attributes) + local content = "" + for i = closing_index + 1, #t do + content = content .. t[i].content end - end - self.create_parser("parse_blocks", - function() - return parsers.blocks - end, true) + local matching_content = parsers.succeed - self.create_parser("parse_blocks_nested", - function() - return parsers.blocks_nested - end, false) + if match_reference then + matching_content = matching_content * parsers.inline_direct_ref_inside + end - self.create_parser("parse_inlines", - function() - return parsers.inlines - end, false) + if match_link_attributes then + matching_content = matching_content * Cg(Ct(parsers.attributes^-1), "attributes") + end - self.create_parser("parse_inlines_no_link", - function() - return parsers.inlines_no_link - end, false) + local matched = lpeg.match(Ct(matching_content * Cg(Cp(), "end_position")), content) - self.create_parser("parse_inlines_no_inline_note", - function() - return parsers.inlines_no_inline_note - end, false) + local matched_count = matched.end_position - 1 + for i = closing_index + 1, #t do + local value = t[i] - self.create_parser("parse_inlines_no_html", - function() - return parsers.inlines_no_html - end, false) + local chars_left = matched_count + matched_count = matched_count - #value.content + + if matched_count <= 0 then + value.content = value.content:sub(chars_left + 1) + break + end + + value.content = '' + value.is_active = false + end + + local attributes = matched.attributes + if attributes == nil or next(attributes) == nil then + attributes = nil + end + + return { + url = matched.url or "", + title = matched.title or "", + attributes = attributes + } + end - self.create_parser("parse_inlines_nbsp", - function() - return parsers.inlines_nbsp - end, false) % \end{macrocode} -% \par % \begin{markdown} % -%#### Parsers Used for Markdown Lists (local) +% Resolve an inline link [a](b "c") from the delimiters at `opening_index` and `closing_index` +% within a delimiter table `t`. Here, compared to other types of links, no reference definition is needed. % % \end{markdown} % \begin{macrocode} - if options.hashEnumerators then - parsers.dig = parsers.digit + parsers.hash - else - parsers.dig = parsers.digit + local function resolve_inline_link(t, opening_index, closing_index) + local inline_content = resolve_inline_following_content(t, closing_index, true, t.match_link_attributes) + render_link_or_image(t, opening_index, closing_index, closing_index, inline_content) end - parsers.enumerator = C(parsers.dig^3 * parsers.period) * #parsers.spacing - + C(parsers.dig^2 * parsers.period) * #parsers.spacing - * (parsers.tab + parsers.space^1) - + C(parsers.dig * parsers.period) * #parsers.spacing - * (parsers.tab + parsers.space^-2) - + parsers.space * C(parsers.dig^2 * parsers.period) - * #parsers.spacing - + parsers.space * C(parsers.dig * parsers.period) - * #parsers.spacing - * (parsers.tab + parsers.space^-1) - + parsers.space * parsers.space * C(parsers.dig^1 - * parsers.period) * #parsers.spacing % \end{macrocode} -% \par % \begin{markdown} % -%#### Parsers Used for Blockquotes (local) +% Resolve a shortcut link [a] from the delimiters at `opening_index` and `closing_index` within a delimiter table `t`. +% Continue if a tag `a` is not found in the references. % % \end{markdown} % \begin{macrocode} - -- strip off leading > and indents, and run through blocks - parsers.blockquote_body = ((parsers.leader * parsers.more * parsers.space^-1)/"" - * parsers.linechar^0 * parsers.newline)^1 - * (-V("BlockquoteExceptions") * parsers.linechar^1 - * parsers.newline)^0 + local function resolve_shortcut_link(t, opening_index, closing_index) + local content = collect_link_content(t, opening_index + 1, closing_index - 1) + local r = self.lookup_reference(content) - if not options.breakableBlockquotes then - parsers.blockquote_body = parsers.blockquote_body - * (parsers.blankline^0 / "") + if r then + local inline_content = resolve_inline_following_content(t, closing_index, false, t.match_link_attributes) + r.attributes = join_attributes(r.attributes, inline_content.attributes) + render_link_or_image(t, opening_index, closing_index, closing_index, r) + end end + % \end{macrocode} -% \par % \begin{markdown} % -%#### Helpers for Links and Link Reference Definitions (local) +% Resolve a full link [a][b] from the delimiters at `opening_index` and `closing_index` within a delimiter table `t`. +% Continue if a tag `b` is not found in the references. % % \end{markdown} % \begin{macrocode} - -- List of references defined in the document - local references + local function resolve_full_link(t, opening_index, closing_index) + local next_link_closing_index = find_next_link_closing_index(t, closing_index + 4) + local next_link_content = collect_link_content(t, closing_index + 3, next_link_closing_index - 1) + local r = self.lookup_reference(next_link_content) + + if r then + local inline_content = resolve_inline_following_content(t, next_link_closing_index, false, + t.match_link_attributes) + r.attributes = join_attributes(r.attributes, inline_content.attributes) + render_link_or_image(t, opening_index, next_link_closing_index, closing_index, r) + end + end % \end{macrocode} -% \par % \begin{markdown} % -% The \luamdef{reader->register_link} method registers -% a link reference, where `tag` is the link label, `url` -% is the link destination, `title` is the optional link -% title, and `attributes` are the optional attributes. +% Resolve a collapsed link [a][] from the delimiters at `opening_index` and `closing_index` +% within a delimiter table `t`. +% Continue if a tag `a` is not found in the references. % % \end{markdown} % \begin{macrocode} - function self.register_link(tag, url, title, - attributes) - tag = self.normalize_tag(tag) - references[tag] = { - url = url, - title = title, - attributes = attributes, - } - return "" + local function resolve_collapsed_link(t, opening_index, closing_index) + local next_link_closing_index = find_next_link_closing_index(t, closing_index + 4) + local content = collect_link_content(t, opening_index + 1, closing_index - 1) + local r = self.lookup_reference(content) + + if r then + local inline_content = resolve_inline_following_content(t, closing_index, false, t.match_link_attributes) + r.attributes = join_attributes(r.attributes, inline_content.attributes) + render_link_or_image(t, opening_index, next_link_closing_index, closing_index, r) + end end % \end{macrocode} -% \par % \begin{markdown} % -% The \luamdef{reader->lookup_reference} method looks up a -% reference with link label `tag`. When the reference exists -% the method returns a link. The attributes of a link are -% produced by merging the attributes of the link reference -% and the optional `attributes`. Otherwise, the method returns a -% two-tuple of `nil` and fallback text constructed from the -% link text `label` and the optional spaces `sps` between the -% link text and the link label. -% -% \end{markdown} -% \begin{macrocode} - function self.lookup_reference(label, sps, tag, - attributes) - local tagpart - if not tag then - tag = label - tagpart = "" - elseif tag == "" then - tag = label - tagpart = "[]" - else - tagpart = { - "[", - self.parser_functions.parse_inlines(tag), - "]" - } - end - if sps then - tagpart = {sps, tagpart} +% Parse a table of link and emphasis delimiters `t`. +% First, iterate over the link delimiters and produce either link or image macros. +% Then run `process_emphasis` over the entire delimiter table, resolving emphasis and strong +% emphasis and parsing any content outside of closed delimiters. +% +% \end{markdown} +% \begin{macrocode} + local function process_links_and_emphasis(t) + for _,value in ipairs(t) do + value.is_active = true end - tag = self.normalize_tag(tag) - local r = references[tag] - if r then - local merged_attributes = {} - for _, attribute in ipairs(r.attributes or {}) do - table.insert(merged_attributes, attribute) - end - for _, attribute in ipairs(attributes or {}) do - table.insert(merged_attributes, attribute) + + for i,value in ipairs(t) do + if not value.is_closing or + value.type ~= "delimiter" or + not (value.element == "link" or value.element == "image") then + goto continue end - if #merged_attributes == 0 then - merged_attributes = nil + + local opener_position = find_link_opener(t, 1, i - 1) + if (opener_position == nil) then + goto continue end - return { - url = r.url, - title = r.title, - attributes = merged_attributes, - } - else - return nil, { - "[", - self.parser_functions.parse_inlines(label), - "]", - tagpart - } - end - end - -- lookup link reference and return a link, if the reference is found, - -- or a bracketed label otherwise. - local function indirect_link(label, sps, tag) - return writer.defer_call(function() - local r,fallback = self.lookup_reference(label, sps, tag) - if r then - return writer.link( - self.parser_functions.parse_inlines_no_link(label), - r.url, r.title) - else - return fallback + local opening_delimiter = t[opener_position] + opening_delimiter.removed = true + + local link_type = opening_delimiter.link_type + + if (link_type == "inline") then + resolve_inline_link(t, opener_position, i) end - end) + if (link_type == "shortcut") then + resolve_shortcut_link(t, opener_position, i) + end + if (link_type == "full") then + resolve_full_link(t, opener_position, i) + end + if (link_type == "collapsed") then + resolve_collapsed_link(t, opener_position, i) + end + + ::continue:: + end + + t[#t].content = t[#t].content:gsub("%s*$","") + + process_emphasis(t, 1, #t) + local final_result = collect_emphasis_content(t, 1, #t) + return final_result end - -- lookup image reference and return an image, if the reference is found, - -- or a bracketed label otherwise. - local function indirect_image(label, sps, tag) + function self.defer_link_and_emphasis_processing(delimiter_table) return writer.defer_call(function() - local r,fallback = self.lookup_reference(label, sps, tag) - if r then - return writer.image(writer.string(label), r.url, r.title) - else - return {"!", fallback} - end + return process_links_and_emphasis(delimiter_table) end) end - parsers.direct_link_tail = parsers.spnl - * parsers.lparent - * (parsers.url + Cc("")) -- link can be empty [foo]() - * parsers.optionaltitle - * parsers.rparent - - parsers.direct_link = (parsers.tag / self.parser_functions.parse_inlines_no_link) - * parsers.direct_link_tail - - parsers.direct_image = parsers.exclamation - * (parsers.tag / self.parser_functions.parse_inlines) - * parsers.direct_link_tail % \end{macrocode} % \par % \begin{markdown} @@ -24942,7 +28681,7 @@ function M.reader.new(writer, options) parsers.Str = (parsers.normalchar * (parsers.normalchar + parsers.at)^0) / writer.string - parsers.Symbol = (V("SpecialChar") - parsers.tightblocksep) + parsers.Symbol = (parsers.backtick^1 + V("SpecialChar")) / writer.string parsers.Ellipsis = P("...") / writer.ellipsis @@ -24954,83 +28693,112 @@ function M.reader.new(writer, options) if options.blankBeforeBlockquote then parsers.bqstart = parsers.fail else - parsers.bqstart = parsers.more + parsers.bqstart = parsers.blockquote_start end if options.blankBeforeHeading then parsers.headerstart = parsers.fail else - parsers.headerstart = parsers.hash - + (parsers.line * (parsers.equal^1 + parsers.dash^1) - * parsers.optionalspace * parsers.newline) + parsers.headerstart = parsers.atx_heading + end + + if options.blankBeforeList then + parsers.interrupting_bullets = parsers.fail + parsers.interrupting_enumerators = parsers.fail + else + parsers.interrupting_bullets = parsers.bullet(parsers.dash, true) + + parsers.bullet(parsers.asterisk, true) + + parsers.bullet(parsers.plus, true) + + parsers.interrupting_enumerators = parsers.enumerator(parsers.period, true) + + parsers.enumerator(parsers.rparent, true) + end + + if options.html then + parsers.html_interrupting = parsers.check_trail + * ( parsers.html_incomplete_open_tag + + parsers.html_incomplete_close_tag + + parsers.html_incomplete_open_special_tag + + parsers.html_comment_start + + parsers.html_cdatasection_start + + parsers.html_declaration_start + + parsers.html_instruction_start + - parsers.html_close_special_tag + - parsers.html_empty_special_tag) + else + parsers.html_interrupting = parsers.fail end parsers.EndlineExceptions = parsers.blankline -- paragraph break - + parsers.tightblocksep -- nested list + parsers.eof -- end of document + parsers.bqstart + + parsers.thematic_break_lines + + parsers.interrupting_bullets + + parsers.interrupting_enumerators + parsers.headerstart + + parsers.html_interrupting - parsers.Endline = parsers.newline - * -V("EndlineExceptions") - * parsers.spacechar^0 - / (options.hardLineBreaks and writer.hard_line_break - or writer.space) + parsers.NoSoftLineBreakEndlineExceptions = parsers.EndlineExceptions + parsers.endline = parsers.newline + * (parsers.check_minimal_indent + * -V("EndlineExceptions") + + parsers.check_optional_indent + * -V("EndlineExceptions") + * -parsers.starter) + * parsers.spacechar^0 + + parsers.Endline = parsers.endline + / writer.soft_line_break + + parsers.EndlineNoSub = parsers.endline + + parsers.NoSoftLineBreakEndline + = parsers.newline + * (parsers.check_minimal_indent + * -V("NoSoftLineBreakEndlineExceptions") + + parsers.check_optional_indent + * -V("NoSoftLineBreakEndlineExceptions") + * -parsers.starter) + * parsers.spacechar^0 + / writer.space + + parsers.EndlineBreak = parsers.backslash * parsers.Endline + / writer.hard_line_break + parsers.OptionalIndent = parsers.spacechar^1 / writer.space - parsers.Space = parsers.spacechar^2 * parsers.Endline / writer.hard_line_break - + parsers.spacechar^1 * parsers.Endline^-1 * parsers.eof / "" + parsers.Space = parsers.spacechar^2 * parsers.Endline + / writer.hard_line_break + + parsers.spacechar^1 * parsers.Endline^-1 * parsers.eof / self.expandtabs + parsers.spacechar^1 * parsers.Endline - * parsers.optionalspace - / (options.hardLineBreaks - and writer.hard_line_break - or writer.space) - + parsers.spacechar^1 * parsers.optionalspace - / writer.space + / writer.soft_line_break + + parsers.spacechar^1 * -parsers.newline / self.expandtabs + + parsers.NoSoftLineBreakSpace + = parsers.spacechar^2 * parsers.Endline + / writer.hard_line_break + + parsers.spacechar^1 * parsers.Endline^-1 * parsers.eof / self.expandtabs + + parsers.spacechar^1 * parsers.Endline + / writer.soft_line_break + + parsers.spacechar^1 * -parsers.newline / self.expandtabs parsers.NonbreakingEndline - = parsers.newline - * -V("EndlineExceptions") - * parsers.spacechar^0 - / (options.hardLineBreaks and writer.hard_line_break - or writer.nbsp) + = parsers.endline + / writer.soft_line_break parsers.NonbreakingSpace - = parsers.spacechar^2 * parsers.Endline / writer.hard_line_break + = parsers.spacechar^2 * parsers.Endline + / writer.hard_line_break + parsers.spacechar^1 * parsers.Endline^-1 * parsers.eof / "" + parsers.spacechar^1 * parsers.Endline * parsers.optionalspace - / (options.hardLineBreaks - and writer.hard_line_break - or writer.nbsp) + / writer.soft_line_break + parsers.spacechar^1 * parsers.optionalspace / writer.nbsp - if options.underscores then - parsers.Strong = ( parsers.between(parsers.Inline, parsers.doubleasterisks, - parsers.doubleasterisks) - + parsers.between(parsers.Inline, parsers.doubleunderscores, - parsers.doubleunderscores) - ) / writer.strong - - parsers.Emph = ( parsers.between(parsers.Inline, parsers.asterisk, - parsers.asterisk) - + parsers.between(parsers.Inline, parsers.underscore, - parsers.underscore) - ) / writer.emphasis - else - parsers.Strong = ( parsers.between(parsers.Inline, parsers.doubleasterisks, - parsers.doubleasterisks) - ) / writer.strong - - parsers.Emph = ( parsers.between(parsers.Inline, parsers.asterisk, - parsers.asterisk) - ) / writer.emphasis - end - % \end{macrocode} % \par % \begin{markdown} @@ -25046,7 +28814,6 @@ function self.auto_link_url(url, attributes) return writer.link(writer.escape(url), url, nil, attributes) end - % \end{macrocode} % \par % \begin{markdown} @@ -25074,39 +28841,21 @@ end = parsers.auto_link_relative_reference / self.auto_link_url - parsers.DirectLink = parsers.direct_link - / writer.link - - parsers.IndirectLink = parsers.indirect_link - / indirect_link - - -- parse a link or image (direct or indirect) - parsers.Link = parsers.DirectLink + parsers.IndirectLink - - parsers.DirectImage = parsers.direct_image - / writer.image - - parsers.IndirectImage = parsers.indirect_image - / indirect_image - - parsers.Image = parsers.DirectImage + parsers.IndirectImage - - -- avoid parsing long strings of * or _ as emph/strong - parsers.UlOrStarLine = parsers.asterisk^4 + parsers.underscore^4 - / writer.string + parsers.LinkAndEmph = Ct(parsers.link_and_emph_table) + / self.defer_link_and_emphasis_processing parsers.EscapedChar = parsers.backslash * C(parsers.escapable) / writer.string - parsers.InlineHtml = parsers.emptyelt_any / writer.inline_html_tag - + (parsers.htmlcomment / self.parser_functions.parse_inlines_no_html) - / writer.inline_html_comment - + parsers.htmlinstruction - + parsers.openelt_any / writer.inline_html_tag - + parsers.closeelt_any / writer.inline_html_tag + parsers.InlineHtml = Cs(parsers.html_inline_comment) / writer.inline_html_comment + + Cs(parsers.html_any_empty_inline_tag + + parsers.html_inline_instruction + + parsers.html_inline_cdatasection + + parsers.html_inline_declaration + + parsers.html_any_open_inline_tag + + parsers.html_any_close_tag) + / writer.inline_html_tag - parsers.HtmlEntity = parsers.hexentity / entities.hex_entity / writer.string - + parsers.decentity / entities.dec_entity / writer.string - + parsers.tagentity / entities.char_entity / writer.string + parsers.HtmlEntity = parsers.html_entities / writer.string % \end{macrocode} % \par % \begin{markdown} @@ -25115,40 +28864,40 @@ end % % \end{markdown} % \begin{macrocode} - parsers.DisplayHtml = (parsers.htmlcomment / self.parser_functions.parse_blocks_nested) - / writer.block_html_comment - + parsers.emptyelt_block / writer.block_html_element - + parsers.openelt_exact("hr") / writer.block_html_element - + parsers.in_matched_block_tags / writer.block_html_element - + parsers.htmlinstruction + parsers.DisplayHtml = Cs(parsers.check_trail + * ( parsers.html_comment + + parsers.html_special_block + + parsers.html_block + + parsers.html_any_block + + parsers.html_instruction + + parsers.html_cdatasection + + parsers.html_declaration)) + / writer.block_html_element - parsers.Verbatim = Cs( (parsers.blanklines - * ((parsers.indentedline - parsers.blankline))^1)^1 - ) / self.expandtabs / writer.verbatim + parsers.indented_non_blank_line = parsers.indentedline - parsers.blankline - parsers.BlockquoteExceptions = parsers.leader * parsers.more - + parsers.blankline + parsers.Verbatim = Cs( + parsers.check_code_trail + * (parsers.line - parsers.blankline) + * ((parsers.check_minimal_blank_indent_and_full_code_trail * parsers.blankline)^0 + * ((parsers.check_minimal_indent / "") * parsers.check_code_trail + * (parsers.line - parsers.blankline))^1)^0 + ) / self.expandtabs / writer.verbatim - parsers.Blockquote = Cs(parsers.blockquote_body^1) - / self.parser_functions.parse_blocks_nested + parsers.Blockquote = parsers.blockquote_body / writer.blockquote - parsers.ThematicBreak = ( parsers.lineof(parsers.asterisk) - + parsers.lineof(parsers.dash) - + parsers.lineof(parsers.underscore) - ) / writer.thematic_break + parsers.ThematicBreak = parsers.thematic_break_lines + / writer.thematic_break parsers.Reference = parsers.define_reference_parser - * parsers.blankline^1 / self.register_link - parsers.Paragraph = parsers.nonindentspace * Ct(parsers.Inline^1) - * ( parsers.newline - * ( parsers.blankline^1 - + #V("EndlineExceptions") - ) - + parsers.eof) - / writer.paragraph + parsers.Paragraph = parsers.freeze_trail + * (Ct((parsers.Inline)^1) + * (parsers.newline + parsers.eof) + * parsers.unfreeze_trail + / writer.paragraph) parsers.Plain = parsers.nonindentspace * Ct(parsers.Inline^1) / writer.plain @@ -25160,7 +28909,6 @@ end % % \end{markdown} % \begin{macrocode} - parsers.starter = parsers.bullet + parsers.enumerator if options.taskLists then parsers.tickbox = ( parsers.ticked_box @@ -25171,43 +28919,117 @@ end parsers.tickbox = parsers.fail end - -- we use \001 as a separator between a tight list item and a - -- nested list under it. - parsers.NestedList = Cs((parsers.optionallyindentedline - - parsers.starter)^1) - / function(a) return "\001"..a end - - parsers.ListBlockLine = parsers.optionallyindentedline - - parsers.blankline - (parsers.indent^-1 - * parsers.starter) - - parsers.ListBlock = parsers.line * parsers.ListBlockLine^0 - - parsers.ListContinuationBlock = parsers.blanklines * (parsers.indent / "") - * parsers.ListBlock + parsers.list_blank = parsers.conditionally_indented_blankline + + parsers.ref_or_block_list_separated = parsers.sep_group_no_output(parsers.list_blank) + * parsers.minimally_indented_ref + + parsers.block_sep_group(parsers.list_blank) + * parsers.minimally_indented_block + + parsers.ref_or_block_non_separated = parsers.minimally_indented_ref + + (parsers.succeed / writer.interblocksep) + * parsers.minimally_indented_block + - parsers.minimally_indented_blankline + + parsers.tight_list_loop_body_pair = + parsers.create_loop_body_pair(parsers.ref_or_block_non_separated, + parsers.minimally_indented_par_or_plain_no_blank, + (parsers.succeed / writer.interblocksep), + (parsers.succeed / writer.paragraphsep)) + + parsers.loose_list_loop_body_pair = + parsers.create_loop_body_pair(parsers.ref_or_block_list_separated, + parsers.minimally_indented_par_or_plain, + parsers.block_sep_group(parsers.list_blank), + parsers.par_sep_group(parsers.list_blank)) + + parsers.tight_list_content_loop = V("Block") + * parsers.tight_list_loop_body_pair.block^0 + + (V("Paragraph") + V("Plain")) + * parsers.ref_or_block_non_separated + * parsers.tight_list_loop_body_pair.block^0 + + (V("Paragraph") + V("Plain")) + * parsers.tight_list_loop_body_pair.par^0 + + parsers.loose_list_content_loop = V("Block") + * parsers.loose_list_loop_body_pair.block^0 + + (V("Paragraph") + V("Plain")) + * parsers.ref_or_block_list_separated + * parsers.loose_list_loop_body_pair.block^0 + + (V("Paragraph") + V("Plain")) + * parsers.loose_list_loop_body_pair.par^0 + + parsers.list_item_tightness_condition = -#( parsers.list_blank^0 + * parsers.minimally_indented_ref_or_block_or_par) + * remove_indent("li") + + remove_indent("li") + * parsers.fail + + parsers.indented_content_tight = Ct( (parsers.blankline / "") + * #parsers.list_blank + * remove_indent("li") + + ( (V("Reference") + (parsers.blankline / "")) + * parsers.check_minimal_indent + * parsers.tight_list_content_loop + + (V("Reference") + (parsers.blankline / "")) + + (parsers.tickbox^-1 / writer.escape) + * parsers.tight_list_content_loop + ) + * parsers.list_item_tightness_condition + ) + + parsers.indented_content_loose = Ct( (parsers.blankline / "") + * #parsers.list_blank + + ( (V("Reference") + (parsers.blankline / "")) + * parsers.check_minimal_indent + * parsers.loose_list_content_loop + + (V("Reference") + (parsers.blankline / "")) + + (parsers.tickbox^-1 / writer.escape) + * parsers.loose_list_content_loop + ) + ) parsers.TightListItem = function(starter) - return -parsers.ThematicBreak - * (Cs(starter / "" * parsers.tickbox^-1 * parsers.ListBlock * parsers.NestedList^-1) - / self.parser_functions.parse_blocks_nested) - * -(parsers.blanklines * parsers.indent) + return -parsers.ThematicBreak + * parsers.add_indent(starter, "li") + * parsers.indented_content_tight end parsers.LooseListItem = function(starter) - return -parsers.ThematicBreak - * Cs( starter / "" * parsers.tickbox^-1 * parsers.ListBlock * Cc("\n") - * (parsers.NestedList + parsers.ListContinuationBlock^0) - * (parsers.blanklines / "\n\n") - ) / self.parser_functions.parse_blocks_nested + return -parsers.ThematicBreak + * parsers.add_indent(starter, "li") + * parsers.indented_content_loose + * remove_indent("li") + end + + parsers.BulletListOfType = function(bullet_type) + local bullet = parsers.bullet(bullet_type) + return ( Ct( parsers.TightListItem(bullet) + * ( (parsers.check_minimal_indent / "") + * parsers.TightListItem(bullet) + )^0 + ) + * Cc(true) + * -#( (parsers.list_blank^0 / "") + * parsers.check_minimal_indent + * (bullet - parsers.ThematicBreak) + ) + + Ct( parsers.LooseListItem(bullet) + * ( (parsers.list_blank^0 / "") + * (parsers.check_minimal_indent / "") + * parsers.LooseListItem(bullet) + )^0 + ) + * Cc(false) + ) / writer.bulletlist end - parsers.BulletList = ( Ct(parsers.TightListItem(parsers.bullet)^1) * Cc(true) - * parsers.skipblanklines * -parsers.bullet - + Ct(parsers.LooseListItem(parsers.bullet)^1) * Cc(false) - * parsers.skipblanklines ) - / writer.bulletlist + parsers.BulletList = parsers.BulletListOfType(parsers.dash) + + parsers.BulletListOfType(parsers.asterisk) + + parsers.BulletListOfType(parsers.plus) - local function ordered_list(items,tight,startnum) + local function ordered_list(items,tight,starter) + local startnum = starter[2][1] if options.startNumber then startnum = tonumber(startnum) or 1 -- fallback for '#' if startnum ~= nil then @@ -25219,14 +29041,23 @@ end return writer.orderedlist(items,tight,startnum) end - parsers.OrderedList = Cg(parsers.enumerator, "listtype") * - ( Ct(parsers.TightListItem(Cb("listtype")) - * parsers.TightListItem(parsers.enumerator)^0) - * Cc(true) * parsers.skipblanklines * -parsers.enumerator - + Ct(parsers.LooseListItem(Cb("listtype")) - * parsers.LooseListItem(parsers.enumerator)^0) - * Cc(false) * parsers.skipblanklines - ) * Cb("listtype") / ordered_list + parsers.OrderedListOfType = function(delimiter_type) + local enumerator = parsers.enumerator(delimiter_type) + return Cg(enumerator, "listtype") + * (Ct( parsers.TightListItem(Cb("listtype")) + * ((parsers.check_minimal_indent / "") * parsers.TightListItem(enumerator))^0) + * Cc(true) + * -#((parsers.list_blank^0 / "") + * parsers.check_minimal_indent * enumerator) + + Ct( parsers.LooseListItem(Cb("listtype")) + * ((parsers.list_blank^0 / "") + * (parsers.check_minimal_indent / "") * parsers.LooseListItem(enumerator))^0) + * Cc(false) + ) * Ct(Cb("listtype")) / ordered_list + end + + parsers.OrderedList = parsers.OrderedListOfType(parsers.period) + + parsers.OrderedListOfType(parsers.rparent) % \end{macrocode} % \par % \begin{markdown} @@ -25237,7 +29068,6 @@ end % \begin{macrocode} parsers.Blank = parsers.blankline / "" + V("Reference") - + (parsers.tightblocksep / "\n") % \end{macrocode} % \par % \begin{markdown} @@ -25246,22 +29076,45 @@ end % % \end{markdown} % \begin{macrocode} + function parsers.parse_heading_text(s) + local inlines = self.parser_functions.parse_inlines(s) + local flatten_inlines = self.writer.flatten_inlines + self.writer.flatten_inlines = true + local flat_text = self.parser_functions.parse_inlines(s) + flat_text = util.rope_to_string(flat_text) + self.writer.flatten_inlines = flatten_inlines + return {flat_text, inlines} + end + -- parse atx header - parsers.AtxHeading = Cg(parsers.heading_start, "level") - * parsers.optionalspace - * (C(parsers.line) + parsers.AtxHeading = parsers.check_trail_no_rem + * Cg(parsers.heading_start, "level") + * ((C( parsers.optionalspace + * parsers.hash^0 + * parsers.optionalspace + * parsers.newline) + + parsers.spacechar^1 + * C(parsers.line)) / strip_atx_end - / self.parser_functions.parse_inlines) + / parsers.parse_heading_text) * Cb("level") / writer.heading - parsers.SetextHeading = #(parsers.line * S("=-")) - * Ct(parsers.linechar^1 - / self.parser_functions.parse_inlines) - * parsers.newline - * parsers.heading_level - * parsers.optionalspace + parsers.heading_line = parsers.linechar^1 + - parsers.thematic_break_lines + + parsers.heading_text = parsers.heading_line + * ((V("Endline") / "\n") * (parsers.heading_line - parsers.heading_level))^0 + * parsers.newline^-1 + + parsers.SetextHeading = parsers.freeze_trail * parsers.check_trail_no_rem + * #(parsers.heading_text + * parsers.check_minimal_indent * parsers.check_trail * parsers.heading_level) + * Cs(parsers.heading_text) + / parsers.parse_heading_text + * parsers.check_minimal_indent_and_trail * parsers.heading_level * parsers.newline + * parsers.unfreeze_trail / writer.heading parsers.Heading = parsers.AtxHeading + parsers.SetextHeading @@ -25364,12 +29217,42 @@ end Blocks = V("InitializeState") * ( V("ExpectedJekyllData") - * (V("Blank")^0 / writer.interblocksep))^-1 + * (V("Blank")^0 / writer.interblocksep) + )^-1 * V("Blank")^0 - * V("Block")^-1 - * ( V("Blank")^0 / writer.interblocksep - * V("Block"))^0 - * V("Blank")^0 * parsers.eof, +% \end{macrocode} +% \par +% \begin{markdown} +% +% Only create interblock separators between pairs of blocks that are not +% both paragraphs. Between a pair of paragraphs, any number of blank +% lines will always produce a paragraph separator. +% +% \end{markdown} +% \begin{macrocode} + * ( V("Block") + * ( V("Blank")^0 * parsers.eof + + ( V("Blank")^2 / writer.paragraphsep + + V("Blank")^0 / writer.interblocksep + ) + ) + + ( V("Paragraph") + V("Plain") ) + * ( V("Blank")^0 * parsers.eof + + ( V("Blank")^2 / writer.paragraphsep + + V("Blank")^0 / writer.interblocksep + ) + ) + * V("Block") + * ( V("Blank")^0 * parsers.eof + + ( V("Blank")^2 / writer.paragraphsep + + V("Blank")^0 / writer.interblocksep + ) + ) + + ( V("Paragraph") + V("Plain") ) + * ( V("Blank")^0 * parsers.eof + + V("Blank")^0 / writer.paragraphsep + ) + )^0, ExpectedJekyllData = parsers.fail, @@ -25381,23 +29264,25 @@ end ThematicBreak = parsers.ThematicBreak, BulletList = parsers.BulletList, OrderedList = parsers.OrderedList, - Heading = parsers.Heading, DisplayHtml = parsers.DisplayHtml, + Heading = parsers.Heading, Paragraph = parsers.Paragraph, Plain = parsers.Plain, EndlineExceptions = parsers.EndlineExceptions, - BlockquoteExceptions = parsers.BlockquoteExceptions, + NoSoftLineBreakEndlineExceptions + = parsers.NoSoftLineBreakEndlineExceptions, Str = parsers.Str, Space = parsers.Space, + NoSoftLineBreakSpace = parsers.NoSoftLineBreakSpace, OptionalIndent = parsers.OptionalIndent, Endline = parsers.Endline, - UlOrStarLine = parsers.UlOrStarLine, - Strong = parsers.Strong, - Emph = parsers.Emph, - Link = parsers.Link, - Image = parsers.Image, + EndlineNoSub = parsers.EndlineNoSub, + NoSoftLineBreakEndline + = parsers.NoSoftLineBreakEndline, + EndlineBreak = parsers.EndlineBreak, + LinkAndEmph = parsers.LinkAndEmph, Code = parsers.Code, AutoLinkUrl = parsers.AutoLinkUrl, AutoLinkEmail = parsers.AutoLinkEmail, @@ -25500,13 +29385,26 @@ end % \end{markdown} % \begin{macrocode} self.initialize_named_group = function(name, value) + local pattern = Ct("") + if value ~= nil then + pattern = pattern / value + end syntax.InitializeState = syntax.InitializeState - * Cg(Ct("") / value, name) + * Cg(pattern, name) end % \end{macrocode} % \par % \begin{markdown} % +% Add a named group for indentation. +% +% \end{markdown} +% \begin{macrocode} + self.initialize_named_group("indent_info") +% \end{macrocode} +% \par +% \begin{markdown} +% % Apply syntax extensions. % % \end{markdown} @@ -25578,20 +29476,6 @@ end % \par % \begin{markdown} % -% Duplicate the `Inline` rule as `IndentedInline` with the right-hand-side -% terminal symbol `Space` replaced with `OptionalIndent`. -% -% \end{markdown} -% \begin{macrocode} - walkable_syntax["IndentedInline"] = util.table_copy( - walkable_syntax["Inline"]) - self.insert_pattern( - "IndentedInline instead of Space", - "OptionalIndent") -% \end{macrocode} -% \par -% \begin{markdown} -% % Materialize \luamref{walkable_syntax} and merge it into \luamref{syntax} to % produce the complete \acro{peg} grammar of markdown. Whenever a rule exists % in both \luamref{walkable_syntax} and \luamref{syntax}, the rule from @@ -25607,7 +29491,7 @@ end % \begin{markdown} % % Although the interface of the \luamref{reader->insert_pattern} method does -% document this (see Section <#sec:lua-user-extensions>), we allow the +% not document this (see Section <#sec:lua-user-extensions>), we allow the % \luamref{reader->insert_pattern} and \luamref{reader->update_rule} % methods to insert not just \acro{peg} patterns, but also rule names that % reference the \acro{peg} grammar of Markdown. @@ -25667,6 +29551,15 @@ end syntax.AutoLinkRelativeReference = parsers.fail end + if options.contentLevel == "inline" then + syntax[1] = "Inlines" + syntax.Inlines = V("InitializeState") + * parsers.Inline^0 + * ( parsers.spacing^0 + * parsers.eof / "") + syntax.Space = parsers.Space + parsers.blankline / writer.space + end + local blocks_nested_t = util.table_copy(syntax) blocks_nested_t.ExpectedJekyllData = parsers.fail parsers.blocks_nested = Ct(blocks_nested_t) @@ -25681,10 +29574,6 @@ end * parsers.eof / "") parsers.inlines = Ct(inlines_t) - local inlines_no_link_t = util.table_copy(inlines_t) - inlines_no_link_t.Link = parsers.fail - parsers.inlines_no_link = Ct(inlines_no_link_t) - local inlines_no_inline_note_t = util.table_copy(inlines_t) inlines_no_inline_note_t.InlineNote = parsers.fail parsers.inlines_no_inline_note = Ct(inlines_no_inline_note_t) @@ -25699,6 +29588,11 @@ end inlines_nbsp_t.Endline = parsers.NonbreakingEndline inlines_nbsp_t.Space = parsers.NonbreakingSpace parsers.inlines_nbsp = Ct(inlines_nbsp_t) + + local inlines_no_link_or_emphasis_t = util.table_copy(inlines_t) + inlines_no_link_or_emphasis_t.LinkAndEmph = parsers.fail + inlines_no_link_or_emphasis_t.EndlineExceptions = parsers.EndlineExceptions - parsers.eof + parsers.inlines_no_link_or_emphasis = Ct(inlines_no_link_or_emphasis_t) % \end{macrocode} % \par % \begin{markdown} @@ -25831,6 +29725,7 @@ M.extensions.bracketed_spans = function() % \end{markdown} % \begin{macrocode} function self.span(s, attr) + if self.flatten_inlines then return s end return {"\\markdownRendererBracketedSpanAttributeContextBegin", self.attributes(attr), s, @@ -25840,13 +29735,25 @@ M.extensions.bracketed_spans = function() local parsers = self.parsers local writer = self.writer - local Span = parsers.between(parsers.Inline, - parsers.lbracket, - parsers.rbracket) + local span_label = parsers.lbracket + * (Cs((parsers.alphanumeric^1 + + parsers.inticks + + parsers.autolink + + V("InlineHtml") + + ( parsers.backslash * parsers.backslash) + + ( parsers.backslash * (parsers.lbracket + parsers.rbracket) + + V("Space") + V("Endline") + + (parsers.any + - (parsers.newline + parsers.lbracket + parsers.rbracket + + parsers.blankline^2))))^1) + / self.parser_functions.parse_inlines) + * parsers.rbracket + + local Span = span_label * Ct(parsers.attributes) / writer.span - self.insert_pattern("Inline after Emph", + self.insert_pattern("Inline before LinkAndEmph", Span, "Span") end } @@ -25888,11 +29795,24 @@ M.extensions.citations = function(citation_nbsps) % \end{markdown} % \begin{macrocode} function self.citations(text_cites, cites) - local buffer = {"\\markdownRenderer", text_cites and "TextCite" or "Cite", - "{", #cites, "}"} - for _,cite in ipairs(cites) do - buffer[#buffer+1] = {cite.suppress_author and "-" or "+", "{", - cite.prenote or "", "}{", cite.postnote or "", "}{", cite.name, "}"} + local buffer = {} + if self.flatten_inlines then + for _,cite in ipairs(cites) do + if cite.prenote then + table.insert(buffer, {cite.prenote, " "}) + end + table.insert(buffer, cite.name) + if cite.postnote then + table.insert(buffer, {" ", cite.postnote}) + end + end + else + table.insert(buffer, {"\\markdownRenderer", text_cites and "TextCite" or "Cite", + "{", #cites, "}"}) + for _,cite in ipairs(cites) do + table.insert(buffer, {cite.suppress_author and "-" or "+", "{", + cite.prenote or "", "}{", cite.postnote or "", "}{", cite.name, "}"}) + end end return buffer end @@ -25919,42 +29839,51 @@ M.extensions.citations = function(citation_nbsps) = Cs((parsers.alphanumeric^1 + parsers.bracketed + parsers.inticks + + parsers.autolink + + V("InlineHtml") + + V("Space") + V("Endline") + (parsers.anyescaped - - (parsers.rbracket + parsers.blankline^2)) + - (parsers.newline + parsers.rbracket + parsers.blankline^2)) - (parsers.spnl * parsers.dash^-1 * parsers.at))^0) local citation_body_postnote = Cs((parsers.alphanumeric^1 + parsers.bracketed + parsers.inticks + + parsers.autolink + + V("InlineHtml") + + V("Space") + V("Endline") + (parsers.anyescaped - - (parsers.rbracket + parsers.semicolon + - (parsers.newline + parsers.rbracket + parsers.semicolon + parsers.blankline^2)) - (parsers.spnl * parsers.rbracket))^0) local citation_body_chunk = citation_body_prenote - * parsers.spnl * citation_name + * parsers.spnlc * citation_name * (parsers.internal_punctuation - parsers.semicolon)^-1 - * parsers.spnl * citation_body_postnote + * parsers.spnlc * citation_body_postnote local citation_body = citation_body_chunk - * (parsers.semicolon * parsers.spnl + * (parsers.semicolon * parsers.spnlc * citation_body_chunk)^0 local citation_headless_body_postnote = Cs((parsers.alphanumeric^1 + parsers.bracketed + parsers.inticks + + parsers.autolink + + V("InlineHtml") + + V("Space") + V("Endline") + (parsers.anyescaped - - (parsers.rbracket + parsers.at + - (parsers.newline + parsers.rbracket + parsers.at + parsers.semicolon + parsers.blankline^2)) - (parsers.spnl * parsers.rbracket))^0) local citation_headless_body = citation_headless_body_postnote - * (parsers.sp * parsers.semicolon * parsers.spnl + * (parsers.sp * parsers.semicolon * parsers.spnlc * citation_body_chunk)^0 local citations @@ -25983,10 +29912,10 @@ M.extensions.citations = function(citation_nbsps) end local TextCitations - = Ct((parsers.spnl + = Ct((parsers.spnlc * Cc("") * citation_name - * ((parsers.spnl + * ((parsers.spnlc * parsers.lbracket * citation_headless_body * parsers.rbracket) + Cc("")))^1) @@ -25995,7 +29924,7 @@ M.extensions.citations = function(citation_nbsps) end local ParenthesizedCitations - = Ct((parsers.spnl + = Ct((parsers.spnlc * parsers.lbracket * citation_body * parsers.rbracket)^1) @@ -26005,7 +29934,7 @@ M.extensions.citations = function(citation_nbsps) local Citations = TextCitations + ParenthesizedCitations - self.insert_pattern("Inline after Emph", + self.insert_pattern("Inline before LinkAndEmph", Citations, "Citations") self.add_special_character("@") @@ -26018,7 +29947,7 @@ end % %#### Content Blocks % -% The \luamdef{extensions.content_blocks} function implements the iA\,Writer +% The \luamdef{extensions.content_blocks} function implements the iA\\,Writer % content blocks syntax extension. The `language_map` parameter specifies % the filename of the \acro{JSON} file that maps filename extensions to % programming language names. @@ -26068,7 +29997,7 @@ M.extensions.content_blocks = function(language_map) % \begin{markdown} % % Define \luamdef{writer->contentblock} as a function that will transform an -% input iA\,Writer content block to the output format, where `src` +% input iA\\,Writer content block to the output format, where `src` % corresponds to the \acro{uri} prefix, `suf` to the \acro{uri} extension, % `type` to the type of the content block (`localfile` or `onlineimage`), % and `tit` to the title of the content block. @@ -26135,6 +30064,7 @@ M.extensions.content_blocks = function(language_map) = (parsers.less * Cs((parsers.anyescaped - parsers.more + - parsers.spacing - #(parsers.period * onlineimagesuffix * parsers.more @@ -26167,7 +30097,7 @@ M.extensions.content_blocks = function(language_map) * Cc("localfile") local ContentBlock - = parsers.leader + = parsers.check_trail_no_rem * (localfilepath + onlineimageurl) * contentblock_tail / writer.contentblock @@ -26234,18 +30164,26 @@ M.extensions.definition_lists = function(tight_lists) local defstartchar = S("~:") - local defstart = ( defstartchar * #parsers.spacing + local defstart = parsers.check_trail_length(0) * defstartchar * #parsers.spacing * (parsers.tab + parsers.space^-3) - + parsers.space * defstartchar * #parsers.spacing + + parsers.check_trail_length(1) * defstartchar * #parsers.spacing * (parsers.tab + parsers.space^-2) - + parsers.space * parsers.space * defstartchar - * #parsers.spacing + + parsers.check_trail_length(2) * defstartchar * #parsers.spacing * (parsers.tab + parsers.space^-1) - + parsers.space * parsers.space * parsers.space - * defstartchar * #parsers.spacing - ) + + parsers.check_trail_length(3) * defstartchar * #parsers.spacing + + local indented_line = (parsers.check_minimal_indent / "") * parsers.check_code_trail * parsers.line - local dlchunk = Cs(parsers.line * (parsers.indentedline - parsers.blankline)^0) + local blank = parsers.check_minimal_blank_indent_and_any_trail * parsers.optionalspace * parsers.newline + + local dlchunk = Cs(parsers.line * (indented_line - blank)^0) + + local indented_blocks = function(bl) + return Cs( bl + * (blank^1 * (parsers.check_minimal_indent / "") + * parsers.check_code_trail * -parsers.blankline * bl)^0 + * (blank^1 + parsers.eof)) + end local function definition_list_item(term, defs, _) return { term = self.parser_functions.parse_inlines(term), @@ -26253,22 +30191,22 @@ M.extensions.definition_lists = function(tight_lists) end local DefinitionListItemLoose - = C(parsers.line) * parsers.skipblanklines - * Ct((defstart - * parsers.indented_blocks(dlchunk) - / self.parser_functions.parse_blocks_nested)^1) + = C(parsers.line) * blank^0 + * Ct((parsers.check_minimal_indent * (defstart + * indented_blocks(dlchunk) + / self.parser_functions.parse_blocks_nested))^1) * Cc(false) / definition_list_item local DefinitionListItemTight = C(parsers.line) - * Ct((defstart * dlchunk - / self.parser_functions.parse_blocks_nested)^1) + * Ct((parsers.check_minimal_indent * (defstart * dlchunk + / self.parser_functions.parse_blocks_nested))^1) * Cc(true) / definition_list_item local DefinitionList = ( Ct(DefinitionListItemLoose^1) * Cc(false) + Ct(DefinitionListItemTight^1) - * (parsers.skipblanklines + * (blank^0 * -DefinitionListItemLoose * Cc(true)) ) / writer.definitionlist @@ -26322,8 +30260,10 @@ M.extensions.fancy_lists = function() local buffer = {} local num = startnum for _,item in ipairs(items) do - buffer[#buffer + 1] = self.fancyitem(item,num) - if num ~= nil then + if item ~= "" then + buffer[#buffer + 1] = self.fancyitem(item,num) + end + if num ~= nil and item ~= "" then num = num + 1 end end @@ -26361,52 +30301,101 @@ M.extensions.fancy_lists = function() local options = self.options local writer = self.writer - local label = parsers.dig + parsers.letter - local numdelim = parsers.period + parsers.rparent - local enumerator = C(label^3 * numdelim) * #parsers.spacing - + C(label^2 * numdelim) * #parsers.spacing - * (parsers.tab + parsers.space^1) - + C(label * numdelim) * #parsers.spacing - * (parsers.tab + parsers.space^-2) - + parsers.space * C(label^2 * numdelim) - * #parsers.spacing - + parsers.space * C(label * numdelim) - * #parsers.spacing - * (parsers.tab + parsers.space^-1) - + parsers.space * parsers.space * C(label^1 - * numdelim) * #parsers.spacing - local starter = parsers.bullet + enumerator + local function combine_markers_and_delims(markers, delims) + local markers_table = {} + for _,marker in ipairs(markers) do + local start_marker + local continuation_marker + if type(marker) == "table" then + start_marker = marker[1] + continuation_marker = marker[2] + else + start_marker = marker + continuation_marker = marker + end + for _,delim in ipairs(delims) do + table.insert(markers_table, {start_marker, continuation_marker, delim}) + end + end + return markers_table + end + + local function join_table_with_func(func, markers_table) + local pattern = func(table.unpack(markers_table[1])) + for i = 2, #markers_table do + pattern = pattern + func(table.unpack(markers_table[i])) + end + return pattern + end + + local lowercase_letter_marker = R("az") + local uppercase_letter_marker = R("AZ") + + local roman_marker = function(chars) + local m, d, c = P(chars[1]), P(chars[2]), P(chars[3]) + local l, x, v, i = P(chars[4]), P(chars[5]), P(chars[6]), P(chars[7]) + return m^-3 + * (c*m + c*d + d^-1 * c^-3) + * (x*c + x*l + l^-1 * x^-3) + * (i*x + i*v + v^-1 * i^-3) + end + + local lowercase_roman_marker = roman_marker({"m", "d", "c", "l", "x", "v", "i"}) + local uppercase_roman_marker = roman_marker({"M", "D", "C", "L", "X", "V", "I"}) + + local lowercase_opening_roman_marker = P("i") + local uppercase_opening_roman_marker = P("I") + + local digit_marker = parsers.dig * parsers.dig^-8 - local NestedList = Cs((parsers.optionallyindentedline - - starter)^1) - / function(a) return "\001"..a end + local markers = { + {lowercase_opening_roman_marker, lowercase_roman_marker}, + {uppercase_opening_roman_marker, uppercase_roman_marker}, + lowercase_letter_marker, + uppercase_letter_marker, + lowercase_roman_marker, + uppercase_roman_marker, + digit_marker + } + + local delims = { + parsers.period, + parsers.rparent + } + + local markers_table = combine_markers_and_delims(markers, delims) - local ListBlockLine = parsers.optionallyindentedline - - parsers.blankline - (parsers.indent^-1 - * starter) + local function enumerator(start_marker, _, delimiter_type, interrupting) + local delimiter_range + local allowed_end + if interrupting then + delimiter_range = P("1") + allowed_end = C(parsers.spacechar^1) * #parsers.linechar + else + delimiter_range = start_marker + allowed_end = C(parsers.spacechar^1) + #(parsers.newline + parsers.eof) + end - local ListBlock = parsers.line * ListBlockLine^0 + return parsers.check_trail + * Ct(C(delimiter_range) * C(delimiter_type)) + * allowed_end + end - local ListContinuationBlock = parsers.blanklines * (parsers.indent / "") - * ListBlock + local starter = join_table_with_func(enumerator, markers_table) local TightListItem = function(starter) - return -parsers.ThematicBreak - * (Cs(starter / "" * parsers.tickbox^-1 * ListBlock * NestedList^-1) - / self.parser_functions.parse_blocks_nested) - * -(parsers.blanklines * parsers.indent) + return parsers.add_indent(starter, "li") + * parsers.indented_content_tight end local LooseListItem = function(starter) - return -parsers.ThematicBreak - * Cs( starter / "" * parsers.tickbox^-1 * ListBlock * Cc("\n") - * (NestedList + ListContinuationBlock^0) - * (parsers.blanklines / "\n\n") - ) / self.parser_functions.parse_blocks_nested + return parsers.add_indent(starter, "li") + * parsers.indented_content_loose + * remove_indent("li") end local function roman2number(roman) - local romans = { ["L"] = 50, ["X"] = 10, ["V"] = 5, ["I"] = 1 } + local romans = { ["M"] = 1000, ["D"] = 500, ["C"] = 100, ["L"] = 50, ["X"] = 10, ["V"] = 5, ["I"] = 1 } local numeral = 0 local i = 1 @@ -26425,8 +30414,7 @@ M.extensions.fancy_lists = function() return numeral end - local function sniffstyle(itemprefix) - local numstr, delimend = itemprefix:match("^([A-Za-z0-9]*)([.)]*)") + local function sniffstyle(numstr, delimend) local numdelim if delimend == ")" then numdelim = "OneParen" @@ -26435,46 +30423,72 @@ M.extensions.fancy_lists = function() else numdelim = "Default" end - numstr = numstr or itemprefix local num - num = numstr:match("^([IVXL]+)") + num = numstr:match("^([I])$") if num then return roman2number(num), "UpperRoman", numdelim end - num = numstr:match("^([ivxl]+)") + num = numstr:match("^([i])$") if num then return roman2number(string.upper(num)), "LowerRoman", numdelim end - num = numstr:match("^([A-Z])") + num = numstr:match("^([A-Z])$") if num then return string.byte(num) - string.byte("A") + 1, "UpperAlpha", numdelim end - num = numstr:match("^([a-z])") + num = numstr:match("^([a-z])$") if num then return string.byte(num) - string.byte("a") + 1, "LowerAlpha", numdelim end + num = numstr:match("^([IVXLCDM]+)") + if num then + return roman2number(num), "UpperRoman", numdelim + end + num = numstr:match("^([ivxlcdm]+)") + if num then + return roman2number(string.upper(num)), "LowerRoman", numdelim + end return math.floor(tonumber(numstr) or 1), "Decimal", numdelim end local function fancylist(items,tight,start) - local startnum, numstyle, numdelim = sniffstyle(start) + local startnum, numstyle, numdelim = sniffstyle(start[2][1], start[2][2]) return writer.fancylist(items,tight, - options.startNumber and startnum, + options.startNumber and startnum or 1, numstyle or "Decimal", numdelim or "Default") end - local FancyList = Cg(enumerator, "listtype") * - ( Ct(TightListItem(Cb("listtype")) - * TightListItem(enumerator)^0) - * Cc(true) * parsers.skipblanklines * -enumerator - + Ct(LooseListItem(Cb("listtype")) - * LooseListItem(enumerator)^0) - * Cc(false) * parsers.skipblanklines - ) * Cb("listtype") / fancylist + local FancyListOfType = function(start_marker, continuation_marker, delimiter_type) + local enumerator_start = enumerator(start_marker, continuation_marker, delimiter_type) + local enumerator_cont = enumerator(continuation_marker, continuation_marker, delimiter_type) + return Cg(enumerator_start, "listtype") + * (Ct( TightListItem(Cb("listtype")) + * ((parsers.check_minimal_indent / "") * TightListItem(enumerator_cont))^0) + * Cc(true) + * -#((parsers.conditionally_indented_blankline^0 / "") + * parsers.check_minimal_indent * enumerator_cont) + + Ct( LooseListItem(Cb("listtype")) + * ((parsers.conditionally_indented_blankline^0 / "") + * (parsers.check_minimal_indent / "") * LooseListItem(enumerator_cont))^0) + * Cc(false) + ) * Ct(Cb("listtype")) / fancylist + end + + local FancyList = join_table_with_func(FancyListOfType, markers_table) + + local Endline = parsers.newline + * (parsers.check_minimal_indent + * -parsers.EndlineExceptions + + parsers.check_optional_indent + * -parsers.EndlineExceptions + * -starter) + * parsers.spacechar^0 + / writer.soft_line_break self.update_rule("OrderedList", FancyList) + self.update_rule("Endline", Endline) end } end @@ -26523,7 +30537,7 @@ M.extensions.fenced_code = function(blank_before_code_fence, end local name = util.cache_verbatim(options.cacheDir, s) table.insert(buf, {"\\markdownRendererInputFencedCode{", - name,"}{",self.string(i),"}"}) + name,"}{",self.string(i),"}{",self.infostring(i),"}"}) if attr ~= nil then table.insert(buf, "\\markdownRendererFencedCodeAttributeContextEnd") end @@ -26556,18 +30570,52 @@ M.extensions.fenced_code = function(blank_before_code_fence, return #a >= #b and i end - local tilde_infostring - = C((parsers.linechar - - (parsers.spacechar^1 * parsers.newline))^0) + local function strip_enclosing_whitespaces(str) + return str:gsub("^%s*(.-)%s*$", "%1") + end + + local tilde_infostring = Cs(Cs((V("HtmlEntity") + + parsers.anyescaped + - parsers.newline)^0) + / strip_enclosing_whitespaces) - local backtick_infostring - = C((parsers.linechar - - (parsers.backtick - + parsers.spacechar^1 * parsers.newline))^0) + local backtick_infostring = Cs(Cs((V("HtmlEntity") + + (-#(parsers.backslash * parsers.backtick) * parsers.anyescaped) + - parsers.newline + - parsers.backtick)^0) + / strip_enclosing_whitespaces) local fenceindent + + local function has_trail(indent_table) + return indent_table ~= nil and + indent_table.trail ~= nil and + next(indent_table.trail) ~= nil + end + + local function has_indents(indent_table) + return indent_table ~= nil and + indent_table.indents ~= nil and + next(indent_table.indents) ~= nil + end + + local function get_last_indent_name(indent_table) + if has_indents(indent_table) then + return indent_table.indents[#indent_table.indents].name + end + end + + local function count_fenced_start_indent(_, _, indent_table, trail) + local last_indent_name = get_last_indent_name(indent_table) + fenceindent = 0 + if last_indent_name ~= "li" then + fenceindent = #trail + end + return true + end + local fencehead = function(char, infostring) - return C(parsers.nonindentspace) / function(s) fenceindent = #s end + return Cmt(Cb("indent_info") * parsers.check_trail, count_fenced_start_indent) * Cg(char^3, "fencelength") * parsers.optionalspace * infostring @@ -26575,52 +30623,69 @@ M.extensions.fenced_code = function(blank_before_code_fence, end local fencetail = function(char) - return parsers.nonindentspace + return parsers.check_trail_no_rem * Cmt(C(char^3) * Cb("fencelength"), captures_geq_length) * parsers.optionalspace * (parsers.newline + parsers.eof) + parsers.eof end - local fencedline = function(char) - return C(parsers.line - fencetail(char)) - / function(s) - local i = 1 - local remaining = fenceindent - while true do - local c = s:sub(i, i) - if c == " " and remaining > 0 then - remaining = remaining - 1 - i = i + 1 - elseif c == "\t" and remaining > 3 then - remaining = remaining - 4 - i = i + 1 - else - break - end - end - return s:sub(i) - end + local function process_fenced_line(s, i, indent_table, line_content, is_blank) -- luacheck: ignore s i + local remainder = "" + if has_trail(indent_table) then + remainder = indent_table.trail.internal_remainder + end + + if is_blank and get_last_indent_name(indent_table) == "li" then + remainder = "" + end + + local str = remainder .. line_content + local index = 1 + local remaining = fenceindent + + while true do + local c = str:sub(index, index) + if c == " " and remaining > 0 then + remaining = remaining - 1 + index = index + 1 + elseif c == "\t" and remaining > 3 then + remaining = remaining - 4 + index = index + 1 + else + break + end + end + + return true, str:sub(index) + end + + local fencedline = function(char) + return Cmt(Cb("indent_info") * C(parsers.line - fencetail(char)) * Cc(false), process_fenced_line) end + local blankfencedline = Cmt(Cb("indent_info") * C(parsers.blankline) * Cc(true), process_fenced_line) + local TildeFencedCode = fencehead(parsers.tilde, tilde_infostring) - * Cs(fencedline(parsers.tilde)^0) - * fencetail(parsers.tilde) + * Cs(((parsers.check_minimal_blank_indent / "") * blankfencedline + + (parsers.check_minimal_indent / "") * fencedline(parsers.tilde))^0) + * ((parsers.check_minimal_indent / "") * fencetail(parsers.tilde) + parsers.succeed) local BacktickFencedCode = fencehead(parsers.backtick, backtick_infostring) - * Cs(fencedline(parsers.backtick)^0) - * fencetail(parsers.backtick) + * Cs(((parsers.check_minimal_blank_indent / "") * blankfencedline + + (parsers.check_minimal_indent / "") * fencedline(parsers.backtick))^0) + * ((parsers.check_minimal_indent / "") * fencetail(parsers.backtick) + parsers.succeed) - local infostring_with_attributes - = Ct(C((parsers.linechar - - ( parsers.optionalspace - * parsers.attributes))^0) - * parsers.optionalspace - * Ct(parsers.attributes)) + local infostring_with_attributes + = Ct(C((parsers.linechar + - ( parsers.optionalspace + * parsers.attributes))^0) + * parsers.optionalspace + * Ct(parsers.attributes)) local FencedCode - = (TildeFencedCode + BacktickFencedCode) + = ((TildeFencedCode + BacktickFencedCode) / function(infostring, code) local expanded_code = self.expandtabs(code) @@ -26641,7 +30706,7 @@ M.extensions.fenced_code = function(blank_before_code_fence, end end return writer.fencedCode(expanded_code, infostring, attr) - end + end) self.insert_pattern("Block after Verbatim", FencedCode, "FencedCode") @@ -26695,7 +30760,7 @@ M.extensions.fenced_divs = function(blank_before_div_fence) function self.div_begin(attributes) local start_output = {"\\markdownRendererFencedDivAttributeContextBegin\n", self.attributes(attributes)} - local end_output = {"\n\\markdownRendererFencedDivAttributeContextEnd "} + local end_output = {"\\markdownRendererFencedDivAttributeContextEnd "} return self.push_attributes("div", attributes, start_output, end_output) end % \end{macrocode} @@ -26760,6 +30825,31 @@ M.extensions.fenced_divs = function(blank_before_div_fence) return Cg( Cmt(Cb("div_level"), update_div_level) , "div_level") end + + local non_fenced_div_block = parsers.check_minimal_indent * V("Block") + - parsers.check_minimal_indent_and_trail * fenced_div_end + + local non_fenced_div_paragraph = parsers.check_minimal_indent * V("Paragraph") + - parsers.check_minimal_indent_and_trail * fenced_div_end + + local blank = parsers.minimally_indented_blank + + local block_separated = parsers.block_sep_group(blank) + * non_fenced_div_block + + local loop_body_pair = parsers.create_loop_body_pair(block_separated, + non_fenced_div_paragraph, + parsers.block_sep_group(blank), + parsers.par_sep_group(blank)) + + local content_loop = ( non_fenced_div_block + * loop_body_pair.block^0 + + non_fenced_div_paragraph + * block_separated + * loop_body_pair.block^0 + + non_fenced_div_paragraph + * loop_body_pair.par^0) + * blank^0 local FencedDiv = fenced_div_begin / function (infostring) @@ -26772,14 +30862,9 @@ M.extensions.fenced_divs = function(blank_before_div_fence) / writer.div_begin * increment_div_level(1) * parsers.skipblanklines - * Ct( (V("Block") - fenced_div_end)^-1 - * ( parsers.blanklines - / function() - return writer.interblocksep - end - * (V("Block") - fenced_div_end))^0) - * parsers.skipblanklines - * fenced_div_end * increment_div_level(-1) + * Ct(content_loop) + * parsers.minimally_indented_blank^0 + * parsers.check_minimal_indent_and_trail * fenced_div_end * increment_div_level(-1) * (Cc("") / writer.div_end) self.insert_pattern("Block after Verbatim", @@ -26791,8 +30876,9 @@ M.extensions.fenced_divs = function(blank_before_div_fence) % \par % \begin{markdown} % -% Patch blockquotes, so that they allow the end of a fenced div immediately -% afterwards. +% If the `blank_before_div_fence` parameter is `false`, we will have the +% closing div at the beginning of a line break the current paragraph if +% we are currently nested in a div. % % \end{markdown} % \begin{macrocode} @@ -26804,23 +30890,6 @@ M.extensions.fenced_divs = function(blank_before_div_fence) local is_inside_div = Cmt(Cb("div_level"), check_div_level) local fencestart = is_inside_div * fenced_div_end - self.update_rule("BlockquoteExceptions", function(previous_pattern) - if previous_pattern == nil then - previous_pattern = parsers.BlockquoteExceptions - end - return previous_pattern + fencestart - end) - -% \end{macrocode} -% \par -% \begin{markdown} -% -% If the `blank_before_div_fence` parameter is `false`, we will have the -% closing div at the beginning of a line break the current paragraph if -% we are currently nested in a div. -% -% \end{markdown} -% \begin{macrocode} if not blank_before_div_fence then self.update_rule("EndlineExceptions", function(previous_pattern) if previous_pattern == nil then @@ -26850,47 +30919,58 @@ M.extensions.header_attributes = function() local parsers = self.parsers local writer = self.writer + local function strip_atx_end(s) + return s:gsub("%s+#*%s*$","") + end + local AtxHeading = Cg(parsers.heading_start, "level") * parsers.optionalspace * (C(((parsers.linechar - - ((parsers.hash^1 + - (parsers.attributes * parsers.optionalspace - * parsers.attributes^-1 - + parsers.attributes) - * parsers.optionalspace - * parsers.newline)) - * (parsers.linechar - - parsers.hash - - parsers.lbrace)^0)^1) - / self.parser_functions.parse_inlines) + * parsers.newline)) + * (parsers.linechar + - parsers.lbrace)^0)^1) + / strip_atx_end + / parsers.parse_heading_text) * Cg(Ct(parsers.newline - + (parsers.hash^1 + + (parsers.attributes * parsers.optionalspace - * parsers.attributes^-1 - + parsers.attributes) - * parsers.optionalspace - * parsers.newline), "attributes") + * parsers.newline)), "attributes") * Cb("level") * Cb("attributes") / writer.heading - local SetextHeading = #(parsers.line * S("=-")) - * (C(((parsers.linechar - - (parsers.attributes - * parsers.optionalspace - * parsers.newline)) - * (parsers.linechar - - parsers.lbrace)^0)^1) - / self.parser_functions.parse_inlines) - * Cg(Ct(parsers.newline - + (parsers.attributes - * parsers.optionalspace - * parsers.newline)), "attributes") - * parsers.heading_level - * Cb("attributes") - * parsers.optionalspace - * parsers.newline - / writer.heading + local function strip_trailing_spaces(s) + return s:gsub("%s*$","") + end + + local heading_line = (parsers.linechar + - (parsers.attributes + * parsers.optionalspace + * parsers.newline))^1 + - parsers.thematic_break_lines + + local heading_text = heading_line + * ((V("Endline") / "\n") * (heading_line - parsers.heading_level))^0 + * parsers.newline^-1 + + local SetextHeading = parsers.freeze_trail * parsers.check_trail_no_rem + * #(heading_text + * (parsers.attributes + * parsers.optionalspace + * parsers.newline)^-1 + * parsers.check_minimal_indent * parsers.check_trail * parsers.heading_level) + * Cs(heading_text) / strip_trailing_spaces + / parsers.parse_heading_text + * Cg(Ct((parsers.attributes + * parsers.optionalspace + * parsers.newline)^-1), "attributes") + * parsers.check_minimal_indent_and_trail * parsers.heading_level + * Cb("attributes") + * parsers.newline + * parsers.unfreeze_trail + / writer.heading local Heading = AtxHeading + SetextHeading self.update_rule("Heading", Heading) @@ -26985,6 +31065,48 @@ end % \end{macrocode} % \begin{markdown} % +%#### Marked text +% +% The \luamdef{extensions.mark} function implements the Pandoc mark syntax +% extension. +% +% \end{markdown} +% \begin{macrocode} +M.extensions.mark = function() + return { + name = "built-in mark syntax extension", + extend_writer = function(self) +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->mark} as a function that will transform an input +% marked text `s` to the output format. +% +% \end{markdown} +% \begin{macrocode} + function self.mark(s) + if self.flatten_inlines then return s end + return {"\\markdownRendererMark{", s, "}"} + end + end, extend_reader = function(self) + local parsers = self.parsers + local writer = self.writer + + local doubleequals = P("==") + + local Mark = parsers.between(V("Inline"), doubleequals, doubleequals) + / function (inlines) return writer.mark(inlines) end + + self.add_special_character("=") + self.insert_pattern("Inline before LinkAndEmph", + Mark, "Mark") + end + } +end +% \end{macrocode} +% \begin{markdown} +% %#### Link Attributes % % The \luamdef{extensions.link_attributes} function implements the Pandoc @@ -26998,7 +31120,6 @@ M.extensions.link_attributes = function() extend_writer = function() end, extend_reader = function(self) local parsers = self.parsers - local writer = self.writer local options = self.options % \end{macrocode} @@ -27008,13 +31129,15 @@ M.extensions.link_attributes = function() % % \end{markdown} % \begin{macrocode} - - local define_reference_parser = parsers.define_reference_parser - * ( parsers.spnl - * Ct(parsers.attributes))^-1 + local define_reference_parser = (parsers.check_trail / "") * parsers.link_label * parsers.colon + * parsers.spnlc * parsers.url + * ( parsers.spnlc_sep * parsers.title * (parsers.spnlc * Ct(parsers.attributes)) + * parsers.only_blank + + parsers.spnlc_sep * parsers.title * parsers.only_blank + + Cc("") * (parsers.spnlc * Ct(parsers.attributes)) * parsers.only_blank + + Cc("") * parsers.only_blank) local ReferenceWithAttributes = define_reference_parser - * parsers.blankline^1 / self.register_link self.update_rule("Reference", ReferenceWithAttributes) @@ -27027,93 +31150,10 @@ M.extensions.link_attributes = function() % \end{markdown} % \begin{macrocode} - local function indirect_link(label, sps, tag, - attribute_text, - attributes) - return writer.defer_call(function() - local r, fallback = self.lookup_reference(label, sps, tag, - attributes) - if r then - return writer.link( - self.parser_functions.parse_inlines_no_link(label), - r.url, r.title, r.attributes) - else - local buf = {fallback} - if attributes then - table.insert(buf, writer.string(attribute_text)) - end - return buf - end - end) - end - - local DirectLinkWithAttributes = parsers.direct_link - * (Ct(parsers.attributes))^-1 - / writer.link - - local IndirectLinkWithAttributes = parsers.indirect_link - * (C(Ct(parsers.attributes)))^-1 - / indirect_link - - local LinkWithAttributes = DirectLinkWithAttributes - + IndirectLinkWithAttributes - -% \end{macrocode} -% \begin{markdown} -% -% Here, we directly update the `Link` grammar rule to keep the -% method \luamref{reader->parser_functions.parse_inlines_no_link} -% aware of `LinkWithAttributes` and prevent nested links. -% -% If we used \luamref{reader->insert_pattern} instead of -% \luamref{reader->update_rule}, this correspondence would have -% been lost and link text would be able to contain nested links. -% -% \end{markdown} -% \begin{macrocode} - self.update_rule("Link", LinkWithAttributes) - -% \end{macrocode} -% \begin{markdown} -% -% The following patterns define direct and indirect images with attributes. -% -% \end{markdown} -% \begin{macrocode} - - local function indirect_image(label, sps, tag, - attribute_text, - attributes) - return writer.defer_call(function() - local r, fallback = self.lookup_reference(label, sps, tag, - attributes) - if r then - return writer.image(writer.string(label), - r.url, r.title, r.attributes) - else - local buf = {"!", fallback} - if attributes then - table.insert(buf, writer.string(attribute_text)) - end - return buf - end - end) - end - - local DirectImageWithAttributes = parsers.direct_image - * Ct(parsers.attributes) - / writer.image - - local IndirectImageWithAttributes = parsers.indirect_image - * C(Ct(parsers.attributes)) - / indirect_image + local LinkWithAttributesAndEmph = Ct(parsers.link_and_emph_table * Cg(Cc(true), "match_link_attributes")) + / self.defer_link_and_emphasis_processing - local ImageWithAttributes = DirectImageWithAttributes - + IndirectImageWithAttributes - - self.insert_pattern("Inline before Image", - ImageWithAttributes, - "ImageWithAttributes") + self.update_rule("LinkAndEmph", LinkWithAttributesAndEmph) % \end{macrocode} % \begin{markdown} @@ -27122,7 +31162,6 @@ M.extensions.link_attributes = function() % % \end{markdown} % \begin{macrocode} - local AutoLinkUrlWithAttributes = parsers.auto_link_url * Ct(parsers.attributes) @@ -27186,6 +31225,7 @@ M.extensions.notes = function(notes, inline_notes) % \end{markdown} % \begin{macrocode} function self.note(s) + if self.flatten_inlines then return "" end return {"\\markdownRendererNote{",s,"}"} end end, extend_reader = function(self) @@ -27195,10 +31235,10 @@ M.extensions.notes = function(notes, inline_notes) if inline_notes then local InlineNote = parsers.circumflex - * (parsers.tag / self.parser_functions.parse_inlines_no_inline_note) + * (parsers.link_label / self.parser_functions.parse_inlines_no_inline_note) / writer.note - self.insert_pattern("Inline after Emph", + self.insert_pattern("Inline after LinkAndEmph", InlineNote, "InlineNote") end if notes then @@ -27208,7 +31248,7 @@ M.extensions.notes = function(notes, inline_notes) local RawNoteRef = #(parsers.lbracket * parsers.circumflex) - * parsers.tag / strip_first_char + * parsers.link_label / strip_first_char local rawnotes = {} @@ -27227,21 +31267,36 @@ M.extensions.notes = function(notes, inline_notes) end local function register_note(ref,rawnote) - rawnotes[self.normalize_tag(ref)] = rawnote + local normalized_tag = self.normalize_tag(ref) + if rawnotes[normalized_tag] == nil then + rawnotes[normalized_tag] = rawnote + end return "" end local NoteRef = RawNoteRef / lookup_note + local optionally_indented_line = parsers.check_optional_indent_and_any_trail * parsers.line + + local blank = parsers.check_optional_blank_indent_and_any_trail * parsers.optionalspace * parsers.newline + + local chunk = Cs(parsers.line * (optionally_indented_line - blank)^0) + + local indented_blocks = function(bl) + return Cs( bl + * (blank^1 * (parsers.check_optional_indent / "") + * parsers.check_code_trail * -parsers.blankline * bl)^0) + end + local NoteBlock - = parsers.leader * RawNoteRef * parsers.colon - * parsers.spnl * parsers.indented_blocks(parsers.chunk) + = parsers.check_trail_no_rem * RawNoteRef * parsers.colon + * parsers.spnlc * indented_blocks(chunk) / register_note - local Blank = NoteBlock + parsers.Blank - self.update_rule("Blank", Blank) + local Reference = NoteBlock + parsers.Reference - self.insert_pattern("Inline after Emph", + self.update_rule("Reference", Reference) + self.insert_pattern("Inline before LinkAndEmph", NoteRef, "NoteRef") end @@ -27257,11 +31312,13 @@ end % The \luamdef{extensions.pipe_table} function implements the \acro{PHP} % Markdown table syntax extension (also known as pipe tables in Pandoc). When % the `table_captions` parameter is `true`, the function also implements the -% Pandoc table caption syntax extension for table captions. +% Pandoc table caption syntax extension for table captions. When the +% `table_attributes` parameter is also `true`, the function also +% allows attributes to be attached to the (possibly empty) table captions. % % \end{markdown} % \begin{macrocode} -M.extensions.pipe_tables = function(table_captions) +M.extensions.pipe_tables = function(table_captions, table_attributes) local function make_pipe_table_rectangular(rows) local num_columns = #rows[2] @@ -27329,10 +31386,18 @@ M.extensions.pipe_tables = function(table_captions) % % \end{markdown} % \begin{macrocode} - function self.table(rows, caption) + function self.table(rows, caption, attributes) if not self.is_writing then return "" end - local buffer = {"\\markdownRendererTable{", - caption or "", "}{", #rows - 1, "}{", #rows[1], "}"} + local buffer = {} + if attributes ~= nil then + table.insert(buffer, + "\\markdownRendererTableAttributeContextBegin\n") + table.insert(buffer, self.attributes(attributes)) + end + table.insert(buffer, + {"\\markdownRendererTable{", + caption or "", "}{", #rows - 1, "}{", + #rows[1], "}"}) local temp = rows[2] -- put alignments on the first row rows[2] = rows[1] rows[1] = temp @@ -27349,6 +31414,10 @@ M.extensions.pipe_tables = function(table_captions) end table.insert(buffer, "}") end + if attributes ~= nil then + table.insert(buffer, + "\\markdownRendererTableAttributeContextEnd{}") + end return buffer end end, extend_reader = function(self) @@ -27378,31 +31447,65 @@ M.extensions.pipe_tables = function(table_captions) , table_hline_separator , table_hline_column) - local table_caption_beginning = parsers.skipblanklines - * parsers.nonindentspace + local table_caption_beginning = (parsers.check_minimal_blank_indent_and_any_trail_no_rem + * parsers.optionalspace * parsers.newline)^0 + * parsers.check_minimal_indent_and_trail * (P("Table")^-1 * parsers.colon) * parsers.optionalspace + local function strip_trailing_spaces(s) + return s:gsub("%s*$","") + end + local table_row = pipe_table_row(true , (C((parsers.linechar - parsers.pipe)^1) + / strip_trailing_spaces / self.parser_functions.parse_inlines) , parsers.pipe , (C((parsers.linechar - parsers.pipe)^0) + / strip_trailing_spaces / self.parser_functions.parse_inlines)) local table_caption if table_captions then table_caption = #table_caption_beginning * table_caption_beginning - * Ct(parsers.IndentedInline^1) - * parsers.newline + if table_attributes then + table_caption = table_caption + * (C(((( parsers.linechar + - (parsers.attributes + * parsers.optionalspace + * parsers.newline + * -#( parsers.optionalspace + * parsers.linechar))) + + ( parsers.newline + * #( parsers.optionalspace + * parsers.linechar) + * C(parsers.optionalspace) / writer.space)) + * (parsers.linechar + - parsers.lbrace)^0)^1) + / self.parser_functions.parse_inlines) + * (parsers.newline + + ( Ct(parsers.attributes) + * parsers.optionalspace + * parsers.newline)) + else + table_caption = table_caption + * C(( parsers.linechar + + ( parsers.newline + * #( parsers.optionalspace + * parsers.linechar) + * C(parsers.optionalspace) / writer.space))^1) + / self.parser_functions.parse_inlines + * parsers.newline + end else table_caption = parsers.fail end - local PipeTable = Ct(table_row * parsers.newline - * table_hline - * (parsers.newline * table_row)^0) + local PipeTable = Ct(table_row * parsers.newline * (parsers.check_minimal_indent_and_trail / {}) + * table_hline * parsers.newline + * ((parsers.check_minimal_indent / {}) * table_row * parsers.newline)^0) / make_pipe_table_rectangular * table_caption^-1 / writer.table @@ -27439,6 +31542,7 @@ M.extensions.raw_inline = function() % \begin{macrocode} function self.rawInline(s, attr) if not self.is_writing then return "" end + if self.flatten_inlines then return s end local name = util.cache_verbatim(options.cacheDir, s) return {"\\markdownRendererInputRawInline{", name,"}{", self.string(attr),"}"} @@ -27479,6 +31583,7 @@ M.extensions.strike_through = function() % \end{markdown} % \begin{macrocode} function self.strike_through(s) + if self.flatten_inlines then return s end return {"\\markdownRendererStrikeThrough{",s,"}"} end end, extend_reader = function(self) @@ -27490,7 +31595,7 @@ M.extensions.strike_through = function() parsers.doubletildes) ) / writer.strike_through - self.insert_pattern("Inline after Emph", + self.insert_pattern("Inline after LinkAndEmph", StrikeThrough, "StrikeThrough") self.add_special_character("~") @@ -27521,6 +31626,7 @@ M.extensions.subscripts = function() % \end{markdown} % \begin{macrocode} function self.subscript(s) + if self.flatten_inlines then return s end return {"\\markdownRendererSubscript{",s,"}"} end end, extend_reader = function(self) @@ -27531,7 +31637,7 @@ M.extensions.subscripts = function() parsers.between(parsers.Str, parsers.tilde, parsers.tilde) ) / writer.subscript - self.insert_pattern("Inline after Emph", + self.insert_pattern("Inline after LinkAndEmph", Subscript, "Subscript") self.add_special_character("~") @@ -27562,6 +31668,7 @@ M.extensions.superscripts = function() % \end{markdown} % \begin{macrocode} function self.superscript(s) + if self.flatten_inlines then return s end return {"\\markdownRendererSuperscript{",s,"}"} end end, extend_reader = function(self) @@ -27572,7 +31679,7 @@ M.extensions.superscripts = function() parsers.between(parsers.Str, parsers.circumflex, parsers.circumflex) ) / writer.superscript - self.insert_pattern("Inline after Emph", + self.insert_pattern("Inline after LinkAndEmph", Superscript, "Superscript") self.add_special_character("^") @@ -27582,7 +31689,7 @@ end % \end{macrocode} % \begin{markdown} % -%#### Tex Math +%#### \TeX{} Math % % The \luamdef{extensions.tex_math} function implements the Pandoc math % syntax extensions. @@ -27605,7 +31712,7 @@ M.extensions.tex_math = function(tex_math_dollars, % \end{markdown} % \begin{macrocode} function self.display_math(s) - if not self.is_writing then return "" end + if self.flatten_inlines then return s end return {"\\markdownRendererDisplayMath{",self.math(s),"}"} end % \end{macrocode} @@ -27617,7 +31724,7 @@ M.extensions.tex_math = function(tex_math_dollars, % \end{markdown} % \begin{macrocode} function self.inline_math(s) - if not self.is_writing then return "" end + if self.flatten_inlines then return s end return {"\\markdownRendererInlineMath{",self.math(s),"}"} end end, extend_reader = function(self) @@ -27625,11 +31732,19 @@ M.extensions.tex_math = function(tex_math_dollars, local writer = self.writer local function between(p, starter, ender) - return (starter * C(p * (p - ender)^0) * ender) + return (starter * Cs(p * (p - ender)^0) * ender) + end + + local function strip_preceding_whitespaces(str) + return str:gsub("^%s*(.-)$", "%1") end local allowed_before_closing = B( parsers.backslash * parsers.any - + parsers.any * (parsers.nonspacechar - parsers.backslash)) + + parsers.any * (parsers.any - parsers.backslash)) + + local allowed_before_closing_no_space = B( parsers.backslash * parsers.any + + parsers.any * (parsers.nonspacechar - parsers.backslash)) + % \end{macrocode} % \begin{markdown} % @@ -27637,19 +31752,20 @@ M.extensions.tex_math = function(tex_math_dollars, % % \end{markdown} % \begin{macrocode} - local dollar_math_content = parsers.backslash^-1 - * parsers.any + local dollar_math_content = (parsers.newline * (parsers.check_optional_indent / "") + + parsers.backslash^-1 + * parsers.linechar) - parsers.blankline^2 - parsers.dollar local inline_math_opening_dollars = parsers.dollar * #(parsers.nonspacechar) - local inline_math_closing_dollars = allowed_before_closing + local inline_math_closing_dollars = allowed_before_closing_no_space * parsers.dollar * -#(parsers.digit) - local inline_math_dollars = between(C( dollar_math_content), + local inline_math_dollars = between(Cs( dollar_math_content), inline_math_opening_dollars, inline_math_closing_dollars) @@ -27659,7 +31775,7 @@ M.extensions.tex_math = function(tex_math_dollars, local display_math_closing_dollars = parsers.dollar * parsers.dollar - local display_math_dollars = between(C( dollar_math_content), + local display_math_dollars = between(Cs( dollar_math_content), display_math_opening_dollars, display_math_closing_dollars) % \end{macrocode} @@ -27670,7 +31786,8 @@ M.extensions.tex_math = function(tex_math_dollars, % % \end{markdown} % \begin{macrocode} - local backslash_math_content = parsers.any + local backslash_math_content = (parsers.newline * (parsers.check_optional_indent / "") + + parsers.linechar) - parsers.blankline^2 % \end{macrocode} % \begin{markdown} @@ -27683,29 +31800,32 @@ M.extensions.tex_math = function(tex_math_dollars, local inline_math_opening_double = parsers.backslash * parsers.backslash * parsers.lparent - * #(parsers.nonspacechar) local inline_math_closing_double = allowed_before_closing + * parsers.spacechar^0 * parsers.backslash * parsers.backslash * parsers.rparent - local inline_math_double = between(C( backslash_math_content), + local inline_math_double = between(Cs( backslash_math_content), inline_math_opening_double, inline_math_closing_double) + / strip_preceding_whitespaces local display_math_opening_double = parsers.backslash * parsers.backslash * parsers.lbracket local display_math_closing_double = allowed_before_closing + * parsers.spacechar^0 * parsers.backslash * parsers.backslash * parsers.rbracket - local display_math_double = between(C( backslash_math_content), + local display_math_double = between(Cs( backslash_math_content), display_math_opening_double, display_math_closing_double) + / strip_preceding_whitespaces % \end{macrocode} % \begin{markdown} % @@ -27716,26 +31836,29 @@ M.extensions.tex_math = function(tex_math_dollars, % \begin{macrocode} local inline_math_opening_single = parsers.backslash * parsers.lparent - * #(parsers.nonspacechar) local inline_math_closing_single = allowed_before_closing + * parsers.spacechar^0 * parsers.backslash * parsers.rparent - local inline_math_single = between(C( backslash_math_content), + local inline_math_single = between(Cs( backslash_math_content), inline_math_opening_single, inline_math_closing_single) + / strip_preceding_whitespaces local display_math_opening_single = parsers.backslash * parsers.lbracket local display_math_closing_single = allowed_before_closing + * parsers.spacechar^0 * parsers.backslash * parsers.rbracket - local display_math_single = between(C( backslash_math_content), + local display_math_single = between(Cs( backslash_math_content), display_math_opening_single, display_math_closing_single) + / strip_preceding_whitespaces local display_math = parsers.fail @@ -27759,7 +31882,7 @@ M.extensions.tex_math = function(tex_math_dollars, local TexMath = display_math / writer.display_math + inline_math / writer.inline_math - self.insert_pattern("Inline after Emph", + self.insert_pattern("Inline after LinkAndEmph", TexMath, "TexMath") if tex_math_dollars then @@ -27961,6 +32084,30 @@ function M.new(options) % \par % \begin{markdown} % +% If the singleton cache contains a conversion function for the same `options`, +% reuse it. +% +% \end{markdown} +% \begin{macrocode} + if options.singletonCache and singletonCache.convert then + for k, v in pairs(defaultOptions) do + if type(v) == "table" then + for i = 1, math.max(#singletonCache.options[k], #options[k]) do + if singletonCache.options[k][i] ~= options[k][i] then + goto miss + end + end + elseif singletonCache.options[k] ~= options[k] then + goto miss + end + end + return singletonCache.convert + end + ::miss:: +% \end{macrocode} +% \par +% \begin{markdown} +% % Apply built-in syntax extensions based on `options`. % % \end{markdown} @@ -28026,9 +32173,14 @@ function M.new(options) table.insert(extensions, line_block_extension) end + if options.mark then + local mark_extension = M.extensions.mark() + table.insert(extensions, mark_extension) + end + if options.pipeTables then local pipe_tables_extension = M.extensions.pipe_tables( - options.tableCaptions) + options.tableCaptions, options.tableAttributes) table.insert(extensions, pipe_tables_extension) end @@ -28062,19 +32214,9 @@ function M.new(options) table.insert(extensions, tex_math_extension) end -% \end{macrocode} -% \begin{markdown} -% -% The footnotes and inlineFootnotes option has been deprecated and will be -% removed in Markdown 3.0.0. -% -% \end{markdown} -% \begin{macrocode} - if options.footnotes or options.inlineFootnotes or - options.notes or options.inlineNotes then + if options.notes or options.inlineNotes then local notes_extension = M.extensions.notes( - options.footnotes or options.notes, - options.inlineFootnotes or options.inlineNotes) + options.notes, options.inlineNotes) table.insert(extensions, notes_extension) end @@ -28187,14 +32329,51 @@ function M.new(options) % \par % \begin{markdown} % -% Produce and return a conversion function from markdown to plain \TeX. +% Produce a conversion function from markdown to plain \TeX. % % \end{markdown} % \begin{macrocode} local writer = M.writer.new(options) local reader = M.reader.new(writer, options) local convert = reader.finalize_grammar(extensions) - +% \end{macrocode} +% \par +% \begin{markdown} +% +% Force garbage collection to reclaim memory for temporary +% objects created in \luamref{writer.new}, \luamref{reader.new}, +% and \luamref{reader->finalize_grammar}. +% +% \end{markdown} +% \begin{macrocode} + collectgarbage("collect") +% \end{macrocode} +% \par +% \begin{markdown} +% +% Update the singleton cache. +% +% \end{markdown} +% \begin{macrocode} + if options.singletonCache then + local singletonCacheOptions = {} + for k, v in pairs(options) do + singletonCacheOptions[k] = v + end + setmetatable(singletonCacheOptions, + { __index = function (_, key) + return defaultOptions[key] end }) + singletonCache.options = singletonCacheOptions + singletonCache.convert = convert + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Return the conversion function from markdown to plain \TeX. +% +% \end{markdown} +% \begin{macrocode} return convert end @@ -28246,9 +32425,8 @@ local kpse (function() local should_initialize = package.loaded.kpse == nil or tex.initialize ~= nil - local ran_ok - ran_ok, kpse = pcall(require, "kpse") - if ran_ok and should_initialize then + kpse = require("kpse") + if should_initialize then kpse.set_program_name("luatex") end end)() @@ -28276,6 +32454,14 @@ else assert(io.write(output)) end % \end{macrocode} +% \begin{markdown} +% Remove the `options.cacheDir` directory if it is empty. +% \end{markdown} +% \begin{macrocode} +if options.cacheDir then + lfs.rmdir(options["cacheDir"]) +end +% \end{macrocode} % \iffalse % %<*tex> @@ -28295,23 +32481,218 @@ end % % \end{markdown} % \begin{macrocode} -\ifx\markdownInfo\undefined - \def\markdownInfo#1{% - \immediate\write-1{(l.\the\inputlineno) markdown.tex info: #1.}}% -\fi -\ifx\markdownWarning\undefined - \def\markdownWarning#1{% - \immediate\write16{(l.\the\inputlineno) markdown.tex warning: #1}}% -\fi -\ifx\markdownError\undefined - \def\markdownError#1#2{% - \errhelp{#2.}% - \errmessage{(l.\the\inputlineno) markdown.tex error: #1}}% -\fi +\ExplSyntaxOn +\cs_if_free:NT + \markdownInfo + { + \cs_new:Npn + \markdownInfo #1 + { + \msg_info:nne + { markdown } + { generic-message } + { #1 } + } + } +\cs_if_free:NT + \markdownWarning + { + \cs_new:Npn + \markdownWarning #1 + { + \msg_warning:nne + { markdown } + { generic-message } + { #1 } + } + } +\cs_if_free:NT + \markdownError + { + \cs_new:Npn + \markdownError #1 #2 + { + \msg_error:nnee + { markdown } + { generic-message-with-help-text } + { #1 } + { #2 } + } + } +\msg_new:nnn + { markdown } + { generic-message } + { #1 } +\msg_new:nnnn + { markdown } + { generic-message-with-help-text } + { #1 } + { #2 } +\cs_generate_variant:Nn + \msg_info:nnn + { nne } +\cs_generate_variant:Nn + \msg_warning:nnn + { nne } +\cs_generate_variant:Nn + \msg_error:nnnn + { nnee } +\ExplSyntaxOff +% \end{macrocode} +% \par +% \begin{markdown} +% +%### Themes {#themes-implementation} +% +% This section implements the theme-loading mechanism and the built-in themes +% provided with the Markdown package. Futhermore, this section also implements +% the built-in plain \TeX{} themes provided with the Markdown package. +% +% \end{markdown} +% \begin{macrocode} +\ExplSyntaxOn +\prop_new:N \g_@@_plain_tex_loaded_themes_linenos_prop +\cs_new:Nn + \@@_plain_tex_load_theme:nn + { + \prop_get:NnNTF + \g_@@_plain_tex_loaded_themes_linenos_prop + { #1 } + \l_tmpa_tl + { + \msg_warning:nnnV + { markdown } + { repeatedly-loaded-plain-tex-theme } + { #1 } + \l_tmpa_tl + } + { + \msg_info:nnn + { markdown } + { loading-plain-tex-theme } + { #1 } + \prop_gput:Nnx + \g_@@_plain_tex_loaded_themes_linenos_prop + { #1 } + { \tex_the:D \tex_inputlineno:D } + \file_input:n + { markdown theme #2 } + } + } +\msg_new:nnn + { markdown } + { loading-plain-tex-theme } + { Loading~plain~TeX~Markdown~theme~#1 } +\msg_new:nnn + { markdown } + { repeatedly-loaded-plain-tex-theme } + { + Plain~TeX~Markdown~theme~#1~was~previously~ + loaded~on~line~#2,~not~loading~it~again + } +\cs_generate_variant:Nn + \prop_gput:Nnn + { Nnx } +\cs_gset_eq:NN + \@@_load_theme:nn + \@@_plain_tex_load_theme:nn +\cs_generate_variant:Nn + \@@_load_theme:nn + { nV } +% \end{macrocode} +% \begin{markdown} +% +% Developers can use the \mref{markdownLoadPlainTeXTheme} macro to load a +% corresponding plain \TeX{} theme from within themes for higher-level \TeX{} +% formats such as \LaTeX{} and \Hologo{ConTeXt}. +% +% \end{markdown} +% \begin{macrocode} +\cs_new:Npn + \markdownLoadPlainTeXTheme + { +% \end{macrocode} +% \begin{markdown} +% +% First, we extract the name of the current theme from the +% \mref{g_@@_current_theme_tl} macro. +% +% \end{markdown} +% \begin{macrocode} + \tl_set:NV + \l_tmpa_tl + \g_@@_current_theme_tl + \tl_reverse:N + \l_tmpa_tl + \tl_set:Ne + \l_tmpb_tl + { + \tl_tail:V + \l_tmpa_tl + } + \tl_reverse:N + \l_tmpb_tl +% \end{macrocode} +% \begin{markdown} +% +% Next, we munge the theme name. +% +% \end{markdown} +% \begin{macrocode} + \str_set:NV + \l_tmpa_str + \l_tmpb_tl + \str_replace_all:Nnn + \l_tmpa_str + { / } + { _ } +% \end{macrocode} +% \begin{markdown} +% +% Finally, we load the plain \TeX{} theme. +% +% \end{markdown} +% \begin{macrocode} + \@@_plain_tex_load_theme:VV + \l_tmpb_tl + \l_tmpa_str + } +\cs_generate_variant:Nn + \tl_set:Nn + { Ne } +\cs_generate_variant:Nn + \@@_plain_tex_load_theme:nn + { VV } +\ExplSyntaxOff % \end{macrocode} +% \iffalse +% +%<*themes-witiko-tilde> +% \fi % \par % \begin{markdown} % +% The `witiko/tilde` theme redefines the tilde token renderer prototype, +% so that it expands to a non-breaking space: +% +% \end{markdown} +% \begin{macrocode} +\markdownSetup { + rendererPrototypes = { + tilde = {~}, + }, +} +% \end{macrocode} +% \iffalse +% +%<*themes-witiko-markdown-defaults-tex> +% \fi +% \begin{markdown} +% +% The `witiko/markdown/defaults` plain \TeX{} theme provides default +% definitions for token renderer prototypes. See Section +% <#sec:tex-token-renderer-prototypes> for the actual definitions. +% %### Token Renderer Prototypes {#tex-token-renderer-prototypes} % % The following definitions should be considered placeholder. @@ -28319,7 +32700,10 @@ end % \end{markdown} % \begin{macrocode} \def\markdownRendererInterblockSeparatorPrototype{\par}% +\def\markdownRendererParagraphSeparatorPrototype{% + \markdownRendererInterblockSeparator}% \def\markdownRendererHardLineBreakPrototype{\hfil\break}% +\def\markdownRendererSoftLineBreakPrototype{ }% \let\markdownRendererEllipsisPrototype\dots \def\markdownRendererNbspPrototype{~}% \def\markdownRendererLeftBracePrototype{\char`\{}% @@ -28340,7 +32724,7 @@ end \def\markdownRendererContentBlockOnlineImagePrototype{% \markdownRendererImage}% \def\markdownRendererContentBlockCodePrototype#1#2#3#4#5{% - \markdownRendererInputFencedCode{#3}{#2}}% + \markdownRendererInputFencedCode{#3}{#2}{#2}}% \def\markdownRendererImagePrototype#1#2#3#4{#2}% \def\markdownRendererUlBeginPrototype{}% \def\markdownRendererUlBeginTightPrototype{}% @@ -28378,7 +32762,7 @@ end \def\markdownRendererLineBlockEndPrototype{\endgroup}% \def\markdownRendererInputVerbatimPrototype#1{% \par{\tt\input#1\relax{}}\par}% -\def\markdownRendererInputFencedCodePrototype#1#2{% +\def\markdownRendererInputFencedCodePrototype#1#2#3{% \markdownRendererInputVerbatim{#1}}% \def\markdownRendererHeadingOnePrototype#1{#1}% \def\markdownRendererHeadingTwoPrototype#1{#1}% @@ -28431,12 +32815,7 @@ end \markdownRendererHeaderAttributeContextEndPrototype \cs_gset:Npn \markdownRendererReplacementCharacterPrototype - { - % TODO: Replace with `\codepoint_generate:nn` in TeX Live 2023 - \sys_if_engine_pdftex:TF - { ^^ef^^bf^^bd } - { ^^^^fffd } - } + { \codepoint_str_generate:n { fffd } } \ExplSyntaxOff \def\markdownRendererSectionBeginPrototype{}% \def\markdownRendererSectionEndPrototype{}% @@ -28492,7 +32871,7 @@ end % \par % \begin{markdown} % -%#### YAML Metadata Renderer Prototypes {#expl3-yaml-metadata-implementation} +%#### YAML Metadata Renderer Prototypes % % To keep track of the current type of structure we inhabit when we are % traversing a \acro{yaml} document, we will maintain the @@ -28727,6 +33106,35 @@ end } \ExplSyntaxOff % \end{macrocode} +% \iffalse +% +%<*tex> +% \fi +% \begin{markdown} +% +% If plain \TeX{} is the top layer, we load the `witiko/markdown/defaults` +% plain \TeX{} theme with the default definitions for token renderer +% prototypes unless the option `noDefaults` has been enabled (see Section +% <#sec:plain>). +% +% \end{markdown} +% \begin{macrocode} +\ExplSyntaxOn +\str_if_eq:VVT + \c_@@_top_layer_tl + \c_@@_option_layer_plain_tex_tl + { + \ExplSyntaxOff + \@@_if_option:nF + { noDefaults } + { + \@@_setup:n + {theme = witiko/markdown/defaults} + } + \ExplSyntaxOn + } +\ExplSyntaxOff +% \end{macrocode} % \begin{markdown} % %### Lua Snippets @@ -28849,56 +33257,25 @@ end % \par % \begin{markdown} % -%### Buffering Markdown Input {#buffering} -% -% The -% \mdef{markdownIfOption}`{`\meta{name}`}{`\meta{iftrue}`}{`\meta{iffalse}`}` -% macro is provided for testing, whether the value of -% `\markdownOption`\meta{name} is `true`. If the value is `true`, then -% \meta{iftrue} is expanded, otherwise \meta{iffalse} is expanded. +% The \mdef{markdownCleanup} macro contains the Lua code that is executed +% after any conversion from markdown to plain \TeX{}. % % \end{markdown} % \begin{macrocode} -\ExplSyntaxOn -\prg_new_conditional:Nnn - \@@_if_option:n - { TF, T, F } - { - \@@_get_option_type:nN - { #1 } - \l_tmpa_tl - \str_if_eq:NNF - \l_tmpa_tl - \c_@@_option_type_boolean_tl - { - \msg_error:nnxx - { markdown } - { expected-boolean-option } - { #1 } - { \l_tmpa_tl } - } - \@@_get_option_value:nN - { #1 } - \l_tmpa_tl - \str_if_eq:NNTF - \l_tmpa_tl - \c_@@_option_value_true_tl - { \prg_return_true: } - { \prg_return_false: } - } -\msg_new:nnn - { markdown } - { expected-boolean-option } - { - Option~#1~has~type~#2,~ - but~a~boolean~was~expected. - } -\let\markdownIfOption=\@@_if_option:nTF -\ExplSyntaxOff +\def\markdownCleanup{% +% \end{macrocode} +% \begin{markdown} +% Remove the `options.cacheDir` directory if it is empty. +% \end{markdown} +% \begin{macrocode} + lfs.rmdir(cacheDir) +}% % \end{macrocode} % \par % \begin{markdown} % +%### Buffering Markdown Input {#buffering} +% % The macros \mdef{markdownInputFileStream} and \mdef{markdownOutputFileStream} % contain the number of the input and output file streams that will be used for % the IO operations of the package. @@ -29080,266 +33457,64 @@ end % \par % \begin{markdown} % -% The following two sections of the implementation have been deprecated and -% will be removed in Markdown 3.0.0. The code that corresponds to -% \mref{markdownMode} value of `3` will be the only implementation. +% Use the \pkg{lt3luabridge} library to define the \mdef{markdownLuaExecute} +% macro, which takes in a Lua scripts and expands to the standard output +% produced by its execution. % % \end{markdown} % \begin{macrocode} \ExplSyntaxOn -\int_compare:nT - { \markdownMode = 3 } +\cs_new:Npn + \markdownLuaExecute + #1 { - \markdownInfo{Using~mode~3:~The~lt3luabridge~package} - \file_input:n { lt3luabridge.tex } - \cs_new:Npn - \markdownLuaExecute - { \luabridgeExecute } + \int_compare:nNnT + { \g_luabridge_method_int } + = + { \c_luabridge_method_shell_int } + { + \sys_if_shell_unrestricted:F + { + \sys_if_shell:TF + { + \msg_error:nn + { markdown } + { restricted-shell-access } + } + { + \msg_error:nn + { markdown } + { disabled-shell-access } + } + } + } + \luabridge_now:e + { #1 } + } +\cs_generate_variant:Nn + \msg_new:nnnn + { nnnV } +\tl_set:Nn + \l_tmpa_tl + { + You~may~need~to~run~TeX~with~the~--shell-escape~or~the~ + --enable-write18~flag,~or~write~shell_escape=t~in~the~ + texmf.cnf~file. } +\msg_new:nnnV + { markdown } + { restricted-shell-access } + { Shell~escape~is~restricted } + \l_tmpa_tl +\msg_new:nnnV + { markdown } + { disabled-shell-access } + { Shell~escape~is~disabled } + \l_tmpa_tl \ExplSyntaxOff % \end{macrocode} % \begin{markdown} % -%### Lua Shell Escape Bridge {#lua-bridge} -% -% The following \TeX{} code is intended for \TeX{} engines that do not provide -% direct access to Lua, but expose the shell of the operating system. This -% corresponds to the \mref{markdownMode} values of `0` and `1`. -% -% The \mref{markdownLuaExecute} macro defined here and in Section -% <#sec:direct-lua> are meant to be indistinguishable to the remaining code. -% -% The package assumes that although the user is not using the Lua\TeX{} engine, -% their \TeX{} distribution contains it, and uses shell access to produce and -% execute Lua scripts using the \TeX{}Lua interpreter~[@luatex21, Section -% 4.1.1]. -% -% \end{markdown} -% \begin{macrocode} -\ifnum\markdownMode<2\relax -\ifnum\markdownMode=0\relax - \markdownWarning{Using mode 0: Shell escape via write18 - (deprecated, to be removed in Markdown 3.0.0)}% -\else - \markdownWarning{Using mode 1: Shell escape via os.execute - (deprecated, to be removed in Markdown 3.0.0)}% -\fi -% \end{macrocode} -% \par -% \begin{markdown} -% -% The \mdef{markdownExecuteShellEscape} macro contains the numeric value indicating -% whether the shell access is enabled (`1`), disabled (`0`), or restricted -% (`2`). -% -% Inherit the value of the `\pdfshellescape` (Lua\TeX{}, \Hologo{pdfTeX}) -% or the `\shellescape` (\Hologo{XeTeX}) commands. If neither of these -% commands is defined and Lua is available, attempt to access the -% `status.shell_escape` configuration item. -% -% If you cannot detect, whether the shell access is enabled, act as if it were. -% -% \end{markdown} -% \begin{macrocode} -\ifx\pdfshellescape\undefined - \ifx\shellescape\undefined - \ifnum\markdownMode=0\relax - \def\markdownExecuteShellEscape{1}% - \else - \def\markdownExecuteShellEscape{% - \directlua{tex.sprint(status.shell_escape or "1")}}% - \fi - \else - \let\markdownExecuteShellEscape\shellescape - \fi -\else - \let\markdownExecuteShellEscape\pdfshellescape -\fi -% \end{macrocode} -% \par -% \begin{markdown} -% -% The \mdef{markdownExecuteDirect} macro executes the code it has received as -% its first argument by writing it to the output file stream 18, if Lua is -% unavailable, or by using the Lua `os.execute` method otherwise. -% -% \end{markdown} -% \begin{macrocode} -\ifnum\markdownMode=0\relax - \def\markdownExecuteDirect#1{\immediate\write18{#1}}% -\else - \def\markdownExecuteDirect#1{% - \directlua{os.execute("\luaescapestring{#1}")}}% -\fi -% \end{macrocode} -% \par -% \begin{markdown} -% -% The \mdef{markdownExecute} macro is a wrapper on top of -% \mref{markdownExecuteDirect} that checks the value of -% \mref{markdownExecuteShellEscape} and prints an error message if the shell is -% inaccessible. -% -% \end{markdown} -% \begin{macrocode} -\def\markdownExecute#1{% - \ifnum\markdownExecuteShellEscape=1\relax - \markdownExecuteDirect{#1}% - \else - \markdownError{I can not access the shell}{Either run the TeX - compiler with the --shell-escape or the --enable-write18 flag, - or set shell_escape=t in the texmf.cnf file}% - \fi}% -% \end{macrocode} -% \par -% \begin{markdown} -% -% The \mdef{markdownLuaExecute} macro executes the Lua code it has received as -% its first argument. The Lua code may not directly interact with the \TeX{} -% engine, but it can use the `print` function in the same manner it -% would use the `tex.print` method. -% -% \end{markdown} -% \begin{macrocode} -\begingroup -% \end{macrocode} -% \begin{markdown} -% Swap the category code of the backslash symbol and the pipe symbol, so that -% we may use the backslash symbol freely inside the Lua code. -% \end{markdown} -% \begin{macrocode} - \catcode`|=0% - \catcode`\\=12% - |gdef|markdownLuaExecute#1{% -% \end{macrocode} -% \begin{markdown} -% Create the file \Opt{helperScriptFileName} and fill it with the -% input Lua code prepended with \pkg{kpathsea} initialization, so that Lua -% modules from the \TeX{} distribution are available. -% \end{markdown} -% \begin{macrocode} - |immediate|openout|markdownOutputFileStream=% - |markdownOptionHelperScriptFileName - |markdownInfo{Writing a helper Lua script to the file - "|markdownOptionHelperScriptFileName"}% - |immediate|write|markdownOutputFileStream{% - local ran_ok, error = pcall(function() -% \end{macrocode} -% \begin{markdown} -% -% If \pkg{Kpathsea} has not been loaded before or if Lua\TeX{} has not yet -% been initialized, configure \pkg{Kpathsea} on top of loading it. -% -% \end{markdown} -% \begin{macrocode} - local kpse - (function() - local should_initialize = package.loaded.kpse == nil - or tex.initialize - local ran_ok - ran_ok, kpse = pcall(require, "kpse") - if ran_ok and should_initialize then - kpse.set_program_name("luatex") - end - end)() - #1 - end) -% \end{macrocode} -% \begin{markdown} -% If there was an error, use the file \Opt{errorTempFileName} to -% store the error message. -% \end{markdown} -% \begin{macrocode} - if not ran_ok then - local file = io.open("% - |markdownOptionOutputDir - /|markdownOptionErrorTempFileName", "w") - if file then - file:write(error .. "\n") - file:close() - end - print('\\markdownError{An error was encountered while executing - Lua code}{For further clues, examine the file - "|markdownOptionOutputDir - /|markdownOptionErrorTempFileName"}') - end}% - |immediate|closeout|markdownOutputFileStream -% \end{macrocode} -% \begin{markdown} -% Execute the generated \Opt{helperScriptFileName} Lua script using -% the \TeX{}Lua binary and store the output in the -% \Opt{outputTempFileName} file. -% \end{markdown} -% \begin{macrocode} - |markdownInfo{Executing a helper Lua script from the file - "|markdownOptionHelperScriptFileName" and storing the result in the - file "|markdownOptionOutputTempFileName"}% - |markdownExecute{texlua "|markdownOptionOutputDir - /|markdownOptionHelperScriptFileName" > % - "|markdownOptionOutputDir - /|markdownOptionOutputTempFileName"}% -% \end{macrocode} -% \begin{markdown} -% `\input` the generated \Opt{outputTempFileName} file. -% \end{markdown} -% \begin{macrocode} - |input|markdownOptionOutputTempFileName|relax}% -|endgroup -% \end{macrocode} -% \par -% \begin{markdown} -% -%### Direct Lua Access {#direct-lua} -% -% The following \TeX{} code is intended for \TeX{} engines that provide -% direct access to Lua (Lua\TeX{}). The macro \mref{markdownLuaExecute} defined -% here and in Section <#sec:lua-bridge> are meant to be indistinguishable to -% the remaining code. This corresponds to the \mref{markdownMode} value of `2`. -% -% \end{markdown} -% \begin{macrocode} -\fi -\ifnum\markdownMode=2\relax - \markdownWarning{Using mode 2: Direct Lua access - (deprecated, to be removed in Markdown 3.0.0)}% -% \end{macrocode} -% \par -% \begin{markdown} -% -% The direct Lua access version of the \mref{markdownLuaExecute} macro is defined -% in terms of the `\directlua` primitive. The `print` function is set as -% an alias to the `tex.print` method in order to mimic the behaviour of the -% \mref{markdownLuaExecute} definition from Section <#sec:lua-bridge>, -% -% \end{markdown} -% \begin{macrocode} -\begingroup -% \end{macrocode} -% \begin{markdown} -% Swap the category code of the backslash symbol and the pipe symbol, so that -% we may use the backslash symbol freely inside the Lua code. -% \end{markdown} -% \begin{macrocode} - \catcode`|=0% - \catcode`\\=12% - |gdef|markdownLuaExecute#1{% - |directlua{% - local function print(input) - local output = {} - for line in input:gmatch("[^\r\n]+") do - table.insert(output, line) - end - tex.print(output) - end - #1 - }% - }% -|endgroup -\fi -% \end{macrocode} -% \par -% \begin{markdown} -% %### Typesetting Markdown % % The \mref{markdownInput} macro uses an implementation of the @@ -29413,20 +33588,15 @@ end [[Could not open file "&1" for reading]]) local input = assert(file:read("*a")) assert(file:close()) + print(convert(input)) + |markdownCleanup}% % \end{macrocode} % \begin{markdown} -% Since the Lua converter expects \acro{unix} line endings, normalize the -% input. Also add a line ending at the end of the file in case the input file -% has none. -% \end{markdown} -% \begin{macrocode} - print(convert(input))}% -% \end{macrocode} -% \begin{markdown} -% In case we were finalizing the frozen cache, increment \Opt{frozenCacheCounter}. +% If we are finalizing the frozen cache, increment \Opt{frozenCacheCounter}. % \end{markdown} % \begin{macrocode} - |global|advance|markdownOptionFrozenCacheCounter by 1|relax + |markdownIfOption{finalizeCache}{% + |global|advance|markdownOptionFrozenCacheCounter by 1|relax}{}% }% |endgroup }% @@ -29472,19 +33642,6 @@ end % \par % \begin{markdown} % -% Use reflection to define the `renderers` and `rendererPrototypes` keys of -% \mref{markdownSetup} as well as the keys that correspond to Lua options. -% -% \end{markdown} -% \begin{macrocode} -\ExplSyntaxOn -\@@_latex_define_renderers: -\@@_latex_define_renderer_prototypes: -\ExplSyntaxOff -% \end{macrocode} -% \par -% \begin{markdown} -% %### Logging Facilities % The \LaTeX{} implementation redefines the plain \TeX{} logging macros (see % Section <#sec:tex-interface-logging>) to use the \LaTeX{} `\PackageInfo`, @@ -29519,13 +33676,125 @@ end % % \end{markdown} % \begin{macrocode} -\renewenvironment{markdown}{% - \markdownReadAndConvert@markdown{}}{% - \markdownEnd}% -\renewenvironment{markdown*}[1]{% - \markdownSetup{#1}% - \markdownReadAndConvert@markdown*}{% - \markdownEnd}% +\ExplSyntaxOn +\renewenvironment + { markdown } + { +% \end{macrocode} +% \markdownBegin +% +% In our implementation of the \envmref{markdown} \LaTeX{} environment, we +% want to distinguish between the following two cases: +% ``` tex +% \begin{markdown} [smartEllipses] \begin{markdown} +% \% This is an optional argument ^ [smartEllipses] +% \% ... \% ^ This is link +% \end{markdown} \end{markdown} +% ``````` +% +% Therefore, we cannot use the built-in \LaTeX{} support for environments +% with optional arguments or packages such as \pkg{xparse}. Instead, we +% must read the optional argument manually and prevent reading past the +% end of a line. +% +% To prevent reading past the end of a line when looking for the optional +% argument of the \envmref{markdown} \LaTeX{} environment and accidentally +% tokenizing markdown text, we change the category code of carriage return +% (`\r`, ASCII character 13 in decimal) from 5 (end of line). +% +% While any category code other than 5 (end of line) would work, we switch to +% the category 13 (active), which is also used by the +% \mref{markdownReadAndConvert} macro. This is necessary if we read until the +% end of a line, because then the carriage return character will be +% produced by \TeX{} via the `\endlinechar` plain \TeX{} macro and it needs +% to have the correct category code, so that \mref{markdownReadAndConvert} +% processes it correctly. +% +% \markdownEnd +% \begin{macrocode} + \group_begin: + \char_set_catcode_active:n { 13 } +% \end{macrocode} +% \begin{markdown} +% +% To prevent doubling the hash signs (`#`, ASCII code 35 in decimal), we switch +% its category from 6 (parameter) to 12 (letter). +% +% \end{markdown} +% \begin{macrocode} + \char_set_catcode_letter:n { 35 } +% \end{macrocode} +% \begin{markdown} +% +% After we have matched the opening `[` that begins the optional argument, +% we accept carriage returns as well. +% +% \end{markdown} +% \begin{macrocode} + \peek_regex_replace_once:nnF + { \ *\[([^]]*)\][^\r]* } + { +% \end{macrocode} +% \begin{markdown} +% +% After we have matched the optional argument, we switch back the category +% code of carriage returns and hash signs and we retokenize the content. This +% will cause single new lines to produce a space token and multiple new lines +% to produce `\par` tokens. Furthermore, this will cause hash signs followed +% by a number to be recognized as parameter numbers, which is necessary when +% we use the optional argument to redefine token renderers and token renderer +% prototypes. +% +% \end{markdown} +% \begin{macrocode} + \c { group_end: } + \c { tl_set_rescan:Nnn } \c { l_tmpa_tl } { } { \1 } +% \end{macrocode} +% \begin{markdown} +% +% Then, we pass the retokenized content to the \mref{markdownSetup} macro. +% +% \end{markdown} +% \begin{macrocode} + \c { @@_setup:V } \c { l_tmpa_tl } +% \end{macrocode} +% \begin{markdown} +% +% Finally, regardless of whether or not we have matched the optional argument, +% we let the \mref{markdownReadAndConvert} macro process the rest of the +% \LaTeX{} environment. +% +% \end{markdown} +% \begin{macrocode} + \c { markdownReadAndConvert@markdown } { } + } + { + \group_end: + \markdownReadAndConvert@markdown { } + } + } + { \markdownEnd } +\renewenvironment + { markdown* } + [ 1 ] + { + \msg_warning:nnn + { markdown } + { latex-markdown-star-deprecated } + { #1 } + \@@_setup:n + { #1 } + \markdownReadAndConvert@markdown * + } + { \markdownEnd } +\msg_new:nnn + { markdown } + { latex-markdown-star-deprecated } + { + The~markdown*~LaTeX~environment~has~been~deprecated~and~will~ + be~removed~in~the~next~major~version~of~the~Markdown~package. + } +\ExplSyntaxOff \begingroup % \end{macrocode} % \begin{markdown} @@ -29546,51 +33815,147 @@ end % \par % \begin{markdown} % -%#### \LaTeX{} Themes {#latex-themes-implementation} +%### Options +% The supplied package options are processed using the \mref{markdownSetup} macro. +% +% \end{markdown} +% \begin{macrocode} +\DeclareOption*{% + \expandafter\markdownSetup\expandafter{\CurrentOption}}% +\ProcessOptions\relax +% \end{macrocode} +% \begin{markdown} +% +%### Themes {#latex-themes-implementation} % -% This section implements the theme-loading mechanism and the example themes -% provided with the Markdown package. +% This section overrides the plain \TeX{} implementation of the theme-loading +% mechanism from Section <#sec:themes-implementation>. Futhermore, this section +% also implements the built-in \LaTeX{} themes provided with the Markdown package. % % \end{markdown} % \begin{macrocode} \ExplSyntaxOn +\cs_gset:Nn + \@@_load_theme:nn + { +% \end{macrocode} +% \par +% \begin{markdown} +% +% If the Markdown package has already been loaded, determine whether +% a file named `markdowntheme`\meta{munged theme name}`.sty` exists +% and whether we are still in the preamble. +% +% \end{markdown} +% \begin{macrocode} + \ifmarkdownLaTeXLoaded + \ifx\@onlypreamble\@notprerr +% \end{macrocode} +% \begin{markdown} +% +% If both conditions are true does, end with an error, since we cannot load +% \LaTeX{} themes after the preamble. Otherwise, try loading a plain \TeX{} +% theme instead. +% +% \end{markdown} +% \begin{macrocode} + \file_if_exist:nTF + { markdown theme #2.sty } + { + \msg_error:nnn + { markdown } + { latex-theme-after-preamble } + { #1 } + } + { + \@@_plain_tex_load_theme:nn + { #1 } + { #2 } + } + \else +% \end{macrocode} +% \begin{markdown} +% +% If the Markdown package has already been loaded but we are still in the +% preamble, load a \LaTeX{} theme if it exists or load a plain \TeX{} theme +% otherwise. +% +% \end{markdown} +% \begin{macrocode} + \file_if_exist:nTF + { markdown theme #2.sty } + { + \msg_info:nnn + { markdown } + { loading-latex-theme } + { #1 } + \RequirePackage + { markdown theme #2 } + } + { + \@@_plain_tex_load_theme:nn + { #1 } + { #2 } + } + \fi + \else % \end{macrocode} % \begin{markdown} % -% To keep track of our current place when packages themes have been nested, -% we will maintain the \mdef{g_\@\@_latex_themes_seq} stack of theme names. +% If the Markdown package has not yet been loaded, postpone the loading until +% the Markdown package has finished loading. % % \end{markdown} % \begin{macrocode} -\newcommand\markdownLaTeXThemeName{} -\seq_new:N \g_@@_latex_themes_seq -\seq_gput_right:NV - \g_@@_latex_themes_seq - \markdownLaTeXThemeName -\newcommand\markdownLaTeXThemeLoad[2]{ - \def\@tempa{% - \def\markdownLaTeXThemeName{#2} - \seq_gput_right:NV - \g_@@_latex_themes_seq - \markdownLaTeXThemeName - \RequirePackage{#1} - \seq_pop_right:NN - \g_@@_latex_themes_seq - \l_tmpa_tl - \seq_get_right:NN - \g_@@_latex_themes_seq - \l_tmpa_tl - \exp_args:NNV - \def - \markdownLaTeXThemeName - \l_tmpa_tl} - \ifmarkdownLaTeXLoaded - \@tempa - \else - \exp_args:No + \msg_info:nnn + { markdown } + { theme-loading-postponed } + { #1 } \AtEndOfPackage - { \@tempa } - \fi} + { + \@@_load_theme:nn + { #1 } + { #2 } + } + \fi + } +\msg_new:nnn + { markdown } + { theme-loading-postponed } + { + Postponing~loading~Markdown~theme~#1~until~ + Markdown~package~has~finished~loading + } +\msg_new:nnn + { markdown } + { loading-latex-theme } + { Loading~LaTeX~Markdown~theme~#1 } +\cs_generate_variant:Nn + \msg_new:nnnn + { nnVV } +\tl_set:Nn + \l_tmpa_tl + { Cannot~load~LaTeX~Markdown~theme~#1~after~ } +\tl_put_right:NV + \l_tmpa_tl + \c_backslash_str +\tl_put_right:Nn + \l_tmpa_tl + { begin{document} } +\tl_set:Nn + \l_tmpb_tl + { Load~Markdown~theme~#1~before~ } +\tl_put_right:NV + \l_tmpb_tl + \c_backslash_str +\tl_put_right:Nn + \l_tmpb_tl + { begin{document} } +\msg_new:nnVV + { markdown } + { latex-theme-after-preamble } + \l_tmpa_tl + \l_tmpb_tl \ExplSyntaxOff % \end{macrocode} % \begin{markdown} @@ -29600,7 +33965,7 @@ end % \end{markdown} % \iffalse % -%<*latex-themes-witiko-dot> +%<*themes-witiko-dot> % \fi % \begin{macrocode} \markdownSetup{fencedCode}% @@ -29632,7 +33997,7 @@ end % % \end{markdown} % \begin{macrocode} -\renewcommand\markdownRendererInputFencedCodePrototype[2]{% +\renewcommand\markdownRendererInputFencedCodePrototype[3]{% \def\next##1 ##2\relax{% \ifthenelse{\equal{##1}{dot}}{% \markdownIfOption{frozenCache}{}{% @@ -29659,14 +34024,14 @@ end % \end{markdown} % \begin{macrocode} }{% - \markdown@witiko@dot@oldRendererInputFencedCodePrototype{#1}{#2}% + \markdown@witiko@dot@oldRendererInputFencedCodePrototype{#1}{#2}{#3}% }% }% \next#2 \relax}% % \end{macrocode} % \iffalse -% -%<*latex-themes-witiko-graphicx-http> +% +%<*themes-witiko-graphicx-http> % \fi % \par % \begin{markdown} @@ -29802,152 +34167,32 @@ end \endgroup % \end{macrocode} % \iffalse -% -%<*latex-themes-witiko-tilde> +% +%<*themes-witiko-markdown-defaults-latex> % \fi % \par % \begin{markdown} % -% The `witiko/tilde` theme redefines the tilde token renderer prototype, -% so that it expands to a non-breaking space: +% The `witiko/markdown/defaults` \LaTeX{} theme provides default definitions +% for token renderer prototypes. First, the \LaTeX{} theme loads the plain +% \TeX{} theme with the default definitions for plain \TeX{}: % % \end{markdown} % \begin{macrocode} -\renewcommand\markdownRendererTildePrototype{~}% +\markdownLoadPlainTeXTheme % \end{macrocode} -% \iffalse -% -%<*latex> -% \fi % \par % \begin{markdown} % -%### Options -% The supplied package options are processed using the \mref{markdownSetup} macro. -% -% \end{markdown} -% \begin{macrocode} -\DeclareOption*{% - \expandafter\markdownSetup\expandafter{\CurrentOption}}% -\ProcessOptions\relax -% \end{macrocode} -% \begin{markdown} -% -% After processing the options, activate the `jekyllDataRenderes`, `renderers`, -% `rendererPrototypes`, and `code` keys. -% -% \end{markdown} -% \begin{macrocode} -\ExplSyntaxOn -\keys_define:nn - { markdown/latex-options } - { - renderers .code:n = { - \keys_set:nn - { markdown/latex-options/renderers } - { #1 } - }, - } -\@@_with_various_cases:nn - { rendererPrototypes } - { - \keys_define:nn - { markdown/latex-options } - { - #1 .code:n = { - \keys_set:nn - { markdown/latex-options/renderer-prototypes } - { ##1 } - }, - } - } -% \end{macrocode} -% \begin{markdown} -% -% The `code` key is used to immediately expand and execute code, which can be -% especially useful in \LaTeX{} snippets. -% -% \end{markdown} -% \begin{macrocode} -\keys_define:nn - { markdown/latex-options } - { - code .code:n = { #1 }, - } -% \end{macrocode} -% \begin{markdown} -% -% The `jekyllDataRenderers` key can be used as a syntactic sugar for setting -% the `markdown/jekyllData` key--values (see Section <#sec:expl3yamlmetadata>) -% without using the expl3 language. -% -% \end{markdown} -% \begin{macrocode} -\@@_with_various_cases:nn - { jekyllDataRenderers } - { - \keys_define:nn - { markdown/latex-options } - { - #1 .code:n = { - \tl_set:Nn - \l_tmpa_tl - { ##1 } -% \end{macrocode} -% \begin{markdown} -% -% To ensure that keys containing forward slashes get passed correctly, we -% replace all forward slashes in the input with backslash tokens with category -% code letter and then undo the replacement. This means that if any unbraced -% backslash tokens with category code letter exist in the input, they will be -% replaced with forward slashes. However, this should be extremely rare. -% -% \end{markdown} -% \begin{macrocode} - \tl_replace_all:NnV - \l_tmpa_tl - { / } - \c_backslash_str - \keys_set:nV - { markdown/latex-options/jekyll-data-renderers } - \l_tmpa_tl - }, - } - } -\keys_define:nn - { markdown/latex-options/jekyll-data-renderers } - { - unknown .code:n = { - \tl_set_eq:NN - \l_tmpa_tl - \l_keys_key_str - \tl_replace_all:NVn - \l_tmpa_tl - \c_backslash_str - { / } - \tl_put_right:Nn - \l_tmpa_tl - { - .code:n = { #1 } - } - \keys_define:nV - { markdown/jekyllData } - \l_tmpa_tl - } - } -\cs_generate_variant:Nn - \keys_define:nn - { nV } -\ExplSyntaxOff -% \end{macrocode} -% \par -% \begin{markdown} +% Next, the \LaTeX{} theme overrides some of the plain \TeX{} definitions. +% See Section <#sec:latex-token-renderer-prototypes> for the actual +% definitions. % -%### Token Renderer Prototypes {#latex-default-renderer-prototypes} +%### Token Renderer Prototypes {#latex-token-renderer-prototypes} % -% The following configuration should be considered placeholder. If the `plain` -% package option has been enabled (see Section <#sec:latexplain>), none of -% it will take effect. +% The following configuration should be considered placeholder. If the option +% `plain` has been enabled (see Section <#sec:plain>), none of the definitions +% will take effect. % \end{markdown} % \begin{macrocode} \markdownIfOption{plain}{\iffalse}{\iftrue} @@ -29991,7 +34236,7 @@ end { LowerRoman } { \int_to_roman:n { #2 } } { UpperRoman } { \int_to_Roman:n { #2 } } { LowerAlpha } { \int_to_alph:n { #2 } } - { UpperAlpha } { \int_to_alph:n { #2 } } + { UpperAlpha } { \int_to_Alph:n { #2 } } } } \cs_new:Nn @@ -30057,16 +34302,26 @@ end \tl_set:Nn \l_@@_latex_fancy_list_item_label_delimiter_style_tl { #2 } - \tl_set:Nn - \l_tmpa_tl - { \begin{enumerate}[ } - \tl_put_right:Nx - \l_tmpa_tl - { \@@_latex_paralist_style:nn { #1 } { #2 } } - \tl_put_right:Nn + \@@_if_option:nTF + { startNumber } + { + \tl_set:Nn + \l_tmpa_tl + { \begin{enumerate} } + } + { + \tl_set:Nn + \l_tmpa_tl + { \begin{enumerate}[ } + \tl_put_right:Nx + \l_tmpa_tl + { \@@_latex_paralist_style:nn { #1 } { #2 } } + \tl_put_right:Nn + \l_tmpa_tl + { ] } + } + \tl_use:N \l_tmpa_tl - { ] } - \l_tmpa_tl }, fancyOlEnd = { \end{enumerate} @@ -30104,15 +34359,27 @@ end { \plpartopsep=\partopsep \pltopsep=\topsep - \begin{compactenum}[ } - \tl_put_right:Nx - \l_tmpa_tl - { \@@_latex_paralist_style:nn { #1 } { #2 } } - \tl_put_right:Nn + \@@_if_option:nTF + { startNumber } + { + \tl_put_right:Nn + \l_tmpa_tl + { \begin{compactenum} } + } + { + \tl_put_right:Nn + \l_tmpa_tl + { \begin{compactenum}[ } + \tl_put_right:Nx + \l_tmpa_tl + { \@@_latex_paralist_style:nn { #1 } { #2 } } + \tl_put_right:Nn + \l_tmpa_tl + { ] } + } + \tl_use:N \l_tmpa_tl - { ] } - \l_tmpa_tl }, fancyOlEndTight = { \end{compactenum} @@ -30250,7 +34517,7 @@ end image = {% \begin{figure}% \begin{center}% - \includegraphics{#3}% + \includegraphics[alt={#1}]{#3}% \end{center}% \ifx\empty#4\empty\else \caption{#4}% @@ -30267,43 +34534,44 @@ end dlEnd = {\end{description}}, emphasis = {\emph{#1}}, tickedBox = {$\boxtimes$}, - halfTickedBox = {$\boxdot$}, + halfTickedBox = {$\boxdot$}}} % \end{macrocode} % \par % \begin{markdown} % -% If identifier attributes appear at the beginning of a section, we make the -% next heading produce the `\label` macro. +% If identifier attributes appear at the beginning of a section, we make them +% produce the `\label` macro. % % \end{markdown} % \begin{macrocode} - headerAttributeContextBegin = {% - \markdownSetup{ - rendererPrototypes = { - attributeIdentifier = {% - \begingroup - \def\next####1{% - \def####1########1{% - \endgroup - ####1{########1}% - \label{##1}% - }% - }% - \next\markdownRendererHeadingOne - \next\markdownRendererHeadingTwo - \next\markdownRendererHeadingThree - \next\markdownRendererHeadingFour - \next\markdownRendererHeadingFive - \next\markdownRendererHeadingSix - }, - }, - }% +\ExplSyntaxOn +\seq_new:N \l_@@_header_identifiers_seq +\markdownSetup{ + rendererPrototypes = { + headerAttributeContextBegin = { + \seq_clear:N \l_@@_header_identifiers_seq + \markdownSetup + { + renderers = { + attributeIdentifier = { + \seq_put_right:Nn + \l_@@_header_identifiers_seq + { ##1 } + }, + }, + } + }, + headerAttributeContextEnd = { + \seq_map_inline:Nn + \l_@@_header_identifiers_seq + { \label { ##1 } } + }, }, - headerAttributeContextEnd = {}, +} +\ExplSyntaxOff +\markdownSetup{rendererPrototypes={ superscript = {\textsuperscript{#1}}, subscript = {\textsubscript{#1}}, - displayMath = {\begin{displaymath}#1\end{displaymath}}, - inlineMath = {\begin{math}#1\end{math}}, blockQuoteBegin = {\begin{quotation}}, blockQuoteEnd = {\end{quotation}}, inputVerbatim = {\VerbatimInput{#1}}, @@ -30322,7 +34590,7 @@ end \RequirePackage{ltxcmds} \ExplSyntaxOn \cs_gset:Npn - \markdownRendererInputFencedCodePrototype#1#2 + \markdownRendererInputFencedCodePrototype#1#2#3 { \tl_if_empty:nTF { #2 } @@ -30382,7 +34650,7 @@ end % % \end{markdown} % \begin{macrocode} - { \markdownRendererInputFencedCode{#1}{} } + { \markdownRendererInputFencedCode{#1}{}{} } } } } @@ -30419,16 +34687,16 @@ end headingOne = {\section{#1}}, headingTwo = {\subsection{#1}}, headingThree = {\subsubsection{#1}}, - headingFour = {\paragraph{#1}\leavevmode}, - headingFive = {\subparagraph{#1}\leavevmode}}} + headingFour = {\paragraph{#1}}, + headingFive = {\subparagraph{#1}}}} }{% \markdownSetup{rendererPrototypes = { headingOne = {\chapter{#1}}, headingTwo = {\section{#1}}, headingThree = {\subsection{#1}}, headingFour = {\subsubsection{#1}}, - headingFive = {\paragraph{#1}\leavevmode}, - headingSix = {\subparagraph{#1}\leavevmode}}} + headingFive = {\paragraph{#1}}, + headingSix = {\subparagraph{#1}}}} }% % \end{macrocode} % \par @@ -30966,25 +35234,10 @@ end % % \end{markdown} % \begin{macrocode} -% TODO: Remove the command definition in TeX Live 2021. -\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion} \markdownSetup{ rendererPrototypes = { jekyllDataEnd = { -% TODO: Remove the else branch in TeX Live 2021. - \IfFormatAtLeastTF - { 2020-10-01 } - { \AddToHook{begindocument/end}{\maketitle} } - { - \ifx\@onlypreamble\@notprerr - % We are in the document - \maketitle - \else - % We are in the preamble - \RequirePackage{etoolbox} - \AfterEndPreamble{\maketitle} - \fi - } + \AddToHook{begindocument/end}{\maketitle} }, }, } @@ -31013,18 +35266,18 @@ end % \par % \begin{markdown} % -%#### Strike-Through -% If the \Opt{strikeThrough} option is enabled, we will load the -% \pkg{soulutf8} package and use it to implement strike-throughs. +%#### Marked Text +% If the \Opt{mark} option is enabled, we will load the \pkg{soulutf8} package +% and use it to implement marked text. % % \end{markdown} % \begin{macrocode} -\markdownIfOption{strikeThrough}{% +\markdownIfOption{mark}{% \RequirePackage{soulutf8}% \markdownSetup{ rendererPrototypes = { - strikeThrough = {% - \st{#1}% + mark = {% + \hl{#1}% }, } } @@ -31120,8 +35373,12 @@ end } } \ExplSyntaxOff -\fi % Closes `\markdownIfOption{Plain}{\iffalse}{iftrue}` +\fi % Closes `\markdownIfOption{plain}{\iffalse}{\iftrue}` % \end{macrocode} +% \iffalse +% +%<*latex> +% \fi % \par % \begin{markdown} % @@ -31186,7 +35443,7 @@ end % \begin{markdown} % %### Typesetting Markdown -% The \mref{inputmarkdown} is defined to accept an optional argument with +% The \mref{inputmarkdown} macro is defined to accept an optional argument with % options recognized by the \Hologo{ConTeXt} interface (see Section % <#sec:context-options>). % @@ -31198,7 +35455,7 @@ end \long\def\doinputmarkdown[#1]#2{% \begingroup \iffirstargument - \setupmarkdown{#1}% + \setupmarkdown[#1]% \fi \markdownInput{#2}% \endgroup}% @@ -31220,48 +35477,108 @@ end % % \end{markdown} % \begin{macrocode} -\ifx\startluacode\undefined % MkII - \begingroup - \catcode`\|=0% - \catcode`\\=12% - |gdef|startmarkdown{% - |markdownReadAndConvert{\stopmarkdown}% - {|stopmarkdown}}% - |gdef|stopmarkdown{% - |markdownEnd}% - |endgroup -\else % MkIV - \startluacode - document.markdown_buffering = false - local function preserve_trailing_spaces(line) - if document.markdown_buffering then - line = line:gsub("[ \t][ \t]$", "\t\t") - end - return line +\startluacode + document.markdown_buffering = false + local function preserve_trailing_spaces(line) + if document.markdown_buffering then + line = line:gsub("[ \t][ \t]$", "\t\t") end - resolvers.installinputlinehandler(preserve_trailing_spaces) - \stopluacode - \begingroup - \catcode`\|=0% - \catcode`\\=12% - |gdef|startmarkdown{% - |ctxlua{document.markdown_buffering = true}% - |markdownReadAndConvert{\stopmarkdown}% - {|stopmarkdown}}% - |gdef|stopmarkdown{% - |ctxlua{document.markdown_buffering = false}% - |markdownEnd}% - |endgroup -\fi + return line + end + resolvers.installinputlinehandler(preserve_trailing_spaces) +\stopluacode +\begingroup + \catcode`\|=0% + \catcode`\\=12% + |gdef|startmarkdown{% + |ctxlua{document.markdown_buffering = true}% + |markdownReadAndConvert{\stopmarkdown}% + {|stopmarkdown}}% + |gdef|stopmarkdown{% + |ctxlua{document.markdown_buffering = false}% + |markdownEnd}% +|endgroup +% \end{macrocode} +% \par +% \begin{markdown} +% +%### Themes {#context-themes-implementation} +% +% This section overrides the plain \TeX{} implementation of the theme-loading +% mechanism from Section <#sec:themes-implementation>. Futhermore, this section +% also implements the built-in \Hologo{ConTeXt} themes provided with the +% Markdown package. +% +% \end{markdown} +% \begin{macrocode} +\ExplSyntaxOn +\cs_gset:Nn + \@@_load_theme:nn + { +% \end{macrocode} +% \par +% \begin{markdown} +% +% Determine whether a file named `t-markdowntheme`\meta{munged theme +% name}`.tex` exists. If it does, load it. Otherwise, try loading a plain +% \TeX{} theme instead. +% +% \end{markdown} +% \begin{macrocode} + \file_if_exist:nTF + { t - markdown theme #2.tex } + { + \msg_info:nnn + { markdown } + { loading-context-theme } + { #1 } + \usemodule + [ t ] + [ markdown theme #2 ] + } + { + \@@_plain_tex_load_theme:nn + { #1 } + { #2 } + } + } +\msg_new:nnn + { markdown } + { loading-context-theme } + { Loading~ConTeXt~Markdown~theme~#1 } +\ExplSyntaxOff +% \end{macrocode} +% \iffalse +% +%<*themes-witiko-markdown-defaults-context> +% \fi +% \par +% \begin{markdown} +% +% The `witiko/markdown/defaults` \Hologo{ConTeXt} theme provides default +% definitions for token renderer prototypes. First, the \Hologo{ConTeXt} theme +% loads the plain \TeX{} theme with the default definitions for plain \TeX{}: +% +% \end{markdown} +% \begin{macrocode} +\markdownLoadPlainTeXTheme % \end{macrocode} % \par % \begin{markdown} % -%### Token Renderer Prototypes -% The following configuration should be considered placeholder. +% Next, the \Hologo{ConTeXt} theme overrides some of the plain \TeX{} definitions. +% See Section <#sec:context-token-renderer-prototypes> for the actual +% definitions. +% +%### Token Renderer Prototypes {#context-token-renderer-prototypes} +% +% The following configuration should be considered placeholder. If the option +% `plain` has been enabled (see Section <#sec:plain>), none of the definitions +% will take effect. % % \end{markdown} % \begin{macrocode} +\markdownIfOption{plain}{\iffalse}{\iftrue} \def\markdownRendererHardLineBreakPrototype{\blank}% \def\markdownRendererLeftBracePrototype{\textbraceleft}% \def\markdownRendererRightBracePrototype{\textbraceright}% @@ -31356,7 +35673,7 @@ end % \begin{macrocode} \ExplSyntaxOn \cs_gset:Npn - \markdownRendererInputFencedCodePrototype#1#2 + \markdownRendererInputFencedCodePrototype#1#2#3 { \tl_if_empty:nTF { #2 } @@ -31416,7 +35733,6 @@ end \def\markdownRendererSuperscriptPrototype#1{\high{#1}} \def\markdownRendererSubscriptPrototype#1{\low{#1}} \def\markdownRendererDisplayMathPrototype#1{\startformula#1\stopformula}% -\def\markdownRendererInlineMathPrototype#1{$#1$}% % \end{macrocode} % \par % \begin{markdown} @@ -31544,8 +35860,30 @@ end \cs_gset_eq:NN \markdownRendererInputRawBlockPrototype \markdownRendererInputRawInlinePrototype +\fi % Closes `\markdownIfOption{plain}{\iffalse}{\iftrue}` \ExplSyntaxOff -\stopmodule\protect +\stopmodule +\protect +% \end{macrocode} +% \iffalse +% +%<*context> +% \fi +% \par +% \begin{markdown} +% +% At the end of the \Hologo{ConTeXt} module, we load the +% `witiko/markdown/defaults` \Hologo{ConTeXt} theme with the default +% definitions for token renderer prototypes unless the option `noDefaults` +% has been enabled (see Section <#sec:plain>). +% +% \end{markdown} +% \begin{macrocode} +\markdownIfOption{noDefaults}{}{ + \setupmarkdown[theme=witiko/markdown/defaults] +} +\stopmodule +\protect % \end{macrocode} % \iffalse % diff --git a/macros/generic/markdown/markdown.html b/macros/generic/markdown/markdown.html index 7318814624..a923528363 100644 --- a/macros/generic/markdown/markdown.html +++ b/macros/generic/markdown/markdown.html @@ -4,17 +4,27 @@ - + Markdown Package User Manual

Markdown Package User Manual

-

Vít Novotný

-

2.23.0-0-g0b22f91 2023-04-27

+

Vít Starý Novotný

+

3.4.1-0-g457226ae 2024-02-16