Makrofabrik und beim Aufruf übergebenes Argument (Teil 2)

Makrofabrik und beim Aufruf übergebenes Argument (Teil 2)

Ich erstelle ein Fabrikmakro (A), das ein weiteres Makro (B) erzeugt. Makro B besteht darin, zu beeinflussen, was es als Parameter an Variablen erhält, wenn es aufgerufen wird. Ich kann das alles derzeit ohne A machen, aber das ist nicht skalierbar, weil es viel Umschreiben erfordert.

SehenMakrofabrik und beim Aufruf übergebenes Argument für den gesamten Kontext.

Im Anschluss an die Antworten auf die Frage die vorherige Frage (Makrofabrik und beim Aufruf übergebenes Argument) könnte ich ein neues MWE mit einigen noch offenen Punkten erstellen:

  • Punkt 1: Ich habe Kommas eingefügt, \clist_map_inlineum jedes Argument künstlich abzugrenzen
  • Punkt 2: Ich habe die Liste der Argumente in die Definition eingefügt (die 3 m):\NewDocumentCommand{\DefinitionVariables}{ m m m }%
  • Punkt 3: Ich habe alle Argumente in die \clist_map_inlineFunktion eingefügt:\clist_map_inline:nn { #1, #2, #3}%

Die Fragen, die sich aus diesen Änderungen ergeben, lauten:

  • Punkt 1: Wie kann ich vermeiden, Kommas setzen zu müssen? Ich vermute, es hat mit der \clist_map_inlineFunktion zu tun, da das Komma ein eingebautes Trennzeichen ist. Es wirft ein Problem auf, wenn ein Argument ein Komma enthält, da die Funktion es ausschneidet, da sie es als Trennzeichen betrachtet. Ich dachte daran, so etwas wie ein zu haben \foreach argument in {all the arguments}. Gibt es so etwas?
  • Punkt 2: Wie kann ich das dynamisch machen? Mit dynamisch meine ich: Manchmal kann die Funktion 3 Argumente annehmen, manchmal aber auch 7 oder 9 (zwischen 1 und 9). So etwas wienumberOfArgument * m
  • Punkt 3: Dies hängt mit dem vorherigen Punkt zusammen. Wie kann ich dies auch dynamisch und nicht fest codiert machen? (das \foreach argument in {all the arguments}würde das Problem lösen).

    \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
    %==================================================================================
    
    \iffalse
    \fi
    \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 5  : utilise la syntaxe expl3
    \iftrue
    %\iffalse
    
    \ExplSyntaxOn
    \NewDocumentCommand{\DefinitionVariables}{ m m m }%     <=== point 2 : there is as much 'm' as there is arguments
     {
      \int_zero:N \l_tmpa_int
      %\clist_map_inline:nn { #1 }
      \clist_map_inline:nn { #1, #2, #3}%         <=== point 3 : allows not to put comas in the arguments, but rise the pb if there is comas inside the argument // 
       {
        \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
    
    \DefinitionVariables{Laetitia, 8 }{Pierre, 10}{Cedric}%        <=== point 1 : coma inside the argument will be considered as a delimiter, so the mapping of variable will be wrong
    La variable 2 est : \variableII  \\  FIN\\
    La variable 1 est : \variableI  \\  FIN\\
    La variable 3 est : \variableIII  \\  FIN\\
    La variable 1 est : \variableI  \\  FIN\\
    \fi
    

Ich bin für jede Hilfe sehr dankbar!

Antwort1

Eine Entwicklungsversion des vorherigen Codes. Die neue Version \DefinitionVariablesakzeptiert zwei optionale Argumente, den festen Namen und das Trennzeichen. Letzteres ist (fast) völlig beliebig. Wählen Sie einfach ein Zeichen (oder eine Kombination davon), das in den Werten, die Sie den Variablen zuweisen möchten, nicht vorkommt.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\DefinitionVariables}{O{variable}mO{,}}
 {
  \aline_df:nnn { #1 } { #2 } { #3 }
 }

\int_new:N \l_aline_df_int
\seq_new:N \l_aline_df_values_seq

\cs_new_protected:Nn \aline_df:nnn
 {
  \int_zero:N \l_aline_df_int
  \seq_set_split:Nnn \l_aline_df_values_seq { #3 } { #2 }
  \seq_map_inline:Nn \l_aline_df_values_seq
   {
    \int_incr:N \l_aline_df_int
    \tl_clear_new:c { #1 \int_to_Roman:n { \l_aline_df_int } } 
    \tl_set:cn { #1 \int_to_Roman:n { \l_aline_df_int } } { ##1 }
   }
 }
\ExplSyntaxOff

\begin{document}

\DefinitionVariables{
  Laetitia, 8; Patrick, 10; Cedric
}[;]

\noindent
La variable 1 est : \variableI\\
La variable 2 est : \variableII\\
La variable 3 est : \variableIII\\
FIN

\bigskip

\DefinitionVariables[var]{A,B,C}

\noindent
La var 1 est : \varI\\
La var 2 est : \varII\\
La var 3 est : \varIII\\
FIN

\end{document}

Bildbeschreibung hier eingeben

Eine andere, auf einer Rekursion basierende Routine, die es erlaubt, die Argumente durch Klammern zu trennen. Sofern eine öffnende Klammer folgt, wird eine neue Variable definiert.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\DefinitionVariables}{O{variable}}
 {% pass control to an inner function
  % #1 is the "name part", default "variable"
  \aline_df:n { #1 }
 }

% define an integer variable
\int_new:N \l_aline_df_int

\cs_new_protected:Nn \aline_df:n
 {
  % the integer variable assigns the trailing roman number
  \int_zero:N \l_aline_df_int
  % start the recursion
  \__aline_df_peek:n { #1 }
 }
\cs_new_protected:Nn \__aline_df_peek:n
 {
  % check whether the next token is { (ignoring spaces)
  \peek_catcode_ignore_spaces:NT \c_group_begin_token
   {
    % if it is, increment the counter and call
    % \__aline_df_next:nn { #1 } { #2 }, where
    % { #2 } is the next braced group
    \int_incr:N \l_aline_df_int
    \__aline_df_next:nn { #1 }
   }
 }
\cs_new_protected:Nn \__aline_df_next:nn
 {
  % if the variable is already defined, clear it
  % otherwise create it
  \tl_clear_new:c { #1 \int_to_Roman:n { \l_aline_df_int } }
  % set the variable
  \tl_set:cn { #1 \int_to_Roman:n { \l_aline_df_int } } { #2 }
  % restart the recursion
  \__aline_df_peek:n { #1 }
 }
\ExplSyntaxOff

\begin{document}

\DefinitionVariables{Laetitia, 8}{Patrick, 10}{Cedric}

\noindent
La variable 1 est : \variableI\\
La variable 2 est : \variableII\\
La variable 3 est : \variableIII\\
FIN

\bigskip

\DefinitionVariables[var]{A}{B}{C}{D}{E}{F}{G}{H}{I}{J}{K}

\noindent
La var 1 est : \varI\\
La var 2 est : \varII\\
La var 3 est : \varIII\\
La var 11 est : \varXI\\
FIN

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen