Re: Difficoltà con tikzmark

#82225
Up
0
Down
::


Per prima cosa ammetto di essere molto contento nel vedere interesse per la macro. 🙂

Passo in breve a spiegare il perché del comportamento “indesiderato”, ma preciso subito che sono dubbioso sull’utilizzo della macro per le matrici proprio per il motivo che Elrond accennava a inizio topic: con la libreria [tt]matrix[/tt] è tutto molto più semplice in quanto automaticamente ogni elemento della matrice ha direttamente la propria label identificativa (esempio http://www.guitex.org/home/it/forum/5-tex-e-latex/66105-risolto-tikz-e-matrici#66105).

Il problema della sovrapposizione deriva dal fatto che usando l’opzione [tt]overlay[/tt], la bounding box della figura non viene aggiornata quando si inseriscono le annotazioni. Questo comporta l’inserimento sopra il testo.

Il problema:

1) prima di tutto alcuni elementi della matrice devono necessariamente essere inseriti nella maniera “classica” altrimenti la matrice viene completamente schiacciata come se non ci fosse alcun elemento. Per fortuna tutta la terza riga non serve per i riferimenti e ho potuto inserire normalmente gli elementi, senza usare \tikzmark, ma mi piacerebbe capire come realizzare una matrice i cui elementi sono solo macro \tikzmark.

deriva dal fatto che la macro serve per identificare qualcosa a prescindere da cosa sia questo qualcosa, per cui sarebbe preferibile non inserire contenuti all’interno del nodo. Facendolo, si è obbligati ad usare un workaround come [tt]\tikzmark{label}{$formula$}[/tt] che poi è proprio la ragione per cui la matrice rimane schiacciata perché suppongo che la definizione di [tt]pmatrix[/tt], ma delle matrici in generale, usi metodi interni per calcolare le dimensioni, cosa che inserendo un nodo di TikZ fa sballare. Invece, con la definizione “tradizionale”: `\newcommand{\tikzmark}[1]{
\tikz[baseline=-\the\dimexpr\fontdimen22\textfont2\relax,remember picture,overlay]\node (#1) {};
}
` è perfettamente possibile scrivere: `
\begin{equation}
\begin{pmatrix}
\tikzmark{00}T_{00} & \tikzmark{01}T_{01} & \tikzmark{02}T_{02} & \tikzmark{03}T_{03} \\
\tikzmark{10}T_{10} & \tikzmark{11}T_{11} & T_{12} & \tikzmark{13}T_{13} \\
T_{20} & T_{21} & T_{22} & T_{23} \\
\tikzmark{30}T_{30} & \tikzmark{31}T_{31} & \tikzmark{32}T_{32} & \tikzmark{33}T_{33} \\
\end{pmatrix}
\end{equation}
` e la matrice risultante non avrà nessun effetto particolare. Chiaramente cosi facendo, ricompilando immediatamente il documento, si ha come side effect che colore di sfondo ed annotazioni non sono più centrate: il motivo è che ora il nodo non ha dimensione, mentre prima ne aveva una ben definita: quella del contentuto. In effetti, la definizione: `\newcommand{\tikzmark}[2]{
\tikz[baseline=-\the\dimexpr\fontdimen22\textfont2\relax,remember picture,overlay]\node (#1) {#2};
}` e l’uso: `\tikzmark{31}{$T_{31}$}` era esattamente la stessa cosa di:`
\tikz\node(31){$T_{31}$};
` Porta a concludere, quindi, che questa definizione di tikzmark macro non va bene.

In sostanza, per risolvere il problema serve:
1) manualmente aumentare lo spazio prima e dopo l’equazione;
2) usare una definizione classica di tikzmark;
2) ri-aggiustare i vari pezzi per tenere conto che il nodo ora non è più grande come prima.

Ad esempio (ho fatto solo un caso): `
\documentclass[fleqn]{article}
\usepackage[T1]{fontenc}
\usepackage{kpfonts}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}
\usepackage{lipsum,tikz}
\usetikzlibrary{calc}

\newcommand{\tikzmark}[1]{
\tikz[baseline=-\the\dimexpr\fontdimen22\textfont2\relax,remember picture,overlay]\node (#1) {};
}

\begin{document}
\lipsum[3]
\bigskip
\begin{equation}
\begin{pmatrix}
\tikzmark{00}T_{00} & \tikzmark{01}T_{01} & \tikzmark{02}T_{02} & \tikzmark{03}T_{03} \\
\tikzmark{10}T_{10} & \tikzmark{11}T_{11} & T_{12} & \tikzmark{13}T_{13} \\
T_{20} & T_{21} & T_{22} & T_{23} \\
\tikzmark{30}T_{30} & \tikzmark{31}T_{31} & \tikzmark{32}T_{32} & \tikzmark{33}T_{33} \\
\end{pmatrix}
\end{equation}

\begin{tikzpicture}[remember picture,overlay]

\draw ($(02.north)+(0.5em,2pt)$) — ++(0,20pt)
node[align=center,fill=white] {\small flusso di \\ energia};

% evidenzio flusso di energia
\draw
($(01.north west)+(0,2pt)$) —
($(01.south west)-(0,2pt)$) —
($(03.south east)+(1em,-2pt)$) —
($(03.north east)+(1em,2pt)$) — cycle;
\end{tikzpicture}
\lipsum[3]
\end{document}
` Il risultato:

[attachment=582]Senzanome_2013-01-22.jpg[/attachment]

Come dicevo all’inizio, qui l’approccio migliore è senza dubbio la libreria matrix: un paio di riferimenti.

1) Evidenziare gli elementi: How to highlight a single element in a matrix? facilmente estendibile a più elementi (ha una soluzione basata su xparse e la libreria backgrounds e un approccio con la libreria fit).
2) Inserire annotazioni: Border matrix with multiple indices on top and bottom.

Ciao
Claudio

Attachments:
You must be logged in to view attached files.

Go to top