Integrare Geometry in una nuova classe

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


      Ciao,
      volendo scrivere una nuova classe documento basata su quella standard report, che integri il pacchetto Geometry, con lo scopo di comprendere automaticamente il più elevato numero di formati di pagina, ho scritto il seguente codice:

      `\NeedsTeXFormat{LaTeX2e}[1995/12/01]
      \ProvidesClass{myclass}
      [2010/04/17 v0.0.0.1 Test of myclass]
      \RequirePackage{pstricks}
      \RequirePackage{geometry}
      %
      % Option declaration section
      %
      \DeclareOptionX*{\PassOptionsToClass{\CurrentOption}{report}}
      %
      % Process option section
      %
      \ExecuteOptionsX{a4paper}
      \ProcessOptionsX

      %
      % Loading base class section
      %
      \LoadClass{report}
      \endinput`

      inutile dire che non funziona: il pacchetto geometry restituisce con il seguente documento di test un errore di dimensione di pagina nulle.
      `\documentclass{myclass}

      \usepackage[utf8]{inputenc}
      \usepackage[T1]{fontenc}
      \usepackage[italian]{babel}
      \begin{document}
      a4paper 10pt

      \begin{pspicture}(3,3)
      \psline(3,3)
      \end{pspicture}
      \end{document}`
      L’idea sarebbe quella di mantenere le opzioni a4paper e 10pt come quelle di default, mentre se diversamente specificato, le opzioni di classe desiderate.

      Potrei anche rinunciare a risolvere il problema semplicemente eliminando le opzioni di classe per gestire i parametri con appositi comandi di preambolo, ma gli utenti sono così abituati…

      Grazie davvero!!! 😉

    Visualizzazione 7 filoni di risposte
    • Autore
      Risposte
      • #44389
        Up
        0
        Down
        ::

        Ciao,
        volendo scrivere una nuova classe documento basata su quella standard report, che integri il pacchetto Geometry, con lo scopo di comprendere automaticamente il più elevato numero di formati di pagina, ho scritto il seguente codice:

        `\NeedsTeXFormat{LaTeX2e}[1995/12/01]
        \ProvidesClass{myclass}
        [2010/04/17 v0.0.0.1 Test of myclass]
        \RequirePackage{pstricks}
        \RequirePackage{geometry}
        %
        % Option declaration section
        %
        \DeclareOptionX*{\PassOptionsToClass{\CurrentOption}{report}}
        %
        % Process option section
        %
        \ExecuteOptionsX{a4paper}
        \ProcessOptionsX

        %
        % Loading base class section
        %
        \LoadClass{report}
        \endinput`

        inutile dire che non funziona: il pacchetto geometry restituisce con il seguente documento di test un errore di dimensione di pagina nulle.
        `\documentclass{myclass}

        \usepackage[utf8]{inputenc}
        \usepackage[T1]{fontenc}
        \usepackage[italian]{babel}
        \begin{document}
        a4paper 10pt

        \begin{pspicture}(3,3)
        \psline(3,3)
        \end{pspicture}
        \end{document}`
        L’idea sarebbe quella di mantenere le opzioni a4paper e 10pt come quelle di default, mentre se diversamente specificato, le opzioni di classe desiderate.

        Potrei anche rinunciare a risolvere il problema semplicemente eliminando le opzioni di classe per gestire i parametri con appositi comandi di preambolo, ma gli utenti sono così abituati…

        Grazie davvero!!! 😉

        Stai passando tutte le opzioni a report, non vedo come geometry possa vederle. Prima di tutto caricherei esplicitamente xkeyval e non certo pstricks:
        `\NeedsTeXFormat{LaTeX2e}[1995/12/01]
        \ProvidesClass{myclass}
        [2010/04/17 v0.0.0.1 Test of myclass]
        \RequirePackage{xkeyval}
        \RequirePackage{geometry}
        %
        % Option declaration section
        %
        \newcommand{\mc@DeclareOptionXGm}[1]{%
        \DeclareOptionX{#1}{\PassOptionsToPackage{\CurrentOption}{geometry}}}
        \mc@DeclareOptionXGm{a4paper}
        \mc@DeclareOptionXGm{letterpaper}
        \DeclareOptionX*{\PassOptionsToClass{\CurrentOption}{report}}
        %
        % Process option section
        %
        \ExecuteOptionsX
        {a4paper}
        \ProcessOptionsX

        %
        % Loading base class section
        %
        \LoadClass{report}`
        Ciao
        Enrico

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


          Prof, il tuo codice non funziona se inserisco l’opzione 12pt (per esempio).
          Comunque ho fatto ulteriori test e volevo chiederti se fosse possibile NON dichiarare come opzioni le dimensioni di pagina con il comando \mc@DeclareOptionXGm.

          In altre parole, la classe deve comportarsi così:
          le opzioni 10pt,11pt,12pt devono essere passate a report.

          le opzioni di dimensioni di pagina e di orientamento tipo a4paper (valore di default scelto) e landscape devono essere processate da geometry.

          Così facendo eventuali nuovi formati di pagina inseriti in geometry (come è successo recentemente con i formati giapponesi), sono automaticamente disponibile nella classe.

          Riporto il codice modificato della classe:
          `\NeedsTeXFormat{LaTeX2e}[1995/12/01]
          \ProvidesClass{myclass}
          [2010/04/17 v0.0.0.1 Test of the class]
          \RequirePackage{xkeyval}
          \RequirePackage{pstricks}
          \RequirePackage{geometry}
          %
          % Option declaration section
          %
          \DeclareOptionX{10pt}[]{\PassOptionsToClass{10pt}{report}}
          \DeclareOptionX
          {11pt}[]{\PassOptionsToClass{11pt}{report}}
          \DeclareOptionX
          {12pt}[]{\PassOptionsToClass{12pt}{report}}
          \DeclareOptionX*{\geometry{\CurrentOption}}
          %
          % Process option section
          %
          \ExecuteOptionsX{a4paper}
          \ProcessOptionsX
          %
          % Loading base class section
          %
          \LoadClass{report}
          \endinput
          %%`
          ma ancora non funziona: a geometry non arrivano le dim di pagina. Ci sto lavorando da un po’ ma non riesco a vedere la soluzione.
          Saluti.
          Roberto.

        • #44391
          Up
          0
          Down
          ::

          Prof, il tuo codice non funziona se inserisco l’opzione 12pt (per esempio).
          Comunque ho fatto ulteriori test e volevo chiederti se fosse possibile NON dichiarare come opzioni le dimensioni di pagina con il comando \mc@DeclareOptionXGm.

          In altre parole, la classe deve comportarsi così:
          le opzioni 10pt,11pt,12pt devono essere passate a report.

          le opzioni di dimensioni di pagina e di orientamento tipo a4paper (valore di default scelto) e landscape devono essere processate da geometry.

          Così facendo eventuali nuovi formati di pagina inseriti in geometry (come è successo recentemente con i formati giapponesi), sono automaticamente disponibile nella classe.

          Riporto il codice modificato della classe:
          `\NeedsTeXFormat{LaTeX2e}[1995/12/01]
          \ProvidesClass{myclass}
          [2010/04/17 v0.0.0.1 Test of the class]
          \RequirePackage{xkeyval}
          \RequirePackage{pstricks}
          \RequirePackage{geometry}
          %
          % Option declaration section
          %
          \DeclareOptionX{10pt}[]{\PassOptionsToClass{10pt}{report}}
          \DeclareOptionX
          {11pt}[]{\PassOptionsToClass{11pt}{report}}
          \DeclareOptionX
          {12pt}[]{\PassOptionsToClass{12pt}{report}}
          \DeclareOptionX*{\geometry{\CurrentOption}}
          %
          % Process option section
          %
          \ExecuteOptionsX{a4paper}
          \ProcessOptionsX
          %
          % Loading base class section
          %
          \LoadClass{report}
          \endinput
          %%`
          ma ancora non funziona: a geometry non arrivano le dim di pagina. Ci sto lavorando da un po’ ma non riesco a vedere la soluzione.
          Saluti.
          Roberto.

          \DeclareOptionX*{\AtBeginDocument{\geometry{\CurrentOption}}} ❓

          Ciao
          Enrico

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

            \DeclareOptionX*{\AtBeginDocument{\geometry{\CurrentOption}}} ❓

            Ciao
            Enrico

            Con questo codice la compilazione va in qualche tipo di loop circolare.
            Questo codice va un po’ meglio, nel senso che funziona ma latex emmette un warning di opzione non utilizzata:
            Classe:
            `\NeedsTeXFormat{LaTeX2e}[1995/12/01]
            \ProvidesClass{myclass}
            [2010/04/17 v0.0.0.1 Test of the class]
            \RequirePackage{xkeyval}
            %
            % Option declaration section
            %
            \DeclareOptionX{10pt}[]{\PassOptionsToClass{10pt}{report}}
            \DeclareOptionX
            {11pt}[]{\PassOptionsToClass{11pt}{report}}
            \DeclareOptionX
            {12pt}[]{\PassOptionsToClass{12pt}{report}}
            \DeclareOptionX*{\PassOptionsToPackage{\CurrentOption}{geometry}}
            %
            % Process option section
            %
            \ProcessOptionsX

            %
            % Loading base class section
            %
            \LoadClass{report}
            \RequirePackage{pstricks}
            \RequirePackage{geometry}
            \endinput`
            Sorgente:
            `\documentclass[a5paper,12pt]{myclass}

            \usepackage[utf8]{inputenc}
            \usepackage[T1]{fontenc}
            \usepackage[italian]{babel}

            \begin{document}
            a4paper 10pt ghfdgfdsgfdgfdg gfd gf gf g dg

            \begin{pspicture}(3,3)
            \psline(3,3)
            \end{pspicture}
            \end{document}`
            Grazie. Ci lavorerò ancora un po’ stasera ora devo andare.
            Ciao.

          • #44393
            Up
            0
            Down
            ::

            \DeclareOptionX*{\AtBeginDocument{\geometry{\CurrentOption}}} ❓

            Ciao
            Enrico

            Con questo codice la compilazione va in qualche tipo di loop circolare.
            Questo codice va un po’ meglio, nel senso che funziona ma latex emmette un warning di opzione non utilizzata:
            Classe:
            `\NeedsTeXFormat{LaTeX2e}[1995/12/01]
            \ProvidesClass{myclass}
            [2010/04/17 v0.0.0.1 Test of the class]
            \RequirePackage{xkeyval}
            %
            % Option declaration section
            %
            \DeclareOptionX{10pt}[]{\PassOptionsToClass{10pt}{report}}
            \DeclareOptionX
            {11pt}[]{\PassOptionsToClass{11pt}{report}}
            \DeclareOptionX
            {12pt}[]{\PassOptionsToClass{12pt}{report}}
            \DeclareOptionX*{\PassOptionsToPackage{\CurrentOption}{geometry}}
            %
            % Process option section
            %
            \ProcessOptionsX

            %
            % Loading base class section
            %
            \LoadClass{report}
            \RequirePackage{pstricks}
            \RequirePackage{geometry}
            \endinput`
            Sorgente:
            `\documentclass[a5paper,12pt]{myclass}

            \usepackage[utf8]{inputenc}
            \usepackage[T1]{fontenc}
            \usepackage[italian]{babel}

            \begin{document}
            a4paper 10pt ghfdgfdsgfdgfdg gfd gf gf g dg

            \begin{pspicture}(3,3)
            \psline(3,3)
            \end{pspicture}
            \end{document}`
            Grazie. Ci lavorerò ancora un po’ stasera ora devo andare.
            Ciao.

            `\NeedsTeXFormat{LaTeX2e}[1995/12/01]
            \ProvidesClass{myclass}
            [2010/04/17 v0.0.0.1 Test of the class]
            %
            % Loading base class section
            %
            \LoadClass{report}
            \RequirePackage{pstricks}
            \RequirePackage{geometry}
            \endinput`
            Ciao
            Enrico

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

              [quote]\DeclareOptionX*{\AtBeginDocument{\geometry{\CurrentOption}}} ❓

              Ciao
              Enrico

              Con questo codice la compilazione va in qualche tipo di loop circolare.
              Questo codice va un po’ meglio, nel senso che funziona ma latex emmette un warning di opzione non utilizzata:
              Classe:
              `\NeedsTeXFormat{LaTeX2e}[1995/12/01]
              \ProvidesClass{myclass}
              [2010/04/17 v0.0.0.1 Test of the class]
              \RequirePackage{xkeyval}
              %
              % Option declaration section
              %
              \DeclareOptionX{10pt}[]{\PassOptionsToClass{10pt}{report}}
              \DeclareOptionX
              {11pt}[]{\PassOptionsToClass{11pt}{report}}
              \DeclareOptionX
              {12pt}[]{\PassOptionsToClass{12pt}{report}}
              \DeclareOptionX*{\PassOptionsToPackage{\CurrentOption}{geometry}}
              %
              % Process option section
              %
              \ProcessOptionsX

              %
              % Loading base class section
              %
              \LoadClass{report}
              \RequirePackage{pstricks}
              \RequirePackage{geometry}
              \endinput`
              Sorgente:
              `\documentclass[a5paper,12pt]{myclass}

              \usepackage[utf8]{inputenc}
              \usepackage[T1]{fontenc}
              \usepackage[italian]{babel}

              \begin{document}
              a4paper 10pt ghfdgfdsgfdgfdg gfd gf gf g dg

              \begin{pspicture}(3,3)
              \psline(3,3)
              \end{pspicture}
              \end{document}`
              Grazie. Ci lavorerò ancora un po’ stasera ora devo andare.
              Ciao.

              `\NeedsTeXFormat{LaTeX2e}[1995/12/01]
              \ProvidesClass{myclass}
              [2010/04/17 v0.0.0.1 Test of the class]
              %
              % Loading base class section
              %
              \LoadClass{report}
              \RequirePackage{pstricks}
              \RequirePackage{geometry}
              \endinput`
              Ciao
              Enrico[/quote]

              Che bello quando la soluzione raggiunge la semplicità 8)

              cos’altro dire se non Alla prossima.
              Grazie!!!

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


                💡 e se volessi aggiungere una nuova opzione di classe?
                la sintassi prevede infatti una chiave unit da passare direttamente a pstricks.

                Ho quindi provato il seguente codice:

                `\NeedsTeXFormat{LaTeX2e}[1995/12/01]
                \ProvidesClass{myreport}
                [2010/04/17 v0.0.0.1 A secret class for … based on pstricks]
                \RequirePackage{xkeyval}
                \RequirePackage{pstricks}
                %
                % Option declaration section
                %
                \DeclareOptionX{unit}{\psset{unit=#1}}
                \DeclareOptionX*{\PassOptionsToClass{\CurrentOption}{report}}

                \ProcessOptionsX
                %
                % Loading base class section
                %
                \LoadClass{report}
                \RequirePackage{geometry}
                \endinput`
                ottengo il risultato corretto tuttavia compilando un sorgente di prova e passando l’opzione per esempio b5j, ricevo un fastidioso Warning:`./t.tex:0: Unused global option(s):[b5j].`

                quando invece il formato b5j è perfettamente attuato da geometry.
                Come posso eliminare questo “incorretto” warning?
                Grazie (da un rompiscatole 😀 )

              • #44396
                Up
                0
                Down
                ::

                💡 e se volessi aggiungere una nuova opzione di classe?
                la sintassi prevede infatti una chiave unit da passare direttamente a pstricks.

                Ho quindi provato il seguente codice:

                `\NeedsTeXFormat{LaTeX2e}[1995/12/01]
                \ProvidesClass{myreport}
                [2010/04/17 v0.0.0.1 A secret class for … based on pstricks]
                \RequirePackage{xkeyval}
                \RequirePackage{pstricks}
                %
                % Option declaration section
                %
                \DeclareOptionX{unit}{\psset{unit=#1}}
                \DeclareOptionX*{\PassOptionsToClass{\CurrentOption}{report}}

                \ProcessOptionsX
                %
                % Loading base class section
                %
                \LoadClass{report}
                \RequirePackage{geometry}
                \endinput`
                ottengo il risultato corretto tuttavia compilando un sorgente di prova e passando l’opzione per esempio b5j, ricevo un fastidioso Warning:`./t.tex:0: Unused global option(s):[b5j].`

                quando invece il formato b5j è perfettamente attuato da geometry.
                Come posso eliminare questo “incorretto” warning?
                Grazie (da un rompiscatole 😀 )

                Secondo me stai sbagliando impostazione. Troppe opzioni alla classe, con sintassi diverse, rendono difficile mantenere il codice.

                Probabilmente il sistema più adatto è di identificare alcune opzioni base che vadano tra quelle “globali”, cioè date alla classe. Il resto si può gestire molto meglio con un comando successivo di impostazione:
                `\documentclass[a5paper,12pt]{myreport}
                \myreportsetup{
                abc=def,
                xyz=pqr,
                dothis,
                that=false
                }`
                Rimane il problema che devi definire l’azione di ogni chiave.

                Ciao
                Enrico

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

            Go to top