宏 \ParametersAGAaAA 与 \ParametersAGAa 似乎神奇地相互作用?

宏 \ParametersAGAaAA 与 \ParametersAGAa 似乎神奇地相互作用?

我有以下示例。它很神奇,因为定义宏(\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

当然,具有相似名称的宏之间不可能进行任何交互。

相关内容