Difficoltà con tikzmark

  • Creatore
    Topic
  • #82224
    Up
    0
    Down
    ::


    Mi sto esercitando con la macro [tt]\tikzmark[/tt] dopo averla scoperta grazie a cfiandra. Volevo provare a riprodurre questa figura: http://it.wikipedia.org/wiki/File:StressEnergyTensor_it.svg Una premessa: probabilmente sarebbe tutto più semplice usando la libreria [tt]matrix[/tt] (credo che non servirebbe neanche [tt]\tikzmark[/tt]; sarebbe tutto più facile anche se si potesse inserire un normale ambiente matematico in una [tt]tikzpicture[/tt]), ma mette le parentesi troppo lontane dagli elementi, rispetto alle matrici che si ottengono con l’ambiente [tt]pmatrix[/tt] c’è una differenza abissale. Questo è il codice che ho scritto (ho parzialmente modificato la macro [tt]\tikzmark[/tt] rispetto all’originale per adattarla alle mie necessità)
    `\documentclass[fleqn]{article}
    \usepackage[T1]{fontenc}
    \usepackage{kpfonts}
    \usepackage[utf8]{inputenc}
    \usepackage[italian]{babel}
    \usepackage{lipsum,tikz}
    \usetikzlibrary{calc}

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

    \begin{document}
    \lipsum[3]
    \begin{figure}[h]
    \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)!.4!(02.center)$) — ++(0,20pt)
    node[align=center,fill=white] {\small flusso di \\ energia};
    \draw ($(00.north)!.4!(00.center)$) — ++(0,20pt)
    node[align=center,fill=white] {\small densità di \\ energia};
    \draw ($(30.south)!.4!(30.center)$) — ++(0,-20pt)
    node[align=center,fill=white] {\small densità di \\ quantità \\ di moto};
    \draw ($(33.east)!.4!(33.center)$) — ++(35pt,0)
    node[align=center,fill=white] {\small pressione};
    \draw ($(13.east)!.45!(13.center)$) — ++(35pt,0)
    node[align=center,fill=white] {\small stress};
    \draw ($(32.south)!.4!(32.center)$) — ++(0,-20pt)
    node[align=center,fill=white] {\small flusso di \\ quantità \\ di moto};

    % evidenzio tensore degli sforzi e flusso di impulso
    \draw
    ($(11.north west)!.4!(11.center)$) —
    ($(31.south west)!.4!(31.center)$) —
    ($(33.south east)!.4!(33.center)$) —
    ($(13.north east)!.4!(13.center)$) — cycle;

    % evidenzio pressione
    \draw[fill,color=green,opacity=0.3]
    ($(11.north west)!.4!(11.center)$) —
    ($(11.north west)!.4!(11.center) – (0,9pt)$) —
    ($(33.south east)!.4!(33.center) – (9pt,0)$) —
    ($(33.south east)!.4!(33.center)$) —
    ($(33.south east)!.4!(33.center) + (0,8pt)$) —
    ($(11.north west)!.4!(11.center) + (8pt,0)$) — cycle;

    % evidenzio densità di energia
    \draw
    ($(00.north west)!.4!(00.center)$) —
    ($(00.south west)!.4!(00.center)$) —
    ($(00.south east)!.4!(00.center)$) —
    ($(00.north east)!.4!(00.center)$) — cycle;

    % evidenzio densità di impulso
    \draw
    ($(10.north west)!.4!(10.center)$) —
    ($(30.south west)!.4!(30.center)$) —
    ($(30.south east)!.4!(30.center)$) —
    ($(10.north east)!.4!(10.center)$) — cycle;

    % evidenzio flusso di energia
    \draw
    ($(01.north west)!.4!(01.center)$) —
    ($(01.south west)!.4!(01.center)$) —
    ($(03.south east)!.4!(03.center)$) —
    ($(03.north east)!.4!(03.center)$) — cycle;
    \end{tikzpicture}
    \end{figure}
    \lipsum[3]
    \end{document}`

    Pur notando che [tt]\tikzmark[/tt] ha delle buone potenzialità, ho incontrato un paio di problemi:
    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 [tt]\tikzmark[/tt], ma mi piacerebbe capire come realizzare una matrice i cui elementi sono solo macro [tt]\tikzmark[/tt].
    2) le annotazioni si sovrappongono al resto del testo.
    Ho l’impressione che i due problemi siano in un certo modo legati, si direbbe che i nodi creati con [tt]\tikzmark[/tt] siano “evanescenti”, nel senso che non occupano spazio. Ho aggiunto l’ambiente figure (che so non essere in realtà necessario in questi casi) proprio sperando che per magia si accorgesse della presenza delle annotazioni. Spesso probabilmente è molto utile avere i nodi “evanescenti”, ma in altre occasioni (come questa) decisamente no. C’è qualche modo per fornire a [tt]\tikzmark[/tt] “dimensionalità”?

Visualizzazione 5 filoni di risposte
  • Autore
    Risposte
    • #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.
    • #82226
      Up
      0
      Down
      ::

      cfiandra” post=81552Come 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

      Avevo già realizzato la matrice con la libreria [tt]matrix[/tt], tutto molto semplice, ma mettere vicine due matrici una realizzata con l’ambiente [tt]pmatrix[/tt] e l’altra con la libreria [tt]matrix[/tt] di [tt]tikz[/tt] è davvero uno scempio. Inoltre mi piacerebbe avere la matrice numerata come le altri equazioni, ma credo che si risolva facilmente inserendo l’ambiente [tt]tikzpicture[/tt] dentro all’ambiente [tt]equation[/tt].

      Ora provo a dare un’occhiata agli altri suggerimenti.

      Grazie!

    • #82227
      Up
      0
      Down
      ::

      cfiandra” post=81552Il 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.

      Avevo dimenticato di spiegare perché ho cambiato la definizione di [tt]\tikzmark[/tt]:
      `\newcommand{\tikzmark}[2]{
      \tikz[baseline=-\the\dimexpr\fontdimen22\textfont2\relax,remember picture,overlay]\node (#1) {#2};
      }

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

      \tikzmark{uno}{A} \realtikzmark{due}A
      \begin{tikzpicture}[overlay,remember picture]
      \draw[red] (uno.north west) — (uno.south west) — (uno.south east) —
      (uno.north east) — cycle;
      \draw[blue] (due.north west) — (due.south west) — (due.south east) —
      (due.north east) — cycle;
      \end{tikzpicture}`Con la mia definizione le ancore sono corrette attorno al contenuto del nodo (anche se comunque ho dovuto fare degli adattamenti), con la definizione tradizionale di [tt]\tikzmark[/tt] direi proprio di no (e senza la famosa baseline di egreg9 sarebbe ancora peggio).

      edit: ti riferivi a questo con la frase «si ha come side effect che colore di sfondo ed annotazioni non sono più centrate»?

    • #82228
      Up
      0
      Down
      ::

      Elrond” post=81558edit: ti riferivi a questo con la frase «si ha come side effect che colore di sfondo ed annotazioni non sono più centrate»?

      Esattamente.

      Elrond” post=81558Con la mia definizione le ancore sono corrette attorno al contenuto del nodo (anche se comunque ho dovuto fare degli adattamenti), con la definizione tradizionale di [tt]\tikzmark[/tt] direi proprio di no (e senza la famosa baseline di egreg9 sarebbe ancora peggio).

      Non condivido e ti spiego il perché.

      Con la tua definizione stai introducendo allineamenti non corretti. Con la definizione originale si contrassegna sempre il punto in basso (a destra o a sinistra rispetto a come è posizionato il marcatore); con la soluzione di Enrico si contrassegna il punto allineato centralmente in verticale sempre a destra o a sinistra rispetto a come è posizionato il marcatore.

      Codice:`
      % Nel preambolo
      \newcommand{\tikzmark}[2]{%
      \tikz[baseline=-\the\dimexpr\fontdimen22\textfont2\relax,remember picture,overlay]\node (#1) {#2};
      }

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

      \newcommand{\simpletikzmark}[1]{%
      \tikz[remember picture,overlay]\node (#1) {};
      }

      \newcommand{\placemark}[1]{%
      \tikz[remember picture,overlay]\draw[red] plot[mark=x] coordinates {(#1)};
      }

      % Nel documento

      \scalebox{5}{
      $x\simpletikzmark{a}$
      \placemark{a}
      }
      \tikz[remember picture, overlay]\draw[dashed]($(a)-(0.5em,0)$)–($(a)+(25em,0)$);
      \scalebox{5}{
      $x\realtikzmark{b}$
      \placemark{b}
      }
      \scalebox{5}{
      $\tikzmark{c}{$x$}$
      \placemark{c}
      }
      ` produce:

      [attachment=584]Senzanome_2013-01-23.jpg[/attachment]

      Nota come la tua definizione a destra non sia correttamente allineata verticalmente. Detto questo, quando si va poi ad inserire annotazioni o ad evidenziare, la cosa importante è solo sapere dove è sistemato il contrassegno: che sia in basso, al centro è indifferente, anche se ovviamente si devono fare aggiustamenti diversi. In ogni caso, ti spiego perché la tua definizione di [tt]tikzmark[/tt] così scritta è esattamente uguale all’inserimento di un nodo normale.

      Codice:`
      \scalebox{4}{
      $x\simpletikzmark{d}$
      \begin{tikzpicture}[remember picture,overlay]
      \draw[blue] ($(d.south)+(0,0)$)–
      ($(d.north)+(0,0.75ex)$)–
      ($(d.north)+(-0.75em,0.75ex)$)–
      ($(d.south)+(-0.75em,0)$)–cycle;
      \end{tikzpicture}
      \placemark{d}
      }
      \scalebox{4}{
      $x\realtikzmark{e}$
      \begin{tikzpicture}[remember picture,overlay]
      \draw[blue] ($(e.south)+(0,-\vertalign)$)–
      ($(e.north)+(0,0.25ex)$)–
      ($(e.north)+(-0.75em,0.25ex)$)–
      ($(e.south)+(-0.75em,-\vertalign)$)–cycle;
      \end{tikzpicture}
      \placemark{e}
      }
      \scalebox{4}{
      $\tikzmark{f}{$x$}$
      \begin{tikzpicture}[remember picture,overlay]
      \draw[blue] ($(f.south)+(0.6em,0)$)–
      ($(f.north)+(0.6em,0)$)–
      ($(f.north)+(-0.6em,0)$)–
      ($(f.south)+(-0.6em,0)$)–cycle;
      \end{tikzpicture}
      \placemark{f}
      }
      \scalebox{4}{
      \begin{tikzpicture}[baseline=-0.5ex]
      \node[draw=blue] (g) {$x$};
      \draw[red] plot[mark=x] coordinates {(g)};
      \end{tikzpicture}
      }
      ` Risultato:

      [attachment=585]Senzanome1.jpg[/attachment]

      Come si può notare occorrono diversi aggiustamenti per ogni metodo: quelli a prima vista più semplici sono proprio quelli dati dalla tua definizione, che però è esattamente uguale ad inserire un nodo con l’opzione [tt]draw[/tt]. Quindi la macro tikzmark è inutile? No assolutamente, ma non funziona bene se viene passato il contenuto come argomento, altrimenti usa TikZ direttamente che è più diretto. Non che questa strada non sia già stata percorsa: la soluzione di Peter riportata sulla guida in effetti può essere vista come un tentativo di incapsulare il contenuto in due delimitatori (ma alla fine la storia è la stessa) e anche io nel mio piccolo ho fatto qualche tentativo Alignments by means of the tikzmark macro. Con un po’ di esperienza in più mi sento ora di condividere la risposta di Andrew nei commenti:

      You are putting the stuff that you are highlighting inside the node and the \tikzmark was developed for precisely when this wasn’t a reasonable idea.

      In definitiva, cambia poco che tu inserisca la formula come argomento o no: qualche aggiustamento lo devi fare comunque perciò è meglio non tirarsi dietro i problemi che questo approccio comporta. Un ultimo esempio: `
      \scalebox{2.5}{
      $
      \begin{pmatrix}
      0 & \tikzmark{x}{$0$} & 0\\
      0 & 0 & 0\\
      0 & \tikzmark{y}{$0$} & 0\\
      \end{pmatrix}
      $
      \begin{tikzpicture}[remember picture, overlay]
      \draw[dashed] ($(x.base)+(2em,0)$)–($(x.base)-(2em,0)$);
      \draw[red,fill=red!20,opacity=0.2](x.north west)–(y.south west)–(y.south east)–(x.north east)–cycle;
      \end{tikzpicture}
      }
      \scalebox{2.5}{
      $
      \begin{pmatrix}
      0 & 0\simpletikzmark{w} & 0\\
      0 & 0 & 0\\
      0 & 0\simpletikzmark{z} & 0\\
      \end{pmatrix}
      $
      \begin{tikzpicture}[remember picture, overlay]
      \draw[dashed] ($(w.base)+(1.25em,0)$)–($(w.base)-(2em,0)$);
      \draw[red,fill=red!20,opacity=0.2]
      ($(w.north west)+(-0.25em,1ex)$)–
      ($(z.south west)+(-0.25em,0)$)–
      ($(z.south east)+(-0.25em,0)$)–
      ($(w.north east)+(-0.25em,1ex)$)–cycle;
      \end{tikzpicture}
      }
      \scalebox{2.5}{
      $
      \begin{pmatrix}
      0 & \tikzmarkin{r}0 & 0 \\
      0 & 0 & 0\\
      0 & 0\tikzmarkend{r} & 0\\
      \end{pmatrix}
      $
      }
      ` Risultato:

      [attachment=586]Senzanome2.jpg[/attachment]

      Nel primo esempio a sinistra ho usato la tua macro, in centro quella semplice e a destra [tt]hf-tikz[/tt] che nasconde all’utente i passaggi che si devono fare con gli altri metodi.

      Il codice intero per completezza: `
      \documentclass[a4paper,11pt]{article}
      \usepackage[width=16cm]{geometry}
      \usepackage{amsmath}
      \usepackage{tikz}
      \usetikzlibrary{calc,backgrounds,shapes.misc}
      \usepackage{hf-tikz}

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

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

      \newcommand{\simpletikzmark}[1]{%
      \tikz[remember picture,overlay]\node (#1) {};
      }

      \newcommand{\placemark}[1]{%
      \tikz[remember picture,overlay]\draw[red] plot[mark=x] coordinates {(#1)};
      }

      \begin{document}

      \scalebox{5}{
      $x\simpletikzmark{a}$
      \placemark{a}
      }
      \tikz[remember picture, overlay]\draw[dashed]($(a)-(0.5em,0)$)–($(a)+(25em,0)$);
      \scalebox{5}{
      $x\realtikzmark{b}$
      \placemark{b}
      }
      \scalebox{5}{
      $\tikzmark{c}{$x$}$
      \placemark{c}
      }
      \bigskip\bigskip

      \scalebox{4}{
      $x\simpletikzmark{d}$
      \begin{tikzpicture}[remember picture,overlay]
      \draw[blue] ($(d.south)+(0,0)$)–
      ($(d.north)+(0,0.75ex)$)–
      ($(d.north)+(-0.75em,0.75ex)$)–
      ($(d.south)+(-0.75em,0)$)–cycle;
      \end{tikzpicture}
      \placemark{d}
      }
      \scalebox{4}{
      $x\realtikzmark{e}$
      \begin{tikzpicture}[remember picture,overlay]
      \draw[blue] ($(e.south)+(0,-\vertalign)$)–
      ($(e.north)+(0,0.25ex)$)–
      ($(e.north)+(-0.75em,0.25ex)$)–
      ($(e.south)+(-0.75em,-\vertalign)$)–cycle;
      \end{tikzpicture}
      \placemark{e}
      }
      \scalebox{4}{
      $\tikzmark{f}{$x$}$
      \begin{tikzpicture}[remember picture,overlay]
      \draw[blue] ($(f.south)+(0.6em,0)$)–
      ($(f.north)+(0.6em,0)$)–
      ($(f.north)+(-0.6em,0)$)–
      ($(f.south)+(-0.6em,0)$)–cycle;
      \end{tikzpicture}
      \placemark{f}
      }
      \scalebox{4}{
      \begin{tikzpicture}[baseline=-0.5ex]
      \node[draw=blue] (g) {$x$};
      \draw[red] plot[mark=x] coordinates {(g)};
      \end{tikzpicture}
      }

      \bigskip\bigskip

      \scalebox{2.5}{
      $
      \begin{pmatrix}
      0 & \tikzmark{x}{$0$} & 0\\
      0 & 0 & 0\\
      0 & \tikzmark{y}{$0$} & 0\\
      \end{pmatrix}
      $
      \begin{tikzpicture}[remember picture, overlay]
      \draw[dashed] ($(x.base)+(2em,0)$)–($(x.base)-(2em,0)$);
      \draw[red,fill=red!20,opacity=0.2](x.north west)–(y.south west)–(y.south east)–(x.north east)–cycle;
      \end{tikzpicture}
      }
      \scalebox{2.5}{
      $
      \begin{pmatrix}
      0 & 0\simpletikzmark{w} & 0\\
      0 & 0 & 0\\
      0 & 0\simpletikzmark{z} & 0\\
      \end{pmatrix}
      $
      \begin{tikzpicture}[remember picture, overlay]
      \draw[dashed] ($(w.base)+(1.25em,0)$)–($(w.base)-(2em,0)$);
      \draw[red,fill=red!20,opacity=0.2]
      ($(w.north west)+(-0.25em,1ex)$)–
      ($(z.south west)+(-0.25em,0)$)–
      ($(z.south east)+(-0.25em,0)$)–
      ($(w.north east)+(-0.25em,1ex)$)–cycle;
      \end{tikzpicture}
      }
      \scalebox{2.5}{
      $
      \begin{pmatrix}
      0 & \tikzmarkin{r}0 & 0 \\
      0 & 0 & 0\\
      0 & 0\tikzmarkend{r} & 0\\
      \end{pmatrix}
      $
      }
      \end{document}
      `

      Ciao
      Claudio

      Attachments:
      You must be logged in to view attached files.
    • #82229
      Up
      0
      Down
      ::


      Alla fine ho risolto… senza [tt]\tikzmark[/tt] 😀 Ho usato semplicemente la libreria [tt]matrix[/tt], però ho avuto bisogno di rubare del codice dalla risposta di Andrew Stacey alla domanda Obstacles to simulating an amsmath matrix by a TiKZ matrix of math nodes su TeX Stack Exchange. In questo modo sono riuscito a rendere “piacevole” l’aspetto della matrice. Ottengo un triplice vantaggio: codice decisamente più semplice (niente posizioni definite con la sintassi partway), non c’è bisogno di aggiungere spazi bianchi manualmente, per esempio con [tt]\bigskip[/tt], è sufficiente compilare una sola volta 😀

      Ecco il codice per chi fosse interessato:
      `\documentclass[fleqn]{article}
      \usepackage[T1]{fontenc}
      \usepackage{kpfonts}
      \usepackage[utf8]{inputenc}
      \usepackage{lipsum,tikz}
      \usetikzlibrary{calc,matrix}

      \tikzset{
      ams/.style={
      baseline=-.7ex,
      every left delimiter/.style={xshift=2pt},
      every right delimiter/.style={xshift=-2pt},
      every node/.style={inner sep=0pt},
      },
      ams matrix/.style={
      inner sep=1pt,
      column sep=1.5ex,
      row sep=2\arraycolsep,
      matrix of math nodes,
      },
      pmatrix/.style={
      ams,
      every matrix/.style={
      ams matrix,
      left delimiter={(},
      right delimiter={)},
      }
      }
      }

      \begin{document}

      \lipsum[3]
      \begin{equation}
      \begin{tikzpicture}[pmatrix]
      \matrix (t)
      {
      T_{00} & T_{01} & T_{02} & T_{03} \\
      T_{10} & T_{11} & T_{12} & T_{13} \\
      T_{20} & T_{21} & T_{22} & T_{23} \\
      T_{30} & T_{31} & T_{32} & T_{33} \\
      } ;

      % evidenzio tensore degli sforzi e flusso di impulso
      \draw
      (t-2-2.north west) —
      (t-4-2.south west) —
      (t-4-4.south east) —
      (t-2-4.north east) — cycle;

      % evidenzio pressione
      \draw[fill,color=green,opacity=0.3]
      (t-2-2.north west) —
      (t-2-2.south west) —
      (t-4-4.south west) —
      (t-4-4.south east) —
      (t-4-4.north east) —
      (t-2-2.north east) — cycle;

      % evidenzio densità di energia
      \draw
      (t-1-1.north west) —
      (t-1-1.south west) —
      (t-1-1.south east) —
      (t-1-1.north east) — cycle;

      % evidenzio densità di impulso
      \draw
      (t-2-1.north west) —
      (t-4-1.south west) —
      (t-4-1.south east) —
      (t-2-1.north east) — cycle;

      % evidenzio flusso di energia
      \draw
      (t-1-2.north west) —
      (t-1-2.south west) —
      (t-1-4.south east) —
      (t-1-4.north east) — cycle;

      \begin{scope}[font=\small]
      \draw (t-1-3.north) — ++(0,20pt)
      node[align=center,fill=white] {flusso di \\ energia};

      \draw (t-1-1.north) — ++(0,20pt)
      node[align=center,fill=white] {densità di \\ energia};

      \draw (t-4-1.south) — ++(0,-25pt)
      node[align=center,fill=white] {densità di \\ quantità \\ di moto};

      \draw (t-4-4.east) — ++(35pt,0)
      node[align=center,fill=white] {pressione};

      \draw ($(t-2-4.east) – (.5pt,0)$) — ++(35pt,0)
      node[align=center,fill=white] {stress};

      \draw (t-4-3.south) — ++(0,-25pt)
      node[align=center,fill=white] {flusso di \\ quantità \\ di moto};
      \end{scope}
      \end{tikzpicture}
      \end{equation}
      \lipsum[3]
      \end{document}`

      Sicuramente ho provato a usare [tt]\tikzmark[/tt] in un ambito sbagliato e me ne sono accorto subito, ma è stata l’occasione buona per studiare meglio il suo funzionamento. Grazie 🙂

    • #82230
      Up
      0
      Down
      ::


      Ottimo il link che hai inserito: il codice di Andrew è sempre una garanzia. 🙂

      In ogni caso la tua domanda ha permesso di toccare alcuni punti non da poco, come il concetto della chiave [tt]overlay[/tt] che non aggiorna le dimensioni della bounding box, o quello degli allineamenti. E probabilmente inserirò parte della spiegazione nella guida: la renderà più chiara probabilmente.

      Ultima cosa: ho provato il tuo codice. Farei solo una piccola aggiunta: prova a racchiudere tutto il codice che crea lo sfondo con `\begin{scope}[on background layer]

      \end{scope}` che richiede la libreria [tt]backgrounds[/tt]. Vedrai che gli elementi della matrice non hanno più quella patina opaca che li copre, ma saranno ben visibili.

      Ciao
      Claudio

Visualizzazione 5 filoni di risposte
  • Devi essere connesso per rispondere a questo topic.

Go to top