Robitex's Blog

Ideas in the web

Variabili dimensionali in LaTeX


Questa mi sembra una buona idea

Naturalmente non so se si tratta di una cosa utile, ma se per caso lo fosse? Meglio non correre rischi e parlarne😉.

Variabili?

In LaTeX è possibile gestire registri dimensionali per rappresentare per esempio larghezza e altezza di pagina, valore dei margini, dell’interlinea del testo ecc…

La sintassi per la definizione e l’assegnazione di un nuovo registro dimensione è diversa in TeX ed in LaTeX, e noi, giusto per scrivere codice leggermente più veloce, useremo quella TeX:

\newdimen\mydim
\mydim=40pt
\advance\mydim by 5pt
Il registro vale \the\mydim.

Vorremmo invece poter lavorare in sintassi chiave=valore, come con un linguaggio di programmazione, implementando in LaTeX quello che lì avremmo chiamato espressione. Ci avvaremo di un nuovo comando che chiameremo \dim:

\dim{a=40pt}% nuova variabile inizializzata a 40pt
\dim{a=\a+5pt}% la variabile viene incrementata di altri 5pt

% oppure anche:
\dim{a=40pt,a=\a+5pt}

Ebbene si può fare, anche se si corre qualche rischio, utilizzando i pacchetti xkeyval e etextools.

Si, variabili!

Provate a compilare questo codice:

\documentclass{report}
\usepackage{etextools}
\usepackage{xkeyval}
\usepackage{tikz}

\makeatletter
   \DeclareCmdListParser{\parser@csv}{,}
   \def\dim#1{%
      \setkeys*{dimfam}{#1}
      \ifx\XKV@rm\empty
         \setrmkeys{dimfam}%
      \else
         \parser@csv[\definesingle@key]{\XKV@rm}
         \setrmkeys{dimfam}%
      \fi
   }
   %
   \def\definesingle@key#1{\make@newkey#1\@nil}
   \def\make@newkey#1=#2\@nil{%
      % creo la nuova dimensione
      \expandafter\newdimen\csname #1\endcsname
      %
      % creo la chiave ad essa associata
      \define@key{dimfam}{#1}{%
         \csname #1\endcsname=\dimexpr##1\relax
      }
   }
\makeatother

\begin{document}
\dim{a=10mm,b=30mm}a=\the\a;b=\the\b.

\dim{a=78mm,b=\a/2,c=\b/2}a=\the\a;b=\the\b;c=\the\c.

\tikz
\draw (0,0) -- (\c,0) -- (\c,\c)--(\b,\b)--(\b,0)--(\a,0)--(\a,\a);
\dim{a=38mm,b=\a/2,c=\b/2}

\tikz
\draw (0,0) -- (\c,0) -- (\c,\c)--(\b,\b)--(\b,0)--(\a,0)--(\a,\a);
\end{document}

Nel codice ho poi utilizzato PGF (comando \tikz), per mostrarvi come posso far dipendere un disegno dal valore di variabili (ex registri) dimensionali.

Alla prossima.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: