[NTG-context] How to make something appear to the right of every paragraph?

Max Chernoff mseven at telus.net
Tue Oct 11 00:57:04 CEST 2022


Hi Joel,

On Mon, 2022-10-10 at 12:46 +0000, Joel wrote:
>  Hello Max,
> It is preferred if the solution is just three lines per paragraph,
> rather than some content parallel to the text

A Lua callback solution:

   \startluacode
       -- Constants
       RULE_OFFSET    = tex.sp "1em"
       RULE_THICKNESS = tex.sp "0.4pt"
       RULE_LENGTH    = tex.sp "3cm"
   
       -- Callback
       function userdata.lines(head)
           if status.output_active or
              tex.nest.ptr > 1
           then
               return head
           end
   
           local i = 0
           for n in node.traverseid(node.id "hlist", head) do
               i = i + 1
               if i > 3 then
                   break
               end
   
               local offset = node.new "glue"
               offset.width = RULE_OFFSET
               node.slide(n.list).next = offset
   
               local rule = node.new "rule"
               rule.width = RULE_LENGTH
               rule.height = RULE_THICKNESS
               rule.depth = 0
               offset.next = rule
           end
   
           return head
       end
   
       nodes.tasks.appendaction(
           "finalizers",
           "after",
           "userdata.lines"
       )
   \stopluacode
   
   \parskip=\baselineskip
   
   \starttext
       One line paragraph
   
       Two line paragraph \\
       Two line paragraph
   
       Three line paragraph \\
       Three line paragraph \\
       Three line paragraph
   
       Four line paragraph \\
       Four line paragraph \\
       Four line paragraph \\
       Four line paragraph
   
       \samplefile{bryson}
   
       \samplefile{knuth}
   \stoptext

An \everypar solution:

   \appendtoks%
       \vbox to 0pt{%
           \dorecurse{3}{%
               \rlap{%
                   \hskip\dimexpr\hsize+1em%
                   \vrule height 0.4pt width 3cm%
                   \relax%
               }%
           }%
       }%
   \to\everypar
   
   \parskip=\baselineskip
   
   \starttext
       One line paragraph
   
       Two line paragraph \\
       Two line paragraph
   
       Three line paragraph \\
       Three line paragraph \\
       Three line paragraph
   
       Four line paragraph \\
       Four line paragraph \\
       Four line paragraph \\
       Four line paragraph
   
       \samplefile{bryson}
   
       \samplefile{knuth}
   \stoptext

Neither of these solutions are great though. Both of these solutions are
pretty low-level, so there's presumably a more ConTeXt-y way of doing
this.

Thanks,
-- Max


More information about the ntg-context mailing list