我有 7 个按递增顺序排列的值,a_0,a_1,...,a_6
我想在极值的区间上编写一个阶跃函数a_i
,因此函数 f 使得,
f(x)=f_0 on [a_0,a_1[, f_1 on [a_1,a_2[..., f_5 on [a_5,a_6[
我的情况的程序为每个实数给出了 f 的值。在 latex 上执行此操作的最简单方法是什么?.. 我认为这是个简单的程序,类似循环之类的东西\multido
可以完成这项工作,例如使用ifthen
包,但我不熟悉 LaTeX 编程。. 我不知道如何声明变量序列并为这些变量赋值。
对我来说,理想的情况是获得一个宏\Step{\alpha,a_i,a_{i+1}}
,当f_{i}
条件满足时
{a_i\leq\alpha<a_{i+1}}
是正确的,对于几个值\alpha...
谢谢
答案1
有以下可能性:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\definestepfunction}{mmm}
{ % #1 is the function's name
% #2 is the semicolon separated subdivision
% #3 is the semicolon separated list of values
\faouzi_step_define:nnn { #1 } { #2 } { #3 }
}
\cs_new_protected:Nn \faouzi_step_define:nnn
{
\tl_clear:N \l_faouzi_step_temp_tl
\seq_set_split:Nnn \l_faouzi_step_division_seq { ; } { #2 }
\seq_set_split:Nnn \l_faouzi_step_values_seq { ; } { #3 }
\int_step_inline:nnnn { 1 } { 1 } { \seq_count:N \l_faouzi_step_division_seq - 1 }
{
\tl_put_right:Nx \l_faouzi_step_temp_tl
{
\exp_not:N \faouzi_step_compare:nnnn { ########1 }
{ \seq_item:Nn \l_faouzi_step_division_seq { ##1 } }
{ \seq_item:Nn \l_faouzi_step_division_seq { ##1 + 1 } }
{ \seq_item:Nn \l_faouzi_step_values_seq { ##1 } }
}
}
\cs_new:cV { faouzi_step_ \cs_to_str:N #1 :n } \l_faouzi_step_temp_tl
\cs_new_eq:Nc { #1 } { faouzi_step_ \cs_to_str:N #1 :n }
}
\cs_generate_variant:Nn \cs_new:cn { cV }
\cs_new:Nn \faouzi_step_compare:nnnn
{
\fp_compare:nT { #2 <= #1 < #3 } { #4 }
}
\ExplSyntaxOff
\definestepfunction{\test}{0;1;2;3}{a;b;c}
\begin{document}
Should be a: \test{0}\par
Should be a: \test{0.2}\par
Should be b: \test{1}\par
Should be b: \test{1.99999}\par
Should be c: \test{2}\par
Should be c: \test{2.3}\par
\end{document}
构建宏的\test
目的是对其参数进行比较,如果参数适合其中一个子区间,则传递该值。
如果参数不在域中,则不返回任何内容。可以针对这种情况添加错误检查。
请注意,值可以是任意标记。
带有错误检查的版本:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\definestepfunction}{mmm}
{ % #1 is the function's name
% #2 is the semicolon separated subdivision
% #3 is the semicolon separated list of values
\faouzi_step_define:nnn { #1 } { #2 } { #3 }
}
\cs_new_protected:Nn \faouzi_step_define:nnn
{
\tl_clear:N \l_faouzi_step_temp_tl
\seq_set_split:Nnn \l_faouzi_step_division_seq { ; } { #2 }
\seq_set_split:Nnn \l_faouzi_step_values_seq { ; } { #3 }
\int_step_inline:nnnn { 1 } { 1 } { \seq_count:N \l_faouzi_step_division_seq - 1 }
{
\tl_put_right:Nx \l_faouzi_step_temp_tl
{
\exp_not:N \faouzi_step_compare:nnnn { ########1 }
{ \seq_item:Nn \l_faouzi_step_division_seq { ##1 } }
{ \seq_item:Nn \l_faouzi_step_division_seq { ##1 + 1 } }
{ \seq_item:Nn \l_faouzi_step_values_seq { ##1 } }
}
}
\cs_new:cV { faouzi_step_ \cs_to_str:N #1 _aux:n } \l_faouzi_step_temp_tl
\cs_new:cx { faouzi_step_ \cs_to_str:N #1 :n }
{
\exp_not:N \faouzi_step_check:nnnn
{ \cs_to_str:N #1 }
{ ##1 }
{ \seq_item:Nn \l_faouzi_step_division_seq { 1 } }
{ \seq_item:Nn \l_faouzi_step_division_seq { -1 } }
}
\cs_new_eq:Nc { #1 } { faouzi_step_ \cs_to_str:N #1 :n }
}
\cs_generate_variant:Nn \cs_new:cn { cV }
\cs_new:Nn \faouzi_step_compare:nnnn
{
\fp_compare:nT { #2 <= #1 < #3 } { #4 }
}
\cs_new:Nn \faouzi_step_check:nnnn
{
\fp_compare:nTF { #3 <= #2 < #4 }
{
\use:c { faouzi_step_#1_aux:n } { #2 }
}
{
\msg_error:nnnnn { faouzi/step } { out-of-bounds } { #2 } { #3 } { #4 }
}
}
\msg_new:nnnn { faouzi/step } { out-of-bounds }
{% error message
Value~#1~out~of~bounds~[#2,#3)
}
{% help message
The~given~value~'#1'~is~out~of~bounds,~the~function~
is~defined~in~the~interval~[#2,#3)
}
\ExplSyntaxOff
\definestepfunction{\test}{0;1;2;3}{a;b;c}
\begin{document}
Should be a: \test{0}\par
Should be a: \test{0.2}\par
Should be b: \test{1}\par
Should be b: \test{1.99999}\par
Should be c: \test{2}\par
Should be c: \test{2.3}\par
Gives error: \test{-1}\par
Gives error: \test{3}\par
Gives error: \test{3.1}\par
\end{document}