[texhax] What's legal about \halign and backward braces?
Doug McKenna
doug at mathemaesthetics.com
Tue Jun 28 01:03:24 CEST 2011
David Arseneau wrote:
>> \halign{}#{\cr A\cr}
>You are misreading the error message. The message says that there
>is a missing \cr before the (template-inserted) brace, but TeX has
>already read as far as the A before the error was detected. Of
>course that has to be the case because the u-template isn't inserted
>until TeX sees the A.
I understand why the error message issues when it does, and that there's
a single token read-ahead issue going on. Regardless, the message is
still misleading, because a missing \cr (one of which occurs on either
side of the 'A' in the source) isn't really the cause of the error, which
is more due to reversed (but still nominally balanced) braces in the
column's template declared in the preamble.
Error messages in such computer language situations are always dicey (a
single missing or extra brace or semicolon in a C compilation can cause
hundreds of error messages, not one of which tells you what or where the
problem is). What I was interested in is whether the lack of an error
message about reversed or unbalanced braces during preamble template
collection for the column was a bad idea in some weird situation I can't
think of. Because otherwise, it seems like poor design or
implementation, at least from the user's (my) point of view. But such
conclusions are often made naively without a thorough understanding of
the system, so I would love to be proven wrong with a counter-example.
Uwe Lueck wrote:
>Doug, please present that minimal file that produces
>the error you are reporting.
Here's some examples (TexLive 2010, via TeXShop using standard LaTeX
format):
--------------------------------------------
\documentclass[11pt]{article}
\begin{document}
\title{Test}
\author{\TeX}
\maketitle
Several successful-because-they-are-empty alignments follow:
\tabskip 32pt
\halign{#\cr}
\halign{{#}\cr}
\halign{}#{\cr}
\halign{}}}}}}}}}#{{{{{{{{{\cr}
%\halign{}}#{\cr} % Uncommenting makes the next, otherwise legal,
alignment, illegal
Some non-empty and legal alignments, omitting some strange template
material in column 2, follow:
\halign{#&}#{\cr A&\omit B\cr}
\halign{#&}}}}Foo}}}}#{{{{{Bar{{{\cr A&\omit B\cr}
Alignments that, when uncommented, issue a confusing error message:
%\halign{#&}#{\cr A&B\cr}
%\halign{}#{\cr A\cr}
Alignments that, when uncommented, lead to a runaway preamble message:
%\halign{}#\cr A\cr}
%\halign{#&}}}}}}}#{{{{{{\cr A&\omit B\cr}
%\halign{}}#{\cr}
\end{document}
--------------------------------------------
The above demonstrates another weird situation with \halign. The line in
the above code:
%\halign{}}#{\cr} % Uncommenting makes the next, otherwise legal,
alignment, illegal
When left commented, the document as shown above has no errors. But if I
uncomment that line, I get the error message:
./Alignment.tex:17: Only one # is allowed per tab.
l.17 \halign{#
&}#{\cr A&\omit B\cr}
At first, I didn't look closely, and thought the error was for the
just-uncommented \halign. But later, I realized that the error message
is for the next (formerly legal) \halign, not the one I uncommented and
for which no error was posted.
Now that's pretty confusing, but again, has to do with weirdly matched
braces that for some reason aren't complained about when they occur in
the earlier \halign's preamble.
Anyway, I appreciate the feedback on my puzzle, and perhaps this
discussion in the archives will help some future poor soul understand the
\halign command's somewhat weird and/or ad hoc syntax vis-a-vis
brace-counting and/or matching and/or reverse-ordering in column
templates in the preambles of alignments.
Doug McKenna
More information about the texhax
mailing list