mailing-list for TeXmacs Users

Text archives Help


Useful package map-paragraphs


Chronological Thread 
  • 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:

        <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.

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.

Top of page