대수-미적분학 과정의 맥락에서 일부 부등식을 풀 때 표를 사용하여 관련된 요소의 동작을 스케치하는 것이 때로는 유용합니다. 예제를 통해 모든 것이 명확해집니다. 문제를 해결하고 싶다고 가정해 보겠습니다.
관련 테이블은 다음과 같습니다
불평등이 형식의 요소인 경우 표 아래 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
. - 사용된 값이 함수의 0/불연속이고 관심 있는 간격에 따라 모두 고려되는 경우에만 신뢰할 수 있습니다. 단지 여러 개의 난수를 선택하면 오류가 발생할 수 있습니다. 어쨌든 신뢰할 수 있다고 확신합니다. 문제를 해결하는 데 많은 시간을 보냈습니다.
ln x
음수 값 테스트와 같은 함수 사용에 주의하세요.- 중요한 숫자를 열의 중앙에 배치하기 위해 나는 해킹적인 작업을 수행했습니다(내 코드 전체가 해킹적이라고 주장할 수 있다고 확신합니다!). 이로 인해 수직 규칙을 사용하고 괜찮아 보이도록 만드는 것이 어려워졌습니다(규칙을 제외하고)
booktabs
. /수직 규칙 상호 작용. 따라서 수직 규칙이 없습니다. - "제한 사항"을 표시하기 위해
\fbox
다른 방법을 사용해 볼 수 있었습니다.
\SignTable{sin z,z+6,2^z,z^3,1/(z+4)}{-6,-4,0,\pi}
다음을 생성합니다. (그렇습니다. 일부 0은 무시했습니다 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}