index — ridefinire un comando semplificato

  • Questo topic ha 6 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 17 anni fa da sandro_74.
  • Creatore
    Topic
  • #33324
    Up
    0
    Down
    ::


    Cari utilizzatori LaTeX,

    sto scrivendo la tesi e pensavo di inserire l’indice analitico. E` da parecchio che ci penso, probabilmente non e` un tema nuovo ma mi risulta scomodo dover scrivere prima il testo che apparira` nella tesi e poi il testo per l’indice. Ovviamente questo permette maggiore flessibilita` ma secondo me e` scomodo.

    Cosa ne pensate di una soluzione del tipo:
    `

    \newcommand{\toindex}[1]{\emph{#1}\index{#1}}

    `

    in questo modo il testo che e` nell’index e` enfatizzato semplificando la ricerca nella pagina, ovviamente con questo comando semplice si perde la possibilita` di avere sotto voci nell’index.

    e` una cosa furba o stupida?
    grazie per la vostra opinione

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

      Cari utilizzatori LaTeX,

      sto scrivendo la tesi e pensavo di inserire l’indice analitico. E` da parecchio che ci penso, probabilmente non e` un tema nuovo ma mi risulta scomodo dover scrivere prima il testo che apparira` nella tesi e poi il testo per l’indice. Ovviamente questo permette maggiore flessibilita` ma secondo me e` scomodo.

      Cosa ne pensate di una soluzione del tipo:
      `\newcommand{\toindex}[1]{\emph{#1}\index{#1}}`
      in questo modo il testo che e` nell’index e` enfatizzato semplificando la ricerca nella pagina, ovviamente con questo comando semplice si perde la possibilita` di avere sotto voci nell’index.

      e` una cosa furba o stupida?
      grazie per la vostra opinione

      Ci sono vari difetti in una definizione del genere. Il primo è che non tutte le voci che vuoi indicizzare andranno in corsivo nel testo. Il secondo è un filo più esoterico e riguarda i codici di categoria: se non hai caratteri speciali nelle tuo voci da indicizzare non dovrebbe darti problemi.

      Il difetto principale si risolve togliendo \emph dalla definizione: con
      `\newcommand{\toindex}[1]{#1\index{#1}}`
      puoi tranquillamente scrivere \emph{\toindex{Pippo}}, se desideri che il termine sia in corsivo.

      Per quanto riguarda la possibilità di inserire voci secondarie nell’indice, occorre qualche smanettamento in più. Puoi definire \toindex con un argomento opzionale:
      `\makeatletter
      \newif\ifproofingindex
      \proofingindextrue
      \ifproofingindex
      \let\@emphindex\underline
      \else
      \let\@emphindex\@firstofone
      \fi
      \newcommand{\toindex}[2][]{%
      \@emphindex{#2}%
      \def\@temp{#1}%
      \ifx\@temp\@empty % voce principale
      \index{#2}%
      \else % voce secondaria
      \index{#1!#2}%
      \fi}
      \makeatother`
      Per una voce principale userai \toindex{pippo}, per una voce secondaria \toindex[topolino]{pluto}

      Qual è lo scopo di quelle misteriose righe che cominciano da \newif fino \fi? Semplice: se non commenti la riga \proofingindextrue, le voci che indicizzi saranno sottolineate, in modo da poterle riconoscere durante la stesura del testo. Al momento di stampare la versione definitiva puoi commentare \proofingindextrue e le sottolineature spariranno.

      Ciao
      Enrico

    • #33326
      Up
      0
      Down
      ::


      😮
      grazie mille per questi consigli!
      😯

    • #33327
      Up
      0
      Down
      ::

      😮
      grazie mille per questi consigli!
      😯

      Vediamo un pochino di spiegare tutto per bene. La parte iniziale, da \newif al primo \fi serve per definire una macro che abbia valori diversi se il condizionale che introduciamo è vero o falso. Con
      `\newif\ifproofingindex`
      si definisce un condizionale che inizialmente è falso; la riga successiva lo rende vero, ma se la commentiamo rimarrà falso. Se il condizionale è vero, definiamo \@emphindex equivalente a \underline, altrimenti a \@firstofone che semplicemente restituisce il suo argomento.

      Adesso veniamo alla macro importante, cioè \toindex, che è definita con un argomento opzionale e uno obbligatorio. Il valore normale dell’argomento opzionale è vuoto, ci serve per il primo confronto. Prima di tutto la macro compone nel testo il suo argomento obbligatorio (cioè la parola da indicizzare), dandolo come argomento a \@emphindex, di cui abbiamo già visto l’effetto.

      Successivamente definisce una macro temporanea (\@temp) la cui espansione è l’argomento opzionale. Se questo è assente nella chiamata di \toindex, \@temp è equivalente a \@empty e il condizionale segue il ramo vero, con il risultato di eseguire \index{#2} (ricordo che #1 sta per l’argomento opzionale, #2 per quello obbligatorio).

      Se invece l’argomento opzionale è presente (e non è vuoto), il condizionale \ifx dà falso e quindi viene eseguito \index{#1!#2}.

      In definitiva, \toindex{pippo} compone “\underline{pippo}” o “pippo” a seconda del valore del condizionale \ifproofingindex ed esegue \index{pippo}. Invece \toindex[topolino]{pluto} compone “\underline{pluto}” o “pluto” (come prima) ed esegue \index{topolino!pluto}.

      Le macro \@firstofone e \@empty sono definite nel nucleo di LaTeX:
      `\def\@firstofone#1{#1}
      \def\@empty{}`
      Sebbene sembrino inutili, servono eccome! Ah, fra parentesi, un comando con argomento opzionale è automaticamente robusto.

      C’è una piccola precisazione da fare: commentare \proofingindextrue può cambiare l’impaginazione, perché il termine indicizzato quando il condizionale è vero l’argomento sottolineato è inserito in una \hbox e quindi non partecipa alla sillabazione. La sottolineatura può anche modificare la distanza fra le righe, in casi particolari. Tuttavia non sembrano problemi molto importanti, visto che questa sottolineatura serve solo in fase di stesura.

      Invece di sottolineare si potrebbe usare il colore, definendo
      `\def\@emphindex{#1}{\color{red}#1\normalcolor}`
      invece che con \let\@emphindex\underline. Ma anche questo non è privo di effetti sulla sillabazione.

      Ciao
      Enrico

    • #33328
      sandro_74
      Partecipante
        Up
        0
        Down
        ::


        Buongiorno a tutti.

        Seguendo gli esempi qui presentati, ho ricreato un comando con due argomenti, di cui uno opzionale:

        `
        \documentclass[a4paper,italian]{book}
        \usepackage[latin1]{inputenc}
        \usepackage{babel}

        \makeatletter
        \newcommand{\dub}[2][]{
        \def\@temp{#1}
        \ifx\@temp\@empty
        \textbf{#2}
        \else
        \emph{#1–#2}
        \fi
        }
        \makeatother

        \begin{document}
        \dub[a{]} b{]} c{]} \dots]{d}
        \end{document}
        `

        Se il primo argomento, come in questo caso, contiene alcune parentesi quadre (chiuse),
        per non creare ambiguità con quella che delimita la fine dell’argomento stesso, devo inserirle tra due parentesi graffe.
        Per ragioni di semplicità e di chiarezza, vorrei inserirle direttamente nel testo senza ricorrere ad altri simboli.
        Una possibile alternativa credo sia quella di ridefinire il comando \dub in modo da accettare due parametri (questa volta entrambi obbligatori), di cui uno eventualmente vuoto:
        `
        \newcommand{\dub}[2]{
        \def\@temp{#1}
        \ifx\@temp\@empty
        \textbf{#2}
        \else
        \emph{#1–#2}
        \fi
        }
        `
        ed utilizzarlo in questo modo:
        `
        \dub{a] b] c]}{d}
        `
        anche se nascono alcuni problemi di consistenza nel caso in cui il secondo argomento risulti vuoto.
        Sapreste indicarmi se esiste un modo più agevole?

        Vi ringrazio per la cortese attenzione.

      • #33329
        Up
        0
        Down
        ::

        Buongiorno a tutti.

        Seguendo gli esempi qui presentati, ho ricreato un comando con due argomenti, di cui uno opzionale:

        `
        \documentclass[a4paper,italian]{book}
        \usepackage[latin1]{inputenc}
        \usepackage{babel}

        \makeatletter
        \newcommand{\dub}[2][]{
        \def\@temp{#1}
        \ifx\@temp\@empty
        \textbf{#2}
        \else
        \emph{#1–#2}
        \fi
        }
        \makeatother

        \begin{document}
        \dub[a{]} b{]} c{]} \dots]{d}
        \end{document}
        `

        Se il primo argomento, come in questo caso, contiene alcune parentesi quadre (chiuse),
        per non creare ambiguità con quella che delimita la fine dell’argomento stesso, devo inserirle tra due parentesi graffe.
        Per ragioni di semplicità e di chiarezza, vorrei inserirle direttamente nel testo senza ricorrere ad altri simboli.
        Una possibile alternativa credo sia quella di ridefinire il comando \dub in modo da accettare due parametri (questa volta entrambi obbligatori), di cui uno eventualmente vuoto:
        `
        \newcommand{\dub}[2]{
        \def\@temp{#1}
        \ifx\@temp\@empty
        \textbf{#2}
        \else
        \emph{#1–#2}
        \fi
        }
        `
        ed utilizzarlo in questo modo:
        `
        \dub{a] b] c]}{d}
        `
        anche se nascono alcuni problemi di consistenza nel caso in cui il secondo argomento risulti vuoto.
        Sapreste indicarmi se esiste un modo più agevole?

        Vi ringrazio per la cortese attenzione.

        Puoi più semplicemente scrivere \dub[{a] b] c] \dots}]{d}

        Oppure usare come argomento di delimitazione dell’argomento opzionale qualcos’altro, ma occorre farlo a mano:
        `\makeatletter
        \def\dub{\@ifnextchar<\@dub{\@dub<>}}
        \def\@dub<#1>#2{%
        \def\@temp{#1}%
        \ifx\@temp\@empty
        \textbf{#2}%
        \else
        \emph{#1–#2}%
        \fi
        }
        \makeatother`
        e dovrai scrivere \dub{xyz}. Naturalmente usando <> anche se l’argomento opzionale non contiene parentesi quadre.

        Occhio ai % quando scrivi le definizioni: le tue aggiungono parecchi spazi spuri.

        Ciao
        Enrico

      • #33330
        sandro_74
        Partecipante
          Up
          0
          Down
          ::


          Grazie mille per questi consigli!
          🙂

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

      Go to top