Re: problema di espansione

#24380
Up
0
Down
::

Sto scrivendo un pacchetto che mi serva per creare esami, basandomi su alcuni pacchetti esistenti.
Ho vari file (file1, file2, …., file10) ognuno dei quali contiene più istruzioni della forma
`%%% file 1 %%%
\newproblem{
\item \label{qxxxx}
\begin{answer}
\ans0 sbagliata
\ans0 sbagliata
\ans1 \label{axxxx} corretta
\ans0 sbagliata
\end{answer}
\begin{solution} \ref{qxxxx} \ref{axxxx} \end{solution}
}
\newproblem{
….
}`
Il pacchetto si preoccupa poi di scegliere casualmente un problema in ogni file, scambiare le risposte, scambiare l’ordine degli esercizi e creare quindi diverse versioni del compito.

È evidente che è necessario un “foglio risposte” e le \label e \ref servono proprio a questo: l’ambiente solution scrive su un file esterno i riferimenti corretti a esercizi e risposte.
Finché scrivo le label e le ref “a mano” non c’è nessun problema, ma io vorrei automatizzare anche questo aspetto utilizzando opportunamente contatori o variabili visto che l’ambiente newproblem “conosce” il nome del file, il numero del problema, il numero della versione: l’idea è quella, ad esempio, di definire
`\newcommand{\pitem}{\item\space\expandafter\label{qf\nome q\thequest e\thevers}} `(dove nome=nome dle file, quest= numero problema, ecc.) e usare \pitem anziché \item.

Facendo così le label vengono definite correttamente, ma non così le rispettive \ref.
Per scrivere sul file esterno i riferimenti uso questa sintassi
`\newcommand\scrivisol[1]{\expandafter\write\sols{#1}}
\newenvironment{scrivisolenv}{\collect@body \scrivisol}{\scrivisol{\string\par}}
\renewenvironment{solution@sq}{\scrivisolenv }{\endscrivisolenv}`
(dove l’ambiente solution@sq è quello introdotto da \begin{solution})

Penso che i riferimenti non siano corretti per un qualche problema di espansione che non sono riuscito a risolvere.
Qualcuno ha qualche suggerimento da darmi?

Vedo qualcosa di sicuramente sbagliato:
`\immediate\write`
non \expandafter\write

Ciao
Enrico

Go to top