自動標識表の作成

自動標識表の作成

代数学・微積分学の分野で不等式を解く場合、表を使用して関係する因子の挙動をスケッチすると便利な場合があります。例を挙げるとすべてが明らかになります。たとえば、次のような問題を解きたいとします。

不平等

関連するテーブルは次のとおりです。

テーブル

不等式が の形式の因数である場合、1/(x-a)表では||の下に二重線を使用して示されることがありますa。これらを という制約 と呼びます。

微積分を教えるときに、導関数の符号、凹面性、臨界点などを扱うための同様の表がいくつかあります。

私が欲しいのは:

  • 因数が符号を変える数値 (-3、0、1) を引数として受け取る新しいタイプのテーブル環境。
  • そのような数値が制限であることを示す方法。
  • 例の最初の 2 行は次のように入力する必要があります。

    \begin{signtable}{-3}{0}{1}
      x & -  & - & + & + \\
    \end{signtable}`
    

そのため、この問題を解決する方法はたくさんあると思うので、それを知りたいと思い、これを投稿しました。

これを TikZ でもっとうまくできるのではないかと思います。

これまでのところ、例のコードは次のとおりです。

\documentclass{article}
\usepackage{array}

\begin{document}
\begin{array}{*{5}{c|}@{}c@{}}
\multicolumn{6}{@{}c@{}}{
\begin{array}{*{10}{@{}l@{}}}
\phantom{x(x-1)(x+3} & -\infty & \hspace*{5pt} & -3 & \phantom{-} & 0 & \phantom{+}\hspace*{3pt} & 1 & \phantom{+} & +\infty
\end{array}
}\\
\cline{1-5}
x                     &  - & - & + & + &\\
\cline{1-5}
x-1                   &  - & - & - & + &\\
\cline{1-5}
x+3                   &  - & + & + & + &\\
\cline{1-5}
x(x-1)(x+3)           &  - & + & - & + &
\end{array}
\end{document}

答え1

新しいパッケージの作成に時間をかけすぎる前に、tableaux、tablor、tkz-tab の各パッケージを確認することをお勧めします。コード例は読みやすいですが、3 つのパッケージのドキュメントはすべてフランス語です。私はこれらのマニュアルの例のいくつかを LateX クラスの生徒のデモンストレーションとして実行しました。http://www.texdoc.net/それぞれのドキュメントをすぐに入手できます。

答え2

これはいいアイデアだし、楽しいかもしれないと思ったので、やってみました。自分でも使ってみようと思っているので、質問の詳細からは外れますが、質問を念頭に置いて、かなり近いものにできました。

  • 構文:\SignTable{comma separated factors}{comma separated zeros}
  • 変数はz
  • l3fp が認識する任意の関数を受け入れます。以下でいくつか使用しましたが、詳細はドキュメントを参照してください。構文は重要です。適切な場合は、適切な括弧と乗算記号を使用してください。例外: sin zln zおよびなどの関数exp z
  • これは、使用される値が関数のゼロ/不連続点であり、関心のある間隔ですべてが考慮されている場合にのみ信頼できます。ランダムな数字をいくつか選択した場合、エラーが発生する可能性があります。とにかく、私はそれが信頼できるとほぼ確信しています。問題を解決するのに多くの時間を費やしました。
  • のような関数を使用してln x負の値をテストする場合は注意してください
  • 重要な数字を列の中央に配置するために、私はハックっぽいことをしました (私のコード全体がハックっぽいと言えると思います!)。これにより、垂直ルールを使用して見栄えを良くすることが難しくなりました (ルールbooktabs/垂直ルールの相互作用は別として。したがって、垂直ルールはありません)。
  • 「制限」をマークするために、\fbox他の方法も試すことができました。

\SignTable{sin z,z+6,2^z,z^3,1/(z+4)}{-6,-4,0,\pi}次のような結果になります (はい、ゼロは無視しましたsin z:)

ここに画像の説明を入力してください

コードの壁

\documentclass{article}
\usepackage{xparse}
\usepackage{booktabs}
\usepackage{array}
\usepackage{mathtools}
\ExplSyntaxOn

% table rows
\tl_new:N \l_ft_rows_tl
% actual function
\tl_new:N \g_the_funct_tl
% table setup, first and last rows require special handling
\tl_new:N \g_ft_first_row_tl
\tl_new:N \l_ft_col_set_tl
\tl_new:N \l_last_row_tl
% holds points of discontinuity, if any
\seq_new:N \g_asys_seq
% set of (loosely) "critical points"
\seq_new:N \g_ft_pts_seq
% pts at which to evaluate function to determine sign
\seq_new:N \g_ft_eval_pts_seq
% holds the factors that are input
\seq_new:N \g_ft_functs_seq

% arg 1 is comma separated list of factors
% arg2 is set of "critical points"
\NewDocumentCommand { \SignTable } { m m }
    {
        % function names should be fairly self explanatory
        \ft_def_functs:n {#1}
        \ft_set_vals:n {#2}
        \seq_map_function:NN \g_ft_functs_seq \ft_eval_funct_rows:n
            % this looks for entered values that give infinite results and marks them.
        \seq_map_function:NN \g_ft_functs_seq \ft_find_asys:n
        \ft_last_row:
        \ft_set_cols:
        \ft_first_row:
        % space the table a bit more openly
        \renewcommand{\arraystretch}{1.5}
        % \l_ft_col_set_tl contains column spec
        \exp_args:Nnx\begin{array}{\tl_use:N \l_ft_col_set_tl}
        \tl_use:N \g_ft_first_row_tl
    \toprule
    \tl_use:N \l_ft_rows_tl
        \bottomrule
        \tl_use:N \l_last_row_tl
    \end{array}
    }

% grab factors from arg
\cs_new:Npn \ft_def_functs:n #1
    {
        \seq_gset_split:Nnn \g_ft_functs_seq { , } {#1}
    }

% just average consecutive critical numbers for test points
\cs_new:Npn \ft_set_vals:n #1
    {
        \seq_gset_split:Nnn \g_ft_pts_seq { , } {#1}
        \seq_set_eq:NN \l_tmpa_seq \g_ft_pts_seq
        \group_begin:
            \seq_get_left:NN \g_ft_pts_seq \l_tmpa_fp
            \seq_put_left:Nx \g_ft_pts_seq {\fp_eval:n {\l_tmpa_fp-1}}
            \seq_get_right:NN \l_tmpa_seq \l_tmpa_fp
            \seq_put_right:Nx \l_tmpa_seq {\fp_eval:n {\l_tmpa_fp+1}}
            \seq_mapthread_function:NNN \l_tmpa_seq \g_ft_pts_seq \ft_avg:nn
        \group_end:
    }
% helper function for the above
\cs_new:Npn \ft_avg:nn #1#2
    {
        \seq_gput_right:Nx \g_ft_eval_pts_seq {\fp_eval:n {#1/2+#2/2}}
    }

% receives a factor, does some formatting, plugs in some numbers, test sign,
% print appropriate sign.  
\cs_new:Npn \ft_eval_funct_rows:n #1
    {
        \tl_set:Nn \l_tmpa_tl {#1}
        \tl_gput_right:Nx \g_the_funct_tl {(\tl_use:N \l_tmpa_tl)*}
        \tl_remove_all:Nn \l_tmpa_tl {*}
        \tl_put_right:NV \l_ft_rows_tl \l_tmpa_tl 
        \seq_map_inline:Nn \g_ft_eval_pts_seq
            {
                \tl_set:Nn \l_tmpa_tl {#1}
                \tl_replace_all:Nnn \l_tmpa_tl {z} {(##1)}
                \fp_compare:nNnTF {\fp_eval:n {\l_tmpa_tl}}< {0}
                    {\tl_put_right:Nn \l_ft_rows_tl {&&-}}
                    {\tl_put_right:Nn \l_ft_rows_tl {&&+}}
            }
        \tl_put_right:Nn \l_ft_rows_tl {&\\}
    }

% receives a factor, plugs in critical points to see if any give infinite result
% if yes, add point to asys sequence.
\cs_new:Npn \ft_find_asys:n #1
    {
        \group_begin:
        \fp_trap:nn {invalid_operation}{none}
        \seq_map_inline:Nn \g_ft_pts_seq
            {
                \tl_set:Nn \l_tmpa_tl {#1}
                \tl_replace_all:Nnn \l_tmpa_tl {z} {(##1)}
                \fp_compare:nNnT {\fp_eval:n {\l_tmpa_tl}}={inf}
                {\seq_gput_right:Nn \g_asys_seq {##1}}
            }
        \group_end:
    }

\cs_new:Npn \ft_last_row:
    {
        % remove an extra mult operator, this is ugly
        \tl_put_right:Nn \l_last_row_tl {f(z)}
        \tl_reverse:N \g_the_funct_tl
        \tl_set:Nx \g_the_funct_tl {\tl_tail:N \g_the_funct_tl}
        \tl_reverse:N \g_the_funct_tl
        % if you want the function to appear rather than f(z)
        % uncomment the below and comment the first line above.
        %\group_begin:
            %\tl_remove_all:Nn \g_the_funct_tl {*}
            %\tl_gput_right:NV \l_last_row_tl \g_the_funct_tl
        %\group_end:
        \seq_map_inline:Nn \g_ft_eval_pts_seq
            {
                \tl_set_eq:NN \l_tmpa_tl \g_the_funct_tl
                \tl_replace_all:Nnn \l_tmpa_tl {z} {(##1)}
                \fp_compare:nNnTF {\fp_eval:n {\l_tmpa_tl}}< {0}
                    {\tl_put_right:Nn \l_last_row_tl {&&-}}
                    {\tl_put_right:Nn \l_last_row_tl {&&+}}
            }
        \tl_put_right:Nn \l_last_row_tl {&}
    }

% alternating centered and centered with zero width.
\cs_new:Npn \ft_set_cols:
    {
        \prg_replicate:nn{2+\seq_count:N \g_ft_pts_seq}{\tl_put_right:Nn \l_ft_col_set_tl {cm{0pt}}}
    }

% to center the critical points on the column separators, all I could think of was to make the 
% headings have zero size and center them on columns of zero width
\cs_new:Npn \ft_first_row:
    {
        \tl_put_right:Nn \g_ft_first_row_tl {&$\mathclap{\underset{\phantom{\downarrow}}{-\infty}}$&}
        \seq_map_inline:Nn \g_ft_pts_seq
            {
                \tl_put_right:Nn \g_ft_first_row_tl {&$\mathclap{\underset{\downarrow}{\is_asy:n {##1}}}$&}
            }
        \tl_put_right:Nn \g_ft_first_row_tl {&$\mathclap{\underset{\phantom{\downarrow}}{\infty}}$\\}
    }

% do something to the points of discontinuity
% change this to whatever works
\cs_new:Npn \is_asy:n #1
    {
        \seq_if_in:NnTF \g_asys_seq {#1}
            {\fboxsep=1pt \fbox{$#1$}}
            {#1}
    }

\ExplSyntaxOff
\begin{document}

\[
\SignTable{sin z,z+6,2^z, z^3,1/(z+4)}{-6,-4,0,\pi}
\]

\end{document}

関連情報