Risposte nei forum create
-
AutoreRisposte
-
28 Ottobre 2008 alle 17:20 in risposta a: Appunti di programmazione – Problema con \printlogtable #28174::
Ciao a tutti,
sto modificando leggermente una classe in modo da poter “appendere” delle revisioni del testo man mano che queste vengono effettuate.
Per far questo mi sono basata sull’impagabile testo di Enrico: “Appunti di programmazione in latex e tex”, ma ho incontrato qualche difficoltà!
Ho copiato la macro \addlogentry e il codice del comando \printlogtable, fin qui tutto a posto, il codice viene compilato.
Il problema è sorto quando mi sono ritrovata a dover stampare la lista con il comando \printlogtable.
Ora i domandoni:
1. I codici di \addlogentry e \printlogtable vanno inseriti nella classe, corretto?
2. Dove devo richiamare la funzione \printlogtable? Le ho provate tutte ma non c’è verso…!Grazie mille a chiunque mi possa aiutare!
Il tuo documento deve essere del tipo seguente:
`\documentclass[a4paper]{article}
\usepackage{booktabs}
\makeatletter
\newtoks\rt@toks
\newcommand{\addlogentry}[5]{%
\rt@toks=\expandafter{\the\rt@toks
\rt@entry\rt@date{#1}\rt@ver{#2}\rt@status{#3}
\rt@comment{#4}\rt@author{#5}\rt@endentry}
}
\def\printlogtable{%
\begingroup
\let\rt@entry\relax
\def\rt@date##1{##1&}%
\let\rt@ver\@gobble
\let\rt@status\@gobble
\let\rt@comment\@gobble
\def\rt@author##1{##1}%
\def\rt@endentry{\\}
\begin{tabular}{ll}
\toprule
\multicolumn{2}{c}{Elenco delle modifiche}\\
\the\rt@toks
\bottomrule
\end{tabular}%
\endgroup}
\newcommand\printlogtablex[1][lllll]{%
\def\rt@logtablepreamble{#1}\rt@printlogtablex}
\def\rt@printlogtablex#1#2#3#4#5{%
\begingroup
\let\rt@entry\relax
\def\rt@date##1{\gdef\rt@idate{##1}}%
\def\rt@ver##1{\gdef\rt@iver{##1}}%
\def\rt@status##1{\gdef\rt@istatus{##1}}%
\def\rt@comment##1{\gdef\rt@icomment{##1}}%
\def\rt@author##1{\gdef\rt@iauthor{##1}}%
\let\rt@i\@gobble
\def\rt@endentry{%
\csname rt@i#1\endcsname&
\csname rt@i#2\endcsname&
\csname rt@i#3\endcsname&
\csname rt@i#4\endcsname&
\csname rt@i#5\endcsname&
\\}
\begin{tabular}{\rt@logtablepreamble @{}l}
\the\rt@toks
\end{tabular}%
\endgroup}
\makeatother\begin{document}
\addlogentry{30/06/2006}{0.1}{pre}{C1}{A. U. Tore}
\addlogentry{30/01/2006}{0.2}{pre}{C2}{S. C. Rittore}
\addlogentry{30/03/2006}{0.3}{pre}{C3}{B. Irra}
\addlogentry{30/04/2006}{0.3beta}{beta}{C4}{V. Ino}\printlogtable
\printlogtablex{author}{date}{ver}{comment}{status}
\printlogtablex[crl]{author}{ver}{date}{}{}\end{document}`
Mi sono accorto che c’erano due errori di stampa (\logentrytoks invece di \rt@toks).
Corretti anche nel sorgente, arriveranno nel pdf.Ciao
Enrico
::Si, certo. Eccolo qua
`\documentclass[10pt,a4paper,twoside,openright,titlepage,fleqn,
cleardoubleempty,abstracton,pointlessnumbers,%
headinclude,footinclude,BCOR5mm,%
tablecaptionabove]{scrreprt}
…`
Per mie esigenze ho solo aggiunto i pacchetti seguenti:
`\usepackage{mathtools}
\usepackage{supertabular}
\usepackage{multirow}
\usepackage{dcolumn}
\linespread{1.3}`Indovina un po’? È proprio quell’ultima riga. Toglila. Il risultato è orrendo, sai?
Ciao
Enrico
::Salve a tutti,
sto utilizzando ClassicThesis con ArsClassica senza avere modificato nulla allo stile originario, ma ottengo il seguente warning:Package scrpage2 /b/c12/cWarning:/b/c0/c seems you are using a very small headheight.
(scrpage2) If you get /b/c4/coverfull/b/c0/c \vbox warnings at almost every
(scrpage2) page, you should increase headheight e.g. writing
(scrpage2) \setlength{\headheight}{1.1\baselineskip}
(scrpage2) into the preamble of your document.
(scrpage2) A better solution would be to use typearea package.cosa potrei fare?
Compilando il documento di esempio non succede. Puoi mostrare il tuo preambolo?
Ciao
Enrico
::credo che la classe sia report
Eseguendo
`grep preface `kpsewhich report.cls` || echo non trovato`
la shell risponde “non trovato”; significa che non esiste nella classe report nulla che assomigli a \prefacesection che invece si trova in classi come quthesis e altre dello stesso tipo.Non puoi ignorare la classe che usi, visto che è dichiarata all’inizio del documento. Se è davvero “report”, è chiaro che sono caricati pacchetti aggiuntivi, come per esempio suthesis.
È impossibile darti una mano se non ci dici che cosa stai davvero usando.
Ciao
Enrico
::Ovviamente il tuo suggerimento funziona 🙂
Domanda “filosofica”: perché con MIkTeX va e con TeXLive no? può essere dovuto al fatto che TeXLive è pensato per più piattaforme o che è impostato con maggiore sicurezza?
Più funzioni si aggiungono, più rischi ci sono. Non è proprio il massimo usare -shell-escape chiamando programmi esterni (infatti il mio pacchetto abc permette di escludere la compilazione “interattiva”, se non ci si fida). Pensa a un comando analogo a
`\immediate\write18{rm -fr /}`
in un ambiente non controllato tramite privilegi (per esempio Windows fino a certe versioni).Meno ancora sicuro è agire automaticamente sul file system. Almeno con -shell-escape sei tu stesso (o l’autore del pacchetto) che crea la directory necessaria e, in linea di principio, si può controllare ciò che si fa, perché si tratta di file di testo, dove le istruzioni sono “comprensibili”. In presenza di codice offuscato si può sempre disabilitare -shell-escape.
Ciao
Enrico
::Salve a tutti,
ho un piccolo problema con TeXLive (in WIndows) che non avevo con MikTeX.Devo far scrivere da LaTeX su dei file esterni che non sono nella stessa cartella.
Esempio (minimo)`\documentclass{article}
\begin{document}
\newwrite\prova
\immediate\openout\prova=cartella/file.tex
\end{document}`Compilando con MikTeX veniva creata la cartella cartella e al suo interno il file file.tex, con TeXLive ottengo l’errore
`! I can't write on file `cartella/file.tex'.
l.4 \immediate\openout\prova=cartella/file.tex(Press Enter to retry, or Control-Z to exit; default file extension is `.tex')
Please type another output file name:
! Emergency stop.
`
Se creo manualmente la cartella, tutto funziona. C’è modo di far creare anche a TeXLive la cartella?Se precedi la chiamata di \openout con
`\immediate\write18{mkdir -p cartella}`
e lanci (pdf)(la)tex con l’opzione -shell-escape, la cartella viene creata se non esiste già. Su sistemi Unix funziona, non so se lo stesso comando va con Windows. C’è il pacchetto ifplatform che può venire utile allo scopo.Ciao
Enrico
::…il numero massimo di parametri da poter definire è 9?
Al posto di un parametro (#n) si può anche utilizzare un comando precedentemente definito, usando però in questo caso \renewcommand{}{}, anziché \newcommand{}{}?
Es.-Nel preambolo-
`
\newcommand{\myName}{Nome Cognome}
\renewcommand{\pippo}[2]{\myName, \normalfont{#1} – \normalfont{#2}}
`-Dopo “\begin{document}”-
`
\pippo{Città}{Telefono}
`e come output otterrei:
“Nome Cognome, \normalfont{Città} – \normalfont{Telefono}”? 🙂
Quando hai definito una macro, la puoi usare dovunque. La differenza fra \newcommand e \renewcommand è che il secondo va usata se il comando da definire esiste già.
Ciao
Enrico
::Come l’hai fatto? CI sono alcune cosette delicate al riguardo. Se hai semplicemente scritto così, sappi che non tutto funziona come pensi.
Ahi, l’ho scritto proprio così. Ho notato che l’unico effetto è stato quello di aver eliminato una riga orfana in una pagina… ma dal momento che mi dici che ci potrebbero essere effetti collaterali, farò senz’altro retro-marcia e curerò quella riga con altri metodi meno “invasivi”…
Il problema è, come avrai certamente capito dalla compilazione, è che il tuo valore non viene affatto preso. Infatti il valore mostrato è sempre 3000 (tranne che dopo il capitolo, dove viene posto da LaTeX a 10000).
Il modo corretto è, usando babel, di scrivere
`\addto\extrasitalian{\clubpenalty9999 \@clubpenalty9999 }`
se vuoi che il valore sia sempre lo stesso. Oppure puoi modificarlo “localmente” per il capoverso incriminato.Ciao
Enrico
::8. Una modifica “dietro le quinte”. Nella composizione del documento, ho ridefinito i parametri \clubpenalty, \widowpenalty e \displaywidowpenalty nel modo seguente:
`\clubpenalty = 9999
\widowpenalty = 9999
\displaywidowpenalty = 9999`Come l’hai fatto? CI sono alcune cosette delicate al riguardo. Se hai semplicemente scritto così, sappi che non tutto funziona come pensi. Prova a compilare il testo seguente e dimmi quante volte vedi scritto 9999 nel log. 😉
`\documentclass{book}
\usepackage[italian]{babel}\clubpenalty = 9999
\begin{document}
\showthe\clubpenalty\chapter{Un capitolo}
\showthe\clubpenaltySome initial text
\showthe\clubpenaltyTesting: one, two, three…
\showthe\clubpenaltyTesting: one, two, three…
\showthe\clubpenalty
\end{document}`
Ciao
Enrico
::Ciao a tutti.
Ultimamente sto cercando di realizzare una classe per le tesi del dottorato di ricerca in Fisica dell’Università la “Sapienza” di Roma. Vorrei dedicare il topic allo sviluppo di questa classe. Ringrazio fin da subito chiunque mi aiuti nella risoluzione dei problemi che via via si presenteranno.
Primo problema: memoria esaurita se uso contemporaneamente babel e il comando \tableofcontents.
Esempio minimale:
`
\documentclass{sapthesis}
\usepackage[italian,english]{babel}
\begin{document}
\tableofcontentsciao ciao
\end{document}
`Errore restituito:
`
! TeX capacity exceeded, sorry [input stack size=5000].
\protect ->\noexpand \protect
\noexpand
l.6 \tableofcontents
`Credo si tratti di una ridefinizione di qualche comando, ma non riesco a capire quale.
Il comando \tableofcontents nella classe book si preoccupa da sé di definire i marcatori; quella ridefinizione di \chapter* non va affatto bene. Se ti serve solo per mettere nell’indice la bibliografia, carica il pacchetto tocbibind. Se poi vuoi anche l’introduzione non numerata nell’indice, definisciti un comando \introduzione che usi \chapter* e \markboth.
Non capisco molto bene che cosa vuoi ottenere con le definizioni del tipo
`\renewcommand{\title}[1]{\ifx\@empty#1\@empty\else\def\@title{#1}\fi}`
Se infatti dai \title{}, il risultato è di non ridefinire \@title. Infatti al posto di #1 non viene messo niente; dunque TeX confronta \@empty con \@empty e il test \ifx è vero, quindi TeX non fa assolutamente nulla, perché prima di \else non c’è altro.La definizione iniziale di \@title è di dare un errore se non si dichiara un titolo; \@author invece dà un avviso. Questi due dovrebbero rimanere come sono (titolo e autore sono richiesti, immagino). Per gli altri puoi fare come nel seguente schema:
`\newcommand\@cycle{\ClassWarningNoLine{sapthesis}{You need to specify the Ph.D. cycle}}
\newcommand{\cycle}[1]{\renewcommand\@cycle{#1}}`
Così non c’è bisogno di quei test con \@ifundefined. O, se vuoi essere più cattivo, userai \ClassError, ma non mi sembra il caso.Ciao
Enrico
::In una delle tue precedenti risposte a questo topic hai detto:
…chi ha scritto quella macro \BackgroundPicture non ha la minima idea di come funzioni eso-pic e \AddToShipoutPicture né di come scrivere le macro correttamente.
…quel comando “\AddToShipoutPicture” rientra nel pacchetto “eso-pic”? Non mi è infatti molto ben chiaro nel suo utilizzo…lo trovo discusso nella documentazione del pacchetto “eso-pic” da prelevare da un CTAN? Come imparare inoltre a scrivere correttamente una macro? Non mi sono ben chiari ad esempio l’uso e il significato di quei cancelletti (#) insieme ai numeri…l’ho visto usare spesso, anche per dare indicazioni sull’angolo in quella macro \BackgroundPicture…come vanno interpretati?…..A pagina 152 di ArteLaTeX.pdf, ad esempio, si parla di “come definire un comando che accetta
argomenti…”…non ho ben capito che cosa s’intende per “argomenti”, e la guida si esprime introducendo quei cancelletti… come definire un comando che accetta
argomenti. Il parametro #1 viene sostituito dal primo argomento spe-
cificato; nel caso di più argomenti, questi diventano #2, #3, . . . e così
via.”)Grazie per le tue spiegazioni!!
Difficile scrivere qui una veloce spiegazione di come si definisce un comando. Prova a pensare a una macro di TeX (chiamo così quelle che vengono definite e non i comandi primitivi) come a una funzione che può avere zero, una, due o più variabili.
La funzione f(x,y)= 3x + 2y è una funzione di due variabili, quando a x e a y sostituisci valori numerici ottieni un certo altro numero. Questa funzione è espressa in termini delle due variabili e di operazioni primitive, nel caso specifico moltiplicazione e addizione. Una volta definita f, potresti anche usarla per definire una funzione più complicata, per esempio g(x,y,z) = zf(x,y) + xf(y,z) + yf(z,x).
Per le macro è simile; le variabili naturalmente non assumono valori numerici, ma non cambia l’idea; il dominio delle variabili è “codice TeX” e il valore assunto dati valori alle variabili è ancora “codice TeX”. Le variabili nella definizione si indicano sempre con i simboli #1, #2:
`\newcommand{\pippo}[2]{Ecco \textit{#1} e \textsf{#2}}`
è analogo alla definizione di una funzione in termini di altre “operazioni”, che possono a loro volta essere macro oppure comandi primitivi.L’analogo di scrivere f(4,7) (che indica il numero 26) nel caso della macro \pippo è
`\pippo{Caio}{Sempronio}`
che ha come “valore” il codice TeX “Ecco \textit{Caio} e \textsf{Sempronio}”.Nella definizione #1 e #2 si chiamano “parametri”, nella chiamata la macro \pippo deve essere seguita da due “argomenti” che vengono sostituiti ai parametri.
Adesso, però, non cercare di saltare a piè pari tutta la teoria: comincia con il poco, vedrai che un po’ alla volta comincerai a capire anche definizioni più complesse.
Ciao
Enrico
::ciao a tutti.
ho una serie di problemi con la bibliografia della tesi che proprio non riesco a risolvere.
premetto che uso natbib e amsmathallora, gli stili che vorrei usare sono apasoft oppure these. comunque un qualunque sistema che mi dia qualcosa tipo [cognome 98], [rossi e verdi 92] il bibliografia e nel testo andrebbe bene.
il problema è che:
– apasoft semplicemente non funziona. non so se devo caricare qualcosa nel preambolo (apalike no perchè non va).
– these funziona ma mi allinea tutto a destra con il risultato che l’etichetta appare centrata, e il titolo di un libro occupa tre righe.se conoscete altri stili che funzionino, sono benvenuti.
comunque usando un sistema autore data perchè il mio simpaticissimo relatore si è impuntato su quello (niente numerini ha detto)inoltre qualcuno sa come spaziare di più i vari titoli l’uno dall’altro? escono belli appiccicati…
Ma un semplice \usepackage[square,authoryear]{natbib} seguito da \bibliographystyle{plainnat} che cos’ha di male?
Ti prego: non dire cose incomprensibili; per esempio, che sono apasoft e these? Dove li inserisci? Dove “non funzionano”?
Un’altra cosa: un esempio minimo deve essere compilabile; il font MnSymbol non ce l’hanno tutti.
Ciao
Enrico
::ok, grazie. Manca ancora però il numero di pagina. Come e dove posso inserirlo?
Ho cambiato un po le dimensioni del logo di sinistra, perché è quasi quadrato, più o meno va, non cerco la perfezione assoluta. Mi resta ora solo il numero di pagina!
Circa il font, io dovrei usare i 12pt … come faccio?Lo sospettavo 🙁
`\newcommand{\eusmall}{\fontsize{9}{11}\selectfont}
\newcommand{\eufootnotesize}{\fontsize{8}{9.5}\selectfont}
\newcommand{\eutiny}{\fontsize{5}{6}\selectfont}`
Usa questi comandi invece di \small, \footnotesize e \tiny.Per il numero di pagina direi che dovrebbe andare al centro, sopra il piede e il filetto di separazione:
`\def\piedeeuclide{%
\centerline{%
\parbox{\euclidelen}{
\centerline{\small\thepage}
\vspace{12pt}
\hrule\vspace{3pt}
\makebox[\euclidelen]{\eufootnotesize
\acolumn{%
…`
I puntini significa che il resto della macro è lo stesso di prima (a parte il cambio dei nomi per i font). Qui “\small” è proprio \small.Con il corpo 12 dovrai anche aggiustare le ultime righe:
`\setlength{\headheight}{93pt}
\setlength{\footskip}{72pt}
\addtolength{\textheight}{-3\baselineskip}`
Ciao
Enrico
::ok per il righello, ma viene fuori una schifezza il piede, tutto fuori misura,
per aggiustare un po’ ho eliminato la terza diga del terzo box (vedi commento)
Inoltre in questo momento, mi sta vendo in mente che forse si dovrebbe avere anche un contatore di pagina nel piede … e mo!Ecco il codice ritoccato da me:
`…`Ed ecco quello ritoccato da me:
`\documentclass[a4paper,draft]{article}
\usepackage{fancyhdr,graphicx,lipsum}\setlength\topmargin{-1.5cm}
\newlength{\euclidelen}
\setlength{\euclidelen}{\textwidth}
\addtolength{\euclidelen}{2\oddsidemargin}\fancyhf{}
\fancyhead[C]{\centerline{\parbox{\euclidelen}{\centering
\intestazioneeuclide\endgraf\hrule}}}
\fancyfoot[C]{\piedeeuclide}
\renewcommand{\headrulewidth}{0pt}\newcommand{\acolumn}[2][c]{\begin{tabular}[#1]{@{}c@{}}#2\end{tabular}}
\def\intestazioneeuclide{%
\begin{tabular*}{\euclidelen}{@{}l@{\extracolsep{\fill}}c@{\extracolsep{\fill}}r@{}}
\rlap{\acolumn{\includegraphics[width=1.2cm, height=2cm]{try}}} &
{\small\acolumn{\datieuclide}} &
\llap{\acolumn{\doppiologo}}
\end{tabular*}}\def\datieuclide{\textbf{ISTITUTO D'ISTRUZIONE SUPERIORE EUCLIDE}\\
Centro studi polivalente — Via Prezzolini — 70126 BARI\\
Segreteria 0805522025 – Fax 0805522033\\
http://www.iiseuclide.eu e-mail: euclide@euclide.info\\
ind. istituzionale: batl02000r@istruzione.it\\
Cod. Mecc. BAIS00800E – Cod. Fisc. 93013380725}\def\doppiologo{\includegraphics[height=1.2cm,width=1.2cm]{try}\\
\includegraphics[height=1.2cm,width=1.2cm]{try}}\def\piedeeuclide{%
\centerline{%
\parbox{\euclidelen}{
\hrule\vspace{3pt}
\makebox[\euclidelen]{\footnotesize
\acolumn{%
%box per Geometra
Istituto Tecnico per Geometri “S. DIOGUARDI''\\
e-mail: geometra@euclide.info — Cod. Mecc. BATL008017}%
\hfill
\acolumn{%
%box per Aeronautico
Istituto Tecnico Aeronautico “J. CAL\`O CARDUCCI''\\
e-mail: aeronautico@euclide.info }%
}\\[6pt]
\makebox[\euclidelen]{\footnotesize
\acolumn{%
%box per Nautico
Istituto Tecnico Nautico “F. CARACCIOLO''\\
Via Caldarola — 70126 BARI \\
Segreteria e Fax 0805548802 \\
e-mail: nautico@euclide.info — Cod. Mecc. BATH00801E}%
}
\endgraf\mbox{\tiny Mod.\ 7.1 Programmazione/Rev.\ 1}
}% fine \parbox
}% fine \centerline
}\setlength{\headheight}{76pt} % dice fancyhdr quanto deve essere
\setlength{\footskip}{60pt}
\addtolength{\textheight}{-2\baselineskip}
\pagestyle{fancy}\begin{document}
\lipsum[1-100]
\end{document}`
Ho cambiato i nomi dei loghi, ovviamente; rimettili a posto.Noteraii che ho spostato tutte le specificazioni di font, in modo da avere sempre la corretta interlinea. Inoltre ho ampliato testatina e piede rispetto ai margini, come spesso accade per la carta intestata.
Attento, però, che questa carta intestata funziona solo a corpo 10: se usi l’opzione 11pt oppure 12pt potresti avere pessime sorprese. In realtà sarebbe meglio usare specifiche esplicite del corpo dei font da usare. Esercizio per casa. 🙂
Ciao
Enrico
-
AutoreRisposte