Scrittura su file esterno e espansione comandi

  • Creatore
    Topic
  • #22762
    strolego
    Partecipante
      Up
      0
      Down
      ::


      Sto cercando di costruire una serie di istruzioni per creare delle prove d’esame con esercizi scelti e riarrangiati casualmente.

      La base di lavoro è una procedura simile a quella adottata dal pacchetto probsoln: scrivo in un file le m versioni di ogni esercizio e la macro legge il file, conta quanti esercizi ci sono e ne estrae uno casualmente; questo viene fatto per tutti i file, “mescolo” gli esercizi scelti ed ottengo la prova.

      Nei file che accludo in coda (che sono l’esempio minimo che sono riuscito a creare con il problema) ho un master e i file di esercizi inc1, inc2 e inc3 (o inc3a).

      Tutto funziona se creo il dvi (pdf), ma io avrei bisogno di avere come output un altro file tex che contenga tutte le prove (o n file tex ognuno con una prova). Il problema è che non riesco a far sì che su questo file (nell’esempio si chiama esame) venga scritto il codice non espanso dell’esercizio. Vorrei riuscire a dare un comando che scriva il token che contiene l’esercizio, espanso esattamente una volta, detto in altri termini: se nell’esercizio c’è un
      \begin{ambiente}, nel file di output vorrei ci fosse scritto \begin{ambiente} e questo, ovviamente, in modo automatico senza dover scrivere sul file di
      esercizi comandi come \noxpand o \string. Il codice che ho scritto funziona se negli esercizi non ci sono comandi d’ambiente, ecc. ma non funziona se nell’esercizio c’è, ad esempio, un
      \begin{enumerate} come nel file inc3a.

      C’è qualcuno che ha un suggerimento?

      Ho poi un altro problema: mi farebbe comodo che le stesse istruzioni contenute nel comando \newproblem fossero espresse con un ambiente. Ho provato con il comando di amsmath \collect@body, ma non mi pare funzioni.

      Peggio ancora, per venire incontro alle esigenze di colleghi che usano Scientific WorkPlace (che è già un passo avanti rispetto a Word) mi sarebbe molto utile poter ridefinire il comando
      \subsection{xxx} in modo che esegua il comando \newproblem: qualcuno sa se la cosa è possibile?

      Grazie
      Flavio

      **************** file master. tex *****************************************
      `\documentclass[italian]{article}
      \usepackage[utf8]{inputenc}
      \usepackage[T1]{fontenc}
      \usepackage{amsmath}
      \usepackage{fink}%mi serve per il nome del file
      \usepackage{ifthen}
      \input random

      \newcounter{quest}
      \newcounter{examnum}
      \setcounter{examnum}{1}
      \newwrite\test

      %%% codice adattato da probsoln
      \newif\iffirstpass

      \makeatletter
      \newcount\@probN
      \newcommand{\newproblem}[1]{%
      \stepcounter{quest}
      \iffirstpass
      \global\advance\@probN by 1
      \else
      \let\nome\finkbase
      \expandafter\global\expandafter\newcommand\csname @prob@f\nome q\thequest e\theexamnum \endcsname{#1}
      \fi
      }

      \newcommand{\selectrandomly}[1]{
      \newcount\j@n%
      \global\@probN=0\relax
      \firstpasstrue
      \setcounter{quest}{0}
      \input{#1}%
      \setrannum{\j@n}{1}{\@probN}
      \firstpassfalse%
      \setcounter{quest}{0}
      \input{#1}
      \expandafter\immediate\write\test\expandafter{\string\item \space \csname @prob@f\nome q\number\j@n e\theexamnum\endcsname} %%scrive su file esterno
      \csname @prob@f\nome q\number\j@n e\theexamnum\endcsname %% crea il dvi/pdf
      }
      \makeatother

      %% versioni pseudocasuali
      \def\scegliiii#1#2#3{\def\filei{#1}\def\fileii{#2}\def\fileiii{#3}}
      \def\prendiiii#1#2#3{\ifcase\theexamnum\or\scegliiii{#3}{#1}{#2}\or\scegliiii{#1}{#3}{#2}\or\scegliiii{#3}{#1}{#2}\or \scegliiii{#1}{#2}{#3}\or\scegliiii{#2}{#1}{#3}\or \scegliiii{#3}{#2}{#1}\fi}

      \begin{document}

      \immediate\openout\test=esame.tex

      \whiledo{\theexamnum<7}{\prendiiii{inc1}{inc2}{inc3} %questo va
      % \prendiiii{inc1}{inc2}{inc3a} %% questo non va
      \begin{enumerate}
      \immediate\write\test{\string \begin{enumerate}}
      \item \selectrandomly{\filei}
      \item
      \selectrandomly{\fileii}
      \item \selectrandomly{\fileiii}
      \end{enumerate}
      \immediate\write\test{\string\end{enumerate} \string\newpage}
      \newpage \stepcounter{examnum}}

      \immediate\closeout\test
      \end{document}

      `

      **************************** file inc1.tex ******************************
      `\newproblem{Es.1 file 1 con parametro esame è \theexamnum}

      \newproblem{Es. 2 file 1}

      \newproblem{Es. 3 file 1}

      \newproblem{Es. 4 file 1}

      `
      ************************ file inc2.tex *******************************
      `\newproblem{Es.1 file 2 con parametro esame \theexamnum}

      \newproblem{Es. 2 file 2}

      \newproblem{Es. 3 file 2}`

      ********************* file inc3.tex *************************
      `\newproblem{Es.1 file 3 con parametro esame \theexamnum}

      \newproblem{Es. 2 file 3}

      \newproblem{Es. 3 file 3}

      \newproblem{Es. 4 file 3}

      \newproblem{Es. 5 file 3}
      `
      ********************** file inc3a.tex ***********************
      ` \newproblem{ \begin{enumerate}
      \item Es.1 file 3a con parametro esame \theexamnum
      \end{enumerate}}

      \newproblem{\begin{enumerate}
      \item Es. 2 file 3a
      \end{enumerate}}

      \newproblem{\begin{enumerate}
      \item Es. 3 file 3a
      \end{enumerate}}

      \newproblem{\begin{enumerate}
      \item Es. 4 file 3a
      \end{enumerate}}

      \newproblem{\begin{enumerate}
      \item Es. 5 file 3a
      \end{enumerate}}`

    Visualizzazione 2 filoni di risposte
    • Autore
      Risposte
      • #22763
        Up
        0
        Down
        ::

        Sto cercando di costruire una serie di istruzioni per creare delle prove d’esame con esercizi scelti e riarrangiati casualmente.

        La base di lavoro è una procedura simile a quella adottata dal pacchetto probsoln: scrivo in un file le m versioni di ogni esercizio e la macro legge il file, conta quanti esercizi ci sono e ne estrae uno casualmente; questo viene fatto per tutti i file, “mescolo” gli esercizi scelti ed ottengo la prova.

        Nei file che accludo in coda (che sono l’esempio minimo che sono riuscito a creare con il problema) ho un master e i file di esercizi inc1, inc2 e inc3 (o inc3a).

        Tutto funziona se creo il dvi (pdf), ma io avrei bisogno di avere come output un altro file tex che contenga tutte le prove (o n file tex ognuno con una prova). Il problema è che non riesco a far sì che su questo file (nell’esempio si chiama esame) venga scritto il codice non espanso dell’esercizio. Vorrei riuscire a dare un comando che scriva il token che contiene l’esercizio, espanso esattamente una volta, detto in altri termini: se nell’esercizio c’è un
        \begin{ambiente}, nel file di output vorrei ci fosse scritto \begin{ambiente} e questo, ovviamente, in modo automatico senza dover scrivere sul file di
        esercizi comandi come \noxpand o \string. Il codice che ho scritto funziona se negli esercizi non ci sono comandi d’ambiente, ecc. ma non funziona se nell’esercizio c’è, ad esempio, un
        \begin{enumerate} come nel file inc3a.

        C’è qualcuno che ha un suggerimento?

        Scrivi ciò che ti serve come argomento di \unexpanded

        Ciao
        Enrico

      • #22764
        strolego
        Partecipante
          Up
          0
          Down
          ::

          Scrivi ciò che ti serve come argomento di \unexpanded

          Ovviamente funziona! Anche usandolo all’interno del comando \newproblem: io l’avevo provato, ma l’avevo messo al posto sbagliato e come avevo come output una stringa di codice.
          Grazie Enrico. Puoi anche dirmi dove si trovano referenze per questi comandi che non appaiono sul TeXbook?

          Adesso se qualcuno mi aiuta con gli altri problemi … 😉

        • #22765
          Up
          0
          Down
          ::

          Scrivi ciò che ti serve come argomento di \unexpanded

          Ovviamente funziona! Anche usandolo all’interno del comando \newproblem: io l’avevo provato, ma l’avevo messo al posto sbagliato e come avevo come output una stringa di codice.
          Grazie Enrico. Puoi anche dirmi dove si trovano referenze per questi comandi che non appaiono sul TeXbook?

          Adesso se qualcuno mi aiuta con gli altri problemi … 😉

          Dovresti avere sul sistema il file etex_man.pdf; con “texdoc etex_man” lo trovi quasi certamente.

          Ciao
          Enrico

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

      Go to top