problema di espansione

  • Creatore
    Topic
  • #24379
    strolego
    Partecipante
      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?

    Visualizzazione 3 filoni di risposte
    • Autore
      Risposte
      • #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

      • #24381
        strolego
        Partecipante
          Up
          0
          Down
          ::


          Grazie Enrico,
          speravo in un tuo aiuto, ma purtroppo se scrivo
          `\immediate\write`
          anziché
          `\expandafter\write`
          ottengo un errore
          `! Argument of \@refstar has an extra }.

          \par
          l.131 }`
          anche con i file con ref e label scritti a mano e non “automatizzati”
          Grazie
          Flavio

        • #24382
          Up
          0
          Down
          ::

          Grazie Enrico,
          speravo in un tuo aiuto, ma purtroppo se scrivo
          `\immediate\write`
          anziché
          `\expandafter\write`
          ottengo un errore
          `! Argument of \@refstar has an extra }.

          \par
          l.131 }`
          anche con i file con ref e label scritti a mano e non “automatizzati”

          Non sapendo come è definito \sols è difficile dire; se si tratta proprio di una “output stream”, \expandafter non serve proprio a nulla. Propendo per una questione di comandi fragili non protetti, ma le informazioni sono insufficienti.

          Ciao
          Enrico

        • #24383
          strolego
          Partecipante
            Up
            0
            Down
            ::


            Problema risolto.
            Comunque:
            \sols è solo il nome per il file. Da qualche parte ho
            `\newwrite\sols
            \openout\sols=\nomefile-sol\thevers.tex
            `
            Il codice `\expandafter\write\sols{#1}`
            direi, a spanne, che funziona perché #1 è \ref{qualcosa da espandere} e, nelle mie prime prove l’espansione andava bene.

            Il tuo suggerimento è stato come sempre prezioso. Usando
            `\immediate\write\sols{\string\ref{…} }` l’espansione è perfetta. Prima ottenevo errore perché, stupidamente, avevo dimenticato \string e quindi espandeva anche \ref.

            Ciao e grazie
            Flavio

        Visualizzazione 3 filoni di risposte
        • Devi essere connesso per rispondere a questo topic.

        Go to top