Erstellen einer automatisierten Zeichentabelle

Erstellen einer automatisierten Zeichentabelle

Beim Lösen einiger Ungleichungen im Rahmen des Algebra-Grundkurses ist es manchmal nützlich, das Verhalten der beteiligten Faktoren anhand einer Tabelle zu skizzieren. Anhand eines Beispiels wird alles klar – sagen wir, wir möchten Folgendes lösen:

ineq

die zugehörige Tabelle lautet:

Tisch

Wenn in der Ungleichung ein Faktor der Form vorkommt, 1/(x-a)wird dies in der Tabelle manchmal durch eine doppelte Linie ||unter dem angegeben a. Nennen wir diese Einschränkungen.

Beim Unterrichten der Infinitesimalrechnung gibt es einige ähnliche Tabellen, die sich mit dem Vorzeichen der Ableitungen, Konkavität, kritischen Punkten usw. befassen.

Was ich will ist:

  • eine neue Art von Tabellenumgebung, die als Argumente die Zahlen verwendet, bei denen die Faktoren das Vorzeichen ändern (-3, 0, 1).
  • eine Möglichkeit, anzuzeigen, dass eine solche Zahl eine Einschränkung darstellt.
  • Die ersten beiden Zeilen im Beispiel müssen wie folgt eingegeben werden:

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

Deshalb poste ich das, weil ich denke, dass es viele mögliche Lösungen gibt und ich sie kennen möchte.

Ich frage mich, ob dies mit TikZ besser möglich ist.

Bisher lautet der Code des Beispiels:

\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}

Antwort1

Bevor Sie zu viel Zeit in die Erstellung eines neuen Pakets investieren, empfehle ich Ihnen, sich die Pakete tableaux, tablor und tkz-tab anzusehen. Die Codebeispiele sind lesbar, die gesamte Dokumentation für alle drei Pakete ist jedoch auf Französisch. Ich habe einige der Beispiele in diesen Handbüchern erfolgreich als Demonstrationen für meine LateX-Kursteilnehmer ausgeführt. Verwenden Siehttp://www.texdoc.net/um schnell die Dokumentation zu jedem dieser Punkte zu erhalten.

Antwort2

Ich dachte, das wäre eine gute Idee und könnte Spaß machen, also habe ich es ausprobiert. Ich habe vor, es selbst zu verwenden, daher weicht es von den Einzelheiten der Frage ab, aber wenn ich die Frage im Hinterkopf behalte, bin ich ziemlich nah drangekommen.

  • Syntax:\SignTable{comma separated factors}{comma separated zeros}
  • Die Variable mussz
  • akzeptiert alle von l3fp erkannten Funktionen. Ich habe unten einige verwendet, weitere finden Sie in der Dokumentation. Die Syntax ist wichtig, verwenden Sie bei Bedarf die richtigen Klammern und Multiplikationssymbole. Ausnahme: Funktionen wie sin z, ln zund exp z.
  • Dies ist nur dann zuverlässig, wenn die verwendeten Werte Nullen/Diskontinuitäten der Funktion sind und alle in dem Intervall berücksichtigt werden, an dem Sie interessiert sind. Wenn Sie einfach eine Reihe von Zufallszahlen auswählen, können Fehler auftreten. Ich bin mir aber größtenteils sicher, dass es ohnehin zuverlässig ist, ich habe viel Zeit damit verbracht, die Dinge zu klären.
  • Seien Sie vorsichtig bei der Verwendung einer Funktion wie ln xund beim Testen negativer Werte
  • Um die kritischen Zahlen über die Spalten zu zentrieren, habe ich eine Art Hack gemacht (man kann sicher sagen, dass meine gesamte Codewand ein Hack ist!). Dadurch war es schwierig, vertikale Regeln zu verwenden und sie in Ordnung aussehen zu lassen (abgesehen von der booktabsInteraktion zwischen Regeln und vertikalen Regeln). Daher keine vertikalen Regeln.
  • Um „Einschränkungen“ zu kennzeichnen, habe ich Folgendes verwendet und man \fboxkönnte auch andere Dinge ausprobieren.

\SignTable{sin z,z+6,2^z,z^3,1/(z+4)}{-6,-4,0,\pi}ergibt das Folgende (und ja, ich habe einige Nullen ignoriert sin z:)

Bildbeschreibung hier eingeben

Code-Wand

\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}

verwandte Informationen