1

Edit:

It seems that I can use \noalign\bgroup before the \halign. That's fine. But how do I test that I'm inside the halign group? I'm able to write an own if, but it would be better to ask tex for its status, instead of introducing own status variables.

Original Question:

       Plain TeX nesting of a \halign table macro

Why can't I use my \begindescrows macro nested, or how can I change the command, that I can nest it:

\def\begindescrows #1,#2,#3.{\begingroup\baselineskip 2em\parindent 0pt
    \parskip 6pt plus1pt minus1pt
    \def\bullet{#1}
    \setbox0=\hbox{{\datefont ~\bullet~~ }} \def\dateSize{#2}
    \def\descSize{#3}
    \def\dcol{\hsize \descSize}
    \def\fcol{\hsize \dateSize}
    \def\desc##1{\vtop{\tolerance=5000\dcol\baselineskip 1.1em ##1\vskip 1em}}
    \def\date##1 -- ##2:{\vtop{\datefont\tolerance=5000\fcol\parskip0pt\baselineskip 1.1em
\hskip-\wd0\copy0 ##1 --\hfill\break
##2\par\vskip 1em}}
    \def\row ##1 -- ##2:##3\cr{\date ##1 -- ##2: &\desc{##3}\cr}
\halign\bgroup##\hfil&##\hfil\cr
}
\def\enddescrows{\crcr\egroup\endgroup\par\vskip -1em plus .5em\noindent}

\begindescrows von,3.5cm,13cm.
\row November 2006 -- now:      Some time went by.\cr
\begindescrows als,2.5cm,10cm.
\row This -- makes: no sense, but actually I want to nest a command similar to \\begindescrows.\cr
\enddescrows
\enddescrows
\bye

The error log looks like this:

$ pdftex --file-line-error testfile.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015) (preloaded format=pdftex)
 restricted \write18 enabled.
entering extended mode
 encTeX v. Jun. 2004, reencoding enabled.
(./testfile.tex
Runaway definition?
#1 -- #2:#3\hfil 
./testfile.tex:19: Forbidden control sequence found while scanning definition o
f \row.
<inserted text> 
                }
<to be read again> 
                   \endtemplate 
<template> \hfil \endtemplate 

\begindescrows ...m}} \def \row ##1 -- ##2:##3\cr 
                                                  {\date ##1 -- ##2: &\desc ...
l.19 \begindescrows als,2.5cm,10cm.

? X
No pages of output.
Transcript written on testfile.log.
3
  • You have to use your own \ifhalign. TeX only offers a limited set of mode detecting \if…. These are \ifmmode, \ifhmode, \ifvmode, and \ifinner. Commented Jun 25, 2015 at 8:22
  • @HenriMenke Yes I know: "I'm able to write an own if". But the problem with the if is, that I need to switch it on \endgroup. I think I prefer my own answer, below.
    – ikrabbe
    Commented Jun 25, 2015 at 8:28
  • \aftergroup\halignfalse? Commented Jun 25, 2015 at 11:29

1 Answer 1

0

I found that it is much simpler not to use \noalign inside of the macros, but outside, where I know, that I'm inside a \halign. So

\begindescrows ...

can simply be nested at any level, using

\noalign{\begindescrows ...
....
\enddescrows}

Actually it is good that the nesting and the halign characteristic is visible from outside of the macros.

2
  • \def\halign{\noalign\bgroup\halign} Would expand indifinetly. You have to \let something to \halign.
    – Manuel
    Commented Jun 25, 2015 at 9:15
  • ah, this might has to be an expandafter construct I never managed to get right.
    – ikrabbe
    Commented Jun 25, 2015 at 9:26

Not the answer you're looking for? Browse other questions tagged .