Итак, я определил несколько новых символов с помощью tikz. Моя цель — иметь возможность поместить эти символы в таблицу, например, такую:
Однако эти таблицы должны читаться как своего рода строковые диаграммы, поэтому я хотел бы, чтобы символы совпадали друг с другом (например, в левой таблице вертикальные линии от двух символов должны быть обращены друг к другу). Есть ли хороший способ сделать это?
Вот код, который создал предыдущую картинку:
\documentclass[preview,border=10pt]{standalone}
\usepackage{tikz}
\newcommand{\cornerur}{%
\begin{tikzpicture}%
\draw[line width=.4mm] (0,0) -- (0,2ex);%
\draw[line width=.4mm] (0,0) -- (2ex,0);%
\end{tikzpicture}%
}
\newcommand{\cornerul}{%
\begin{tikzpicture}%
\draw[line width=.4mm] (2ex,2ex) -- (2ex,0);%
\draw[line width=.4mm] (0,0) -- (2ex,0);%
\end{tikzpicture}%
}
\newcommand{\cornerdr}{%
\begin{tikzpicture}%
\draw[line width=.4mm] (0,0) -- (0,2ex);%
\draw[line width=.4mm] (2ex,2ex) -- (0,2ex);%
\end{tikzpicture}%
}
\newcommand{\cornerdl}{%
\begin{tikzpicture}%
\draw[line width=.4mm] (0,2ex) -- (2ex,2ex);%
\draw[line width=.4mm] (2ex,0) -- (2ex,2ex);%
\end{tikzpicture}%
}
\newcommand{\horiz}{%
\begin{tikzpicture}%
\node at (0,0) {}; {}%
\draw[line width=.4mm] (0,.5ex) -- (2ex,.5ex);%
\end{tikzpicture}%
}
\newcommand{\vertic}{%
\begin{tikzpicture}%
\draw[line width=.4mm] (.5ex,0) -- (.5ex,2ex);%
\end{tikzpicture}%
}
\begin{document}
\[
\renewcommand{\arraystretch}{1.5}
\begin{tabular}{ | c | c | }
\hline
$\cornerdr$ & $ \horiz $\\
\hline
$\vertic$ & $\cornerdr$ \\
\hline
\end{tabular}
\qquad
\begin{tabular}{ | c | }
\hline
$\cornerdr$ \\
\hline
$ \cornerul $\\
\hline
\end{tabular}
\]
\end{document}
решение1
Проблема с картинками tikz заключается в том, что после завершения изображения оно обрезается до ограничивающей рамки, поэтому фигура с одной линией, например , \draw (0,0) -- (1,1);
дает тот же результат, что и другая с одной линией, например \draw (1,1) -- (2,2);
. Вторая не выглядит «смещенной».
Чтобы правильно расположить ваши линии внутри каждой ячейки, вам нужно, чтобы каждый tikzpicture имел одинаковый размер, что означает одинаковую ограничивающую рамку. Например, если определен следующий макрос:
\def\bbox{\path[fill=yellow, use as bounding box] (0,0) rectangle(2ex,2ex);}
и каждая картинка tikz начинается с команды \bbox
, тогда ваш код создаст рисунок:
Вы все еще можете видеть, что линии не выровнены так, как вы хотели, но это потому, что эти линии не начинаются с (0,0)
, а с (.5ex, 0)
или (0, .5ex)
вместо этого. Я не знаю, намеренно ли это, но в любом случае желтый фон облегчает просмотр «почему» и корректировку результата по мере необходимости.
Как только вы будете удовлетворены результатом, вы можете удалить опцию fill=yellow
в определении \bbox
. Желтые поля исчезнут, но выравнивание останется, поскольку используется тот же ограничивающий прямоугольник:
Это полный код. Я немного изменил его, чтобы получить правильные углы на стыках, и удалил \[
, \]
вокруг табличного.
\documentclass[preview,border=10pt]{standalone}
\usepackage{tikz}
\def\bbox{\path[use as bounding box] (0,0) rectangle(2ex,2ex);}
\newcommand{\cornerur}{%
\begin{tikzpicture}%
\bbox
\draw[line width=.4mm] (2ex,0) -- (0,0) -- (0,2ex);%
\end{tikzpicture}%
}
\newcommand{\cornerul}{%
\begin{tikzpicture}%
\bbox
\draw[line width=.4mm] (2ex,2ex) -- (2ex,0) -- (0,0);%
\end{tikzpicture}%
}
\newcommand{\cornerdr}{%
\begin{tikzpicture}%
\bbox
\draw[line width=.4mm] (2ex,2ex) -- (0,2ex) -- (0,0);%
\end{tikzpicture}%
}
\newcommand{\cornerdl}{%
\begin{tikzpicture}%
\bbox
\draw[line width=.4mm] (0,2ex) -- (2ex,2ex) -- (2ex,0);%
\end{tikzpicture}%
}
\newcommand{\horiz}{%
\begin{tikzpicture}%
\bbox
\draw[line width=.4mm] (0,.5ex) -- (2ex,.5ex);%
\end{tikzpicture}%
}
\newcommand{\vertic}{%
\begin{tikzpicture}%
\bbox
\draw[line width=.4mm] (.5ex,0) -- (.5ex,2ex);%
\end{tikzpicture}%
}
\begin{document}
\renewcommand{\arraystretch}{1.5}
\begin{tabular}{ | c | c | }
\hline
$\cornerdr$ & $ \horiz $\\
\hline
$\vertic$ & $\cornerdr$ \\
\hline
\end{tabular}
\qquad
\begin{tabular}{ | c | }
\hline
$\cornerdr$ \\
\hline
$ \cornerul $\\
\hline
\end{tabular}
\end{document}
решение2
Я не уверен в соглашениях об именах, но вот как я их интерпретирую. Измените имена, если хотите.
TikZ не нужен: picture
он тоже хорош и даже проще.
\documentclass{article}
\usepackage{pict2e}
\linethickness{1pt}
\roundcap\roundjoin
\newcommand{\cornerur}{%
\begingroup\setlength{\unitlength}{2ex}% current font
\begin{picture}(1,1)
\roundcap
\polyline(1,0)(1,1)(0,1)
\end{picture}%
\endgroup
}
\newcommand{\cornerul}{%
\begingroup\setlength{\unitlength}{2ex}% current font
\begin{picture}(1,1)
\polyline(0,0)(0,1)(1,1)
\end{picture}%
\endgroup
}
\newcommand{\cornerdr}{%
\begingroup\setlength{\unitlength}{2ex}% current font
\begin{picture}(1,1)
\polyline(0,0)(1,0)(1,1)
\end{picture}%
\endgroup
}
\newcommand{\cornerdl}{%
\begingroup\setlength{\unitlength}{2ex}% current font
\begin{picture}(1,1)
\polyline(0,1)(0,0)(1,0)
\end{picture}%
\endgroup
}
\newcommand{\horiz}{%
\begingroup\setlength{\unitlength}{2ex}% current font
\begin{picture}(1,1)
\polyline(0,1)(1,1)
\end{picture}%
\endgroup
}
\newcommand{\vertic}{%
\begingroup\setlength{\unitlength}{2ex}% current font
\begin{picture}(1,1)
\polyline(0,0)(0,1)
\end{picture}%
\endgroup
}
\begin{document}
\begin{center}
\verb|\cornerur|: \cornerur\\
\verb|\cornerul|: \cornerul\\
\verb|\cornerdr|: \cornerdr\\
\verb|\cornerdl|: \cornerdl
\end{center}
\[
\renewcommand{\arraystretch}{1.5}
\begin{tabular}{ | c | c | }
\hline
\cornerdr & \horiz \\
\hline
\vertic & \cornerdr \\
\hline
\end{tabular}
\qquad
\begin{tabular}{ | c | }
\hline
\cornerdr \\
\hline
\cornerul \\
\hline
\end{tabular}
\]
\end{document}
Вариант с двумя горизонтальными и двумя вертикальными символами. Высота подгоняется под высоту заглавных букв в текущем шрифте. Глифы хорошо связаны друг с другом. Если вместо этого вы хотите добавить боковые опоры, их легко добавить.
\documentclass{article}
\usepackage{pict2e}
\newcommand{\skysurf}[1]{%
\begingroup
\setlength{\unitlength}{\fontcharht\font`A}%
\linethickness{1pt}\roundcap\roundjoin
\begin{picture}(1,1)
\polyline#1
\end{picture}%
\endgroup
}
\newcommand{\cornerur}{\skysurf{(1,0)(1,1)(0,1)}}
\newcommand{\cornerul}{\skysurf{(0,0)(0,1)(1,1)}}
\newcommand{\cornerdr}{\skysurf{(0,0)(1,0)(1,1)}}
\newcommand{\cornerdl}{\skysurf{(0,1)(0,0)(1,0)}}
\newcommand{\horizd} {\skysurf{(0,0)(1,0)}}
\newcommand{\horizu} {\skysurf{(0,1)(1,1)}}
\newcommand{\verticl} {\skysurf{(0,0)(0,1)}}
\newcommand{\verticr} {\skysurf{(1,0)(1,1)}}
\begin{document}
\begin{tabular}{ccc}
\cornerul & \horizu & \cornerur\\
\verticl & & \verticr \\
\cornerdl & \horizd & \cornerdr\\
\end{tabular}
\bigskip
ABC \cornerul \horizu \cornerur \verticl \verticr \cornerdl \horizd \cornerdr
\bigskip
\begingroup\setlength{\tabcolsep}{0pt}\renewcommand{\arraystretch}{0}
\begin{tabular}{ccc}
\cornerul & \horizu & \cornerur\\
\verticl & & \verticr \\
\cornerdl & \horizd & \cornerdr\\
\end{tabular}
\endgroup
\end{document}
решение3
На основе вашего кода я попытался сделать что-то похожее. Поскольку мне лень печатать, я сократил ваши названия команд. Я также ввел две новые вертикальные или горизонтальные линии. Оба имеют белую линию на белом фоне, поэтому они, как правило, невидимы, но используют необходимое количество пространства. Варианты отличаются положением видимой линии, которая находится налефт илирс правой стороны вертикальной линии или находясь натоп илибнижняя сторона горизонтального выравнивания.
Сказав это, теперь вы сможете разместить практически любую комбинацию с выравниванием (я надеюсь).
А, так как мне лень печатать, я также определил стили TikZ и использовал их.
Как видите, математический режим вам не нужен.
\documentclass[preview,border=10pt]{standalone}
\usepackage{tikz}
\tikzset{my style/.style={line width=.4mm}, blind/.style={white}}
\newcommand{\ur}{%
\begin{tikzpicture}%
\draw[my style] (2ex,0) -- (0,0) -- (0,2ex);%
\end{tikzpicture}%
}
\newcommand{\ul}{%
\begin{tikzpicture}%
\draw[my style] (2ex,2ex) -- (2ex,0) -- (0,0);%
\end{tikzpicture}%
}
\newcommand{\dr}{%
\begin{tikzpicture}%
\draw[my style] (0,0) -- (0,2ex) -- (2ex,2ex);%
\end{tikzpicture}%
}
\newcommand{\dl}{%
\begin{tikzpicture}%
\draw[my style] (0,2ex) -- (2ex,2ex) -- (2ex,0);%
\end{tikzpicture}%
}
\newcommand{\hb}{%
\begin{tikzpicture}%
\draw[my style] (0,0) -- (2ex,0);%
\draw[blind] (0,0) -- (0,2ex);%
\end{tikzpicture}%
}
\newcommand{\hh}{%
\begin{tikzpicture}%
\draw[my style] (0,2ex) -- (2ex,2ex);%
\draw[blind] (0,0) -- (0,2ex);%
\end{tikzpicture}%
}
\newcommand{\vl}{%
\begin{tikzpicture}%
\draw[my style] (0,0) -- (0,2ex);%
\draw[blind] (0,0) -- (2ex,0);%
\end{tikzpicture}%
}
\newcommand{\vr}{%
\begin{tikzpicture}%
\draw[my style] (2ex,0) -- (2ex,2ex);%
\draw[blind] (0,0) -- (2ex,0);%
\end{tikzpicture}%
}
\begin{document}
Using \verb!\fbox!-commands:
\fbox{\ur}\fbox{\hb}
This is the old style, without math mode.
\renewcommand{\arraystretch}{1.5}
\begin{tabular}{ | c | c | }
\hline
\dr & \hh \\
\hline
\vl & \dr \\
\hline
\end{tabular}
\quad
\begin{tabular}{ | c |c | c |}
\hline
\dr & \hh & \dl\\
\hline
\vl & & \vr \\
\hline
\ur & \hb & \ul\\
\hline
\end{tabular}
\end{document}
Чтобы доказать, что это сработало:
решение4
Здесь я создаю элементы, накладывая белый \rule
поверх черного \rule
, смещаясь по мере необходимости. Элементы в настоящее время определены \rlthk
толщиной и \boxsize
размером. Форма макросов \X<horz><vert>
, где <horz
может быть l
, c
, или r
, и <vert>
может быть b
, c
, или t
.
\documentclass[12pt]{article}
\usepackage{stackengine,xcolor}
\def\rlthk{\dimexpr1pt\relax}
\def\boxsize{\dimexpr1ex\relax}
\def\blbox{\rule{\boxsize}{\boxsize}}
\def\whbox{\textcolor{white}{\blbox}}
%
\def\Xrt{\kern-\rlthk\stackinset{r}{\rlthk}{t}{\rlthk}{\whbox}{\blbox}}
\def\Xlt{\stackinset{l}{\rlthk}{t}{\rlthk}{\whbox}{\blbox}\kern-\rlthk}
\def\Xrb{\kern-\rlthk\stackinset{r}{\rlthk}{b}{\rlthk}{\whbox}{\blbox}}
\def\Xlb{\stackinset{l}{\rlthk}{b}{\rlthk}{\whbox}{\blbox}\kern-\rlthk}
%
\def\Xtt{\stackinset{c}{}{t}{\rlthk}{\whbox}{\blbox}}
\def\Xll{\stackinset{l}{\rlthk}{c}{}{\whbox}{\blbox}\kern-\rlthk}
\def\Xbb{\stackinset{c}{}{b}{\rlthk}{\whbox}{\blbox}}
\def\Xrr{\kern-\rlthk\stackinset{r}{\rlthk}{c}{}{\whbox}{\blbox}}
\begin{document}
Building blocks:\par
\Xlt{} \Xtt{} \Xrt\par
\Xll{} \hspace{\boxsize} \Xrr\par
\Xlb{} \Xbb{} \Xrb
\begin{tabular}{|c|c|}
\hline
\Xlt & \Xtt\\
\hline
\Xll & \Xlt\\
\hline
\end{tabular}
\quad%
\begin{tabular}{|c|}
\hline
\Xlt \\
\hline
\Xrb\\
\hline
\end{tabular}
\end{document}