- Questo topic ha 0 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 16 anni, 1 mese fa da .
-
Topic
-
Ciao,
in una classe basata su report, il concetto di “campo dati variabile” viene implementato con un paio di comandi che prendono il nome del campo. Uno ne legge il valore (\get) e l’altro lo scrive (\set). Codice esplicativo:
`\documentclass{report}
\def\set#1#2{%
\expandafter
\def\csname prefix#1\endcsname{#2}%
}
\def\get#1{%
\csname prefix#1\endcsname%
}\begin{document}
\set{campo}{valore}\get{campo}
\end{document}`Alcuni campi predefiniti sono read only e quindi non possono essere sovrascritti. In questi casi il comando di scrittura deve emettere un warning. Codice esplicativo:
`\documentclass{report}
\def\readonly{ro}
\def\set#1#2{%#1->nome, #2->valore
\def\tmp{#1}
\ifx\tmp\readonly
Registro di sola lettura!%
\else
\expandafter
\def\csname prefix#1\endcsname{#2}%
\fi
}\def\get#1{%
\csname prefix#1\endcsname%
}\begin{document}
\set{campo}{valore}\get{campo}% -> 'valore'\set{ro}{valore}% -> 'Registro di sola lettura'
\end{document}`
Il codice inoltre prevede la possibilità che l’utente inserisca spazi prima e dopo il nome del campo. Tali spazi devono essere eliminati perché porterebbero alla loro inclusione nel nome del campo e quindi alla scarsa flessibilità sintattica generando campi diversi quando in realtà è uno solo.
Dunque il problema: prima di poterlo sovrascrivere, devo confrontare il nome del campo fornito con quelli read only eliminando gli spazi, attraverso il comando \deblanck del pacchetto etextools.
Ma il confrondo da esito negativo per via forse di qualche tokens che si infiltra.
Codice esplicativo:
`\documentclass{report}
\usepackage{etextools}\def\readonly{ro}
\def\set#1#2{%#1->nome, #2->valore
\edef\tmp{\ignorespaces\deblank{#1}}
\ifx\tmp\readonly
Registro di sola lettura!%
\else
\expandafter
\def\csname prefix#1\endcsname{#2}%
\fi
}\def\get#1{%
\csname prefix#1\endcsname%
}\begin{document}
\set{campo}{valore}\get{campo}% -> 'valore'\set{ro}{valore per ro}% -> 'Registro di sola lettura'
\set{ ro }{valore proibito}% read only reg non rilevato!!
\get{ro}
\get{ ro }
\end{document}`Esiste una soluzione? Perché \edef non espande tutto il suo argomento e non restituisce il nome del campo pulito dagli spazi?
Grazie per la pazienza.
Roberto.
- Devi essere connesso per rispondere a questo topic.