Chiavi di risposta alla fine del documento:applicazione del datatype seq di L3?

  • Creatore
    Topic
  • #121505
    Up
    0
    Down
    ::


    Ciao, vorrei un vostro parere perché qualcosa non va con questo esempio (o con la mia testa).

    Vorei scrivere nel file sorgente TeX le risposte degli esercizi a scelta multipla
    accanto alla descrizione del problema, le risposte però devono essere riperibili e stampate
    solo alla fine del pdf (come le chiavi di risposta di un libro di grammatica alla fine del capitolo)

    Occorre che non riesco a forzare l’espansione in loco del contatore dell’ambiente “esercizio”,
    cosicché l’indice dell’esercizio è valutato soltanto alla fine (nell’esempio allegato tutti gli esercizi sono segnati con l’indice 3).

    Ho poputo raggirare il problema scrivendo le risposta in un file temporaneo il quale
    può esse letto alla fine. Ma non la sento del tutto soddisfacente.

    Ecco l’output che ne ho dal codice:

    Esercizio 1. Il primo esercizio.
    a)Prima scelta
    b)Seconda scelta
    c)Terza scelta

    Esercizio 2. Il secondo esercizio.
    a)Prima scelta
    b)Seconda scelta
    c)Terza scelta

    Esercizio 3. Il terzo esercizio.
    a)Prima scelta
    b)Seconda scelta
    c)Terza scelta

    Chiavi di risposte
    3. c 3. a 3. b

    ➡ La risposta giusta invece è 1.c 2.a 3.b.

    Ecco il codice sorgente (devo importare il pacchetto xparse per forza, altrimenti non gira):

    `\documentclass{minimal}

    \usepackage{xparse}
    \usepackage{enumerate}

    \newcounter{esercizio}
    \newenvironment{esercizio}{%
    \refstepcounter{esercizio}
    \noindent\textbf{Esercizio~\theesercizio.\ \ }}{}

    \ExplSyntaxOn

    \seq_new:N \l_my_seq

    \NewDocumentCommand { \chiavidirisposte } { } {
    \seq_use:Nn \l_my_seq { \ }
    }

    \NewDocumentCommand { \sceltamultipla } { m }
    {
    \seq_put_right:Nn \l_my_seq { \theesercizio.\,#1\ }
    }

    \ExplSyntaxOff

    \begin{document}

    \begin{esercizio}
    Il primo esercizio.
    \end{esercizio}
    \sceltamultipla{c}
    \begin{enumerate}[a)]
    \item Prima scelta
    \item Seconda scelta
    \item Terza scelta
    \end{enumerate}

    \begin{esercizio}
    Il secondo esercizio.
    \end{esercizio}
    \sceltamultipla{a}
    \begin{enumerate}[a)]
    \item Prima scelta
    \item Seconda scelta
    \item Terza scelta
    \end{enumerate}

    \begin{esercizio}
    Il terzo esercizio.
    \end{esercizio}
    \sceltamultipla{b}
    \begin{enumerate}[a)]
    \item Prima scelta
    \item Seconda scelta
    \item Terza scelta
    \end{enumerate}

    Chiavi di risposte

    \chiavidirisposte

    \end{document}`

    Ringrazio in anticipo la vostra attenzione
    Cordiali saluti
    camil

Visualizzazione 4 filoni di risposte
  • Autore
    Risposte
    • #121506
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Se ho capito bene il tuo problema richies solo unenelco piò o meno lungo di risposte, non lo svolgimento completo della spiegazione del perche quella è la risposta giusta e perché le altre sono errate..Ci sono molti mdi di procedere, ma tutte richiedono l’uso di un file ausiliario da immettere alla fine del teso in un’apposita appendice;
        Quella che mi pera piì semplice è qualal di creare un indice analitico dove le rispsote sono elencate per capitlo, poi per esercisio.
        LA cosa è quais immediata se ti leggii al documentazione del pacchetto imakeidx,Puoi configurare l’indicce come ti pre, puoi avered elle entry co o senza numero di pagina, ma le varie voci, cioe 3c, 4a, eccetera vengono elencate alfabeticamente con il primo elemento, numero dell’esercizio, considerato un carattere alfanumerico, non un numero, elencato per ordine crescente.

        Dove vuoi stapare l’elenco delle risposte, basta scrivere ]rintindex e ci pensa il paccheetto a crare ilfile ausiliario, e a rodinare salfanumenricamente le varie vodi.
        Oltre a leggere la documentazione di imakeidx, colo il comando datonella finesra comandi del tuo sistema operativo, texdoc imakeidx, puoi utilmente leggere il tutorial ind, dado da finestra comandi il comando texdoc ind

      • #121507
        claudio
        Partecipante
          Up
          0
          Down
          ::


          hai mai preso in considerazione
          tcolorbox e la sua gestione degli esercizi?
          ciao
          claudio

        • #121508
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::

            claudio” post=122072hai mai preso in considerazione
            tcolorbox e la sua gestione degli esercizi?
            ciao
            claudio

            Sono d’accordo con Claudio. Conviene appoggiarsi a un pacchetto specifico.
            Io uso la semplice classe exam ma ne trovi di più evolute.
            Nel tuo codice invece, meglio evitare che il contatore abbia lo stesso nome dell’ambiente.
            Inoltre, non usare la classe minimal a meno che non sei in situazioni particolari e ne conosci le limitazioni.
            Quello che non funziona nel tuo codice è che il contatore alla fine avrà il conteggio degli esercizi. Perciò quando ne stampi il contenuto varrà sempre 3.

            Ti suggerisco di creare un nuovo ambiente che accetti come paramento al lettera corretta e la memorizzi in una clist.
            Un comando specifico potrà poi stampare le chiavi scorrendo la lista con la funzione specifica “\clist_map_inline:Nn” per esempio.
            Non sono un esperto di L3.
            Preferisco usare Lua con LuaLaTeX che per queste cose è molto più semplice e naturale.
            Ecco un esempio di codice che farà storcere il naso ai puristi di L3 🙂
            `% !TeX program = LuaLaTeX
            \documentclass{article}
            \usepackage{enumerate}

            % una nuova libreria in Lua per gli esercizi chiamata exerlib
            \directlua{
            exerlib = {
            key = {},
            last = 0,
            }
            function exerlib:addkey(k)
            local key = self.key
            local last = self.last
            assert(type(k) == [[string]])
            last = last + 1
            key[last] = k
            self.last = last
            return last
            end

            function exerlib:keylist()
            local key = self.key
            local output = {}
            for i, k in ipairs(key) do
            output = i..[[. ]]..k
            end
            tex.print(table.concat(output, [[, ]]))
            end
            }

            \NewDocumentEnvironment{ sceltamultipla }{ m m +b }
            {
            \noindent
            \textbf{Esercizio~}%
            \directlua{
            local e = exerlib:addkey([==[#1]==])
            tex.sprint(e)
            }. #2
            \begin{enumerate}[a)]
            #3
            \end{enumerate}
            }
            { }

            \NewDocumentCommand{\chiavidirisposte}{ }
            { \directlua{exerlib:keylist()} }

            \begin{document}
            \begin{sceltamultipla}{c}{Il primo esercizio.}
            \item Prima scelta
            \item Seconda scelta
            \item Terza scelta
            \end{sceltamultipla}

            \begin{sceltamultipla}{a}{Il secondo esercizio.}
            \item Prima scelta
            \item Seconda scelta
            \item Terza scelta
            \end{sceltamultipla}

            \begin{sceltamultipla}{c}{Il terzo esercizio.}
            \item Prima scelta
            \item Seconda scelta
            \item Terza scelta
            \end{sceltamultipla}

            Chiavi di risposte: \chiavidirisposte
            \end{document}`

            Con il codice Lua è veramente facile aggiungere nuove funzionalità come quella di controllare i dati inseriti, creare nello stesso documento più gruppi di esercizi eccetera.
            Viene sempre l’esigenza di inserire nuove funzionalità al proprio codice.
            Nota che non vi è nessun bisogno di un contatore.
            Alla prossima.
            R.

          • #121509
            Up
            0
            Down
            ::


            Occorre espandere il valore di [tt]\theesercizio[/tt] al momento di aggiungerlo alla sequenza.

            `
            \documentclass{article}% MAI minimal

            \usepackage{enumitem}% MAI enumerate

            \newcounter{esercizio}
            \newenvironment{esercizio}{%
            \refstepcounter{esercizio}
            \noindent\textbf{Esercizio~\theesercizio.\ \ }}{}

            \newenvironment{risposte}
            {\begin{enumerate}[label=\alph*)]}
            {\end{enumerate}}

            \ExplSyntaxOn

            \seq_new:N \l_camil_keys_seq

            \NewDocumentCommand { \chiavidirisposte } { } {
            \seq_use:Nn \l_camil_keys_seq { \qquad }
            }

            \NewDocumentCommand { \sceltamultipla } { m }
            {
            \seq_put_right:Nx \l_camil_keys_seq { \theesercizio\exp_not:n{.\nobreakspace#1} }
            }

            \ExplSyntaxOff

            \begin{document}

            \begin{esercizio}
            Il primo esercizio.
            \end{esercizio}
            \sceltamultipla{c}
            \begin{risposte}
            \item Prima scelta
            \item Seconda scelta
            \item Terza scelta
            \end{risposte}

            \begin{esercizio}
            Il secondo esercizio.
            \end{esercizio}
            \sceltamultipla{a}
            \begin{risposte}
            \item Prima scelta
            \item Seconda scelta
            \item Terza scelta
            \end{risposte}

            \begin{esercizio}
            Il terzo esercizio.
            \end{esercizio}
            \sceltamultipla{b}
            \begin{risposte}
            \item Prima scelta
            \item Seconda scelta
            \item Terza scelta
            \end{risposte}

            Chiavi di risposte

            \chiavidirisposte

            \end{document}
            `

            [attachment=2732]Screenshot2023-03-13at11.09.51.png[/attachment]

            SUGGERIMENTI.

            Mai adoperare la classe [tt]minimal[/tt]

            Mai adoperare [tt]enumerate[/tt]: un tempo andava bene, ma…

            Nomina le variabili in modo assennato; [tt]my[/tt] non è una buona scelta.

            Ciao
            Enrico

            Attachments:
            You must be logged in to view attached files.
          • #121510
            Up
            0
            Down
            ::


            Grazie tante a tutti per i consigli, suggerimenti e codici inviati.

            Prenderò i miei appunti. In realtà io prendo i spunti per usare
            e condividere anche con i colleghi al lavoro.

            Saluti,
            Camil

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

        Go to top