在此 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}