У меня есть макрос lVars
, определенный с использованием foreach
из pgffor
пакета (частьПГФ) как:
\newcommand{\lVars}[1]{\foreach \x [count=\ii] in {#1}{
\ifnum\ii=1{} \else {,} \fi \lVar[\x]}
}
Предполагаемое использование в терминах типа \exists \lVars{a, b, c, d}
, что дает результат \exists \lVar[a], \lVar[b], \lVar[c], \lVar[d]
. Команда \lVar[a]
является еще одной пользовательской командой формы \newcommand{\lVar}[1][x]{\textsc{#1}}
, но может стать более сложной в ближайшее время. Затем я использую новые квантифицированные \lVar
элементы внутри больших форумов.
Однако я очень ленив. Мне бы хотелось, чтобы этот макрос выставлял каждый элемент списка как новую команду в форме \lA
, \lB
и т. д., которые сами по себе расширяются до фактического базового \lVar[A]
, \lVar[B]
.... Эти новые команды сделают мою формульную нотацию значительно менее многословной. Эти новые команды должны действовать до следующего раза a
, когда , b,
... будут использованы в параметре списка макроса lVars
. Таким образом, общее использование будет в таких ситуациях:
\begin{displaymath}
\begin{array}{l}
\exists \lVars{a, b, c}.~ \lA = \lB \implies \lA = \lC \\
\lC = 0 \implies \lA = 0
\exists \lVars{a, b}.~ \lA \neq \lB
\end{array}
\end{displaymath}
And, as we see in the term $\lA = \lB$, the implication...
Я экспериментировал с различными перестановками на \newcommand
и \def
внутри тела foreach
, но безуспешно. Есть какие-нибудь советы или подсказки?
решение1
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\lVars}{m}
{
% cycle through the argument
\clist_map_inline:nn { #1 }
{
% print the variable
\lVar[##1]
% if the variable is a, define \lA
\tl_to_uppercase:n
{
\cs_gset_protected:cpn { \c_wright_prefix_tl ##1 }
}
{ \lVar[##1] }
}
}
% We need to store the `l' prefix in a control sequence to hide it from \uppercase
\tl_const:Nn \c_wright_prefix_tl { l }
\ExplSyntaxOff
\newcommand{\lVar}[1][x]{\textsc{#1}}
\begin{document}
\begin{displaymath}
\begin{array}{l}
\exists \lVars{a, b, c}.~ \lA = \lB \implies \lA = \lC \\
\lC = 0 \implies \lA = 0
\exists \lVars{a, b}.~ \lA \neq \lB
\end{array}
\end{displaymath}
And, as we see in the term $\lA = \lB$, the implication...
\end{document}
Однако определение \lC
сохранится навсегда; если вы планируете использовать его в разных ячейках объекта, array
необходимо глобальное определение.
Версия, которая принимает многобуквенные переменные и определяет \lFoo
из \lVars{foo}
:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\lVars}{m}
{
% cycle through the argument
\clist_map_inline:nn { #1 }
{
% print the variable
\lVar[##1]
% build the name with the first letter uppercase
\wright_make_var_name:n { ##1 }
\cs_gset_protected:cpn { \l__wright_var_name_tl } { \lVar[##1] }
}
}
\tl_const:Nn \c_wright_prefix_tl { l }
\cs_new:Npn \wright_make_var_name:n #1
{
% get the first letter and uppercase it
\tl_to_uppercase:n
{
\tl_set:Nx \l__wright_var_name_tl { \tl_head:n {#1} }
}
% add the rest
\tl_put_right:Nx \l__wright_var_name_tl { \tl_tail:n {#1} }
% add the prefix
\tl_put_left:Nx \l__wright_var_name_tl { \c_wright_prefix_tl }
}
\ExplSyntaxOff
\newcommand{\lVar}[1][x]{\textsc{#1}}
\begin{document}
\begin{displaymath}
\begin{array}{l}
\exists \lVars{a, b, c}.~ \lA = \lB \implies \lA = \lC \\
\lC = 0 \implies \lA = 0
\exists \lVars{a, b}.~ \lA \neq \lB
\end{array}
\end{displaymath}
And, as we see in the term $\lA = \lB$, the implication...
Now $\forall\lVars{foo}\;\lFoo=0$
\end{document}