Errore nel file di classe con \normalsize

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


      So che un certo alone di magia circonda LaTeX, ma vorrei chiedervi una cosa.
      Sto scrivendo un file di classe che vorrei fosse indipendente dalle classi standard.
      Dunque il file comincia così:`% section: identification
      \NeedsTeXFormat{LaTeX2e}
      \ProvidesClass{myletter}[2009/01/15 v0.1 Standard letter]
      %
      \newcommand{\@ptsize}{}
      %
      % section: loading package
      %
      \RequirePackage[italian]{babel}
      \RequirePackage[T1]{fontenc}
      \RequirePackage[latin1]{inputenc}
      %
      \RequirePackage{ifthen}\newboolean{inner@flag}
      %
      \RequirePackage{tikz}
      \RequirePackage{eurosym}
      \RequirePackage{lmodern}
      \RequirePackage{indentfirst}
      \RequirePackage{microtype}
      \RequirePackage[a4paper,margin=1.5cm]{geometry}
      %
      % section: option declaration
      %
      \DeclareOption{internal}{\setboolean{inner@flag}{true}}
      \DeclareOption{external}{\setboolean{inner@flag}{false}}
      %
      \DeclareOption{10pt}{\renewcommand{\@ptsize}{0}}
      \DeclareOption{11pt}{\renewcommand{\@ptsize}{1}}
      \DeclareOption{12pt}{\renewcommand{\@ptsize}{2}}
      %
      \DeclareOption*{\ClassWarning{myletter}{Unknow option `\CurrentOption'}}
      %
      % section: process option
      %
      % …
      \ExecuteOptions{external,11pt}
      %
      \ProcessOptions\relax
      %
      %
      %
      % section: code
      \input{size1\@ptsize.clo}
      %
      %…`

      Ricevo un errore perchè \normalsize non è definito al momento in cui carica il file size1\@ptsize.clo. che inizia con un \renewcommand\normalsize{}.
      (che ho copiato nella stessa cartella della classe).

      La magia è questa: poiché ho la stessa impostazione della classe article o letter, perché con queste funziona e con la mia classe no?
      Grazie.

    Visualizzazione 6 filoni di risposte
    • Autore
      Risposte
      • #30283
        Up
        0
        Down
        ::

        So che un certo alone di magia circonda LaTeX, ma vorrei chiedervi una cosa.
        Sto scrivendo un file di classe che vorrei fosse indipendente dalle classi standard.
        Dunque il file comincia così:`% section: identification
        \NeedsTeXFormat{LaTeX2e}
        \ProvidesClass{myletter}[2009/01/15 v0.1 Standard letter]
        %
        \newcommand{\@ptsize}{}
        %
        % section: loading package
        %
        \RequirePackage[italian]{babel}
        \RequirePackage[T1]{fontenc}
        \RequirePackage[latin1]{inputenc}
        %
        \RequirePackage{ifthen}\newboolean{inner@flag}
        %
        \RequirePackage{tikz}
        \RequirePackage{eurosym}
        \RequirePackage{lmodern}
        \RequirePackage{indentfirst}
        \RequirePackage{microtype}
        \RequirePackage[a4paper,margin=1.5cm]{geometry}
        %
        % section: option declaration
        %
        \DeclareOption{internal}{\setboolean{inner@flag}{true}}
        \DeclareOption{external}{\setboolean{inner@flag}{false}}
        %
        \DeclareOption{10pt}{\renewcommand{\@ptsize}{0}}
        \DeclareOption{11pt}{\renewcommand{\@ptsize}{1}}
        \DeclareOption{12pt}{\renewcommand{\@ptsize}{2}}
        %
        \DeclareOption*{\ClassWarning{myletter}{Unknow option `\CurrentOption'}}
        %
        % section: process option
        %
        % …
        \ExecuteOptions{external,11pt}
        %
        \ProcessOptions\relax
        %
        %
        %
        % section: code
        \input{size1\@ptsize.clo}
        %
        %…`

        Ricevo un errore perchè \normalsize non è definito al momento in cui carica il file size1\@ptsize.clo. che inizia con un \renewcommand\normalsize{}.
        (che ho copiato nella stessa cartella della classe).

        La magia è questa: poiché ho la stessa impostazione della classe article o letter, perché con queste funziona e con la mia classe no?

        L’errore è caricare microtype prima di aver definito \normalsize. Il caricamento dei pacchetti va, di norma, dopo \ProcessOptions. Prima vanno solo quelli “generici” come ifpdf o ifthen (ma ti serve davvero?).

        Non vanno mai caricati con una classe né babel né inputenc.

        Ciao
        Enrico

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

          L’errore è caricare microtype prima di aver definito \normalsize. Il caricamento dei pacchetti va, di norma, dopo \ProcessOptions. Prima vanno solo quelli “generici” come ifpdf o ifthen (ma ti serve davvero?).

          Non vanno mai caricati con una classe né babel né inputenc.

          Ok. Deriverò la classe da article percorrendo una via più alla mia portata.

          Ma c’è un modo per caricare babel ed inputec senza che lo faccia esplicitamente l’utente scrivendo i vari \usepackage nel proprio sorgente? Anche perchè non ottengo errori in compilazione se rimangono nella classe.

          Vorrei il massimo della semplificazione.

          Grazie per la risposta.

        • #30285
          Up
          0
          Down
          ::

          L’errore è caricare microtype prima di aver definito \normalsize. Il caricamento dei pacchetti va, di norma, dopo \ProcessOptions. Prima vanno solo quelli “generici” come ifpdf o ifthen (ma ti serve davvero?).

          Non vanno mai caricati con una classe né babel né inputenc.

          Ok. Deriverò la classe da article percorrendo una via più alla mia portata.

          Ma c’è un modo per caricare babel ed inputec senza che lo faccia esplicitamente l’utente scrivendo i vari \usepackage nel proprio sorgente?

          Vorrei il massimo della sempificazione.

          Se vuoi che la classe usi solo il modulo dell’italiano di babel, allora puoi anche dire
          `\RequirePackage[italian]{babel}`
          ma così impedisci di usare qualsiasi altra lingua. Quanto a inputenc, se lo metti nella classe forzi gli utenti a usare la codifica che decidi tu. Sicuro di volerlo?

          Ciao
          Enrico

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

            [quote]
            L’errore è caricare microtype prima di aver definito \normalsize. Il caricamento dei pacchetti va, di norma, dopo \ProcessOptions. Prima vanno solo quelli “generici” come ifpdf o ifthen (ma ti serve davvero?).

            Non vanno mai caricati con una classe né babel né inputenc.

            Ok. Deriverò la classe da article percorrendo una via più alla mia portata.

            Ma c’è un modo per caricare babel ed inputec senza che lo faccia esplicitamente l’utente scrivendo i vari \usepackage nel proprio sorgente?

            Vorrei il massimo della sempificazione.

            Se vuoi che la classe usi solo il modulo dell’italiano di babel, allora puoi anche dire
            `\RequirePackage[italian]{babel}`
            ma così impedisci di usare qualsiasi altra lingua. Quanto a inputenc, se lo metti nella classe forzi gli utenti a usare la codifica che decidi tu. Sicuro di volerlo?

            Ciao
            Enrico[/quote]

            Gentilissimo Prof,
            La classe dovrebbe essere usata sempre con l’italiano e in sistemi windows, perchè dovrebbe essere comune solo al gruppo di lavoro.
            Comunque non avevo pensato a questo tipo di conseguenze.

            Grazie mille, ora proseguirò tenendo conto di questo problema, completando il codice che deve gestire due opzioni.

            Al posto di ifthen, ho creato un comando che andrà testato successivamente a mo di flag multiplo.
            `\DeclareOption{internal}{\def\@lettertype{internal}}
            \DeclareOption{external}{\def\@lettertype{external}}`

            Non sono pratico di test \if, quindi vorrei un suggerimento su come testare il valore di \@lettertype per far eseguire il codice opportuno.

            Comunque la classe è diventata questa:`% section: identification
            \NeedsTeXFormat{LaTeX2e}
            \ProvidesClass{myletter}[2009/01/15 v0.1 Standardletter]
            %
            % section: option declaration
            %
            \DeclareOption{internal}{\def\@lettertype{internal}}
            \DeclareOption{external}{\def\@lettertype{external}}
            %
            \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
            %
            % section: process option
            %
            \ExecuteOptions{external}
            %
            \ProcessOptions\relax
            %
            \LoadClass[a4paper]{article}
            %
            % section: loading package
            %
            \RequirePackage[italian]{babel}
            \RequirePackage[T1]{fontenc}
            \RequirePackage[latin1]{inputenc}
            %
            \RequirePackage{tikz}
            \RequirePackage{eurosym}
            \RequirePackage{lmodern}
            \RequirePackage{indentfirst}
            \RequirePackage{microtype}
            \RequirePackage{geometry}
            \geometry{%
            hmargin=15mm,
            vmargin=15mm
            }
            %
            %
            %
            % section: code
            \frenchspacing
            %…`

            A risentirci!

          • #30287
            Up
            0
            Down
            ::

            Grazie mille, ora proseguirò tenendo conto di questo problema, completando il codice che deve gestire due opzioni.

            Al posto di ifthen, ho creato un comando che andrà testato successivamente a mo di flag multiplo.
            `\DeclareOption{internal}{\def\@lettertype{internal}}
            \DeclareOption{external}{\def\@lettertype{external}}`

            Non sono pratico di test \if, quindi vorrei un suggerimento su come testare il valore di \@lettertype per far eseguire il codice opportuno.

            Comunque la classe è diventata questa:`% section: identification
            \NeedsTeXFormat{LaTeX2e}
            \ProvidesClass{myletter}[2009/01/15 v0.1 Standardletter]
            %
            % section: option declaration
            %
            \DeclareOption{internal}{\def\@lettertype{internal}}
            \DeclareOption{external}{\def\@lettertype{external}}
            %…`

            Il modo classico è
            `\newif\ifmylett@internal
            \DeclareOption{internal}{\mylett@internaltrue}
            \DeclareOption{external}{\mylett@internalfalse}`
            e poi usare
            `\ifmylett@internal

            \else

            \fi`
            È più o meno come avresti fatto con ifthen; trovo che la sintassi
            `\ifthenelse{\boolean{xyz}}{}{}`
            sia troppo pesante e difficile da mantenere.

            È buona norma usare un prefisso comune a tutti i comandi interni definiti nella classe, in modo da minimizzare il rischio di ridefinizioni accidentali.

            Ciao
            Enrico

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


              Una domanda tira l’altra.
              E se invece di un flag mi servisse un opzione multipla, tipo:

              internal
              external
              fax

              dovrei confrontare tre valori e la loro corrispondenza con le tre chiavi.

              Grazie ancora.

            • #30289
              Up
              0
              Down
              ::

              Una domanda tira l’altra.
              E se invece di un flag mi servisse un opzione multipla, tipo:

              internal
              external
              fax

              dovrei confrontare tre valori e la loro corrispondenza con le tre chiavi.

              `\DeclareOption{internal}{\def\mylett@type{\z@}}
              \DeclareOption{external}{\def\mylett@type{\@ne}}
              \DeclareOption{fax}{\def\mylett@type{\tw@}}

              \ifcase\mylett@type
              \or
              \or
              \fi`
              Ciao
              Enrico

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

          Go to top