呼び出し時に渡されるマクロファクトリと引数

呼び出し時に渡されるマクロファクトリと引数

私は別のマクロ (B) を生成するファクトリー マクロ (A) を作成しています。マクロ B は、呼び出されたときに変数のパラメーターとして取得される内容に影響を及ぼします。現在、A なしでこれらすべてを実行できますが、多くの書き直しが必要になるため、スケーラブルではありません。

ここで欠けているのは、B の呼び出し中に展開する必要がある引数への参照だと思います。#これはネストされた引数のように見えるため、複数を使用しようとしましたが、これは必要なものではないように感じます。

私が苦労している点は、「#1(self 関数を呼び出す関数内の最初の引数を指す (つまり\variable1))」は、マクロ B の最初の引数であるため、「Laetitia」に置き換える必要があるということです。

MWE には次の内容が記載されています:

  • 自動化トライアル1:試してみたxparse
  • 自動化トライアル2:xparse
  • 私が達成したいことの手作りコード。

先頭の\iffalse/命令を切り替えることで、3 つすべてを 1 つずつ実行できます。\iftrue

どんなヒントでも助かります!

\documentclass[twoside]{article}
% package pour utiliser une macro nested ac ses propres args
\usepackage{xparse}
\errorcontextlines32
\begin{document}
%==================================================================================
%     Prerequisite : lines of code to define variableI to variableXVI
%==================================================================================
\newcommand{\DefinitVariable}[1]{%
    \expandafter\newcommand\csname variable\Roman{#1}\endcsname{}%
    }%
%    Loop for defining all the variable
\newcounter{ctr}
\loop
    \stepcounter{ctr}
    \expandafter\DefinitVariable{ctr}%
\ifnum\thectr<16
\repeat

%==================================================================================
% Automation trial 1 :
%\iftrue
\iffalse
\newcommand\DeuxiemeAffecteVariable[1]{%%
    \setcounter{ctr}{1}%
    \expandafter\renewcommand\csname variable\Roman{ctr}\endcsname{\#1 (to point to the first argument within the function calling self function (ie \textbackslash variable1))}%
}

\newcommand\definecommand[1]{%%
  \expandafter\def\csname#1\endcsname{%
    \setcounter{ctr}{1}%
    \expandafter\DeuxiemeAffecteVariable{\arabic{ctr}}%
    }%%
}%


\definecommand{DefinitionVariablesN}%
\DefinitionVariablesN{Laetitia}%
La variable 1 est : \variableI  \\  FIN\\
\fi
%==================================================================================
% Automation trial 2 with xparse :
\iftrue
%\iffalse
\newcounter{cpteurLocal}
\NewDocumentCommand{\AffecteVariable}{m}
    {%
    \setcounter{cpteurLocal}{#1}%
    \expandafter\RenewDocumentCommand\csname variable\Roman{cpteurLocal}\endcsname {m}%
    {\#1 (to point to the first argument within the function calling self function (ie \textbackslash variable1))}%
    %{m}%
    %{##1}%
    %{########1}%
    %{contenu vraiable}%
    }%

% Macro factory (A)
\newcommand{\DefinitFonctionDeDefinition}[1]{%
    \expandafter\newcommand\csname DefinitionVariablesN\endcsname{%
            \expandafter\AffecteVariable{#1}%
            %\expandafter\expandafter\AffecteVariable{#1}%
            %\AffecteVariable{#1}%
        }%
    }

\setcounter{ctr}{1}%
\DefinitFonctionDeDefinition{\arabic{ctr}}%
\DefinitionVariablesN{Laetitia}

La variable 1 est : \variableI  \\  FIN\\
\fi

%==================================================================================

% Goal to reach, but this is 'handmade' (not scalable) :

\iffalse
%\iftrue
\newcommand{\DefinitionVariablesI}[9]{
    \renewcommand{\variableI}{#1}
    \renewcommand{\variableII}{#2}
    \renewcommand{\variableIII}{#3}
    \renewcommand{\variableIV}{#4}
    \renewcommand{\variableV}{#5}
    \renewcommand{\variableVI}{#6}
    \renewcommand{\variableVII}{#7}
    \renewcommand{\variableVIII}{#8}
    \renewcommand{\variableIX}{#9}
    }
\newcommand{\DefinitionVariablesII}[7]{
    \renewcommand{\variableX}{#1}
    \renewcommand{\variableXI}{#2}
    \renewcommand{\variableXII}{#3}
    \renewcommand{\variableXIII}{#4}
    \renewcommand{\variableXIV}{#5}
    \renewcommand{\variableXV}{#6}
    \renewcommand{\variableXVI}{#7}
    }

\DefinitionVariablesI{Laetitia}{Patrick}{Marie}{Michel}{Dieter}{Sammy}{Barbara}{Donna}{Ivan}
\DefinitionVariablesII{Pierre}{Rene}{Frederic}{Ousmam}{Paul}{Virginie}{Gerard}

La variable 1 est : \variableI\\
La variable 2 est : \variableII\\
La variable 3 est : \variableIII\\
La variable 4 est : \variableIV\\
La variable 5 est : \variableV\\
La variable 10 est : \variableX\\
La variable 11 est : \variableXI\\
La variable 12 est : \variableXII\\
La variable 13 est : \variableXIII\\
La variable 14 est : \variableXIV\\
FIN
\fi
\end{document}

=============================================================================== @egreg の回答のおかげで、確実に進歩しています。

フォローアップマクロファクトリーと呼び出し時に渡される引数(パート2)

答え1

より高度なexpl3ツールを使用することもできます:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\DefinitionVariables}{m}
 {
  \int_zero:N \l_tmpa_int
  \clist_map_inline:nn { #1 }
   {
    \int_incr:N \l_tmpa_int
    \tl_clear_new:c { variable \int_to_Roman:n { \l_tmpa_int } } 
    \tl_set:cn { variable \int_to_Roman:n { \l_tmpa_int } } { ##1 }
   }
 }
\ExplSyntaxOff

\begin{document}

\DefinitionVariables{
  Laetitia,Patrick,Marie,Michel,Dieter,Sammy,Barbara,Donna,Ivan,
  Pierre,Rene,Frederic,Ousmam,Paul,Virginie,Gerard
}

\noindent
La variable 1 est : \variableI\\
La variable 2 est : \variableII\\
La variable 3 est : \variableIII\\
La variable 4 est : \variableIV\\
La variable 5 est : \variableV\\
La variable 10 est : \variableX\\
La variable 11 est : \variableXI\\
La variable 12 est : \variableXII\\
La variable 13 est : \variableXIII\\
La variable 14 est : \variableXIV\\
FIN

\end{document}

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

以下は「クラシック」バージョンです。

\documentclass{article}

\makeatletter
\newcommand{\DefinitionVariables}[1]{%
  \count@=\z@
  \@for\next:={#1}\do{%
    \advance\count@\@ne
    \expandafter\newcommand\csname variable\@Roman\count@\expandafter\endcsname\expandafter{\next}% !!
  }%
}
\makeatother

\begin{document}

\DefinitionVariables{%
  Laetitia,Patrick,Marie,Michel,Dieter,Sammy,Barbara,Donna,Ivan,%
  Pierre,Rene,Frederic,Ousmam,Paul,Virginie,Gerard%
}

\noindent
La variable 1 est : \variableI\\
La variable 2 est : \variableII\\
La variable 3 est : \variableIII\\
La variable 4 est : \variableIV\\
La variable 5 est : \variableV\\
La variable 10 est : \variableX\\
La variable 11 est : \variableXI\\
La variable 12 est : \variableXII\\
La variable 13 est : \variableXIII\\
La variable 14 est : \variableXIV\\
FIN

\end{document}

安全のためには、

\uppercase\expandafter{%
  \expandafter\def\expandafter\df@temp\expandafter{%
    \romannumeral\count@
  }%
}%
\expandafter\newcommand\csname variable\df@temp\expandafter\endcsname
  \expandafter{\next}%

一部のモジュールは拡張不可能な方法で再定義される!!ため、としてマークされた行の代わりに を使用します。babel\@Roman

ただし、 の引数では行末を保護する必要があることに注意してください。はコンマ区切りの前後のスペースを無視するため、 このバージョン\DefineVariablesではこれは必要ありません。expl3\clist_map_inline:nn

答え2

いくつかの高度な TeX プリミティブ ツールを使用できます:

\newcount\varnum
\def\DefinitionVariables#1{\varnum=0 \defvarA#1,\end,}
\def\defvarA#1#2,{%
   \ifx\end#1\else
      \advance\varnum by1
      \uppercase\expandafter
         {\expandafter\def\expandafter\tmp\expandafter{\romannumeral\varnum}}%
      \expandafter\def\csname variable\tmp\endcsname{#1#2}%
      \expandafter\defvarA\fi
}

\DefinitionVariables{
  Laetitia,Patrick,Marie,Michel,Dieter,Sammy,Barbara,Donna,Ivan,
  Pierre,Rene,Frederic,Ousmam,Paul,Virginie,Gerard
}

La variable 1 est : \variableI\\
La variable 2 est : \variableII\\
La variable 3 est : \variableIII\\
La variable 4 est : \variableIV\\
La variable 5 est : \variableV\\
La variable 10 est : \variableX\\
La variable 11 est : \variableXI\\
La variable 12 est : \variableXII\\
La variable 13 est : \variableXIII\\
La variable 14 est : \variableXIV\\

関連情報