答案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}