Latex 动态命名宏不起作用

Latex 动态命名宏不起作用

在此 MWE 中,\Nba未创建。如何拥有它?

编辑\newcommand用 代替\gdef使\Nba存在但赋予幻想价值?有什么想法吗?

\documentclass[10pt,a4paper,french]{article}
\usepackage{tikz,xstring}

\pgfmathsetseed{\number\pdfrandomseed}

\newcommand{\Range}[2]{%
    \xdef\NbMin{#1}%
    \xdef\NbMax{#2}%
}

\newcommand{\Numbers}[1]{%
    \foreach \i in {#1} {%
    %
    \StrGobbleLeft{\i}{1}[\Decimal]
    \StrLeft{\i}{1}[\Letter]
    %
    \IfStrEq{\Decimal}{}{%
    % integer in the range
    \pgfmathparse{int(\NbMin+random()*(\NbMax-\NbMin))}%
    }{%
    % décimal in the range
    \pgfmathparse{%
    round((\NbMin+random()*(\NbMax-\NbMin))*10^\Decimal)/10^\Decimal}%
    } % \pgfmathprintnumber -- problème d'arrondi
    \Letter\ -- \pgfmathprintnumber{\pgfmathresult}%
    \expandafter\newcommand\csname Nb\Letter\endcsname{%
                            \pgfmathprintnumber{\pgfmathresult}}
    }
}

\begin{document}

\Range{-10}{10}
\Numbers{a1,b,c3}

% \Nba

\end{document}

答案1

大胆猜测:您想要\Numbers{c3}定义一个宏\Nbc,该宏存储指定范围内的随机数,带有三位小数,如果没有指定数字,则为整数。

这是一个expl3依赖于pdflatex生成随机数的实现。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\Range}{mm}
 {
  \int_gset:Nn \g_tarass_nb_min_int { #1 }
  \int_gset:Nn \g_tarass_nb_max_int { #2 }
 }
\NewDocumentCommand{\Numbers}{m}
 {
  \clist_map_inline:on { #1 }
   {
    \tarass_process_numbers:n { ##1 }
   }
 }

\int_new:N \g_tarass_nb_min_int
\int_new:N \g_tarass_nb_max_int

\cs_new_protected:Npn \tarass_process_numbers:n #1
 {
  \tl_if_empty:xTF { \tl_tail:n { #1 } }
   {
    \tarass_process_item:nn { #1 } { 0 }
   }
   {
    \tarass_process_item:xx { \tl_head:n { #1 } } { \tl_tail:n { #1 } }
   }
 }

\cs_new_protected:Npn \tarass_process_item:nn #1 #2
 {
  \cs_new:cpx { Nb#1 }
   {
    \fp_eval:n
     {
      round
       (
        \g_tarass_nb_min_int +
        \tarass_random:n { \g_tarass_nb_max_int - \g_tarass_nb_min_int }
        , #2
       )
     }
   }
 }

\cs_new:Npn \tarass_random:n #1
 {
  \fp_eval:n
   {
    (
     ( \pdfuniformdeviate \c_ten_thousand )/\c_ten_thousand
    ) * (#1)
   }
 }

\cs_generate_variant:Nn \tarass_process_item:nn { xx }
\cs_generate_variant:Nn \tl_if_empty:nTF { x }
\cs_generate_variant:Nn \clist_map_inline:nn { o }

\ExplSyntaxOff

\begin{document}

\Range{-10}{10}
\Numbers{a1,b,c3}

$\Nba$ $\Nbb$ $\Nbc$

\end{document}

\c_ten_thousand如果需要更高的精度,请将其更改为更大的数字。

在此处输入图片描述

答案2

将新命令写为Nb\Letter不是标准方式,\gdef它需要\name而不是name\Letter。因此我将其定义\Nba\def\Nba{Nb\Letter}

\documentclass[10pt,a4paper]{article}
\usepackage{tikz,xstring}
\pgfmathsetseed{\number\pdfrandomseed}

\def\Range#1#2{%
    \xdef\NbMin{#1}%
    \xdef\NbMax{#2}%
}     
\def\Numbers#1{%
    \foreach \i in {#1} {%
    \StrGobbleLeft{\i}{1}[\Decimal]
    \StrLeft{\i}{1}[\Letter]
    %
    \IfStrEq{\Decimal}{}{%
    % integer in the range
    \pgfmathparse{int(\NbMin+random()*(\NbMax-\NbMin))}%
    }{%
    % décimal in the range
    \def\Nba{Nb\Letter}
    \pgfmathparse{%
    round((\NbMin+random()*(\NbMax-\NbMin))*10^\Decimal)/10^\Decimal}%
    } % \pgfmathprintnumber -- problème d'arrondi
    \Letter\ -- \pgfmathprintnumber{\pgfmathresult}% 
    \Nba\ -- \pgfmathprintnumber{\pgfmathresult}%
    }
}    
\begin{document}
\Range{-10}{10}
\Numbers{a1,b1,c3}    
%\Nba    
\end{document}

在此处输入图片描述

相关内容