在解決代數初等微積分課程中的一些不等式時,有時使用表格來勾勒所涉及因素的行為是有用的。透過一個例子,一切就變得清楚了 - 假設我們想要解決:
關聯表是:
如果不等式中存在以下形式的因子,則有時會在表中透過在 下方1/(x-a)
使用雙線來指示。我們稱這些為限制。||
a
在教授微積分時,有一些類似的表格來處理導數的符號、凹性、臨界點等。
我想要的是:
- 一種新型的表環境,它將因子改變符號 (-3, 0, 1) 的數字作為參數。
- 一種表明這樣的數字是限制的方法。
範例中的前兩行必須輸入如下:
\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 軟體包。程式碼範例是可讀的,但是所有三個套件的所有文件都是法語的。我已經成功運行了這些手冊中的一些範例,為我的 LateX 班學生進行演示。使用http://www.texdoc.net/快速取得每一個的文件。
答案2
我認為這是一個好主意並且可能很有趣,所以我嘗試了一下。我打算自己使用這個,所以它偏離了問題的具體細節,但記住這個問題,我已經非常接近了。
- 句法:
\SignTable{comma separated factors}{comma separated zeros}
- 該變數必須是
z
- 接受 l3fp 識別的任何函數。我在下面使用了一些,更多可以在文件中找到。文法很重要,在適當的時候使用正確的括號和乘號。例外:
sin z
、ln z
和等函數exp z
。 - 只有當使用的值是函數的零/不連續性並且所有值都在您感興趣的任何間隔上進行計算時,這才是可信的。 。無論如何,我基本上確信它是可以信任的,我花了很多時間來解決問題。
- 小心使用像
ln x
and 測試負值這樣的函數 - 為了讓關鍵數字集中在列上,我做了一些駭客行為(我確信可以說我的整個程式碼牆都是駭客行為!),這使得很難使用垂直規則並使它們看起來不錯(除了規則之外
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}