Subject: mailing-list for TeXmacs Users
List archive
From : Sam Liddicott <address@hidden>- To: TeXmacs user list <address@hidden>
- Subject: Useful package map-paragraphs
- Date: Mon, 12 Feb 2024 16:08:19 +0000
Hi Joris,
Feel free to include this with the standard packages.
I use it to decorate paragraphs in some structured document templates in ways that are only otherwise possible with dtd hints and addition tags that interfere with the semantics of the document.
map-args can be used to enumerate the paragraphs of a document tag passed as an argument, but only for a macro invoked directly from the macro. Nested macro invocations tend to wrap the document tag in further document tags, making it hard to get at the paragraph elements
This package provides <map-paragraphs-with|foo|x> where foo is the macro to be invoked on each paragraph, and x is a document block usually originating in the document.
Example to enclose paragraphs in "…":
<\map-paragraphs-with|<macro|x|"<arg|x>">>
one
two
three
</map-paragraphs-with>
Whereas you might use map-args to make that work as a macro invoked from the top level document, this wouldn't:
<\map-paragraphs-with|<macro|x|"<arg|x>">>
one
two
three
</map-paragraphs-with>
Whereas you might use map-args to make that work as a macro invoked from the top level document, this wouldn't:
<assign|auto-quote|<macro|x|<map-paragraphs-with|<macro|x|"<arg|x>">|<arg|x>>>>
<\auto-quote>
one
two
three
</auto-quote>
because the argument propagated from auto-quote would have an extra document tag enclosing it, and so map-args would only detect one argument which would be the whole set of paragraphs.
<\auto-quote>
one
two
three
</auto-quote>
because the argument propagated from auto-quote would have an extra document tag enclosing it, and so map-args would only detect one argument which would be the whole set of paragraphs.
Of course, there is no such thing as a paragraph, it is non-document such as string or concatenate, or with, etc.
Sam
<TeXmacs|2.1.2> <style|source> <\body> <\active*> <\src-title> <src-style-file|email|1.0> <\src-purpose> In-context paragraph decoration </src-purpose> <\src-copyright|2024> Sam Liddicott </src-copyright> <\src-license> This software falls under the <hlink|GNU general public license, version 3 or later|$TEXMACS_PATH/LICENSE>. It comes WITHOUT ANY WARRANTY WHATSOEVER. You should have received a copy of the license which the software. If not, see <hlink|http://www.gnu.org/licenses/gpl-3.0.html|http://www.gnu.org/licenses/gpl-3.0.html>. </src-license> </src-title> </active*> <\active*> <\src-comment> map-args can be used to enumerate the paragraphs of a document tag passed as an argument, but only for a macro invoked directly from the macro. Nested macro invocations tend to wrap the document tag in further document tags, making it hard to get at the paragraph elements This package provides \<less\>map-paragraphs-with\|foo\|x\<gtr\> where foo is the macro to be invoked on each paragraph, and x is a document block usually originating in the document. </src-comment> </active*> <use-package|generic>\ <\active*> <\src-comment> These are internal macros which recurse the document tree of the argument to decorate paragraphs within the document context (unlike datoms). Example to enclose paragraphs in \P...\Q: <\inactive*> <\map-paragraphs-with|<macro|x|\P<arg|x>\Q>> one two three </map-paragraphs-with> </inactive*> Whereas you might use map-args to make that work as a macro invoked from the top level document, this wouldn't: <\inactive*> <assign|auto-quote|<macro|x|<map-paragraphs-with|<macro|x|\P<arg|x>\Q>|<arg|x>>>> <\auto-quote> one two three </auto-quote> </inactive*> because the argument propagated from auto-quote would have an extra document tag enclosing it, and so map-args would only detect one argument which would be the whole set of paragraphs. </src-comment> </active*> <\active*> <\src-comment> macro map-paragraphs-default- can be overridden using \<less\>with\|map-paragraphs-default-\|new-definition\|...\<gtr\> to replace rendering of non-document tags, but it is easier to use \<less\>map-paragraphs-with\|new-definition\|...\<gtr\> </src-comment> </active*> <assign|map-paragraphs-default-|<macro|x|<arg|x>>> <assign|map-paragraphs-document|<\macro|x> <quasi|<map-paragraphs*|<unquote*|<arg|x>>>> </macro>> <assign|map-paragraphs*|<xmacro|x|<map-args|map-paragraphs|document|x>>> <\active*> <\src-comment> These are public macros but you almost always want to use \<less\>map-paragraphs-with\|new-definition\|...\<gtr\> </src-comment> </active*> <assign|map-paragraphs|<\macro|x> <compound|<if|<provides|<merge|map-paragraphs-|<get-label|<arg|x>>>>|<merge|map-paragraphs-|<get-label|<arg|x>>>|map-paragraphs-default->|<arg|x>> </macro>> <assign|map-paragraphs-with|<\macro|foo|x> <with|map-paragraphs-default-|<arg|foo>|<map-paragraphs|<arg|x>>> </macro>> <\active*> <\src-comment> The mechanism is simple. Get the label of the top-level tag of the argument and look for a handler defined as map-paragraphs-\<less\>label\<gtr\> and invoke that, otherwise invoke map-paragraphs-default- The only tag I currently know that I am interested in recursing is the document tag because outer document tags keep getting inserted everytime a document value is passed as a parameter. So each time we find a document tag, we call map-paragraphs* for all it's children which are obtained using quasi and unquote* (usually used for xmacros). </src-comment> </active*> \; </body> <\initial> <\collection> <associate|preamble|true> </collection> </initial>
- Useful package map-paragraphs, Sam Liddicott, 02/12/2024
Archive powered by MHonArc 2.6.24.