忽略 edef 中的扩展

忽略 edef 中的扩展

我想使用 以编程方式填充表格环境edef

为了简单起见,我带来了一个简单的例子:

\let\\=\relax
\let\hline=\relax
\edef\mmm{\hline A & B\\}
\edef\mmm{\mmm\hline C & D\\}
\edef\mmm{\mmm\hline 1 & 2\\\hline}
\begin{tabular}{|c|c|}\mmm\end{tabular}

结果:

在此处输入图片描述

预期的:

在此处输入图片描述

\hline在这个例子中,一旦在中使用,我怎样才能抑制扩展edef?我用过\let\hline=\relax,但它没有产生预期的结果。

答案1

如果你使用\edef你需要重置\\\hline然后,但它通常是不是可以安全地与 LaTeX 输入一起使用\edef。第二种形式不会重复扩展标记。请始终使示例成为完整的文档,如下所示。

\documentclass{article}

\begin{document}
{\let\\=\relax
\let\hline=\relax
\xdef\mmm{\hline A & B\\}
\xdef\mmm{\mmm\hline C & D\\}
\xdef\mmm{\mmm\hline 1 & 2\\\hline}
}
\begin{tabular}{|c|c|}\mmm\end{tabular}

\makeatletter
\def\mmm{\hline A & B\\}
\g@addto@macro\mmm{\hline C & D\\}
\g@addto@macro\mmm{\hline 1 & 2\\\hline}
\makeatother
\begin{tabular}{|c|c|}\mmm\end{tabular}

\end{document}

答案2

有多种方法可以将标记附加到宏的替换文本中。最简单的方法是etoolbox

\usepackage{etoolbox}

[...]

\def\mmm{\hline A & B\\}
\appto\mmm{\hline C & D\\}
\appto\mmm{\hline 1 & 2\\\hline}
\begin{tabular}{|c|c|}\mmm\end{tabular}

没有包裹,

\def\appto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}

上面的代码也会做同样的事情。

如果你想使用\edef

\def\mmm{\hline A & B\\}
\edef\mmm{\unexpanded\expandafter{\mmm}\unexpanded{\hline C & D\\}}
\edef\mmm{\unexpanded\expandafter{\mmm}\unexpanded{\hline 1 & 2\\\hline}}

更好的接口expl3。当您想要定义新变量或重新初始化它时,请使用\apptovar*,否则使用\apptovar。您可以根据需要定义任意数量的变量,它们将遵守正常的作用域规则。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\apptovar}{smm}
 {
  \IfBooleanT{#1}
   {
    \tl_clear_new:c { l_abforce_var_#2_tl }
   }
  \tl_put_right:cn { l_abforce_var_#2_tl } { #3 }
 }
\DeclareExpandableDocumentCommand{\usevar}{m}
 {
  \tl_use:c { l_abforce_var_#1_tl }
 }

\ExplSyntaxOff

\begin{document}

\apptovar*{mmm}{\hline A & B\\}% initialize
\apptovar{mmm}{\hline C & D\\}
\apptovar{mmm}{\hline 1 & 2\\\hline}

\begin{tabular}{|c|c|}\usevar{mmm}\end{tabular}

\end{document}

在此处输入图片描述

相关内容