2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Полупунктирная-полусплошная линия с помощью tikzset
Сообщение12.02.2020, 20:44 
Заслуженный участник


29/12/14
504
Здравствуйте, мне относительно часто приходится использовать линии вида "половина пунктирной -- половина сплошной с точкой посередине". Чтобы каждый раз не заморачиваться, решил создать такой класс с помощью 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 
Заслуженный участник
Аватара пользователя


31/01/14
11018
Hogtown
Я бы использовал пакет tkz-euclide (надстройку над tikz) в котором есть \tkzDefMidPoint (и много чего еще из евклидовой геометрии). Кстати, он недавно апдейтиривался, и Allin Matthes отвечает на вопросы.

 Профиль  
                  
 
 Re: Полупунктирная-полусплошная линия с помощью tikzset
Сообщение13.02.2020, 15:28 
Заслуженный участник


29/12/14
504
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 
Заслуженный участник


29/12/14
504
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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group