Davide Manià

Risposte nei forum create

Stai visualizzando 9 risposte – dal 1 al 9 (di 9 totali)
  • Autore
    Risposte
  • in risposta a: Sezioni dell’indice analitico nella ToC generale #80174
    Up
    0
    Down
    ::


    ehm… non serve a niente 😳 infatti senza il risultato è identico. Dev’essere rimasto lì per errore dai tentativi precedenti.

    in risposta a: Sezioni dell’indice analitico nella ToC generale #80171
    Up
    0
    Down
    ::


    una piccola aggiunta, viene inserito un commento all’inizio per permettere al programma di sapere se il file è già stato modificato, nel qual caso esce senza far nulla

    `
    #include
    #include
    #include

    using namespace std;

    const string bookmarks[] = {“A-C”, “D-F”, “G-I”, “J-L”,
    “M-O”, “P-R”, “S-U”, “V-X”, “Y-Z”};

    const string token(“– \\textbf{“);
    const string modifiedMark = “%makebookmark”;

    int main(int argc, char *argv[])
    {
    if(argc==1)
    {
    cout << "error: input file not specified"; return 1; } ifstream inputFile; ofstream outputFile; string inputFileName(argv[1]); string outputFileName("temp.txt"); inputFile.open(inputFileName.c_str(), ios::in); if(inputFile.is_open()) { cout << inputFileName << " opened for reading\n"; } else { cout << "failed to open " + inputFileName; return 1; } outputFile.open(outputFileName.c_str(), ios::out); if(outputFile.is_open()) { cout << "temporary file opened for reading\n"; } else { cout << "failed to open " + outputFileName; return 1; } string currentLine; char buffer[1024]; int lines=0; bool changeNextLine = false; bool changeThisLine = false; size_t found; int bookPos; outputFile << modifiedMark << "\n"; while(!inputFile.eof()) { changeThisLine = changeNextLine; changeNextLine = false; inputFile.getline(buffer, 1024); currentLine = buffer; if(currentLine == modifiedMark) // file has been already processed { cout << "Index file already processed, skipping\n"; return 0; } found = currentLine.find(token); if(found!=string::npos) { int pos = int(found)+token.length(); char letter = currentLine[pos]; if((letter-'A')%3 == 0) { bookPos = (letter-'A')/3; cout << "Found letter " << letter << endl; changeNextLine = true; } } outputFile << buffer << endl; if(changeThisLine) { outputFile << "\\phantomsection\n"; outputFile << "\\pdfbookmark[1]{" << bookmarks[bookPos] << "}" << "{indexbookmark" << bookmarks[bookPos][0] << "}\n"; } lines++; } inputFile.close(); outputFile.close(); remove(inputFileName.c_str()); rename(outputFileName.c_str(), inputFileName.c_str()); cout << inputFileName << " succesfully modified\n"; cout << lines << " lines processed\n"; return EXIT_SUCCESS; } `

    in risposta a: Sezioni dell’indice analitico nella ToC generale #80170
    Up
    0
    Down
    ::


    ho risolto il problema facendo un giro un po’ largo. In sostanza ho scritto un programmino (in c++ perché lo conosco, ma andrebbe ugualmente bene un altro linguaggio) che manipola il file .ind prodotto da makeindex inserendo i comandi per creare i bookmark di hyperref per il pdf.

    nel file .sty ho inserito questi comandi (ok il mio latex fa schifo, ma soprassediamo)

    `
    headings_flag 1
    heading_prefix “\\vspace\{-6pt\}\\parbox\{\\columnwidth\}\{\\hspace\{0\\columnwidth\}\\centering\{\\normalsize — \\textbf\{”
    heading_suffix “\} –\}\}\\vspace\{3pt\}\\nopagebreak\n\%bookmark\n”
    `

    il codice del programma c++ è questo:
    `
    #include
    #include
    #include

    using namespace std;

    const string bookmarks[] = {“A-C”, “D-F”, “G-I”, “J-L”,
    “M-O”, “P-R”, “S-U”, “V-X”, “Y-Z”};

    const string token(“– \\textbf{“);

    int main(int argc, char *argv[])
    {
    if(argc==1)
    {
    cout << "error: input file not specified"; return 1; } ifstream inputFile; ofstream outputFile; string inputFileName(argv[1]); string outputFileName("temp.txt"); inputFile.open(inputFileName.c_str(), ios::in); if(inputFile.is_open()) { cout << inputFileName << " opened for reading\n"; } else { cout << "failed to open " + inputFileName; return 1; } outputFile.open(outputFileName.c_str(), ios::out); if(outputFile.is_open()) { cout << "temporary file opened for reading\n"; } else { cout << "failed to open " + outputFileName; return 1; } string currentLine; char buffer[1024]; int lines=0; bool changeNextLine = false; bool changeThisLine = false; size_t found; int bookPos; while(!inputFile.eof()) { changeThisLine = changeNextLine; changeNextLine = false; inputFile.getline(buffer, 1024); currentLine = buffer; found = currentLine.find(token); if(found!=string::npos) { int pos = int(found)+token.length(); char letter = currentLine[pos]; if((letter-'A')%3 == 0) { bookPos = (letter-'A')/3; cout << "Found letter " << letter << endl; changeNextLine = true; } } outputFile << buffer << endl; if(changeThisLine) { outputFile << "\\phantomsection\n"; outputFile << "\\pdfbookmark[1]{" << bookmarks[bookPos] << "}" << "{indexbookmark" << bookmarks[bookPos][0] << "}\n"; } lines++; } inputFile.close(); outputFile.close(); remove(inputFileName.c_str()); rename(outputFileName.c_str(), inputFileName.c_str()); cout << inputFileName << " succesfully modified\n"; cout << lines << " lines processed\n"; return EXIT_SUCCESS; } ` dopo la sua esecuzione il file .ind diventa questo (ad esempio) ` \begin{theindex} \vspace{-6pt}\parbox{\columnwidth}{\hspace{0\columnwidth}\centering{\normalsize -- \textbf{A} --}}\vspace{3pt}\nopagebreak %bookmark \phantomsection \pdfbookmark[1]{A-C}{indexbookmarkA}` Praticamente cerca le righe nelle quali c'è una delle lettere di intestazione e una volta ogni tre aggiunge un bookmark. Il programma andrebbe richiamato dopo makeindex, passandogli come parametro il file .ind da questo ottenuto. Per automatizzare (uso TexnicCenter) ho copiato l'eseguibile del mio programma in "C:\Program Files" (ma qualsiasi posto va bene) e poi impostato il preprocessor di TexnicCenter in modo che lo richiami ogni volta prima di invocare Latex. L'immagine allegata mostra l'impostazione. [attachment=500]proprocessore.png[/attachment] In questo modo l'indice generale rimane pulito, mentre nel pdf si vedono i riferimenti che tutto sommato sono utili, e il procedimento funziona senza pensarci ogni volta che si compila il documento. [attachment=499]acrobat.png[/attachment] il programmino è fatto velocemente, non fornisce i risultati corretti se manca qualche lettera (ad esempio se nessuna voce comincia per "D" il segnalibro "D-F" non viene inserito... volendo comunque ci si mette poco a perfezionarlo. ciao Davide

    Attachments:
    You must be logged in to view attached files.
    in risposta a: Sezioni dell’indice analitico nella ToC generale #80169
    Up
    0
    Down
    ::

    egreg9″ post=79353

    Confondi indice con segnalibri; nell’indice (generale) non metterei mai e poi mai questi riferimenti.

    Non vedo come si possa automatizzare questa scelta arbitraria di gruppi di voci. Ma non dovrebbe essere difficile aggiungere un bookmark per ogni lettera. Ci penso.

    sui segnalibri hai ragione, non ho usato il termine giusto. L’aggiunta di un bookmark è facile, ma il problema è (ovviamente) che deve andare nel file .ind

    intanto grazie
    Davide

    in risposta a: Indice automatico delle citazioni #79606
    Up
    0
    Down
    ::


    ho provato la soluzione che fa uso di \newlistof e memoir, funziona quasi bene, tranne per il fatto che nell’elenco al posto del numero della citazione compare solo un numero consecutivo che ricomincia da 1 ad ogni capitolo. Nell’esempio che mi avete fornito l’elenco mostra correttamente il capitolo e il numero della citazione (come fa quello standard delle figure, per capirsi), ma in quello che ho fatto con memoir il comportamento è diverso. Allego un piccolo file con il frutto di qualche ora di sudore 🙂

    `
    \documentclass[a4paper]{memoir}
    \usepackage{lipsum}

    \newlistof{listofquotes}{loq}{Elenco delle citazioni}
    \newcounter{numcitazione}[chapter]

    \newenvironment{citazione}[1]{%
    \begin{quote}\em
    \refstepcounter{numcitazione}
    \addcontentsline{loq}{numcitazione}{\protect{\numberline{\thenumcitazione}#1}}\par}
    {\end{quote}}

    \addtodef{\insertchapterspace}{}%
    {\addtocontents{loq}{\protect\addvspace{10pt}}}

    \newlistentry{numcitazione}{loq}{0}

    \begin{document}

    \chapter{Inizio}
    \lipsum[1-2]
    \begin{citazione}{Pippo e Pluto}
    \lipsum[4-5]
    \end{citazione}

    \lipsum[1-6]

    \begin{citazione}{Paperino}
    \lipsum[4-5]
    \end{citazione}

    \chapter{Avanti}
    \lipsum[1-2]
    \begin{citazione}{Pippo e Topolino}
    \lipsum[4-5]
    \end{citazione}

    \lipsum[1-6]

    \begin{citazione}{Minnie}
    \lipsum[4-5]
    \end{citazione}

    \clearpage
    \listofquotes

    \end{document}
    `

    Nella versione senza memoir il file .loq contiene righe come questa:

    `\contentsline {citazioni}{\numberline {1.1}Pippo e Pluto}{3}`

    mentre il file inserito qui sopra produce righe diverse:

    `\contentsline {numcitazione}{{\hbox to\@tempdima {1\hfil }Pippo e Pluto}}{1}`

    Questo in generale, poi per le modifiche all’ambiente “citazione” non dovrebbero esserci grossi problemi (ad esempio per mostrare il nome dell’autore o cose del genere).

    Mi dispiace (e infastidisce un po’) di non riuscire a risolvere da solo, ad essere sincero pur programmando computer da una vita, con linguaggi di ogni tipo dall’assembler al C++, non riesco a penetrare la filosofia dei comandi e delle macro di LaTeX… mi sembra tutto così ingarbugliato che non so da che parte cominciare. Fin che si tratta dell’uso “normale” tutto va bene, ma per le cose un po’ più sofisticate il mistero si fa fitto. Voi esperti avete tutta la mia ammirazione! Esiste un modo per ringraziare voi o il forum per l’aiuto che date?

    in risposta a: Indice automatico delle citazioni #79604
    Up
    0
    Down
    ::


    ringrazio ancora entrambi per la cura con la quale avete risposto. Ho provato l’esempio e funziona bene. Sfortunatamente nel mio libro viene impiegata la classe memoir, che in teoria dovrebbe emulare tocloft ma evidentemente non lo fa bene come servirebbe, perché la compilazione si interrompe con un messaggio di errore. Cercherò con calma di studiare i manuali di tocloft e memoir per capire come risolvere il problema, ci vorrà un po’ perché sono poderosi ma conto di farcela.

    in risposta a: Indice automatico delle citazioni #79602
    Up
    0
    Down
    ::


    vi ringrazio per la pronta risposta, entrambi i metodi mi sembrano validi. Li proverò quanto prima, e vi farò sapere dei risultati. Sperando che l’autore del metodo che non verrà scelto non si offenda 🙂

    in risposta a: l’indice analitico non mi funziona più 🙁 #79184
    Up
    0
    Down
    ::


    Nel mio caso aggiornando manualmente hyperref all’ultima versione (grazie per la segnalazione!) il problema è stato risolto. Probabilmente il repositorio al quale accede la mia installazione di MikTex non era perfettamente aggiornatato e invece dell’ultima ha installato la penultima.

    in risposta a: l’indice analitico non mi funziona più 🙁 #79182
    Up
    0
    Down
    ::


    ho incontrato anch’io lo stesso errore proprio stamani, e avendo trovato questo articolo cercando di risolvere il problema mi sono iscritto per dare un piccolo contributo, pur non essendo affatto un esperto di Latex.

    Nel mio caso (TexnicCenter 2.0 alpha 4, MikTex 2.9 su windows 7) la compilazione dell’indice analitico non ha più funzionato dopo l’aggiornamento dei vari package all’ultima versione. Una breve indagine mi ha permesso di ottenere un funzionamento corretto ripristinando hyperref alla versione precedente, che era la 6.82m. Non so se il problema è dovuto ad un conflitto con Memoir che da quel che mi par di capire emula makeidx o cos’altro, e neppure se installando una versione di hyperref più recente (ma non l’ultima) il malfunzionamento si sarebbe riproposto o meno.

    Per ora il sistema così com’è fa quello che deve fare e non vorrei rischiare troppi esperimenti per paura di destabilizzare tutto quanto e doverci perdere tempo, magari qualcuno più esperto di me potrà dare un consiglio più preciso.

    ciao
    Davide

Stai visualizzando 9 risposte – dal 1 al 9 (di 9 totali)

Go to top