2014 dxdy logo

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

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





Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.
 
 Руководство по использованию XY-pic на форуме
Сообщение31.07.2010, 00:46 
Заслуженный участник


26/07/09
1559
Алматы
Это краткое сообщение, являющееся результатом странной сделки с cepeshe'ем (админ-ом) и написанное в стиле copy-paste на основе информации из различных источников, адресовано участникам форума dxdy и посвящено краткому описанию работы с пакетом \Xy-pic. Здесь приведены общие сведения о пакете, рассказано о некоторых из его возможностей, а также дано описание способов его использования на данном ресурсе.

Напомню, что на форуме dxdy, учитывая сдвиг целевой аудитории в математическую сторону, функционирует мощная система отображения формул, основанная на \TeX Д.Кнута; а для облегчения верстки используется макропакет \LaTeX$2\varepsilon$ с некоторыми дополнительными полезными пакетами, одним из которых является пакет \Xy-pic, написанный специально для рисования диаграмм со структурой графа (т.е. преимуществено для прорисовки простых графических объектов и, что самое главное, связей между ними).

Рассматриваемый пакет поддерживает несколько способов, или лучше сказать, стилей набора диаграмм, а в основе лежит простой (хотя, на первый взгляд, достаточно запутанный) язык с обилием мнемонических кострукций. Например, аналог стрелки $\mapsto$ может быть нарисован с использованием этого пакета под любым углом, любой длины, любой формы; при этом стиль такой стрелки при наборе диаграммы схематически обозначается тройкой символов |->, сплошная линия обозначается символом -, а для прорисовки пунктирной линии используется пара --, ну и т.д.

Причем, в отличие от базовых графических возможностей \LaTeX'а, пакет \Xy-pic нацелен на более гибкую, логическую разметку диаграмм; так например, достаточно указать, что некоторый объект должен быть соединен с другим объектом стрелкой такого-то стиля, детали же прорисовки будут уточняться уже самим макропакетом. Конечно, в реальности все не так идеально и жесткой привязки к конкретным координатам и размерам порой избежать не удастся, но общая философия \Xy-pic'а способствует использованию более удобного относительного позиционирования объектов (а ведь по названию и не скажешь). Сверх того, возможность и неизбежность использования координат на самом деле должны расцениваться как одно из главных достоинств описываемого пакета, обеспечивающее при необходимости высокую точность построений.

Пакет \Xy-pic особенно популярен при наборе простых графов и теор-категориальных коммутативных диаграмм. Поэтому наш краткий обзор начнется с рассмотрения именно этих конструкций, поддержка которых осуществляется расширением matrix.

Команда \xymatrix{...} создает прямоугольную таблицу-матрицу, в ячейках которой могут быть размещены любые визуальные объекты; использование этой команды похоже на применение привычных табличных окружений вроде tabular. Например, код \xymatrix{A&B&C\\D&&{\bullet}} приводит к отображению следующей диаграммы:
$$\xymatrix{A&B&C\\D&&{\bullet}}$$
Здесь ячейки в строке как всегда разделяются символом &, а сами строки -- командой перевода строки, например \\. Важно запомнить, что содержимое ячейки не может начинаться с какой-либо макрокоманды, именно поэтому в приведенном выше примере использовалась дополнительная пара фигурных скобок вокруг команды \bullet.
Для оформления ячеек предусмотрены специальные конструкции-модификаторы. К примеру, можно сделать нечто подобное:
$$\xymatrix{
    A            & *+[F]{B} & C         \\
    *+[o]+[F]{D} &          & {\bullet}
}$$
Это достигается использованием следующего кода:
Используется синтаксис LaTeX
\xymatrix{
    A            & *+[F]{B} & C         \\
    *+[o]+[F]{D} &          & {\bullet}
}
 


Но основная же мощь заключается в рисовании соединений, т.е. стрелок между объектами. Вообще, рисовать стрелки -- это пожалуй лучшее, что умеет делать \Xy-pic.

В каждой ячейке матрицы, непосредственно после содержимого ячейки, могут располагаться команды построения стрелок \ar. Каждая такая команда рисует стрелку, направленную от объекта в текущей ячейке к некоторому другому объекту, возможно тоже лежащему в одной из ячеек. При использовании команды \ar необходимо указать некоторые параметры, особенно направление стрелки, для задания которого в квадратных скобках после команды указывается последовательность символов из набора u, d, r, l, служащих для обозначения направлений вверх, вниз, вправо и влево, соответственно (причем для продления стрелки каждое направление может указываться многократно); а если оставить квадратные скобки пустыми, то стрелка будет идти от текущей ячейки к ней же самой (важно заметить, что на самом деле в пакете \Xy-pic есть и другие способы задания направлений и позиций). Например, команда \ar[drr], набранная в верхней-левой ячейке матрицы создаст стрелку, направленную на нижнюю-правую ячейку (один раз смещаемся вниз и дважды вправо, прямо по указанной последовательности drr):
$$\xymatrix{
    A \ar[drr]   & *+[F]{B} & C         \\
    *+[o]+[F]{D} &          & {\bullet}
}$$
На всякий случай приведу исходный код:
Используется синтаксис LaTeX
\xymatrix{
    A \ar[drr]   & *+[F]{B} & C         \\
    *+[o]+[F]{D} &          & {\bullet}
}
 


Для смены стиля стрелки испольуется конструкция-модификатор @{...}, вставляемая между \ar и указывающими направление стрелки квадратными скобками. На месте многоточия может быть последовательность символов, обозначающая стиль стрелки. Некоторые из возможных стилей уже были рассмотрены (|->, - и --), но может быть использовано множество других, например ., ~, ~~, ), ^(->, и т.д. Кроме того, между @ и открывающей фигурной скобкой могут располагаться дополнительные символы, ^ или _, а также числа от 0 до 3, управляющие чем-то вроде параллельного смещения, а также кратностью стрелок. Приведу парочку образцов:
$$\begin{xy}
    {\ar@{=>}(0,15)*{};(10,15)*{}}; 
    {\ar@3{->}(0,10)*{};(10,10)*{}}; 
    {\ar@2{:>}(0,5)*{};(10,5)*{}}; 
    {\ar@{|->}(0,0)*{};(10,0)*{}}; 
    {\ar@2{~>}(15,0)*{};(25,0)*{}}; 
    {\ar@{->>}(15,5)*{};(25,5)*{}}; 
    {\ar@{<->}(15,10)*{};(25,10)*{}}; 
    {\ar@/^1pc/(15,15)*{};(25,15)*{}}; 
\end{xy}$$

Среди прочего, имеется возможность нарисовать стрелку не только напрямую соединяющую два объекта, но и по-пути проходящую через ряд других ячеек таблицы.
Для этого необходимо в коде перед набором каждого промежуточного сегмента стрелки вставлять символ ' (апостроф). Заметьте, что направление на каждый следующий узел указывается относительно начальной ячейки для этой стрелки, а не относительно текущего узла на её пути. Кстати, отдельные сегменты такой ломаной стрелки в некотором смысле независимы и могут оформляться отдельно.

Сказанного уже достаточно для верстки примерно такой вот красотищи:
$$\xymatrix@!0{
    & \lambda \omega \ar@{-}[rr] \ar@{-}'[d][dd]
    && \lambda C \ar@{-}[dd]
    \\
    \lambda 2 \ar@{-}[ur] \ar@{-}[rr] \ar@{-}[dd]
    && \lambda P2 \ar@{-}[ur]\ar@{-}[dd]
    \\
    & \lambda \underline\omega \ar@{-}'[r][rr]
    && \lambda P \underline\omega
    \\
    \lambda{\to} \ar@{-}[rr] \ar@{-}[ur]
    && \lambda P \ar@{-}[ur]
}$$

Исходный код этого лямбда-куба:
Используется синтаксис LaTeX
\xymatrix@!0{
    & \lambda \omega \ar@{-}[rr] \ar@{-}'[d][dd]
    && \lambda C \ar@{-}[dd]
    \\
    \lambda 2 \ar@{-}[ur] \ar@{-}[rr] \ar@{-}[dd]
    && \lambda P2 \ar@{-}[ur]\ar@{-}[dd]
    \\
    & \lambda \underline\omega \ar@{-}'[r][rr]
    && \lambda P \underline\omega
    \\
    \lambda{\to} \ar@{-}[rr] \ar@{-}[ur]
    && \lambda P \ar@{-}[ur]
}
 


Здесь используется указание стиля стрелки (сплошная линия без "наконечника") и вышеописанный прием с рисованием многосегментных стрелок (разрывы между сегментами используются для схематичного обозначения соединений, более удаленных от наблюдателя).

Стрелки можно снабжать надписями, над и под стрелкой, используя символы ^ и _, как при обычном наборе верхних и нижних индексов, например \ar[r]^{a}_{b} (если необходимо вывести надпись прямо посередине стрелки, то непосредственно после символа ^ или _ следует вставить символ -); а можно разместить надпись прямо в разрыве стрелки действуя по той же схеме, но используя символ | (разрыв можно оставить пустым, разместив в нем вместо надписи команду \hole). Пример (коммутативная диаграмма поднятия $F\colon\mathbb{X}\to\mathbb{X}$ непрерывной функции $f\colon\mathbb{Y}\to\mathbb{Y}$):
$$\xymatrix{
    \mathbb{X} \ar[r]^-F \ar[d]^-\pi & \mathbb{X} \ar[d]^-\pi \\
    \mathbb{Y} \ar[r]^-f             & \mathbb{Y}
}$$

Исходный код этого примера:
Используется синтаксис LaTeX
\xymatrix{
    \mathbb{X} \ar[r]^-F \ar[d]^-\pi & \mathbb{X} \ar[d]^-\pi \\
    \mathbb{Y} \ar[r]^-f             & \mathbb{Y}
}
 


Непосредсвенное перед надписью могут быть добавлены спецификаторы, указывающие явное положение метки относительно стрелки. Один из таких спецификаторов наиболее интересен. Он имеет форму !{a;b}, где a и b -- направления (набранные с использованием уже знакомых последовательностей в квадратных скобках) на некоторые две ячейки. Такой спецификатор позволяет разместить надпись в месте пересечения текущей стрелки и стрелки, соединяющей указанные ячейки. С использованием этого приема ранее сверстанный лямбда-куб может быть набран так:
Используется синтаксис LaTeX
\xymatrix@!0{
    & \lambda \omega \ar@{-}[rr] \ar@{-}[dd]|!{[dl];[dr]}\hole
    && \lambda C \ar@{-}[dd]
    \\
    \lambda 2 \ar@{-}[ur] \ar@{-}[rr] \ar@{-}[dd]
    && \lambda P2 \ar@{-}[ur]\ar@{-}[dd]
    \\
    & \lambda \underline\omega \ar@{-}[rr]|!{[ur];[dr]}\hole
    && \lambda P \underline\omega
    \\
    \lambda{\to} \ar@{-}[rr] \ar@{-}[ur]
    && \lambda P \ar@{-}[ur]
}
 


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

Кстати, да, \Xy-pic поддерживает не только прямые стрелки. Действительно, часто, особенно при рисовании графов, конечных автоматов и пр., изогнутые стрелки оказываются просто необходимы. Для набора изогнутых стрелок нужно использовать конструкцию @/.../, например вставив её после \ar. На месте многоточия может быть символ ^ или _ для верстки стрелок обращенных выпуклостью "вверх" или "вниз", соответственно (если воспринимать стрелку направленной "горизонтально" и "вправо"). Между этим символом и закрывающей косой "скобкой" может быть также указана степень выпуклости (в виде размерной величины, например 1pc). Замечательно то, что стрелки могут быть изогнуты более сложным образом, для чего применяется конструкция @(a, b), где a и b -- направления исхода стрелки из начальной ячейки и входа её в конечную. Можно использовать следующие направления: u, ur, r, dr, d, dl, l и ul, смысл которых, думаю, понятен без дополнительных пояснений. Пример:
$$\xymatrix{
    A \ar@(ur,dl)@{-}[dr] & B \ar@/^/@{--}[dl] \\
    C & D
}$$
Его исходный код:
Используется синтаксис LaTeX
\xymatrix{
    A \ar@(ur,dl)@{-}[dr] & B \ar@/^/@{--}[dl] \\
    C & D
}
 


При рисовании стрелки можно "на лету" модифицировать её объект назначения (тот, на которой она указывает). Наиболее полезной является возможность изменять положение такого объекта, что достигается использованием мидификатора !. После восклицательного знака необходимо указать направление смещения. Ранее уже были рассмотрены возможные буквосочетания, применяемые для спецификации направлений, но в данном случае символы должны быть прописными (в верхнем регистре). Этот прием часто используют для размещения надписей к объектам. Пример:
$$\xymatrix{
    A \ar@{--}[rrd]*++!LD{p} & B & C \\
    D & E & {\bullet}
}$$
А код выглядит так:
Используется синтаксис LaTeX
\xymatrix{
    A \ar@{--}[rrd]*++!LD{p} & B & C \\
    D & E & {\bullet}
}
 

Плюсики здесь используются для увеличения промежутка между объектом и надписью -- чем больше плюсиков, тем больше промежуток.

Благодаря опции poly объекты могут размещаться не только в узлах прямоугольной сетки, но и в вершинах многоугольников. Для верстки многоугольника используется команда \xypolygon, непосредственно после которой указывается число сторон (большее двух разумеется), а затем в фигурных скобках указывается либо объект, размещаемый на месте вершин многоугольника, либо более сложная конструкция (последовательность спецификаторов), контролирующая кроме прочего способ соединения (тип линий, возможно с разрывами и надписями) вершин друг с другом и с центром многоугольника. В качестве спецификаторов могут использоваться такие строчки как ~:{...}, использующаяся для масштабирования; ~*{...} для размещения объектов в вершинах; ~<{...} или ~<<{...} для управления соединениями вершин с центром; ~<>{...} для размещения разрывов и меток на этих соединениях; ~>{...} для управления стилем прорисовки сторон многоугольника; и др.

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

Примеры:
Используется синтаксис LaTeX
\begin{xy}/r2pc/:
    {\xypolygon6{\bullet}},
    +/r5pc/, {\xypolygon6{~*{\bullet}~><{}}},
    +/r5pc/, {\xypolygon6{~<<{@{->}}~>{{--}}}}
\end{xy}
 


Этот код строит следующее изображение:
$$\begin{xy}/r2pc/:
    {\xypolygon6{\bullet}},
    +/r5pc/, {\xypolygon6{~*{\bullet}~><{}}},
    +/r5pc/, {\xypolygon6{~<<{@{->}}~>{{--}}}}
\end{xy}$$

Многоугольники также пригодны для верстки таких вот пирамидок:
$$\shorthandoff{"}\begin{xy}/r2pc/:
    ="a", +(.2,1.5)="b", "a",
    {\xypolygon5{~:{(1,-.1):(0,.33)::}~<>{;"b"**@{-}}}},
    (5,0)="0", +(-0.8,3)="T","0",
    {\xypolygon6{~:{(1,0.2):(0,.4)::}~<>{;"T"**@{-}}}}
\end{xy}\shorthandon{"}$$

Исходник:
Используется синтаксис LaTeX
\begin{xy}/r2pc/:
    ="a", +(.2,1.5)="b", "a",
    {\xypolygon5{~:{(1,-.1):(0,.33)::}~<>{;"b"**@{-}}}},
    (5,0)="0", +(-0.8,3)="T","0",
    {\xypolygon6{~:{(1,0.2):(0,.4)::}~<>{;"T"**@{-}}}}
\end{xy}
 


В последних примерах можно заметить некоторые странности не вписывающиеся в намеченную схему. Дело в том, что, фактически, команды вроде \xymatrix или \xypolygon являются всего-лишь обертками над несколько более низкоуровневым языком \Xy-pic. Выражение "интуитивно-понятный" можно применять к чему угодно, но только не к этой вещи. Хотя в основе лежит очень простая последовательность действий: выбор расположения объектов, размещение объектов в выбранных позициях, соединение объектов "линиями".

Команды можно набирать, используя окружение xy и соответствующие примеры использования такого окружения уже были приведены. Поэтому сейчас сосредоточимся на приемах верстки объектов и соединений. Итак, при верстке объекта сначала указывают его положение, например в декартовых координатах, используя для этого нотацию с круглыми скобками, вроде (x,y). Общий же вид необходимой нам конструкции таков: (x,y)*{...}, где на месте многоточия как раз таки и размещается нужный объект. Для набора соединителя используется конструкция **{...} (на деле, используется что-то вроде **\dir{...} или **@{...}). Так для набора следующей диаграммы
$$\begin{xy}
    (0,0)*{A};
    (20,0)*{B};
    **@{-}
\end{xy}$$
применялся такой код:
Используется синтаксис LaTeX
\begin{xy}
    (0,0)*{A};
    (20,0)*{B};
    **@{-}
\end{xy}
 

NB, здесь команда прорисовки соединителя использует позиции "текущего" (только что набранного) и "предыдущего" объектов; вообще, в \Xy-pic эта концепция встречается сплошь и рядом.

Код можно немного усовершенствовать:
Используется синтаксис LaTeX
\begin{xy}
    (0,0)*+{A}="A";
    (20,0)*+{B}="B";
    {\ar@{->} "A";"B"}
\end{xy}
 

Это даст такой результат:
$$\shorthandoff{
Здесь вы можете видеть уже знакомый по примеру с пирамидами прием с присваиванием строковых идентификаторов к объектам и использованием этих идентификаторов в дальнейшем вместо явных координат.

 Профиль  
                  
 
 dxdy/xypic, II
Сообщение31.07.2010, 00:50 
Заслуженный участник


26/07/09
1559
Алматы
Нельзя не упомянуть, что пакет \Xy-pic прекрасно рисует кривые линии. Этой цели служат команды \crv{...}, \crvs{...}, \curve{...}. Аргументом (т.е. содержимым фигурных скобок) команды \crv может быть список координатных пар вида (x,y), разделенных символом &. Если в списке указано два или три элемента, то \Xy-pic создает Безье-сплайн, соответственно квадратный или кубический; при большем количестве элементов верстаются кубические B-сплайны (однако можно продолжать работать с квадратными Безье-сплайнами при любом количестве точек в списке с помощью команды \qspline). При этом указанные пары чисел выполняют роль контрольных точек (вообще говоря, лежащих вне кривой) рисуемых сплайнов и определяют их форму.
Простейший пример:
Используется синтаксис LaTeX
\begin{xy}
    *+{A};
    (20,0)*+{B};
    **\crv{(5,10)&(15,-10)}
\end{xy}
 

Картинка:
$$\begin{xy}
    *+{A};
    (20,0)*+{B};
    **\crv{(5,10)&(15,-10)}
\end{xy}$$
Пример посложнее:
Используется синтаксис LaTeX
\begin{xy}
    (0,0)*+{A};(50,-10)*+{B}
    **\crv~Lc{~**\dir{--}~*{\bullet}
    (20,20)&(35,15)}
\end{xy}
 

И опять картинка:
$$\begin{xy}
    (0,0)*+{A};(50,-10)*+{B}
    **\crv~Lc{~**\dir{--}~*{\bullet}
    (20,20)&(35,15)}
\end{xy}$$

Ранее уже обсуждалась возможность автоматического детектирования пересечений линий. Как и прежде будем использовать конструкцию !{a;b}, где a и b -- объекты, пресечение "текущей" линии с линией-соединением которых отыскивается. Но на этот раз мы будем использовать символ ? для размещения объекта на текущем соединении. Приведу пример:
Используется синтаксис LaTeX
\begin{xy} <1cm, 0cm>:
    (0,0)*+{A}="A";
    (2,1)*+{B}="B" **@{--},
    (1,0)*=0{\oplus}; (2,2)*=0{\oplus} **@{-}
    ?!{"A";"B"} *{\bullet}
\end{xy}
 

Этот код дает такое изображение:
$$\shorthandoff{"}\begin{xy}  <1cm, 0cm>:
    (0,0)*=0{A}="A";
    (2,1)*=0{B}="B" **@{--},
    (1,0)*+{\oplus}; (2,2)*+{\oplus} **@{-}
    ?!{"A";"B"} *{\bullet}
\end{xy}\shorthandon{"}$$

Можно заставить \Xy-pic определять пересечения не только прямых линий друг с другом, но и прямых линий с кривыми:
$$\shorthandoff{"}\begin{xy}
    *+{A}="A";p+/r5pc/+(0,15)*+{B}="B",
    p+<1pc,3pc>*+{C}="C",
    "A"+<4pc,-1pc>*+{D}="D",{\ar@/_/"C"},
    ?!{"A";"B"**@{-}}*++{\bullet}
\end{xy}\shorthandon{"}$$
Исходный текст примера:
Используется синтаксис LaTeX
\begin{xy}
    *+{A}="A";p+/r5pc/+(0,15)*+{B}="B",
    p+<1pc,3pc>*+{C}="C",
    "A"+<4pc,-1pc>*+{D}="D",{\ar@/_/"C"},
    ?!{"A";"B"**@{-}}*++{\bullet}
\end{xy}
 


Опция arc неплохо справляется с задачей рисования эллипсов, в том числе их дуг. Основной инструмент -- команда \ellipse. После команды можно указать в круглых или угловых скобках через запятую размеры осей, а затем -- стиль контура в фигурных скобках. Вообще, синтаксис этой команды очень сложен и предлагается к самостоятельному изучению. :) Хотя привести простенький пример вполне уместно:
Используется синтаксис LaTeX
\begin{xy} 0;/r5pc/:
    *\dir{*},*++!DR(.5){p}
    *\frm{-};p+(.5,-.5)*\dir{*}="c",
    **\dir{-},*+!UL{c},"c",
    {\ellipse(1,.4){-}},{\ellipse(,.75){--}},
    {\ellipse<15pt,10pt>{-}};
    *{};{\ellipse<,10pt>{=}}
\end{xy}
 

Соответствующая картинка:
$$\shorthandoff{"}\begin{xy} 0;/r5pc/:
    *\dir{*},*++!DR(.5){p}
    *\frm{-};p+(.5,-.5)*\dir{*}="c",
    **\dir{-},*+!UL{c},"c",
    {\ellipse(1,.4){-}},{\ellipse(,.75){--}},
    {\ellipse<15pt,10pt>{-}};
    *{};{\ellipse<,10pt>{=}}
\end{xy}\shorthandon{"}$$

Пакет \Xy-pic работает с декартовой системой координат, причем её базис можно переопределять (что может быть использовано для линейных преобразований объектов). Операция : позволяет модифицировать базис, но гарантирует, что система координат останется прямоугольной. После этого операцией :: можно изменить базис, сделав его вектора неортогональными.

Можно привести пример, похожий на предыдущий, но использующий смену системы координат:
Используется синтаксис LaTeX
\begin{xy} /r12mm/:
    (0,0)*@{*}="c",*++++!R{c},
    (1.2,.8)*+[F]@{+}="p",
    *++!LD{p},"p";"c"**@{--},
    {\ellipse<>{}},
    {\ellipse(0.8){}},
    0;(-1,1)::,
    {\ar@{.>}0;(1,0)},
    {\ar@{.>}0;(0,1)},
    "p";"c",{\ellipse(.8){--}},
    {\ellipse<3mm>{=}}
\end{xy}
 

Соответствующая картинка:
$$\shorthandoff{"}\begin{xy} /r12mm/:
    (0,0)*@{*}="c",*++++!R{c},
    (1.2,.8)*+[F]@{+}="p",
    *++!LD{p},"p";"c"**@{--},
    {\ellipse<>{}},
    {\ellipse(0.8){}},
    0;(-1,1)::,
    {\ar@{.>}0;(1,0)},
    {\ar@{.>}0;(0,1)},
    "p";"c",{\ellipse(.8){--}},
    {\ellipse<3mm>{=}}
\end{xy}\shorthandon{"}$$
Кстати, прием с настройкой базиса использовался в ранее приведенном примере рисования пирамид. Это очень полезная техника и её обязательно нужно освоить (см. список источников). Не могу удержаться и не привести ещё один пример:
$$\shorthandoff{"}\begin{xy} /r1cm/:
    {\xypolygon4"F"{~:{(0,.6)::}}},+(.8,1.3),
    {\xypolygon4"B"{~:{(.7,0):(0,.7)::}}},
    "F1";"B1"**@{-},"F2";"B2"**@{-},
    "F3";"B3"**@{-},"F4";"B4"**@{-}
\end{xy}
\qquad
\begin{xy} /1cm/:
    {\xypolygon4"F"{~:{(0,.6)::}}},+(.8,1.3),
    {\xypolygon4"B"{~:{(.7,0):(0,.7)::}}},
    "F1";"B1"**@{-},"F2";"B2"**@{-},
    "F3";"B3"**@{-},"F4";"B4"**@{-}
\end{xy}\shorthandon{"}$$
Для каждого проволочного параллелепипеда здесь используется свое xy-окружение; сравнение их содержимого поможет улучшить настроение:
код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\begin{xy} /r1cm/:
    {\xypolygon4"F"{~:{(0,.6)::}}},+(.8,1.3),
    {\xypolygon4"B"{~:{(.7,0):(0,.7)::}}},
    "F1";"B1"**@{-},"F2";"B2"**@{-},
    "F3";"B3"**@{-},"F4";"B4"**@{-}
\end{xy}

\qquad

\begin{xy} /1cm/:
    {\xypolygon4"F"{~:{(0,.6)::}}},+(.8,1.3),
    {\xypolygon4"B"{~:{(.7,0):(0,.7)::}}},
    "F1";"B1"**@{-},"F2";"B2"**@{-},
    "F3";"B3"**@{-},"F4";"B4"**@{-}
\end{xy}
 


Оказывается, \Xy-pic при помощи расширения frame прекрасно справляется с рисованием всевозможных рамок для объектов. Основная команда -- \frm{...}, где вместо многоточия указывается последовательность символов, описывающая желаемый стиль рамки. Как и спецификаторы стиля стрелок, спецификаторы стиля рамок довольно мнемоничны; например пунктирной границе соответствует последовательность --, сплошной -- символ -, сплошной с "тенью" -- последовательность -,, и т.д. Однако, по крайнейй мере в текущих версиях \Xy-pic, видны и недоработки. Так если символ o позволяет рисовать эллиптические рамки, то логично было бы предположить, что последовательность o, соответствует эллиптической рамке с тенью, однако же, это не так (указанная последовательность и вовсе не поддерживается).

Примеры:
$$\begin{xy}
    *++\txt{Frame} *\frm{-},
    +(15,0) *++\txt{Frame} *\frm{-,},
    +(15,0) *++\txt{Frame} *\frm<8pt>{-},
    -(0,15) *++\txt{Frame} *\frm{=},
    -(15,0) *++\txt{Frame} *\frm<8pt>{=},
    -(15,0) *++\txt{test} *\frm{--},
    -(0,15) *++\txt{Frame} *\frm{,},
    +(15,0) *++\txt{Frame} *\frm{.},
    +(15,0) *++\txt{Frame} *\frm{o},
    -(0,15) *++\txt{Frame} *\frm{-o},
    -(15,0) *++\txt{Frame} *\frm{.o},
    -(15,0) *++\txt{Frame} *\frm<8pt>{.}
\end{xy}$$
Исходник:
код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\begin{xy}
    *++\txt{Frame} *\frm{-},
    +(15,0) *++\txt{Frame} *\frm{-,},
    +(15,0) *++\txt{Frame} *\frm<8pt>{-},
    -(0,15) *++\txt{Frame} *\frm{=},
    -(15,0) *++\txt{Frame} *\frm<8pt>{=},
    -(15,0) *++\txt{test} *\frm{--},
    -(0,15) *++\txt{Frame} *\frm{,},
    +(15,0) *++\txt{Frame} *\frm{.},
    +(15,0) *++\txt{Frame} *\frm{o},
    -(0,15) *++\txt{Frame} *\frm{-o},
    -(15,0) *++\txt{Frame} *\frm{.o},
    -(15,0) *++\txt{Frame} *\frm<8pt>{.}
\end{xy}
 


Рисовать рамки можно и другим способом, а именно указывая стиль рамки после буквы F в модификаторе формы объекта [F]. Например в некотрой ячейке \xymatrix-таблицы можно написать что-то вроде *+[F-,]{A}.

Вообще, возможности низкоуровнего рисования можно попробовать применить для чего-нибудь более сложного. Например, можно составить изображение цилиндра из трех эллипсов и двух прямых (лишний эллипс используется для изображения невидимой части контура нижнего основания):
$$\shorthandoff{"}\begin{xy}
    (0,5)*\ellipse(3,1){-}; 
    (0,-5)*\ellipse(3,1){.}; 
    (0,-5)*\ellipse(3,1)__,=:a(-180){-}; 
    (-3,10)*{}="TL"; 
    (3,10)*{}="TR"; 
    (-3,-10)*{}="BL"; 
    (3,-10)*{}="BR"; 
    "TL"; "BL" **\dir{-}; 
    "TR"; "BR" **\dir{-}; 
\end{xy}\shorthandon{"}$$
Исходный код этого примера выглядит так:
Используется синтаксис LaTeX
\begin{xy}
    (0,5)*\ellipse(3,1){-};
    (0,-5)*\ellipse(3,1){.};
    (0,-5)*\ellipse(3,1)__,=:a(-180){-};
    (-3,10)*{}="TL";
    (3,10)*{}="TR";
    (-3,-10)*{}="BL";
    (3,-10)*{}="BR";
    "TL"; "BL" **\dir{-};
    "TR"; "BR" **\dir{-};
\end{xy}
 


Некий Aaron Lauda разработал целую технику рисования диаграмм топологических бордизмов, в которой пленки сложной форму собираются из простых фрагментов-заготовок. Пример одной из таких заготовок был приведен выше. Сейчас не важно как именно (ко)бордизмы связаны с подобными объектами-ручками и как топологи все это правильно называют, важно как это все выглядит и как может быть реализовано на языке \Xy-pic. Итак, в основе техники рисование бордизмов лежит набор простых объектов, некоторые из которых показаны на следующем рисунке:
$$\shorthandoff{"}
\begin{tabular}{ccc}
{\begin{xy}
    (0,0)*\ellipse(5,2){-}; 
    (-5,0)*{}="TL"; 
    (5,0)*{}="TR"; 
    "TL";"TR" **\crv{(-5,-12) & (5,-12) }; 
\end{xy}}
&
{\begin{xy}
    (0,0)*\ellipse(5,2){.}; 
    (0,0)*\ellipse(5,2)__,=:a(-180){-}; 
    (-5,0)*{}="TL"; 
    (5,0)*{}="TR"; 
    "TL";"TR" **\crv{(-5,12) & (5,12) }; 
\end{xy}}
&
{\begin{xy}
    (-3,1.5)*\ellipse(3,1){-}; 
    (3,1.5)*\ellipse(3,1){-}; 
    (-3,3)*{}="X1"; 
    (3,3)*{}="X2"; 
    "X1";"X2" **\crv{(-3,-2) & (3,-2)}; 
    (-9,3)*{}="X1"; 
    (9,3)*{}="X2"; 
    "X1";"X2" **\crv{(-9,-9) & (9,-9)}; 
\end{xy}}
\\
{\begin{xy}
    (-3,-1.5)*\ellipse(3,1){.}; 
    (3,-1.5)*\ellipse(3,1){.}; 
    (-3,-1.5)*\ellipse(3,1)__,=:a(-180){-}; 
    (3,-1.5)*\ellipse(3,1)__,=:a(-180){-}; 
    (-3,-3)*{}="X1"; 
    (3,-3)*{}="X2"; 
    "X1";"X2" **\crv{(-3,2) & (3,2)}; 
    (-9,-3)*{}="X1"; 
    (9,-3)*{}="X2"; 
    "X1";"X2" **\crv{(-9,9) & (9,9)}; 
\end{xy}}
&
{\begin{xy}
    (0,-3)*\ellipse(3,1){.}; 
    (0,-3)*\ellipse(3,1)__,=:a(-180){-}; 
    (-3,6)*\ellipse(3,1){-}; 
    (3,6)*\ellipse(3,1){-}; 
    (-3,12)*{}="1"; %(inside 
    (3,12)*{}="2"; %top ellipses) 
    (-9,12)*{}="A2";%(Outside 
    (9,12)*{}="B2"; %top ellipses) 
    "1";"2" **\crv{(-3,7) & (3,7)};%(Top curve) 
    (-3,-6)*{}="A";%(sides of 
    (3,-6)*{}="B"; % bottom ellipse) 
    (-3,1)*{}="A1";%(end points 
    (3,1)*{}="B1"; % of straight lines) 
    "A";"A1" **\dir{-}; 
    "B";"B1" **\dir{-}; %straight lines 
    "B2";"B1" **\crv{(8,7) & (3,5)}; 
    "A2";"A1" **\crv{(-8,7) & (-3,5)}; 
\end{xy}}
&
{\begin{xy}
    (0,-4.5)*\ellipse(3,1){.}; 
    (0,-4.5)*\ellipse(3,1)__,=:a(-180){-}; 
    (-3,3)*\ellipse(3,1){-}; 
    (3,3)*\ellipse(3,1){-}; 
    (-3,6)*{}="1"; 
    (3,6)*{}="2"; 
    (-9,6)*{}="A2"; 
    (9,6)*{}="B2"; 
    "1";"2" **\crv{(-3,-1) & (3,-1)}; 
    (-3,-9)*{}="A"; 
    (3,-9)*{}="B"; 
    (-3,-3)*{}="A1"; 
    (3,-3)*{}="B1"; 
    "A";"A1" **\dir{-}; 
    "B";"B1" **\dir{-}; 
    "B1";"B2" **\crv{(8,-1)}; 
    "A1";"A2" **\crv{(-8,-1)}; 
\end{xy}}
\end{tabular}
\shorthandon{"}$$
Исходный текст этого примера таков:
код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\begin{tabular}{ccc}
    {\begin{xy}
        (0,0)*\ellipse(5,2){-};
        (-5,0)*{}="TL";
        (5,0)*{}="TR";
        "TL";"TR" **\crv{(-5,-12) & (5,-12) };
    \end{xy}}

&

    {\begin{xy}
        (0,0)*\ellipse(5,2){.};
        (0,0)*\ellipse(5,2)__,=:a(-180){-};
        (-5,0)*{}="TL";
        (5,0)*{}="TR";
        "TL";"TR" **\crv{(-5,12) & (5,12) };
    \end{xy}}

&

    {\begin{xy}
        (-3,1.5)*\ellipse(3,1){-};
        (3,1.5)*\ellipse(3,1){-};
        (-3,3)*{}="X1";
        (3,3)*{}="X2";
        "X1";"X2" **\crv{(-3,-2) & (3,-2)};
        (-9,3)*{}="X1";
        (9,3)*{}="X2";
        "X1";"X2" **\crv{(-9,-9) & (9,-9)};
    \end{xy}}

\\

    {\begin{xy}
        (-3,-1.5)*\ellipse(3,1){.};
        (3,-1.5)*\ellipse(3,1){.};
        (-3,-1.5)*\ellipse(3,1)__,=:a(-180){-};
        (3,-1.5)*\ellipse(3,1)__,=:a(-180){-};
        (-3,-3)*{}="X1";
        (3,-3)*{}="X2";
        "X1";"X2" **\crv{(-3,2) & (3,2)};
        (-9,-3)*{}="X1";
        (9,-3)*{}="X2";
        "X1";"X2" **\crv{(-9,9) & (9,9)};
    \end{xy}}

&

    {\begin{xy}
        (0,-3)*\ellipse(3,1){.};
        (0,-3)*\ellipse(3,1)__,=:a(-180){-};
        (-3,6)*\ellipse(3,1){-};
        (3,6)*\ellipse(3,1){-};
        (-3,12)*{}="1"; %(inside
        (3,12)*{}="2"; %top ellipses)
        (-9,12)*{}="A2";%(Outside
        (9,12)*{}="B2"; %top ellipses)
        "1";"2" **\crv{(-3,7) & (3,7)};%(Top curve)
        (-3,-6)*{}="A";%(sides of
        (3,-6)*{}="B"; % bottom ellipse)
        (-3,1)*{}="A1";%(end points
        (3,1)*{}="B1"; % of straight lines)
        "A";"A1" **\dir{-};
        "B";"B1" **\dir{-}; %straight lines
        "B2";"B1" **\crv{(8,7) & (3,5)};
        "A2";"A1" **\crv{(-8,7) & (-3,5)};
    \end{xy}}

&

    {\begin{xy}
        (0,-4.5)*\ellipse(3,1){.};
        (0,-4.5)*\ellipse(3,1)__,=:a(-180){-};
        (-3,3)*\ellipse(3,1){-};
        (3,3)*\ellipse(3,1){-};
        (-3,6)*{}="1";
        (3,6)*{}="2";
        (-9,6)*{}="A2";
        (9,6)*{}="B2";
        "1";"2" **\crv{(-3,-1) & (3,-1)};
        (-3,-9)*{}="A";
        (3,-9)*{}="B";
        (-3,-3)*{}="A1";
        (3,-3)*{}="B1";
        "A";"A1" **\dir{-};
        "B";"B1" **\dir{-};
        "B1";"B2" **\crv{(8,-1)};
        "A1";"A2" **\crv{(-8,-1)};
    \end{xy}}
\end{tabular}
 

 Профиль  
                  
 
 dxdy/xypic, III
Сообщение31.07.2010, 00:53 
Заслуженный участник


26/07/09
1559
Алматы
Используя эти "кирпичики" можно набирать такие диаграммы:
$$\shorthandoff{"}\begin{tabular}{ccc}
    {\begin{xy}
        (0,0)*\ellipse(3,1){.}; 
        (0,0)*\ellipse(3,1)__,=:a(-180){-}; 
        (-6,-8)*\ellipse(3,1){.}; 
        (6,-8)*\ellipse(3,1){.}; 
        (0,-8)*\ellipse(3,1){.}; 
        (-6,-8)*\ellipse(3,1)__,=:a(-180){-}; 
        (6,-8)*\ellipse(3,1)__,=:a(-180){-}; 
        (0,-8)*\ellipse(3,1)__,=:a(180){-}; 
        (-3,6)*\ellipse(3,1){-}; 
        (3,6)*\ellipse(3,1){-}; 
        (-3,12)*{}="1"; 
        (3,12)*{}="2"; 
        (-9,12)*{}="A2"; 
        (9,12)*{}="B2"; 
        "1";"2" **\crv{(-3,7) & (3,7)}; 
        (-3,0)*{}="A"; 
        (3,0)*{}="B"; 
        (-3,1)*{}="A1"; 
        (3,1)*{}="B1"; 
        "A";"A1" **\dir{-}; 
        "B";"B1" **\dir{-}; 
        "B2";"B1" **\crv{(8,7) & (3,5)}; 
        "A2";"A1" **\crv{(-8,7) & (-3,5)}; 
        %REFLECT 
        (3,-16)*{}="1"; 
        (9,-16)*{}="2"; 
        "1";"2" **\crv{(3,-10) & (9,-10)}; 
        (-3,-16)*{}="1"; 
        (-9,-16)*{}="2"; 
        "1";"2" **\crv{(-3,-10) & (-9,-10)}; 
        (-15,-16)*{}="A2"; 
        (15,-16)*{}="B2"; 
        (-3,0)*{}="A"; 
        (3,0)*{}="B"; 
        (-3,-1)*{}="A1"; 
        (3,-1)*{}="B1"; 
        "A";"A1" **\dir{-}; 
        "B";"B1" **\dir{-}; 
        "B2";"B1" **\crv{(13,-6) & (2,-8)}; 
        "A2";"A1" **\crv{(-13,-6) & (-2,-8)};
    \end{xy}}

&

    {\begin{xy}
        (4,4)*\ellipse(3,1){-}; 
        (-4,4)*\ellipse(3,1){-}; 
        (4,-4)*\ellipse(3,1){.}; 
        (-4,-4)*\ellipse(3,1){.}; 
        (-4,-4)*\ellipse(3,1)__,=:a(-180){-}; 
        (4,-4)*\ellipse(3,1)__,=:a(-180){-}; 
        (-8,11)*{x}; (8,11)*{y}; 
        (-8,-11)*{y}; (8,-11)*{x}; 
        (-12,0)*{B_{x,y}}; 
        (11,8)*{}="TLL"; (5,8)*{}="TL"; 
        (11,-8)*{}="BLL"; (5,-8)*{}="BL"; 
        (-10.75,7.5)*{}="TRR"; (-5,8)*{}="TR"; 
        (-11,-8)*{}="BRR"; (-5,-8)*{}="BR"; 
        (0,3)*{}="T"; (-3,0)*{}="R"; 
        (3,0)*{}="L"; (0,-3)*{}="B"; 
        "TRR";"R" **\dir{-}; 
        "BL";"B" **\dir{-}; 
        "TR";"T" **\dir{-}; 
        "BLL";"L" **\dir{-}; 
        "TLL";"BR" **\dir{-}; 
        "TL";"BRR" **\dir{-}; 
    \end{xy}}
\\&\\
    {\begin{xy}
        (0,4)*\ellipse(3,1){-}; 
        (0,-7)*\ellipse(3,1){.}; 
        (0,-7)*\ellipse(3,1)__,=:a(-180){-}; 
        (-3,8)*{}="TL"; 
        (3,8)*{}="TR"; 
        (-3,-14)*{}="BL"; 
        (3,-14)*{}="BR"; 
        (3,0)*{}="MT"; 
        (3,-8)*{}="MB"; 
        (7,0)*{}="2"; 
        (12,0)*{}="3"; 
        "TL"; "BL" **\dir{-}; 
        "TR"; "MT" **\dir{-}; 
        "BR"; "MB" **\dir{-}; 
        "MT";"2" **\crv{(3,-4)& (7,-4)}; 
        "2";"3" **\crv{(7,6)& (12,6)}; 
        "MB";"3" **\crv{(4,-4)& (12,-7)}; 
    \end{xy} 

    \qquad = \qquad 

    \begin{xy} %Straight tube cobordism 
        (0,4)*\ellipse(3,1){-}; 
        (0,-7)*\ellipse(3,1){.}; 
        (0,-7)*\ellipse(3,1)__,=:a(-180){-}; 
        (-3,8)*{}="TL"; 
        (3,8)*{}="TR"; 
        (-3,-14)*{}="BL"; 
        (3,-14)*{}="BR"; 
        "TL"; "BL" **\dir{-}; 
        "TR"; "BR" **\dir{-}; 
    \end{xy}}
\end{tabular}\shorthandon{"}$$
Исходный код:
код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\begin{tabular}{ccc}
    {\begin{xy}
        (0,0)*\ellipse(3,1){.};
        (0,0)*\ellipse(3,1)__,=:a(-180){-};
        (-6,-8)*\ellipse(3,1){.};
        (6,-8)*\ellipse(3,1){.};
        (0,-8)*\ellipse(3,1){.};
        (-6,-8)*\ellipse(3,1)__,=:a(-180){-};
        (6,-8)*\ellipse(3,1)__,=:a(-180){-};
        (0,-8)*\ellipse(3,1)__,=:a(180){-};
        (-3,6)*\ellipse(3,1){-};
        (3,6)*\ellipse(3,1){-};
        (-3,12)*{}="1";
        (3,12)*{}="2";
        (-9,12)*{}="A2";
        (9,12)*{}="B2";
        "1";"2" **\crv{(-3,7) & (3,7)};
        (-3,0)*{}="A";
        (3,0)*{}="B";
        (-3,1)*{}="A1";
        (3,1)*{}="B1";
        "A";"A1" **\dir{-};
        "B";"B1" **\dir{-};
        "B2";"B1" **\crv{(8,7) & (3,5)};
        "A2";"A1" **\crv{(-8,7) & (-3,5)};
        %REFLECT
        (3,-16)*{}="1";
        (9,-16)*{}="2";
        "1";"2" **\crv{(3,-10) & (9,-10)};
        (-3,-16)*{}="1";
        (-9,-16)*{}="2";
        "1";"2" **\crv{(-3,-10) & (-9,-10)};
        (-15,-16)*{}="A2";
        (15,-16)*{}="B2";
        (-3,0)*{}="A";
        (3,0)*{}="B";
        (-3,-1)*{}="A1";
        (3,-1)*{}="B1";
        "A";"A1" **\dir{-};
        "B";"B1" **\dir{-};
        "B2";"B1" **\crv{(13,-6) & (2,-8)};
        "A2";"A1" **\crv{(-13,-6) & (-2,-8)};
    \end{xy}}

&

    {\begin{xy}
        (4,4)*\ellipse(3,1){-};
        (-4,4)*\ellipse(3,1){-};
        (4,-4)*\ellipse(3,1){.};
        (-4,-4)*\ellipse(3,1){.};
        (-4,-4)*\ellipse(3,1)__,=:a(-180){-};
        (4,-4)*\ellipse(3,1)__,=:a(-180){-};
        (-8,11)*{x}; (8,11)*{y};
        (-8,-11)*{y}; (8,-11)*{x};
        (-12,0)*{B_{x,y}};
        (11,8)*{}="TLL"; (5,8)*{}="TL";
        (11,-8)*{}="BLL"; (5,-8)*{}="BL";
        (-10.75,7.5)*{}="TRR"; (-5,8)*{}="TR";
        (-11,-8)*{}="BRR"; (-5,-8)*{}="BR";
        (0,3)*{}="T"; (-3,0)*{}="R";
        (3,0)*{}="L"; (0,-3)*{}="B";
        "TRR";"R" **\dir{-};
        "BL";"B" **\dir{-};
        "TR";"T" **\dir{-};
        "BLL";"L" **\dir{-};
        "TLL";"BR" **\dir{-};
        "TL";"BRR" **\dir{-};
    \end{xy}}

\\&\\

    {\begin{xy}
        (0,4)*\ellipse(3,1){-};
        (0,-7)*\ellipse(3,1){.};
        (0,-7)*\ellipse(3,1)__,=:a(-180){-};
        (-3,8)*{}="TL";
        (3,8)*{}="TR";
        (-3,-14)*{}="BL";
        (3,-14)*{}="BR";
        (3,0)*{}="MT";
        (3,-8)*{}="MB";
        (7,0)*{}="2";
        (12,0)*{}="3";
        "TL"; "BL" **\dir{-};
        "TR"; "MT" **\dir{-};
        "BR"; "MB" **\dir{-};
        "MT";"2" **\crv{(3,-4)& (7,-4)};
        "2";"3" **\crv{(7,6)& (12,6)};
        "MB";"3" **\crv{(4,-4)& (12,-7)};
    \end{xy}

    \qquad = \qquad

    \begin{xy} %Straight tube cobordism
        (0,4)*\ellipse(3,1){-};
        (0,-7)*\ellipse(3,1){.};
        (0,-7)*\ellipse(3,1)__,=:a(-180){-};
        (-3,8)*{}="TL";
        (3,8)*{}="TR";
        (-3,-14)*{}="BL";
        (3,-14)*{}="BR";
        "TL"; "BL" **\dir{-};
        "TR"; "BR" **\dir{-};
    \end{xy}}
\end{tabular}
 


Не менее интересны следующие примеры:
$$\shorthandoff{"}
\begin{tabular}{ccc}
    {\begin{xy}
        (20,2)*{}="RU"; (16,-3)*{}="RD"; 
        (-16,2)*{}="LU"; (-20,-3)*{}="LD"; 
        "RU";"RD" **\crv{(4,2) & (4,-1)}; 
        "LD";"LU" **\crv{(-4,-2) & (-4,1)}; 
        (7.5,0)*{}="x1"; (-7.5,0)*{}="x2"; 
        "x1"; "x2" **\crv{(7,-10) & (-7,-10)}; 
        (16,-20)*{}="RDD"; (-20,-20)*{}="LDD"; 
        (20,-15)*{}="RUD"; (-16,-15)*{}="LUD"; 
        (-16,-2.5)*{}="A"; (16,-15)*{}="B"; 
        "RD"; "RDD" **\dir{-}; 
        "LD"; "LDD" **\dir{-}; 
        "A"; "LUD" **\dir{.}; 
        "RDD"; "LDD" **\dir{-}; 
        "RU"; "RUD" **\dir{-}; 
        "LU"; "A" **\dir{-}; 
        "B"; "RUD" **\dir{-}; 
        "B"; "LUD" **\dir{.}; 
        (0,-8)*{\bullet}; 
    \end{xy}}

&

    {\begin{xy}
        0;/r.18pc/: 
        (20,2)*{\bullet}="RU"+(1,3)*{x^{\ast}}; 
        (16,-3)*{\bullet}="RD"+(2.5,2)*{x^{\ast}}; 
        (-16,2)*{\bullet}="LU"+(-1,2)*{x}; 
        (-20,-3)*{\bullet}="LD"+(-1,2)*{x}; 
        "RU";"RD" **\crv{(4,2) & (4,-1)}; ?(.1)*\dir{<}; ?(.85)*\dir{<}; 
        "LD";"LU" **\crv{(-4,-2) & (-4,1)}; 
        ?(.08)*\dir{<}; ?(.85)*\dir{<}; 
        (7.5,0)*{}="x1"; (-7.5,0)*{}="x2"; 
        "x1"; "x2" **\crv{(7,-10) & (-7,-10)}; 
        (16,-20)*{\bullet}="RDD"+(2.5,-1)*{x^{\ast}}; 
        (-20,-20)*{\bullet}="LDD"+(-1,-3)*{x}; 
        (20,-12.5)*{\bullet}="RUD"+(3.5,1)*{x^{\ast}}; 
        (-16,-15)*{\bullet}="LUD"; 
        (-16,-2.5)*{}="A"; (16.1,-14.9)*{}="B"; 
        "RD"; "RDD" **\dir{-}; 
        "LD"; "LDD" **\dir{-}; 
        "A"; "LUD" **\dir{.}; 
        "RDD"; "LDD" **\crv{(0,-17)}; ?(.57)*\dir{>}; 
        "RU"; "RUD" **\dir{-}; 
        "LU"; "A" **\dir{-}; 
        "B"; "RUD" **\crv{(18,-14.15)}; 
        "B"; "LUD" **\crv{~*=<4pt>{.}(0,-18)}; ?(.4)*\dir{<}; 
    \end{xy}}
\\&\\
    {\begin{xy}
        0;/r.18pc/: 
        (-10,-12)*{\bullet}="A"+(-3,1)*{x}; 
        (-20,-6)*{\bullet}="B"+(-3,1)*{x^{\ast}}; 
        (10,10)*{\bullet}="a"+(1,3)*{x^{\ast}}; 
        (20,6)*{\bullet}="b"+(3,1)*{x}; 
        (-10,-24)*{\bullet}="A1"+(-3,1)*{x}; 
        (-20,-20)*{\bullet}="B1"+(-3,1)*{x^{\ast}}; 
        (10,2)*{}="a1"; (10,-4)*{}="a11"; 
        (20,-6)*{\bullet}="b1"+(3,-1)*{x}; 
        "A";"B" **\crv{(0,0) & (-10,0)}; ?(.85)*\dir{<}; ?(.05)*\dir{<}; 
        "a";"b" **\crv{(0,0) & (10,0)};?(.85)*\dir{<}; ?(.05)*\dir{<}; 
        (-6,-3)*{}="X"; (6,3)*{}="x"; 
        (-10,-14.5)*{}="P"; 
        "X";"x" **\crv{(1,-16)}; 
        "A";"A1" **\dir{-}; 
        "B";"B1" **\dir{-}; 
        "b";"b1" **\dir{-}; 
        "a";"a1" **\dir{-}; 
        "a11";"a1" **\dir{.}; 
        "P";"a11" **\dir{.}; 
        "B1";"P" **\dir{-}; ?(.55)*\dir{>}; 
        "A1";"b1" **\dir{-}; ?(.45)*\dir{<}; 
    \end{xy}}
\end{tabular}
\shorthandon{"}$$
Исходники выглядят так:
код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\begin{tabular}{ccc}
    {\begin{xy}
        (20,2)*{}="RU"; (16,-3)*{}="RD";
        (-16,2)*{}="LU"; (-20,-3)*{}="LD";
        "RU";"RD" **\crv{(4,2) & (4,-1)};
        "LD";"LU" **\crv{(-4,-2) & (-4,1)};
        (7.5,0)*{}="x1"; (-7.5,0)*{}="x2";
        "x1"; "x2" **\crv{(7,-10) & (-7,-10)};
        (16,-20)*{}="RDD"; (-20,-20)*{}="LDD";
        (20,-15)*{}="RUD"; (-16,-15)*{}="LUD";
        (-16,-2.5)*{}="A"; (16,-15)*{}="B";
        "RD"; "RDD" **\dir{-};
        "LD"; "LDD" **\dir{-};
        "A"; "LUD" **\dir{.};
        "RDD"; "LDD" **\dir{-};
        "RU"; "RUD" **\dir{-};
        "LU"; "A" **\dir{-};
        "B"; "RUD" **\dir{-};
        "B"; "LUD" **\dir{.};
        (0,-8)*{\bullet};
    \end{xy}}

&

    {\begin{xy}
        0;/r.18pc/:
        (20,2)*{\bullet}="RU"+(1,3)*{x^{\ast}};
        (16,-3)*{\bullet}="RD"+(2.5,2)*{x^{\ast}};
        (-16,2)*{\bullet}="LU"+(-1,2)*{x};
        (-20,-3)*{\bullet}="LD"+(-1,2)*{x};
        "RU";"RD" **\crv{(4,2) & (4,-1)}; ?(.1)*\dir{<}; ?(.85)*\dir{<};
        "LD";"LU" **\crv{(-4,-2) & (-4,1)};
        ?(.08)*\dir{<}; ?(.85)*\dir{<};
        (7.5,0)*{}="x1"; (-7.5,0)*{}="x2";
        "x1"; "x2" **\crv{(7,-10) & (-7,-10)};
        (16,-20)*{\bullet}="RDD"+(2.5,-1)*{x^{\ast}};
        (-20,-20)*{\bullet}="LDD"+(-1,-3)*{x};
        (20,-12.5)*{\bullet}="RUD"+(3.5,1)*{x^{\ast}};
        (-16,-15)*{\bullet}="LUD";
        (-16,-2.5)*{}="A"; (16.1,-14.9)*{}="B";
        "RD"; "RDD" **\dir{-};
        "LD"; "LDD" **\dir{-};
        "A"; "LUD" **\dir{.};
        "RDD"; "LDD" **\crv{(0,-17)}; ?(.57)*\dir{>};
        "RU"; "RUD" **\dir{-};
        "LU"; "A" **\dir{-};
        "B"; "RUD" **\crv{(18,-14.15)};
        "B"; "LUD" **\crv{~*=<4pt>{.}(0,-18)}; ?(.4)*\dir{<};
    \end{xy}}

\\&\\

    {\begin{xy}
        0;/r.18pc/:
        (-10,-12)*{\bullet}="A"+(-3,1)*{x};
        (-20,-6)*{\bullet}="B"+(-3,1)*{x^{\ast}};
        (10,10)*{\bullet}="a"+(1,3)*{x^{\ast}};
        (20,6)*{\bullet}="b"+(3,1)*{x};
        (-10,-24)*{\bullet}="A1"+(-3,1)*{x};
        (-20,-20)*{\bullet}="B1"+(-3,1)*{x^{\ast}};
        (10,2)*{}="a1"; (10,-4)*{}="a11";
        (20,-6)*{\bullet}="b1"+(3,-1)*{x};
        "A";"B" **\crv{(0,0) & (-10,0)}; ?(.85)*\dir{<}; ?(.05)*\dir{<};
        "a";"b" **\crv{(0,0) & (10,0)};?(.85)*\dir{<}; ?(.05)*\dir{<};
        (-6,-3)*{}="X"; (6,3)*{}="x";
        (-10,-14.5)*{}="P";
        "X";"x" **\crv{(1,-16)};
        "A";"A1" **\dir{-};
        "B";"B1" **\dir{-};
        "b";"b1" **\dir{-};
        "a";"a1" **\dir{-};
        "a11";"a1" **\dir{.};
        "P";"a11" **\dir{.};
        "B1";"P" **\dir{-}; ?(.55)*\dir{>};
        "A1";"b1" **\dir{-}; ?(.45)*\dir{<};
    \end{xy}}
\end{tabular}
 



В этом сообщении были рассмотрены лишь некоторые расширения и опции \Xy-pic, поддерживаемые этим форумом. Но перечень доступных расширений более обширен.

Например, расширение web предназначено для работы с произвольными регулярными решетками (сетками).

Если расширение matrix позволяет верстать диаграммы с привязкой к сетке, образованной ячейками прямоугольной таблицы, опция poly -- с привязкой к вершинам многоугольника, а web -- к узлам некоторой решетки, то расширение graph служит для рисования графов (в частности всевозможных деревьев) путем описания их комбинаторной структуры. Может быть когда-нибудь эта опция будет активирована. :)

Также, графический пакет \Xy-pic предоставляет богатые возможности по верстке одних из интереснейших топологических объектов -- узлов и кос. Доступ к таким возможностям обеспечивается расширением knot.

Но на форуме dxdy существует ряд других проблем помимо отсутствия некоторых полезных расширений. Одной из таких проблем является проблема корректного функционирования \Xy-pic в кириллической среде пакета babel. Фактически, диаграммы, содержащие символ двойной кавычки ", не могут быть правильно сверстаны без дополнительных ухищрений. На данный момент известен хак с заключением диаграмм в "окружение" \shorthandoff{"} ... \shorthandon{"}.

К сожалению, даже этот обходной путь затрудняет использование опции предпросмотра сообщений и портит значение атрибута alt у html-тега img.

Мало того, \Xy-pic имеет славу весьма прожорливой примочки и это стоит учитывать, например, экономя на количестве кривых линий в ваших диаграммах. Теоретически, проблема эффективности может быть успешно решена, но, судя по низкому качеству графики диаграмм, текущая ситуация технически не позволяет выжимать из установленного на сервере софта максимальную производительность. Пока для ускорения верстки диаграмм разумным решением является стремление к простоте кода диаграмм \Xy-pic.

В завершение, хочется оговориться, что здесь едва ли были рассмотрены и 5% возможностей \Xy-pic; в любом случае для работы с этим пакетом необходимо тщательное ознакомление с официальной документацией и, возможно, даже консультации его создателей (например, с использованием официального списка рассылок).

Источники:
  1. Kristoffer H. Rose, Xy-pic User's Guide
  2. Kristoffer H. Rose, Ross Moore, Xy-pic Reference Manual
  3. Michel Goossens, Sebastian Rahtz, Frank Mittelbach, The LaTeX Graphics Companion
  4. Домашняя страница \Xy-pic
  5. CTAN:/macros/generic/diagrams/xypic/
  6. Aaron Lauda, Cobordism Tutorial
  7. Краткий ФАК по тегу [mаth]

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 3 ] 

Модераторы: cepesh, Forum Administration



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

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


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

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