我有以下示例。它很神奇,因为定义宏(\ParametersAGAaAA 和 \ParametersAGAa)似乎相互作用。这是因为 \ParametersAGAa 是字符串 \ParametersAGAaAA 的一部分吗?每次在将结果写入 \Parameters 之前,\PutLongTableRows 都会通过 \renewcommand{\PutLongtableRows}{} 重置...
\documentclass{article}
\usepackage{longtable}
\usepackage{listofitems}
\newcommand\PutLongtableRows{}
\makeatletter
\newcommand\AddLongtableRow[2][;]{%
\g@addto@macro\PutLongtableRows{\@gobble}%
\setsepchar{#1}% LISTOFITEMS SEP CHAR
\readlist\z{#2}% READ THE LIST INTO \z
\foreachitem\tmp\in\z{% LISTOFITEMS DO LOOP
\expandafter\g@addto@macro\expandafter\PutLongtableRows
\expandafter{\expandafter&\tmp}%
}%
\g@addto@macro\PutLongtableRows{\\\hline}%
}
\makeatother
\begin{document}
\renewcommand{\PutLongtableRows}{}
\AddLongtableRow{5,1; 5,2}
\AddLongtableRow{5,3; 5,4}
\newcommand{\ParametersAGAa}{\PutLongtableRows}
\renewcommand{\PutLongtableRows}{}
\AddLongtableRow{5,9; 5,8 ;5,7 }
\AddLongtableRow{5,6; 5,5 ;5,4}
\newcommand{\ParametersAGAaAA}{\PutLongtableRows}
\begin{longtable}{p{2cm}|p{3cm}}
\caption{Tab 1}
\\\hline
\ParametersAGAa
5,5 &85,6 \\\hline
\end{longtable}
\begin{longtable}{p{2cm}|p{3cm}|p{3cm}}
\caption{Tab 2}
\\\hline
\ParametersAGAaAA
5,3 &5,2 &5,1 \\\hline
\end{longtable}
\end{document}
第一个表显示无意义,因为 \ParametersAGAaAA 也写入 \ParametersAGAa。但没有命令可以这样做。也许我误解了 - 但是 \ParametersAGAaAA 和 \ParametersAGAa 应该彼此独立?为什么 \ParametersAGAa 被 \ParametersAGAaAA 覆盖
答案1
这是因为 定义的宏\newcommand
在使用宏时会扩展其定义,而在定义时则不会。因此,当您使用\ParametersAGAa
它时,它等于 的最后一个定义\PutLongtableRows
,即尊重\ParametersAGAaAA
。
为了避免这种情况,请使用内部 TeX 命令\let
代替\newcommand
:
\let\ParametersAGAa\PutLongtableRows
和
\let\ParametersAGAaAA\PutLongtableRows
当然,具有相似名称的宏之间不可能进行任何交互。