# 在对齐标签中的条件中?

# 在对齐标签中的条件中?

我正在寻找如何让 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

相关内容