我正在寻找如何让 TeX 理解当 # 同时出现在如果别的并在else-fi对齐选项卡中的条件部分,最终选项卡中永远不会有超过一个 #。以下是一些示例代码:
\def\table{
\halign{
\iftrue\hfil##\else##\hfil\fi\cr
Bla-bla\cr}}
\table
答案1
#
您可以使用宏假装模板中有两个:
\newif\ifright
\def\table{%
\halign{%
\def\temp{##}\ifright\hfil\temp\else\temp\hfil\fi\cr
Bla-bla\cr
aaaaaaaaaaaaaaaaaaa\cr
}%
}
% \rightfalse
\table
\righttrue
\table
\bye
或者,使用\span
\newif\ifright
\def\table{%
\halign{%
\span\ifright\hfil##\span\else##\hfil\span\fi\cr
Bla-bla\cr
aaaaaaaaaaaaaaaaaaa\cr
}%
}
% \rightfalse
\table
\righttrue
\table
\bye
答案2
您是否在寻找类似以下内容的内容
\let\hash\relax
\def\table#1{%
\edef\preamble{\iftrue\hfil\hash\else\hash\fi\cr}%
\let\hash##
\expandafter\halign\expandafter{\preamble #1}%
\let\hash\relax
}
\table{a\cr b\cr}
\bye
这里的想法是,在“构造”阶段,我们#
使用不可扩展的标记来表示;只有在实际的表构造过程中才\hash
等于#
。这样,就永远不会有包含多个#
标记的条件。
答案3
作为 Joseph 的替代方案,您可以在宏中隐藏重复(代价是将每个单元格都经过宏扩展)
\def\foo#1{\iftrue\hfil#1\else#1\hfil\fi}
\def\table{%
\halign{\foo{##}\cr
Bla-bla\cr}}
\table
\bye
答案4
我正在使用 toks 寄存器\tabdata
来实现这种目的,其中\halign
前导码是逐步创建的。这样做的好处是宏可以根据提供给用户的特殊语言\table
创建任意前导码。该算法可以扫描此类语言,并且可以使用宏创建前导码。\halign
\halign
\addtabdata
\newif\ifright
\newtoks\tabdata
\def\table{\tabdata={}% the \tabdata idea inspired from OPmac
\ifright \addtabdata{\hfil##}\else\addtabdata{##\hfil}\fi
\halign\expandafter{\the\tabdata\cr
ddghsghdfs\cr fghdg\cr}
}
\def\addtabdata#1{\tabdata=\expandafter{\the\tabdata#1}}
\table
\righttrue
\table
\end