Saltar al contenido

Creación de macros para diagramas conmutativos comunes en tikz

Solución:

Deberá reemplazar los símbolos de unión en la matriz TikZ usando la clave ampersand replacement=<macro>, dónde <macro> puede ser &, por ejemplo.

Aquí está su código como comando. Usé el enfoque descrito en PGF / TikZ: ¿Cómo almacenar cadenas en una matriz? para usar una lista en lugar de argumentos separados para las etiquetas. Tu diagrama

luego se puede crear usando

monoid{
    (Aotimes A)otimes A,
    Aotimes (Aotimes A),
    Aotimes A,
    Aotimes A,
    A,
    $muotimes Id$,
    $mu$,
    $ Idotimesmu$,
    $ mu$,
    $alpha$
}

Aquí está el código completo:

documentclass{article}
usepackage{tikz}
usetikzlibrary{matrix,arrows}

usepackage{xparse}
usepackage{etoolbox}
newcounter{listtotal}newcounter{listcntr}%
NewDocumentCommand{argument}{o}{%
  setcounter{listtotal}{0}setcounter{listcntr}{-1}%
  renewcommand*{do}[1]{stepcounter{listtotal}}%
  expandafterdocsvlistexpandafter{argumentarray}%
  IfNoValueTF{#1}
    {namesarray}% names
    {% names[<index>]
     renewcommand*{do}[1]{stepcounter{listcntr}ifnumvalue{listcntr}=#1relax##1fi}%
     expandafterdocsvlistexpandafter{argumentarray}}%
}

newcommand{monoid}[1]{
defargumentarray{#1}
begin{tikzpicture}[baseline=(current bounding box.center)]
    matrix(m)[
        matrix of math nodes,
        ampersand replacement=&,
        row sep=2.6em,
        column sep=2.8em,
        text height=2ex,
        text depth=0.5ex
    ]
    {
    argument[0]    &              & argument[1]\
    argument[2]    &              & argument[3]\
                    & argument[4] & \
    };
path[->,font=normalsize,>=angle 90]
(m-1-1) edge node[auto] {argument[5]} (m-2-1)
(m-2-1) edge node[auto] {argument[6]} (m-3-2)
(m-1-3) edge node[auto] {argument[8]} (m-2-3)
(m-2-3) edge node[auto] {argument[9]} (m-3-2);
path[<->, font=normalsize,>=angle 90]
(m-1-1) edge node[auto] {argument[10]} (m-1-3);
end{tikzpicture}
}
begin{document}
monoid{
    (Aotimes A)otimes A,
    Aotimes (Aotimes A),
    Aotimes A,
    Aotimes A,
    A,
    $muotimes Id$,
    $mu$,
    $ Idotimesmu$,
    $ mu$,
    $alpha$
}

end{document}

Otro enfoque:

  • Usar tikz-cd para la construcción simple de diagramas conmutativos
  • Utilizar el arrayjobx paquete para los elementos

Beneficios:

  • Código de diagrama más corto, flechas directamente dentro de los elementos
  • En lugar de escribir 9 parámetros cada vez que llama monoid, puede modificar solo argumentos de matriz específicos si los diagramas son similares, como por monoidelements(1)={A'otimes A'} y llamando monoid de nuevo
documentclass{article}
usepackage{arrayjobx}
newarray{monoidelements}

usepackage{tikz-cd}
newcommand{monoid}[1]{
  begin{tikzcd}[->,font=normalsize,>=angle 90,ampersand replacement=&]
  #1(1) arrow{d}{#1(6)} arrow[<->]{rr}{alpha}& & #1(2) arrow{d}{#1(7)}\
  #1(3) arrow{dr}{#1(8)} & & #1(4)arrow{dl}{#1(9)}\
   & #1(5) &
  end{tikzcd}}

begin{document}
readarray{monoidelements}{(Aotimes A)otimes Aotimes A&Aotimes (Aotimes A)
  &Aotimes A&Aotimes A&A&muotimes Id&Idotimesmu&mu&muotimes Id}
monoid{monoidelements}
end{document}

Monoide

Una respuesta que es demasiado larga para ser un comentario, ya que es solo una reescritura de la respuesta de Jake usando una sintaxis más corta basada en expl3:

documentclass{article}
usepackage{tikz}
usetikzlibrary{matrix,arrows}

usepackage{xparse}
ExplSyntaxOn
seq_new:N l_jake_monoid_seq
NewDocumentCommand{monoid}{m}
 {
  seq_set_split:Nnn l_jake_monoid_seq { , } { #1 }
  domonoid
 }
NewDocumentCommand{argument}{o}
 {
  IfNoValueTF{#1}
   { seq_use:N l_jake_monoid_seq }
   { seq_item:Nn l_jake_monoid_seq { #1 } }
 }
ExplSyntaxOff
NewDocumentCommand{domonoid}{}
 {
  begin{tikzpicture}[baseline=(current bounding box.center)]
    matrix(m)[
        matrix of math nodes,
        ampersand replacement=&,
        row sep=2.6em,
        column sep=2.8em,
        text height=2ex,
        text depth=0.5ex
    ]
    {
    argument[0]    &              & argument[1]\
    argument[2]    &              & argument[3]\
                    & argument[4] & \
    };
  path[->,font=normalsize,>=angle 90]
  (m-1-1) edge node[auto] {argument[5]} (m-2-1)
  (m-2-1) edge node[auto] {argument[6]} (m-3-2)
  (m-1-3) edge node[auto] {argument[8]} (m-2-3)
  (m-2-3) edge node[auto] {argument[9]} (m-3-2);
  path[<->, font=normalsize,>=angle 90]
  (m-1-1) edge node[auto] {argument[10]} (m-1-3);
  end{tikzpicture}
 }
begin{document}
monoid{
    (Aotimes A)otimes A,
    Aotimes (Aotimes A),
    Aotimes A,
    Aotimes A,
    A,
    $muotimes mathit{Id}$,
    $mu$,
    $ mathit{Id}otimesmu$,
    $ mu$,
    $alpha$
}

end{document}

los monoid macro hace dos cosas: establece una secuencia de su argumento y llama domonoid que es idéntica a la de Jake monoid. Darse cuenta de domonoid debe ser definido con ExplSyntaxOff, porque los espacios en las claves TikZ son significativos.

La definición de argument es mucho más fácil que con etoolbox.

Nota: para obtener una mejor forma de Identificación, es mejor usar mathit{Id}.


Podemos usar ideas similares también para la respuesta de Stefan Kottwitz

documentclass{article}
usepackage{xparse}
usepackage{tikz-cd}
NewDocumentCommand{monoid}{m}
 {
  makeargument{#1}    
  begin{tikzcd}[->,font=normalsize,>=angle 90,ampersand replacement=&]
  argument{0} arrow{d}{argument{5}} arrow[<->]{rr}{alpha}& & argument{1} arrow{d}{argument{6}}\
  argument{2} arrow{dr}{argument{7}} & & argument{3}arrow{dl}{argument{8}}\
   & argument{4} &
  end{tikzcd}
 }
ExplSyntaxOn
seq_new:N l_sk_monoid_seq
cs_new:Npn makeargument #1
 { seq_set_split:Nnn l_sk_monoid_seq { & } { #1 } }
cs_new:Npn argument #1
 { seq_item:Nn l_sk_monoid_seq {#1} }
ExplSyntaxOff

begin{document}
monoid{
  (Aotimes A)otimes Aotimes A &
  Aotimes (Aotimes A) &
  Aotimes A &
  Aotimes A &
  A &
  muotimesmathit{Id} &
  mathit{Id}otimesmu &
  mu &
  muotimesmathit{Id}
}
end{document}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *