複数のマクロで共通のデータ要素を再利用するにはどうすればよいですか?

複数のマクロで共通のデータ要素を再利用するにはどうすればよいですか?

マクロを使用して、同じデータ セットからのさまざまなデータ要素の組み合わせを同じドキュメント内で複数回表示したいと考えています。

たとえば、マクロを使用してデータ セット 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.}

同じデータ セットからの入力パラメータを使用するマクロを定義して、データ セットを 1 回だけ入力するようにするにはどうすればよいですか? これは最もエレガントな方法ですか? つまり、\renewcommandマクロを再定義する時点で使用するということですか?

この例の結果を以下に示します。

同じデータ要素を使用する 2 つのマクロ。

完成したアプリケーションでは、 を使用します\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が、マクロの名前と置換テキスト (6 つの引数) を指定するだけで済みます。 で定義されたマクロは、\datasetdefデータ セットの名前という 1 つの引数を取ります。

ここに画像の説明を入力してください

答え2

私が思いついた最も簡単なアイデアは、コメントで提案されたものの逆です。引数をフォーマットするいくつかのフォーマット マクロを定義します。次に、最初の引数を自身に適用するデータ セットを定義します。

\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 はあなたの例のように見えます。

関連情報