Risposte nei forum create
-
AutoreRisposte
-
::
Se il logo deve essere inserito in ogni pagina, questo è sicuramente l’approccio migliore. Il concetto chiave è l’uso del pacchetto [tt]background[/tt], un pacchetto veramente fantastico.`
\documentclass{article}
\usepackage{tikzpagenodes}% permette l'accesso a nodi speciali, si veda la documentazione
% in questo esempio non viene usato, ma potrebbe servire per altri scopi
\usetikzlibrary{calc}
\usepackage[contents={}]{background}\usepackage{lipsum}% for dummy text
\newcommand{\mylogo}[2][width=2cm,keepaspectratio]{%
\tikz[remember picture,overlay]{%
\node[anchor=north west] at (current page.north west)
{\includegraphics[#1]{#2}};
}%
}\AddEverypageHook{%
\mylogo{LogoGuITtondo}
\BgMaterial}\begin{document}
\lipsum[1-8]
\end{document}`Ciao
Claudio
::robitex” post=81846Ciao,
l’idea è quella di implemetare una nuova shape per disegnare un barcode secondo un dato formato.
Una shape è gestita da PGF tramite i noti punti di ancoraggio.
Il problema nel caso del barcode è che il disegno della forma non dipende dalle dimensioni del testo del nodo, ma dal testo stesso.
Secondo voi è possibile rintracciare la macro dove pgf memorizza il testo del nodo per processarla?
Il manuale al capitolo “Nodes and Shapes” non fa cenno alla cosa.
Forse non è possibile.Il codice che crea una forma rettangolare al cui interno trova posto il barcode, è il seguente (manca della parte di disegno):
`\pgfdeclareshape{barcode}{%
\savedanchor{\centerpoint}{
\pgf@y=.5\pgfbc@h
\pgf@x=.5\pgfbc@x
}
\savedanchor{\upperrightcorner}{
\pgf@y=\pgfbc@h
\pgf@x=\pgfbc@x
}
\anchor{north east}{\upperrightcorner}
\anchor{center}{\centerpoint}
\foregroundpath{… elaborazione del testo per la produzione del barcode…}
}`Utilizzo delle dimensioni TeX variabili a seconda del codice del barcode.
Dispongo già del codice pgf per disegnare il barcode (nel formato code39) a partire dal testo.
Semmai si potrebbe pensare di scrivere un articolo (breve) per il prossimo numero di Ars se qualcuno è interessato.
Grazie mille.
R.Dovrebbe essere [tt]\pgfnodeparttextbox[/tt]. Onestamente però non ne sono sicuro al 100%. Ho controllato in [tt]tikz.code.tex[/tt] e in un certo senso viene confermata la mia impressione vedendo che la macro è usata in [tt]\tikz@do@fig[/tt] (e quindi seguendo il filo in [tt]\tikz@fig@collectresetcolor[/tt] -> [tt]\tikz@fig@boxdone[/tt] ed infine [tt]\tikz@fig@continue[/tt] – è proprio questa definizione finale quella chiave che mi conferma l’impressione). Vedendo poi l’uso di [tt]\pgfmultipartnode[/tt] e andando nel manuale a pagina 619 c’è un esempio decisamente interessante.
Sono curioso di vedere poi il codice dell’applicazione 😉
Ciao
Claudio
::MARIL” post=81651Ciao, i tuoi grafici sono savvero belli!
sto valutando di passare da gnuplot a PGFPlot per graficare i miei dati sperimentali, gnuplot è comodo dal momento che è possibile riportare più serie di dati nello stesso file.txt alle quali poi si può fare riferimento con “using 1:2 ” etc; in PGFPlot esiste qualcosa di analogo? Non ho ben capito come organizzare i miei dati per ottenre più curve sullo stesso grafico, riportare tutte le coordinate porterebbe ad un file lunghissimo così come anche sarebbe tedioso creare più file a cui fare riferimento!
Suggerimenti?grazie, Mari
Per riportare più curve basta inserire più [tt]\addplot[/tt] nello stesso ambiente [tt]axis[/tt]. Il mio consiglio è di produrre i tuoi dati sperimentali in diversi file (ad esempio [tt].dat[/tt]) e di richiamarli con la sintassi `
\addplot[opzioni]
table[x={titolo-colonna-x-nel-file-dat},y={titolo-colonna-y-nel-file-dat}]
{file.dat};
` Un esempio minimo: `\documentclass{article}
\usepackage{filecontents}\begin{filecontents}{dati1.dat}
asse-x asse-y
0 0.2
1 1
2 1.2
3 2
\end{filecontents}\begin{filecontents}{dati2.dat}
x y
0 2.2
1 3
2 4.2
3 5
\end{filecontents}\usepackage{pgfplots}
\pgfplotsset{compat=1.7} % versione corrente: usare quella installata
% consultando la documentazione del pacchetto per reperirla\begin{document}
\centering
\begin{tikzpicture}
\begin{axis}\addplot[red] table[
x = asse-x,
y = asse-y]{dati1.dat};\addplot[blue] table[
x = x,
y = y]{dati2.dat};\end{axis}
\end{tikzpicture}
\end{document}
` Dimenticavo: esiste uno script matlab, matlab2tikz, che esporta direttamente in codice TikZ il grafico; tu devi solo far girare lo script e copiare il risultato che ottieni (un file [tt].tikz[/tt]) nel documento principale. La soluzione “a mano” mi è venuta per prima perché è quanto ho fatto per la mia tesi, ma in quel caso i risultati erano prodotti da simulazioni non in matlab.. altrimenti avrei usato lo script. 🙂Ciao
Claudio
::dearick” post=81639Salve,
sto completando il frontespizio della mia tesi come nel file allegato. Dovrei centrare il nome del relatore e dello studente sotto le rispettive diciture tutto su due righe. Come posso fare?
Riccardo
P.S. non riesco ad allegare il pdf …
Direi che la soluzione migliore è affidarsi al pacchetto frontespizio in caso tu lo abbia composto manualmente finora.
Ciao
Claudio
::paolo2988″ post=81640Salve a tutti,
sto scrivendo la mia tesi usando un file unico “thesis.tex” dove tramite include richiamo gli altri capitoli. Adesso vorrei usare BibTex per la bibliografia ma sto avendo dei problemi. o generato un file “bib” e vorrei sapere quali comandi devo usare per richiamare BibTex nel file “thesis.tex” e come fare le citazioni nei singoli capitoli.
Grazie mille a tutti.
La struttura del file “thesis.tex” è questa per essere un po’ più chiaro.
`
\documentclass[dvips,letterpaper,12pt, openright]{report}
\usepackage{thesis}
\usepackage[latin1]{inputenc}
\usepackage[italian]{babel}
\usepackage[a4paper,top=2.5cm,bottom=2cm,left=3.7cm,right=1cm]{geometry}
\usepackage{enumitem}\begin{document}
\include{abstract}
\include{ack}
\include{contents}
\include{tables}
\include{figures}\pagenumbering{arabic}
\include{Capitolo1}
\include{Capitolo2}\end{document}
`Il suggerimento migliore in questi casi è: leggere il capitolo apposito nell’Arte di Scrivere con LaTeX, guida introduttiva che si può scaricare anche dalla sezione Documentazione in alto. È spiegato tutto dettagliatamente e, quando si è agli inizi, è fondamentale averla sottomano.
Ciao
Claudio
::claudio” post=81564ho capito il problema
bisogna costruire avendo in mente il risultato
e un po di simmetria
ecco il codice giustoNon proprio.. se usi i riferimenti relativi rispetto ad un unico punto iniziale dato con in coordinate, puoi inventare i valori che ti pare per quelle coordinate (nel range ammissibile ovviamente) e il disegno non si sposterà di un millimetro. Il motivo è che TikZ elabora la tua coordinata e poi aggiorna la bounding box in base a ciò che tu aggiungi con i riferimenti relativi. Dopo di che ti presenta solo la parte di disegno che ti interessa, quindi anche se dichiari la coordinata di partenza a [tt](218,301)[/tt] non ti mostra tutto il rettangolo vuoto da un’ipotetica origine[tt](0,0)[/tt]. Più o meno è quello che volevo dire con il disegno precedente. Poi, ovviamente, questo non vale se tu dai tutto in coordinate, ma poiché in questo esempio ricolleghi tutto al primo modulo… se sposti quello si sposta tutto di conseguenza.
Per essere più chiaro, guarda questo esempio. Allego solo il documento, il preambolo è uguale a prima (serve però il pacchetto [tt]lipsum[/tt]): `
\begin{document}
\lipsum[2]\begin{tikzpicture}[node distance=4.5cm,scale=0.55, transform shape]
\pgfoonew \mod=new module()
\mod.set style(black,white,white)
\mod.set and draw(mod1,Bisogni educativi speciali,0,0)
\mod.set and place(mod2,{\mbox{Motivi fisici}} ,below left of=mod1)
\mod.set and place(mod3,{\mbox{Motivi biologici}} ,right of=mod2)
\mod.set and place(mod4,{\mbox{Motivi sociali}} ,right of=mod3)
\mod.set and place(mod5,{\mbox{Motivi fisiologici}} ,right of=mod4)
\mod.set and place(mod6,{\mbox{Motivi fisiologici}} ,right of=mod5)\mod.multi connect(mod1,{mod3,mod4,mod5,mod6})
\mod.connect(mod1,mod2) % non capisco come mai sparisca la freccia\end{tikzpicture}
\lipsum[2]
\begin{tikzpicture}[node distance=4.5cm,scale=0.55, transform shape]
\pgfoonew \mod=new module()
\mod.set style(black,white,white)
\mod.set and draw(mod1,Bisogni educativi speciali,218cm,301cm)
% identificare l'ancora di base
\mod.set and place(mod2,{\mbox{Motivi fisici}} ,below left of=mod1)
\mod.set and place(mod3,{\mbox{Motivi biologici}} ,right of=mod2)
\mod.set and place(mod4,{\mbox{Motivi sociali}} ,right of=mod3)
\mod.set and place(mod5,{\mbox{Motivi fisiologici}} ,right of=mod4)
\mod.set and place(mod6,{\mbox{Motivi fisiologici}} ,right of=mod5)\mod.multi connect(mod1,{mod3,mod4,mod5,mod6})
\mod.connect(mod1,mod2) % non capisco come mai sparisca la freccia\end{tikzpicture}
\lipsum[2]
\end{document}
` Il risultato non subisce nessuna variazione in base alle coordinate iniziali:[attachment=589]Senzanome_2013-01-23-3.jpg[/attachment]
Ciao
Claudio
Attachments:
You must be logged in to view attached files.::Marco87″ post=81565chiedo scusa per non aver trovato da solo la spiegazione.
Ma figurati. 🙂
Quando sei in dubbio, fai come ho fatto io: prova a mettere qualche nodo per stampare i valori dei contatori o prova a colorare in modo diverso le parti di codice non chiare. È una specie di debug a mano a costo zero, ma funziona.
Ciao
Claudio
::
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
::Marco87″ post=81557Mi è sorto, però, un altro quesito: cosa succede dentro il ciclo? Se cerco [tt]coordinate[/tt][ [tt]pos[/tt] nel manuale di [tt]TikZ[/tt] non trovo nulla, e non capisco che cosa faccia.
Onestamente ci sono un sacco di cose non documentate in TikZ: prova a cercare la libreria [tt]3d[/tt] o la macro [tt]againpath[/tt], non le troverai. Ma esistono: `gedit $(kpsewhich tikzlibrary3d.code.tex) #Libreria 3d
grep againpath $(kpsewhich tikz.code.tex) #Macro` In questo caso, però, trovi la sintassi a pagina 175:There is a special syntax for specifying “light-weighed” nodes:
`\path . . . coordinate[ options ]( name )at( coordinate ) . . . ;`
This has the same effect as
`node[shape=coordinate][] options ]( name )at( coordinate ){},`
where the at part might be missing.Serve per usare le coordinate che hanno un comportamento leggermente diverso dai nodi, vedi TikZ: difference between \node and \coordinate?
Sostanzialmente, quello che fa il codice di Alain dentro il ciclo è questo:
1) fissa la coordinata iniziale `\path[coordinate] coordinate(X) at (A){};` nota che se sostituisci con `\coordinate (X) at (A);` dovrebbe funzionare uguale;
2) calcola un percorso che partendo dalla coordinata iniziale arrivi a [tt]0.15[/tt] di distanza rispetto alla coordinata successiva;
3) itera aggiornando le posizioni delle coordinate, si vede da `(A) — (B) coordinate[pos=.15](A) % da A vado a 0.15 B e salvo la posizione in A `
Puoi dedurre il comportamento facendo contrassegnare il primo giro fuori dal ciclo: `
\documentclass{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\begin{document}
\newcounter{density}
\setcounter{density}{20}
\begin{tikzpicture}
\def\couleur{MidnightBlue}
\path[coordinate] (0,0) coordinate(A)
++( 60:12cm) coordinate(B)
++(-60:12cm) coordinate(C);
\draw[fill=\couleur!\thedensity] (A) — (B) — (C) — cycle;
\path[red] (A) — (B) node[circle,draw,red,pos=.15]{x}
— (C) node[circle,draw,red,pos=.15]{x}
— (A) node[circle,draw,red,pos=.15]{x};
\foreach \x[evaluate=\x as \mydensity using int(\x*10+\thedensity)] in {1,…,15}{%
\path[coordinate] coordinate(X) at (A){};
\path[coordinate] (A) — (B) coordinate[pos=.15](A)
— (C) coordinate[pos=.15](B)
— (X) coordinate[pos=.15](C);
\draw[fill=\couleur!\mydensity] (A)–(B)–(C)–cycle;
}\end{tikzpicture}
\end{document}
` Risultato:[attachment=587]Senzanome_2013-01-23-2.jpg[/attachment]
Ciao
Claudio
Attachments:
You must be logged in to view attached files.::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.::claudio” post=81559se cambio le coordinate il punto non si muove 🙂
Si muove, si muove, ma di soppiatto 😉
Il discorso è che tu hai definito un disegno principalmente con i riferimenti relativi, perciò cambiando le coordinate del riferimento iniziale sembra che non succeda nulla mentre in realtà viene tutto traslato di conseguenza. TikZ si calcola la bounding box partendo dalle coordinate iniziali ed aggiornadola ogni volta che aggiungi un elemento. Ambienti [tt]tikzpicture[/tt] diversi hanno bounding box diverse: ti saresti accorto di spostamenti se avessi inserito due volte la stessa figura (con nomi diversi ovviamente) e coordinate diverse al modulo iniziale.
Dimostrazione pratica: `
\documentclass{article}\usepackage{lmodern}
\usepackage{tikz}
\usepgfmodule{oo}
\usetikzlibrary{positioning,shapes.misc}\pgfooclass{module}{
% class attributes
\attribute text;
\attribute text width=2.5cm;
\attribute border color=orange;
\attribute top color=none;
\attribute bottom color=none;
\attribute text color=black;
\attribute label;
\attribute width=3cm;
\attribute height=1cm;% constructor method
\method module() {
}\method text(#1) {
\pgfooset{text}{#1}
}\method set text width(#1) {
\pgfooset{text width}{#1}
}\method set border color(#1) {
\pgfooset{border color}{#1}
}\method set top color(#1) {
\pgfooset{top color}{#1}
}\method set bottom color(#1) {
\pgfooset{bottom color}{#1}
}\method set text color(#1) {
\pgfooset{text color}{#1}
}\method set label(#1) {
\pgfooset{label}{#1}
}\method set width(#1) {
\pgfooset{width}{#1}
}\method set height(#1) {
\pgfooset{height}{#1}
}\method draw(#1,#2) {
\node [rectangle,
rounded corners,
draw=\pgfoovalueof{border color},
top color=\pgfoovalueof{top color},
bottom color=\pgfoovalueof{bottom color},
text=\pgfoovalueof{text color},
align=center,
text width=\pgfoovalueof{text width},
minimum width=\pgfoovalueof{width},
minimum height=\pgfoovalueof{height},
] (\pgfoovalueof{label}) at (#1,#2) {\pgfoovalueof{text}};
}\method place(#1) {
\node [rectangle,
rounded corners,
draw=\pgfoovalueof{border color},
top color=\pgfoovalueof{top color},
bottom color=\pgfoovalueof{bottom color},
text=\pgfoovalueof{text color},
align=center,
text width=\pgfoovalueof{text width},
minimum width=\pgfoovalueof{width},
minimum height=\pgfoovalueof{height},
#1
] (\pgfoovalueof{label}) {\pgfoovalueof{text}};
}% shortcut method to easily set labels, text and draw
% use the \pgfoothis to refer to the current object
\method set and draw(#1,#2,#3,#4) {
\pgfoothis.set label(#1)
\pgfoothis.text(#2)
\pgfoothis.draw(#3,#4)
}% shortcut method to easily set labels, text and place
% objects
\method set and place(#1,#2,#3) {
\pgfoothis.set label(#1)
\pgfoothis.text(#2)
\pgfoothis.place(#3)
}% shortcut method to easily set the style
\method set style(#1,#2,#3) {
\pgfoothis.set border color(#1)
\pgfoothis.set top color(#2)
\pgfoothis.set bottom color(#3)
}% shortcut method to easily set the dimensions
\method set dimensions(#1,#2,#3) {
\pgfoothis.set width(#1)
\pgfoothis.set height(#2)
\pgfoothis.set text width(#3)
}% appositi metodi di connessione
\method connect(#1,#2) {
\draw[->] (#1)–(#2);
}\method multi connect(#1,#2) {
\foreach \i in {#2}{
\draw[->] (#1)–(\i);
}
}}
\begin{document}
\begin{tikzpicture}[node distance=4.5cm,scale=0.55, transform shape]
\foreach \start in {-5,…,20}
\draw[help lines](\start,-5) node[below,text=black]{\start}–(\start,5);\foreach \start in {-5,…,5}
\draw[help lines](-5,\start) node[left,text=black]{\start}–(20,\start);\pgfoonew \mod=new module()
\mod.set style(black,white,white)
\mod.set and draw(mod1,Bisogni educativi speciali,0,0)
% identificare l'ancora di base
\node[cross out,draw=red,scale=2] at (0,0){};\draw[red,dashed] (-5,0)–(0,0) (0,-5)–(0,0);
\mod.set and place(mod2,{\mbox{Motivi fisici}} ,below left of=mod1)
\mod.set and place(mod3,{\mbox{Motivi biologici}} ,right of=mod2)
\mod.set and place(mod4,{\mbox{Motivi sociali}} ,right of=mod3)
\mod.set and place(mod5,{\mbox{Motivi fisiologici}} ,right of=mod4)
\mod.set and place(mod6,{\mbox{Motivi fisiologici}} ,right of=mod5)\mod.multi connect(mod1,{mod3,mod4,mod5,mod6})
\mod.connect(mod1,mod2) % non capisco come mai sparisca la freccia\end{tikzpicture}
\begin{tikzpicture}[node distance=4.5cm,scale=0.55, transform shape]
\foreach \start in {-5,…,20}
\draw[help lines](\start,-5) node[below,text=black]{\start}–(\start,5);\foreach \start in {-5,…,5}
\draw[help lines](-5,\start) node[left,text=black]{\start}–(20,\start);\pgfoonew \mod=new module()
\mod.set style(black,white,white)
\mod.set and draw(mod1,Bisogni educativi speciali,1,3)
% identificare l'ancora di base
\draw[red,dashed] (-5,3)–(1,3) (1,-5)–(1,3);
\node[cross out,draw=red,scale=2] at (1,3){};\mod.set and place(mod2,{\mbox{Motivi fisici}} ,below left of=mod1)
\mod.set and place(mod3,{\mbox{Motivi biologici}} ,right of=mod2)
\mod.set and place(mod4,{\mbox{Motivi sociali}} ,right of=mod3)
\mod.set and place(mod5,{\mbox{Motivi fisiologici}} ,right of=mod4)
\mod.set and place(mod6,{\mbox{Motivi fisiologici}} ,right of=mod5)\mod.multi connect(mod1,{mod3,mod4,mod5,mod6})
\mod.connect(mod1,mod2) % non capisco come mai sparisca la freccia\end{tikzpicture}
\end{document}
` Risultato:[attachment=583]oo.jpg[/attachment]
Ciao
Claudio
Attachments:
You must be logged in to view attached files.::
Hai imposto che [tt]mod1[/tt] è alle coordinate [tt]x=20[/tt] e [tt]y=0[/tt] attraverso:`\mod.set and draw(mod1,Bisogni educativi speciali,20,0)` Esistono fondamentalmente due strade per operare: specificando sempre le coordinate dell’oggetto con [tt].set and draw[/tt] oppure usando riferimenti relativi (nello stesso modo di TikZ tradizionale) con [tt].set and place[/tt].Per le connessioni potresti anche usare un apposito metodo:`\documentclass{article}
\usepackage{lmodern}
\usepackage{tikz}
\usepgfmodule{oo}
\usetikzlibrary{positioning}\pgfooclass{module}{
% class attributes
\attribute text;
\attribute text width=2.5cm;
\attribute border color=orange;
\attribute top color=none;
\attribute bottom color=none;
\attribute text color=black;
\attribute label;
\attribute width=3cm;
\attribute height=1cm;% constructor method
\method module() {
}\method text(#1) {
\pgfooset{text}{#1}
}\method set text width(#1) {
\pgfooset{text width}{#1}
}\method set border color(#1) {
\pgfooset{border color}{#1}
}\method set top color(#1) {
\pgfooset{top color}{#1}
}\method set bottom color(#1) {
\pgfooset{bottom color}{#1}
}\method set text color(#1) {
\pgfooset{text color}{#1}
}\method set label(#1) {
\pgfooset{label}{#1}
}\method set width(#1) {
\pgfooset{width}{#1}
}\method set height(#1) {
\pgfooset{height}{#1}
}\method draw(#1,#2) {
\node [rectangle,
rounded corners,
draw=\pgfoovalueof{border color},
top color=\pgfoovalueof{top color},
bottom color=\pgfoovalueof{bottom color},
text=\pgfoovalueof{text color},
align=center,
text width=\pgfoovalueof{text width},
minimum width=\pgfoovalueof{width},
minimum height=\pgfoovalueof{height},
] (\pgfoovalueof{label}) at (#1,#2) {\pgfoovalueof{text}};
}\method place(#1) {
\node [rectangle,
rounded corners,
draw=\pgfoovalueof{border color},
top color=\pgfoovalueof{top color},
bottom color=\pgfoovalueof{bottom color},
text=\pgfoovalueof{text color},
align=center,
text width=\pgfoovalueof{text width},
minimum width=\pgfoovalueof{width},
minimum height=\pgfoovalueof{height},
#1
] (\pgfoovalueof{label}) {\pgfoovalueof{text}};
}% shortcut method to easily set labels, text and draw
% use the \pgfoothis to refer to the current object
\method set and draw(#1,#2,#3,#4) {
\pgfoothis.set label(#1)
\pgfoothis.text(#2)
\pgfoothis.draw(#3,#4)
}% shortcut method to easily set labels, text and place
% objects
\method set and place(#1,#2,#3) {
\pgfoothis.set label(#1)
\pgfoothis.text(#2)
\pgfoothis.place(#3)
}% shortcut method to easily set the style
\method set style(#1,#2,#3) {
\pgfoothis.set border color(#1)
\pgfoothis.set top color(#2)
\pgfoothis.set bottom color(#3)
}% shortcut method to easily set the dimensions
\method set dimensions(#1,#2,#3) {
\pgfoothis.set width(#1)
\pgfoothis.set height(#2)
\pgfoothis.set text width(#3)
}% appositi metodi di connessione
\method connect(#1,#2) {
\draw[->] (#1)–(#2);
}\method multi connect(#1) {
\foreach \i in {#1}{
\draw[->] (\pgfoovalueof{label})–(\i);
}
}}
\begin{document}
\begin{tikzpicture}[node distance=4.5cm,scale=0.75, transform shape]
% declaring the new object with the constructor method
\pgfoonew \mod=new module()% method set style:
% #1= border color
% #2= top color
% #3= bottom color
\mod.set style(black,white,white)% method set and draw:
% #1= label of the node
% #2= text
% #3,#4= coordinates
\mod.set and draw(mod1,Bisogni educativi speciali,20,0)% \mod.set style(blue!50!cyan,blue!50!cyan!40,blue!50!cyan!5)
% method set dimensions:
% #1= module width
% #2= module height
% #3= text width
%\mod.set dimensions(5cm,1cm,4.9cm)% method set and place:
% #1= label of the node
% #2= text
% #3= position with respect to another node identified with a label
\mod.set and place(mod2,{\mbox{Motivi fisici}} ,below left of=mod1)
\mod.set and place(mod3,{\mbox{Motivi biologici}} ,right of=mod2)
\mod.set and place(mod4,{\mbox{Motivi sociali}} ,right of=mod3)
\mod.set and place(mod5,{\mbox{Motivi fisiologici}} ,right of=mod4)
\mod.set and place(mod6,{\mbox{Motivi fisiologici}} ,right of=mod5)% l'ultimo oggetto ha label mod6 quindi no posso usare multi connect
% \mod.multi connect(mod1,mod2,mod3,mod4,mod5)
% prova per capire cosa succede\mod.connect(mod1,mod2)
\mod.connect(mod1,mod3)
\mod.connect(mod1,mod4)
\mod.connect(mod1,mod5)
\mod.connect(mod1,mod6)\end{tikzpicture}
\end{document}
`
Ciao
Claudio
::
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.::Liverpool” post=81546 @cfiandra, ma qual è lo scopo di aggiornare il contatore, se fuori dal ciclo non viene più utilizzato?
Il contatore serve “solo” in questo punto:`
\draw[fill=\couleur!\mydensity] (A)–(B)–(C)–cycle;
` in cui in sostanza ad ogni ciclo rende il colore di sfondo progressivamente più scuro. Ad esempio:`
\x=1 => fill=\couleur!30
\x=3 => fill=\couleur!50
…
\x=15 => fill=\couleur!170
` Nota che, appena fuori dal ciclo, c’è un iniziale:`\draw[fill=\couleur!\thedensity] (A) — (B) — (C) — cycle;
` il cui valore di colore di sfondo è 20.Ciao
Claudio
::robitex” post=81539Bellissimo intervento molto interessante.
La programmazione oop nell’articolo su Ars si basava su Lua. Nel tuo intervento invece si basa solo su pdftex appoggiandosi alle librerie TikZ.
E la prima volta che vedo un esempio pratico delle capacità oop di TikZ.
R.Direi che al momento è una cosa ancora tutta da esplorare! 🙂
Infatti, come dicevo, in alcuni ambiti ha una potenzialità notevole ed è di facile utilizzo, immediato direi, ma fatico ancora a trovare un metodo per alberi o matrici che hanno una sintassi particolare. Magari in futuro rivedrò la mia posizione 😉
Ah.. un secondo esempio di utilizzo si può trovare in Make picture background transparent in beamer.
Ciao
Claudio
-
AutoreRisposte