2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Полупунктирная-полусплошная линия с помощью tikzset
Сообщение12.02.2020, 20:44 
Здравствуйте, мне относительно часто приходится использовать линии вида "половина пунктирной -- половина сплошной с точкой посередине". Чтобы каждый раз не заморачиваться, решил создать такой класс с помощью tikzset. Выглядит это примерно вот так:

Используется синтаксис LaTeX
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}

\tikzset{
clq/.style={thick, style=dashed, draw=black,postaction={decorate},postaction={draw,thick,solid,shorten >= 5ex}, decoration={markings,mark=at position .5 with {\draw[black,fill=black] circle (.5ex);}}}
}

\begin{document}
\begin{tikzpicture}
\draw[clq] (-5ex,0) -- (5ex,0);
\end{tikzpicture}
\end{document}
 


Для того чтобы сделать линию наполовину пунктирной, наполовину сплошной, я решил использовать костыль в виде shorten: то есть я сначала рисуется пунктирная линия, а потом с помощью postaction поверх проводится сплошная линия, начиная с 5ex. Достигается это как раз за счёт postaction={draw,thick,solid,shorten >= 5ex}. Проблема в том, что здесь, очевидно, есть привязка к определённой длине линии: только при длине 5ex пунктирная и сплошная части будут одинаковой длины. Есть ли какая-то возможность вычленить длину линии в качестве параметра? Ну, чтобы можно было сделать что-то вроде postaction={draw,thick,solid,shorten >= 0.5*totallength}. Сколько ни пытался, у меня ничего так и не получилось... Но вот присутствие mark=at position .5 наводит на мысль, что это точно должно быть возможно, потому что тут-то ведь понимает точечка, что ей надо встать посередине (вне зависимости от длины линии). Заранее спасибо за помощь.

 
 
 
 Re: Полупунктирная-полусплошная линия с помощью tikzset
Сообщение13.02.2020, 04:30 
Аватара пользователя
Я бы использовал пакет tkz-euclide (надстройку над tikz) в котором есть \tkzDefMidPoint (и много чего еще из евклидовой геометрии). Кстати, он недавно апдейтиривался, и Allin Matthes отвечает на вопросы.

 
 
 
 Re: Полупунктирная-полусплошная линия с помощью tikzset
Сообщение13.02.2020, 15:28 
Red_Herring
Боюсь, не подходит. Во-первых, я не очень понимаю, как мне тут вычленить координаты начальной и конечной точек в определении стиля. А во-вторых, мне ещё хотелось бы иметь возможность рисовать кривые, что в данном подходе не получится, по-моему.

Полазив ещё немного по stackexchange, нашёл следующий вариант. Несколько модифицировав его под свои нужды, получил следующее:

код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations,decorations.markings}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[scale=10]
\tikzset{
    clq/.style = {thick,dashed,#1,
    postaction={solid, decorate, draw,
    decoration={
             moveto,
             pre=curveto,
             post=curveto,
             pre length=0.5*\pgfdecoratedinputsegmentlength,
             post length=0,
             markings,mark=at position 0 with {\draw[#1,fill=#1] circle (.5ex);}}}
    }
}  
\draw[clq=red] (0,0) to (1,0);
\draw[clq=red] (1,-0.25) arc(0:-180:0.5);
\draw[clq=red] (0,-1.25) to[out=90,in=90] (1,-1.25);
\end{tikzpicture}
\end{document}  
 


Вот это уже практически то, что мне нужно. Решение подходит для прямых отрезков и кривых, соединяющих две точки. Но для "фигур" вроде arc или circle не подходит, поскольку \pgfdecoratedinputsegmentlength в этом случае неправильно считает длину... Может быть, у Вас есть какие-нибудь идеи относительно того, как этот костыль допилить?

 
 
 
 Re: Полупунктирная-полусплошная линия с помощью tikzset
Сообщение13.02.2020, 17:19 
UPDT: В общем, соорудил костыль, отвечающий моим нуждам. Мало ли кому пригодится:

код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations,decorations.markings,shapes.misc}
\usetikzlibrary{intersections}

\tikzset{
clq/.style args = {#1 #2}{thick,dashed,#2,
    postaction={solid, decorate, draw,
    decoration={
             moveto,
             pre=curveto,
             post=curveto,
             pre length=0.5*\pgfdecoratedinputsegmentlength*#1,
             post length=0,
             markings,mark=at position 0 with {\draw[#2,fill=#2] circle (.5ex);}}}
    },
    clq/.default={1 black}
}

\begin{document}

\begin{tikzpicture}
\draw[clq=1 red] (0,0) to (5,0);
\draw[clq=2 red] (5,-2.5) arc(0:-180:2.5);
\draw[clq=4 red] (0,-12.5) circle(5);
\end{tikzpicture}
\end{document}
 


Заморачиваться, чтобы отметки автоматически масштабировались при использовании какого-то другого значения scale, не стал, потому что в тексте всё равно везде [scale=1] будет использоваться у меня по умолчанию.

 
 
 [ Сообщений: 4 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group