diff --git a/quad10/fenomens/lab/p4/graphs/dependenciaEnL.gnu b/quad10/fenomens/lab/p4/graphs/dependenciaEnL.gnu
index a1a1ae8..8c04f2c 100755
--- a/quad10/fenomens/lab/p4/graphs/dependenciaEnL.gnu
+++ b/quad10/fenomens/lab/p4/graphs/dependenciaEnL.gnu
@@ -1,104 +1,352 @@
 #!/usr/bin/env -S gnuplot -c
-outputfile = 'data_out/dep_en_L_graphs/' # Nom de la imatge resultant (sense extensió)
-datafilepre = 'data_out/dep_en_L/tmpdata/'
+outputfile = ''
+datafilepre = '../dep_en_L/tmpdata/'
 datafilepost = '.dat'
 LS = ARG1
 
-svgTerminal = "set terminal svg dashed size 800, 800 font \"Computer Modern,Tinos,Helvetica,15\"; pointSize=0.5"
+SPECIAL_L = 32
+ZOOMEDIN = 1 # Whether we want to include zoomed in graphs (1) or not (0)
+USEHACK = 1 # In theory, due to the defaults of run.bash, SUI = 1900*150. But for L=96, we used other values, so setting USEHACK=1 gives a different value for SUMI(96).
+
+# COMPORTAMENT CRÍTIC (extret de l'anàlisi fet a l'informe):
+TC = 2.268
+BETA = 0.13
+GAMMA = 1.77
+
+# All LS except for 96, since it's low quality data.
+PartialLS = system('LS="'. LS .'"; PartialLS=""; for L in $LS; do if [ $L -ne 96 ]; then PartialLS+="$L "; fi; done; echo $PartialLS')
+
+TERMINALS = "svg png tex"
+
+svgTerminal = "set terminal svg size 800, 800 font \"Computer Modern,Tinos,Helvetica,15\"; pointSize=0.5"
 pngTerminal = "set terminal pngcairo size 800, 800 font \"Computer Modern,Tinos,Helvetica,15\"; pointSize=0.7"
+texTerminal = "set terminal cairolatex size 8.5cm, 8.5cm; pointSize=0.7"
 graphStyle = "with linespoints pointsize pointSize"
 
+SUMI(L) = (USEHACK ? (L == 96 ? 1400*16 : 1900*150) : 1900*150)
+suffix(CHOOSEL) = (CHOOSEL == 0 ? '_ALLL' : (CHOOSEL == 1 ? '' : '_L' . SPECIAL_L))
+
 set style line 101 lc rgb '#808080' lt 1 lw 1
 set border 3 front ls 101
 set tics nomirror out scale 0.75
-set style line 102 lc rgb '#d6d7d9' lt 0 lw 1
+set linetype 99963 dashtype (6, 0, 0, 10)
+set style line 102 lc rgb '#d6d7d9' lt 99963 lw 1
 set grid back ls 102
 
-set xlabel "Temperatura (K)"
+set xlabel "T"
 set yrange [*<0:0<*]
 # ------------------------------------
 # Gràfica per la capacitat calorífica:
 # ------------------------------------
-set title "Capacitat calorífica per diferents valors d'L"
+set title ""
 
-@svgTerminal
-set output outputfile.'capacitat_calorifica.svg'
-plot for [L in LS] datafilepre . L . datafilepost using 2:10 @graphStyle title "L = ".L
+# CHOOSEL can be:
+#   - 0: all Ls will be drawn
+#   - 1: all Ls except for 96 will be drawn
+#   - 2: only L=32 will be drawn
+do for [CHOOSEL = 0:2] {
+  do for [TERM in TERMINALS] {
+    if (TERM eq "tex") {
+      @texTerminal
+      set ylabel '$c_V$'
+      title_1 = '$\frac{\text{Var}(e)}{T^2}$'
+      title_1alt = 'L = %d'
+      title_2 = '$\frac{d\langle e \rangle}{dT}$'
+      set key spacing 2
+    } else {
+      set ylabel 'Capacitat calorífica'
+      title_1 = 'Var(e)/T^2'
+      title_1alt = 'L = %d'
+      title_2 = 'd<e>/dT'
+      set key spacing 1.25
+      if (TERM eq "png") {
+        @pngTerminal
+      } else {
+        @svgTerminal
+      }
+    }
 
-@pngTerminal
-set output outputfile.'capacitat_calorifica.png'
-replot
+    set output outputfile.'capacitat_calorifica'.suffix(CHOOSEL).'.'.TERM
+    set yrange [*<0:0<*]
+
+    if (CHOOSEL == 0) {
+      set yrange [0:2.6]
+      plot for [L in LS] datafilepre . L . datafilepost using 2:10 @graphStyle title sprintf(title_1alt, L+0)
+    } else {
+      if (CHOOSEL == 1) {
+        plot for [L in PartialLS] datafilepre . L . datafilepost using 2:10 @graphStyle title sprintf(title_1alt, L+0)
+      } else {
+        plot datafilepre . SPECIAL_L . datafilepost using 2:10 @graphStyle title sprintf(title_1, SPECIAL_L), \
+             datafilepre . SPECIAL_L . '_derivada_E' .datafilepost using 1:($2/(SPECIAL_L**2)) with points pointsize 1.2*pointSize title sprintf(title_2, SPECIAL_L)
+      }
+    }
+  }
+}
+
+set yrange [*<0:0<*]
+set ylabel ""
 
 # ----------------------------------------
 # Gràfica per la susceptibilitat magnètica
 # ----------------------------------------
-set title "Susceptibilitat magnètica per diferents valors d'L"
+set title ""
+
+# CHOOSEL can be:
+#   - 0: all Ls will be drawn
+#   - 1: all Ls except for 96 will be drawn
+#   - 2: only L=32 will be drawn
+do for [CHOOSEL = 0:3] {
+  set ylabel 'Susceptibilitat magnètica'
+
+  @svgTerminal
+  set output outputfile.'susceptibilitat_magnetica'. suffix(CHOOSEL) .'.svg'
+  if (CHOOSEL == 0) {
+    set yrange [0:175]
+    plot for [L in LS] datafilepre . L . datafilepost using 2:11 @graphStyle title "L = ".L
+  } else {
+    if (CHOOSEL == 1) {
+      set yrange [0:75]
+      plot for [L in PartialLS] datafilepre . L . datafilepost using 2:11 @graphStyle title "L = ".L
+    } else {
+      set yrange [0:22]
+      plot datafilepre . SPECIAL_L . datafilepost using 2:11 @graphStyle lc 3 title '$\chi$'
+    }
+  }
+
+  @pngTerminal
+  set output outputfile.'susceptibilitat_magnetica'. suffix(CHOOSEL) .'.png'
+  replot
+
+  @texTerminal
+  set ylabel '$\chi$'
+  set output outputfile.'susceptibilitat_magnetica'. suffix(CHOOSEL) .'.tex'
+  replot
+}
+
+set yrange [*<0:0<*]
+
+# --------------------------------------------------------------
+# Gràfica per la susceptibilitat magnètica (finite size scaling)
+# --------------------------------------------------------------
+set title ""
+
+set xlabel 'L^{1/\nu} t'
+set ylabel '\chi/(L^{\gamma/\nu})'
+
+set key spacing 1.25
 
 @svgTerminal
-set output outputfile.'susceptibilitat_magnetica.svg'
-plot for [L in LS] datafilepre . L . datafilepost using 2:11 @graphStyle title "L = ".L
+set output outputfile.'susceptibilitat_magnetica_fss.svg'
+plot for [L in PartialLS] datafilepre . L . datafilepost using (L*($2 - TC)/TC):($11/(L**GAMMA)) @graphStyle title "L = ".L
 
 @pngTerminal
-set output outputfile.'susceptibilitat_magnetica.png'
+set output outputfile.'susceptibilitat_magnetica_fss.png'
 replot
 
+@texTerminal
+set xlabel '$L^{1/\nu} t$'
+set ylabel '$\chi/L^{\gamma/\nu}$'
+set key spacing 1.66
+set output outputfile.'susceptibilitat_magnetica_fss.tex'
+replot
+
+set key spacing 1.25
+set xlabel 'T'
+
 # ---------------------
 # Gràfica per l'energia
 # ---------------------
-do for [IDX = 0:1] {
-  if (IDX == 0) {
-    @svgTerminal
-    set output outputfile.'energia.svg'
-  } else {
-    @pngTerminal
-    set output outputfile.'energia.png'
+
+# CHOOSEL can be:
+#   - 0: all Ls will be drawn
+#   - 1: all Ls except for 96 will be drawn
+#   - 2: only L=32 will be drawn
+do for [CHOOSEL = 0:2] {
+  do for [TERM in TERMINALS] {
+    if (TERM eq "tex") {
+      @texTerminal
+      title_l = 'L = %d'
+      title_e = '$\langle e \rangle$'
+      title_sqrtee = '$-\sqrt{\langle e^2 \rangle}$'
+      set key spacing 1.66
+    } else {
+      title_l = 'L = %d'
+      title_e = '<e>'
+      title_sqrtee = '-sqrt(<e^2>)'
+      set key spacing 1.25
+      if (TERM eq "png") {
+        @pngTerminal
+      } else {
+        @svgTerminal
+      }
+    }
+    set output outputfile.'energia'.suffix(CHOOSEL).'.'.TERM
+
+    set origin 0, 0
+    set size 1, 1
+    set xtics auto
+    set ytics auto
+
+    if (ZOOMEDIN = 1) {
+      set multiplot
+    }
+
+    unset object 1
+
+    set title ""
+    set xlabel "T"
+    if (TERM eq "tex" && CHOOSEL != 2) {
+      set ylabel '$\langle e \rangle$'
+    } else {
+      set ylabel "Energia per partícula"
+    }
+    set key bottom right
+    set key noopaque
+    set autoscale x
+    set yrange [*<0:0<*]
+
+    if (TERM eq "tex") {
+      set ytics 0.5
+    }
+
+    if (CHOOSEL == 0) {
+      plot for [L in LS] datafilepre . L . datafilepost using 2:($3/(L**2)) @graphStyle title sprintf(title_l, L+0)
+    } else {
+      if (CHOOSEL == 1) {
+        plot for [L in PartialLS] datafilepre . L . datafilepost using 2:($3/(L**2)) @graphStyle title sprintf(title_l, L+0)
+      } else {
+        plot datafilepre . SPECIAL_L . datafilepost using 2:($3/(SPECIAL_L**2)) @graphStyle title sprintf(title_e, SPECIAL_L), \
+             datafilepre . SPECIAL_L . datafilepost using 2:(-sqrt($4)/(SPECIAL_L**2)) @graphStyle title sprintf(title_sqrtee, SPECIAL_L)
+      }
+    }
+
+    if (ZOOMEDIN = 1) {
+      if (TERM eq "tex") {
+        set origin 0.175, 0.575
+      } else {
+        set origin 0.1, 0.525
+      }
+      set size 0.6, 0.4
+      set title ""
+      set xlabel ""
+      set ylabel ""
+      set key off
+      if (CHOOSEL != 2) {
+        set xrange [2.3:2.36]
+        set yrange [-1.5:-1.2]
+        if (TERM eq "tex") {
+          set xtics 0.03
+          set ytics 0.15
+        }
+      } else {
+        set xrange [2.35:2.4]
+        set yrange [-1.3:-1.2]
+        set xtics 0.025
+        if (TERM eq "tex") {
+          set ytics 0.05
+        }
+      }
+      set object 1 rectangle from graph 0,0 to graph 1,1 behind fillcolor rgb 'white' fillstyle solid noborder
+      replot
+
+      unset multiplot
+    }
   }
-
-  set multiplot
-
-  set origin 0, 0
-  set size 1, 1
-  set title "Energia per diferents valors de L"
-  set xlabel "Temperatura (K)"
-  set key bottom right
-  set key noopaque
-  set autoscale x
-  set yrange [*<0:0<*]
-  unset object 1
-  plot for [L in LS] datafilepre . L . datafilepost using 2:($3/(L**2)) @graphStyle title "<E>/N, L = ".L, \
-       for [L in LS] datafilepre . L . datafilepost using 2:(-sqrt($4)/(L**2)) @graphStyle title "-sqrt(<E^2>)/N, L = ".L
-
-  set origin 0.1, 0.525
-  set size 0.6, 0.4
-  set title ""
-  set xlabel ""
-  set key off
-  set xrange [2.25:2.5]
-  set yrange [-1.6:-1.1]
-  set object 1 rectangle from graph 0,0 to graph 1,1 behind fillcolor rgb 'white' fillstyle solid noborder
-  replot
-
-  unset multiplot
 }
 
+set key spacing 1.25
 set origin 0, 0
 set size 1, 1
 set autoscale x
 set yrange [*<0:0<*]
-set xlabel "Temperatura (K)"
+set xlabel "T"
+set ylabel ""
+set xtics auto
+set ytics auto
 unset object 1
 
 # ----------------------------
 # Gràfica per la magnetització
 # ----------------------------
-set title "Magnetització per diferents valors d'L"
+set title ""
 
-@svgTerminal
-set output outputfile.'magnetitzacio.svg'
-set key top right
-plot for [L in LS] datafilepre . L . datafilepost using 2:($7/(L**2)) @graphStyle title "<|M|>/N, L = ".L, \
-     for [L in LS] datafilepre . L . datafilepost using 2:(sqrt($8)/(L**2)) @graphStyle title "sqrt(<M^2>)/N, L = ".L
+# CHOOSEL can be:
+#   - 0: all Ls will be drawn
+#   - 1: all Ls except for 96 will be drawn
+#   - 2: only L=32 will be drawn
+do for [CHOOSEL = 0:2] {
+  do for [TERM in TERMINALS] {
+    if (TERM eq "tex") {
+      @texTerminal
+      title_m = '$\langle |m| \rangle$'
+      title_malt = '$L = %d$'
+      title_sqrtmm = '$\sqrt{\langle m^2 \rangle}$'
+      if (CHOOSEL == 2) {
+        set key spacing 2
+      } else {
+        set key spacing 1.66
+      }
+    } else {
+      title_m = '<|m|>'
+      title_malt = 'L = %d'
+      title_sqrtmm = 'sqrt(<m^2>)'
+      set key spacing 1.25
+      if (TERM eq "png") {
+        @pngTerminal
+      } else {
+        @svgTerminal
+      }
+    }
 
-@pngTerminal
-set output outputfile.'magnetitzacio.png'
-replot
+    if (TERM eq "tex" && CHOOSEL != 2) {
+      set ylabel '$\langle |m| \rangle$'
+    } else {
+      set ylabel "Magnetització per partícula"
+    }
+
+    set output outputfile.'magnetitzacio'.suffix(CHOOSEL).'.'.TERM
+    set key top right
+    if (CHOOSEL == 0) {
+      plot for [L in LS] datafilepre . L . datafilepost using 2:($7/(L**2)) @graphStyle title sprintf(title_malt, L+0)
+    } else {
+      if (CHOOSEL == 1) {
+        plot for [L in PartialLS] datafilepre . L . datafilepost using 2:($7/(L**2)) @graphStyle title sprintf(title_malt, L+0)
+      } else {
+        plot datafilepre . SPECIAL_L . datafilepost using 2:($7/(SPECIAL_L**2)) @graphStyle title sprintf(title_m, SPECIAL_L), \
+             datafilepre . SPECIAL_L . datafilepost using 2:(sqrt($8)/(SPECIAL_L**2)) @graphStyle title sprintf(title_sqrtmm, SPECIAL_L)
+      }
+    }
+  }
+}
+
+# --------------------------------------------------
+# Gràfica per la magnetització (finite size scaling)
+# --------------------------------------------------
+set title ""
+set ylabel "Magnetització per partícula"
+
+# CHOOSEL can be:
+#   - 0: all Ls will be drawn
+#   - 1: all Ls except for 96 will be drawn
+#   - 2: only L=32 will be drawn
+do for [TERM in TERMINALS] {
+  if (TERM eq "tex") {
+    @texTerminal
+    set xlabel '$L^{1/\nu} t$'
+    set ylabel '$\langle |m| \rangle L^{\beta/\nu}$'
+    set key spacing 1.66
+  } else {
+    set xlabel 'L^{1/\nu} t'
+    set ylabel '<|m|> L^{\beta/\nu}'
+    set key spacing 1.25
+    if (TERM eq "png") {
+      @pngTerminal
+    } else {
+      @svgTerminal
+    }
+  }
+
+  set output outputfile.'magnetitzacio_fss.'.TERM
+  set key top right
+  plot for [L in PartialLS] datafilepre . L . datafilepost using (L*($2 - TC)/TC):($7/(L**2)*(L**(BETA))) @graphStyle title sprintf('L = %s', L)
+}
