Espansione macro all’interno di \ref

  • Creatore
    Topic
  • #93238
    Up
    0
    Down
    ::


    Sto utilizzando il pacchetto currfile, che fornisce la macro \currfilename contenente il nome del file .tex correntemente elaborato.
    Supponendo che il file è main.tex, questo codice funziona:

    `
    \label{\currfilename}
    \ref{main.tex}
    `

    Mentre questo no:

    `
    \label{\currfilename}
    \ref{\currfilename}
    `
    Perchè?

Visualizzazione 6 filoni di risposte
  • Autore
    Risposte
    • #93239
      robitex
      Amministratore del forum
        Up
        0
        Down
        ::

        Nate River” post=92854Sto utilizzando il pacchetto currfile, che fornisce la macro \currfilename contenente il nome del file .tex correntemente elaborato.
        Supponendo che il file è main.tex, questo codice funziona:

        `
        \label{\currfilename}
        \ref{main.tex}
        `

        Mentre questo no:

        `
        \label{\currfilename}
        \ref{\currfilename}
        `
        Perchè?

        Veramente a me non mi funzione in nessuno dei due modi almeno con questo codice:
        `\documentclass{article}
        \usepackage{currfile}

        \begin{document}
        \label{\currfilename}

        Ok, il nome del file è~\ref{main.tex}.

        \end{document}`
        Puoi spiegarti meglio spiegando cosa vuoi ottenere (le tue necessità in merito al problema)?
        … e benvenuto sul forum.
        R.

      • #93240
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::

          Nate River” post=92854Sto utilizzando il pacchetto currfile, che fornisce la macro \currfilename contenente il nome del file .tex correntemente elaborato.
          Supponendo che il file è main.tex, questo codice funziona:

          `
          \label{\currfilename}
          \ref{main.tex}
          `

          Mentre questo no:

          `
          \label{\currfilename}
          \ref{\currfilename}
          `
          Perchè?

          Mi pare che tu non abbia letto, o abbia letto molto superficialmente, sia la documentazione di cuurfile, sia le guide di LaTeX. Se mi sbaglio perdonami.

          1) l’argomento di \label non viene sviluppato e può cotenere qualunque carattere,( se ben ricordo, tranne la virgola); dunque [tt]\label{\currfilename}[/tt]
          crea un etichetta foramata dai caratteri [tt]\ c u r r f i l e n a m e[/tt], non lo sviluppo di \currfilename che sarebbe il nome del file corrente. Nello stesso tempo [tt]\ref{main.tex}[/tt] legge il significato numerico associato all’etichetta foramta dai caratteri [tt]m a i n . t e x[/tt], etichetta che non hai mai definito; con certe glassi le etichette di cui LaTeX non conosca il significato sono stampate mediante un apio di punti interrogativi e oppure le etichette senza significato vengo stampate come tali, cioè come etichette, non come quello che esse rappresentino.

          2) Se carichi il pacchetto currefile, ogni volta che direttamente o indirettamente vine aperto un nuovo file, con \input, con \include, con \InputIfFileExists, con \RequirePackage, eccetera, le caratteristiche del file vengono messe dentro quelle macro. \currfilenmae, \curfileext, \currfilepath, eccetera.
          Certamente, quindi, queste macro non sono da mettere dentro \label e dentro \ref, perché contengono già le parti di nome che interessano.

          3) Dunque non è affatto chiaro che cosa ti voglia fare a usare quelle macro come argomenti di \label o di \ref.. Ecco perché ho il sospetto che tu abbia fatto un po’ di confusione, oppure che tu non abbia letto con abbastanza attenzione le varie guide e la documentazione dei pacchetti che vuoi usare.

        • #93241
          Up
          0
          Down
          ::

          Nate River” post=92854Sto utilizzando il pacchetto currfile, che fornisce la macro \currfilename contenente il nome del file .tex correntemente elaborato.
          Supponendo che il file è main.tex, questo codice funziona:

          `
          \label{\currfilename}
          \ref{main.tex}
          `

          Mentre questo no:

          `
          \label{\currfilename}
          \ref{\currfilename}
          `
          Perchè?

          Certamente funziona:
          `\documentclass{article}
          \usepackage{currfile}

          \begin{document}
          \section{a}\label{\currfilename}
          \ref{\currfilename}
          \end{document}`
          Il risultato è “1”, perché corrisponde al numero della sezione. Che cosa tu voglia fare è un mistero, però.


          @OldClaudio

          La tua spiegazione è sbagliata. Sia [tt]\label[/tt] sia [tt]\ref[/tt] espandono l’argomento perché lo usano all’interno di [tt]\csname…\endcsname[/tt].

          Ciao
          Enrico

        • #93242
          Up
          0
          Down
          ::


          Vero che funziona, anche con un’etichetta leggermente più complicata: `
          \documentclass{article}
          \usepackage{currfile}

          \begin{document}

          \begin{equation}
          x=y
          \label{eq:y}
          \end{equation}

          \begin{equation}
          y=x
          \label{eq:\currfilename}
          \end{equation}

          \ref{eq:y} \ref{eq:\currfilename}

          \end{document}
          ` Resta il fatto che, seppure funziona, non ha senso (almeno secondo me). Se in un documento ti serve una volta sola, perché non puoi dare un nome normale all’etichetta? Se invece etichetti tutto (comandi di sezionamento, equationi, tabelle e figure) chiediti quanto sia utile sapere che la 70˚ etichetta è il nome del file.

          Se invece era per fare esercizio, ti consiglio di leggere questo post di ignoto autore 😉

          Ciao
          Claudio

        • #93243
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::

            @OldClaudio

            La tua spiegazione è sbagliata. Sia \label sia \ref espandono l’argomento perché lo usano all’interno di \csname…\endcsname.

            Già, è vero 😯 🙄 :mrgreen: ; mi sono confuso co un altro caso, dove ivece c’era un comando \string di mezzo.
            Le mie osservazioni sul cattivo uso o uso improrio delle macro cistae mi sembra che resti valido, e resta confermato dalle tue osservazioni e da quelle di altri partecipanti.

          • #93244
            Up
            0
            Down
            ::


            Avete ragione: ho provato con un documento LaTex “minimale”, simile a quelli utilizzati dai vostri esempi, e funziona.
            Tuttavia il problema si presenta ugualmente utilizzando il pacchetto “eqexam”. Faccio un esempio supponendo che il nome del file sia “item21.tex”.
            Questo funziona:

            `
            \begin{problem}[5]
            Di che colore è il cavallo bianco di Napoleone?
            \begin{answers}{2}
            \bChoices
            \Ans0 Nero \eAns
            \Ans0 Viola \eAns
            \Ans1\label{\currfilename} Bianco \eAns
            \Ans0 Marrone \eAns
            \eChoices
            \end{answers}
            \begin{solution}
            \ \ref{item21.tex}
            \end{solution}
            \end{problem}
            `

            Mentre questo no:

            `
            \begin{problem}[5]
            Di che colore è il cavallo bianco di Napoleone?
            \begin{answers}{2}
            \bChoices
            \Ans0 Nero \eAns
            \Ans0 Viola \eAns
            \Ans1\label{\currfilename} Bianco \eAns
            \Ans0 Marrone \eAns
            \eChoices
            \end{answers}
            \begin{solution}
            \ \ref{\currfilename}
            \end{solution}
            \end{problem}
            `

            Qualcuno mi ha chiesto: “ma a cosa ti serve?”. Sto utilizzando il pacchetto “eqexam” per produrre test a risposta multipla. Vorrei che ogni item del test fosse conservato in un file a parte. Non sto qui a spiegare ogni dettaglio, ma in pratica per produrre in automatico un pdf con le risposte corrette è necessario che la risposta corretta sia etichettata con \label.

          • #93245
            Up
            0
            Down
            ::


            Ho scoperto una cosa fondamentale, che spiegherebbe questo insolito comportamento: all’interno dell’ambiente “solution” la macro “\currfilename” restituisce main.sol (il file latex che il pacchetto eqexam produce in automatico) e non item21.tex (il file che includo in main.tex con il comando \input).

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

        Go to top