
私は別のマクロ (B) を生成するファクトリー マクロ (A) を作成しています。マクロ B は、呼び出されたときに変数のパラメーターとして取得される内容に影響を及ぼします。現在、A なしでこれらすべてを実行できますが、多くの書き直しが必要になるため、スケーラブルではありません。
見る呼び出し時に渡されるマクロファクトリと引数 全体の文脈に対して。
前の質問の回答に続いて(呼び出し時に渡されるマクロファクトリと引数) 、まだいくつかのポイントが残っている新しい MWE を作成できます。
\clist_map_inline
ポイント1:各引数を人為的に区切るために カンマを入れました- ポイント2:定義に引数のリストを入れました(3つのm):
\NewDocumentCommand{\DefinitionVariables}{ m m m }%
- ポイント3: すべての引数を関数内に配置します
\clist_map_inline
。\clist_map_inline:nn { #1, #2, #3}%
したがって、これらの変更に伴う質問は次のとおりです。
- ポイント 1: カンマを入れずに済むようにするにはどうすればいいでしょうか?
\clist_map_inline
カンマは組み込みの区切り文字なので、関数に関係していると思います。引数の中にカンマがあると、関数はそれを区切り文字と見なして切り捨ててしまうため、問題が発生します。 のようなものを用意しようかと考えていました。\foreach argument in {all the arguments}
そのようなものは存在するのでしょうか? - ポイント2: これを動的にするにはどうすればよいでしょうか? 動的とは、関数が3つの引数を取ることもありますが、7つまたは9つ(1から9の間)を取ることもあります。
numberOfArgument * m
ポイント 3: 前のポイントと関連していますが、これをハードコードせずに動的にするにはどうすればよいでしょうか? (これで
\foreach argument in {all the arguments}
解決します)。\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
どのような助けでも大歓迎です!
答え1
以前のコードの開発バージョンです。新しいコードは、\DefinitionVariables
固定名と区切り文字の 2 つのオプション引数を受け入れます。区切り文字は (ほぼ) 完全に任意で、変数に与えたい値に含まれない文字 (またはその組み合わせ) を選択するだけです。
\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}
引数を中括弧で区切ることができる再帰に基づく別のルーチン。開いた中括弧が続く限り、新しい変数が定義されます。
\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}