LINUX.ORG.RU

Рисование кристаллической решетки в LaTeX'e

 , ,


2

1

Требуется нарисовать решетку типа DO3 (Ni-Mn-Al) и более сложные.

Пакеты PSTricks и TiKz дают подобный функционал, однако в обоих пакетах новые элементы закрывают под собой старые вне зависимости от координат и проекции.



★★

Рекомендую попробовать пакет chemfig для твоего: Ni-Mn-Al Eщё есть mhchem чтобы уравнения хим. реакций писать. PPCHTeX для сложных структурных формул.

Пример chemfig:

\usepackage{chemfig}
\chemfig{*6(-=-=-=)}
\chemfig{Ni-Mn-Al}
\chemfig{-[:30]-[:-30]OH} \chemsign{+} \chemfig{-[:150]=[2]O}
\chemrel[{[H$^\oplus$]}]{->}
\chemfig{-[:30]-[:-30]O-[:30](-[2]OH)-[:-30]}\\

hope13 ★★★
()
Последнее исправление: hope13 (всего исправлений: 1)

офф

а покажите пожалуйста какой-нибудь скрин этого латекса. Хочу узнать, что за зверь такой.

bvn13 ★★★★★
()

однако в обоих пакетах новые элементы закрывают под собой старые вне зависимости от координат и проекции.

Ты когда пишешь код, делаешь объявляешь \begin{tikzpicture} и \end{tikzpicture}?

hope13 ★★★
()
Ответ на: комментарий от hope13

да, конечно.

например:

\begin{tikzpicture}[->]
\draw (0,0) -- (4,0,0);
\draw (0,0) -- (0,4,0);
\draw (0,0) -- (0,0,4);
\foreach \x in {1,2,3}
\foreach \y in {1,2,3}
\foreach \z in {1,2,3}
		\draw (\x,\y,\z) circle (2pt);
\foreach \x in {1.5,2.5}
\foreach \y in {1.5,2.5}
\foreach \z in {1,2,3}
		\draw[gray,very thin] (\x,\y,\z) +(-.5,-.5) rectangle ++(.5,.5);
\foreach \x in {1,2,3}
		\draw (\x,1,1) -- (\x,1,3) (\x,2,1) -- (\x,2,3) (\x,3,1) -- (\x,3,3)  ;

\foreach \x in {1.5,2.5}
\foreach \y in {1.5,2.5}
\foreach \z in {1.5,2.5}
		\filldraw[red] (\x,\y,\z) circle (2pt);
\end{tikzpicture}

tis ★★
() автор топика

Скрипт для создания решётки (могу свой предложить, если хацкеля не боитесь) + jmol (pymol, ...).

dmfd
()
Ответ на: комментарий от hope13

Ага, правильно. Красные атомы в некоторых местах закрывают белые, которые на самом деле «ближе» к наблюдателю.

Например крайние правые красные атомы.

tis ★★
() автор топика
Последнее исправление: tis (всего исправлений: 1)
Ответ на: комментарий от tis

TikZ просто последовательно рисует. Т.к. ты красные «кружки» рисуешь последними, вот они и перекрывают. Просто поменяй местами последние 3 блока.

hope13 ★★★
()
Ответ на: комментарий от hope13

Ну, так в этом и вопрос, собственно :)
Мне потом более сложные структуры рисовать, и там не уследишь, что выше, а что ниже. Я думал, а вдруг есть пакет с рейтрейсингом.

tis ★★
() автор топика
Ответ на: комментарий от dmfd

Но зачем что-то делать руками, если уже есть куча визуализаторов молекул?

Может подкинешь парочку визуализаторов для сравнения?

iVS ★★★★★
()
Ответ на: комментарий от bvn13

На выходе получишь текст, а как исходный код выглядит можно посмотреть на странице любого редактора для этого дела, хотя что там смотреть. http://kile.sourceforge.net/screenshots.php

HunOL ★★★★
()
Ответ на: комментарий от dmfd

jmol (я им в основном пользуюсь)

Действительно, очень здорово :)

iVS ★★★★★
()
Ответ на: комментарий от iVS

Ну и на здоровье. Интересно же, что посоветует.

tis ★★
() автор топика
Последнее исправление: tis (всего исправлений: 2)
Ответ на: комментарий от tis

Сомневаюсь, что с помощью latex'a это целесообразно делать. Лучше просто вставлять картинки. Вот, смотри что нашёл:

\documentclass[tikz]{standalone}
\usetikzlibrary{3d}
\usepackage{xifthen}

\begin{document}

\newcommand{\xangle}{11}
\newcommand{\yangle}{133}
\newcommand{\zangle}{270}

\newcommand{\xlength}{1}
\newcommand{\ylength}{1}
\newcommand{\zlength}{1}


\newcommand{\dimension}{2}

\pgfmathsetmacro{\xx}{\xlength*cos(\xangle)}
\pgfmathsetmacro{\xy}{\xlength*sin(\xangle)}
\pgfmathsetmacro{\yx}{\ylength*cos(\yangle)}
\pgfmathsetmacro{\yy}{\ylength*sin(\yangle)}
\pgfmathsetmacro{\zx}{\zlength*cos(\zangle)}
\pgfmathsetmacro{\zy}{\zlength*sin(\zangle)}

\begin{tikzpicture}
[   x={(\xx cm,\xy cm)},
    y={(\yx cm,\yy cm)},
    z={(\zx cm,\zy cm)},
]

\foreach \x in {\dimension,...,0}
{   \foreach \y in {\dimension,...,0}
    {   \foreach \z in {\dimension,...,0}
        {   \pgfmathsetmacro{\c}{100-(\x*\y*\z)/(\dimension*\dimension*\dimension)*95}
            \ifthenelse{\x>0}
                {\draw[black!\c] (\x,\y,\z) -- (\x-1,\y,\z);}{}
            \ifthenelse{\y>0}
                {\draw[black!\c] (\x,\y,\z) -- (\x,\y-1,\z);}{}
            \ifthenelse{\z>0}
                {\draw[black!\c] (\x,\y,\z) -- (\x,\y,\z-1);}{}     
            \fill[red!\c] (\x,\y,\z) circle (0.1cm);   
        }
    }
}

\foreach \x/\y/\z/\lab in {1/0/1/ttt,1/2/0/tt,1/1/1/t} 
{   \fill[blue] (\x,\y,\z) circle (0.1cm) node[fill=white,rounded corners=2mm,fill opacity=0.5,text opacity=1,above right,inner sep=2pt] {\lab};
}   

\end{tikzpicture}

\end{document}
hope13 ★★★
()
Ответ на: комментарий от hope13

О! Красиво сделано, спасибо.

tis ★★
() автор топика
Ответ на: комментарий от tis

Конечно, это к органической химии ближе

Да всякие наноструктуры и кристаллы им тоже неплохо рисуются. Правда как элементарные ячейки линиями нарисовать, я не знаю.

И на длинных анимашках с 10к частиц падает, подлец.

dmfd
()
Ответ на: комментарий от dmfd

Ну, это еще более сурово. У меня в решетке менее 200х атомов.

tis ★★
() автор топика
Ответ на: комментарий от bvn13

Латех - это язык разметки; что-то типа HTML только последний - для WEB, для отображения в WEB-браузере, а LaTeX - для типографии. То, что ты написал на LaTeX, потом можешь конвертнуть в то, что тебе нужно: pdf, dvi, тот же html и много другого. Соответственно есть исходник и результат. Результат - открой любой pdf: LaTeX так может.

Я к нему пришел, когда нужно было писать диплом. Форматировать в MS Word'е большие сложные документы - это адъ: чуть не то сделал и все поплыло. Я подумал по HTML, но от сильно заточен для WEB. Латех дал мне все, что нужно: заголовки, автоматическое формирования содержания / списка литературы (и ссылок на литературу в тексте) / списка таблиц, формулы, таблицы, рисунки, параметры страницы по ГОСТу, сноски, возможность делать проект в разных файлах, а потом собирать это все в один готовый PDF и т. п. Ну, и всякие типографские заморочки: разница минуса, дефиса, тире, правильные кавычки, задание правил переноса по слогам и т. п. Да, не WYSIWYG, но, немного приноровившись - очень удобно.

Пример посмотри здесь: http://en.wikipedia.org/wiki/LaTeX

Kroz ★★★★★
()
Ответ на: комментарий от tis

Для latex'a есть ещё пакет cryst, но я с ним ни разу дела не имел.

Если ты знаешь о специфичном софте, то я не пойму смысла твоей темы. Если тебе нужно рисовать много хим. структур, то делать это с помощью latex'a сизифов труд.

hope13 ★★★
()
Ответ на: комментарий от hope13

LaTeXом однозначно приятнее. Графики, в нем нарисованные, выглядят «как родные», и т.д.

tis ★★
() автор топика
Ответ на: комментарий от iVS

На tex.stackexchange.com посоветовали лучший на мой взгляд вариант, использующий и Asymptote, и TeX. Приведу его здесь:

\documentclass{standalone}
\usepackage{asymptote}
\begin{document}
\begin{asy}[width=10cm,height=10cm]
import three;

currentprojection=perspective(300,-650,500,center=true);
// define two types of ions
surface iona = scale3(20)*unitsphere;
surface ionb = scale3(25)*unitsphere;
// surface properties and color of the ions
material White = material(diffusepen=gray(0.4),emissivepen=gray(0.6));
material Red = material(diffusepen=red,emissivepen=lightred);
// style of lines connecting ions
pen thick=linewidth(2);

for(int x=-1; x<2; ++x) {
  for(int y=-1; y<2; ++y) {
    for(int z=-1; z<2; ++z) {
      draw(shift(100*(x,y,z))*iona,White);
    }
  }
}

for(int x=-1; x<2; ++x) {
  for(int y=-1; y<2; ++y) {
    for(int z=-1; z<2; ++z) {
      if(x<1) draw(100*(x,y,z)--100*(x+1,y,z),thick);
      if(y<1) draw(100*(x,y,z)--100*(x,y+1,z),thick);
      if(z<1) draw(100*(x,y,z)--100*(x,y,z+1),thick);
    }
  }
}

for(int x=-1; x<2; x+=2) {
  for(int y=-1; y<2; y+=2) {
    for(int z=-1; z<2; z+=2) {
      draw(shift(50*(x,y,z))*ionb,Red);
    }
  }
}
\end{asy}
\end{document}
tis ★★
() автор топика
Последнее исправление: tis (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.