- Questo topic ha 6 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 17 anni, 10 mesi fa da
DMW.
-
CreatoreTopic
-
14 Novembre 2008 alle 13:26 #28663::
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
-
CreatoreTopic
-
AutoreRisposte
-
-
14 Novembre 2008 alle 14:46 #28664::
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
-
14 Novembre 2008 alle 15:07 #28665::
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.
-
14 Novembre 2008 alle 15:24 #28666::
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
-
14 Novembre 2008 alle 15:43 #28667::
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
-
14 Novembre 2008 alle 16:11 #28668::
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
-
14 Novembre 2008 alle 16:44 #28669
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.