如何创建使用 l3 语法计算函数值的表宏

如何创建使用 l3 语法计算函数值的表宏

对于持续的值,我尝试了这个并且它的结果如下:

在此处输入图片描述

命令是

\TabVal[decimals](startvalue)[step]{numbers}{function}{text1}{text2}[width 2nd column]

所以这个代码并不好,因为我不理解我尝试的所有事情。

\documentclass{article}
\usepackage{xfp,expl3,l3keys2e}
\usepackage{xintexpr}
\usepackage{siunitx}

\ExplSyntaxOn
\cs_new_protected:Npn \For #1#2#3#4
  {
    \int_step_function:nnnN {#1} {#2} {\fp_eval:n {#1+(#3-1)*#2}} #4
  }
\ExplSyntaxOff

\ExplSyntaxOn
\NewDocumentCommand{\Zuord}{mmO{2}}{%
\def\xX{#1}
\num{\fpeval{round(#2,#3)}}
}
\ExplSyntaxOff

\NewDocumentCommand{\xVal}{m}{&\num{#1}}
\NewDocumentCommand{\FVal}{m}{&\Zuord{#1}{\funci}[\Dez]}
\NewDocumentCommand{\TabVal}{O{2}D(){1}O{1}mmmmO{0.8cm}}
{\def\funci{#5}\def\Dez{#1}
\begin{tabular}{c*{#4}{|>{\centering\arraybackslash}p{#8}}}
    $#6$      \For{#2}{#3}{#4}\xVal  \\\hline
    $#7$ \For{#2}{#3}{#4}\FVal
\end{tabular}}

\begin{document}
\TabVal[1](3)[4]{8}{ln(\xinttheexpr \xX! \relax)}{x}{\ln(x!)}[0.7cm]
\end{document}

但是对于值列表,我尝试了以下方法,但第二列中的值应该根据第一列中的值计算得出。然后我想结合这两种不同的方法,但我做不到。

如果有人能帮助我,我会非常高兴。

在此处输入图片描述

\documentclass{article}
\usepackage{xfp,expl3,l3keys2e}
\usepackage{xintexpr}
\usepackage{siunitx}
\usepackage[distiller]{pstricks}

\ExplSyntaxOn
\NewDocumentCommand{\Zuord}{mmO{2}}{%
\def\xX{#1}
\num{\fpeval{round(#2,#3)}}%sin(3.5)/2 + 2e-3
}
\ExplSyntaxOff

\NewDocumentCommand{\werteT}{mm}
{%
    \begin{tabular}{ >{\centering\arraybackslash}p{0.5cm}|>{\centering\arraybackslash}p{0.8cm} }
    $x$ & $f(x)$ \\\hline
        \werte{#1}{#2}
    \end{tabular}
}

\ExplSyntaxOn
\NewDocumentCommand{\werte}{mm}
 {
  \tl_clear:N \l_tmpa_tl
  \int_step_inline:nnnn { 1 } { 1 } { \clist_count:n { #1 } }
   {
    \tl_put_right:Nx \l_tmpa_tl
     {
      \clist_item:nn { #1 } { ##1 } &
      \clist_item:nn { #2 } { ##1 }
      \exp_not:n { \\  }
     }
   }
  \tl_use:N \l_tmpa_tl
 }
\ExplSyntaxOff

\begin{document}

\def\funci{(\xX)^2 + 3}
\werteT{1, 2, 3.5, 4}
{\Zuord{1}{\funci}[2],\Zuord{2}{\funci}[2],\Zuord{3.5}{\funci}[2],\Zuord{4}{\funci}[2]}

\end{document} 

答案1

主要问题是映射从一个单元格开始而在另一个单元格结束,这是不可能的,因为表格单元格会形成组。

这是一个更简单的实现,其中表行是预先构建的;指定函数的语法更好:变量用 表示#1

\documentclass{article}
\usepackage{xparse}
\usepackage{siunitx}

\ExplSyntaxOn

\NewDocumentCommand{\functiontable}{mmO{2}}
 {% #1 = list of values, #2 = function, #3 = number of decimal digits
  \thomas_functiontable:nnn { #1 } { #2 } { #3 }
 }

\seq_new:N \__thomas_functiontable_rows_seq

\cs_new_protected:Nn \thomas_functiontable:nnn
 {
  \cs_set:Nn \__thomas_functiontable_function:n  { #2 }
  \seq_clear:N \l__thomas_functiontable_rows_seq
  \clist_map_inline:nn { #1 }
   {
    \seq_put_right:Nx \l__thomas_functiontable_rows_seq
     {
      ##1 & \num{ \fp_eval:n { round( \__thomas_functiontable_function:n { ##1 }, #3 ) } }
     }
   }
  \begin{tabular}{c|c}
  $x$ & $f(x)$ \\
  \hline
  \seq_use:Nn \l__thomas_functiontable_rows_seq { \\ }
  \end{tabular}
}

\ExplSyntaxOff

\begin{document}

\functiontable{1, 2, 3.5, 4}{ #1^2+3 }

\bigskip

\functiontable{0, 30, 45, 60, 90}{ sind(#1) }[5]

\end{document} 

诀窍是根据第二个参数定义一个临时宏。

在此处输入图片描述

相关内容