Problema pacchetto chemfig

  • Creatore
    Topic
  • #89376
    Up
    0
    Down
    ::


    Salve a tutti , ho riscontrato un problema con il pacchetto [tt]chemfig[/tt]. In soldoni, il pacchetto fornisce due comandi per creare reazioni [tt]\schemestart[/tt] e [tt]\schemestop[/tt], da utilzzare similmente ai classici [tt]\begin{…}[/tt] e [tt]\end{…}[/tt]. Per comodità volevo crearmi un ambiente che centrasse le reazioni e ho prodotto il codice
    `
    \newenvironment{scheme}
    {\begin{center}\scriptsize\schemestart}
    {\schemestop\end{center}}
    `
    ma la compilazione mi si arresta, dandomi [tt]Emergency stop[/tt]. La cosa mi sembra strana e non riesco a capire questo strano comportamento.

    Per curiosità ho aperto il pacchetto in discussione (senza modificarlo, s’intende) e ho notato che l’autore utilizza sempre una macro per definire tutto [tt]\CF@def[/tt], definita all’inizio del pacchetto con la stringa
    `
    \def\CF@def#1{%
    \ifdefined#1%
    \errmessage{Package chemfig Error: the macro \string#1\space is already defined. Please, email the author.}%
    \fi
    \def#1%
    }
    `
    Può essere questo? Si capisce che la stringa serve per verificare se il comando è già stato definito e mi restituisce a schermo (e nel log) la scritta opportuna se già presente, ma mi è sorto il dubbio: è affidabile questa macro? Non è meglio utilizzare [tt]\newcommand[/tt]? Probabilmente i miei dubbi non centrano niente con il problema, ma ve li pongo lo stesso :D. Grazie in anticipo per la vostra pazienza.

    EDIT Facendo delle prove ho scoperto che il comando
    `
    \newcommand{\scheme}[#1]{\begin{center}\scriptsize\startscheme #1\endscheme\end{center}}
    `
    funziona. Il problema è che non mi piace inserire le reazioni usando il comando che ho definito. Penso sia più corretto l’impiego di un ambiente per questo lavoro, ma l’altro codice continua a non funzionare.

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


      Si, utilizzare un ambiente sarebbe decisamente meglio. Hai provato a definirlo con il pacchetto environ?

      Ciao
      Claudio

    • #89378
      Up
      0
      Down
      ::


      Ho tentato: l’esempio sulla documentazione funziona. Se provo a definire invece il comando
      `
      \NewEnvironment{\scheme}
      {\schemestart\BODY\schemestop}
      `
      e provo a utilizzare il comando [tt]\arrow[/tt], il sistema mi risponde
      `
      ! Undefined control sequence.
      \node

      l.58 \end{scheme}

      The control sequence at the end of the top line
      of your error message was never \def'ed. If you have
      misspelled it (e.g., `\hobx'), type `I' and the correct
      spelling (e.g., `I\hbox'). Otherwise just continue,
      and I'll forget about whatever was undefined.
      `
      e poi una serie di errori uguali a questo. Qualche idea?

    • #89379
      Up
      0
      Down
      ::

      skevin93″ post=88880Salve a tutti , ho riscontrato un problema con il pacchetto [tt]chemfig[/tt]. In soldoni, il pacchetto fornisce due comandi per creare reazioni [tt]\schemestart[/tt] e [tt]\schemestop[/tt], da utilzzare similmente ai classici [tt]\begin{…}[/tt] e [tt]\end{…}[/tt]. Per comodità volevo crearmi un ambiente che centrasse le reazioni e ho prodotto il codice
      `
      \newenvironment{scheme}
      {\begin{center}\scriptsize\schemestart}
      {\schemestop\end{center}}
      `
      ma la compilazione mi si arresta, dandomi [tt]Emergency stop[/tt]. La cosa mi sembra strana e non riesco a capire questo strano comportamento.

      Per curiosità ho aperto il pacchetto in discussione (senza modificarlo, s’intende) e ho notato che l’autore utilizza sempre una macro per definire tutto [tt]\CF@def[/tt], definita all’inizio del pacchetto con la stringa
      `
      \def\CF@def#1{%
      \ifdefined#1%
      \errmessage{Package chemfig Error: the macro \string#1\space is already defined. Please, email the author.}%
      \fi
      \def#1%
      }
      `
      Può essere questo? Si capisce che la stringa serve per verificare se il comando è già stato definito e mi restituisce a schermo (e nel log) la scritta opportuna se già presente, ma mi è sorto il dubbio: è affidabile questa macro? Non è meglio utilizzare [tt]\newcommand[/tt]? Probabilmente i miei dubbi non centrano niente con il problema, ma ve li pongo lo stesso :D. Grazie in anticipo per la vostra pazienza.

      EDIT Facendo delle prove ho scoperto che il comando
      `
      \newcommand{\scheme}[#1]{\begin{center}\scriptsize\startscheme #1\endscheme\end{center}}
      `
      funziona. Il problema è che non mi piace inserire le reazioni usando il comando che ho definito. Penso sia più corretto l’impiego di un ambiente per questo lavoro, ma l’altro codice continua a non funzionare.

      Dopo [tt]\schemestart[/tt], sia [tt]\scheme[/tt] sia [tt]\endscheme[/tt] vengono (ri)definiti e ovviamente questo cancella la tua definizione di [tt]\endscheme[/tt]. Perciò il trucco è di usare un nome diverso:
      `\documentclass{article}
      \usepackage{chemfig,chemscheme}
      \usepackage{environ}

      \NewEnviron{myscheme}[1][]{%
      \begin{center}\scriptsize
      \def\myschemetemp{\schemestart[#1]}%
      \expandafter\myschemetemp\BODY\schemestop
      \end{center}}

      \begin{document}

      \begin{itemize}
      \item[–] Aldehyde $\rightarrow$ 1$^\circ$ alcohol
      \begin{center}
      \schemestart[0,1,thick]
      \chemfig{R-[:30]C(=[2]O)-[:-30]H} \arrow{0}[,0] \+ 2[H] \arrow \chemfig{R-C(-[2]OH)(-[6]H)-H}
      \schemestop
      \end{center}
      \end{itemize}

      \begin{myscheme}[0,1,thick]
      \chemfig{R-[:30]C(=[2]O)-[:-30]H} \arrow{0}[,0] \+ 2[H] \arrow \chemfig{R-C(-[2]OH)(-[6]H)-H}
      \end{myscheme}

      \end{document}`

      Come vedi puoi usare anche l’argomento facoltativo. Con [tt]\newenvironment[/tt] non funziona perché [tt]\schemestart[/tt] vuole vedere [tt]\schemestop[/tt] per decidere dove finisce il codice dello schema.

      Ciao
      Enrico

    • #89380
      Up
      0
      Down
      ::


      Grazie mille @egreg! Il tuo comando funziona alla perfezione. Ora, non vorrei chiederti troppo, ma è possibile inserire un qualche comando per andare a capo? So già che [tt]\schemestart[/tt] e [tt]\schemestop[/tt] non accettano ne [tt]\\[/tt], ne [tt]\par[/tt]. Non è possibile definirsi una variabile locale (tanto la utilizzerei solo in quell’ambiente) che mi permetta di andare a capo? Un qualcosa tipo
      `
      \def\ln{\schemestop\\\schemestart},
      `
      che logicamente non funziona perché [tt]\schemestart[/tt] iniziale viene eseguito dopo la totale espansione di tutto il testo iniziale. E’ fattibile una marco del genere o meglio che lasci perdere? Grazie per la tua pazienza.

    • #89381
      Up
      0
      Down
      ::

      skevin93″ post=88899Grazie mille @egreg! Il tuo comando funziona alla perfezione. Ora, non vorrei chiederti troppo, ma è possibile inserire un qualche comando per andare a capo? So già che [tt]\schemestart[/tt] e [tt]\schemestop[/tt] non accettano ne [tt]\\[/tt], ne [tt]\par[/tt]. Non è possibile definirsi una variabile locale (tanto la utilizzerei solo in quell’ambiente) che mi permetta di andare a capo? Un qualcosa tipo
      `
      \def\ln{\schemestop\\\schemestart},
      `
      che logicamente non funziona perché [tt]\schemestart[/tt] iniziale viene eseguito dopo la totale espansione di tutto il testo iniziale. E’ fattibile una marco del genere o meglio che lasci perdere? Grazie per la tua pazienza.

      Non è possibile, per lo stesso motivo che impedisce di usare [tt]\newenvironment[/tt]: [tt]\schemestart[/tt] deve vedere [tt]\schemestop[/tt] e con una macro non succederebbe.

      Ciao
      Enrico

    • #89382
      Up
      0
      Down
      ::


      Va bè. Grazie lo stesso per la tua pazienza.

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

Go to top