Me gustaría componer una secuencia espectral usando TikZ, como se sugiere enesta publicación, pero las entradas de mi secuencia espectral contienen corchetes y líneas verticales, por ejemplo, [x|...|x]. Si los escribo ingenuamente, todo el nodo aparece en blanco. ¿Cómo puedo evitar este problema?
El código que estoy usando es el siguiente
\documentclass[a4paper,12pt]{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes,
nodes in empty cells,nodes={minimum width=5ex,
minimum height=5ex,outer sep=-5pt},
column sep=1ex,row sep=1ex]{
0 & 0 & 0 & \vdots & \\
0 & [x] & 0 & k & \\
0 & 0 & 0 & \vdots & \\
0 & 0 & 0 & |1| & \\
0 & 0 & [] & 0 & \\
-2 & -1 & 0 & & \\};
\end{tikzpicture}
\end{document}
Devuelve un error al intentar compilar la línea que incluye "|1|", pero no parece molestarle la "[x]", pero no se muestra ninguna en la salida.
Respuesta1
Al usar la clave matrix of math nodes
(o matrix of nodes
), TikZ tiene la intención de interpretar todo lo que está entre los símbolos como el contenido de un nodo. Sin embargo, nosotros (los usuarios) a menudo queremos tener la posibilidad de modificar el estilo de esos nodos caso por caso. En uso normal, esto se hace mediante los parámetros del \node
comando. Además, nos gusta modificar un poco la forma en que la matriz dispone sus nodos. Entonces, lo que hace TikZ es permitirnos especificar estas cosas usando una sintaxis especial que debe aparecer primero en la celda. Se agregan elementos en líneas verticales entre el \node
comando y su contenido. Por lo tanto, puede dibujar un nodo específico escribiendo |[draw]|
y nombrarlo explícitamente escribiendo |(name)|
. Además, el signo comercial es en realidad un comando que puede tomar un argumento opcional y esto se traduce en un espacio adicional entre las filas (si se proporciona en la primera fila).
Por lo tanto, sus corchetes se están consumiendo como saltos de fila (y luego se ignoran porque no están en la primera fila) y sus líneas verticales están ingresando a la maquinaria del comando de nodo. Para proteger cada uno, debe asegurarse de que el primer carácter de la celda no sea especial. Encierre todo el contenido entre llaves o simplemente ponga un {}
delante.
Aquí tenéis ambas versiones:
\documentclass[a4paper,12pt]{article}
%\url{http://tex.stackexchange.com/q/68600/86}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes,
nodes in empty cells,nodes={minimum width=5ex,
minimum height=5ex,outer sep=-5pt},
column sep=1ex,row sep=1ex]{
0 & 0 & 0 & \vdots & \\
0 & {[x]} & 0 & k & \\
0 & 0 & 0 & \vdots & \\
0 & 0 & 0 & {}|1| & \\
0 & 0 & {}[] & 0 & \\
-2 & -1 & 0 & & \\};
\end{tikzpicture}
\end{document}
Por cierto, podrías usar execute at empty cell={\node {0};}
para evitar tener que escribir todos esos ceros:
\documentclass[a4paper,12pt]{article}
%\url{http://tex.stackexchange.com/q/68600/86}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes,
execute at empty cell={\node {0};},nodes={minimum width=5ex,
minimum height=5ex,outer sep=-5pt},
column sep=1ex,row sep=1ex]{
& & & \vdots \\
& {[x]} & & k \\
& & & \vdots \\
& & & {}|1| \\
& & {}[] & \\
-2 & -1 & & {} \\};
\end{tikzpicture}
\end{document}