如何为多个宏重用公共数据元素?

如何为多个宏重用公共数据元素?

我想使用宏在同一个文档中多次呈现来自同一数据集的数据元素的不同组合。

例如,使用宏很容易在表中汇总数据集 A 中的元素:

\documentclass[11pt]{article}

\newcommand\dataset[6]{%
    \begin{table}
    \begin{tabular}{ll} 
    Element 1  & #1 \\
    Element 2  & #2 \\
    Element 3  & #3 \\
    Element 4  & #4 \\
    Element 5  & #5 \\
    Element 6  & #6 \\
    \end{tabular}
    \end{table}
}

\begin{document}

\dataset % Data Set A, one of many possible data sets in the same document
  {a}
  {b}
  {c}
  {d}
  {e}
  {f}

\end{document}

但现在我想重复使用数据集 A 中的一些相同元素,以不同的格式显示在同一文档中。例如:

\renewcommand\dataset[6]{%
    The first element of Data Set #1, is the data set label.
    The fourth element for Data Set #1 is #4.}

我如何定义使用来自同一数据集的输入参数的宏,以便我只需输入一次数据集?这是最优雅的方式吗?也就是说,\renewcommand在我想要重新定义宏的地方使用?

本示例的结果如下所示。

两个宏使用相同的数据元素。

在完整的应用程序中,我使用\input{data.tex}。该文件的内容如下所示:

\dataset % A
    {Data element} % Synopsis
    {Data element} % Recommendation
    {Data element} % Comments
    {Data element} % Reference
    {Data element} % Risk value
    {Data element} % FAI support

\dataset % B
    {Data element} % Synopsis
    {Data element} % Recommendation
    {Data element} % Comments
    {Data element} % Reference
    {Data element} % Risk value
    {Data element} % FAI support

\dataset % c
    {Data element} % Synopsis
    {Data element} % Recommendation
    {Data element} % Comments
    {Data element} % Reference
    {Data element} % Risk value
    {Data element} % FAI support

答案1

您可以定义数据集背后的一些基础设施。

加载数据集后,您可以通过第一项(概要)引用每个数据集。我提供了\datasetdef定义使用数据集的各种宏的命令。

\documentclass{article}

\makeatletter
\newcommand{\dataset}[6]{\@namedef{dataset@#1}{{#1}{#2}{#3}{#4}{#5}{#6}}}
\newcommand{\datasetdef}[2]{%
  % #1 is the name of a seven argument macro
  % #2 is the replacement text
  \expandafter\newcommand\csname ds@\string#1\endcsname[6]{#2}%
  \newcommand{#1}[1]{%
    \csname ds@\string#1\expandafter\expandafter\expandafter\endcsname
    \csname dataset@##1\endcsname
  }%
}
\makeatother

\datasetdef{\dstable}{%
    \begin{tabular}{ll} 
    Element 1  & #1 \\
    Element 2  & #2 \\
    Element 3  & #3 \\
    Element 4  & #4 \\
    Element 5  & #5 \\
    Element 6  & #6 \\
    \end{tabular}%
}

\datasetdef{\dsshowfirstandfourth}{%
  The first element of Data Set #1, is the data set label.
  The fourth element for Data Set #1 is #4.%
}

%%% This is like \input{data.txt}
\dataset
    {A} % Synopsis
    {A2} % Recommendation
    {A3} % Comments
    {A4} % Reference
    {A5} % Risk value
    {A6} % FAI support
\dataset
    {B} % Synopsis
    {B2} % Recommendation
    {B3} % Comments
    {B4} % Reference
    {B5} % Risk value
    {B6} % FAI support
\dataset
    {c} % Synopsis
    {c2} % Recommendation
    {c3} % Comments
    {c4} % Reference
    {c5} % Risk value
    {c6} % FAI support

\begin{document}

\dstable{A} \dstable{c}

\bigskip

\dsshowfirstandfourth{A}

\dsshowfirstandfourth{B}

\end{document}

如您所见,\datasetdef与 类似\newcommand,但您只需声明宏的名称和替换文本(有六个参数)。 用 定义的宏\datasetdef采用单个参数,即数据集的名称。

在此处输入图片描述

答案2

我能想到的最快的想法是与评论中建议的相反。您定义一些格式化宏来格式化它们的参数。然后定义将 dirst 参数应用于自身的数据集:

\documentclass[11pt]{article}
% some format that can be applied to any dataset with six entries
\newcommand\FormatOne[6]{%
\begin{table}
\begin{tabular}{ll}
Element 1  & #1 \\
Element 2  & #2 \\
Element 3  & #3 \\
Element 4  & #4 \\
Element 5  & #5 \\
Element 6  & #6 \\
\end{tabular}
\end{table}
}
% some other format that can be applied to any dataset with six entries
\newcommand\FormatTwo[6]{
  The first element of Data Set #1, is the data set label.
  The fourth element for Data Set #1 is #4.}
% A dataset with six entries. The first argument will be used as a format
% command
\newcommand\DataSetOne[1]{
  \csname#1\endcsname{a}{b}{c}{d}{e}{f}}
\begin{document}
\DataSetOne{FormatOne}
\DataSetOne{FormatTwo}
\end{document}

该 pdf 看起来像您的示例。

相关内容