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 pormonoidelements(1)={A'otimes A'}
y llamandomonoid
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}
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}