\expandafter 非命令参数

\expandafter 非命令参数

我正在使用自定义命令来格式化文档中的所有表格。有些表格除了样式之外还共享其他属性,例如列定义和标题,这就是为什么这个答案激励我进一步减少重复代码。

将标题数据插入表命令不会导致任何问题,而对于插入列定义,我必须在插入之前找出如何扩展列定义。\expandafter解决了该问题。

现在,我想将以命令形式给出的参数和以文字形式给出的其他参数(例如表的数据)组合起来。如果包含列定义的待扩展命令恰好是第一个参数,那么这可以正常工作。如果相反文字是第一个参数,我需要做什么?如何绕过\expandafter一对花括号而不是命令?

 

\documentclass{article}
\usepackage{booktabs}

\begin{document}

    \newcommand{\colDef}{{cc}}  
    \newcommand{\tableBody}{a & b\\}

    \newcommand{\myTabA}[2]{%
        \begin{tabular}{#1}
            1 & 2\\\midrule
            #2
        \end{tabular}       
    }

    %same command with #1 and #2 switched
    \newcommand{\myTabB}[2]{%
        \begin{tabular}{#2}
            1 & 2\\\midrule
            #1
        \end{tabular}       
    }       

    %draw table A
    \expandafter\myTabA\colDef{\tableBody}
    \expandafter\myTabA\colDef{c & d\\} 

    %draw table B
    \expandafter\myTabB\expandafter\tableBody\colDef

    %produces error
    %\expandafter\myTabB\expandafter{c & d\\}\colDef    

\end{document}

答案1

etextools 包提供了一些用于执行此操作的工具,例如

\ExpandNextTwo{code}{arg 1}{arg 2}

如下所示:

\documentclass{article}
\usepackage{booktabs}
\usepackage{etextools}

\begin{document}

   \newcommand{\colDef}{{cc}}  
   \newcommand{\tableBody}{a & b\\}

   \newcommand{\myTabA}[2]{%
    \begin{tabular}{#1}
        1 & 2\\\midrule
        #2
    \end{tabular}       
}

%same command with #1 and #2 switched
\newcommand{\myTabB}[2]{%
    \begin{tabular}{#2}
        1 & 2\\\midrule
        #1
    \end{tabular}       
}       

%draw table A
\expandafter\myTabA\colDef{\tableBody}
\expandafter\myTabA\colDef{c & d\\} 

%draw table B
\expandafter\myTabB\expandafter\tableBody\colDef

% no longer produces error
\ExpandNextTwo{\myTabB}{c & d\\} \colDef

\end{document}

答案2

将扩展控制推送到宏中会更简单,因此它总是扩展一次的第一个标记,那么您在文档中#2就不需要了。\expandafter

\documentclass{article}
\usepackage{booktabs}

\begin{document}

    \newcommand{\colDef}{{cc}}  
    \newcommand{\tableBody}{a & b\\}

    \newcommand{\myTabA}[2]{%
        \begin{tabular}{#1}
            1 & 2\\\midrule
            #2
        \end{tabular}       
    }

    %same command with #1 and #2 switched
    \newcommand{\myTabB}[2]{%
        \def\temp{\begin{tabular}}%
           \expandafter\temp\expandafter{#2}
            1 & 2\\\midrule
            #1
        \end{tabular}       
    }       

    %draw table A
    \expandafter\myTabA\colDef{\tableBody}
    \expandafter\myTabA\colDef{c & d\\} 

    %draw table B
    \myTabB\tableBody\colDef

    %produces error (not now!)
    \myTabB{c & d\\}\colDef    

\end{document}

答案3

我最终使用了etextools表格定义中的一个命令,从而从所有答案中得出。

\newcommand{\myTabB}[2]{%
    \expandnext{
    \begin{tabular}}{#2}
        1 & 2\\\midrule
        #1
    \end{tabular}       
}   

相关内容