Creazione ambienti simili a \exercise e \answer del TeXBook

  • Creatore
    Topic
  • #28663
    DMW
      Up
      0
      Down
      ::


      Salve,

      sto cercando di creare due ambienti simile ai comandi \exercise e \answer del TeXBook (pag 422 appendice E).

      Il Grand Wizard nel sorgente del TeXBook scrive
      `\exercise Esercizio
      \answer Risposta `

      Il testo dell’esercizio compare dove viene dato il comando \exercise, mentre \answer compare nell’appendice A e come item di un elenco numerato.

      Vi chiedo se è possibile adattare quei due comandi in modo da creare due ambienti exercise e answer
      `\begin{exercise}…
      \end{exercise}
      \begin{answer}…
      \end{answer}`

      oppure answer come argomento dell’ambiente exercise
      `\begin{exercise}[answer]…
      \end{exercise},
      `
      che si comportino allo stesso modo.

      Ciao

      Andra

    Visualizzazione 5 filoni di risposte
    • Autore
      Risposte
      • #28664
        Up
        0
        Down
        ::

        Salve,

        sto cercando di creare due ambienti simile ai comandi \exercise e \answer del TeXBook (pag 422 appendice E).

        Il Grand Wizard nel sorgente del TeXBook scrive
        `\exercise Esercizio
        \answer Risposta `

        Il testo dell’esercizio compare dove viene dato il comando \exercise, mentre \answer compare nell’appendice A e come item di un elenco numerato.

        Vi chiedo se è possibile adattare quei due comandi in modo da creare due ambienti exercise e answer
        `\begin{exercise}…
        \end{exercise}
        \begin{answer}…
        \end{answer}`

        oppure answer come argomento dell’ambiente exercise
        `\begin{exercise}[answer]…
        \end{exercise},
        `
        che si comportino allo stesso modo.

        `\usepackage{amsthm}
        \theoremstyle{definition}
        \newtheorem{exercise}{Esercizio}[section]

        \newwrite\ans
        \immediate\openout\ans=\jobname.ans
        \def\answer{\par
        \immediate\write\ans{}
        \immediate\write\ans{\string\item[\theexercise]}
        \copytoblankline}
        \def\copytoblankline{\begingroup\setupcopy\copyans}
        \def\setupcopy{\ex@sanitize\obeylines}
        {\obeylines \gdef\copyans#1
        {\def\next{#1}%
        \ifx\next\empty\let\next=\endgroup %
        \else\immediate\write\ans{\next} \let\next=\copyans\fi\next}}

        \makeatletter
        \def\ex@sanitize{\def\do##1{\catcode`##1=12 }\dospecials
        \@tempcnta=128
        \loop\ifnum\@tempcnta<256
        \catcode\@tempcnta=12
        \advance\@tempcnta\@ne
        \repeat}
        \makeatother

        \def\inputanswers{\immediate\closeout\ans
        \section*{Risposte}
        \begin{enumerate}
        \input{\jobname.ans}
        \end{enumerate}}`
        Preso dritto dritto da manmac.tex, a parte certe correzioni per LaTeX; il documento va scritto così:
        `\section{Titolo}

        \begin{exercise}
        Quanto fa $2+2$?\answer $4$

        \end{exercise}`
        La riga bianca tra la risposta e \end{exercise} ci vuole. Funziona anche con codifiche a 8 bit (forse anche con utf8).

        Ciao
        Enrico

      • #28665
        DMW
          Up
          0
          Down
          ::


          Ho provato ma non andava. Poi ho aggiunto \newwrie\ans e va. Però non mi stampa le risposte.
          `\documentclass[a4paper]{article}
          \usepackage[latin1]{inputenc}
          \usepackage{amsthm}
          \theoremstyle{definition}
          \newtheorem{exercise}{Esercizio}[section]

          \makeatletter
          \newwrite\ans
          \def\answer{\par
          \immediate\write\ans{}
          \immediate\write\ans{\string\item[\theexercise]}
          \copytoblankline}
          \def\copytoblankline{\begingroup\setupcopy\copyans}
          \def\setupcopy{\ex@sanitize\obeylines}
          {\obeylines \gdef\copyans#1
          {\def\next{#1}%
          \ifx\next\empty\let\next=\endgroup %
          \else\immediate\write\ans{\next} \let\next=\copyans\fi\next}}

          \def\ex@sanitize{\def\do##1{\catcode`##1=12 }\dospecials
          \@tempcnta=128
          \loop\ifnum\@tempcnta<256
          \catcode\@tempcnta=12
          \advance\@tempcnta\@ne
          \repeat}
          \def\inputanswers{\immediate\closeout\ans
          \section*{Risposte}
          \begin{enumerate}
          \input{\jobname.ans}
          \end{enumerate}}
          \makeatother

          \begin{document}

          \section{Titolo}
          testo
          \begin{exercise}
          Quanto fa $2+2$?\answer $4$

          \end{exercise}

          \inputanswers
          \end{document} `

          Mi dice che manca il file nomefile.ans.

        • #28666
          Up
          0
          Down
          ::

          Ho provato ma non andava. Poi ho aggiunto \newwrie\ans e va. Però non mi stampa le risposte.
          `\documentclass[a4paper]{article}
          \usepackage[latin1]{inputenc}
          \usepackage{amsthm}
          \theoremstyle{definition}
          \newtheorem{exercise}{Esercizio}[section]

          \makeatletter
          \newwrite\ans
          \def\answer{\par
          \immediate\write\ans{}
          \immediate\write\ans{\string\item[\theexercise]}
          \copytoblankline}
          \def\copytoblankline{\begingroup\setupcopy\copyans}
          \def\setupcopy{\ex@sanitize\obeylines}
          {\obeylines \gdef\copyans#1
          {\def\next{#1}%
          \ifx\next\empty\let\next=\endgroup %
          \else\immediate\write\ans{\next} \let\next=\copyans\fi\next}}

          \def\ex@sanitize{\def\do##1{\catcode`##1=12 }\dospecials
          \@tempcnta=128
          \loop\ifnum\@tempcnta<256
          \catcode\@tempcnta=12
          \advance\@tempcnta\@ne
          \repeat}
          \def\inputanswers{\immediate\closeout\ans
          \section*{Risposte}
          \begin{enumerate}
          \input{\jobname.ans}
          \end{enumerate}}
          \makeatother

          \begin{document}

          \section{Titolo}
          testo
          \begin{exercise}
          Quanto fa $2+2$?\answer $4$

          \end{exercise}

          \inputanswers
          \end{document} `

          Mi dice che manca il file nomefile.ans.

          Mancava anche un’altra riga dopo \newwrite\ans:
          `\immediate\openout\ans=\jobname.ans`
          Correggo anche nell’altro messaggio.

          Ciao
          Enrico

        • #28667
          DMW
            Up
            0
            Down
            ::


            Giusto, c’è anche a pag. 422.

            Grazie per l’aiuto, la soluzione è perfetta.

            Mi spieghi un paio di cose?

            Cosa ci fa quel gruppo, cioè questo
            `{\obeylines \gdef\copyans#1
            {\def\next{#1}%
            \ifx\next\empty\let\next=\endgroup %
            \else\immediate\write\ans{\next} \let\next=\copyans\fi\next}} `

            “sospeso a mezz’aria”? Non è all’interno di nessun comando!

            e poi perché il loop
            `\@tempcnta=128
            \loop\ifnum\@tempcnta<256
            \catcode\@tempcnta=12
            \advance\@tempcnta\@ne
            \repeat`
            dentro \setupcopy, o meglio \ex@sanitize?

            Ma il loop non è sempre positivo? Non si rimane lì per sempre?o quel catcode risolve tutto? Non potevi scrivere come scritto in manmac.tex cioè \catcode`\|=\other?

            Ciao

            Andrea

          • #28668
            Up
            0
            Down
            ::

            Giusto, c’è anche a pag. 422.

            Grazie per l’aiuto, la soluzione è perfetta.

            Mi spieghi un paio di cose?

            Cosa ci fa quel gruppo, cioè questo
            `{\obeylines \gdef\copyans#1
            {\def\next{#1}%
            \ifx\next\empty\let\next=\endgroup %
            \else\immediate\write\ans{\next} \let\next=\copyans\fi\next}} `

            “sospeso a mezz’aria”? Non è all’interno di nessun comando!

            Si sta definendo la macro \copyans con l’argomento delimitato da un carattere ^^M attivo, \obeylines serve a quello. La macro \setupcopy ridà poi \obeylines in modo che \copyans sia valutata nel modo corretto. Ciò che fa \copyans è raccogliere ciò che sta da lì alla fine della riga e scriverla sul file ausiliario. Per questo serve la riga vuota: se l’argomento è vuoto, infatti, si esegue \endgroup che fa finire tutta la faccenda.

            La definizione di \copyans va dentro un gruppo per evitare che l’azione di \obeylines si propaghi senza rimedio e infatti è data tramite \gdef.

            e poi perché il loop
            `\@tempcnta=128
            \loop\ifnum\@tempcnta<256
            \catcode\@tempcnta=12
            \advance\@tempcnta\@ne
            \repeat`
            dentro \setupcopy, o meglio \ex@sanitize?

            Ma il loop non è sempre positivo? Non si rimane lì per sempre?o quel catcode risolve tutto? Non potevi scrivere come scritto in manmac.tex cioè \catcode`\|=\other?

            No, il \loop cambia in 12 il codice di categoria di tutti i caratteri da 128 a 255. È importante perché il pacchetto inputenc li rende attivi e questo impedirebbe di scriverli sul file delle risposte. Facendoli diventare di categoria 12, saranno scritti tali e quali, ma quando \inputanswers causa la lettura del file delle risposte avranno la categoria giusta.

            Ciao
            Enrico

          • #28669
            DMW
              Up
              0
              Down
              ::


              Ti sei spiegato ottimamente.

              Grazie infinite.

              Alla prossima,

              Andrea

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

          Go to top