Comando solo nel documento

  • Creatore
    Topic
  • #50113
    robitex
    Amministratore del forum
      Up
      0
      Down
      ::


      Conosco il comando \@onlypreamble del nucleo di LaTeX che non permette di inserire quel dato nel documento. Mi servirebbe il suo comando complementare, ovvero un comando che eviti che l’utente chiami un comando nel preambolo (prima che inizi il documento alcuni parametri della mia classe non sono ancora inizializzati per consentire un settaggio differito ed in tempi diversi, non ha quindi senso utilizzare alcuni comandi nel preambolo).
      Riferiamoci per fissare le idee ad un comando chiamato \onlydocument.

      L’ho cercato in source2e senza trovarlo. La domanda è: esiste un comando del genere nel kernel di LaTeX?

      Altrimenti vi illustro l’alternativa:
      1 – definisco il comando \onlydocument come un comando che emette un warning.
      2 – definisco la macro ausiliaria \aux@onlydocument che contiene la vera definizione di \onlydocument
      3 – Inserisco in \AtBeginDocument l’istruzione \let\onlydocument=\aux@onlydocument

      La domanda alternativa è quindi: esiste una soluzione migliore di questa?
      Grazie

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

        Conosco il comando \@onlypreamble del nucleo di LaTeX che non permette di inserire quel dato nel documento. Mi servirebbe il suo comando complementare, ovvero un comando che eviti che l’utente chiami un comando nel preambolo (prima che inizi il documento alcuni parametri della mia classe non sono ancora inizializzati per consentire un settaggio differito ed in tempi diversi, non ha quindi senso utilizzare alcuni comandi nel preambolo).
        Riferiamoci per fissare le idee ad un comando chiamato \onlydocument.

        L’ho cercato in source2e senza trovarlo. La domanda è: esiste un comando del genere nel kernel di LaTeX?

        Altrimenti vi illustro l’alternativa:
        1 – definisco il comando \onlydocument come un comando che emette un warning.
        2 – definisco la macro ausiliaria \aux@onlydocument che contiene la vera definizione di \onlydocument
        3 – Inserisco in \AtBeginDocument l’istruzione \let\onlydocument=\aux@onlydocument

        La domanda alternativa è quindi: esiste una soluzione migliore di questa?
        Grazie

        Se il comando non ha argomenti, è piuttosto semplice:
        `\newcommand\DeclareDocumentOnlyCommand[2]{%
        \edef#1{\noexpand\DOCError{\string#1}}%
        \@namedef{\string#1DOC}{#2}%
        \AtBeginDocument{%
        \expandafter\let\expandafter\@temp\csname\string#1DOC\endcsname
        \let#1\@temp}}
        \def\DOCError#1{}`
        Con \DeclareDocumentOnlyCommand{\pippo}{Ciao pippo} ottieni esattamente ciò che chiedi.

        Non è un grave problema se il comando ha un numero fisso di argomenti e non ne ha di opzionali: se per esempio sono due, userai
        `\edef#1##1##2{\noexpand\DOCError{\string#1}}%`
        Così una chiamata di \pippo{a}{b} ignorerebbe i due argomenti emettendo il messaggio di errore. Con argomenti opzionali è un disastro.

        Per ovviare al problema potresti semplicemente emettere un “errore fatale”, aggiungendo al codice di \DOCError un \@@end che costringerebbe l’incauto utente a cancellare il comando sbagliato prima di riprovare.

        Ciao
        Enrico

      • #50115
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::


          Sto cercando di capire esattamente cosa fa il codice da te proposto, ma non capisco una cosa: perché devo usare \string sul command sequence prescelto?
          `\string\pippo`
          non produce l’espansione di \pippo che mi deve contenere il testo del messaggio d’errore all’inizio?

          Quanto al numero degli argomenti del comando, ti dico che la situazione varia: il comando ha una doppia sintassi; può essere seguito da un solo argomento oppure da un argomento delimitato:

          `% primo caso \fill{until=5,from=8}

          $ secondo caso solo per un settaggio
          \fill.until=5;
          \fill.from=8;`

          Comunque, mi è venuto in mente che posso anche cambiare strategia favorendo l’utente: invece di negargli il settaggio delle proprietà, si potrebbe metterle in stato di “attesa” se queste vengono date prima di \begin{document}, ed eseguite effettivamente solo a quel momento.
          Saluti e Grazie mille.

        • #50116
          Up
          0
          Down
          ::

          Sto cercando di capire esattamente cosa fa il codice da te proposto, ma non capisco una cosa: perché devo usare \string sul command sequence prescelto?
          `\string\pippo`
          non produce l’espansione di \pippo che mi deve contenere il testo del messaggio d’errore all’inizio?

          Per evitare noie con le espansioni. Meglio avere una stringa di caratteri che un nome di comando.

          Quanto al numero degli argomenti del comando, ti dico che la situazione varia: il comando ha una doppia sintassi; può essere seguito da un solo argomento oppure da un argomento delimitato:

          `% primo caso \fill{until=5,from=8}

          $ secondo caso solo per un settaggio
          \fill.until=5;
          \fill.from=8;`

          Comunque, mi è venuto in mente che posso anche cambiare strategia favorendo l’utente: invece di negargli il settaggio delle proprietà, si potrebbe metterle in stato di “attesa” se queste vengono date prima di \begin{document}, ed eseguite effettivamente solo a quel momento.
          Saluti e Grazie mille.

          Garantire che l’errore ingoi anche l’argomento non sarebbe semplice, come puoi capire.

          La strategia proposta mi pare saggia. Eventualmente puoi aggiungere un avviso che il tutto vada messo dopo \begin{document}:
          `\def\robi@warning{%
          \ifrobi@warning
          \AtEndDocument{\ClassWarning{robi}{One or more commands should
          go after \string\begin{document}}}%
          \global\robi@warningfalse
          \fi}
          \newif\ifrobi@warning\robi@warningtrue
          \AtBeginDocument{\let\robi@warning\relax}`
          Aggiungi \robi@warning al codice dei comandi, come primo token.

          Ciao
          Enrico

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

      Go to top