Re: Copertine con dati variabili

#19735
Up
0
Down
::

Buonasera a tutti.
Ho ripreso questa soluzione per produrre un documento composto da schede con dati testuali variabili.
Bene.

Tuttavia i campi che fanno parte della scheda sono molti, veramente molti (… circa una dozzina quindi certamente troppi tasti da digitare), quindi non potevo non pensare a qualcosa che mi abbreviasse il compito: un comando che generi la macro chiave che a sua volta generi il comando interno.

Chiaro. Una volta che la sfida è stata lanciata non ci si può ritirare.
Dunque mi sono messo all’opera, e quando ormai stavo rinunciando sono riuscito nell’intento.

Ho consultato la guida del Prof. Gregorio sulla programmazione in LaTeX a pag. 117 (Definizioni dentro definizioni), dove si spiega come TeX legge un doppio #, la pagina 81 sulla modalità con cui vengono determinati gli argomenti di un comando, e la pagina 93 dove si spiega come definire un comando dato il testo del nome.

Ok. Con il codice che segue, un campo può essere costruito con un unico comando (il nome delle macro interne è il nome del campo preceduto dalla lettera x):
`\makecmd{nomecampo}

\newcommand{\esempio}{Ecco l'esempio: \xnomecampo}

% da usare così:
\nomecampo{valore primo}
\esempio

\nomecampo{valore secondo}
\esempio
%ecc
`

ecco il codice:`\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

% ditemi se questa non è literate programming… modestamente
\newcommand{\makexcmd}[1]{%
\expandafter\def\csname #1\endcsname##1{%
\expandafter\def\csname x#1\endcsname{##1}}
}

\makexcmd{indirizzo}
\makexcmd{citta}
% comodo non è vero?

% ecco il comando per generare l'oggetto contenente campi variabili
\newcommand{\esempio}{%
Questo è un esempio di indirizzo: \xindirizzo.

E questa è la città corrispondente: \xcitta.
}

\begin{document}

\indirizzo{Via Genova, 222}
\citta{Milano}
\esempio

\bigskip
\indirizzo{Via Milano, 222}
\citta{Genova}
\esempio

\end{document}
`

… buon proseguimento.
Ciao.

Nota: approfitto dell’ora tarda per permettere al post di sfuggire al prof. eh eh eh

Ora tarda? 😆

Il codice è interessante. Ma
`\makeatletter
\newcommand{\makexcmd}[1]{\@namedef{#1}##1{\@namedef{x#1}{##1}}}
\makeatother`
è più breve! In effetti \@namedef{#1} si espande in
`\expandafter\def\csname#1\endcsname`
Ciao
Enrico

Go to top