У меня есть диаграмма tikzcd
\begin{center}
\begin{tikzcd}
F \arrow[r] \arrow[d]
& * \arrow[d] \\
X \arrow[r, "f"] & Y \\
\end{tikzcd}
\end{center}
который выглядит так:
Я хочу добавить символ, который указывает, что это квадрат отката. Посмотрев обаздесьиздесьЯ нашел решение создать свой собственный символ tikz-cd и вставить его в диаграмму.
Код моего символа такой:
\newcommand{\foo}[1]{%
\begin{tikzpicture}[#1]%
\draw (0,0) -- (1ex,0ex);%
\draw (1ex,0ex) -- (1ex,1ex);%
\end{tikzpicture}%
}
По сути, это нижний правый край квадрата.
Чтобы добавить этот символ на диаграмму, я изменяю код диаграммы на:
\begin{center}
\begin{tikzcd}
F \arrow[r] \arrow[d]
\arrow[dr, phantom, "\foo{} " , very near start, color=black]
& * \arrow[d] \\
X \arrow[r, "f"] & Y \\
\end{tikzcd}
\end{center}
Насколько я знаю, это должно создать невидимую стрелу и поместить мой символ на ее вершину. Действительно, что-то появляется, но это не мое, что я хочу:
Должно получиться что-то вроде этого (нарисовано в MSpaint):
Что одно и то же, за исключением правильного символа.
Что не так? Стоит ли мне подойти к этому по-другому?
решение1
Ваш подход вложенных tikzpicture
s. Стандартный способ избежать этого -использовать \savebox
es.
\documentclass{article}
\usepackage{tikz-cd}
\newsavebox{\pullback}
\sbox\pullback{%
\begin{tikzpicture}%
\draw (0,0) -- (1ex,0ex);%
\draw (1ex,0ex) -- (1ex,1ex);%
\end{tikzpicture}}
\begin{document}
\begin{center}
\begin{tikzcd}
F \arrow[r] \arrow[d]
\arrow[dr, phantom, "\usebox\pullback" , very near start, color=black]
& * \arrow[d] \\
X \arrow[r, "f"] & Y \\
\end{tikzcd}
\end{center}
\end{document}
Вы определили свою команду с параметром, который вы не использовали. Предположим, что есть необходимость в таких параметрах. Тогда \savebox
es неудобны. Поэтому я добавляю альтернативу: a path picture
с максимальным количеством исправленных вещей, которые вы можете придумать. Например, -
это означает, что не должно быть стрелки и т. д. (Я понимаю, что маловероятно, что вы хотите, чтобы символ был красным, это просто для иллюстрации того, что параметры здесь работают.)
\documentclass{article}
\usepackage{tikz-cd}
\tikzset{pullback/.style={minimum size=1.2ex,path picture={
\draw[opacity=1,black,-,#1] (-0.5ex,-0.5ex) -- (0.5ex,-0.5ex) -- (0.5ex,0.5ex);%
}}}
\begin{document}
\begin{center}
\begin{tikzcd}
F \arrow[r] \arrow[d]
\arrow[dr, phantom," " {pullback=red}, very near start, color=black]
& * \arrow[d] \\
X \arrow[r, "f"] & Y \\
\end{tikzcd}
\end{center}
\end{document}
решение2
Почему бы вам просто не вставить \lrcorner
символ?
\documentclass[svgnames]{article}
\usepackage{tikz-cd, amsmath, amssymb}%
\begin{document}
\begin{center}
\begin{tikzcd}
F \arrow[r] \arrow[d]
\arrow[dr, phantom, "\scalebox{1.5}{\color{IndianRed}$\lrcorner$}" , very near start, color=black]
& * \arrow[d] \\
X \arrow[r, "f"] & Y \\
\end{tikzcd}
\end{center}
\end{document}
решение3
Внутри tikzpicture
, вдоль path
, можно поместить не только node
, но и pic
.
\documentclass[tikz,border=5mm]{standalone}
\begin{document}
\begin{tikzpicture}[bmr/.pic={
\draw (2mm,0)--++(-90:2mm)--++(180:2mm);
}]
\path
(0,0) node (F) {$F$}
+(-45:.2) pic[scale=.8,red]{bmr}
+(0:1.5) node (star) {$*$}
++(-90:1) node (X) {$X$}
+(0:1.5) node (Y) {$Y$};
\draw[->] (F)--(star);
\draw[->] (F)--(X);
\draw[->] (X)--(Y) node[midway,above,scale=.6]{$f$};
\draw[->] (star)--(Y);
\end{tikzpicture}
\end{document}