pgfkeys: .store in constructed macroWhy isn't everything expandable?Appending to a style that sets code with arguments in pgfkeyspgfkeys: Store unknown keys in a commandProblem with pgf library in TexLiveModify `funcdef` macro to use `pgfkeys` instead of `keyval`Difference between pgfkeys that use .estore and .store for subscriptspgfkeys - why .store and pgfkeysvalueof are different?Store coordinate tuple in pgfkeysStoring options for pgfkeys inside macroUsing macros in pgfkeys command

I won USD 50K! Now what should I do with it?

If I stood next to a piece of metal heated to a million degrees, but in a perfect vacuum, would I feel hot?

MQTT subscription topic match

Too many spies!

Why did Spider-Man take a detour to Dorset?

Print all lines that don't have numbers, using sed

Why does the Earth have a z-component at the start of the J2000 epoch?

Sending a photo of my bank account card to the future employer

Why do legislative committees exist?

Accidentally deleted python and yum is not working in centos7

Index Uniqueness Overhead

Is it rude to refer to janitors as 'floor people'?

Why are road bikes (not time trial bikes) used in many triathlons?

Can a Resident Assistant Be Told to Ignore a Lawful Order?

How could an animal "smell" carbon monoxide?

What are the arguments for California’s nonpartisan blanket (jungle) primaries?

Why isn't aluminium involved in biological processes?

Why aren't globular clusters disk shaped

What's the meaning of こそ in this sentence?

Why limit to revolvers?

A scene of Jimmy diversity

Is dividends exclusively a part of earnings?

Getting fresh water in the middle of hypersaline lake in the Bronze Age

Can I send medicine to an American visitor in Canada?



pgfkeys: .store in constructed macro


Why isn't everything expandable?Appending to a style that sets code with arguments in pgfkeyspgfkeys: Store unknown keys in a commandProblem with pgf library in TexLiveModify `funcdef` macro to use `pgfkeys` instead of `keyval`Difference between pgfkeys that use .estore and .store for subscriptspgfkeys - why .store and pgfkeysvalueof are different?Store coordinate tuple in pgfkeysStoring options for pgfkeys inside macroUsing macros in pgfkeys command






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








3















I'm trying to store a value in a macro that is constructed from the arguments of another macro, but I must be missing something because the macro is not created.



MWE:



documentclassarticle

RequirePackagepgfkeys

newcommandzkeys[1]pgfkeys/prefix/.cd,#1

newcommandzsetup[2]
zkeys
#1/.store in=z#2,


zsetupkeyastoragea
zsetupkeybstorageb

zkeys
keya=test,


begindocument

zstoragea % Undefined control sequence.

enddocument









share|improve this question




























    3















    I'm trying to store a value in a macro that is constructed from the arguments of another macro, but I must be missing something because the macro is not created.



    MWE:



    documentclassarticle

    RequirePackagepgfkeys

    newcommandzkeys[1]pgfkeys/prefix/.cd,#1

    newcommandzsetup[2]
    zkeys
    #1/.store in=z#2,


    zsetupkeyastoragea
    zsetupkeybstorageb

    zkeys
    keya=test,


    begindocument

    zstoragea % Undefined control sequence.

    enddocument









    share|improve this question
























      3












      3








      3








      I'm trying to store a value in a macro that is constructed from the arguments of another macro, but I must be missing something because the macro is not created.



      MWE:



      documentclassarticle

      RequirePackagepgfkeys

      newcommandzkeys[1]pgfkeys/prefix/.cd,#1

      newcommandzsetup[2]
      zkeys
      #1/.store in=z#2,


      zsetupkeyastoragea
      zsetupkeybstorageb

      zkeys
      keya=test,


      begindocument

      zstoragea % Undefined control sequence.

      enddocument









      share|improve this question














      I'm trying to store a value in a macro that is constructed from the arguments of another macro, but I must be missing something because the macro is not created.



      MWE:



      documentclassarticle

      RequirePackagepgfkeys

      newcommandzkeys[1]pgfkeys/prefix/.cd,#1

      newcommandzsetup[2]
      zkeys
      #1/.store in=z#2,


      zsetupkeyastoragea
      zsetupkeybstorageb

      zkeys
      keya=test,


      begindocument

      zstoragea % Undefined control sequence.

      enddocument






      expansion pgfkeys






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked 8 hours ago









      meidemeide

      4302 silver badges9 bronze badges




      4302 silver badges9 bronze badges




















          2 Answers
          2






          active

          oldest

          votes


















          4














          New solution



          Another, more flexible approach is to extend the handlers pgfkeys accepts by a new one .store in cs which does basically the same as .store in, but doesn't take a complete control sequence name as value but a list of characters from that the final control sequence is built. So the following calls would be equal:



          foo/.store in=mymacro
          foo/.store in cs=mymacro


          The full example then looks like



          documentclassarticle
          RequirePackagepgfkeys

          newcommandzkeys[1]pgfkeys/prefix/.cd,#1

          pgfkeys/handlers/.store in cs/.code=pgfkeysalso%
          pgfkeyscurrentpath/.code=expandafterdefcsname#1endcsname##1%


          newcommandzsetup[2]%
          zkeys
          #1/.store in cs=z#2,
          %

          zsetupkeyastoragea
          zsetupkeybstorageb

          zkeys
          keya=test,


          begindocument

          zstoragea % Undefined control sequence.

          enddocument



          Old solution



          When you type z#2, TeX parses this as the command name z followed by the tokens inserted from the second argument. If you want to build a new control sequence from a series of characters/tokens, you have to use the sequence csname ...endcsname, where ... would be z#2 in this case.



          However, in this specific situation store in=csname z#2endcsname wouldn't work, because the csname call must be expanded exactly once to build the actual new control sequence from the characters, but not more than once, otherwise the built macro would be tried to expanded itself.



          A possible solution is to wrap the whole key definitions into an edef, prefix all commands in it by noexpand, and use unexpandedexpandafter... in each place, we want exactly one expansion step:



          newcommandzsetup[2]
          edeftemp%
          noexpandzkeys
          #1/.store in=unexpandedexpandaftercsname z#2endcsname,
          %
          temp



          zstoragea will then expand to test.






          share|improve this answer
































            2














            Here are two solutions. They both take care not to expand the first argument of zsetup before passing it to zkeys, nor to define or overwrite any macro in the current group as a side effect.



            First solution



            documentclassarticle
            usepackagepgfkeys

            newcommandzkeys[1]pgfkeys/prefix/.cd,#1

            newcommand*zsetup[2]%
            begingroup
            edefargunexpanded#1/.store in=%
            expandafternoexpandcsname z#2endcsname%
            expandafter
            endgroup
            expandafterzkeysexpandafterarg%


            zsetupkeyastoragea
            zsetupkeybstorageb

            zkeys
            keya=test,


            begindocument

            zstoragea % Print 'test'

            enddocument


            Second solution



            Same code, except for the definition of zsetup:



            newcommand*zsetup[2]%
            begingroup
            deftmp##1zkeys#1/.store in=##1%
            expandafterexpandafterexpandafter
            endgroup
            expandaftertmpcsname z#2endcsname






            share|improve this answer



























              Your Answer








              StackExchange.ready(function()
              var channelOptions =
              tags: "".split(" "),
              id: "85"
              ;
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function()
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled)
              StackExchange.using("snippets", function()
              createEditor();
              );

              else
              createEditor();

              );

              function createEditor()
              StackExchange.prepareEditor(
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: false,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: null,
              bindNavPrevention: true,
              postfix: "",
              imageUploader:
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              ,
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              );



              );













              draft saved

              draft discarded


















              StackExchange.ready(
              function ()
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f500098%2fpgfkeys-store-in-constructed-macro%23new-answer', 'question_page');

              );

              Post as a guest















              Required, but never shown

























              2 Answers
              2






              active

              oldest

              votes








              2 Answers
              2






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              4














              New solution



              Another, more flexible approach is to extend the handlers pgfkeys accepts by a new one .store in cs which does basically the same as .store in, but doesn't take a complete control sequence name as value but a list of characters from that the final control sequence is built. So the following calls would be equal:



              foo/.store in=mymacro
              foo/.store in cs=mymacro


              The full example then looks like



              documentclassarticle
              RequirePackagepgfkeys

              newcommandzkeys[1]pgfkeys/prefix/.cd,#1

              pgfkeys/handlers/.store in cs/.code=pgfkeysalso%
              pgfkeyscurrentpath/.code=expandafterdefcsname#1endcsname##1%


              newcommandzsetup[2]%
              zkeys
              #1/.store in cs=z#2,
              %

              zsetupkeyastoragea
              zsetupkeybstorageb

              zkeys
              keya=test,


              begindocument

              zstoragea % Undefined control sequence.

              enddocument



              Old solution



              When you type z#2, TeX parses this as the command name z followed by the tokens inserted from the second argument. If you want to build a new control sequence from a series of characters/tokens, you have to use the sequence csname ...endcsname, where ... would be z#2 in this case.



              However, in this specific situation store in=csname z#2endcsname wouldn't work, because the csname call must be expanded exactly once to build the actual new control sequence from the characters, but not more than once, otherwise the built macro would be tried to expanded itself.



              A possible solution is to wrap the whole key definitions into an edef, prefix all commands in it by noexpand, and use unexpandedexpandafter... in each place, we want exactly one expansion step:



              newcommandzsetup[2]
              edeftemp%
              noexpandzkeys
              #1/.store in=unexpandedexpandaftercsname z#2endcsname,
              %
              temp



              zstoragea will then expand to test.






              share|improve this answer





























                4














                New solution



                Another, more flexible approach is to extend the handlers pgfkeys accepts by a new one .store in cs which does basically the same as .store in, but doesn't take a complete control sequence name as value but a list of characters from that the final control sequence is built. So the following calls would be equal:



                foo/.store in=mymacro
                foo/.store in cs=mymacro


                The full example then looks like



                documentclassarticle
                RequirePackagepgfkeys

                newcommandzkeys[1]pgfkeys/prefix/.cd,#1

                pgfkeys/handlers/.store in cs/.code=pgfkeysalso%
                pgfkeyscurrentpath/.code=expandafterdefcsname#1endcsname##1%


                newcommandzsetup[2]%
                zkeys
                #1/.store in cs=z#2,
                %

                zsetupkeyastoragea
                zsetupkeybstorageb

                zkeys
                keya=test,


                begindocument

                zstoragea % Undefined control sequence.

                enddocument



                Old solution



                When you type z#2, TeX parses this as the command name z followed by the tokens inserted from the second argument. If you want to build a new control sequence from a series of characters/tokens, you have to use the sequence csname ...endcsname, where ... would be z#2 in this case.



                However, in this specific situation store in=csname z#2endcsname wouldn't work, because the csname call must be expanded exactly once to build the actual new control sequence from the characters, but not more than once, otherwise the built macro would be tried to expanded itself.



                A possible solution is to wrap the whole key definitions into an edef, prefix all commands in it by noexpand, and use unexpandedexpandafter... in each place, we want exactly one expansion step:



                newcommandzsetup[2]
                edeftemp%
                noexpandzkeys
                #1/.store in=unexpandedexpandaftercsname z#2endcsname,
                %
                temp



                zstoragea will then expand to test.






                share|improve this answer



























                  4












                  4








                  4







                  New solution



                  Another, more flexible approach is to extend the handlers pgfkeys accepts by a new one .store in cs which does basically the same as .store in, but doesn't take a complete control sequence name as value but a list of characters from that the final control sequence is built. So the following calls would be equal:



                  foo/.store in=mymacro
                  foo/.store in cs=mymacro


                  The full example then looks like



                  documentclassarticle
                  RequirePackagepgfkeys

                  newcommandzkeys[1]pgfkeys/prefix/.cd,#1

                  pgfkeys/handlers/.store in cs/.code=pgfkeysalso%
                  pgfkeyscurrentpath/.code=expandafterdefcsname#1endcsname##1%


                  newcommandzsetup[2]%
                  zkeys
                  #1/.store in cs=z#2,
                  %

                  zsetupkeyastoragea
                  zsetupkeybstorageb

                  zkeys
                  keya=test,


                  begindocument

                  zstoragea % Undefined control sequence.

                  enddocument



                  Old solution



                  When you type z#2, TeX parses this as the command name z followed by the tokens inserted from the second argument. If you want to build a new control sequence from a series of characters/tokens, you have to use the sequence csname ...endcsname, where ... would be z#2 in this case.



                  However, in this specific situation store in=csname z#2endcsname wouldn't work, because the csname call must be expanded exactly once to build the actual new control sequence from the characters, but not more than once, otherwise the built macro would be tried to expanded itself.



                  A possible solution is to wrap the whole key definitions into an edef, prefix all commands in it by noexpand, and use unexpandedexpandafter... in each place, we want exactly one expansion step:



                  newcommandzsetup[2]
                  edeftemp%
                  noexpandzkeys
                  #1/.store in=unexpandedexpandaftercsname z#2endcsname,
                  %
                  temp



                  zstoragea will then expand to test.






                  share|improve this answer















                  New solution



                  Another, more flexible approach is to extend the handlers pgfkeys accepts by a new one .store in cs which does basically the same as .store in, but doesn't take a complete control sequence name as value but a list of characters from that the final control sequence is built. So the following calls would be equal:



                  foo/.store in=mymacro
                  foo/.store in cs=mymacro


                  The full example then looks like



                  documentclassarticle
                  RequirePackagepgfkeys

                  newcommandzkeys[1]pgfkeys/prefix/.cd,#1

                  pgfkeys/handlers/.store in cs/.code=pgfkeysalso%
                  pgfkeyscurrentpath/.code=expandafterdefcsname#1endcsname##1%


                  newcommandzsetup[2]%
                  zkeys
                  #1/.store in cs=z#2,
                  %

                  zsetupkeyastoragea
                  zsetupkeybstorageb

                  zkeys
                  keya=test,


                  begindocument

                  zstoragea % Undefined control sequence.

                  enddocument



                  Old solution



                  When you type z#2, TeX parses this as the command name z followed by the tokens inserted from the second argument. If you want to build a new control sequence from a series of characters/tokens, you have to use the sequence csname ...endcsname, where ... would be z#2 in this case.



                  However, in this specific situation store in=csname z#2endcsname wouldn't work, because the csname call must be expanded exactly once to build the actual new control sequence from the characters, but not more than once, otherwise the built macro would be tried to expanded itself.



                  A possible solution is to wrap the whole key definitions into an edef, prefix all commands in it by noexpand, and use unexpandedexpandafter... in each place, we want exactly one expansion step:



                  newcommandzsetup[2]
                  edeftemp%
                  noexpandzkeys
                  #1/.store in=unexpandedexpandaftercsname z#2endcsname,
                  %
                  temp



                  zstoragea will then expand to test.







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited 6 hours ago

























                  answered 7 hours ago









                  siracusasiracusa

                  7,0171 gold badge18 silver badges33 bronze badges




                  7,0171 gold badge18 silver badges33 bronze badges























                      2














                      Here are two solutions. They both take care not to expand the first argument of zsetup before passing it to zkeys, nor to define or overwrite any macro in the current group as a side effect.



                      First solution



                      documentclassarticle
                      usepackagepgfkeys

                      newcommandzkeys[1]pgfkeys/prefix/.cd,#1

                      newcommand*zsetup[2]%
                      begingroup
                      edefargunexpanded#1/.store in=%
                      expandafternoexpandcsname z#2endcsname%
                      expandafter
                      endgroup
                      expandafterzkeysexpandafterarg%


                      zsetupkeyastoragea
                      zsetupkeybstorageb

                      zkeys
                      keya=test,


                      begindocument

                      zstoragea % Print 'test'

                      enddocument


                      Second solution



                      Same code, except for the definition of zsetup:



                      newcommand*zsetup[2]%
                      begingroup
                      deftmp##1zkeys#1/.store in=##1%
                      expandafterexpandafterexpandafter
                      endgroup
                      expandaftertmpcsname z#2endcsname






                      share|improve this answer





























                        2














                        Here are two solutions. They both take care not to expand the first argument of zsetup before passing it to zkeys, nor to define or overwrite any macro in the current group as a side effect.



                        First solution



                        documentclassarticle
                        usepackagepgfkeys

                        newcommandzkeys[1]pgfkeys/prefix/.cd,#1

                        newcommand*zsetup[2]%
                        begingroup
                        edefargunexpanded#1/.store in=%
                        expandafternoexpandcsname z#2endcsname%
                        expandafter
                        endgroup
                        expandafterzkeysexpandafterarg%


                        zsetupkeyastoragea
                        zsetupkeybstorageb

                        zkeys
                        keya=test,


                        begindocument

                        zstoragea % Print 'test'

                        enddocument


                        Second solution



                        Same code, except for the definition of zsetup:



                        newcommand*zsetup[2]%
                        begingroup
                        deftmp##1zkeys#1/.store in=##1%
                        expandafterexpandafterexpandafter
                        endgroup
                        expandaftertmpcsname z#2endcsname






                        share|improve this answer



























                          2












                          2








                          2







                          Here are two solutions. They both take care not to expand the first argument of zsetup before passing it to zkeys, nor to define or overwrite any macro in the current group as a side effect.



                          First solution



                          documentclassarticle
                          usepackagepgfkeys

                          newcommandzkeys[1]pgfkeys/prefix/.cd,#1

                          newcommand*zsetup[2]%
                          begingroup
                          edefargunexpanded#1/.store in=%
                          expandafternoexpandcsname z#2endcsname%
                          expandafter
                          endgroup
                          expandafterzkeysexpandafterarg%


                          zsetupkeyastoragea
                          zsetupkeybstorageb

                          zkeys
                          keya=test,


                          begindocument

                          zstoragea % Print 'test'

                          enddocument


                          Second solution



                          Same code, except for the definition of zsetup:



                          newcommand*zsetup[2]%
                          begingroup
                          deftmp##1zkeys#1/.store in=##1%
                          expandafterexpandafterexpandafter
                          endgroup
                          expandaftertmpcsname z#2endcsname






                          share|improve this answer















                          Here are two solutions. They both take care not to expand the first argument of zsetup before passing it to zkeys, nor to define or overwrite any macro in the current group as a side effect.



                          First solution



                          documentclassarticle
                          usepackagepgfkeys

                          newcommandzkeys[1]pgfkeys/prefix/.cd,#1

                          newcommand*zsetup[2]%
                          begingroup
                          edefargunexpanded#1/.store in=%
                          expandafternoexpandcsname z#2endcsname%
                          expandafter
                          endgroup
                          expandafterzkeysexpandafterarg%


                          zsetupkeyastoragea
                          zsetupkeybstorageb

                          zkeys
                          keya=test,


                          begindocument

                          zstoragea % Print 'test'

                          enddocument


                          Second solution



                          Same code, except for the definition of zsetup:



                          newcommand*zsetup[2]%
                          begingroup
                          deftmp##1zkeys#1/.store in=##1%
                          expandafterexpandafterexpandafter
                          endgroup
                          expandaftertmpcsname z#2endcsname







                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited 6 hours ago

























                          answered 6 hours ago









                          frougonfrougon

                          4,9071 gold badge10 silver badges20 bronze badges




                          4,9071 gold badge10 silver badges20 bronze badges



























                              draft saved

                              draft discarded
















































                              Thanks for contributing an answer to TeX - LaTeX Stack Exchange!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid


                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.

                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function ()
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f500098%2fpgfkeys-store-in-constructed-macro%23new-answer', 'question_page');

                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Invision Community Contents History See also References External links Navigation menuProprietaryinvisioncommunity.comIPS Community ForumsIPS Community Forumsthis blog entry"License Changes, IP.Board 3.4, and the Future""Interview -- Matt Mecham of Ibforums""CEO Invision Power Board, Matt Mecham Is a Liar, Thief!"IPB License Explanation 1.3, 1.3.1, 2.0, and 2.1ArchivedSecurity Fixes, Updates And Enhancements For IPB 1.3.1Archived"New Demo Accounts - Invision Power Services"the original"New Default Skin"the original"Invision Power Board 3.0.0 and Applications Released"the original"Archived copy"the original"Perpetual licenses being done away with""Release Notes - Invision Power Services""Introducing: IPS Community Suite 4!"Invision Community Release Notes

                              Canceling a color specificationRandomly assigning color to Graphics3D objects?Default color for Filling in Mathematica 9Coloring specific elements of sets with a prime modified order in an array plotHow to pick a color differing significantly from the colors already in a given color list?Detection of the text colorColor numbers based on their valueCan color schemes for use with ColorData include opacity specification?My dynamic color schemes

                              Ласкавець круглолистий Зміст Опис | Поширення | Галерея | Примітки | Посилання | Навігаційне меню58171138361-22960890446Bupleurum rotundifoliumEuro+Med PlantbasePlants of the World Online — Kew ScienceGermplasm Resources Information Network (GRIN)Ласкавецькн. VI : Літери Ком — Левиправивши або дописавши її