- Questo topic ha 20 risposte, 7 partecipanti ed è stato aggiornato l'ultima volta 13 anni, 4 mesi fa da
Andrea Carpignani.
-
CreatoreTopic
-
21 Aprile 2013 alle 15:59 #85169::
Salve a tutti!Ho fatto un codice per lo spettro elettromagnetico con TikZ in una maniera piuttosto artigianale: ho fatto tanti rettangoli con a destra un colore e a sinistra un altro usando il comando \shade. Ho poi visto sulle guide tematiche GuIT il manuale TikZ per ingegneri, dove lo spettro è fatto costruendo ex novo uno shading. Ho provato a ricalcare parte del codice (peraltro simile a quello della guida TikZ) ma mi ha dato un problema di compilazione, che riporto in calce. Non capisco cosa sia successo.
`
Use of \pgf@grabcolor doesn't match its definition.
…green); color(65bp)=(yellow); color
(75bp)=(red); color (100bp…
l.358 color (75bp)=(red); color (100bp)=(red)}
`Il codice che ho scritto ed usato è questo (reso quasi minimale, perché dentro il file c’è tanta altra roba):
`
% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = pdflatex
%%%%%%
%%%%%%
\documentclass[10pt,fleqn,oneside]{article}%— Testo
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}%— Pacchetti utili
\usepackage{lmodern}
\usepackage{microtype}
\usepackage[dvipsnames*,svgnames]{xcolor}
\usepackage{pgf,tikz}
\usetikzlibrary{shadings}
\usetikzlibrary{arrows}
\usetikzlibrary{circuits}
\usetikzlibrary{positioning}
\usetikzlibrary{fadings}
\usetikzlibrary{matrix}
\usetikzlibrary{patterns}
\usetikzlibrary{decorations.markings}
\usetikzlibrary{decorations.pathmorphing}\begin{document}
\begin{tikzpicture}
\pgfdeclarehorizontalshading{rainbow}{100bp}
{color(0bp)=(violet); color(25bp)=(violet); color(35bp)=(blue);
color(45bp)=(cyan); color(55bp)=(green); color(65bp)=(yellow);
color (75bp)=(red); color (100bp)=(red)}
\shade[draw,shading=rainbow] (2,-4) rectangle node[above=1cm] {visibile} (10,-2);
\end{tikzpicture}
\end{document}
`Avevo anche visto un altro metodo per fare lo spettro (ma senza usare TikZ), dando i colori direttamente con la frequenza con \color[wave]{555} che mi consentirebbe di automatizzare un po’ la cosa. Qualcuno potrebbe dirmi cos’è successo al modello del codice di “TikZ per ingegneri” e se c’è un modo semplice per fare lo spettro dando le frequenze con il comando \foreach??
Grazie,
Andrea
-
CreatoreTopic
-
AutoreRisposte
-
-
21 Aprile 2013 alle 16:35 #85170::
logos” post=84571Salve a tutti!
Ho fatto un codice per lo spettro elettromagnetico con TikZ in una maniera piuttosto artigianale: ho fatto tanti rettangoli con a destra un colore e a sinistra un altro usando il comando \shade. Ho poi visto sulle guide tematiche GuIT il manuale TikZ per ingegneri, dove lo spettro è fatto costruendo ex novo uno shading. Ho provato a ricalcare parte del codice (peraltro simile a quello della guida TikZ) ma mi ha dato un problema di compilazione, che riporto in calce. Non capisco cosa sia successo.
`
Use of \pgf@grabcolor doesn't match its definition.
…green); color(65bp)=(yellow); color
(75bp)=(red); color (100bp…
l.358 color (75bp)=(red); color (100bp)=(red)}
`Scrivendo
`\makeatletter
\show\pgf@grabcolor`
viene mostrata la definizione di quel comando:
`> \pgf@grabcolor=macro:
color(#1)=(#2)->\pgfutil@colorlet {pgf@tempcol}{#2}\pgfutil@extractcolorspec {p
gf@tempcol}{\pgf@tempcolor }\expandafter \pgfutil@convertcolorspec \pgf@tempcol
or {rgb}{\pgf@rgbcolor }\expandafter \pgf@convgetrgb@ \expandafter {\pgf@rgbcol
or }{#1}.
l.28 \show\pgf@grabcolor`
Per come è definito, non vuole spazi attorno alle parentesi tonde né all’uguale. Sei stato fortunato che hai messo lo spazio appena prima della tonda, se lo avessi messo dopo quell'[tt]#1[/tt] oppure attorno all’uguale l’errore sarebbe stato sicuramente più incomprensibile… 😀Ciao,
Antonio
-
21 Aprile 2013 alle 16:50 #85171::
OK, sono completamente sconvolto! Io non ci sarei mai arrivato!!Questa pignoleria del TikZ non mi sorprende visto che pacchetto pignolo è, ma mi ha comunque lasciato interdetto! Vi mostro lo spettro per come l’ho fatto. Vorrei fare un ulteriore aggiustamento: mi piacerebbe che anche lo spazio bianco tra le linee curve che fanno da zoom per il visibile fosse fatta ad arcobaleno, ma con un’opacità del 50%. Son convinto che non basti farne una curva chiusa e usare shade con il raimbow per farlo, vero?
Ciao,
Andrea
`
% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = pdflatex
%%%%%%%
%%%%%%%
%%%%%%%
%%%%%%%
\documentclass[10pt,fleqn,oneside]{article}\usepackage[a4paper]{geometry}
\geometry{height=210mm,width=145mm}%— Testo
\usepackage[LGRx,T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}%— Pacchetti utili
\usepackage{lmodern}
\usepackage{amsmath,amssymb,amsthm,bm}
\usepackage{siunitx}
\sisetup{text-micro=\textgreek{m},
math-micro=\textgreek{m}}
\usepackage{microtype}
\usepackage[dvipsnames*,svgnames]{xcolor}
\usepackage{pgf,tikz}
\usetikzlibrary{shadings}
\usepackage{caption}
\captionsetup{font=footnotesize,format=hang,
labelfont={bf},labelsep=period}%%%%%%%
%%%%%%%
%%%%%%%%— Inizio del documento:
\begin{document}
%%%%%%
%%%%%%
%%%%%%\begin{center}
\begin{tikzpicture}[scale=0.88,font=\footnotesize,
line cap=round,
line join=round,
x=1.0cm,y=1.0cm]
% Spectrum
\pgfdeclarehorizontalshading{rainbow}{100bp}{
color(0bp)=(violet); color(25bp)=(violet);
color(35bp)=(blue); color(45bp)=(cyan);
color(55bp)=(green); color(65bp)=(yellow);
color(75bp)=(red); color(100bp)=(red)}
\shade[shading=rainbow] (0,0) rectangle (9,1);\draw[very thin] (0,0) rectangle (9,1);
\draw (0,0) — (9,0);
\foreach \x in {0,0.5,…,9} \draw[thin] (\x,0) — (\x,-0.1);
\foreach \x/\num in {0.5/400,3/500,5.5/600,8/700}
\draw[semithick] (\x,0) — (\x,-0.2)
node[below,font=\tiny] {$\SI{\num}{\nano\meter}$};
%% Altro spettro
\fill[black] (-2.5,3) — (12.5,3) — (13,3.5) — (12.5,4) — (-2.5,4) — (-3,3.5) — cycle;
% Microvisibile
\shade[shading=rainbow] (3,3) rectangle (3.35,4);
% Linee di collegamento
\draw[thin] (3,2.95) ..controls +(-90:1.5) and +(20:1).. (0,1.05);
\draw[thin] (3.35,2.95) ..controls +(-90:1.5) and +(170:1.2).. (9,1.05);
%
\foreach \x in {-2,-1,…,12} \draw (\x,3) — (\x,2.9);
%\foreach \x in {-2,-1,…,12} \draw (\x,4) — (\x,4.1);
\begin{scope}[font=\tiny]
% Scala dello spettro
\node[below] at (-2,2.9) {$\SI{0.001}{\nano\meter}$};
\node[below] at (1,2.9) {$\SI{1}{\nano\meter}$};
\node[below] at (4,2.9) {$\SI{1000}{\nano\meter}$};
\node[below] at (7,2.9) {$\SI{1}{\milli\meter}$};
\node[below] at (8,2.9) {$\SI{1}{\meter}$};
\node[below] at (10,2.9) {$\SI{1}{\kilo\meter}$};
\begin{scope}
% Nome delle onde
\nodeat (-2.2,3.6)
{\begin{minipage}[t]{1cm}raggi\\cosmici\end{minipage}};
\nodeat (-0.7,3.6)
{\begin{minipage}[t]{1cm}raggi\\gamma\end{minipage}};
\nodeat (0.6,3.6)
{\begin{minipage}[t]{1cm}raggi X\\\null\end{minipage}};
\nodeat (2.1,3.6)
{\begin{minipage}[t]{1cm} UV\\\null\end{minipage}};
\nodeat (3.4,3.6)
{\begin{minipage}[t]{1.2cm}\centering infrarosso\\(IR)\end{minipage}};
\nodeat (4.8,3.6)
{\begin{minipage}[t]{1.2cm}microonde\\\null\end{minipage}};
\nodeat (6.6,3.6)
{\begin{minipage}[t]{1cm}radar\\\null\end{minipage}};
\nodeat (7.6,3.6)
{\begin{minipage}[t]{2cm}radio\\\null\end{minipage}};
\nodeat (9.6,3.6)
{\begin{minipage}[t]{1cm}banda\\larga\end{minipage}};
\end{scope}
\end{scope}
\end{tikzpicture}
\end{center}\end{document}
`
-
21 Aprile 2013 alle 19:10 #85172::
logos” post=84574OK, sono completamente sconvolto! Io non ci sarei mai arrivato[/code]
Lo so certe volte è difficile, ma è quello che succede con gli argomenti delimitati. Perché qualche scrittore di pacchetti usa macro con argomenti delimitati, se sono cosi pignoli nella loro sintassi? perché in certe circostanze sono insostituibili. Questa di \color evidentemente è una di quelle.
Leggiti quel mio articolo su ArsTeXnica, qui nel sito a disposizione di tutti i frequentatori del sito; l’articolo riguarda le macro con argomenti delimitati. spiega come funzionano e mostra qualche esempio.
-
22 Aprile 2013 alle 6:42 #85173::
logos” post=84574Vorrei fare un ulteriore aggiustamento: mi piacerebbe che anche lo spazio bianco tra le linee curve che fanno da zoom per il visibile fosse fatta ad arcobaleno, ma con un’opacità del 50%. Son convinto che non basti farne una curva chiusa e usare shade con il raimbow per farlo, vero?
Invece basta 🙂
Ho anche apportato qualche miglioria al codice che vado poi a spiegare più nel dettaglio probabilmente questa sera: `
\documentclass[dvipsnames*,svgnames]{article}%— Testo
\usepackage[LGRx,T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}%— Pacchetti utili
\usepackage{siunitx}%— TikZ e impostazioni
\usepackage{tikz}
\usetikzlibrary{shadings}% Spectrum-def
\pgfdeclarehorizontalshading{rainbow}{100bp}{
color(0bp)=(violet); color(25bp)=(violet);
color(35bp)=(blue); color(45bp)=(cyan);
color(55bp)=(green); color(65bp)=(yellow);
color(75bp)=(red); color(100bp)=(red)}\tikzset{math mode/.style={
execute at begin node=$,
execute at end node=$,
}
}%— Inizio del documento:
\begin{document}
%%%%%%
%%%%%%
%%%%%%\begin{center}
\begin{tikzpicture}[scale=0.88,font=\footnotesize,
line cap=round,
line join=round,
x=1.0cm,y=1.0cm]
% Spectrum
\shade[shading=rainbow] (0,0) rectangle (9,1);\draw[very thin] (0,0) rectangle (9,1);
\draw (0,0) — (9,0);
\foreach \x in {0,0.5,…,9} \draw[thin] (\x,0) — (\x,-0.1);
\foreach \x/\num in {0.5/400,3/500,5.5/600,8/700}{
\draw[semithick] (\x,0) — (\x,-0.2)
node[below,font=\tiny,math mode] {\SI{\num}{\nano\meter}};
}
%% Altro spettro
\fill[black] (-2.5,3) — (12.5,3) — (13,3.5) — (12.5,4) — (-2.5,4) — (-3,3.5) — cycle;
% Microvisibile
\shade[shading=rainbow] (3,3)coordinate(x1) rectangle (3.35,4);
% Linee di collegamento
\draw[thin] (3,3) ..controls +(-90:1.5) and +(20:1).. (0,1)coordinate(z1);
\draw[thin] (3.35,3)coordinate(x2) ..controls +(-90:1.5) and +(170:1.2).. (9,1)coordinate(z2);% Colorazione dello spazio bianco
\shade[shading=rainbow,opacity=0.4] (3,3)..controls +(-90:1.5) and +(20:1).. (0,1) — (9,1) ..controls +(170:1.2) and +(-90:1.5)..(3.35,3)–cycle;\foreach \x in {-2,-1,…,12} \draw (\x,3) — (\x,2.9);
\begin{scope}[font=\tiny, below, math mode]
% Scala dello spettro
\node at (-2,2.9) {\SI{0.001}{\nano\meter}};
\node at (1,2.9) {\SI{1}{\nano\meter}};
\node at (4,2.9) {\SI{1000}{\nano\meter}};
\node at (7,2.9) {\SI{1}{\milli\meter}};
\node at (8,2.9) {\SI{1}{\meter}};
\node at (10,2.9) {\SI{1}{\kilo\meter}};
\end{scope}
\begin{scope}[right,font=\tiny,right,color=white, text width=1cm]
% Nome delle onde
\node at (-2.2,3.6)
{raggi cosmici};
\node at (-0.7,3.6)
{raggi gamma};
\node at (0.6,3.6)
{raggi X \phantom{gamma}};
\node at (2.1,3.6)
{UV \phantom{gamma}};
\node at (3.4,3.6)
{\centering infrarosso (IR)};
\node at (4.8,3.6)
{microonde \phantom{gamma}};
\node at (6.6,3.6)
{radar \phantom{gamma}};
\node at (7.6,3.6)
{radio \phantom{gamma}};
\node at (9.6,3.6)
{banda larga};
\end{scope}
\end{tikzpicture}
\end{center}\end{document}
` Il risultato:[attachment=680]Senzanome_2013-04-22.jpg[/attachment]
Ciao
Claudio
Attachments:
You must be logged in to view attached files. -
22 Aprile 2013 alle 6:53 #85174::
Ciao,
perché usi \phantom{gamma}?Sul disegno molto professionale come sempre, faccio alcune osserazioni.
Forse la freccia nera con i testi bianchi indicanti i campi di frequenza della radiazione luminosa al di fuori della luce visibile, è un po’ troppo impegnativo, mentre eviterei il riempimento dell’area compresa tra le linee curve di esplosione dello spettro visibile.
R.
-
22 Aprile 2013 alle 9:55 #85175::
Grazie a tutti dei commenti e degli aiuti.La striscia colorata mi sembrava bella per vedere lo zoom. Però così come l’hai costruita non funziona! Sarebbe bella se fosse sfumata dal violetto al rosso anche in cima. Invece, per come è fatta in questo momento, in altro è tutta azzurro-verdognola e non si vede la sfumatura di tutti i colori. Per spiegarmi meglio, provo a raccontare cosa vorrei vedere in maniera discreta (non sfumata): se nella freccia nera ci sono viola, blu, ciano, verde, arancione, giallo rosso, e sotto idem ma su un rettangolo più grosso, sarebbe bello vi fosse una specie di trapezio opaco al 50% che collega parte piccola viola a parte grande viola, parte piccola blu con parte grossa blu, ecc.
Togliendo le curve di Bezier, e sostituendole con righe dritte, potrei farla con tanti trapezi monocromati, ma uno spettro è sfumato, non fatto di rettangoli monocromatici. Per questo speravo fosse possibile fare uno shading trapezioidale in maniera tale da vedere “aprirsi” la sfumatura.
Non so se si potrà fare…
Ciao e grazie,
Andrea
-
22 Aprile 2013 alle 10:25 #85176
-
22 Aprile 2013 alle 15:24 #85177::
Rispondo a Roberto ed Andrea e poi commento il codice del messaggio precedente.robitex” post=84587Ciao,
perché usi \phantom{gamma}?Dunque, nel codice originale c’erano dei [tt]\null[/tt] che non conosco come comando, ma ho intuito che lo scopo era quello di “far occupare” spazio nella riga successiva i [tt]\\[/tt]: in questo modo tutti i testi erano “allineati” in alto e quelli corti non centralmente. Stesso fine del comando [tt]\phantom[/tt], ma occorre avere buon senso nel scegliere l’argomento: io ho scelto [tt]gamma[/tt] perché era l’unica parola con una [tt]g[/tt] e pertanto permette di “far occupare” il giusto spazio. Teoricamente però se si ri-usano [tt]\\ \null[/tt] dovrebbe andare bene comunque.
logos” post=84592La striscia colorata mi sembrava bella per vedere lo zoom. Però così come l’hai costruita non funziona! Sarebbe bella se fosse sfumata dal violetto al rosso anche in cima. Invece, per come è fatta in questo momento, in altro è tutta azzurro-verdognola e non si vede la sfumatura di tutti i colori. Per spiegarmi meglio, provo a raccontare cosa vorrei vedere in maniera discreta (non sfumata): se nella freccia nera ci sono viola, blu, ciano, verde, arancione, giallo rosso, e sotto idem ma su un rettangolo più grosso, sarebbe bello vi fosse una specie di trapezio opaco al 50% che collega parte piccola viola a parte grande viola, parte piccola blu con parte grossa blu, ecc.
Togliendo le curve di Bezier, e sostituendole con righe dritte, potrei farla con tanti trapezi monocromati, ma uno spettro è sfumato, non fatto di rettangoli monocromatici. Per questo speravo fosse possibile fare uno shading trapezioidale in maniera tale da vedere “aprirsi” la sfumatura.
Direi che non avevo ben capito io cosa intendevi. In questo caso, per quanto ne so io non si riesce a fare, ma se a) trovi una funzione adatta, b) conosci il PostScript forse riesci a tirare fuori qualcosa dalla sotto sezione 83.2.3 General (Functional) Shadings del pgfmanual.
Il “problema” è che al momento l’ombreggiatura è definita a partire da un rettangolo, quindi utilizzandola in una forma chiusa stretta in alto e ampia in basso, automaticamente la parte in basso viene usata come parametro di “normalizzazione”. Di conseguenza, nella parte stretta in alto vedi solo parte dell’ombreggiatura perché in realtà è come se in sfondo ci fosse un rettangolo in cui tutto è tagliato tranne la forma chiusa.
Commenti al codice
Per prima cosa, non era un vero esempio “minimo” (qualche pacchetto poteva essere levato). 😉In genere, preferisco tenere nel preambolo dichiarazioni di ombreggiature e stili. Attenzione anche a caricare [tt]xcolor[/tt]: è meglio passare le opzioni direttamente fra quelle di classe per evitare che copiando/spostando l’ordine di caricamento dei pacchetti si incappi nel classico [tt]option clash[/tt].
Per evitare di impazzire a mettere i $ per la modalità matematica, è possibile definirsi un semplicissimo stile: `
\tikzset{math mode/.style={
execute at begin node=$,
execute at end node=$,
}
}
` A questo punto, passare [tt]math mode[/tt] come opzione a [tt]scope[/tt]: `\begin{scope}[font=\tiny, below, math mode]
% Scala dello spettro
\node at (-2,2.9) {\SI{0.001}{\nano\meter}};
\node at (1,2.9) {\SI{1}{\nano\meter}};
\node at (4,2.9) {\SI{1000}{\nano\meter}};
\node at (7,2.9) {\SI{1}{\milli\meter}};
\node at (8,2.9) {\SI{1}{\meter}};
\node at (10,2.9) {\SI{1}{\kilo\meter}};
\end{scope}` permette di risparmiare un po’ di fatica. In quel caso, ho anche levato [tt]below[/tt] da tutti i nodi: passandolo a [tt]scope[/tt] è sempre valido.Discorso delle [tt]minipage[/tt]s: con TikZ se ne può fare a meno. Infatti, l’opzione [tt]text width[/tt] automaticamente manda a capo il testo. Pertanto ho sfoltito decisamente il codice, ma ho lasciato un errorino: infatti, per [tt]infrarosso (IR)[/tt] ho lasciato un [tt]\centering[/tt] che non produce effetti. Siccome nelle opzioni di [tt]scope[/tt] l’allineamento è a destra (default per tutti i nodi), per renderlo centrale ci sono due strade: [tt]align=center[/tt] oppure [tt]text centered[/tt] (mi pare sia una vecchia chiave, ma non so se deprecata o meno). Quindi: `
\begin{scope}[right,font=\tiny,right,color=white, text width=1cm]
% Nome delle onde
\node at (-2.2,3.6)
{raggi cosmici};
\node at (-0.7,3.6)
{raggi gamma};
\node at (0.6,3.6)
{raggi X \phantom{gamma}};
\node at (2.1,3.6)
{UV \phantom{gamma}};
\node[align=center] at (3.4,3.6)
{infrarosso (IR) };
\node at (4.8,3.6)
{microonde \phantom{gamma}};
\node at (6.6,3.6)
{radar \phantom{gamma}};
\node at (7.6,3.6)
{radio \phantom{gamma}};
\node at (9.6,3.6)
{banda larga};
\end{scope}
`
Ciao
Claudio
-
22 Aprile 2013 alle 15:45 #85178::
Caro Claudio,Grazie mille per i commenti al codice. Ho imparato molte cose dai tuoi aggiustamenti, anche se ancora mi sfugge qualcosa. Se non devo chiamare il pacchetto xcolor perché già caricato da TikZ, tu hai messo le opzioni all’inizio della classe: è un procedimento generale? Se un pacchetto viene caricato da un altro, le opzioni di quello caricato in automatico si mettono nelle opzioni della classe? O vale solo per xcolor?
Per quanto riguarda lo shading che volevo fare, a me andrebbe bene anche con un trapezio anziché con una curva di Bezier: in quel caso si potrà fare facilmente, magari centrando lo spettro visibile ingrandito in modo che il trapezio sia equilatero? Anche in quel caso bisogna usare una funzione generale oppure è più semplice?
Mi scuso per le domande forse un po’ ovvie leggendo attentamente la guida TikZ, ma io conosco pochissimo l’inglese e non riesco a decifrare la guida se la parte non ha un esempio simile a quello che voglio fare, visto che in quel caso, manipolando l’esempio, mi rendo conto empiricamente di cosa succede! È un po’ broccione fare così, ma non credo riuscirò mai ad imparare l’inglese… e questo, suo malgrado, @OldClaudio lo sa fin troppo bene 🙁
Ciao e grazie,
Andrea
-
22 Aprile 2013 alle 15:51 #85179::
cfiandra” post=84613Rispondo a Roberto ed Andrea e poi commento il codice del messaggio precedente.
Ciao,
perché usi \phantom{gamma}?Dunque, nel codice originale c’erano dei [tt]\null[/tt] che non conosco come comando, ma ho intuito che lo scopo era quello di “far occupare” spazio nella riga successiva i [tt]\\[/tt]: in questo modo tutti i testi erano “allineati” in alto e quelli corti non centralmente. Stesso fine del comando [tt]\phantom[/tt], ma occorre avere buon senso nel scegliere l’argomento: io ho scelto [tt]gamma[/tt] perché era l’unica parola con una [tt]g[/tt] e pertanto permette di “far occupare” il giusto spazio. Teoricamente però se si ri-usano [tt]\\ \null[/tt] dovrebbe andare bene comunque.
Non basta l’opzione:
`text depth=0pt`
🙂
R.
-
22 Aprile 2013 alle 15:58 #85180::
Scusate: il giallo a 670 nanometri? Ma che spettro è?! I colori dovrebbero rispettare i rapporti tra le frequenze/lunghezze d’onda.
Perché poi, ad essere pignoli come un professore di Fisica degli anni 60, il colore è una caratteristica che dipende dalla frequenza e non dalla lunghezza d’onda.Ciao
P.S. vado a bermi la mia camomilla!
-
22 Aprile 2013 alle 16:10 #85181::
Liverpool” post=84620Scusate: il giallo a 670 nanometri? Ma che spettro è?! I colori dovrebbero rispettare i rapporti tra le frequenze/lunghezze d’onda.
Perché poi, ad essere pignoli come un professore di Fisica degli anni 60, il colore è una caratteristica che dipende dalla frequenza e non dalla lunghezza d’onda.Ciao
P.S. vado a bermi la mia camomilla!
Colpa mia: avevo messo le frequenze sopra e le lunghezze d’onda sotto, ma con gli aggiustamenti ho tolto le frequenze e non ho sostituito le lunghezze d’onda con le frequenze. Nella prima brocciona prova che avevo fatto ero stato attento al rapporto tra i colori e le lunghezze d’onda (nel vuoto), ma avevo fatto tanti rettangoli e gestivo meglio le distanze tra i punti ora lo spettro è un po’ dilatato rispetto a prima. Proverò a sistemarlo.
Andrea
-
22 Aprile 2013 alle 16:23 #85182::
Questa configurazione dello shading dovrebbe fornire lo spettro più aderente alla realtà. L’ho fatto empiricamente, sicché probabilmente si può fare molto meglio!`
% Spectrum-def
\pgfdeclarehorizontalshading{rainbow}{100bp}{
color(0bp)=(violet); color(25bp)=(violet);
color(35bp)=(blue); color(40bp)=(cyan);
color(50bp)=(green); color(53bp)=(yellow);
color(63bp)=(red); color(100bp)=(DarkRed!40!black)}
`Ciao,
Andrea
-
22 Aprile 2013 alle 17:07 #85183::
logos” post=84622Colpa mia: avevo messo le frequenze sopra e le lunghezze d’onda sotto, ma con gli aggiustamenti ho tolto le frequenze e non ho sostituito le lunghezze d’onda con le frequenze.
Tranquillo! Le lunghezze d’onda per i colori le usano tutti, anche i Fisici.
Ma quanto ti serve essere preciso? Perché sul manuale di [tt]xcolor[/tt] nel paragrafo 6.3.12 ci sono le formule utilizzate per convertire i colori dalle lunghezze d’onda alle terne rgb che puoi usare nella lista di colori dell’ombreggiatura. Potresti costruirti una funzione definita a tratti utilizzando quelle formule e provare con un ciclo a riempire tutto lo spettro.
Oppure, se hai fretta, potresti sceglierti poche lunghezze d’onda (diciamo una decina), ricavarti manualmente i corrispondenti valori rgb ed utilizzarli per lo spazio di colore, rispettando i rapporti tra le lunghezze d’onda.Ciao
-
22 Aprile 2013 alle 17:22 #85184::
Liverpool” post=84627
Colpa mia: avevo messo le frequenze sopra e le lunghezze d’onda sotto, ma con gli aggiustamenti ho tolto le frequenze e non ho sostituito le lunghezze d’onda con le frequenze.
Tranquillo! Le lunghezze d’onda per i colori le usano tutti, anche i Fisici.
Ma quanto ti serve essere preciso? Perché sul manuale di [tt]xcolor[/tt] nel paragrafo 6.3.12 ci sono le formule utilizzate per convertire i colori dalle lunghezze d’onda alle terne rgb che puoi usare nella lista di colori dell’ombreggiatura. Potresti costruirti una funzione definita a tratti utilizzando quelle formule e provare con un ciclo a riempire tutto lo spettro.
Oppure, se hai fretta, potresti sceglierti poche lunghezze d’onda (diciamo una decina), ricavarti manualmente i corrispondenti valori rgb ed utilizzarli per lo spazio di colore, rispettando i rapporti tra le lunghezze d’onda.Ciao
Il metodo che hai appena citato era proprio quello che avrei voluto fare. Però non sono stato in grado di fare un ciclo perché non so come far collimare il comando [tt]\color[wave]{555}[/tt] con l’opzione fill all’interno di un rettangolo, oppure per fare uno shading ad hoc.
Volendo rispondere alla tua domanda: fosse per me, sarei preciso fino al massimo dell’umanamente possibile!
Ciao,
Andrea
-
22 Aprile 2013 alle 20:31 #85185::
logos” post=84628non so come far collimare il comando [tt]\color[wave]{555}[/tt] con l’opzione fill all’interno di un rettangolo, oppure per fare uno shading ad hoc.
Se vuoi usare il modello [tt]wave[/tt] in [tt]TikZ[/tt], devi caricare prima il pacchetto [tt]xcolor[/tt] con l’opzione [tt]rgb[/tt] in modo tale che i colori vengano convertiti direttamente nello spazio di colore rgb, che è supportato direttamente da [tt]TikZ[/tt] (al contrario di wave).
Se ho ben capito, tu avresti voluto fare una cosa del genere (puoi aumentare o ridurre a piacere il numero di colori):
`\documentclass{standalone}
\usepackage[rgb]{xcolor}
\usepackage{tikz}
\usetikzlibrary{arrows}
\usepackage{siunitx}
\def\n{400} % numero di colori
\def\x{10cm} % lunghezza dello spettro\begin{document}
\begin{tikzpicture}
\foreach \i in {1,…,\n} {
\pgfmathsetmacro{\L}{380+400/(\n-1)*(\i-1)}
\definecolor{temp}{wave}{\L}
\fill ({(\i-1)/\n*\x},0) rectangle +({\x/\n},1cm);
}
\drawnode [below=1cm, font=\footnotesize] {$\frac{\nu}{\SI{1}{THz}}$}
(0,-1) — (\x,-1) node [above, font=\footnotesize] {$\frac{\lambda_0}{\SI{1}{nm}}$};
\foreach \i in {400,450,…,750}
\draw ({(\i-380)/400*\x},-0.95) — +(0,-0.05) node [above, font=\footnotesize] {\i};
\foreach \i in {750,700,…,400}
\draw ({(789.47-\i)/404.86*\x},-1.05) — +(0,0.05) node [below, font=\footnotesize] {\i};
\end{tikzpicture}
\end{document}`[attachment=684]prova1.png[/attachment]
Occhio che, se provi a rasterizzare l’immagine, potresti avere l’effetto indesiderato “mille righe”, che puoi avere anche su alcuni visualizzatori rapidi ma meno accurati. Se hai questo problema, sostituisci il [tt]fill[/tt] con questa riga:
`\fill ({(\i-1)/\n*\x},0) rectangle +({\x/\n+0.2pt},1cm);`
nella quale il valore di 0.2 punti (7 centesimi di millimetro) è aggiunto proprio per coprire eventuali “buchi”. E per essere proprio pignoli, subito dopo il primo ciclo inserisci questa riga che serve a rimuovere l’ultima linea spuria di 0.2 punti:
`\draw [white, line width=0.2pt] ({\x+0.1pt},0) — +(0,1cm);`
CiaoOsservazione: nei calcoli le divisioni precedono le moltiplicazioni per evitare di sforare la dimensione massima consentita da TikZ che, se non sbaglio, è intorno a 19 piedi.
Attachments:
You must be logged in to view attached files. -
23 Aprile 2013 alle 6:57 #85186::
robitex” post=84618
Rispondo a Roberto ed Andrea e poi commento il codice del messaggio precedente.
[quote=”robitex” post=84587]Ciao,
perché usi \phantom{gamma}?Dunque, nel codice originale c’erano dei [tt]\null[/tt] che non conosco come comando, ma ho intuito che lo scopo era quello di “far occupare” spazio nella riga successiva i [tt]\\[/tt]: in questo modo tutti i testi erano “allineati” in alto e quelli corti non centralmente. Stesso fine del comando [tt]\phantom[/tt], ma occorre avere buon senso nel scegliere l’argomento: io ho scelto [tt]gamma[/tt] perché era l’unica parola con una [tt]g[/tt] e pertanto permette di “far occupare” il giusto spazio. Teoricamente però se si ri-usano [tt]\\ \null[/tt] dovrebbe andare bene comunque.
Non basta l’opzione:
`text depth=0pt`
🙂
R.[/quote] Ah… ecco un’opzione che non avevo ancora usato 🙂 Si, in effetti è notevolmente più comodo così: `
\begin{scope}[right,font=\tiny,right,color=white, text width=1cm,text depth=0pt]
% Nome delle onde
\node at (-2.2,3.6)
{raggi cosmici};
\node at (-0.7,3.6)
{raggi gamma};
\node at (0.6,3.6)
{raggi X};
\node at (2.1,3.6)
{UV};
\node[align=center] at (3.4,3.6)
{infrarosso (IR) };
\node at (4.8,3.6)
{microonde};
\node at (6.6,3.6)
{radar};
\node at (7.6,3.6)
{radio};
\node at (9.6,3.6)
{banda larga};
\end{scope}
`Ciao
Claudio
-
23 Aprile 2013 alle 6:59 #85187
-
23 Aprile 2013 alle 7:10 #85188::
logos” post=84616Caro Claudio,
Grazie mille per i commenti al codice. Ho imparato molte cose dai tuoi aggiustamenti, anche se ancora mi sfugge qualcosa. Se non devo chiamare il pacchetto xcolor perché già caricato da TikZ, tu hai messo le opzioni all’inizio della classe: è un procedimento generale? Se un pacchetto viene caricato da un altro, le opzioni di quello caricato in automatico si mettono nelle opzioni della classe? O vale solo per xcolor?
Onestamente è un procedimento che ho visto solo con [tt]xcolor[/tt] e TikZ/pgfplots perciò ad intuizione direi che vale quando un pacchetto [tt]x[/tt] viene caricato da un altro senza opzioni particolari e nel documento si carica [tt]x[/tt] con opzioni diverse.
logos” post=84616
Per quanto riguarda lo shading che volevo fare, a me andrebbe bene anche con un trapezio anziché con una curva di Bezier: in quel caso si potrà fare facilmente, magari centrando lo spettro visibile ingrandito in modo che il trapezio sia equilatero? Anche in quel caso bisogna usare una funzione generale oppure è più semplice?Purtroppo no, nel senso che PGF definisce solo 3 tipi di shading: orizzontale, verticale e radiale. Capisco che con il trapezio sembri più facile, ma non è così. La mia osservazione è sempre valida: l’ombreggiatura tiene come riferimento la parte più ampia della forma. Prova a compilare questo esempio e capirai cosa intendo:`
\documentclass[dvipsnames*,svgnames,border=10pt,tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}% Spectrum-def
\pgfdeclarehorizontalshading{rainbow}{100bp}{
color(0bp)=(violet); color(25bp)=(violet);
color(35bp)=(blue); color(40bp)=(cyan);
color(50bp)=(green); color(53bp)=(yellow);
color(63bp)=(red); color(100bp)=(DarkRed!40!black)}\begin{document}
\begin{tikzpicture}
\node[minimum width=8.65cm,minimum height=4cm,rectangle, shading=rainbow,draw,ultra thick](x){};
\node[minimum size=4cm,trapezium, shading=rainbow,draw,ultra thick]at (x.center){};
\end{tikzpicture}\end{document}
` Il trapezio viene disegnato sopra un rettangolo e i due hanno la stessa base.Ciao
Claudio
-
23 Aprile 2013 alle 18:51 #85189
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.