Indice in maiuscoletto e hyperref

  • Creatore
    Topic
  • #103109
    Up
    0
    Down
    ::


    Provate a compilare questo:
    `% !TEX encoding = UTF-8 Unicode
    % !TEX TS-program = pdflatex

    \documentclass[
    chapfont=smallcaps,
    tocchapfont=smallcaps,
    %smallcapsstyle=low,%upper
    ]{suftesi}

    \usepackage{hyperref}

    \begin{document}

    \tableofcontents

    \chapter{The title and a formula $F=G'(x)$}

    Lorem ipsum dolor sit amet.

    \end{document}`
    Alla seconda compilazione otterrete un errore.

    La domanda generale è: come è possibile avere le voci dell’indice in maiuscoletto assieme a hyperref?

    Nello specifico il problema compare con suftesi quando si usa l’opzione tocchapfont=smallcaps assieme a smallcapsstyle=low (di default) unite al pacchetto hyperref (+ il comando \tableofcontents).
    All’interno del comando che definisce, per esempio, lo stile del livello chapter dell’indice si usa \SUF@tocCHAP@font, definito così:
    `\def\SUF@tocCHAP@font{\expandafter\SUF@titlesmallcaps}
    \DeclareRobustCommand{\SUF@titlesmallcaps}[1]{%
    \scshape\suftesi@MakeTextLowercase{\lsstyle #1}}%
    \def\suftesi@MakeTextLowercase{\MakeTextLowercase}`

    Aggiungendo l’opzione smallcapsstyle=upper, che non fa altro che eseguire
    `\def\suftesi@MakeTextLowercase{\relax}`
    il problema non si presenta. Ma questa non è la soluzione sperata, perché dovrei fare a meno di un’opzione.

    Di conseguenza la causa sta in:
    `\def\suftesi@MakeTextLowercase{\MakeTextLowercase}`
    Ovvero, sembra che \MakeTextLowercase non sia accettato all’interno dell’indice quando si carica hyperref. Se uso \lowercase funziona, ma in questo modo, nel caso sia presente una formula nel titolo (raro ma possibile) mi renderebbe eventuali lettere maiuscole in minuscolo.

    Qualcuno ha un’idea su come risolvere il bug?

    Ciao
    Ivan

Visualizzazione 4 filoni di risposte
  • Autore
    Risposte
    • #103110
      franen
      Partecipante
        Up
        0
        Down
        ::


        Il problema non si presentava con la vecchia versione di suftesi. Poi dopo aver aggiornato appare l’errore.
        Poi vedrò come risolvere, intanto era per presentare la fenomenologia.

      • #103111
        Up
        0
        Down
        ::

        franen” post=103106Il problema non si presentava con la vecchia versione di suftesi. Poi dopo aver aggiornato appare l’errore.
        Poi vedrò come risolvere, intanto era per presentare la fenomenologia.

        L’ultima versione ha aggiunto l’opzione tocchapfont, per avere i capitoli in maiuscoletto nell’indice.
        È questa infatti che crea problemi.

        Ciao
        Ivan

      • #103112
        Up
        0
        Down
        ::


        Questo sembra funzionare
        `
        % !TEX encoding = UTF-8 Unicode
        % !TEX TS-program = pdflatex

        \documentclass[
        chapfont=smallcaps,
        tocchapfont=smallcaps,
        %smallcapsstyle=upper
        ]{suftesi}

        \usepackage{hyperref}
        \makeatletter
        \AtBeginDocument{
        \@ifpackageloaded{hyperref}{%
        \def\@uclcnotmath#1#2#3#4{\begingroup #1%
        \def \({$}\let \)\(\def \NoCaseChange ##1{\noexpand \NoCaseChange {\noexpand ##1}}%
        \def\hyper@linkstart##1##2##3{$\valign$\noexpand\hyper@linkstart{##1}{##2}{\noexpand\@skipmath #3
        ##3$\valign $}\noexpand\@skipmath}\def\hyper@linkend{\noexpand\hyper@linkend}%
        \@nonchangecase \label
        \@nonchangecase \ref
        \@nonchangecase \ensuremath
        \def \cite ##1##{\toks@ {\noexpand \cite ##1}\@citex }%
        \def \@citex ##1{\NoCaseChange {\the \toks@ {##1}}}%
        \def \reserved@a ##1##2{\let #2\reserved@a }%
        \expandafter \reserved@a \@uclclist \reserved@b {\reserved@b \@gobble }%
        \protected@edef \reserved@a {\endgroup\noexpand \@skipmath #3#4$\valign $}%
        \reserved@a}}{}}
        \begin{document}

        \tableofcontents

        \chapter{The title and a formula $F=G'(x)$}

        Lorem ipsum dolor sit amet.

        \end{document}
        `
        Il problema nasce dal comando [tt]\@uclcnotmath[/tt], impiegato internamente da [tt]\MakeTextLower[/tt]. Per svolgere il suo compito impiega [tt]\protected@edef[/tt] che espande al suo interno le macro di [tt]hyperref[/tt]. Il comando non definito è probabilmente uno interno alle macro, e non viene definito perché dentro [tt]\edef[/tt] e [tt]\xdef[/tt] non vengono espanse le primitive. Quando LaTeX lo incontra protesta perché non è stato ancora definito. Aggiungere a [tt]\@uclcnotmath[/tt] le ridefinizioni temporanee di [tt]\hyper@linkstart[/tt] e [tt]\hyper@linkend[/tt] previene questa espansione indesiderata, risolvendo l’errore.

        Subentra però un problema: essendo il testo racchiuso dentro a un argomento, viene ignorato dalla macro [tt]\skip@math[/tt], il cui compito è proprio quello che serve a te: impedire al testo in modalità matematica di essere cambiato. L’aggiunta alla ridefinizione di [tt]\href@linkstart[/tt] dei comandi [tt]\skip@math[/tt] e dei delimitatori [tt]$\valign$[/tt] (servono internamente a [tt]\skip@math[/tt] per svolgere il suo lavoro) permette di bypassare anche questo problema.

        Questo è quello che sono riuscito a tirare fuori dal mio cappello magico. Non sono sicuro della sua robustezza (si può dire?), ma sembra funzionare abbastanza bene.

      • #103113
        Up
        0
        Down
        ::


        Che dire? Grazie!
        Testerò la soluzione con calma, ma sono fiducioso.
        Nel frattempo, preso dal panico, ho aggiornato suftesi,
        Schivando il problema in questo modo.
        Siccome il problema nasce quando nell’indice si usa il maiuscoletto lowercase,
        Ho imposto che l’opzione samllcapssyle non abbia effetto nell’indice.

        Ciò è incoerente, naturalmente, ma almeno i file compilano.
        Una volta testata la tua soluzione farò retromarcia, così il tutto sarà uniforme.

        Ciao
        Ivan

      • #103114
        Up
        0
        Down
        ::


        Ho caricato la nuova versione di suftesi con il codice suggerito da skevin93, che ringrazio nuovamente.

        Ciao
        Ivan

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

    Go to top