1. Tutorial de X -pic
Y
Carlos A. P. Campani
campani@ufpel.edu.br
14 de abril de 2006
1 Introdu¸˜o
ca
X -pic ´ um pacote para tipografar gr´ficos e diagramas em TEX. O pacote
Y e a
X -pic pode ser usado com TEX e L TE
Y A X e permite desenhar diversos tipos
diferentes de gr´ficos e diagramas, incluindo pol´
a ıgonos, n´s e diagramas em
o
matriz. Ele ´ implementado em torno de um kernel de linguagem gr´fica,
e a
que fornece uma nota¸˜o mnemˆnica e consistente, baseada na composi¸˜o
ca o ca
l´gica de componentes visuais.
o
Este tutorial tem o objetivo de ser uma introdu¸˜o breve e acess´ ao
ca ıvel
uso do X -pic. Estamos longe de pretender apresentar todos os recursos
Y
dispon´ıveis. Ele complementa o X -pic Reference Manual, de Kristoffer H.
Y
Rose e Ross Moore [2], e o X -pic User’s Guide, de Kristoffer H. Rose [1],
Y
que podem ser obtidos em http://www.tug.org/applications/Xy-pic/.
Ainda h´ o ´timo livro The LTEX Graphics Companion, de Goossens, Rahtz,
a o A
e Mittelbach [3]. Recomendamos a leitura de todos estes textos para aqueles
que desejam usar intensamente o X -pic.
Y
Para carregar o pacote X -pic no TEX usam-se os comandos input xy e
Y
xyoption{all}, que carrega todos os recursos, o que pode tornar a execu¸aoc˜
do TEX lenta. Para aumentar o desempenho do TEX recomenda-se carregar
apenas os recursos que ser˜o usados. Da mesma forma que no TEX, para
a
carregar o X -pic no L TEX usa-se o comando usepackage[all]{xy} no
Y A
cabe¸alho do arquivo.
c
Caso se queira produzir gr´ficos de n´s e arcos, deve-se incluir adicional-
a o
mente as op¸oes knot e arc. Tamb´m precisamos declarar as op¸˜es import
c˜ e co
e poly se quisermos importar imagens postscript e desenhar pol´ ıgonos nos
1
2. diagramas. Para isto basta usar, no cabe¸alho do arquivo L TEX, o comando
c A
usepackage[all,knot,arc,import,poly]{xy}.
Problemas podem ocorrer devido a flexibilidade do formato de entrada
do TEX. Isto causa algumas situa¸oes complicadas de conflito. Um exemplo
c˜
´ o uso do X -pic junto com o pacote babel, em portuguˆs e outras l´
e Y e ınguas
que redefinem as aspas, como ´ o caso tamb´m do alem˜o, o que povoca
e e a
conflito quando se deseja salvar posi¸˜es em um diagrama. Este problema
co
pode ser resolvido ao usarmos $$ shorthandoff{"} xy ... endxy $$,
protegendo os comandos X -pic definidos dentro de xy ... endxy.
Y
Outro problema ´ o conflito do caracter & quando usado em um diagrama
e
do X -pic dentro de um ambiente tabular. Neste caso, ´ poss´ resolver o
Y e ıvel
problema protegendo os comandos X -pic dentro de um par { e }.
Y
2 Conceitos B´sicos
a
A estrutura geral de uma X -figura ´ xy ... endxy, que constr´i uma
Y e o
caixa (box ) com uma X -figura (usu´rios L TE
Y a A X podem substituir este co-
mando por begin{xy} ... end{xy}). Nesta estrutura podem ser decla-
rados comandos da “linguagem gr´fica” do X -pic.
a Y
N˜o h´ necessidade de colocar a X -figura explicitamente em modo mate-
a a Y
m´tico, pois a declara¸ao xy ... endxy j´ o faz. Caso haja necessidade
a c˜ a
de apresentar texto dentro da X -figura, basta usar o comando txt{ ... }.
Y
Os elementos que formam a linguagem do X -pic s˜o:
Y a
Posi¸oes Representam coordenadas de pontos dentro da caixa da X -figura;
c˜ Y
Objetos Um objeto ´ como uma caixa (box ) do TEX que pode ser posto em
e
uma posi¸ao, exceto que ele possui uma borda (edge);
c˜
Conex˜es Junto com a capacidade de colocar objetos em posi¸˜es, todos os
o co
objetos podem ser usados para conectar duas posi¸oes;
c˜
Decora¸oes Sempre que o X -pic encontra algo que n˜o pode ser inter-
c˜ Y a
pretado como uma posi¸ao, ele interpreta o que se segue como uma
c˜
decora¸˜o, ou seja, um conjunto restrito de comandos a ser adicionado
ca
` figura.
a
Posi¸oes podem ser representadas por pares (x,y), cujos valores x cres-
c˜
cem da esquerda para a direita, e os valores y de baixo para cima. Assim,
2
3. a origem do sistema de coordenadas ´ o ponto (0, 0) (tamb´m representado
e e
como 0), e a X -figura est´ contida no seguinte retˆngulo:
Y a a
y
Ymax
0
o • G
ponto de referˆncia TEX
e Xmin Ymin Xmax
A forma mais simples de colocar coisas em uma X -figura ´ “largar” um
Y e
objeto em uma posi¸ao. Para definir posi¸oes e “largar” objetos usa-se o
c˜ c˜
operador *. Por exemplo,
(0,0)*{A}
coloca o r´tulo A na posi¸ao (0, 0).
o c˜
Al´m de poder “largar” objetos em uma posi¸ao da X -figura, podemos co-
e c˜ Y
nectar os dois objetos correntes do estado, formado pelas posi¸oes p (posi¸˜o
c˜ ca
pr´via) e c (posi¸˜o corrente). Para definir conex˜es usa-se o operador **.
e ca o
Assim,
xy
(0,0)*{};(10,0)*{} **dir{-}
endxy
define a posi¸˜o pr´via p = (0, 0) e a posi¸ao corrente c = (10, 0) e conecta
ca e c˜
ambas com um direcional definido por **dir{-}. Qualquer objeto pode
ser usado como conector e, neste caso, foi usado o -, indicando que as duas
posi¸oes devem ser conectadas por uma linha simples. Observe que (0,0)*{}
c˜
e (10,0)*{} define as posi¸˜es pr´via e corrente, sem “largar” nenhum objeto
co e
nelas.
O operador ; indica que deve-se atualizar as posi¸˜es pr´via e corrente,
co e
trocando a corrente anterior pela pr´via e fazendo da ultima posi¸˜o inserida
e ´ ca
a nova corrente. Assim, em
xy
(0,0)*{};(10,0)*{} **dir{-};
(10,10)*{} **dir{-}
endxy
3
4. O primeiro ; define as posi¸˜es p = (0, 0) e c = (10, 0). O segundo ; atribui
co
a p o valor anterior de c, (10, 0), e faz c = (10, 10). Ent˜o s˜o tra¸adas duas
a a c
linhas, uma entre (0, 0) e (10, 0) e outra entre (10, 0) e (10, 10).
Objetos possuem uma borda (edge). Assim, um objeto pode ser entendido
como uma caixa (box ) TEX, com uma forma (shape), e com dimens˜es L, U ,
o
R e D. A forma do objeto for¸a a forma de sua borda. O kernel do X -pic
c Y
fornece trˆs formas (shapes), nomeadas [.], [] e [o], correspondendo a:
e
c
U U
, L c R
e oL c Rl
hi k
njm
D D
A forma (shape) default dos objetos ´ [].
e
O X -pic fornece um conjunto de direcionais, como no exemplo anterior
Y
o **dir{-}. Os direcionais s˜o elementos gr´ficos que podem ser tanto
a a
conectores quanto pontas (que terminam as extremidades de uma conex˜o).
a
Os conceitos apresentados de forma breve nesta se¸ao ser˜o melhor de-
c˜ a
senvolvidos nas pr´ximas se¸oes. Particularmente a se¸ao seguinte tratar´
o c˜ c˜ a
dos recursos do kernel do X -pic, e mostrar´ por meio de exemplos o uso de
Y a
posi¸oes, objetos e conex˜es.
c˜ o
3 Usando o Kernel do X -pic
Y
Nesta se¸ao mostraremos o uso do kernel do X -pic por meio de exemplos
c˜ Y
comentados. Ser˜o introduzidos os recursos b´sicos dispon´
a a ıveis no kernel, e
nas se¸oes seguintes ser˜o explorados aspectos mais avan¸ados.
c˜ a c
A coisa mais simples que podemos fazer com o X -pic ´ definir duas
Y e
posi¸oes e conecta-las. Isto ´ mostrado no exemplo seguinte, onde ´ pro-
c˜ e e
duzida uma linha simples conectando as posi¸˜es (0, 0) e (10, 0):
co
xy
(0,0)*{};(10,0)*{} **dir{-}
endxy
Podemos tamb´m “largar” objetos nas posi¸˜es. Isto ´ feito neste outro
e co e
exemplo, em que definimos dois objetos com r´tulos A e B, e tra¸amos uma
o c
linha na diagonal ligando estes dois r´tulos:
o
4
5. xy B
(0,0)*+{A};(10,10)*+{B} **dir{-}
endxy A
O operador * ´ usado para definir posi¸oes e “largar” objetos, e o operador
e c˜
** ´ usado para definir conex˜es.
e o
Neste ultimo exemplo, observa-se o modificador + usado em (0,0)*+{A} e
´
(10,10)*+{B}. Este modificador serve para obter espa¸o adicional em torno
c
do objeto, evitando que o conector fique muito pr´ximo ao objeto, como seria
o
o caso de:
xy B
(0,0)*{A};(10,10)*{B} **dir{-}
endxy A
Podemos usar qualquer objeto como conector, como vemos no exemplo a
seguir:
xy cB
(0,0)*+{A};(10,10)*+{B} **dir{} cc
cc
endxy A
Podemos definir trˆs posi¸˜es em seq¨ˆncia e conecta-las. Como se expli-
e co ue
cou na se¸˜o anterior, o direcional **dir{-} conecta as posi¸˜es p e c do
ca co
estado do X -pic. O operador ; ´ usado para mudar o estado, trocando as
Y e
posi¸oes p e c e atualizando a c. Mostramos isso no seguinte exemplo:
c˜
xy
(0,0)*{};(10,0)*{} **dir{-};
(10,10)*{} **dir{-}
endxy
Neste exemplo, a sequˆncia de mudan¸as de estado e a¸˜es do X -pic,
e c co Y
associada aos comandos que as executam, ´ apresentada na Tabela 1.
e
Textos podem ser postos em uma X -figura usando o comando txt:
Y
xy B
(5,5)*{A};(15,15)*{B} **dir{-};
(0,0)*{txt{texto qualquer}} A
endxy texto qualquer
5
6. A¸˜o
ca Comando
1 c ← (0, 0) (0,0)*{}
2 p←c ;
3 c ← (10, 0) (10,0)*{}
4 tra¸a linha entre (0, 0) e (10, 0)
c **dir{-}
5 p←c ;
6 c ← (10, 10) (10,10)*{}
7 tra¸a linha entre (10, 0) e (10, 10)
c **dir{-}
Tabela 1: Exemplo de execu¸˜o do X -pic
ca Y
Este novo exemplo mostra o uso de conex˜es com pontas:
o
xy B
c
(0,0)*+{A};(10,10)*+{B} **dir{-} ?* dir{}
endxy A
Direcionais podem ser do tipo conectores ou pontas. No exemplo dado,
**dir{-} ´ um direcional conector, e dir{} ´ um direcional ponta.
e e
O ?* serve para indicar a posi¸ao da ponta no conector. O operador ?
c˜
serve para “pegar” o lugar da conex˜o mais recente definida por um **. O
a
modificador move posi¸oes, neste caso para o extremo final da conex˜o.
c˜ a
Poder´ıamos posicionar a ponta no outro extremo do conector usando ?*:
xy B
(0,0)*+{A};(10,10)*+{B} **dir{-} ?* dir{} c
endxy A
Para melhorar o exemplo anterior poder´
ıamos usar espa¸o adicional em
c
torno dos objetos:
xy B
(0,0)*++{A};(10,10)*++{B} **dir{-} ?* dir{}
c
endxy A
Cada modificador + dobra o valor do espa¸o em torno de um objeto.
c
Assim, ao usar, por exemplo, (0,0)*++{A} estamos introduzindo um espa¸o
c
6
7.
dir{-} dir2{-}
dir3{-}
dir{.} dir2{.} dir3{.}
? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?
dir{~} dir2{~} dir3{~}
dir{--} dir2{--}
dir3{--}
? ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ? ?
dir{~~} dir2{~~} dir3{~~}
Figura 1: Direcionais (conectores)
4 vezes maior.
Agora podemos inverter a ponta, como fazemos no exemplo seguinte:
xy B
(0,0)*+{A};(10,10)*+{B} **dir{-} ?* dir{}
endxy A
As Figuras 1 e 2 apresentam os direcionais (conectores e pontas). Observe-
se o recurso de fazer o conector duplo ou triplo por meio de dir2 e dir3,
e as varia¸oes de pontas usando-se dir^ ou dir_.
c˜
Podemos produzir setas com o X -pic. Para isto usamos o comando ar:
Y
xy B
c
{ar (0,0)*+{A}; (10,10)*+{B}}
endxy A
A Figura 3 apresenta as setas que podem ser usadas em uma X -figura.
Y
Devemos observar que ar@{=} e ar@{:} s˜o abreviaturas de ar@2{-}
a
e ar@2{.}.
Podemos curvar uma seta, como por exemplo em:
xy HB
{ar@/^1pc/ (0,0)*+{A}; (10,10)*+{B}}
endxy A
7
8. c c c
dir{} dir^{} dir_{}
dir{} c dir^{} c dir_{} c
dir{|} / dir^{|} / dir_{|} /
dir{(} oO dir^{(} oO dir_{(} oO
dir{)} dir^{)} / dir_{)}
dir^{‘} O dir_{‘} o
dir^{’} dir_{’}
cc cc cc
dir{} dir^{} dir_{}
dir{} c dir^{}
c c
c dir_{} c
c
dir{||} c dir^{||}
c dir_{||} c
dir{|-} c dir^{|-} dir_{|-}
c cc
c c
dir{|} c dir{|}
dir{|}
• ◦
dir{|} c dir{*} •1 dir{o} H
dir{+} HH dir{x} dir{/}
dir{//}
Figura 2: Direcionais (pontas)
8
10. O /^1pc/ ´ um vetor, normalmente usado para denotar um deslocamento,
e
e que neste caso ´ usado para especificar a curvatura da seta. A curvatura
e
especificada no exemplo ´ de 1pc=12pt (pontos). Outras unidades de medida
e
usadas pelo TEX s˜o ex (correspondendo ` altura da letra “x”), mm, cm e
a a
in (polegadas). O ^ indica a dire¸ao da curvatura (para cima).
c˜
Poder´
ıamos curvar a seta para baixo, como em:
xy Bx
{ar@/_1pc/ (0,0)*+{A}; (10,10)*+{B}}
endxy A
X -pic fornece a facilidade de r´tulos para indicar posi¸oes. Assim, com
Y o c˜
(0,0)*{}=A podemos criar o r´tulo A para indicar a posi¸˜o (0, 0). No
o ca
seguinte exemplo definimos trˆs r´tulos para indicar posi¸oes dos v´rtices do
e o c˜ e
triˆngulo que ser´ tra¸ado:
a a c
xy
(0,0)*{}=A; (10,0)*{}=B; (10,10)*{}=C;
A;B **dir{-};
A;C **dir{-};
B;C **dir{-};
endxy
A opera¸˜o !{pos1,pos2} permite encontrar o ponto em que a ultima
ca ´
conex˜o intercepta uma linha definida pelas posi¸˜es pos1 e pos2. Por exem-
a co
plo:
xy B
(0,5)*{1}=1; (17,15)*{2}=2 **dir{.}; 2
•
(6,0)*{A}=A; (13,18)*{B}=B **dir{-}
?!{1;2} *{bullet} 1
endxy A
No comando ?!{1;2} *{bullet}, o operador ? “pega” a posi¸ao c˜
da ultima conex˜o definida (neste caso a que liga as posi¸oes A e B),
´ a c˜
e a seguir a opera¸˜o !{1;2} encontra o ponto de intercepta¸ao desta
ca c˜
conex˜o com a linha que liga as posi¸˜es 1 e 2. Ent˜o ´ posto um •
a co a e
(“bullet”) no ponto de intercepta¸ao.
c˜
Podemos definir diagramas aninhados, ou seja, diagramas dentro de ou-
tros diagramas. Para isto basta usar um diagrama como se fosse um objeto
10
11. ou um direcional. Neste exemplo ilustramos o uso deste recurso:
xy
(0,0)*++{
xy
(0,0)*+{A}; (0,10)*+{B} **dir{-} ?* dir{}
endxy
}=x; By B
(20,0)*++{ CQ
xy A A
(0,0)*+{A}; (0,10)*+{B} **dir{-} ?* dir{}
endxy
}=y;
{ar@{=} x;y};
endxy
Observe que
xy
(0,0)*+{A}; (0,10)*+{B} **dir{-} ?* dir{}
endxy
´ atribuido a x e usado como objeto posicionado em (0, 0) e
e
xy
(0,0)*+{A}; (0,10)*+{B} **dir{-} ?* dir{}
endxy
´ atribuido a y e usado como objeto posicionado em (20, 0). Ambos os
e
objetos s˜o conectados pela seta dupla definida por {ar@{=} x;y}.
a
Podemos usar macros TEX em X -figuras. Por exemplo:
Y
defgrafo{xy (0,10)*+{A}; (0,0)*+{B} **dir{-}
?* dir{} endxy} A A
xy CQ
{ar@{=} (0,0)*{grafo};(15,0)*{grafo}} B B
endxy
Neste diagrama,
defgrafo{xy (0,10)*+{A}; (0,0)*+{B} **dir{-}
?* dir{} endxy}
11
12. define uma macro TEX, referenciada como grafo, que ´ usada duas vezes
e
aninhada no diagrama.
4 Extens˜es
o
Nesta se¸˜o s˜o descritas algumas extens˜es ao kernel do X -pic. Apre-
ca a o Y
sentaremos curvas, c´
ırculos, frames e importa¸ao de gr´ficos externos.
c˜ a
Usando-se o comando crv podemos criar curvas com m´ltiplos pontos
u
tangentes:
xy
(0,0)*{}=A;
(10,0)*{}=B;
A; B **crv{(5,5)};
endxy
Neste exemplo, a curva foi definida tendo apenas um ponto tangente, o
(5, 5).
Podemos definir curvas com mais pontos tangentes:
xy
(0,0)*{}=A;
(25,0)*{}=B;
A; B **crv{(5,-17) (12,8)};
endxy
Uma facilidade para desenvolver curvas ´ tornar os pontos tangentes
e
vis´
ıveis. Para isto usa-se ~pC:
c
xy
(0,0)*{}=A;
(25,0)*{}=B;
A; B **crv~pC{(5,-17) (12,8)};
endxy c
Para produzir c´
ırculos usamos o comando cir. O tamanho default do
c´
ırculo ´ o tamanho do objeto que ele envolver´. Este exemplo ilustra isto:
e a
12
13. xy
(0,0)*+{A}; (10,0)*+{B}*cir{} **dir{-} A 0123
7654
B
endxy
Podemos especificar um raio para o c´ ırculo. Por exemplo, se o c´ ırculo
deve ter 20pt de raio, usamos cir20pt{}.
Segmentos de c´ ırculo podem ser obtidos especificando-se as dire¸oes dos
c˜
vetores tangentes e um giro em sentido hor´rio (usando _) ou sentido anti-
a
hor´rio (usando ^). As dire¸oes que podem ser especificadas s˜o:
a c˜ a
u ur = ru
y
ul = •cc
lu c
c
ccc
lo GABD
@FEC
c
Gr
cc
cc
c1
dl = ld d dr = rd
Exemplos de segmentos de c´
ırculo:
xy *cir5pt{l^r} endxy '!
xy *cir5pt{dl_u} endxy !
xy *cir5pt{dr^ur} endxy !
xy *cir5pt{dr_ur} endxy '!#$
xy *cir5pt{ur^dr} endxy '%#$
Se s˜o dadas a mesma diagonal duas vezes, ent˜o nada ´ produzido, como
a a e
em xy *cir5pt{d^d} endxy, que produz “ ”.
No pr´ximo exemplo produziremos um “smile” usando c´
o ırculo, vetores, e
os operadores ?, _ e !:
xy
(0,0)*{};(4,0)*{} **dir{} ? *_!/3pt/dir{)} '!$#
? %
*_!/7pt/dir{:}; (2,2)*cir5pt{};
endxy
O operador ?, que j´ explicamos anteriormente, serve para “pegar” a
a
posi¸ao da ultima conex˜o. O operador _ serve para girar um objeto 90o
c˜ ´ a
em sentido hor´rio (para o sentido anti-hor´rio usar´
a a ıamos o operador ^). O
operador ! serve para tornar a dire¸˜o obl´
ca ıqua ao direcional usado (skew ).
Finalmente, os vetores /3pt/ e /7pt/ servem para deslocar os objetos “)” e
“:” sobre a dire¸ao.
c˜
13
14. Vamos explicar passo a passo a constru¸ao do smile do nosso exemplo.
c˜
Em primeiro lugar, usamos o operador ? para “pegar” a posi¸˜o do dire-
ca
cional “vazio” (dummy) que conecta (0, 0) e (4, 0). Sobre esta dire¸˜o ser´
ca a
posto o “)”. Ilustramos isto, mostrando o direcional vazio como uma linha
pontilhada para melhor visualiza¸ao:
c˜
)
Para produzirmos a boca do smile devemos girar o “)” em um ˆngulo de
a
90o em sentido hor´rio, e para isto usamos o operador _, resultando em:
a
?
Usamos o operador ! para indicar a dire¸ao obl´
c˜ ıqua ao direcional (para
que possamos depois deslocar). Ilustramos com uma seta pontilhada esta
nova dire¸˜o:
ca y
?
As mesmas opera¸˜es s˜o feitas sobre o “:”, que formar´ os olhos do
co a a
smile.
Finalmente, deslocamos o “)” e o “:” na nova dire¸˜o, usando os vetores
ca
/3pt/ e /7pt/, respectivamente:
?
O c´
ırculo foi usado como “toque final” para completar o smile.
Poder´ıamos tamb´m desenhar um smile usando um segmento de c´
e ırculo,
como em:
xy
(0,0)*{};(4,0)*{} **dir{} ? *_!/7pt/dir{:};
(2,2)*cir5pt{}; '!$#
%
(2,2)*cir3pt{dr^ur};
endxy
Observe que a boca, tendo sido feita com um segmento de c´ ırculo, resultou
em um smile um pouco diferente ao do exemplo anterior.
Frames s˜o molduras que podem ser postas em X -figuras. Uma moldura
a Y
(frame) ´ um objeto X -pic na forma frm{ ... }. Na Figura 4 s˜o mostra-
e Y a
dos alguns tipos de molduras dispon´ ıveis (para mais veja o X -pic Reference
Y
Manual ).
14
15. Usando Usando Usando
frm{} frm{.} frm44pt{.}
Usando ? Usando = HI Usando ML
ON JK
frm{-} 89 :;
frm8pt{-} frm44pt{-}
1• • • • • 1 • • •
Usando 1 • • • • • • c
•
Usando 1
1 1 11 Usando 11
1frm{--}1 frm{o-}
• • • c
frm44pt{--}
• • • • • • • • • • •
•
Usando Usando Usando
frm{,} frm5pt{,} frm{-,}
Usando
`abc
gfed Usando
?=
89:; Usando
frm{o} frm8pt{o} frm{.o}
r • vP
Usando Usando
Usando1
1
_^]
XYZ[ PQRS
WVUT
ONML
HIJK
frm{ee} frm20pt,8pt{ee} P
frm{-e}
v • r
Figura 4: Molduras (frames)
Podemos agora, usando curvas e molduras (frames), construir o seguinte
diagrama:
xy
Quadrado
(0,0)*++{txt{Redondo}}*frm{oo}=r; b
(30,30)*++{txt{Quadrado}}*frm{-,}=q;
r;q **dir{} ? *++{txt{Liga}}*frm{.}=l;
Liga
r;l **crv{(15,0)};
l;q **crv{(15,30)} ?* dir{};
endxy wvut
pqrs
hijk
onml
Redondo
Observe neste exemplo como o Liga ´ posicionado usando-se o operador
e
? para obter a posi¸ao da liga¸˜o entre r e q.
c˜ ca
Para importar imagens postscript devemos declarar a op¸˜o import na
ca
declara¸ao usepackage[all,import]{xy}. Podemos usar qualquer pacote
c˜
para importar a imagem, como por exemplo, graphicx, graphics, epsf ou
epsfig. Neste caso, usamos o graphicx, e para isto devemos declarar o uso
15
16. do pacote com o comando usepackage{graphicx}.
Usamos xyimport para estabelecer um sistema de coordenadas para uma
imagem em particular, permitindo que qualquer comando do X -pic seja usa-
Y
do, com as posi¸oes relativas ao sistema de coordenadas definido. Para isto, o
c˜
comando xyimport(larg,alt){imagem} exige que se defina uma largura e
uma altura, que fornece uma distˆncia em unidades de coordenadas, iniciando
a
no canto inferior esquerdo, onde o sistema de coordenadas usualmente deve
estar localizado.
Assim, usando a imagem apresentada na Figura 5, podemos produzir o
que se pode ver na Figura 6, usando o seguinte c´digo:
o
defgrafico{includegraphics[width=9cm]{grafico.eps}}
xy
xyimport(100,100){grafico}
{ar (75,85)*+{txt{Astr´ide}}; (60,75)*{}}
o
{ar (75,25)*+{txt{Elipse}}; (80,37)*{}}
endxy
Observe-se que
defgrafico{includegraphics[width=9cm]{grafico.eps}}
´ uma macro TEX para definir a imagem a ser importada.
e
5 Usando Pol´
ıgonos e Elipses
Para usar pol´
ıgonos em diagramas ´ necess´rio carregar o X -pic decla-
e a Y
rando a op¸˜o poly, usando o comando usepackage[all,poly]{xy}.
ca
Pol´
ıgonos podem ser produzidos usando-se o comando xypolygon. Por
exemplo, podemos criar um hex´gono usando:
a
◦ I
◦II
II
II
II
xy I
I
◦II ◦
/r4pc/:{xypolygon6{circ}}
II
endxy II
II
I
◦ ◦
Observe-se que /r4pc/ especifica o tamanho do pol´ ıgono em 4pc (48pt).
O n´mero de lados do pol´
u ıgono ´ declarado por meio de um valor inteiro ap´s
e o
16
18. o comando xypolygon. Assim, especificamos o hex´gono com xypolygon6.
a
Al´m disto, o argumento circ indica que os v´rtices do pol´
e e ıgono dever˜o
a
ser c´ırculos.
Alguns outros exemplos de pol´
ıgonos s˜o:
a
xy /r8mm/: c
II ◦c I
, 0 ,{xypolygon6{}} II ◦
cc • •I
II
I
◦ ◦ I
,+/r18mm/,{xypolygon8{@{o}}} I
I
I
•I ◦ •
II c
◦c ◦ II
I
,+/r18mm/,{*@{o}xypolygon6{@{*}}} I c
c
◦
◦
•
•
endxy
Nestes exemplos, 0 (origem) e +/r18mm/ (deslocamento) especificam o
posicionamento dos trˆs pol´
e ıgonos, e os @{o} e @{*} especificam os v´rtices.
e
Mais exemplos:
xy /r8mm/:
, 0 ,{xypolygon6{~*{dir{*}}}}
• •I • •II
II •
,+/r18mm/, II •
I
• III
III
I
I
{xypolygon8{~{.}~{}~={45}{dir{*}}}} •I
II
•• ••
III
•
I • IIII
,+/r18mm/, • •
• I•
•
•
{xypolygon6{~{=}~{:}{dir{*}}}}
endxy
Neste exemplo, observamos o uso de ~, ~ e ~= para indicar conex˜es o
entre os v´rtices do pol´
e ıgono.
Para produzir elipses usamos xycircle. Assim, (0,0)*xycircle(7,2){.}
produz uma elipse centrada em (0, 0), com largura 7 e altura 2, e pontilhada:
6 Produzindo Diagramas em Matriz
O X -pic oferece uma facilidade (feature) para tipografar diagramas em
Y
forma de matriz. Este tipo de diagrama tem aplica¸ao em diversas ´reas da
c˜ a
matem´tica e de ciˆncia da computa¸ao, como por exemplo em teoria dos
a e c˜
autˆmatos e teoria das categorias. Para produzir um diagrama deste tipo
o
usamos o comando xymatrix{ ... }.
O diagrama ser´ formado pelas entradas de uma matriz, organizadas
a
em linhas e colunas. Cada entrada pode conter uma express˜o matem´tica
a a
(produzida usando o modo matem´tico).
a
18
19. Usa-se para separar as colunas e para indicar nova linha, em uma
nota¸ao semelhante ao ambiente array do modo matem´tico do L TEX. As-
c˜ a A
sim, se desejamos produzir uma matriz com duas linhas e duas colunas,
usamos:
xymatrix{ 1 2
1 2
3 4
} 3 4
Poder´ıamos omitir entradas ` direita que n˜o fossem necess´rias no dia-
a a a
grama, como em:
xymatrix{ 1 2
1 2
3
} 3
Tamb´m podemos deixar entradas em branco na matriz, como em:
e
xymatrix{ 1 2
1 2
4
} 4
Para conectar entradas por setas usamos ar. O destino da seta ´ defi-
e
nido de forma relativa ` origem por meio de uma seq¨ˆncia de u (acima), d
a ue
(abaixo), l (esquerda) e r (direita), colocados entre colchetes. Assim, para
conectar a entrada da primeira linha e coluna com a da segunda linha e
coluna usamos ar[dr]:
xymatrix{ 1 aa 2
1 ar[dr] 2 aa
aa
3 4 a0
} 3 4
As setas da Figura 3 funcionar˜o tamb´m com o xymatrix:
a e
19
20. xymatrix{
•d CQ •
{bullet} ar@{:}[r] ar@{--}[dr] {bullet} d
ar@{=}[d] d
d1
{bullet} ar@{-}[u] ar@{.}[r] {bullet} • G•
}
Este ´ um exemplo com uma matriz trˆs por trˆs:
e e e
√
xymatrix{ 2×4
i 2 22
ii }}
ii }}
2times 4 ar[ddrr] sqrt{2} ar[ddl] ii }
i
i }}
2^2 ar[dl] iii ~}
2 4ii 6
2 4 6 ii
ii
ii
1.414 2.7 8 Ô i4
} 1.414 2.7 8
Observe que a seta que liga 2 × 4 e 8 passa sobre o 4, o que pode ser
inconveniente. Para evitar isto podemos curvar a seta para cima, usando
“@/^/”, ou para baixo, usando “@/_/”. Neste caso, curvaremos para baixo:
√
xymatrix{ 2×4 2 22
}}
2times 4 ar@/_/[ddrr] sqrt{2} ar[ddl] }}
}}
2^2 ar[dl] ~}}
2 4 6
2 4 6
1.414 2.7 8
Ô 8
} 1.414 2.7 8
Para uma curvatura maior poderiamos usar, por exemplo, @/_1pc/.
Podemos colocar um r´tulo acima (ou abaixo) de uma seta. Para isto
o
basta usar “^” (ou “_”). Neste exemplo mostramos isto:
xymatrix{ Ad
dd
A ar[dr]^{a} dd
a
dd
B C 1
} B C
Observe que “acima” pode n˜o significar exatamente acima da seta, se a
a
seta est´ voltada para a esquerda:
a
20
21. xymatrix{ A B
A Bar[dl]^{a} ~~
~~
~a
C ~~
} C
Tamb´m podemos posicionar o r´tulo da seta sobre a seta, ou no “meio”,
e o
usando |:
xymatrix{ GB
Aar[r]|a B A a
}
O “|” pode ser util para fazer “buracos” nas setas (por exemplo, para
´
passar outras setas sem que se cruzem). Para isto usamos hole:
xymatrix{ GB
Aar[r]|hole B A
}
O seguinte diagrama ´ a defini¸ao de produto fibrado em teoria das ca-
e c˜
tegorias. Nele usamos v´rios dos recursos do xymatrix j´ apresentados:
a a
xymatrix{ d ii
ii k
dar@/_/[ddr]_har[dr]|{h,k_a}
i
h,ka
i i4
ar@/^/[drr]^k 6G
{btimes_a c}ar[d]^par[r]_q b ×a c q c
h
car[d]^g p g
bar[r]^f a 0 f
b Ga
}
O comando xymatrix permite especificar a forma com que o diagrama
ser´ tipografado. A especifica¸ao ´ uma seq¨ˆncia de @especifica¸ao
a c˜ e ue c~
que antecedem os comandos dentro do xymatrix. Assim, por exemplo,
xymatrix@1{ ... } especifica que o diagrama deve ser tipografado em uma
linha, como em xymatrix@1{Aar[r]^f B}, que produz A f G B . Isto
´ util para produzir pequenos diagramas que aparecer˜o dentro do par´grafo
e´ a a
do texto.
Da mesma forma podemos modificar o espa¸amento das linhas e das co-
c
lunas por meio das especifica¸˜es @Rdim e/ou @Cdim, como por exemplo
co
21
22. em xymatrix@R10pt@C5pt{ ... }, que especifica 10pt para o espa¸amento
c
das linhas e 5pt para o das colunas.
Podemos explicitamente posicionar o r´tulo sobre a seta:
o
f
xymatrix{Aar[r]^{f} B} A GB
f
xymatrix{Aar[r]^{f} B} A GB
f
xymatrix{Aar[r]^(.4){f} B} A GB
Observe-se que, no ultimo caso, podemos usar um valor entre 0 e 1 como
´
fator para posicionar o r´tulo (foi usado 0,4 como exemplo). O fator 0 re-
o
presenta o in´ da seta, e o fator 1 representa o fim.
ıcio
Finalmente, outra possibilidade ´ usar !{t1;t2}, que posiciona o r´tulo
e o
no ponto em que a seta cruza a linha que liga os lugares t1 e t2:
xymatrix{ f
G
Ad nnU B
A ar[rr]^f ar[dr]_(.3)g |!{[d];[rr]}hole dd nnn
g d d nnnn h
B n
nnn 2
nn G
C ar[rru]_(.7)h ar[r]_i D C D
i
}
Neste ultimo exemplo, o !{[d];[rr]} determina o ponto em que a seta
´
que liga A e D se cruza com a que liga C e B. Neste ponto ´ posto o hole.
e
Podemos indicar a posi¸˜o que a seta deve entrar ou sair de uma entrada
ca
usando as seguintes dire¸oes, que j´ haviam sido mostradas, e repetimos aqui
c˜ a
para facilitar:
u
lu y ur c = ru
ul = •c
c
cc
cc
lo GABD
@FEC
c
Gr
cc
cc
c1
dl = ld d dr = rd
Isto nos permite fazer uma seta “reflexiva”, especificando a seta usando
o comando ar@(sa´da,entrada)[]. O [] indica que a seta apontar´ para
ı a
a pr´pria entrada, e a especifica¸ao @(sa´da,entrada) define as dire¸oes de
o c˜ ı c˜
sa´ e entrada da seta. Assim,
ıda
22
23. [F] Simples [F=] Duplo
1• • • • • • 1
[F.] Pontilhado [F--] 1 Tracejado 1
• • • • • •
[F-,] [F-:3pt]
Sombra Arredondado
[o][F-] XYZ[
_^]
Redondo
Figura 7: Frames em diagramas em matriz
xymatrix{ id id
1 ar@(ul,ur)[]^{id} ar[r]_f Ö Ö
1 G2
2 ar@(ul,ur)[]^{id} f
}
Podemos produzir setas paralelas, usando uma dimens˜o para separa-las,
a
definida por @dim:
xymatrix{ a
. G
Aar@1ex[r]^a_{.} Bar@1ex[l]^b Ao B
b
}
A dimens˜o de 1ex, adotada neste caso, ´ conveniente pois corresponde `
a e a
altura da letra “x”.
Os recursos de frames (molduras) que podem ser usados nos objetos do
diagrama s˜o apresentados na Figura 7. Os modificadores + e - podem ser
a
usados para aumentar ou diminuir o tamanho da moldura.
Um exemplo usando frames ´:e
xymatrix{ +∞
f (x)dx
−∞ uu
*+[F-,]{int_{-infty}^{+infty} uu
uu
f(x)mathrm{d}x } ar[dr] uu
uu
*+[o][F-]{txt{pi}} 10 7
89:;
?=
pi 10
}
O exemplo a seguir ´ um diagrama que representa um autˆmato finito:
e o
23
24. 1
89:;
?= 1 G ?=
89:;
7654
0123
1 d3
xymatrix{ ÐÐÐ
0 Ð ÐÐ
*++[o][F-]{1} ar@(ul,ul)[] ar[r]^{1} ÐÐÐ 1
ar[d]^{0} *++[o][F=]{3} 89:;
?=
2v
*++[o][F-]{2} ar[ur]_{1} ar@(dl,d)[]_{0}}
0
Outro exemplo:
xymatrix{ evapora¸ao
c˜
{txt{Oceano}}
ar@/^3pc/[rr]^{txt{evapora¸ao}}
c~ 1
*+[F-]{H_2O} Oceano
• H2 O Atmosfera
{txt{Atmosfera}}
ar@/^3pc/[ll]^{txt{precipita¸ao}}
c~
} precipita¸ao
c˜
Ainda ´ poss´
e ıvel colocar entradas extras, que estar˜o fora da matriz,
a
usando o comando save ... restore. Neste caso, o que fica dentro do
comando n˜o far´ parte de nenhuma entrada da matriz:
a a
xymatrix{
A ar@{-}[dr]
save[]+3cm,0cm*txt8pc{ Este ´ um longo
e
Este ´ um longo coment´rio que
e a coment´rio que
a
n~o ocupar´ nenhuma entrada
a a o
Ad n˜o ocupar´
a a
dd
da matriz} dd nenhuma entrada
dd m
mmm da matriz
ar[l]ar[d] vmmm
restore B C
Bar@{-}[r] C
}
Observe-se que a seta ar[d], que parte do coment´rio, n˜o necessaria-
a a
mente ´ “para baixo”.
e
24
25. Referˆncias
e
[1] Rose, K. H. X -pic User’s Guide. Dispon´
Y ıvel em: http://tug.org/
applications/Xy-pic/soft/xyguide.ps.gz.
[2] Rose, K. H. Moore, R. X -pic Reference Manual. Dispon´ em: http:
Y ıvel
//tug.org/applications/Xy-pic/soft/xyrefer.ps.gz.
[3] Goossens, M. Rahtz, S. Mittelbach, F. The LTEX Graphics Compa-
A
nion, Addison-Wesley, 1997.
25
26. Copyright c 2006 Carlos A. P. Campani.
´
E garantida a permiss˜o para copiar, distribuir e/ou modificar este do-
a
cumento sob os termos da Licen¸a de Documenta¸ao Livre GNU (GNU Free
c c˜
Documentation License), Vers˜o 1.2 ou qualquer vers˜o posterior publicada
a a
pela Free Software Foundation; sem Se¸˜es Invariantes, Textos de Capa Fron-
co
tal, e sem Textos de Quarta Capa. Uma c´pia da licen¸a ´ inclu´ na se¸ao
o c e ıda c˜
intitulada “GNU Free Documentation License”.
veja: http://www.ic.unicamp.br/~norton/fdl.html.
26