This is how I would solve the problem (given that I understood it correctly):
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\begin{document}
\begin{tikzpicture}
% draw the two circles and decorate them with arrows
\draw[
decoration={markings, mark=at position 0.625 with {\arrow{>}}},
postaction={decorate}
]
(0,0) circle (0.5);
\draw[
decoration={markings, mark=at position 0.125 with {\arrow{>}}},
postaction={decorate}
]
(3,0) circle (0.5);
% draw the connecting line
\draw[
decoration={markings, mark=at position 0.5 with {\arrow{>}}},
postaction={decorate}
]
(0.5,0) -- (2.5,0);
% draw the two black dots
\fill (0.5,0) circle (0.1);
\fill (2.5,0) circle (0.1);
\end{tikzpicture}
\end{document}
Drawing circles is described in section 14.7 “The Circle and Ellipse Operations” of the TikZ manual (all numbers refer to the v2.10 manual). The general syntax is (<center>) circle (<radius>)
.
The arrows are added as decorations (chapters 21 “Decorated Paths” and 30 “Decoration Library”). Specifically we add a mark in the form of an arrow at the given position. The position is given in the range [0,1] with 0 the start and 1 the end of the path. Circles always start and end at the rightmost point and are traversed counterclockwise.
As the markings decoration replaces the path with the specified path without first drawing the path, we need to first draw the circle normally and then add the decoration with a postaction
(which acts on a copy of the path).
All TikZ node shapes are defined using lower-level PGF code. This is described in the pgfmanual
in section 75.5 Declaring New Shapes, on page 625 of the v2.1 manual.
You can use the existing code of the circle shape as a base and add the lines to it. The code can be found in the file ${TEXMF}/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
.
Here the way I would do it:
Shape declaration:
\pgfdeclareshape{oplus}
%
% Shaped like '\oplus' math symbol. Based on 'circle' shape
%
{%
% All anchors are taken from the 'circle' shape:
\inheritsavedanchors[from={circle}]%
\inheritanchor[from={circle}]{center}%
\inheritanchor[from={circle}]{mid}%
\inheritanchor[from={circle}]{base}%
\inheritanchor[from={circle}]{north}%
\inheritanchor[from={circle}]{south}%
\inheritanchor[from={circle}]{west}%
\inheritanchor[from={circle}]{east}%
\inheritanchor[from={circle}]{mid west}%
\inheritanchor[from={circle}]{mid east}%
\inheritanchor[from={circle}]{base west}%
\inheritanchor[from={circle}]{base east}%
\inheritanchor[from={circle}]{north west}%
\inheritanchor[from={circle}]{south west}%
\inheritanchor[from={circle}]{north east}%
\inheritanchor[from={circle}]{south east}%
\inheritanchorborder[from={circle}]%
%
% Only the background path is different
%
\backgroundpath{%
% First the existing 'circle' code:
\pgfutil@tempdima=\radius%
\pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
\pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
\ifdim\pgf@xb<\pgf@yb%
\advance\pgfutil@tempdima by-\pgf@yb%
\else%
\advance\pgfutil@tempdima by-\pgf@xb%
\fi%
\pgfpathcircle{\centerpoint}{\pgfutil@tempdima}%
%
% Now the | and -- lines:
\pgfmoveto{\pgfpointadd{\centerpoint}{\pgfpoint{0pt}{\pgfutil@tempdima}}}%
\pgflineto{\pgfpointadd{\centerpoint}{\pgfpoint{0pt}{-\pgfutil@tempdima}}}%
\pgfmoveto{\pgfpointadd{\centerpoint}{\pgfpoint{\pgfutil@tempdima}{0pt}}}%
\pgflineto{\pgfpointadd{\centerpoint}{\pgfpoint{-\pgfutil@tempdima}{0pt}}}%
}%
}
Usage example:
\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfshape_oplus}
\begin{document}
\begin{tikzpicture}
\node [draw=blue,shape=oplus] {Test};
\end{tikzpicture}
\end{document}
Result:
You might also want to draw the additional lines in the \foregroundpath
instead. For this see the forbidden sign
shape in the file pgflibraryshapes.symbols.code.tex
is an good example.
Best Answer