Problema con \hypertarget, \hyperlink

  • Creatore
    Topic
  • #110350
    Up
    0
    Down
    ::


    Ciao a tutti,
    visto che è la mia prima domanda qui sul forum, prima di tutto spendo due parole su me stesso: mi chiamo Giacomo, 32 anni, uso LaTeX perché mi piace e perchè ho la fortuna di lavorare in un’azienda che mi lascia la massima libertà sull’editor con cui comporre i testi 😉 .

    Sto lavorando su un documento con parecchi riferimenti ipertestuali per cui, nel tentativo di snellire quanto più possibile il testo, ho definito nel preambolo questi comandi:

    `
    \newcommand{\target}[1]{\hypertarget{#1}{\emph{#1}}}
    \newcommand{\link}[1]{\hyperlink{#1}{\emph{#1}}}
    `

    Tutto bene finché nell’argomento dei due comandi non compare qualche carattere speciale; in questo caso il link smette di funzionare.
    Ho provato a modificare i comandi come segue ma senza risultato:
    `
    \newcommand{\target}[1]{\hypertarget{\strsubstitute[0]{#1}{\_}{}}{\emph{#1}}}
    \newcommand{\link}[1]{\hyperlink{\strsubstitute[0]{#1}{\_}{}}{\emph{#1}}}
    `

    Ringrazio anticipatamente chi mi risponderà.

    Giacomo

Visualizzazione 3 filoni di risposte
  • Autore
    Risposte
    • #110351
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Benvenuto nel forum, Giacomo.
        Direi che il tuo problema dipende dal fatto che non devi mai usare caratteri speciali fuori dai contesti in cui sono previsti. In particolare l’underscore _ che viene usato spessissimo in altri contesti, ma in LaTeX dovrebbe essere usato solo in matematica. Ultimamente sembra che sia consentito nelle operazioni che coinvolgono nomi di file, ma la regola numero 1 e quella di non usare caratteri speciali.

        So che esistono metodi strani che imbrogliano il programma di compilazione mediante impostazioni che lavorano con \uppercae e \lowercase; nel TeXbook ce ne sono alcuni esempi.
        Se ci dicessi con più dettaglio quello che vuoi fare, sarebbe utile per trovare una soluzione; e un esempio minimo compilabile (EMC) sarebbe utile.
        Non sono sicuro di saperti trovare una soluzione, ma con un EMC forse qualcun altro potrebbe farlo.

        PS: Un EMC è un file che comincia con \documentclass e finisce con \end{document} e contiene il minimo indispensabile per riprodurre i problema quando si compila il file.

      • #110352
        Up
        0
        Down
        ::


        Ciao Claudio,
        purtroppo il fatto che alcuni nomi che devo trascrivere contengano il trattino basso è indipendente dalla mia volont“a 😉
        Il testo che sto scrivendo è pieno di riferimenti, quindi per snellire il codice avevo provato questo:
        `
        \documentclass{article}
        \usepackage{hyperref}

        \newcommand{\target}[1]{\hypertarget{#1}{\emph{#1}}}
        \newcommand{\link}[1]{\hyperlink{#1}{\emph{#1}}}

        \begin{document}
        \target{Homer\_Simpson}
        \newpage
        \link{Homer\_Simpson}
        \end{document}
        `

        Apparentemente il problema qui consisterebbe nel fatto che il primo argomento di \hyperlink e \hypertarget non accetta il trattino basso.
        Ho provato con quest’altro ma il risultato non è cambiato, anzi…

        `
        \documentclass{article}

        \usepackage{xstring}
        \usepackage{hyperref}

        \newcommand{\target}[1]{\hypertarget{\strsubstitute[0]{#1}{\_}{}}{\emph{#1}}}
        \newcommand{\link}[1]{\hyperlink{\strsubstitute[0]{#1}{\_}{}}{\emph{#1}}}

        \begin{document}
        \target{Homer\_Simpson}
        \newpage
        \link{Homer\_Simpson}
        \end{document}
        `

        Chiaramente il codice successivo funziona perfettamente, ma per l’esigenza scritta sopra qualcosa di più furbo sarebbe gradito 🙂
        `
        \documentclass{article}

        \usepackage{hyperref}

        \newcommand{\target}[2]{\hypertarget{#1}{\emph{#2}}}
        \newcommand{\link}[2]{\hyperlink{#1}{\emph{#2}}}

        \begin{document}
        \target{HomerSimpson}{Homer\_Simpson}
        \newpage
        \link{HomerSimpson}{Homer\_Simpson}
        \end{document}
        `

        Grazie mille

        Giacomo

      • #110353
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Personalmente credo che se lasci uno spazio al posto di \_, ottieni un risultato migliore. All’occorrena puoi sempre usare il comando \textunderscore che ti produce la barra ribassata senza problemi, oppure puoi usare [tt]\char95[/tt] che ti da quel segno senza usare macro; oppure potresti usare [tt]^^5f[/tt] che è l’equivalente esadecimale che non usa barre o altre cose che potrebbero irritare quei due comandi di hyperref.

          La mia idea è che io userei semplicemente lo spazio. l’underscore non fa certamente parte del nome proprio che vuoi citare.

        • #110354
          Up
          0
          Down
          ::


          Premetto che non comprendo assolutamente il motivo per il quale si vuole introdurre un tale vincolo di identità tra il nome simbolico, usato internamente, di un riferimento/collegamento e il testo stampato a cui esso corrisponde.

          Comunque, è sbagliata l’impostazione, giacché un comando come [tt]\_[/tt] non può comparire in una «stringa PDF» quale è (più o meno) il nome di un riferimento; piuttosto, si usi il pacchetto url, già caricato automaticamente da hyperref. Si noti però che hyperref ridefinisce il comando [tt]\url[/tt] definito dal pacchetto url assegnandogli il nuovo nome [tt]\nolinkurl[/tt] (perché hyperref definisce un suo proprio comando [tt]\url[/tt] con diversa funzione). Ecco un esempio compilabile di ciò che intendo, con incluse alcune spiegazioni:

          `
          \documentclass[a4paper]{article}
          \usepackage[T1]{fontenc}
          \usepackage[italian]{babel} % controllo compatibilita`: **sembra** OK
          \usepackage{hyperref}

          \urlstyle{same} % lo si desidera davvero?
          \newcommand*{\target}[1]{\hypertarget{#1}{\emph{\nolinkurl{#1}}}}
          \newcommand*{\link}[1]{\hyperlink{#1}{\emph{\nolinkurl{#1}}}}

          \begin{document}

          Questa \`{e} la destinazione: \target{Homer_Simpson}.

          \newpage

          Questo \`{e} il collegamento: \link{Homer_Simpson}.

          Funziona anche con \emph{alcuni} altri dei caratteri <>, ma non con
          tutti; per esempio, \`{e} lecita la seguente destinazione:
          \target{Homer{}$&^_Simpson}.

          \newpage

          Ed ecco il relativo collegamento: \link{Homer{}$&^_Simpson}. Si noti che sono
          ammesse anche le parentesi graffe ($\{$~e~$\}$) \emph{purch\'{e} bilanciate}.
          % % Decommentare per controllare l'argomento di “\pdfstartlink”:
          % \showboxbreadth = 1000
          % \showboxdepth = 10
          % \tracingonline = 1
          % \showlists

          Per maggiori informazioni, si veda la documentazione del pacchetto \textsf{url}.

          \end{document}
          `

          Ciao.


          Gustavo

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

      Go to top