Errore \newcommand

  • Creatore
    Topic
  • #105219
    hpo
      Up
      0
      Down
      ::


      Salve a tutti,
      ho problemi nella creazione di due nuovi comandi, presi singolarmente funzionano bene, ma se combinati assieme il file non viene compilato.

      `\newcommand{\expmon}[2]
      {
      \ifthenelse{#2=1}
      {#1}
      {
      \ifthenelse{#2=0}
      {}
      {
      #1^{#2}
      }}}
      `

      `\newcommand{\maxtwo}[2]
      {\ifthenelse{#1<#2}{#2}{#1}}` Una scrittura del genere (dove \xi sono lettere casuali e \a numeri casuali) funziona perfettamente: `$\expmon{\xi}{\a} \expmon{\xii}{\b} \expmon{\xiii}{\c}$ ` Se invece provo a compilare questa viene segnalato un errore: `$\expmon{\xi}{\maxtwo{\a}{\d}}$` Si tratta probabilmente di un errore banale che però non riesco a trovare visto che ho poche conoscenze sulla creazione di nuovi comandi, qualcuno con più esperienza è in grado di risolvere il problema?

    Visualizzazione 2 filoni di risposte
    • Autore
      Risposte
      • #105220
        Up
        0
        Down
        ::

        hpo” post=105273Salve a tutti,
        ho problemi nella creazione di due nuovi comandi, presi singolarmente funzionano bene, ma se combinati assieme il file non viene compilato.

        `\newcommand{\expmon}[2]
        {
        \ifthenelse{#2=1}
        {#1}
        {
        \ifthenelse{#2=0}
        {}
        {
        #1^{#2}
        }}}
        `

        `\newcommand{\maxtwo}[2]
        {\ifthenelse{#1<#2}{#2}{#1}}` Una scrittura del genere (dove \xi sono lettere casuali e \a numeri casuali) funziona perfettamente: `$\expmon{\xi}{\a} \expmon{\xii}{\b} \expmon{\xiii}{\c}$ ` Se invece provo a compilare questa viene segnalato un errore: `$\expmon{\xi}{\maxtwo{\a}{\d}}$` Si tratta probabilmente di un errore banale che però non riesco a trovare visto che ho poche conoscenze sulla creazione di nuovi comandi, qualcuno con più esperienza è in grado di risolvere il problema?

        A quanto capisco il codice serve per stampare una potenza del tipo [tt]x^3[/tt], omettendo tutto se l’esponente è zero, solo la base se l’esponente è uno.

        Il tuo codice non può funzionare, perché [tt]\ifthenelse{#1<#2}{#2}{#1}[/tt] non produce un numero, ma le istruzioni per stamparne uno. In gergo TeXnico, [tt]\ifthenelse[/tt] non è espandibile. Ci sono vari modi per affrontare il problema; il meno doloroso è, una volta che si fa l'abitudine al nuovo ambiente di programmazione, expl3.

        `\documentclass{article}
        \usepackage{xparse}

        \ExplSyntaxOn

        \NewDocumentCommand{\expmon}{mm}
        {
        \int_case:nnF { #2 } % confrontiamo il secondo argomento
        {
        {0}{} % 0: nessun output
        {1}{#1} % 1: la base
        }
        {#1^{#2}} % tutti gli altri casi
        }

        \DeclareExpandableDocumentCommand{\maxtwo}{mm}
        {
        \int_max:nn { #1 } { #2 } % il massimo dei due
        }
        \ExplSyntaxOff

        \newcommand{\lx}{x}
        \newcommand{\ly}{y}
        \newcommand{\lz}{z}
        \newcommand{\na}{-12}
        \newcommand{\nb}{42}
        \newcommand{\nc}{0}

        \begin{document}

        $\expmon{\lx}{\na} \expmon{\ly}{\nb} \expmon{\lz}{\nc}$ % z^0 non appare

        $2\expmon{\lx}{\maxtwo{\na}{\nc}}$ % x^0 non appare

        $\expmon{\lx}{\maxtwo{\na}{\nb}}$

        \end{document}`

        [attachment=1545]ScreenShot2016-02-20at16.53.00.png[/attachment]

        Codice “classico”:

        `
        \newcommand{\expmon}[2]{%
        \ifcase#2\relax
        % 0: nessun output
        \or
        #1% 1: la base
        \else
        #1^{#2}% tutti gli altri casi
        \fi
        }
        \newcommand{\maxtwo}[2]{%
        \ifnum#1>#2
        #1%
        \else
        #2%
        \fi
        }
        `

        Occhio ai [tt]%[/tt]; con expl3 non ci sono di questi problemi.

        Ciao
        Enrico

        (Messaggio numero 13000) 🙂

        Attachments:
        You must be logged in to view attached files.
      • #105221
        hpo
          Up
          0
          Down
          ::

          egreg9″ post=105293
          Il tuo codice non può funzionare, perché [tt]\ifthenelse{#1<#2}{#2}{#1}[/tt] non produce un numero, ma le istruzioni per stamparne uno. In gergo TeXnico, [tt]\ifthenelse[/tt] non è espandibile.

          Ciao Enrico, non so come ringraziarti, non è la prima volta che mi salvi in maniera diretta o indiretta tramite il resto dei tuoi 12999 messaggi 😀 (senza contare anche quelli su stack exchange su cui mi sono imbattuto parecchie volte). Ho optato per la prima soluzione visto che a quanto ho capito è la direzione verso cui sta andando LaTeX, però cercando il manuale di xparse ho trovato pochi esempi e non molto chiari visto che mi mancano varie basi per capirle. Da dove potrei cominciare per studiare da zero il nuovo linguaggio?

          Ancora grazie e complimenti per il traguardo. 🙂

        • #105222
          Up
          0
          Down
          ::

          hpo” post=105300[…]
          Da dove potrei cominciare per studiare da zero il nuovo linguaggio?

          […]

          texdoc interface3

          Ciao.


          Gustavo

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

      Go to top