
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.
Ich vermute, dass mir hier der Verweis auf ein Argument fehlt, das beim Aufruf von B erweitert werden muss. Ich habe versucht, mehrere zu verwenden, #
da es sich hier anscheinend um verschachtelte Argumente handelt, aber ich habe das Gefühl, dass dies nicht das ist, was ich brauche.
Der Punkt, mit dem ich Schwierigkeiten habe, ist: „ #1
(um auf das erste Argument innerhalb der Funktion zu zeigen, die die Selbstfunktion aufruft (dh \variable1
))“ sollte durch „Laetitia“ ersetzt werden, da dies das erste Argument des Makros B ist.
Sie finden im MWE:
- Automatisierungsversuch 1: Ich habe es ohne versucht
xparse
- Automatisierungsversuch 2: mit
xparse
- der handgemachte Code dessen, was ich erreichen möchte.
Alle drei können einzeln ausgeführt werden, indem am Anfang der \iffalse
/ -Befehl umgeschaltet wird.\iftrue
Jeder Hinweis wäre hilfreich!
\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}
=============================================================================== Danke für die Antwort von @egreg.
Weiterverfolgung vonMakrofabrik und beim Aufruf übergebenes Argument (Teil 2)
Antwort1
Sie können einige erweiterte expl3
Tools verwenden:
\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}
Hier ist eine „klassische“ Version:
\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}
Um auf der sicheren Seite zu sein, wäre es besser,
\uppercase\expandafter{%
\expandafter\def\expandafter\df@temp\expandafter{%
\romannumeral\count@
}%
}%
\expandafter\newcommand\csname variable\df@temp\expandafter\endcsname
\expandafter{\next}%
anstelle der als markierten Zeile !!
, da einige babel
Module \@Roman
auf nicht erweiterbare Weise neu definiert werden.
Beachten Sie jedoch, dass Zeilenenden im Argument geschützt werden müssen \DefineVariables
. Dies ist in der expl3
Version nicht erforderlich, da \clist_map_inline:nn
Leerzeichen um die Kommatrennzeichen ignoriert werden.
Antwort2
Sie können einige erweiterte TeX-Grundwerkzeuge verwenden:
\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\\