Я хочу воссоздать следующую таблицу на латексе
Вот мой MWE
\documentclass{article}
\usepackage{colortbl}
\begin{document}
\begin{table}[h]
\begin{tabular}{|>{\columncolor[gray]{.8}}c|m{1cm}|m{1cm}|m{1cm}|m{1cm}|m{1cm}|m{1cm}|m{1cm}|}
\hline
\footnotesize{ $x$ } & 0.900 & 0.990 & 0.999 & 1.000 & 1.001 & 1.010 & 1.100 \\ \hline
\footnotesize{ $f(x)$} & 1.810 & 1.980 & 1.998 & 2.000 & 2.002 & 2.020 & 2.210 \\ \hline
\end{tabular}
\end{table}
\end{document}
решение1
С помощью TikZ можно рисовать.
\documentclass[tikz,border=5mm]{standalone}
% put a row of 8 elements
\newcommand{\putrow}[9]{
\path (0,#1) node{#2}
++(0:1) node{#3} ++(0:1) node{#4}
++(0:1) node{#5} ++(0:1) node{#6}
++(0:1) node{#7} ++(0:1) node{#8} ++(0:1) node{#9};
}
\begin{document}
\begin{tikzpicture}[xscale=1.4,yscale=.6]
\begin{scope}[shift={(-.5,.5)}]
\fill[cyan!30] (0,0) rectangle +(1,-2);
\draw (0,0) grid (8,-2);
\end{scope}
\begin{scope}[-stealth,magenta,shorten >=.5pt,
every node/.style={midway,scale=.8}]
\draw[shift={(90:1)}] (1,0)--(4,0) node[above]{$x$ approaches $1$};
\draw[shift={(90:1)}] (7,0)--(4,0) node[above]{$x$ approaches $1$};
\draw[shift={(-90:2)}] (1,0)--(4,0) node[below]{$f(x)$ approaches $2$};
\draw[shift={(-90:2)}] (7,0)--(4,0) node[below]{$f(x)$ approaches $2$};
\end{scope}
\putrow{0}{$x$}{0.900}{0.990}{0.999}{1.000}{1.001}{1.010}{1.100}
\putrow{-1}{$f(x)$}{1.810}{1.980}{1.998}{2.000}{2.002}{2.020}{2.210}
\end{tikzpicture}
\end{document}
ПС(Июль 2020 г.) Я добавляю matrix
версию рисунка, несколько похожую на код Зарко.
\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes,
nodes={draw,minimum height=4ex,minimum width=3.3em,anchor=center},
column sep=-\pgflinewidth,
row sep=-\pgflinewidth,
column 1/.style ={nodes={fill=orange!30}}
]{
x & 0.900 & 0.990 & 0.999 & 1.000 & 1.001 & 1.010 & 1.100 \\
f(x)& 1.810 & 1.980 & 1.998 & 2.000 & 2.002 & 2.020 & 2.210 \\
};
\def\d{.6}
\begin{scope}[-stealth,orange,shorten >=.5pt,
every node/.style={midway,scale=.8}]
\draw ([shift={(90:\d)}]m-1-2.center)--([shift={(90:\d)}]m-1-5.center)
node[above]{$x$ approaches $1$};
\draw ([shift={(90:\d)}]m-1-8.center)--([shift={(90:\d)}]m-1-5.center)
node[above]{$x$ approaches $1$};
\draw ([shift={(-90:\d)}]m-2-2.center)--([shift={(-90:\d)}]m-2-5.center)
node[below]{$f(x)$ approaches $2$};
\draw ([shift={(-90:\d)}]m-2-8.center)--([shift={(-90:\d)}]m-2-5.center)
node[below]{$f(x)$ approaches $2$};
\end{scope}
\end{tikzpicture}
\end{document}
решение2
Также с tikz
, но теперь с использованием библиотеки matrix
. Для стрелок используются метки ребер arrows.meta
и quoted
библиотеки:
\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{arrows.meta,
matrix,
quotes
}
\begin{document}
\begin{tikzpicture}[
every edge/.style = {draw, purple, -{Straight Barb[angle=60:2pt 3]}, semithick}, shorten >=1pt,
every edge quoetes/.style = {font=\footnotesize}
]
\matrix (m) [matrix of math nodes,
nodes = {draw, minimum height=4ex, minimum width=3.3em,
inner sep=0pt, outer sep=0pt, anchor=center},
column sep=-\pgflinewidth,
row sep=-\pgflinewidth,
column 1/.append style = {nodes={fill=cyan!30}}
]
{
x & 0.900 & 0.990 & 0.999 & 1.000 & 1.001 & 1.010 & 1.100 \\
f(x) & 1.810 & 1.980 & 1.998 & 2.000 & 2.002 & 2.020 & 2.210 \\
};
\draw (m-1-2.north |- m.north) edge["$x$ approaches $1$"] (m-1-5.north |- m.north)
(m-1-8.north |- m.north) edge["$f(x)$ approaches $1$" '] (m-1-5.north |- m.north)
(m-1-2.south |- m.south) edge["$x$ approaches $2$" '] (m-1-5.north |- m.south)
(m-1-8.south |- m.south) edge["$f(x)$ approaches $2$"] (m-1-5.north |- m.south);
\end{tikzpicture}
\end{document}
решение3
Я написалдва макроса( \valeur
и \fromto
) чтоавтоматическипоместите стрелкувышепуть и текствышестрелка илинижев зависимости от того, идет ли путь отслева направоили нет.
Его преимущество в том, что он позволяет добавлять стрелки к любому массиву, записанному с помощью специализированного пакета, например array
, tabular
или любого другого пакета, предназначенного для записи массивов. Это позволяет избежать необходимости переписывать код уже созданной таблицы.
Например:
Стрелка всегда расположена налевая сторонав направлении построенного пути. То есть: выше, когда путь идет отслева направои ниже в противном случае. Текст автоматически размещается выше или ниже стрелки.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,arrows.meta}
\newcommand{\valeur}[2]{
\tikz[remember picture] \node[inner sep=0pt,anchor=center](#1){#2};}
\newcommand{\fromto}[4][]{
\tikz[remember picture,overlay,auto=left,>={Stealth[length=5pt, inset=1pt,sep]}]
\path[draw,thick,#1]($(#2.center)!5mm!90:(#3.center)$)--($(#3.center)!5mm!-90:(#2.center)$)node[midway]{#4};}
\begin{document}
\begin{tikzpicture}[remember picture]
\node[] (A)at(0,0){A};
\node[] (B) at (8,0){B};
\draw[densely dotted](A)--(B)node[midway,fill=white]{path from A to B};
\end{tikzpicture}
\fromto[align=center,dashed,->,blue] {A}{B}{from A to B:\\ the arrow is \textbf{above} the path A--B \\ the text is \textbf{above} the arrow}
\fromto[align=center,dashed,->,red] {B}{A}{from B to A:\\ line arrow is \textbf{below} the path A--B,\\ the text is \textbf{below} the arrow}
\end{document}
Код и результат (компилируется дважды):
\documentclass{article}
\usepackage{colortbl}
\usepackage{tikz}
\definecolor{myviolet}{RGB}{243,29,143}
\usetikzlibrary{calc,arrows.meta}
\newcommand{\valeur}[2]{
\tikz[remember picture] \node[inner sep=0pt,anchor=center](#1){#2};}
\newcommand{\fromto}[4][]{
\tikz[remember picture,overlay,auto=left,>={Stealth[length=5pt, inset=1pt,sep]}]
\path[draw=myviolet,thick,#1]
($(#2.center)!5mm!90:(#3.center)$)--($(#3.center)!5mm!-90:(#2.center)$)node[midway,myviolet,font=\bf]{#4};}
\begin{document}
\begin{table}[h]
\begin{tabular}{|>{\columncolor[gray]{.8}}c|m{1cm}|m{1cm}|m{1cm}|m{1cm}|m{1cm}|m{1cm}|m{1cm}|}
\hline
\footnotesize{ $x$ } & \valeur{a1}{0.900} & 0.990 & 0.999 & \valeur{b1}{1.000} & 1.001 & 1.010 & \valeur{c1}{1.100} \\ \hline
\footnotesize{ $f(x)$} & \valeur{a2}{1.810} & 1.980 & 1.998 & \valeur{b2}{2.000} & 2.002 & 2.020 & \valeur{c2}{2.210} \\ \hline
\end{tabular}
\end{table}
\fromto[->] {a1}{b1}{$x$ approaches 1.}
\fromto[<-] {b1}{c1}{$x$ approaches 1.}
\fromto[<-] {b2}{a2}{$f(x)$ approaches 2.}
\fromto[->] {c2}{b2}{$f(x)$ approaches 2.}
\end{document}
Первый макрос называется valeur
:
отмечает начало и конец стрелки символом TikZ node
и отображает значение, содержащееся в ячейке таблицы.
\newcommand{\valeur}[2]{
\tikz[remember picture] \node[inner sep=0pt,anchor=center](#1){#2};}
У него есть два аргумента:
- первый
#1
- этоимямы даемnode
- второе
#2
- этоценитьэтогоnode
.
Второй макрос называется \fromto
:
Этот макрос всегда размещает стрелку слева по направлению пути. Выше, когда путь идет отслева направои ниже в противном случае. Этот макрос имеет 4 аргумента:
- первый
#1
необязателен и позволяет передавать параметры TikZ в путь< варианты> - второе
#2
- отправная точка<от> - третий
#3
- пункт прибытия< к> - четвертый
#4
— текст, который нужно разместить< текст>
\newcommand{\fromto}[4][]{
\tikz[remember picture,overlay,auto=left,>={Stealth[length=5pt, inset=1pt,sep]}]
\path[draw=myviolet,thick,#1]
($(#2.center)!5mm!90:(#3.center)$)--($(#3.center)!5mm!-90:(#2.center)$)node[midway,myviolet,font=\bf]{#4};}
Как это работает?
Принцип следующий: если путь идетслева направо, стрелка и текст размещаютсявышепуть,в противном случаеон размещенниже. Готовобезлюбые тесты позиционирования, но с использованиемсвойства вращений Это позволяет избежать использования двух вариантов, которые фактически бесполезны:
- один для размещения стрелок (вверх или вниз)
- а также один из вариантов размещения текста относительно этих стрелок (выше или ниже).
Вращения
В геометрии положительный угол — это вращение против часовой стрелки. Отрицательный угол — это вращение по часовой стрелке.
Слева направо
Когда путь идет слева направо (т.е. от точки А к точке В), точки, расположенные на расстоянии 5 мм друг от друга, поворачиваются, как показано на этом рисунке. Это создает новый путь на 5 мм выше.
СПРАВА НАЛЕВО
Когда путь идет справа налево (т.е. из точки B в точку A), делается то же самое, что показано на этом рисунке. Это создает новый путь на 5 мм ниже.
В каждом случаепервыйвращение - этоположительныйивторой отрицательный. Эти повороты выполняются с помощью
calc
библиотеки. Для размещения текста я используюauto=left
опцию, которая позволяет мне всегда размещать текст на одной и той же стороне пути.
решение4
Этот ответ представляет собой небольшую вариацию решения Black Mild. Вместо использования матрицы Tikz узлов я строю массив с . Под каждой ячейкой массива строится узел PDF/Tikz, {NiceMatrix}
и nicematrix
я рисую стрелки, как это делает Black Mild.
\documentclass{article}
\usepackage{nicematrix}
\usepackage{tikz}
\begin{document}
$\begin{NiceMatrix}[hvlines,code-before = \columncolor{orange!30}{1}]
x & 0.900 & 0.990 & 0.999 & 1.000 & 1.001 & 1.010 & 1.100 \\
f(x)& 1.810 & 1.980 & 1.998 & 2.000 & 2.002 & 2.020 & 2.210
\CodeAfter
\begin{tikzpicture}[-stealth,orange,shorten >=.5pt,
every node/.style={midway,scale=.8}]
\def\d{.6}
\draw ([shift={(90:\d)}]1-2.center)--([shift={(90:\d)}]1-5.center)
node[above]{$x$ approaches $1$};
\draw ([shift={(90:\d)}]1-8.center)--([shift={(90:\d)}]1-5.center)
node[above]{$x$ approaches $1$};
\draw ([shift={(-90:\d)}]2-2.center)--([shift={(-90:\d)}]2-5.center)
node[below]{$f(x)$ approaches $2$};
\draw ([shift={(-90:\d)}]2-8.center)--([shift={(-90:\d)}]2-5.center)
node[below]{$f(x)$ approaches $2$};
\end{tikzpicture}
\end{NiceMatrix}$
\end{document}